diff --git a/.arcconfig b/.arcconfig
index c81050db3d..88f04f72c5 100644
--- a/.arcconfig
+++ b/.arcconfig
@@ -1,12 +1,5 @@
{
- "project_id" : "phabricator",
- "conduit_uri" : "https://secure.phabricator.com/api/",
- "lint_engine" : "PhabricatorLintEngine",
- "unit_engine" : "PhutilUnitTestEngine",
- "copyright_holder" : "Facebook, Inc.",
- "remote_hooks_installed" : true,
- "phutil_libraries" : {
- "phabricator" : "src/"
- },
- "lint.xhpast.naminghook" : "PhabricatorSymbolNameLinter"
+ "phabricator.uri": "https://secure.phabricator.com/",
+ "load": ["src/"],
+ "history.immutable": false
}
diff --git a/.arclint b/.arclint
new file mode 100644
index 0000000000..29258b5d3e
--- /dev/null
+++ b/.arclint
@@ -0,0 +1,86 @@
+{
+ "exclude": [
+ "(^externals/)",
+ "(^webroot/rsrc/externals/(?!javelin/))",
+ "(/__tests__/data/)"
+ ],
+ "linters": {
+ "chmod": {
+ "type": "chmod"
+ },
+ "filename": {
+ "type": "filename"
+ },
+ "generated": {
+ "type": "generated"
+ },
+ "javelin": {
+ "type": "javelin",
+ "include": "(\\.js$)",
+ "exclude": [
+ "(^support/aphlict/)"
+ ]
+ },
+ "jshint-browser": {
+ "type": "jshint",
+ "include": "(\\.js$)",
+ "exclude": [
+ "(^support/aphlict/server/.*\\.js$)",
+ "(^webroot/rsrc/externals/javelin/core/init_node\\.js$)"
+ ],
+ "jshint.jshintrc": "support/lint/browser.jshintrc"
+ },
+ "jshint-node": {
+ "type": "jshint",
+ "include": [
+ "(^support/aphlict/server/.*\\.js$)",
+ "(^webroot/rsrc/externals/javelin/core/init_node\\.js$)"
+ ],
+ "jshint.jshintrc": "support/lint/node.jshintrc"
+ },
+ "json": {
+ "type": "json",
+ "include": [
+ "(^src/docs/book/.*\\.book$)",
+ "(^support/lint/jshintrc$)",
+ "(^\\.arcconfig$)",
+ "(^\\.arclint$)",
+ "(\\.json$)"
+ ]
+ },
+ "merge-conflict": {
+ "type": "merge-conflict"
+ },
+ "nolint": {
+ "type": "nolint"
+ },
+ "phutil-library": {
+ "type": "phutil-library",
+ "include": "(\\.php$)"
+ },
+ "spelling": {
+ "type": "spelling"
+ },
+ "text": {
+ "type": "text",
+ "exclude": [
+ "(^src/(.*/)?__tests__/[^/]+/.*\\.(txt|json|expect))"
+ ]
+ },
+ "text-without-length": {
+ "type": "text",
+ "include": [
+ "(^src/(.*/)?__tests__/[^/]+/.*\\.(txt|json|expect))"
+ ],
+ "severity": {
+ "3": "disabled"
+ }
+ },
+ "xhpast": {
+ "type": "xhpast",
+ "include": "(\\.php$)",
+ "standard": "phutil.xhpast",
+ "xhpast.php-version": "5.5"
+ }
+ }
+}
diff --git a/.arcunit b/.arcunit
new file mode 100644
index 0000000000..860ee1aee2
--- /dev/null
+++ b/.arcunit
@@ -0,0 +1,8 @@
+{
+ "engines": {
+ "phutil": {
+ "type": "phutil",
+ "include": "(\\.php$)"
+ }
+ }
+}
diff --git a/.divinerconfig b/.divinerconfig
deleted file mode 100644
index ef6c805d91..0000000000
--- a/.divinerconfig
+++ /dev/null
@@ -1,32 +0,0 @@
-{
- "name" : "Phabricator",
- "src_link" : "https://secure.phabricator.com/diffusion/P/browse/master/%f$%l",
- "groups" : {
- "intro" : "Introduction",
- "config" : "Configuration",
- "userguide" : "Application User Guides",
- "contrib" : "Contributing",
- "developer" : "Phabricator Developer Guides",
- "flavortext" : "Flavor Text",
- "differential" : "Differential (Code Review)",
- "diffusion" : "Diffusion (Repository Browser)",
- "maniphest" : "Maniphest (Task Tracking)",
- "slowvote" : "Slowvote (Polls)",
- "herald" : "Herald (Notifications)",
- "conduit" : "Conduit (Phabricator HTTP API)",
- "celerity" : "Celerity (CSS/JS Management)",
- "phriction" : "Phriction (Wiki)",
- "aphront" : "Aphront (Web Stack)",
- "console" : "DarkConsole (Debugging Console)",
- "storage" : "Storage",
- "filestorage" : "File Storage",
- "search" : "Search",
- "daemon" : "Daemons, Tasks and Workers",
- "irc" : "IRC",
- "markup" : "Remarkup Extensions"
- },
- "engines" : [
- ["DivinerArticleEngine", {}],
- ["DivinerXHPEngine", {}]
- ]
-}
diff --git a/.editorconfig b/.editorconfig
new file mode 100644
index 0000000000..11da68c2c0
--- /dev/null
+++ b/.editorconfig
@@ -0,0 +1,34 @@
+; http://editorconfig.org/
+
+[*]
+indent_style = space
+indent_size = 2
+end_of_line = lf
+charset = utf-8
+trim_trailing_whitespace = true
+insert_final_newline = true
+max_line_length = 80
+
+[.arclint]
+max_line_length = unset
+
+[resources/sql/**.sql]
+max_line_length = unset
+
+[scripts/install/install_*.sh]
+max_line_length = unset
+
+[src/applications/differential/parser/__tests__/data/*.diff]
+trim_trailing_whitespace = false
+
+[src/applications/differential/parser/__tests__/messages/long-title.txt]
+max_line_length = unset
+
+[src/applications/diffusion/ssh/__tests__/hgwiredata/*.txt]
+max_line_length = unset
+
+[externals/**]
+indent_style = unset
+indent_size = unset
+trim_trailing_whitespace = false
+insert_final_newline = false
diff --git a/.gitignore b/.gitignore
index 4238818d5b..b7f6818b8f 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,20 +1,44 @@
-.DS_Store
-._*
+# NOTE: Thinking about adding files created by your operating system, IDE,
+# or text editor here? Don't! Add them to your per-user .gitignore instead.
+
+# Diviner
/docs/
+/.divinercache/
+/src/.cache/
+
+# libphutil
/src/.phutil_module_cache
+
+# Configuration
/conf/custom/*
-/webroot/rsrc/custom
-/.divinercache
-.#*
-*#
-*~
-*.swp
+/conf/local/local.json
+/conf/local/ENVIRONMENT
+/conf/local/VERSION
+/conf/keys/device.pub
+/conf/keys/device.key
+/conf/keys/device.id
+/conf/aphlict/aphlict.custom.json
+
+# Impact Font
+/resources/font/impact.ttf
+
+# User-accessible hook for adhoc debugging scripts
+/support/debug.php
+
+# User-accessible hook for adhoc startup code
+/support/preamble.php
+
+# Users can link binaries here
+/support/bin/*
-# NetBeans project files
-/nbproject/
+# User extensions
+/src/extensions/*
-# Arcanist scratch directory
-/.arc
+# NPM local packages
+/support/aphlict/server/node_modules/
+/support/aphlict/server/package.json
+/support/aphlict/server/package-lock.json
-# Custom Logo File
-/webroot/rsrc/image/custom/custom.png
+# Places for users to add custom resources.
+/resources/cows/custom/*
+/resources/figlet/custom/*
diff --git a/.gitmodules b/.gitmodules
deleted file mode 100644
index e4f67ca880..0000000000
--- a/.gitmodules
+++ /dev/null
@@ -1,3 +0,0 @@
-[submodule "externals/javelin"]
- path = externals/javelin
- url = git://github.com/facebook/javelin.git
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000000..d9a10c0d8e
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,176 @@
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
diff --git a/NOTICE b/NOTICE
new file mode 100644
index 0000000000..f514a400e2
--- /dev/null
+++ b/NOTICE
@@ -0,0 +1,21 @@
+Phabricator
+Copyright 2014 Phacility, Inc.
+
+Phabricator was originally developed and maintained by Phacility, Inc.
+
+ http://www.phacility.com/
+
+Portions of this software were developed by various contributors, who retain
+copyright on their work. These works are licensed to Phacility, Inc.
+
+Phabricator is available under the Apache 2.0 license. See LICENSE for more
+information.
+
+Phabricator and Phacility are trademarks of Phacility, Inc. For additional
+information about trademarks that pertain to this software, see:
+
+ http://www.phacility.com/trademarks/
+
+This software uses other open source libraries, which are located in
+"externals/" and "webroot/rsrc/externals/". These libraries have their own
+licenses and copyright holders.
diff --git a/README b/README
deleted file mode 100644
index 6dbcd68c85..0000000000
--- a/README
+++ /dev/null
@@ -1,13 +0,0 @@
-Phabricator is a open source collection of web applications which make it easier
-to write, review, and share source code. Phabricator was developed at Facebook.
-
-This is an early release. It's pretty high-quality and usable, but under
-active development so things may change quickly.
-
-You can learn more about the project and find links to documentation and
-resources at: http://phabricator.org/
-
-LICENSE
-
-Phabricator is released under the Apache 2.0 license except as otherwise noted.
-http://www.apache.org/licenses/LICENSE-2.0
\ No newline at end of file
diff --git a/README.md b/README.md
new file mode 100644
index 0000000000..5190845da4
--- /dev/null
+++ b/README.md
@@ -0,0 +1,7 @@
+Effective June 1, 2021: Phabricator is no longer actively maintained.
+
+**Phabricator** is a collection of web applications for software development.
+
+**LICENSE**
+
+Phabricator is released under the Apache 2.0 license except as otherwise noted.
diff --git a/bin/accountadmin b/bin/accountadmin
deleted file mode 120000
index a846766c26..0000000000
--- a/bin/accountadmin
+++ /dev/null
@@ -1 +0,0 @@
-../scripts/user/account_admin.php
\ No newline at end of file
diff --git a/bin/almanac b/bin/almanac
new file mode 120000
index 0000000000..015c541cdc
--- /dev/null
+++ b/bin/almanac
@@ -0,0 +1 @@
+../scripts/almanac/manage_almanac.php
\ No newline at end of file
diff --git a/bin/audit b/bin/audit
new file mode 120000
index 0000000000..26939acdec
--- /dev/null
+++ b/bin/audit
@@ -0,0 +1 @@
+../scripts/setup/manage_audit.php
\ No newline at end of file
diff --git a/bin/auth b/bin/auth
new file mode 120000
index 0000000000..01e2796608
--- /dev/null
+++ b/bin/auth
@@ -0,0 +1 @@
+../scripts/setup/manage_auth.php
\ No newline at end of file
diff --git a/bin/bulk b/bin/bulk
new file mode 120000
index 0000000000..04d0550497
--- /dev/null
+++ b/bin/bulk
@@ -0,0 +1 @@
+../scripts/setup/manage_bulk.php
\ No newline at end of file
diff --git a/bin/cache b/bin/cache
new file mode 120000
index 0000000000..f3b182e818
--- /dev/null
+++ b/bin/cache
@@ -0,0 +1 @@
+../scripts/cache/manage_cache.php
\ No newline at end of file
diff --git a/bin/calendar b/bin/calendar
new file mode 120000
index 0000000000..33929a5ba1
--- /dev/null
+++ b/bin/calendar
@@ -0,0 +1 @@
+../scripts/setup/manage_calendar.php
\ No newline at end of file
diff --git a/bin/celerity b/bin/celerity
new file mode 120000
index 0000000000..f4558cb181
--- /dev/null
+++ b/bin/celerity
@@ -0,0 +1 @@
+../scripts/setup/manage_celerity.php
\ No newline at end of file
diff --git a/bin/commit-hook b/bin/commit-hook
new file mode 120000
index 0000000000..9eda12cfb7
--- /dev/null
+++ b/bin/commit-hook
@@ -0,0 +1 @@
+../scripts/repository/commit_hook.php
\ No newline at end of file
diff --git a/bin/conduit b/bin/conduit
new file mode 120000
index 0000000000..9221340a93
--- /dev/null
+++ b/bin/conduit
@@ -0,0 +1 @@
+../scripts/setup/manage_conduit.php
\ No newline at end of file
diff --git a/bin/config b/bin/config
new file mode 120000
index 0000000000..068eb7da38
--- /dev/null
+++ b/bin/config
@@ -0,0 +1 @@
+../scripts/setup/manage_config.php
\ No newline at end of file
diff --git a/bin/differential b/bin/differential
new file mode 120000
index 0000000000..5a50360da3
--- /dev/null
+++ b/bin/differential
@@ -0,0 +1 @@
+../scripts/setup/manage_differential.php
\ No newline at end of file
diff --git a/bin/diviner b/bin/diviner
new file mode 120000
index 0000000000..465b7cf593
--- /dev/null
+++ b/bin/diviner
@@ -0,0 +1 @@
+../scripts/diviner/diviner.php
\ No newline at end of file
diff --git a/bin/drydock b/bin/drydock
new file mode 120000
index 0000000000..a98cf0d298
--- /dev/null
+++ b/bin/drydock
@@ -0,0 +1 @@
+../scripts/drydock/drydock_control.php
\ No newline at end of file
diff --git a/bin/fact b/bin/fact
new file mode 120000
index 0000000000..9a84ebad20
--- /dev/null
+++ b/bin/fact
@@ -0,0 +1 @@
+../scripts/fact/manage_facts.php
\ No newline at end of file
diff --git a/bin/feed b/bin/feed
new file mode 120000
index 0000000000..ce9bbb77a6
--- /dev/null
+++ b/bin/feed
@@ -0,0 +1 @@
+../scripts/setup/manage_feed.php
\ No newline at end of file
diff --git a/bin/files b/bin/files
new file mode 120000
index 0000000000..bb0c48da5b
--- /dev/null
+++ b/bin/files
@@ -0,0 +1 @@
+../scripts/files/manage_files.php
\ No newline at end of file
diff --git a/bin/garbage b/bin/garbage
new file mode 120000
index 0000000000..417438c09c
--- /dev/null
+++ b/bin/garbage
@@ -0,0 +1 @@
+../scripts/setup/manage_garbage.php
\ No newline at end of file
diff --git a/bin/harbormaster b/bin/harbormaster
new file mode 120000
index 0000000000..448588ebef
--- /dev/null
+++ b/bin/harbormaster
@@ -0,0 +1 @@
+../scripts/setup/manage_harbormaster.php
\ No newline at end of file
diff --git a/bin/herald b/bin/herald
new file mode 120000
index 0000000000..53f039ddf1
--- /dev/null
+++ b/bin/herald
@@ -0,0 +1 @@
+../scripts/setup/manage_herald.php
\ No newline at end of file
diff --git a/bin/i18n b/bin/i18n
new file mode 120000
index 0000000000..cb5eaeaab3
--- /dev/null
+++ b/bin/i18n
@@ -0,0 +1 @@
+../scripts/setup/manage_i18n.php
\ No newline at end of file
diff --git a/bin/lipsum b/bin/lipsum
new file mode 120000
index 0000000000..ea04709c7d
--- /dev/null
+++ b/bin/lipsum
@@ -0,0 +1 @@
+../scripts/lipsum/manage_lipsum.php
\ No newline at end of file
diff --git a/bin/lock b/bin/lock
new file mode 120000
index 0000000000..686fa38798
--- /dev/null
+++ b/bin/lock
@@ -0,0 +1 @@
+../scripts/setup/manage_lock.php
\ No newline at end of file
diff --git a/bin/mail b/bin/mail
new file mode 120000
index 0000000000..d75b7b811d
--- /dev/null
+++ b/bin/mail
@@ -0,0 +1 @@
+../scripts/mail/manage_mail.php
\ No newline at end of file
diff --git a/bin/nuance b/bin/nuance
new file mode 120000
index 0000000000..c2cf50a211
--- /dev/null
+++ b/bin/nuance
@@ -0,0 +1 @@
+../scripts/setup/manage_nuance.php
\ No newline at end of file
diff --git a/bin/phd b/bin/phd
index f1945da552..101465cd29 120000
--- a/bin/phd
+++ b/bin/phd
@@ -1 +1 @@
-../scripts/daemon/phabricator_daemon_launcher.php
\ No newline at end of file
+../scripts/daemon/manage_daemons.php
\ No newline at end of file
diff --git a/bin/phortune b/bin/phortune
new file mode 120000
index 0000000000..cde0acff7e
--- /dev/null
+++ b/bin/phortune
@@ -0,0 +1 @@
+../scripts/setup/manage_phortune.php
\ No newline at end of file
diff --git a/bin/policy b/bin/policy
new file mode 120000
index 0000000000..ffb2bac562
--- /dev/null
+++ b/bin/policy
@@ -0,0 +1 @@
+../scripts/setup/manage_policy.php
\ No newline at end of file
diff --git a/bin/remove b/bin/remove
new file mode 120000
index 0000000000..a073e3ebef
--- /dev/null
+++ b/bin/remove
@@ -0,0 +1 @@
+../scripts/setup/manage_remove.php
\ No newline at end of file
diff --git a/bin/repository b/bin/repository
new file mode 120000
index 0000000000..9da13e8ae7
--- /dev/null
+++ b/bin/repository
@@ -0,0 +1 @@
+../scripts/repository/manage_repositories.php
\ No newline at end of file
diff --git a/bin/search b/bin/search
new file mode 120000
index 0000000000..774c1e1412
--- /dev/null
+++ b/bin/search
@@ -0,0 +1 @@
+../scripts/search/manage_search.php
\ No newline at end of file
diff --git a/bin/ssh-auth b/bin/ssh-auth
new file mode 120000
index 0000000000..136faff7e6
--- /dev/null
+++ b/bin/ssh-auth
@@ -0,0 +1 @@
+../scripts/ssh/ssh-auth.php
\ No newline at end of file
diff --git a/bin/ssh-connect b/bin/ssh-connect
new file mode 120000
index 0000000000..79f7c94d03
--- /dev/null
+++ b/bin/ssh-connect
@@ -0,0 +1 @@
+../scripts/ssh/ssh-connect.php
\ No newline at end of file
diff --git a/bin/ssh-exec b/bin/ssh-exec
new file mode 120000
index 0000000000..9d3f453bee
--- /dev/null
+++ b/bin/ssh-exec
@@ -0,0 +1 @@
+../scripts/ssh/ssh-exec.php
\ No newline at end of file
diff --git a/bin/trigger b/bin/trigger
new file mode 120000
index 0000000000..37d4b4a7cb
--- /dev/null
+++ b/bin/trigger
@@ -0,0 +1 @@
+../scripts/setup/manage_trigger.php
\ No newline at end of file
diff --git a/bin/user b/bin/user
new file mode 120000
index 0000000000..4b4b6b7ab5
--- /dev/null
+++ b/bin/user
@@ -0,0 +1 @@
+../scripts/setup/manage_user.php
\ No newline at end of file
diff --git a/bin/webhook b/bin/webhook
new file mode 120000
index 0000000000..d320336874
--- /dev/null
+++ b/bin/webhook
@@ -0,0 +1 @@
+../scripts/setup/manage_webhook.php
\ No newline at end of file
diff --git a/bin/worker b/bin/worker
new file mode 120000
index 0000000000..d0284581e5
--- /dev/null
+++ b/bin/worker
@@ -0,0 +1 @@
+../scripts/setup/manage_worker.php
\ No newline at end of file
diff --git a/conf/__init_conf__.php b/conf/__init_conf__.php
index 6cd7ecdd7e..18c132c6d4 100644
--- a/conf/__init_conf__.php
+++ b/conf/__init_conf__.php
@@ -1,29 +1,49 @@
true,
+ 'darkconsole.enabled' => true,
+ );
+ }
+
+ $files = id(new FileFinder($root.'/conf/'))
+ ->withType('f')
+ ->withSuffix('conf.php')
+ ->withFollowSymlinks(true)
+ ->find();
+
+ foreach ($files as $key => $file) {
+ $file = trim($file, './');
+ $files[$key] = preg_replace('/\.conf\.php$/', '', $file);
+ }
+ $files = ' '.implode("\n ", $files);
+
+ throw new Exception(
+ pht(
+ "CONFIGURATION ERROR\n".
+ "Config file '%s' does not exist. Valid config files are:\n\n%s",
+ $original_config,
+ $files));
+ }
+
// Make sure config file errors are reported.
$old_error_level = error_reporting(E_ALL | E_STRICT);
$old_display_errors = ini_get('display_errors');
@@ -37,25 +57,11 @@ function phabricator_read_config_file($original_config) {
ini_set('display_errors', $old_display_errors);
if ($conf === false) {
- if (!Filesystem::pathExists($full_config_path)) {
- $files = id(new FileFinder($root.'/conf/'))
- ->withType('f')
- ->withSuffix('conf.php')
- ->withFollowSymlinks(true)
- ->find();
-
- foreach ($files as $key => $file) {
- $file = trim($file, './');
- $files[$key] = preg_replace('/\.conf\.php$/', '', $file);
- }
- $files = " ".implode("\n ", $files);
-
- throw new Exception(
- "CONFIGURATION ERROR\n".
- "Config file '{$original_config}' does not exist. Valid config files ".
- "are:\n\n".$files);
- }
- throw new Exception("Failed to read config file '{$config}': {$errors}");
+ throw new Exception(
+ pht(
+ "Failed to read config file '%s': %s",
+ $config,
+ $errors));
}
return $conf;
diff --git a/conf/aphlict/README b/conf/aphlict/README
new file mode 100644
index 0000000000..2786ea5658
--- /dev/null
+++ b/conf/aphlict/README
@@ -0,0 +1,16 @@
+To customize this configuration, you have two options: create a custom
+configuration file in this directory, or specify a path to a configuration file
+explicitly when starting Aphlict.
+
+To create a custom configuration file, copy `aphlict.default.json` in this
+directory and rename it `aphlict.custom.json`. If this file exists, it will
+be read by default.
+
+To specify a path when starting Aphlict, use the `--config` flag:
+
+ phabricator/ $ ./bin/aphlict start --config path/to/config.json
+
+Specifying a configuration file explicitly overrides default configuration.
+
+For more information about configuring notifications, see the article
+"Notifications User Guide: Setup and Configuration" in the documentation.
diff --git a/conf/aphlict/aphlict.default.json b/conf/aphlict/aphlict.default.json
new file mode 100644
index 0000000000..7afdf7e8ff
--- /dev/null
+++ b/conf/aphlict/aphlict.default.json
@@ -0,0 +1,26 @@
+{
+ "servers": [
+ {
+ "type": "client",
+ "port": 22280,
+ "listen": "0.0.0.0",
+ "ssl.key": null,
+ "ssl.cert": null,
+ "ssl.chain": null
+ },
+ {
+ "type": "admin",
+ "port": 22281,
+ "listen": "127.0.0.1",
+ "ssl.key": null,
+ "ssl.cert": null,
+ "ssl.chain": null
+ }
+ ],
+ "logs": [
+ {
+ "path": "/var/log/aphlict.log"
+ }
+ ],
+ "pidfile": "/var/tmp/aphlict/pid/aphlict.pid"
+}
diff --git a/conf/default.conf.php b/conf/default.conf.php
deleted file mode 100644
index a52f2cab50..0000000000
--- a/conf/default.conf.php
+++ /dev/null
@@ -1,1117 +0,0 @@
- null,
-
- // If you have multiple environments, provide the production environment URI
- // here so that emails, etc., generated in development/sandbox environments
- // contain the right links.
- 'phabricator.production-uri' => null,
-
- // Setting this to 'true' will invoke a special setup mode which helps guide
- // you through setting up Phabricator.
- 'phabricator.setup' => false,
-
-// -- IMPORTANT! Security! -------------------------------------------------- //
-
- // IMPORTANT: By default, Phabricator serves files from the same domain the
- // application lives on. This is convenient but not secure: it creates a large
- // class of vulnerabilities which can not be generally mitigated.
- //
- // To avoid this, you should configure a second domain in the same way you
- // have the primary domain configured (e.g., point it at the same machine and
- // set up the same vhost rules) and provide it here. For instance, if your
- // primary install is on "http://www.phabricator-example.com/", you could
- // configure "http://www.phabricator-files.com/" and specify the entire
- // domain (with protocol) here. This will enforce that files are
- // served only from the alternate domain. Ideally, you should use a
- // completely separate domain name rather than just a different subdomain.
- //
- // It is STRONGLY RECOMMENDED that you configure this. Your install is NOT
- // SECURE unless you do so.
- 'security.alternate-file-domain' => null,
-
- // Default key for HMAC digests where the key is not important (i.e., the
- // hash itself is secret). You can change this if you want (to any other
- // string), but doing so will break existing sessions and CSRF tokens.
- 'security.hmac-key' => '[D\t~Y7eNmnQGJ;rnH6aF;m2!vJ8@v8C=Cs:aQS\.Qw',
-
-
-// -- Customization --------------------------------------------------------- //
-
- // If you want to use a custom logo (e.g., for your company or organization),
- // copy 'webroot/rsrc/image/custom/example_template.png' to
- // 'webroot/rsrc/image/custom/custom.png' and set this to the URI you want it
- // to link to (like http://www.yourcompany.com/).
- 'phabricator.custom.logo' => null,
-
-
-// -- Internationalization -------------------------------------------------- //
-
- // This allows customizing texts used in Phabricator. The class must extend
- // PhabricatorTranslation.
- 'translation.provider' => 'PhabricatorEnglishTranslation',
-
-
-// -- Access Policies ------------------------------------------------------- //
-
- // Phabricator allows you to set the visibility of objects (like repositories
- // and source code) to "Public", which means anyone on the internet can see
- // them, even without being logged in. This is great for open source, but
- // some installs may never want to make anything public, so this policy is
- // disabled by default. You can enable it here, which will let you set the
- // policy for objects to "Public". With this option disabled, the most open
- // policy is "All Users", which means users must be logged in to view things.
- 'policy.allow-public' => false,
-
-
-// -- Logging --------------------------------------------------------------- //
-
- // To enable the Phabricator access log, specify a path here. The Phabricator
- // access log can provide more detailed information about Phabricator access
- // than normal HTTP access logs (for instance, it can show logged-in users,
- // controllers, and other application data). If not set, no log will be
- // written.
- //
- // Make sure the PHP process can write to the log!
- 'log.access.path' => null,
-
- // Format for the access log. If not set, the default format will be used:
- //
- // "[%D]\t%h\t%u\t%M\t%C\t%m\t%U\t%c\t%T"
- //
- // Available variables are:
- //
- // - %c The HTTP response code.
- // - %C The controller which handled the request.
- // - %D The request date.
- // - %e Epoch timestamp.
- // - %h The webserver's host name.
- // - %p The PID of the server process.
- // - %R The HTTP referrer.
- // - %r The remote IP.
- // - %T The request duration, in microseconds.
- // - %U The request path.
- // - %u The logged-in user, if one is logged in.
- // - %M The HTTP method.
- // - %m For conduit, the Conduit method which was invoked.
- //
- // If a variable isn't available (for example, %m appears in the file format
- // but the request is not a Conduit request), it will be rendered as "-".
- //
- // Note that the default format is subject to change in the future, so if you
- // rely on the log's format, specify it explicitly.
- 'log.access.format' => null,
-
-
-// -- DarkConsole ----------------------------------------------------------- //
-
- // DarkConsole is a administrative debugging/profiling tool built into
- // Phabricator. You can leave it disabled unless you're developing against
- // Phabricator.
-
- // Determines whether or not DarkConsole is available. DarkConsole exposes
- // some data like queries and stack traces, so you should be careful about
- // turning it on in production (although users can not normally see it, even
- // if the deployment configuration enables it).
- 'darkconsole.enabled' => false,
-
- // Always enable DarkConsole, even for logged out users. This potentially
- // exposes sensitive information to users, so make sure untrusted users can
- // not access an install running in this mode. You should definitely leave
- // this off in production. It is only really useful for using DarkConsole
- // utilities to debug or profile logged-out pages. You must set
- // 'darkconsole.enabled' to use this option.
- 'darkconsole.always-on' => false,
-
-
- // Allows you to mask certain configuration values from appearing in the
- // "Config" tab of DarkConsole.
- 'darkconsole.config-mask' => array(
- 'mysql.pass',
- 'amazon-ses.secret-key',
- 'recaptcha.private-key',
- 'phabricator.csrf-key',
- 'facebook.application-secret',
- 'github.application-secret',
- 'google.application-secret',
- 'phabricator.application-secret',
- 'disqus.application-secret',
- 'phabricator.mail-key',
- 'security.hmac-key',
- ),
-
-
-// -- MySQL --------------------------------------------------------------- //
-
- // Class providing database configuration. It must implement
- // DatabaseConfigurationProvider.
- 'mysql.configuration-provider' => 'DefaultDatabaseConfigurationProvider',
-
- // The username to use when connecting to MySQL.
- 'mysql.user' => 'root',
-
- // The password to use when connecting to MySQL.
- 'mysql.pass' => '',
-
- // The MySQL server to connect to. If you want to connect to a different
- // port than the default (which is 3306), specify it in the hostname
- // (e.g., db.example.com:1234).
- 'mysql.host' => 'localhost',
-
- // The number of times to try reconnecting to the MySQL database
- 'mysql.connection-retries' => 3,
-
- // Phabricator supports PHP extensions MySQL and MySQLi. It is possible to
- // implement also other access mechanism (e.g. PDO_MySQL). The class must
- // extend AphrontMySQLDatabaseConnectionBase.
- 'mysql.implementation' => 'AphrontMySQLDatabaseConnection',
-
-
-// -- Notifications --------------------------------------------------------- //
-
- 'notification.enabled' => false,
-
- // Client port for the realtime server to listen on, and for realtime clients
- // to connect to. Use "localhost" if you are running the notification server
- // on the same host as the web server.
- 'notification.client-uri' => 'http://localhost:22280/',
-
- // URI and port for the notification root server.
- 'notification.server-uri' => 'http://localhost:22281/',
-
- // The server must be started as root so it can bind to privileged ports, but
- // if you specify a user here it will drop permissions after binding.
- 'notification.user' => null,
-
- // Location where the server should log to.
- 'notification.log' => '/var/log/aphlict.log',
-
- // PID file to use.
- 'notification.pidfile' => '/var/run/aphlict.pid',
-
-
-// -- Email ----------------------------------------------------------------- //
-
- // Some Phabricator tools send email notifications, e.g. when Differential
- // revisions are updated or Maniphest tasks are changed. These options allow
- // you to configure how email is delivered.
-
- // You can test your mail setup by going to "MetaMTA" in the web interface,
- // clicking "Send New Message", and then composing a message.
-
- // Default address to send mail "From".
- 'metamta.default-address' => 'noreply@example.com',
-
- // Domain used to generate Message-IDs.
- 'metamta.domain' => 'example.com',
-
- // When a message is sent to multiple recipients (for example, several
- // reviewers on a code review), Phabricator can either deliver one email to
- // everyone (e.g., "To: alincoln, usgrant, htaft") or separate emails to each
- // user (e.g., "To: alincoln", "To: usgrant", "To: htaft"). The major
- // advantages and disadvantages of each approach are:
- //
- // - One mail to everyone:
- // - Recipients can see To/Cc at a glance.
- // - If you use mailing lists, you won't get duplicate mail if you're
- // a normal recipient and also Cc'd on a mailing list.
- // - Getting threading to work properly is harder, and probably requires
- // making mail less useful by turning off options.
- // - Sometimes people will "Reply All" and everyone will get two mails,
- // one from the user and one from Phabricator turning their mail into
- // a comment.
- // - Not supported with a private reply-to address.
- // - One mail to each user:
- // - Recipients need to look in the mail body to see To/Cc.
- // - If you use mailing lists, recipients may sometimes get duplicate
- // mail.
- // - Getting threading to work properly is easier, and threading settings
- // can be customzied by each user.
- // - "Reply All" no longer spams all other users.
- // - Required if private reply-to addresses are configured.
- //
- // In the code, splitting one outbound email into one-per-recipient is
- // sometimes referred to as "multiplexing".
- 'metamta.one-mail-per-recipient' => true,
-
- // When a user takes an action which generates an email notification (like
- // commenting on a Differential revision), Phabricator can either send that
- // mail "From" the user's email address (like "alincoln@logcabin.com") or
- // "From" the 'metamta.default-address' address. The user experience is
- // generally better if Phabricator uses the user's real address as the "From"
- // since the messages are easier to organize when they appear in mail clients,
- // but this will only work if the server is authorized to send email on behalf
- // of the "From" domain. Practically, this means:
- // - If you are doing an install for Example Corp and all the users will
- // have corporate @corp.example.com addresses and any hosts Phabricator
- // is running on are authorized to send email from corp.example.com,
- // you can enable this to make the user experience a little better.
- // - If you are doing an install for an open source project and your
- // users will be registering via Facebook and using personal email
- // addresses, you MUST NOT enable this or virtually all of your outgoing
- // email will vanish into SFP blackholes.
- // - If your install is anything else, you're much safer leaving this
- // off since the risk in turning it on is that your outgoing mail will
- // mostly never arrive.
- 'metamta.can-send-as-user' => false,
-
-
- // Adapter class to use to transmit mail to the MTA. The default uses
- // PHPMailerLite, which will invoke "sendmail". This is appropriate
- // if sendmail actually works on your host, but if you haven't configured mail
- // it may not be so great. You can also use Amazon SES, by changing this to
- // 'PhabricatorMailImplementationAmazonSESAdapter', signing up for SES, and
- // filling in your 'amazon-ses.access-key' and 'amazon-ses.secret-key' below.
- 'metamta.mail-adapter' =>
- 'PhabricatorMailImplementationPHPMailerLiteAdapter',
-
- // When email is sent, try to hand it off to the MTA immediately. This may
- // be worth disabling if your MTA infrastructure is slow or unreliable. If you
- // disable this option, you must run the 'metamta_mta.php' daemon or mail
- // won't be handed off to the MTA. If you're using Amazon SES it can be a
- // little slugish sometimes so it may be worth disabling this and moving to
- // the daemon after you've got your install up and running. If you have a
- // properly configured local MTA it should not be necessary to disable this.
- 'metamta.send-immediately' => true,
-
- // If you're using Amazon SES to send email, provide your AWS access key
- // and AWS secret key here. To set up Amazon SES with Phabricator, you need
- // to:
- // - Make sure 'metamta.mail-adapter' is set to:
- // "PhabricatorMailImplementationAmazonSESAdapter"
- // - Make sure 'metamta.can-send-as-user' is false.
- // - Make sure 'metamta.default-address' is configured to something sensible.
- // - Make sure 'metamta.default-address' is a validated SES "From" address.
- 'amazon-ses.access-key' => null,
- 'amazon-ses.secret-key' => null,
-
- // If you're using Sendgrid to send email, provide your access credentials
- // here. This will use the REST API. You can also use Sendgrid as a normal
- // SMTP service.
- 'sendgrid.api-user' => null,
- 'sendgrid.api-key' => null,
-
- // You can configure a reply handler domain so that email sent from Maniphest
- // will have a special "Reply To" address like "T123+82+af19f@example.com"
- // that allows recipients to reply by email and interact with tasks. For
- // instructions on configurating reply handlers, see the article
- // "Configuring Inbound Email" in the Phabricator documentation. By default,
- // this is set to 'null' and Phabricator will use a generic 'noreply@' address
- // or the address of the acting user instead of a special reply handler
- // address (see 'metamta.default-address'). If you set a domain here,
- // Phabricator will begin generating private reply handler addresses. See
- // also 'metamta.maniphest.reply-handler' to further configure behavior.
- // This key should be set to the domain part after the @, like "example.com".
- 'metamta.maniphest.reply-handler-domain' => null,
-
- // You can follow the instructions in "Configuring Inbound Email" in the
- // Phabricator documentation and set 'metamta.maniphest.reply-handler-domain'
- // to support updating Maniphest tasks by email. If you want more advanced
- // customization than this provides, you can override the reply handler
- // class with an implementation of your own. This will allow you to do things
- // like have a single public reply handler or change how private reply
- // handlers are generated and validated.
- // This key should be set to a loadable subclass of
- // PhabricatorMailReplyHandler (and possibly of ManiphestReplyHandler).
- 'metamta.maniphest.reply-handler' => 'ManiphestReplyHandler',
-
- // If you don't want phabricator to take up an entire domain
- // (or subdomain for that matter), you can use this and set a common
- // prefix for mail sent by phabricator. It will make use of the fact that
- // a mail-address such as phabricator+D123+1hjk213h@example.com will be
- // delivered to the phabricator users mailbox.
- // Set this to the left part of the email address and it well get
- // prepended to all outgoing mail. If you want to use e.g.
- // 'phabricator@example.com' this should be set to 'phabricator'.
- 'metamta.single-reply-handler-prefix' => null,
-
- // Prefix prepended to mail sent by Maniphest. You can change this to
- // distinguish between testing and development installs, for example.
- 'metamta.maniphest.subject-prefix' => '[Maniphest]',
-
- // See 'metamta.maniphest.reply-handler-domain'. This does the same thing,
- // but allows email replies via Differential.
- 'metamta.differential.reply-handler-domain' => null,
-
- // See 'metamta.maniphest.reply-handler'. This does the same thing, but
- // affects Differential.
- 'metamta.differential.reply-handler' => 'DifferentialReplyHandler',
-
- // Prefix prepended to mail sent by Differential.
- 'metamta.differential.subject-prefix' => '[Differential]',
-
- // Set this to true if you want patches to be attached to mail from
- // Differential. This won't work if you are using SendGrid as your mail
- // adapter.
- 'metamta.differential.attach-patches' => false,
-
- // To include patches in email bodies, set this to a positive integer. Patches
- // will be inlined if they are at most that many lines. For instance, a value
- // of 100 means "inline patches if they are no longer than 100 lines". By
- // default, patches are not inlined.
- 'metamta.differential.inline-patches' => 0,
-
- // If you enable either of the options above, you can choose what format
- // patches are sent in. Valid options are 'unified' (like diff -u) or 'git'.
- 'metamta.differential.patch-format' => 'unified',
-
- // Prefix prepended to mail sent by Diffusion.
- 'metamta.diffusion.subject-prefix' => '[Diffusion]',
-
- // See 'metamta.maniphest.reply-handler-domain'. This does the same thing,
- // but allows email replies via Diffusion.
- 'metamta.diffusion.reply-handler-domain' => null,
-
- // See 'metamta.maniphest.reply-handler'. This does the same thing, but
- // affects Diffusion.
- 'metamta.diffusion.reply-handler' => 'PhabricatorAuditReplyHandler',
-
- // Prefix prepended to mail sent by Package.
- 'metamta.package.subject-prefix' => '[Package]',
-
- // See 'metamta.maniphest.reply-handler'. This does similar thing for package
- // except that it only supports sending out mail and doesn't handle incoming
- // email.
- 'metamta.package.reply-handler' => 'OwnersPackageReplyHandler',
-
- // By default, Phabricator generates unique reply-to addresses and sends a
- // separate email to each recipient when you enable reply handling. This is
- // more secure than using "From" to establish user identity, but can mean
- // users may receive multiple emails when they are on mailing lists. Instead,
- // you can use a single, non-unique reply to address and authenticate users
- // based on the "From" address by setting this to 'true'. This trades away
- // a little bit of security for convenience, but it's reasonable in many
- // installs. Object interactions are still protected using hashes in the
- // single public email address, so objects can not be replied to blindly.
- 'metamta.public-replies' => false,
-
- // You can configure an email address like "bugs@phabricator.example.com"
- // which will automatically create Maniphest tasks when users send email
- // to it. This relies on the "From" address to authenticate users, so it is
- // is not completely secure. To set this up, enter a complete email
- // address like "bugs@phabricator.example.com" and then configure mail to
- // that address so it routed to Phabricator (if you've already configured
- // reply handlers, you're probably already done). See "Configuring Inbound
- // Email" in the documentation for more information.
- 'metamta.maniphest.public-create-email' => null,
-
- // If you enable 'metamta.public-replies', Phabricator uses "From" to
- // authenticate users. You can additionally enable this setting to try to
- // authenticate with 'Reply-To'. Note that this is completely spoofable and
- // insecure (any user can set any 'Reply-To' address) but depending on the
- // nature of your install or other deliverability conditions this might be
- // okay. Generally, you can't do much more by spoofing Reply-To than be
- // annoying (you can write but not read content). But, you know, this is
- // still **COMPLETELY INSECURE**.
- 'metamta.insecure-auth-with-reply-to' => false,
-
- // If you enable 'metamta.maniphest.public-create-email' and create an
- // email address like "bugs@phabricator.example.com", it will default to
- // rejecting mail which doesn't come from a known user. However, you might
- // want to let anyone send email to this address; to do so, set a default
- // author here (a Phabricator username). A typical use of this might be to
- // create a "System Agent" user called "bugs" and use that name here. If you
- // specify a valid username, mail will always be accepted and used to create
- // a task, even if the sender is not a system user. The original email
- // address will be stored in an 'From Email' field on the task.
- 'metamta.maniphest.default-public-author' => null,
-
- // If this option is enabled, Phabricator will add a "Precedence: bulk"
- // header to transactional mail (e.g., Differential, Maniphest and Herald
- // notifications). This may improve the behavior of some auto-responder
- // software and prevent it from replying. However, it may also cause
- // deliverability issues -- notably, you currently can not send this header
- // via Amazon SES, and enabling this option with SES will prevent delivery
- // of any affected mail.
- 'metamta.precedence-bulk' => false,
-
- // Mail.app on OS X Lion won't respect threading headers unless the subject
- // is prefixed with "Re:". If you enable this option, Phabricator will add
- // "Re:" to the subject line of all mail which is expected to thread. If
- // you've set 'metamta.one-mail-per-recipient', users can override this
- // setting in their preferences.
- 'metamta.re-prefix' => false,
-
- // If true, allow MetaMTA to change mail subjects to put text like
- // '[Accepted]' and '[Commented]' in them. This makes subjects more useful,
- // but might break threading on some clients. If you've set
- // 'metamta.one-mail-per-recipient', users can override this setting in their
- // preferences.
- 'metamta.vary-subjects' => true,
-
-
-// -- Auth ------------------------------------------------------------------ //
-
- // Can users login with a username/password, or by following the link from
- // a password reset email? You can disable this and configure one or more
- // OAuth providers instead.
- 'auth.password-auth-enabled' => true,
-
- // Maximum number of simultaneous web sessions each user is permitted to have.
- // Setting this to "1" will prevent a user from logging in on more than one
- // browser at the same time.
- 'auth.sessions.web' => 5,
-
- // Maximum number of simultaneous Conduit sessions each user is permitted
- // to have.
- 'auth.sessions.conduit' => 5,
-
- // Set this true to enable the Settings -> SSH Public Keys panel, which will
- // allow users to associated SSH public keys with their accounts. This is only
- // really useful if you're setting up services over SSH and want to use
- // Phabricator for authentication; in most situations you can leave this
- // disabled.
- 'auth.sshkeys.enabled' => false,
-
- // If true, email addresses must be verified (by clicking a link in an
- // email) before a user can login. By default, verification is optional
- // unless 'auth.email-domains' is nonempty (see below).
- 'auth.require-email-verification' => false,
-
- // You can restrict allowed email addresses to certain domains (like
- // "yourcompany.com") by setting a list of allowed domains here. Users will
- // only be allowed to register using email addresses at one of the domains,
- // and will only be able to add new email addresses for these domains. If
- // you configure this, it implies 'auth.require-email-verification'.
- //
- // To configure email domains, set a list of domains like this:
- //
- // array(
- // 'yourcompany.com',
- // 'yourcompany.co.uk',
- // )
- //
- // You should omit the "@" from domains. Note that the domain must match
- // exactly. If you allow "yourcompany.com", that permits "joe@yourcompany.com"
- // but rejects "joe@mail.yourcompany.com".
- 'auth.email-domains' => array(),
-
-
-// -- Accounts -------------------------------------------------------------- //
-
- // Is basic account information (email, real name, profile picture) editable?
- // If you set up Phabricator to automatically synchronize account information
- // from some other authoritative system, you can disable this to ensure
- // information remains consistent across both systems.
- 'account.editable' => true,
-
- // When users set or reset a password, it must have at least this many
- // characters.
- 'account.minimum-password-length' => 8,
-
-
-// -- Facebook OAuth -------------------------------------------------------- //
-
- // Can users use Facebook credentials to login to Phabricator?
- 'facebook.auth-enabled' => false,
-
- // Can users use Facebook credentials to create new Phabricator accounts?
- 'facebook.registration-enabled' => true,
-
- // Are Facebook accounts permanently linked to Phabricator accounts, or can
- // the user unlink them?
- 'facebook.auth-permanent' => false,
-
- // The Facebook "Application ID" to use for Facebook API access.
- 'facebook.application-id' => null,
-
- // The Facebook "Application Secret" to use for Facebook API access.
- 'facebook.application-secret' => null,
-
-
-// -- GitHub OAuth ---------------------------------------------------------- //
-
- // Can users use GitHub credentials to login to Phabricator?
- 'github.auth-enabled' => false,
-
- // Can users use GitHub credentials to create new Phabricator accounts?
- 'github.registration-enabled' => true,
-
- // Are GitHub accounts permanently linked to Phabricator accounts, or can
- // the user unlink them?
- 'github.auth-permanent' => false,
-
- // The GitHub "Client ID" to use for GitHub API access.
- 'github.application-id' => null,
-
- // The GitHub "Secret" to use for GitHub API access.
- 'github.application-secret' => null,
-
-
-// -- Google OAuth ---------------------------------------------------------- //
-
- // Can users use Google credentials to login to Phabricator?
- 'google.auth-enabled' => false,
-
- // Can users use Google credentials to create new Phabricator accounts?
- 'google.registration-enabled' => true,
-
- // Are Google accounts permanently linked to Phabricator accounts, or can
- // the user unlink them?
- 'google.auth-permanent' => false,
-
- // The Google "Client ID" to use for Google API access.
- 'google.application-id' => null,
-
- // The Google "Client Secret" to use for Google API access.
- 'google.application-secret' => null,
-
-// -- LDAP Auth ----------------------------------------------------- //
- // Enable ldap auth
- 'ldap.auth-enabled' => false,
-
- // The LDAP server hostname
- 'ldap.hostname' => '',
-
- // The LDAP base domain name
- 'ldap.base_dn' => '',
-
- // The attribute to be regarded as 'username'. Has to be unique
- 'ldap.search_attribute' => '',
-
- // The attribute(s) to be regarded as 'real name'.
- // If more then one attribute is supplied the values of the attributes in
- // the array will be joined
- 'ldap.real_name_attributes' => array(),
-
- // The LDAP version
- 'ldap.version' => 3,
-
-// -- Disqus OAuth ---------------------------------------------------------- //
-
- // Can users use Disqus credentials to login to Phabricator?
- 'disqus.auth-enabled' => false,
-
- // Can users use Disqus credentials to create new Phabricator accounts?
- 'disqus.registration-enabled' => true,
-
- // Are Disqus accounts permanently linked to Phabricator accounts, or can
- // the user unlink them?
- 'disqus.auth-permanent' => false,
-
- // The Disqus "Client ID" to use for Disqus API access.
- 'disqus.application-id' => null,
-
- // The Disqus "Client Secret" to use for Disqus API access.
- 'disqus.application-secret' => null,
-
-
-// -- Phabricator OAuth ----------------------------------------------------- //
-
- // Meta-town -- Phabricator is itself an OAuth Provider
- // TODO -- T887 -- make this support multiple Phabricator instances!
-
- // The URI of the Phabricator instance to use as an OAuth server.
- 'phabricator.oauth-uri' => null,
-
- // Can users use Phabricator credentials to login to Phabricator?
- 'phabricator.auth-enabled' => false,
-
- // Can users use Phabricator credentials to create new Phabricator accounts?
- 'phabricator.registration-enabled' => true,
-
- // Are Phabricator accounts permanently linked to Phabricator accounts, or can
- // the user unlink them?
- 'phabricator.auth-permanent' => false,
-
- // The Phabricator "Client ID" to use for Phabricator API access.
- 'phabricator.application-id' => null,
-
- // The Phabricator "Client Secret" to use for Phabricator API access.
- 'phabricator.application-secret' => null,
-
-// -- Disqus Comments ------------------------------------------------------- //
-
- // Should Phame users have Disqus comment widget, and if so what's the
- // website shortname to use? For example, secure.phabricator.org uses
- // "phabricator", which we registered with Disqus. If you aren't familiar
- // with Disqus, see:
- // Disqus quick start guide - http://docs.disqus.com/help/4/
- // Information on shortnames - http://docs.disqus.com/help/68/
- 'disqus.shortname' => null,
-
-// -- Recaptcha ------------------------------------------------------------- //
-
- // Is Recaptcha enabled? If disabled, captchas will not appear. You should
- // enable Recaptcha if your install is public-facing, as it hinders
- // brute-force attacks.
- 'recaptcha.enabled' => false,
-
- // Your Recaptcha public key, obtained from Recaptcha.
- 'recaptcha.public-key' => null,
-
- // Your Recaptcha private key, obtained from Recaptcha.
- 'recaptcha.private-key' => null,
-
-
-// -- Misc ------------------------------------------------------------------ //
-
- // This is hashed with other inputs to generate CSRF tokens. If you want, you
- // can change it to some other string which is unique to your install. This
- // will make your install more secure in a vague, mostly theoretical way. But
- // it will take you like 3 seconds of mashing on your keyboard to set it up so
- // you might as well.
- 'phabricator.csrf-key' => '0b7ec0592e0a2829d8b71df2fa269b2c6172eca3',
-
- // This is hashed with other inputs to generate mail tokens. If you want, you
- // can change it to some other string which is unique to your install. In
- // particular, you will want to do this if you accidentally send a bunch of
- // mail somewhere you shouldn't have, to invalidate all old reply-to
- // addresses.
- 'phabricator.mail-key' => '5ce3e7e8787f6e40dfae861da315a5cdf1018f12',
-
- // Version string displayed in the footer. You probably should leave this
- // alone.
- 'phabricator.version' => 'UNSTABLE',
-
- // PHP requires that you set a timezone in your php.ini before using date
- // functions, or it will emit a warning. If this isn't possible (for instance,
- // because you are using HPHP) you can set some valid constant for
- // date_default_timezone_set() here and Phabricator will set it on your
- // behalf, silencing the warning.
- 'phabricator.timezone' => null,
-
- // When unhandled exceptions occur, stack traces are hidden by default.
- // You can enable traces for development to make it easier to debug problems.
- 'phabricator.show-stack-traces' => false,
-
- // Shows an error callout if a page generated PHP errors, warnings or notices.
- // This makes it harder to miss problems while developing Phabricator.
- 'phabricator.show-error-callout' => false,
-
- // When users write comments which have URIs, they'll be automatically linked
- // if the protocol appears in this set. This whitelist is primarily to prevent
- // security issues like javascript:// URIs.
- 'uri.allowed-protocols' => array(
- 'http' => true,
- 'https' => true,
- ),
-
- // Tokenizers are UI controls which let the user select other users, email
- // addresses, project names, etc., by typing the first few letters and having
- // the control autocomplete from a list. They can load their data in two ways:
- // either in a big chunk up front, or as the user types. By default, the data
- // is loaded in a big chunk. This is simpler and performs better for small
- // datasets. However, if you have a very large number of users or projects,
- // (in the ballpark of more than a thousand), loading all that data may become
- // slow enough that it's worthwhile to query on demand instead. This makes
- // the typeahead slightly less responsive but overall performance will be much
- // better if you have a ton of stuff. You can figure out which setting is
- // best for your install by changing this setting and then playing with a
- // user tokenizer (like the user selectors in Maniphest or Differential) and
- // seeing which setting loads faster and feels better.
- 'tokenizer.ondemand' => false,
-
- // By default, Phabricator includes some silly nonsense in the UI, such as
- // a submit button called "Clowncopterize" in Differential and a call to
- // "Leap Into Action". If you'd prefer more traditional UI strings like
- // "Submit", you can set this flag to disable most of the jokes and easter
- // eggs.
- 'phabricator.serious-business' => false,
-
-
-// -- Files ----------------------------------------------------------------- //
-
- // Lists which uploaded file types may be viewed in the browser. If a file
- // has a mime type which does not appear in this list, it will always be
- // downloaded instead of displayed. This is mainly a usability
- // consideration, since browsers tend to freak out when viewing enormous
- // binary files.
- //
- // The keys in this array are viewable mime types; the values are the mime
- // types they will be delivered as when they are viewed in the browser.
- //
- // IMPORTANT: Configure 'security.alternate-file-domain' above! Your install
- // is NOT safe if it is left unconfigured.
- 'files.viewable-mime-types' => array(
- 'image/jpeg' => 'image/jpeg',
- 'image/jpg' => 'image/jpg',
- 'image/png' => 'image/png',
- 'image/gif' => 'image/gif',
- 'text/plain' => 'text/plain; charset=utf-8',
- 'text/x-diff' => 'text/plain; charset=utf-8',
-
- // ".ico" favicon files, which have mime type diversity. See:
- // http://en.wikipedia.org/wiki/ICO_(file_format)#MIME_type
- 'image/x-ico' => 'image/x-icon',
- 'image/x-icon' => 'image/x-icon',
- 'image/vnd.microsoft.icon' => 'image/x-icon',
- ),
-
- // List of mime types which can be used as the source for an
tag.
- // This should be a subset of 'files.viewable-mime-types' and exclude files
- // like text.
- 'files.image-mime-types' => array(
- 'image/jpeg' => true,
- 'image/jpg' => true,
- 'image/png' => true,
- 'image/gif' => true,
- 'image/x-ico' => true,
- 'image/x-icon' => true,
- 'image/vnd.microsoft.icon' => true,
- ),
-
- // Phabricator can proxy images from other servers so you can paste the URI
- // to a funny picture of a cat into the comment box and have it show up as an
- // image. However, this means the webserver Phabricator is running on will
- // make HTTP requests to arbitrary URIs. If the server has access to internal
- // resources, this could be a security risk. You should only enable it if you
- // are installed entirely a VPN and VPN access is required to access
- // Phabricator, or if the webserver has no special access to anything. If
- // unsure, it is safer to leave this disabled.
- 'files.enable-proxy' => false,
-
-
-// -- Storage --------------------------------------------------------------- //
-
- // Phabricator allows users to upload files, and can keep them in various
- // storage engines. This section allows you to configure which engines
- // Phabricator will use, and how it will use them.
-
- // The largest filesize Phabricator will store in the MySQL BLOB storage
- // engine, which just uses a database table to store files. While this isn't a
- // best practice, it's really easy to set up. This is hard-limited by the
- // value of 'max_allowed_packet' in MySQL (since this often defaults to 1MB,
- // the default here is slightly smaller than 1MB). Set this to 0 to disable
- // use of the MySQL blob engine.
- 'storage.mysql-engine.max-size' => 1000000,
-
- // Phabricator provides a local disk storage engine, which just writes files
- // to some directory on local disk. The webserver must have read/write
- // permissions on this directory. This is straightforward and suitable for
- // most installs, but will not scale past one web frontend unless the path
- // is actually an NFS mount, since you'll end up with some of the files
- // written to each web frontend and no way for them to share. To use the
- // local disk storage engine, specify the path to a directory here. To
- // disable it, specify null.
- 'storage.local-disk.path' => null,
-
- // If you want to store files in Amazon S3, specify an AWS access and secret
- // key here and a bucket name below.
- 'amazon-s3.access-key' => null,
- 'amazon-s3.secret-key' => null,
-
- // Set this to a valid Amazon S3 bucket to store files there. You must also
- // configure S3 access keys above.
- 'storage.s3.bucket' => null,
-
- // Phabricator uses a storage engine selector to choose which storage engine
- // to use when writing file data. If you add new storage engines or want to
- // provide very custom rules (e.g., write images to one storage engine and
- // other files to a different one), you can provide an alternate
- // implementation here. The default engine will use choose MySQL, Local Disk,
- // and S3, in that order, if they have valid configurations above and a file
- // fits within configured limits.
- 'storage.engine-selector' => 'PhabricatorDefaultFileStorageEngineSelector',
-
- // Set the size of the largest file a user may upload. This is used to render
- // text like "Maximum file size: 10MB" on interfaces where users can upload
- // files, and files larger than this size will be rejected.
- //
- // Specify this limit in bytes, or using a "K", "M", or "G" suffix.
- //
- // NOTE: Setting this to a large size is NOT sufficient to allow users to
- // upload large files. You must also configure a number of other settings. To
- // configure file upload limits, consult the article "Configuring File Upload
- // Limits" in the documentation. Once you've configured some limit across all
- // levels of the server, you can set this limit to an appropriate value and
- // the UI will then reflect the actual configured limit.
- 'storage.upload-size-limit' => null,
-
- // Phabricator puts databases in a namespace, which defualts to "phabricator"
- // -- for instance, the Differential database is named
- // "phabricator_differential" by default. You can change this namespace if you
- // want. Normally, you should not do this unless you are developing
- // Phabricator and using namespaces to separate multiple sandbox datasets.
- 'storage.default-namespace' => 'phabricator',
-
-
-// -- Search ---------------------------------------------------------------- //
-
- // Phabricator supports Elastic Search; to use it, specify a host like
- // 'http://elastic.example.com:9200/' here.
- 'search.elastic.host' => null,
-
- // Phabricator uses a search engine selector to choose which search engine
- // to use when indexing and reconstructing documents, and when executing
- // queries. You can override the engine selector to provide a new selector
- // class which can select some custom engine you implement, if you want to
- // store your documents in some search engine which does not have default
- // support.
- 'search.engine-selector' => 'PhabricatorDefaultSearchEngineSelector',
-
-
-// -- Differential ---------------------------------------------------------- //
-
- 'differential.revision-custom-detail-renderer' => null,
-
- // Array for custom remarkup rules. The array should have a list of
- // class names of classes that extend PhutilRemarkupRule
- 'differential.custom-remarkup-rules' => null,
-
- // Array for custom remarkup block rules. The array should have a list of
- // class names of classes that extend PhutilRemarkupEngineBlockRule
- 'differential.custom-remarkup-block-rules' => null,
-
- // Set display word-wrap widths for Differential. Specify a dictionary of
- // regular expressions mapping to column widths. The filename will be matched
- // against each regexp in order until one matches. The default configuration
- // uses a width of 100 for Java and 80 for other languages. Note that 80 is
- // the greatest column width of all time. Changes here will not be immediately
- // reflected in old revisions unless you purge the changeset render cache
- // (with `./scripts/util/purge_cache.php --changesets`).
- 'differential.wordwrap' => array(
- '/\.java$/' => 100,
- '/.*/' => 80,
- ),
-
- // List of file regexps where whitespace is meaningful and should not
- // use 'ignore-all' by default
- 'differential.whitespace-matters' => array(
- '/\.py$/',
- '/\.l?hs$/',
- ),
-
- 'differential.field-selector' => 'DifferentialDefaultFieldSelector',
-
- // Differential can show "Host" and "Path" fields on revisions, with
- // information about the machine and working directory where the
- // change came from. These fields are disabled by default because they may
- // occasionally have sensitive information; you can set this to true to
- // enable them.
- 'differential.show-host-field' => false,
-
- // Differential has a required "Test Plan" field by default, which requires
- // authors to fill out information about how they verified the correctness of
- // their changes when sending code for review. If you'd prefer not to use
- // this field, you can disable it here. You can also make it optional
- // (instead of required) below.
- 'differential.show-test-plan-field' => true,
-
- // Differential has a required "Test Plan" field by default. You can make it
- // optional by setting this to false. You can also completely remove it above,
- // if you prefer.
- 'differential.require-test-plan-field' => true,
-
- // If you set this to true, users can "!accept" revisions via email (normally,
- // they can take other actions but can not "!accept"). This action is disabled
- // by default because email authentication can be configured to be very weak,
- // and, socially, email "!accept" is kind of sketchy and implies revisions may
- // not actually be receiving thorough review.
- 'differential.enable-email-accept' => false,
-
- // If you set this to true, users won't need to login to view differential
- // revisions. Anonymous users will have read-only access and won't be able to
- // interact with the revisions.
- 'differential.anonymous-access' => false,
-
- // List of file regexps that should be treated as if they are generated by
- // an automatic process, and thus get hidden by default in differential
- 'differential.generated-paths' => array(
- // '/config\.h$/',
- // '#/autobuilt/#',
- ),
-
-
-// -- Maniphest ------------------------------------------------------------- //
-
- 'maniphest.enabled' => true,
-
- // Array of custom fields for Maniphest tasks. For details on adding custom
- // fields to Maniphest, see "Maniphest User Guide: Adding Custom Fields".
- 'maniphest.custom-fields' => array(),
-
- // Class which drives custom field construction. See "Maniphest User Guide:
- // Adding Custom Fields" in the documentation for more information.
- 'maniphest.custom-task-extensions-class' => 'ManiphestDefaultTaskExtensions',
-
-// -- Phriction ------------------------------------------------------------- //
-
- 'phriction.enabled' => true,
-
-// -- Remarkup -------------------------------------------------------------- //
-
- // If you enable this, linked YouTube videos will be embeded inline. This has
- // mild security implications (you'll leak referrers to YouTube) and is pretty
- // silly (but sort of awesome).
- 'remarkup.enable-embedded-youtube' => false,
-
-
-// -- Garbage Collection ---------------------------------------------------- //
-
- // Phabricator generates various logs and caches in the database which can
- // be garbage collected after a while to make the total data size more
- // manageable. To run garbage collection, launch a
- // PhabricatorGarbageCollector daemon.
-
- // Since the GC daemon can issue large writes and table scans, you may want to
- // run it only during off hours or make sure it is scheduled so it doesn't
- // overlap with backups. This determines when the daemon can start running
- // each day.
- 'gcdaemon.run-at' => '12 AM',
-
- // How many seconds after 'gcdaemon.run-at' the daemon may collect garbage
- // for. By default it runs continuously, but you can set it to run for a
- // limited period of time. For instance, if you do backups at 3 AM, you might
- // run garbage collection for an hour beforehand. This is not a high-precision
- // limit so you may want to leave some room for the GC to actually stop, and
- // if you set it to something like 3 seconds you're on your own.
- 'gcdaemon.run-for' => 24 * 60 * 60,
-
- // These 'ttl' keys configure how much old data the GC daemon keeps around.
- // Objects older than the ttl will be collected. Set any value to 0 to store
- // data indefinitely.
-
- 'gcdaemon.ttl.herald-transcripts' => 30 * (24 * 60 * 60),
- 'gcdaemon.ttl.daemon-logs' => 7 * (24 * 60 * 60),
- 'gcdaemon.ttl.differential-parse-cache' => 14 * (24 * 60 * 60),
-
-
-// -- Feed ------------------------------------------------------------------ //
-
- // If you set this to true, you can embed Phabricator activity feeds in other
- // pages using iframes. These feeds are completely public, and a login is not
- // required to view them! This is intended for things like open source
- // projects that want to expose an activity feed on the project homepage.
- 'feed.public' => false,
-
-
-// -- Drydock --------------------------------------------------------------- //
-
- // If you want to use Drydock's builtin EC2 Blueprints, configure your AWS
- // EC2 credentials here.
- 'amazon-ec2.access-key' => null,
- 'amazon-ec2.secret-key' => null,
-
-// -- Customization --------------------------------------------------------- //
-
- // Paths to additional phutil libraries to load.
- 'load-libraries' => array(),
-
- 'aphront.default-application-configuration-class' =>
- 'AphrontDefaultApplicationConfiguration',
-
- 'controller.oauth-registration' =>
- 'PhabricatorOAuthDefaultRegistrationController',
-
-
- // Directory that phd (the Phabricator daemon control script) should use to
- // track running daemons.
- 'phd.pid-directory' => '/var/tmp/phd',
-
- // Number of "TaskMaster" daemons that "phd start" should start. You can
- // raise this if you have a task backlog, or explicitly launch more with
- // "phd launch taskmaster".
- 'phd.start-taskmasters' => 4,
-
- // Path to custom celerity resource map relative to 'phabricator/src'.
- // See also `scripts/celerity_mapper.php`.
- 'celerity.resource-path' => '__celerity_resource_map__.php',
-
- // This value is an input to the hash function when building resource hashes.
- // It has no security value, but if you accidentally poison user caches (by
- // pushing a bad patch or having something go wrong with a CDN, e.g.) you can
- // change this to something else and rebuild the Celerity map to break user
- // caches. Unless you are doing Celerity development, it is exceptionally
- // unlikely that you need to modify this.
- 'celerity.resource-hash' => 'd9455ea150622ee044f7931dabfa52aa',
-
- // In a development environment, it is desirable to force static resources
- // (CSS and JS) to be read from disk on every request, so that edits to them
- // appear when you reload the page even if you haven't updated the resource
- // maps. This setting ensures requests will be verified against the state on
- // disk. Generally, you should leave this off in production (caching behavior
- // and performance improve with it off) but turn it on in development. (These
- // settings are the defaults.)
- 'celerity.force-disk-reads' => false,
-
- // Minify static resources by removing whitespace and comments. You should
- // enable this in production, but disable it in development.
- 'celerity.minify' => false,
-
- // You can respond to various application events by installing listeners,
- // which will receive callbacks when interesting things occur. Specify a list
- // of classes which extend PhabricatorEventListener here.
- 'events.listeners' => array(),
-
-// -- Pygments -------------------------------------------------------------- //
-
- // Phabricator can highlight PHP by default, but if you want syntax
- // highlighting for other languages you should install the python package
- // 'Pygments', make sure the 'pygmentize' script is available in the
- // $PATH of the webserver, and then enable this.
- 'pygments.enabled' => false,
-
- // In places that we display a dropdown to syntax-highlight code,
- // this is where that list is defined.
- // Syntax is 'lexer-name' => 'Display Name',
- 'pygments.dropdown-choices' => array(
- 'apacheconf' => 'Apache Configuration',
- 'bash' => 'Bash Scripting',
- 'brainfuck' => 'Brainf*ck',
- 'c' => 'C',
- 'cpp' => 'C++',
- 'css' => 'CSS',
- 'diff' => 'Diff',
- 'django' => 'Django Templating',
- 'erb' => 'Embedded Ruby/ERB',
- 'erlang' => 'Erlang',
- 'html' => 'HTML',
- 'infer' => 'Infer from title (extension)',
- 'java' => 'Java',
- 'js' => 'Javascript',
- 'mysql' => 'MySQL',
- 'perl' => 'Perl',
- 'php' => 'PHP',
- 'text' => 'Plain Text',
- 'python' => 'Python',
- 'rainbow' => 'Rainbow',
- 'remarkup' => 'Remarkup',
- 'ruby' => 'Ruby',
- 'xml' => 'XML',
- ),
-
- 'pygments.dropdown-default' => 'infer',
-
- // This is an override list of regular expressions which allows you to choose
- // what language files are highlighted as. If your projects have certain rules
- // about filenames or use unusual or ambiguous language extensions, you can
- // create a mapping here. This is an ordered dictionary of regular expressions
- // which will be tested against the filename. They should map to either an
- // explicit language as a string value, or a numeric index into the captured
- // groups as an integer.
- 'syntax.filemap' => array(
- // Example: Treat all '*.xyz' files as PHP.
- // '@\\.xyz$@' => 'php',
-
- // Example: Treat 'httpd.conf' as 'apacheconf'.
- // '@/httpd\\.conf$@' => 'apacheconf',
-
- // Example: Treat all '*.x.bak' file as '.x'. NOTE: we map to capturing
- // group 1 by specifying the mapping as "1".
- // '@\\.([^.]+)\\.bak$@' => 1,
-
- '@\.arcconfig$@' => 'js',
- ),
-
-);
diff --git a/conf/development.conf.php b/conf/development.conf.php
deleted file mode 100644
index 425afda13a..0000000000
--- a/conf/development.conf.php
+++ /dev/null
@@ -1,27 +0,0 @@
- true,
- 'celerity.force-disk-reads' => true,
- 'phabricator.show-stack-traces' => true,
- 'phabricator.show-error-callout' => true,
- 'celerity.minify' => false,
-
-) + phabricator_read_config_file('default');
diff --git a/conf/keys/.keep b/conf/keys/.keep
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/conf/local/README b/conf/local/README
new file mode 100644
index 0000000000..a7dca3593a
--- /dev/null
+++ b/conf/local/README
@@ -0,0 +1 @@
+Run bin/config to work with this directory.
diff --git a/conf/production.conf.php b/conf/production.conf.php
deleted file mode 100644
index 7228521c76..0000000000
--- a/conf/production.conf.php
+++ /dev/null
@@ -1,22 +0,0 @@
-
+
+Usage JavaScript:
+
+
+
+Note:
+Google Closure Compiler is much more powerful and efficient tool.
+JsShrink was created for those looking for PHP or JavaScript only solution.
+Most other JS minifiers are not able to process valid JavaScript code:
+http://php.vrana.cz/minifikace-javascriptu.php#srovnani
diff --git a/externals/amazon-ses/ses.php b/externals/amazon-ses/ses.php
deleted file mode 100644
index bec4230df2..0000000000
--- a/externals/amazon-ses/ses.php
+++ /dev/null
@@ -1,742 +0,0 @@
-__accessKey; }
- public function getSecretKey() { return $this->__secretKey; }
- public function getHost() { return $this->__host; }
-
- protected $__verifyHost = 1;
- protected $__verifyPeer = 1;
-
- // verifyHost and verifyPeer determine whether curl verifies ssl certificates.
- // It may be necessary to disable these checks on certain systems.
- // These only have an effect if SSL is enabled.
- public function verifyHost() { return $this->__verifyHost; }
- public function enableVerifyHost($enable = true) { $this->__verifyHost = $enable; }
-
- public function verifyPeer() { return $this->__verifyPeer; }
- public function enableVerifyPeer($enable = true) { $this->__verifyPeer = $enable; }
-
- // If you use exceptions, errors will be communicated by throwing a
- // SimpleEmailServiceException. By default, they will be trigger_error()'d.
- protected $__useExceptions = 0;
- public function useExceptions() { return $this->__useExceptions; }
- public function enableUseExceptions($enable = true) { $this->__useExceptions = $enable; }
-
- /**
- * Constructor
- *
- * @param string $accessKey Access key
- * @param string $secretKey Secret key
- * @return void
- */
- public function __construct($accessKey = null, $secretKey = null, $host = 'email.us-east-1.amazonaws.com') {
- if ($accessKey !== null && $secretKey !== null) {
- $this->setAuth($accessKey, $secretKey);
- }
- $this->__host = $host;
- }
-
- /**
- * Set AWS access key and secret key
- *
- * @param string $accessKey Access key
- * @param string $secretKey Secret key
- * @return void
- */
- public function setAuth($accessKey, $secretKey) {
- $this->__accessKey = $accessKey;
- $this->__secretKey = $secretKey;
- }
-
- /**
- * Lists the email addresses that have been verified and can be used as the 'From' address
- *
- * @return An array containing two items: a list of verified email addresses, and the request id.
- */
- public function listVerifiedEmailAddresses() {
- $rest = new SimpleEmailServiceRequest($this, 'GET');
- $rest->setParameter('Action', 'ListVerifiedEmailAddresses');
-
- $rest = $rest->getResponse();
- if($rest->error === false && $rest->code !== 200) {
- $rest->error = array('code' => $rest->code, 'message' => 'Unexpected HTTP status');
- }
- if($rest->error !== false) {
- $this->__triggerError('listVerifiedEmailAddresses', $rest->error);
- return false;
- }
-
- $response = array();
- if(!isset($rest->body)) {
- return $response;
- }
-
- $addresses = array();
- foreach($rest->body->ListVerifiedEmailAddressesResult->VerifiedEmailAddresses->member as $address) {
- $addresses[] = (string)$address;
- }
-
- $response['Addresses'] = $addresses;
- $response['RequestId'] = (string)$rest->body->ResponseMetadata->RequestId;
-
- return $response;
- }
-
- /**
- * Requests verification of the provided email address, so it can be used
- * as the 'From' address when sending emails through SimpleEmailService.
- *
- * After submitting this request, you should receive a verification email
- * from Amazon at the specified address containing instructions to follow.
- *
- * @param string email The email address to get verified
- * @return The request id for this request.
- */
- public function verifyEmailAddress($email) {
- $rest = new SimpleEmailServiceRequest($this, 'POST');
- $rest->setParameter('Action', 'VerifyEmailAddress');
- $rest->setParameter('EmailAddress', $email);
-
- $rest = $rest->getResponse();
- if($rest->error === false && $rest->code !== 200) {
- $rest->error = array('code' => $rest->code, 'message' => 'Unexpected HTTP status');
- }
- if($rest->error !== false) {
- $this->__triggerError('verifyEmailAddress', $rest->error);
- return false;
- }
-
- $response['RequestId'] = (string)$rest->body->ResponseMetadata->RequestId;
- return $response;
- }
-
- /**
- * Removes the specified email address from the list of verified addresses.
- *
- * @param string email The email address to remove
- * @return The request id for this request.
- */
- public function deleteVerifiedEmailAddress($email) {
- $rest = new SimpleEmailServiceRequest($this, 'DELETE');
- $rest->setParameter('Action', 'DeleteVerifiedEmailAddress');
- $rest->setParameter('EmailAddress', $email);
-
- $rest = $rest->getResponse();
- if($rest->error === false && $rest->code !== 200) {
- $rest->error = array('code' => $rest->code, 'message' => 'Unexpected HTTP status');
- }
- if($rest->error !== false) {
- $this->__triggerError('deleteVerifiedEmailAddress', $rest->error);
- return false;
- }
-
- $response['RequestId'] = (string)$rest->body->ResponseMetadata->RequestId;
- return $response;
- }
-
- /**
- * Retrieves information on the current activity limits for this account.
- * See http://docs.amazonwebservices.com/ses/latest/APIReference/API_GetSendQuota.html
- *
- * @return An array containing information on this account's activity limits.
- */
- public function getSendQuota() {
- $rest = new SimpleEmailServiceRequest($this, 'GET');
- $rest->setParameter('Action', 'GetSendQuota');
-
- $rest = $rest->getResponse();
- if($rest->error === false && $rest->code !== 200) {
- $rest->error = array('code' => $rest->code, 'message' => 'Unexpected HTTP status');
- }
- if($rest->error !== false) {
- $this->__triggerError('getSendQuota', $rest->error);
- return false;
- }
-
- $response = array();
- if(!isset($rest->body)) {
- return $response;
- }
-
- $response['Max24HourSend'] = (string)$rest->body->GetSendQuotaResult->Max24HourSend;
- $response['MaxSendRate'] = (string)$rest->body->GetSendQuotaResult->MaxSendRate;
- $response['SentLast24Hours'] = (string)$rest->body->GetSendQuotaResult->SentLast24Hours;
- $response['RequestId'] = (string)$rest->body->ResponseMetadata->RequestId;
-
- return $response;
- }
-
- /**
- * Retrieves statistics for the last two weeks of activity on this account.
- * See http://docs.amazonwebservices.com/ses/latest/APIReference/API_GetSendStatistics.html
- *
- * @return An array of activity statistics. Each array item covers a 15-minute period.
- */
- public function getSendStatistics() {
- $rest = new SimpleEmailServiceRequest($this, 'GET');
- $rest->setParameter('Action', 'GetSendStatistics');
-
- $rest = $rest->getResponse();
- if($rest->error === false && $rest->code !== 200) {
- $rest->error = array('code' => $rest->code, 'message' => 'Unexpected HTTP status');
- }
- if($rest->error !== false) {
- $this->__triggerError('getSendStatistics', $rest->error);
- return false;
- }
-
- $response = array();
- if(!isset($rest->body)) {
- return $response;
- }
-
- $datapoints = array();
- foreach($rest->body->GetSendStatisticsResult->SendDataPoints->member as $datapoint) {
- $p = array();
- $p['Bounces'] = (string)$datapoint->Bounces;
- $p['Complaints'] = (string)$datapoint->Complaints;
- $p['DeliveryAttempts'] = (string)$datapoint->DeliveryAttempts;
- $p['Rejects'] = (string)$datapoint->Rejects;
- $p['Timestamp'] = (string)$datapoint->Timestamp;
-
- $datapoints[] = $p;
- }
-
- $response['SendDataPoints'] = $datapoints;
- $response['RequestId'] = (string)$rest->body->ResponseMetadata->RequestId;
-
- return $response;
- }
-
-
- public function sendRawEmail($raw) {
- $rest = new SimpleEmailServiceRequest($this, 'POST');
- $rest->setParameter('Action', 'SendRawEmail');
- $rest->setParameter('RawMessage.Data', base64_encode($raw));
-
- $rest = $rest->getResponse();
- if($rest->error === false && $rest->code !== 200) {
- $rest->error = array('code' => $rest->code, 'message' => 'Unexpected HTTP status');
- }
- if($rest->error !== false) {
- $this->__triggerError('sendRawEmail', $rest->error);
- return false;
- }
-
- $response['MessageId'] = (string)$rest->body->SendEmailResult->MessageId;
- $response['RequestId'] = (string)$rest->body->ResponseMetadata->RequestId;
- return $response;
- }
-
- /**
- * Given a SimpleEmailServiceMessage object, submits the message to the service for sending.
- *
- * @return An array containing the unique identifier for this message and a separate request id.
- * Returns false if the provided message is missing any required fields.
- */
- public function sendEmail($sesMessage) {
- if(!$sesMessage->validate()) {
- return false;
- }
-
- $rest = new SimpleEmailServiceRequest($this, 'POST');
- $rest->setParameter('Action', 'SendEmail');
-
- $i = 1;
- foreach($sesMessage->to as $to) {
- $rest->setParameter('Destination.ToAddresses.member.'.$i, $to);
- $i++;
- }
-
- if(is_array($sesMessage->cc)) {
- $i = 1;
- foreach($sesMessage->cc as $cc) {
- $rest->setParameter('Destination.CcAddresses.member.'.$i, $cc);
- $i++;
- }
- }
-
- if(is_array($sesMessage->bcc)) {
- $i = 1;
- foreach($sesMessage->bcc as $bcc) {
- $rest->setParameter('Destination.BccAddresses.member.'.$i, $bcc);
- $i++;
- }
- }
-
- if(is_array($sesMessage->replyto)) {
- $i = 1;
- foreach($sesMessage->replyto as $replyto) {
- $rest->setParameter('ReplyToAddresses.member.'.$i, $replyto);
- $i++;
- }
- }
-
- $rest->setParameter('Source', $sesMessage->from);
-
- if($sesMessage->returnpath != null) {
- $rest->setParameter('ReturnPath', $sesMessage->returnpath);
- }
-
- if($sesMessage->subject != null && strlen($sesMessage->subject) > 0) {
- $rest->setParameter('Message.Subject.Data', $sesMessage->subject);
- if($sesMessage->subjectCharset != null && strlen($sesMessage->subjectCharset) > 0) {
- $rest->setParameter('Message.Subject.Charset', $sesMessage->subjectCharset);
- }
- }
-
-
- if($sesMessage->messagetext != null && strlen($sesMessage->messagetext) > 0) {
- $rest->setParameter('Message.Body.Text.Data', $sesMessage->messagetext);
- if($sesMessage->messageTextCharset != null && strlen($sesMessage->messageTextCharset) > 0) {
- $rest->setParameter('Message.Body.Text.Charset', $sesMessage->messageTextCharset);
- }
- }
-
- if($sesMessage->messagehtml != null && strlen($sesMessage->messagehtml) > 0) {
- $rest->setParameter('Message.Body.Html.Data', $sesMessage->messagehtml);
- if($sesMessage->messageHtmlCharset != null && strlen($sesMessage->messageHtmlCharset) > 0) {
- $rest->setParameter('Message.Body.Html.Charset', $sesMessage->messageHtmlCharset);
- }
- }
-
- $rest = $rest->getResponse();
- if($rest->error === false && $rest->code !== 200) {
- $rest->error = array('code' => $rest->code, 'message' => 'Unexpected HTTP status');
- }
- if($rest->error !== false) {
- $this->__triggerError('sendEmail', $rest->error);
- return false;
- }
-
- $response['MessageId'] = (string)$rest->body->SendEmailResult->MessageId;
- $response['RequestId'] = (string)$rest->body->ResponseMetadata->RequestId;
- return $response;
- }
-
- /**
- * Trigger an error message
- *
- * @internal Used by member functions to output errors
- * @param array $error Array containing error information
- * @return string
- */
- public function __triggerError($functionname, $error)
- {
- if($error == false) {
- $message = sprintf("SimpleEmailService::%s(): Encountered an error, but no description given", $functionname);
- }
- else if(isset($error['curl']) && $error['curl'])
- {
- $message = sprintf("SimpleEmailService::%s(): %s %s", $functionname, $error['code'], $error['message']);
- }
- else if(isset($error['Error']))
- {
- $e = $error['Error'];
- $message = sprintf("SimpleEmailService::%s(): %s - %s: %s\nRequest Id: %s\n", $functionname, $e['Type'], $e['Code'], $e['Message'], $error['RequestId']);
- }
-
- if ($this->useExceptions()) {
- throw new SimpleEmailServiceException($message);
- } else {
- trigger_error($message, E_USER_WARNING);
- }
- }
-
- /**
- * Callback handler for 503 retries.
- *
- * @internal Used by SimpleDBRequest to call the user-specified callback, if set
- * @param $attempt The number of failed attempts so far
- * @return The retry delay in microseconds, or 0 to stop retrying.
- */
- public function __executeServiceTemporarilyUnavailableRetryDelay($attempt)
- {
- if(is_callable($this->__serviceUnavailableRetryDelayCallback)) {
- $callback = $this->__serviceUnavailableRetryDelayCallback;
- return $callback($attempt);
- }
- return 0;
- }
-}
-
-final class SimpleEmailServiceRequest
-{
- private $ses, $verb, $parameters = array();
- public $response;
-
- /**
- * Constructor
- *
- * @param string $ses The SimpleEmailService object making this request
- * @param string $action action
- * @param string $verb HTTP verb
- * @return mixed
- */
- function __construct($ses, $verb) {
- $this->ses = $ses;
- $this->verb = $verb;
- $this->response = new STDClass;
- $this->response->error = false;
- }
-
- /**
- * Set request parameter
- *
- * @param string $key Key
- * @param string $value Value
- * @param boolean $replace Whether to replace the key if it already exists (default true)
- * @return void
- */
- public function setParameter($key, $value, $replace = true) {
- if(!$replace && isset($this->parameters[$key]))
- {
- $temp = (array)($this->parameters[$key]);
- $temp[] = $value;
- $this->parameters[$key] = $temp;
- }
- else
- {
- $this->parameters[$key] = $value;
- }
- }
-
- /**
- * Get the response
- *
- * @return object | false
- */
- public function getResponse() {
-
- $params = array();
- foreach ($this->parameters as $var => $value)
- {
- if(is_array($value))
- {
- foreach($value as $v)
- {
- $params[] = $var.'='.$this->__customUrlEncode($v);
- }
- }
- else
- {
- $params[] = $var.'='.$this->__customUrlEncode($value);
- }
- }
-
- sort($params, SORT_STRING);
-
- // must be in format 'Sun, 06 Nov 1994 08:49:37 GMT'
- $date = gmdate('D, d M Y H:i:s e');
-
- $query = implode('&', $params);
-
- $headers = array();
- $headers[] = 'Date: '.$date;
- $headers[] = 'Host: '.$this->ses->getHost();
-
- $auth = 'AWS3-HTTPS AWSAccessKeyId='.$this->ses->getAccessKey();
- $auth .= ',Algorithm=HmacSHA256,Signature='.$this->__getSignature($date);
- $headers[] = 'X-Amzn-Authorization: '.$auth;
-
- $url = 'https://'.$this->ses->getHost().'/';
-
- // Basic setup
- $curl = curl_init();
- curl_setopt($curl, CURLOPT_USERAGENT, 'SimpleEmailService/php');
-
- curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, ($this->ses->verifyHost() ? 1 : 0));
- curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, ($this->ses->verifyPeer() ? 1 : 0));
-
- // Request types
- switch ($this->verb) {
- case 'GET':
- $url .= '?'.$query;
- break;
- case 'POST':
- curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $this->verb);
- curl_setopt($curl, CURLOPT_POSTFIELDS, $query);
- $headers[] = 'Content-Type: application/x-www-form-urlencoded';
- break;
- case 'DELETE':
- $url .= '?'.$query;
- curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'DELETE');
- break;
- default: break;
- }
- curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
- curl_setopt($curl, CURLOPT_HEADER, false);
-
- curl_setopt($curl, CURLOPT_URL, $url);
- curl_setopt($curl, CURLOPT_RETURNTRANSFER, false);
- curl_setopt($curl, CURLOPT_WRITEFUNCTION, array(&$this, '__responseWriteCallback'));
- curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
-
- // Execute, grab errors
- if (curl_exec($curl)) {
- $this->response->code = curl_getinfo($curl, CURLINFO_HTTP_CODE);
- } else {
- $this->response->error = array(
- 'curl' => true,
- 'code' => curl_errno($curl),
- 'message' => curl_error($curl),
- 'resource' => $this->resource
- );
- }
-
- @curl_close($curl);
-
- // Parse body into XML
- if ($this->response->error === false && isset($this->response->body)) {
- $this->response->body = simplexml_load_string($this->response->body);
-
- // Grab SES errors
- if (!in_array($this->response->code, array(200, 201, 202, 204))
- && isset($this->response->body->Error)) {
- $error = $this->response->body->Error;
- $output = array();
- $output['curl'] = false;
- $output['Error'] = array();
- $output['Error']['Type'] = (string)$error->Type;
- $output['Error']['Code'] = (string)$error->Code;
- $output['Error']['Message'] = (string)$error->Message;
- $output['RequestId'] = (string)$this->response->body->RequestId;
-
- $this->response->error = $output;
- unset($this->response->body);
- }
- }
-
- return $this->response;
- }
-
- /**
- * CURL write callback
- *
- * @param resource &$curl CURL resource
- * @param string &$data Data
- * @return integer
- */
- private function __responseWriteCallback(&$curl, &$data) {
- $this->response->body .= $data;
- return strlen($data);
- }
-
- /**
- * Contributed by afx114
- * URL encode the parameters as per http://docs.amazonwebservices.com/AWSECommerceService/latest/DG/index.html?Query_QueryAuth.html
- * PHP's rawurlencode() follows RFC 1738, not RFC 3986 as required by Amazon. The only difference is the tilde (~), so convert it back after rawurlencode
- * See: http://www.morganney.com/blog/API/AWS-Product-Advertising-API-Requires-a-Signed-Request.php
- *
- * @param string $var String to encode
- * @return string
- */
- private function __customUrlEncode($var) {
- return str_replace('%7E', '~', rawurlencode($var));
- }
-
- /**
- * Generate the auth string using Hmac-SHA256
- *
- * @internal Used by SimpleDBRequest::getResponse()
- * @param string $string String to sign
- * @return string
- */
- private function __getSignature($string) {
- return base64_encode(hash_hmac('sha256', $string, $this->ses->getSecretKey(), true));
- }
-}
-
-
-final class SimpleEmailServiceMessage {
-
- // these are public for convenience only
- // these are not to be used outside of the SimpleEmailService class!
- public $to, $cc, $bcc, $replyto;
- public $from, $returnpath;
- public $subject, $messagetext, $messagehtml;
- public $subjectCharset, $messageTextCharset, $messageHtmlCharset;
-
- function __construct() {
- $to = array();
- $cc = array();
- $bcc = array();
- $replyto = array();
-
- $from = null;
- $returnpath = null;
-
- $subject = null;
- $messagetext = null;
- $messagehtml = null;
-
- $subjectCharset = null;
- $messageTextCharset = null;
- $messageHtmlCharset = null;
- }
-
-
- /**
- * addTo, addCC, addBCC, and addReplyTo have the following behavior:
- * If a single address is passed, it is appended to the current list of addresses.
- * If an array of addresses is passed, that array is merged into the current list.
- */
- function addTo($to) {
- if(!is_array($to)) {
- $this->to[] = $to;
- }
- else {
- $this->to = array_merge($this->to, $to);
- }
- }
-
- function addCC($cc) {
- if(!is_array($cc)) {
- $this->cc[] = $cc;
- }
- else {
- $this->cc = array_merge($this->cc, $cc);
- }
- }
-
- function addBCC($bcc) {
- if(!is_array($bcc)) {
- $this->bcc[] = $bcc;
- }
- else {
- $this->bcc = array_merge($this->bcc, $bcc);
- }
- }
-
- function addReplyTo($replyto) {
- if(!is_array($replyto)) {
- $this->replyto[] = $replyto;
- }
- else {
- $this->replyto = array_merge($this->replyto, $replyto);
- }
- }
-
- function setFrom($from) {
- $this->from = $from;
- }
-
- function setReturnPath($returnpath) {
- $this->returnpath = $returnpath;
- }
-
- function setSubject($subject) {
- $this->subject = $subject;
- }
-
- function setSubjectCharset($charset) {
- $this->subjectCharset = $charset;
- }
-
- function setMessageFromString($text, $html = null) {
- $this->messagetext = $text;
- $this->messagehtml = $html;
- }
-
- function setMessageFromFile($textfile, $htmlfile = null) {
- if(file_exists($textfile) && is_file($textfile) && is_readable($textfile)) {
- $this->messagetext = file_get_contents($textfile);
- }
- if(file_exists($htmlfile) && is_file($htmlfile) && is_readable($htmlfile)) {
- $this->messagehtml = file_get_contents($htmlfile);
- }
- }
-
- function setMessageFromURL($texturl, $htmlurl = null) {
- $this->messagetext = file_get_contents($texturl);
- if($htmlurl !== null) {
- $this->messagehtml = file_get_contents($htmlurl);
- }
- }
-
- function setMessageCharset($textCharset, $htmlCharset = null) {
- $this->messageTextCharset = $textCharset;
- $this->messageHtmlCharset = $htmlCharset;
- }
-
- /**
- * Validates whether the message object has sufficient information to submit a request to SES.
- * This does not guarantee the message will arrive, nor that the request will succeed;
- * instead, it makes sure that no required fields are missing.
- *
- * This is used internally before attempting a SendEmail or SendRawEmail request,
- * but it can be used outside of this file if verification is desired.
- * May be useful if e.g. the data is being populated from a form; developers can generally
- * use this function to verify completeness instead of writing custom logic.
- *
- * @return boolean
- */
- public function validate() {
- if(count($this->to) == 0)
- return false;
- if($this->from == null || strlen($this->from) == 0)
- return false;
- if($this->messagetext == null)
- return false;
- return true;
- }
-}
-
-
-/**
- * Thrown by SimpleEmailService when errors occur if you call
- * enableUseExceptions(true).
- */
-final class SimpleEmailServiceException extends Exception {
-
-}
\ No newline at end of file
diff --git a/externals/cldr/cldr_windows_timezones.xml b/externals/cldr/cldr_windows_timezones.xml
new file mode 100644
index 0000000000..47b689d8af
--- /dev/null
+++ b/externals/cldr/cldr_windows_timezones.xml
@@ -0,0 +1,769 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/externals/cowsay/ChangeLog b/externals/cowsay/ChangeLog
new file mode 100644
index 0000000000..b28ef91b85
--- /dev/null
+++ b/externals/cowsay/ChangeLog
@@ -0,0 +1,31 @@
+3.03 28 May 1999
+ - Added cows/tux.cow, as suggested by xmanoel@i.am
+ - Compatibility with 5.6.0, due to a change in qw().
+ - Renamed devil.cow to daemon.cow, since I know better. :-)
+
+3.02 04 November 1999
+ - Fixed boneheaded code placement so that cowsay -l actually works.
+
+3.01 01 November 1999
+ - Fixed compatibility issues between the Text::Wrap module
+ that changed between 5.005_02 and 5.005_03.
+ - Fixed tab expansion issues with Text::Tabs.
+
+3.0 13 April 1999, released 14 August 1999
+ - Rewritten into Perl 5 and presented to the world.
+
+-- Not present in CVS from here on down --
+
+2.x Date?
+ - Arbitrary messages.
+ - Figlet support (-n).
+ - Line wrap length (-w).
+ - Multiple pre-set expressions.
+ - Better arg parsing loop.
+ - Message from stdin or command line.
+
+1.0 Date?
+ - SUBJECT is VERB OBJECT
+
+$Id: ChangeLog,v 1.4 2000/05/29 17:55:24 tony Exp $
+This file is part of cowsay. (c) 1999-2000 Tony Monroe.
diff --git a/externals/cowsay/INSTALL b/externals/cowsay/INSTALL
new file mode 100644
index 0000000000..d3844ca565
--- /dev/null
+++ b/externals/cowsay/INSTALL
@@ -0,0 +1,15 @@
+=================
+Installing cowsay
+=================
+
+If you really want to get things installed a nice and pretty way,
+
+ sh install.sh
+
+It will ask approximately one question. If you can't answer it,
+you need serious help.
+
+If the install goes well, you can start cowing immediately! Just
+be sure to read the manual page first...
+
+$Id: INSTALL,v 1.1 1999/08/14 08:03:17 tony Exp $
diff --git a/externals/cowsay/LICENSE b/externals/cowsay/LICENSE
new file mode 100644
index 0000000000..944770492d
--- /dev/null
+++ b/externals/cowsay/LICENSE
@@ -0,0 +1,36 @@
+==============
+cowsay License
+==============
+
+cowsay is distributed under the same licensing terms as Perl: the
+Artistic License or the GNU General Public License. If you don't
+want to track down these licenses and read them for yourself, use
+the parts that I'd prefer:
+
+(0) I wrote it and you didn't.
+
+(1) Give credit where credit is due if you borrow the code for some
+other purpose.
+
+(2) If you have any bugfixes or suggestions, please notify me so
+that I may incorporate them.
+
+(3) If you try to make money off of cowsay, you suck.
+
+===============
+cowsay Legalese
+===============
+
+(0) Copyright (c) 1999 Tony Monroe. All rights reserved. All
+lefts may or may not be reversed at my discretion.
+
+(1) This software package can be freely redistributed or modified
+under the terms described above in the "cowsay License" section
+of this file.
+
+(2) cowsay is provided "as is," with no warranties whatsoever,
+expressed or implied. If you want some implied warranty about
+merchantability and/or fitness for a particular purpose, you will
+not find it here, because there is no such thing here.
+
+(3) I hate legalese.
diff --git a/externals/cowsay/MANIFEST b/externals/cowsay/MANIFEST
new file mode 100644
index 0000000000..a3ff805fed
--- /dev/null
+++ b/externals/cowsay/MANIFEST
@@ -0,0 +1,11 @@
+ChangeLog Changes to recent versions.
+INSTALL Instructions for installing cowsay.
+LICENSE The license for use and redistribution of cowsay.
+MANIFEST This file.
+README Read this first. Really.
+Wrap.pm.diff Diff for Text/Wrap.pm.
+cows/* Support files used by cowsay.
+cowsay Main cowsay executable.
+cowsay.1 Main cowsay manual page.
+install.sh cowsay installation script.
+pgp_public_key.txt Verify the signature file with this key.
diff --git a/externals/cowsay/README b/externals/cowsay/README
new file mode 100644
index 0000000000..b5de08c405
--- /dev/null
+++ b/externals/cowsay/README
@@ -0,0 +1,38 @@
+===========
+cowsay 3.03
+===========
+
+cowsay is a configurable talking cow, written in Perl. It operates
+much as the figlet program does, and it written in the same spirit
+of silliness.
+
+cowsay is actually a pretty old program. It has not really been
+released before, and I am releasing it in the hope that someone
+other than myself will be amused by it.
+
+The first major version of cowsay had one cow and one message
+template: $foo is $verb $bar. Not very flexible, but people managed
+to do pretty interesting things with it. The second major version
+scrapped many of the limitations of the first, by allowing arbitrary
+messages, multiple cowfiles, and even support for cows talking in
+figlet. The third version was a rewrite of the second into Perl
+5, whereupon the code got a lot smaller and more manageable. :-)
+
+If you are using Perl 5.004, you may have problems with Text::Wrap.
+(Yeesh, this module changes more than it should...) I've included
+a diff for the Text::Wrap (version 97.011701) that is shipped with
+5.004_04; the concept is simple enough that even older Perls can
+take advantage of this silly little patch; if there is a "sub fill"
+in the documentation for the module, copy it to a more useful
+section of that file. If not, just take "sub fill" wholesale from
+the patch. Oh, and consider upgrading to 5.005_03 or later.
+Please. You'll like it, I promise.
+
+To install cowsay, consult the INSTALL file in this directory.
+
+For the terms and conditions of use, consult the LICENSE file in
+this directory.
+
+-- Tony Monroe (tony@nog.net)
+
+$Id: README,v 1.3 2000/05/28 06:24:46 tony Exp $
diff --git a/externals/cowsay/Wrap.pm.diff b/externals/cowsay/Wrap.pm.diff
new file mode 100644
index 0000000000..1da064079e
--- /dev/null
+++ b/externals/cowsay/Wrap.pm.diff
@@ -0,0 +1,47 @@
+*** Wrap.pm.in Thu May 22 00:21:42 1997
+--- Wrap.pm Fri Nov 12 10:00:15 1999
+***************
+*** 3,9 ****
+ require Exporter;
+
+ @ISA = (Exporter);
+! @EXPORT = qw(wrap);
+ @EXPORT_OK = qw($columns);
+
+ $VERSION = 97.011701;
+--- 3,9 ----
+ require Exporter;
+
+ @ISA = (Exporter);
+! @EXPORT = qw(wrap fill);
+ @EXPORT_OK = qw($columns);
+
+ $VERSION = 97.011701;
+***************
+*** 66,71 ****
+--- 66,90 ----
+
+ print "-----------$r---------\n" if $debug;;
+ return $r;
++ }
++
++ ## Copied up from below.
++ sub fill
++ {
++ my ($ip, $xp, @raw) = @_;
++ my @para;
++ my $pp;
++
++ for $pp (split(/\n\s+/, join("\n",@raw))) {
++ $pp =~ s/\s+/ /g;
++ my $x = wrap($ip, $xp, $pp);
++ push(@para, $x);
++ }
++
++ # if paragraph_indent is the same as line_indent,
++ # separate paragraphs with blank lines
++
++ return join ($ip eq $xp ? "\n\n" : "\n", @para);
+ }
+
+ 1;
diff --git a/externals/cowsay/cows/bunny.cow b/externals/cowsay/cows/bunny.cow
new file mode 100644
index 0000000000..869933f72a
--- /dev/null
+++ b/externals/cowsay/cows/bunny.cow
@@ -0,0 +1,10 @@
+##
+## A cute little wabbit
+##
+$the_cow = <> 5.4
+##
+$the_cow = < \\ _ -~ `. ^-` ^-_
+ ///-._ _ _ _ _ _ _}^ - - - - ~ ~-- ,.-~
+ /.-~
+EOC
diff --git a/externals/cowsay/cows/elephant.cow b/externals/cowsay/cows/elephant.cow
new file mode 100644
index 0000000000..959cd3f6dd
--- /dev/null
+++ b/externals/cowsay/cows/elephant.cow
@@ -0,0 +1,15 @@
+##
+## An elephant out and about
+##
+$the_cow = < < > .---.
+ $thoughts | \\ \\ - ~ ~ - / / |
+ _____ ..-~ ~-..-~
+ | | \\~~~\\.' `./~~~/
+ --------- \\__/ \\__/
+ .' O \\ / / \\ "
+ (_____, `._.' | } \\/~~~/
+ `----. / } | / \\__/
+ `-. | / | / `. ,~~|
+ ~-.__| /_ - ~ ^| /- _ `..-'
+ | / | / ~-. `-. _ _ _
+ |_____| |_____| ~ - . _ _ _ _ _>
+EOC
diff --git a/externals/cowsay/cows/supermilker.cow b/externals/cowsay/cows/supermilker.cow
new file mode 100644
index 0000000000..1424f9e668
--- /dev/null
+++ b/externals/cowsay/cows/supermilker.cow
@@ -0,0 +1,10 @@
+##
+## A cow being milked, probably from Lars Smith (lars@csua.berkeley.edu)
+##
+$the_cow = <____) >___ ^\\_\\_\\_\\_\\_\\_\\)
+ ^^^//\\\\_^^//\\\\_^ ^(\\_\\_\\_\\)
+ ^^^ ^^ ^^^ ^
+EOC
diff --git a/externals/cowsay/cows/turtle.cow b/externals/cowsay/cows/turtle.cow
new file mode 100644
index 0000000000..4286b0948a
--- /dev/null
+++ b/externals/cowsay/cows/turtle.cow
@@ -0,0 +1,20 @@
+##
+## A mysterious turtle...
+##
+$the_cow = < 'oo',
+ 'f' => 'default.cow',
+ 'n' => 0,
+ 'T' => ' ',
+ 'W' => 40,
+);
+
+getopts('bde:f:ghlLnNpstT:wW:y', \%opts);
+
+&display_usage if $opts{'h'};
+&list_cowfiles if $opts{'l'};
+
+$borg = $opts{'b'};
+$dead = $opts{'d'};
+$greedy = $opts{'g'};
+$paranoid = $opts{'p'};
+$stoned = $opts{'s'};
+$tired = $opts{'t'};
+$wired = $opts{'w'};
+$young = $opts{'y'};
+$eyes = substr($opts{'e'}, 0, 2);
+$tongue = substr($opts{'T'}, 0, 2);
+$the_cow = "";
+
+&slurp_input;
+$Text::Wrap::columns = $opts{'W'};
+@message = ($opts{'n'} ? expand(@message) :
+ split("\n", fill("", "", @message)));
+&construct_balloon;
+&construct_face;
+&get_cow;
+print @balloon_lines;
+print $the_cow;
+
+sub list_cowfiles {
+ my $basedir;
+ my @dirfiles;
+ chop($basedir = cwd);
+ for my $d (split(/$pathsep/, $cowpath)) {
+ print "Cow files in $d:\n";
+ opendir(COWDIR, $d) || die "$0: Cannot open $d\n";
+ for my $file (readdir COWDIR) {
+ if ($file =~ s/\.cow$//) {
+ push(@dirfiles, $file);
+ }
+ }
+ closedir(COWDIR);
+ print wrap("", "", sort @dirfiles), "\n";
+ @dirfiles = ();
+ chdir($basedir);
+ }
+ exit(0);
+}
+
+sub slurp_input {
+ unless ($ARGV[0]) {
+ chomp(@message = );
+ } else {
+ &display_usage if $opts{'n'};
+ @message = join(' ', @ARGV);
+ }
+}
+
+sub maxlength {
+ my ($l, $m);
+ $m = -1;
+ for my $i (@_) {
+ $l = length $i;
+ $m = $l if ($l > $m);
+ }
+ return $m;
+}
+
+sub construct_balloon {
+ my $max = &maxlength(@message);
+ my $max2 = $max + 2; ## border space fudge.
+ my $format = "%s %-${max}s %s\n";
+ my @border; ## up-left, up-right, down-left, down-right, left, right
+ if ($0 =~ /think/i) {
+ $thoughts = 'o';
+ @border = qw[ ( ) ( ) ( ) ];
+ } elsif (@message < 2) {
+ $thoughts = '\\';
+ @border = qw[ < > ];
+ } else {
+ $thoughts = '\\';
+ if ($V and $V gt v5.6.0) { # Thanks, perldelta.
+ @border = qw[ / \\ \\ / | | ];
+ } else {
+ @border = qw[ / \ \ / | | ];
+ }
+ }
+ push(@balloon_lines,
+ " " . ("_" x $max2) . " \n" ,
+ sprintf($format, $border[0], $message[0], $border[1]),
+ (@message < 2 ? "" :
+ map { sprintf($format, $border[4], $_, $border[5]) }
+ @message[1 .. $#message - 1]),
+ (@message < 2 ? "" :
+ sprintf($format, $border[2], $message[$#message], $border[3])),
+ " " . ("-" x $max2) . " \n"
+ );
+}
+
+sub construct_face {
+ if ($borg) { $eyes = "=="; }
+ if ($dead) { $eyes = "xx"; $tongue = "U "; }
+ if ($greedy) { $eyes = "\$\$"; }
+ if ($paranoid) { $eyes = "@@"; }
+ if ($stoned) { $eyes = "**"; $tongue = "U "; }
+ if ($tired) { $eyes = "--"; }
+ if ($wired) { $eyes = "OO"; }
+ if ($young) { $eyes = ".."; }
+}
+
+sub get_cow {
+##
+## Get a cow from the specified cowfile; otherwise use the default cow
+## which was defined above in $the_cow.
+##
+ my $f = $opts{'f'};
+ my $full = "";
+ if ($opts{'f'} =~ m,/,) {
+ $full = $opts{'f'};
+ } else {
+ for my $d (split(/:/, $cowpath)) {
+ if (-f "$d/$f") {
+ $full = "$d/$f";
+ last;
+ } elsif (-f "$d/$f.cow") {
+ $full = "$d/$f.cow";
+ last;
+ }
+ }
+ if ($full eq "") {
+ die "$progname: Could not find $f cowfile!\n";
+ }
+ }
+ do $full;
+ die "$progname: $@\n" if $@;
+}
+
+sub display_usage {
+ die </dev/null 2>&1; then
+ echo Found a good perl in $perl
+ goodperls="$goodperls $perl"
+ fi
+done
+echo The following perl executables will run cowsay:
+echo $goodperls
+echo I recommend the latest stable perl you can find.
+set $goodperls
+if [ -z "$1" ]; then
+ echo Ack! You do not have Perl 5 installed correctly!
+ echo Get thee to CPAN!
+ exit 1
+fi
+usethisperl=$1
+echo I will be using $1 because I know it will work.
+
+echo Now I need an installation prefix. I will use /usr/local unless
+printf "you give me a better idea here: "
+if [ -n "$backdoor" ]; then
+ prefix=$backdoor
+ printf "%s (specified on command line)\n" $prefix
+else
+ read prefix
+fi
+
+PREFIX=${prefix:-/usr/local}
+
+echo Okay, time to install this puppy.
+
+echo s,%BANGPERL%,!$usethisperl,\; > install.pl
+echo s,%PREFIX%,$PREFIX,\; >> install.pl
+set -x
+mkdir -p $PREFIX/bin || (mkdir $PREFIX; mkdir $PREFIX/bin)
+$usethisperl -p install.pl cowsay > $PREFIX/bin/cowsay
+chmod a+x $PREFIX/bin/cowsay
+ln -s cowsay $PREFIX/bin/cowthink
+mkdir -p $PREFIX/man/man1 || ($mkdir $PREFIX; mkdir $PREFIX/man; mkdir $PREFIX/man/man1)
+$usethisperl -p install.pl cowsay.1 > $PREFIX/man/man1/cowsay.1
+chmod a+r $PREFIX/man/man1/cowsay.1
+ln -s cowsay.1 $PREFIX/man/man1/cowthink.1
+mkdir -p $PREFIX/share/cows || (mkdir $PREFIX; mkdir $PREFIX/share; mkdir $PREFIX/share/cows)
+tar -cf - $filelist | (cd $PREFIX/share && tar -xvf -)
+set +x
+
+echo Okay, let us see if the install actually worked.
+
+if [ ! -f $PREFIX/share/cows/default.cow ]; then
+ echo The default cow file did not make it across!
+ echo Ooops, it failed...sorry!
+ exit 1
+fi
+
+echo Installation complete! Enjoy the cows!
diff --git a/externals/cowsay/pgp_public_key.txt b/externals/cowsay/pgp_public_key.txt
new file mode 100644
index 0000000000..135735e6f9
--- /dev/null
+++ b/externals/cowsay/pgp_public_key.txt
@@ -0,0 +1,14 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+Version: 2.6.2
+
+mQCNAzNS+H4AAAEEAMilCcxLMIqMNXhZoeHjbeJGnHoKP0JpKDejz66qBlDwP+du
+FvVBHkyNIuU3orKe7l/aXIR8TcpjrxdcmrjjzwuB1aV48V4swT7v9UXvv9YP41Pd
+1pXYXNelXHmE0eKSfcnkkFmYTJBXPaPNTJ3rpZpZOEW3SfgrrheqQm6w/6IJAAUR
+tBpUb255IE1vbnJvZSA8dG9ueUBub2cubmV0PrQdVG9ueSBNb25yb2UgPHRtb25y
+b2VAbm9nLm5ldD6JAJUDBRA2bDA5F6pCbrD/ogkBASOZA/9XtYSpcPjpi62MTEZl
+l+wV1svtlUlPvKkDE7FB9bwnMbF1FgGhTe/H4/8qDu20m5eGxMX58Ri7HPXWjjJ/
+CrUWMzGVbg1JBkgh+d9QvEywmR0j4WezaifW1nCbxk0GrW1PjJyGb3kx7vrIF1Km
+xt6VwxTgfJzjIioBJFb4EiDyaLQnVG9ueSBNb25yb2UgPHRtb25yb2VAQ1NVQS5C
+ZXJrZWxleS5FRFU+
+=WpM4
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/externals/figlet/.gitignore b/externals/figlet/.gitignore
new file mode 100644
index 0000000000..dc65b3c3eb
--- /dev/null
+++ b/externals/figlet/.gitignore
@@ -0,0 +1,8 @@
+chkfont
+figlet
+tags
+*.o
+core
+*~
+tests.log
+*.tar.gz
diff --git a/externals/figlet/CHANGES b/externals/figlet/CHANGES
new file mode 100644
index 0000000000..4f2d6e9edb
--- /dev/null
+++ b/externals/figlet/CHANGES
@@ -0,0 +1,205 @@
+Changes in FIGlet 2.2.5
+-----------------------
+
+FIGlet 2.2.5 is a revision of FIGlet 2.2.4 containing updated andproperly
+licensed ISO8859 map files. The full list of changes is:
+
+o Add regression tests for uskata and jis0201 control files
+
+o Properly escape minus signs in figlist(6) man page (Jonathan
+ McCrohan)
+
+o Fix chkfont coredump on invalid input (Kenneth Davies and
+ Jonathan McCrohan)
+
+o Update ISO8859 map files to fix licensing issue raised in Debian
+ bugs 673096 and 674844
+
+o Re-add missing figmagic and getopt.c files which were left out
+ of releases 2.2.3 and 2.2.4
+
+o Fix output of test script in MacOS X
+
+These changes were made by Claudio Matsuoka
+31 May 2012
+
+Changes in FIGlet 2.2.4
+-----------------------
+
+FIGlet 2.2.4 is a revision of FIGlet 2.2.3 featuring bugfixes and support
+to tlf2 fonts. The full list of changes is:
+
+o Add support to Sam Hocevar's TOIlet TLF fonts containing UTF-8
+ encoded Unicode characters.
+
+o Add infocode 5 to list supported font formats
+
+o Fix rendering error caused by the previous attempt to fix invalid
+ memory accesses when smushing at start of line
+
+o New environment variable FIGLET_FONTDIR can be used to specify
+ the path to search for fonts
+
+o Add regression tests
+
+These changes were made by Claudio Matsuoka
+26 January 2011
+
+Changes in FIGlet 2.2.3
+-----------------------
+
+FIGlet 2.2.3 is a revision of FIGlet 2.2.2 featuring minor bugfixes and
+important licensing changes in the zipio files. The full list of
+changes is:
+
+o License changed from "Academic Free License" to "New BSD License"
+ (3-clause) as agreed by FIGlet authors
+
+o New JIS X 0201 control file (Micah Cowan)
+
+o Fix behavior of JIS0201 SHIFT-OUT and SHIFT-IN that were previouly
+ inverted (Micah Cowan)
+
+o Fix memory violation when smushing at line start
+
+o Fix handling of memory allocation errors
+
+o Relicense Ed Hamrick zipio under the MIT license. This should
+ eliminate any concerns about redistribution of FIGlet as libre
+ software.
+
+o Update Makefile to meet modern standards in variable naming, using
+ BINDIR as the pathname for binary files and reservind DESTDIR
+ as the extra prefix commonly used in package building.
+
+o Add a Turbo C makefile, just because I had the compiler. (this
+ also tests portability to old compilers and foreign platforms)
+
+o Add Jonathon Abbott's man pages for figlist, showfigfonts and
+ chkfont originally contributed to the Debian Project
+
+These changes were made by Claudio Matsuoka
+12 January 2011
+
+Changes in FIGlet 2.2.2
+-----------------------
+
+License changed from "Artistic License" to "Academic Free
+License" as agreed by FIGlet authors. 05 July 2005
+
+Changes in FIGlet 2.2.1
+-----------------------
+
+FIGlet 2.2.1 is a minor revision of FIGlet 2.2. The files
+README, Makefile, figfont.txt, figlet.c and figlet.6 have been
+changed to reflect changes in documentation, official contact
+details etc. FTP-NOTE merged into README. FAQ and CHANGES
+added to the distribution.
+
+All other files are identical with the 2.2 release.
+
+These changes were made by Christiaan Keet
+
+Changes in FIGlet 2.2
+---------------------
+
+FIGlet 2.2 is a moderate revision of FIGlet 2.1.2. The new features are:
+
+o font files and control files can be compressed using ``zip'', and
+ will be automatically decompressed
+
+o new commands in controlfiles provide support for
+ single-byte (default), double-byte, HZ, Shift-JIS, and Unicode
+ UTF-8 encodings of the input
+
+o ISO 2022 escape sequences are decoded and interpreted
+
+o control files can now have the format of Unicode Consortium
+ mapping tables (two columns of numbers representing
+ input character and output character, no ranges, # comments)
+
+o new options -s (smush, same as -m-2), -k (kern, same as -m0),
+ -S (forced smushing), and -W (full width, same as -m-1) make
+ -m option unnecessary except for font designers. The -S option
+ works even if the font's smushmode is 0 or -1, in which case
+ the smushmode is read from a new parameter in the
+ font's first line, or does universal overlapping if no such parameter
+ exists
+
+o universal smushing (-o option to force it, but -S will use it
+ if no smush rules are available) makes FIGcharacters overlap by
+ one place independent of how they are constructed
+ more fonts smushable.
+
+o file "figmagic" can be appended to your system magic number
+ file to make the "file" command recognize FIGlet files
+
+o file "figfont.txt" is an implementation-independent specification
+ for FIGlet fonts and control files
+
+o integrated support for extended characters (extended Latin in
+ "standard", Greek in "big", katakana in "banner", Hebrew in new
+ "ivrit" fonts) with appropriate controlfiles
+
+o smushing rule 16 has changed slightly: "/\" now smushes
+ into "|" and "\/" smushes into "Y"; "><" still smushes
+ into "X" and "<>" is still not smushed at all.
+
+o -A option introduced in FIGlet 2.1.2 is now optional;
+ if any words appear on the command line after the options,
+ they are formatted, and the standard input is not read.
+
+These changes were made by John Cowan .
+
+Changes in FIGlet 2.1.2
+------------------------
+
+FIGlet 2.1.2 is a minor revision of FIGlet 2.1.1. The files
+README, FTP-NOTE, figlet.c and figlet.6 have been changed. All other
+files are identical with the 2.1.1 release.
+
+o The only new option is -A, which causes FIGlet to read input
+ from the command line.
+
+These changes were made by Gilbert Healton as Glenn
+Chappell is now busy as a new professor of Mathematics.
+
+Changes in FIGlet 2.1
+----------------------
+
+A number of minor bugs and major incompatibility problems have been
+fixed. FIGlet 2.1 should compile correctly on many operating systems for
+which FIGlet 2.0 did not.
+
+o The "-F" command line option, which used to list all the available
+ fonts, has been removed, since it made FIGlet incompatible with some
+ operating systems. It has been replaced by the "figlist" script. The
+ "showfigfonts" script has been updated so that it no longer requires
+ the "-F" option to be available.
+
+o The FIGlet font file format has been extended to allow an arbitrarily
+ large number of characters. The ISO Latin-1 character set, which
+ includes many accented letters and special symbols, has been added to
+ most standard fonts.
+
+o FIGlet can now print right-to-left. This can be specified on the
+ command line ("-R") or in the font file. Thus, for example, Hebrew and
+ Arabic fonts can be handled more easily.
+
+o FIGlet can now right justify its output. This is the default when
+ right-to-left printing is selected. It can also be specified on the
+ command line ("-r").
+
+o FIGlet now supports "control files". These can be used to change which
+ character FIGlet will print when it sees a certain input character --
+ sort of an expanded version of the "-D" option. For example, a control
+ file could convert lower-case letters to upper-case or map certain
+ ASCII characters to accented letters. Control file names end with the
+ suffix ".flc". Select a control file by using "-C controlfile" on the
+ command line. Several controlfiles can be used at once by giving
+ muliple "-C" options.
+
+o There is now a way for programs that use FIGlet to get various
+ information from FIGlet, for example, what version of FIGlet is being
+ used or the name of the default font directory. This information is
+ gotten through the "-I" option. See the man page for details.
diff --git a/externals/figlet/FAQ b/externals/figlet/FAQ
new file mode 100644
index 0000000000..8e8ca43163
--- /dev/null
+++ b/externals/figlet/FAQ
@@ -0,0 +1,63 @@
+ _____ _____ _____ __ __ _____ _____ _____
+| __| | __| |____| |_ | __| _ | | This FIGlet FAQ is
+| __|- -| | | | - _| _| | __| | | | posted once a month
+|__| |_____|_____|__|____|__| |__| |__|__|__ _| on figlet@figlet.org
+ info@figlet.org http://www.figlet.org/ |__| [FIGlet FAQ v0.91]
+
+===========================================================================
+The latest version of FIGlet is 2.2.5 and can be downloaded from
+ftp://ftp.figlet.org/pub/figlet/program
+===========================================================================
+
+1 What is FIGlet?
+2 Where can I get FIGlet from?
+3 Where can I get more fonts for FIGlet?
+4 Where can I hear about regular FIGlet program and font updates?
+5 How can I contribute?
+6 Why am I getting this mail and can you make it stop?
+7 Where does the name FIGlet come from?
+
+===========================================================================
+
+1. What is FIGlet?
+ FIGlet is a program for making large letters out of ordinary text
+ _ _ _ _ _ _
+ | (_) | _____ | |_| |__ (_)___
+ | | | |/ / _ \ | __| '_ \| / __|
+ | | | < __/ | |_| | | | \__ \
+ |_|_|_|\_\___| \__|_| |_|_|___/
+
+2. Where can I get FIGlet from?
+ From the official FIGlet website at http://www.figlet.org/
+ or from the FIGlet FTP site at ftp://ftp.figlet.org/pub/figlet/
+
+3. Where can I get more fonts for FIGlet?
+ From the FTP site at ftp://ftp.figlet.org/pub/figlet/fonts/
+ There are currently over 400 fonts available for download
+
+4 Where can I hear about regular FIGlet program and font updates?
+ There is a mailing list for FIGlet for general discussions about
+ FIGlet and a place where you can ask questions or share ideas
+ with other FIGlet users. It is also the place where we will publish
+ news about new fonts, new software updates etc.
+
+ To subscribe or unsubscribe from the FIGlet mailing list,
+ please send email to figlet-subscribe@figlet.org or visit the
+ following web page: http://www.figlet.org/mailman/listinfo/figlet
+
+5. How can I contribute?
+ To contribute new fonts, software or information, please contact
+ us at info@figlet.org
+
+6. Why am I getting this mail and can you make it stop?
+ If you received this email it is probably because you are subscribed
+ to the FIGlet mailing list. Please see Question 4 of this FAQ on how
+ to unsubscribe from the FIGlet list.
+
+7. Where does the name FIGlet come from?
+ "Frank, Ian and Glen's letters"
+
+
+= FAQ Maintainer ==========================================================
+Christiaan Keet keet@plig.net July 2005
+===========================================================================
diff --git a/externals/figlet/LICENSE b/externals/figlet/LICENSE
new file mode 100644
index 0000000000..a841aeaa0a
--- /dev/null
+++ b/externals/figlet/LICENSE
@@ -0,0 +1,30 @@
+Copyright (C) 1991, 1993, 1994 Glenn Chappell and Ian Chai
+Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001 John Cowan
+Copyright (C) 2002 Christiaan Keet
+Copyright (C) 2011 Claudio Matsuoka
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+
+1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+3. Neither the name of the copyright holders nor the names of their
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
+TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
+USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/externals/figlet/Makefile b/externals/figlet/Makefile
new file mode 100644
index 0000000000..e92bcaf582
--- /dev/null
+++ b/externals/figlet/Makefile
@@ -0,0 +1,122 @@
+# Makefile for figlet version 2.2.4 (26 Jan 2011)
+# adapted from Makefile for figlet version 2.2.2 (05 July 2005)
+# adapted from Makefile for figlet version 2.2 (15 Oct 1996)
+# Copyright 1993, 1994,1995 Glenn Chappell and Ian Chai
+# Copyright 1996, 1997, 1998, 1999, 2000, 2001 John Cowan
+# Copyright 2002 Christiaan Keet
+# Copyright 2011 Claudio Matsuoka
+
+# Please notice that to follow modern standards and ease third-party
+# package creation, binaries are now installed under BINDIR, and DESTDIR
+# is reserved for the installation pathname prefix.
+#
+# Please make sure BINDIR, MANDIR, DEFAULTFONTDIR and
+# DEFAULTFONTFILE are defined to reflect the situation
+# on your computer. See README for details.
+
+# Don't change this even if your shell is different. The only reason
+# for changing this is if sh is not in the same place.
+SHELL = /bin/sh
+
+# The C compiler and linker to use
+CC = gcc
+CFLAGS = -g -O2 -Wall -Wno-unused-value
+LD = gcc
+LDFLAGS =
+
+# Feature flags:
+# define TLF_FONTS to use TOIlet TLF fonts
+XCFLAGS = -DTLF_FONTS
+
+# Where to install files
+prefix = /usr/local
+
+# Where the executables should be put
+BINDIR = $(prefix)/bin
+
+# Where the man page should be put
+MANDIR = $(prefix)/man
+
+# Where figlet will search first for fonts (the ".flf" files).
+DEFAULTFONTDIR = $(prefix)/share/figlet
+# Use this definition if you can't put things in $(prefix)/share/figlet
+#DEFAULTFONTDIR = fonts
+
+# The filename of the font to be used if no other is specified,
+# without suffix.(standard is recommended, but any other can be
+# used). This font file should reside in the directory specified
+# by DEFAULTFONTDIR.
+DEFAULTFONTFILE = standard
+
+##
+## END OF CONFIGURATION SECTION
+##
+
+VERSION = 2.2.5
+DIST = figlet-$(VERSION)
+OBJS = figlet.o zipio.o crc.o inflate.o utf8.o
+BINS = figlet chkfont figlist showfigfonts
+MANUAL = figlet.6 chkfont.6 figlist.6 showfigfonts.6
+DFILES = Makefile Makefile.tc $(MANUAL) $(OBJS:.o=.c) chkfont.c getopt.c \
+ figlist showfigfonts CHANGES FAQ README LICENSE figfont.txt \
+ crc.h inflate.h zipio.h utf8.h run-tests.sh figmagic
+
+.c.o:
+ $(CC) -c $(CFLAGS) $(XCFLAGS) -DDEFAULTFONTDIR=\"$(DEFAULTFONTDIR)\" \
+ -DDEFAULTFONTFILE=\"$(DEFAULTFONTFILE)\" -o $*.o $<
+
+all: $(BINS)
+
+figlet: $(OBJS)
+ $(LD) $(LDFLAGS) -o $@ $(OBJS)
+
+chkfont: chkfont.o
+ $(LD) $(LDFLAGS) -o $@ chkfont.o
+
+clean:
+ rm -f *.o *~ core figlet chkfont
+
+install: all
+ mkdir -p $(DESTDIR)$(BINDIR)
+ mkdir -p $(DESTDIR)$(MANDIR)/man6
+ mkdir -p $(DESTDIR)$(DEFAULTFONTDIR)
+ cp $(BINS) $(DESTDIR)$(BINDIR)
+ cp $(MANUAL) $(DESTDIR)$(MANDIR)/man6
+ cp fonts/*.flf $(DESTDIR)$(DEFAULTFONTDIR)
+ cp fonts/*.flc $(DESTDIR)$(DEFAULTFONTDIR)
+
+dist:
+ rm -Rf $(DIST) $(DIST).tar.gz
+ mkdir $(DIST)/
+ cp $(DFILES) $(DIST)/
+ mkdir $(DIST)/fonts
+ cp fonts/*.fl[fc] $(DIST)/fonts
+ mkdir $(DIST)/tests
+ cp tests/*txt tests/emboss.tlf $(DIST)/tests
+ tar cvf - $(DIST) | gzip -9c > $(DIST).tar.gz
+ rm -Rf $(DIST)
+ tar xf $(DIST).tar.gz
+ (cd $(DIST); make all check vercheck)
+ @rm -Rf $(DIST)
+ @echo
+ @ls -l $(DIST).tar.gz
+
+check:
+ @echo "Run tests in `pwd`"
+ @./run-tests.sh fonts
+ @echo
+
+vercheck:
+ @printf "Infocode: "; ./figlet -I1
+ @./figlet -v|sed -n '/Version/s/.*\(Version\)/\1/p'
+ @printf "README: "; head -1 < README|sed 's/.*) //'
+ @printf "FAQ: "; grep latest FAQ|sed 's/ and can.*//'
+ @grep -h "^\.TH" *.6
+
+$(OBJS) chkfont.o getopt.o: Makefile
+chkfont.o: chkfont.c
+crc.o: crc.c crc.h
+figlet.o: figlet.c zipio.h
+getopt.o: getopt.c
+inflate.o: inflate.c inflate.h
+zipio.o: zipio.c zipio.h inflate.h crc.h
diff --git a/externals/figlet/Makefile.tc b/externals/figlet/Makefile.tc
new file mode 100644
index 0000000000..435fc580c9
--- /dev/null
+++ b/externals/figlet/Makefile.tc
@@ -0,0 +1,42 @@
+# Turbo C makefile for figlet
+# adapted from Makefile for figlet version 2.3.0 (11 Jan 2011)
+# adapted from Makefile for figlet version 2.2.2 (05 July 2005)
+# adapted from Makefile for figlet version 2.2 (15 Oct 1996)
+# Copyright 1993, 1994,1995 Glenn Chappell and Ian Chai
+# Copyright 1996, 1997, 1998, 1999, 2000, 2001 John Cowan
+# Copyright 2002 Christiaan Keet
+# Copyright 2011 Claudio Matsuoka
+
+# The C compiler and linker to use
+CC = tcc
+CFLAGS = -mc -I\tc\include
+LD = tcc
+LDFLAGS = -mc -L\tc\lib
+
+# Use this definition if you can't put things in /usr/local/share/figlet
+DEFAULTFONTDIR = fonts
+
+# The filename of the font to be used if no other is specified
+# (standard.flf is recommended, but any other can be used).
+# This font file should reside in the directory specified by
+# DEFAULTFONTDIR.
+DEFAULTFONTFILE = standard.flf
+
+##
+## END OF CONFIGURATION SECTION
+##
+
+OBJS = figlet.obj zipio.obj crc.obj inflate.obj getopt.obj
+BINS = figlet.exe chkfont.exe
+
+.c.obj:
+ $(CC) -c $(CFLAGS) -DDEFAULTFONTDIR="$(DEFAULTFONTDIR)" \
+ -DDEFAULTFONTFILE="$(DEFAULTFONTFILE)" -o$*.obj $<
+
+all: $(BINS)
+
+figlet.exe: $(OBJS)
+ $(LD) $(LDFLAGS) -o$@ $(OBJS)
+
+chkfont.exe: chkfont.obj
+ $(LD) $(LDFLAGS) -o$@ chkfont.obj
diff --git a/externals/figlet/README b/externals/figlet/README
new file mode 100644
index 0000000000..f6f2c752d0
--- /dev/null
+++ b/externals/figlet/README
@@ -0,0 +1,242 @@
+About FIGlet (Frank, Ian & Glenn's Letters) release 2.2.5, 31 May 2012
+--------------------------------------------------------------------------
+FIGlet is a program that creates large characters out of ordinary
+screen characters
+ _ _ _ _ _ _
+| (_) | _____ | |_| |__ (_)___
+| | | |/ / _ \ | __| '_ \| / __|
+| | | < __/ | |_| | | | \__ \_
+|_|_|_|\_\___| \__|_| |_|_|___(_)
+
+(This is meant to be viewed in a monospaced font.) FIGlet can create
+characters in many different styles and can kern and "smush" these
+characters together in various ways. FIGlet output is generally
+reminiscent of the sort of "signatures" many people like to put at the
+end of e-mail and UseNet messages.
+
+If you like FIGlet (hey, even if you *hate* FIGlet), please send an
+e-mail message to
+
+The official FIGlet web page: http://www.figlet.org/
+
+Files -- Unix version
+---------------------
+
+README -- This file.
+figlet.c -- The FIGlet source code.
+zipio.h, -- A package for reading ZIP archives
+zipio.c,
+inflate.c,
+crc.c
+utf8.h, -- A package to convert strings between UTF-8 and UCS-4.
+utf8.c
+getopt.c -- Source for the standard "getopt" routine, in case you
+ don't have it in your C library. Not used by default.
+Makefile -- The FIGlet makefile. Used by the make command.
+figlet.6 -- The FIGlet man(ual) page.
+figlist -- Script that lists available fonts and control files.
+showfigfonts -- Script that gives a sample of each available font.
+chkfont.c -- Source code for chkfont: a program that checks FIGlet
+ fonts for formatting errors. You can ignore this file
+ unless you intend to design or edit fonts.
+figfont.txt -- Text file that explains the format of FIGlet fonts.
+ You can ignore this file unless you intend to design
+ or edit fonts.
+fonts -- Directory containing fonts and control files.
+.flf -- All files ending in ".flf" are FIGlet font files.
+.flc -- All files ending in ".flc" are FIGlet control files.
+
+Files -- DOS version
+--------------------
+
+README -- This file
+figlet.exe -- The FIGlet program.
+figlet.man -- The FIGlet man(ual) page.
+showall.bat -- Batch file that lists available fonts and samples of each.
+chkfont.exe -- A program that checks FIGlet fonts for formatting errors.
+ You can ignore this file unless you intend to design
+ or edit fonts.
+figfont.txt -- Text file that explains the format of FIGlet fonts.
+ You can ignore this file unless you intend to design
+ or edit fonts.
+fonts -- Directory containing fonts and control files.
+.flf -- All files ending in ".flf" are FIGlet font files.
+.flc -- All files ending in ".flc" are FIGlet control files.
+
+
+Installing FIGlet --- Unix version
+----------------------------------
+
+First decide in which directories FIGlet and the FIGlet font files
+(the ".flf" files) will be stored (we recommend "/usr/games" and
+"/usr/games/lib/figlet.dir", respectively) and which will be the
+default font (we recommend "standard.flf").
+
+Edit "Makefile", and set the variables DEFAULTFONTDIR and
+DEFAULTFONTFILE to the appropriate values. Set DEFAULTFONTDIR to be
+the full pathname of the directory in which you will keep the FIGlet
+font files. Set DEFAULTFONTFILE to be the filename of the default
+font.
+
+At this point, you have two choices:
+
+(1) Just compile FIGlet. To go this, go into the directory containing
+the FIGlet source, and type "make figlet". Then copy the various files
+to the proper locations. The executable (figlet), along with figlist
+and showfigfonts, goes wherever you keep your executables. The fonts
+(.flf) and control files (.flc) go in the default font
+directory. The man page (figlet.6) goes in section 6 (usually
+/usr/man/man6). If you cannot, or do not want to, install the man page,
+you can probably still read it using
+
+ nroff -man figlet.6 | more
+
+(2) Do a complete installation. To do the this, set the variables
+BINDIR and MANDIR in Makefile to the appropriate values. BINDIR
+should be the full pathname of the directory in which the executable
+files should be put (we recommend "/usr/games"); MANDIR should be the
+full pathname of the directory in which the figlet man page should be
+put, generally "/usr/man/man6". Once DEFAULTFONTDIR, DEFAULTFONTFILE,
+BINDIR and MANDIR have been set, in the directory containing the FIGlet
+source, type "make install".
+
+If space is a problem, the only files you absolutely must have to run
+figlet are "figlet" (the executable) and at least one font (preferably
+the one you chose to be the default font).
+
+Installing FIGlet -- DOS version
+--------------------------------
+
+Unpack the ZIPfile using PKUNZIP, Info-Zip UNZIP, WinUnzip, or any other
+ZIP-compatible program. Be sure to use the -d option with PKUNZIP
+in order to preserve the directory structure. We recommend that you
+unpack the archive into C:\FIGLET, but any directory will do.
+
+If you unpack the archive on top of an older version of FIGlet, be
+sure to delete the file FIGLET.COM. The executable program in this
+release is named FIGLET.EXE. You can keep your old fonts by putting
+them in a FONTS subdirectory before unpacking. (There are upgraded
+versions of the standard fonts in the archive.)
+
+Using FIGlet
+------------
+
+(Note: FIGlet needs a good thorough tutorial. Currently I don't have
+the time to write one, but if anyone wants to do so, go right ahead.
+I'd be glad to help out a little. Write us at if
+you're interested. -GGC-)
+
+At the shell prompt, type "figlet". Then type, say, "Hello, world!"
+and press return. "Hello, world!" in nice, big, designer characters
+should appear on your screen. If you chose standard.flf to be the
+default font, you should see
+ _ _ _ _ _ _ _
+| | | | ___| | | ___ __ _____ _ __| | __| | |
+| |_| |/ _ \ | |/ _ \ \ \ /\ / / _ \| '__| |/ _` | |
+| _ | __/ | | (_) | \ V V / (_) | | | | (_| |_|
+|_| |_|\___|_|_|\___( ) \_/\_/ \___/|_| |_|\__,_(_)
+ |/
+Then type something else, or type an EOF (typically control-D) to quit
+FIGlet.
+
+Now you can send the output of figlet to a file (e.g., "figlet > file")
+and e-mail it to your friends (who will probably say, "Wow! It must
+have taken you hours to put that together!")
+
+To use other fonts, use the "-f" command line option. For example, if
+you had said "figlet -f smslant" above, you would have seen
+ __ __ ____ __ ____
+ / // /__ / / /__ _ _____ ____/ /__/ / /
+ / _ / -_) / / _ \_ | |/|/ / _ \/ __/ / _ /_/
+/_//_/\__/_/_/\___( ) |__,__/\___/_/ /_/\_,_(_)
+ |/
+
+Here are some other useful command line options:
+
+-c center -- centers the output of FIGlet.
+-k tells FIGlet to kern characters without smushing them together.
+-t terminal -- FIGlet asks your terminal how wide it is, and uses
+ this to determine when to break lines. Normally, FIGlet assumes
+ 80 columns so that people with wide terminals won't annoy the
+ people they e-mail FIGlet output to.
+-p paragraph mode -- eliminates some spurious line breaks when piping
+ a multi-line file through FIGlet.
+-v version -- prints information about your copy of FIGlet.
+
+For in-depth explanations of these and other options, see the man page.
+DOS users, see figlet.man.
+
+
+Other Fonts & Mailing List
+--------------------------
+
+A good number of FIGlet fonts have been developed, most of which are
+not included in the standard FIGlet package. Many of these can be
+obtained from http://www.figlet.org/ Some non-Roman fonts are
+available at this site. As of this writing, we have Hebrew, Cyrillic
+(Russian) and Greek.
+
+There are 3 mailing lists available for FIGlet:
+ figlet@figlet.org General discussion of FIGlet
+ figletfonts@figlet.org Announcements about fonts
+ figletsoftware@figlet.org Announcements about software
+ (The last two lists are moderated)
+
+To subscribe or unsubscribe from the FIGlet mailing lists, please visit
+the corresponding URL:
+ http://www.figlet.org/mailman/listinfo/figlet
+ http://www.figlet.org/mailman/listinfo/figletfonts
+ http://www.figlet.org/mailman/listinfo/figletsoftware
+
+Also, for those who maintain archives of figlet fonts, please note that
+all of the standard fonts have been changed, as of release 2.1, to
+include non-ASCII characters. These fonts are the following:
+
+big.flf (also contains Greek)
+banner.flf (also contains Cyrillic and Japanese katakana)
+block.flf
+bubble.flf
+digital.flf
+ivrit.flf (right-to-left, also contains Hebrew)
+lean.flf
+mini.flf
+script.flf
+shadow.flf
+slant.flf
+small.flf
+smscript.flf
+smshadow.flf
+smslant.dld
+standard.flf
+term.flf
+
+The new versions of these fonts can be identified by the words "figlet
+release 2.1" somewhere in the first few lines.
+
+
+Other Stuff
+-----------
+
+FIGlet is available for operating systems other than Unix.
+Please see ftp://ftp.figlet.org/program/
+
+Although you don't have to design your own fonts to use FIGlet, we'd
+certainly like it if lots of people did make up new FIGlet fonts. If
+you feel like giving it a try, see the "FONT FILE FORMAT" section of
+the man page. If you do design a font, please let us know by mailing us
+at
+
+See "Other Things to Try" in the EXAMPLES section of the man page
+for... well... other things to try.
+
+
+Authors
+-------
+
+FIGlet was written mostly by Glenn Chappell . The
+author not being an e-mail fanatic, most correspondence (bug reports, rave
+reviews, etc.) used to be handled to his secretary (who is definitely
+an e-mail fanatic), Ian Chai and has since moved on to
+another FIGlet enthusiast, Christiaan Keet . Current
+maintenance is conducted by Claudio Matsuoka .
+
diff --git a/externals/figlet/chkfont.6 b/externals/figlet/chkfont.6
new file mode 100644
index 0000000000..681d6ad556
--- /dev/null
+++ b/externals/figlet/chkfont.6
@@ -0,0 +1,52 @@
+.\" chkfont
+.\" By Glenn Chappell
+.\"
+.\" This program checks figlet 2.0/2.1 font files for format errors.
+.\" It also looks for signs of common problems and gives warnings.
+.\" chkfont does not modify font files.
+.\"
+.\" Usage: chkfont fontfile ...
+.\"
+.\" Note: This is very much a spare-time project. It's probably
+.\" full o' bugs.
+.\"
+.\" Manual page by Jonathon Abbott, for the Debian Project
+.\" slightly modified by Francesco Tapparo, for the Debian Project
+.TH CHKFONT 6 "31 May 2012" "v2.2.5"
+
+.SH NAME
+chkfont \- checks figlet 2.0 and up font files for format errors
+
+.SH SYNOPSIS
+.B chkfont
+[
+.I fontfile
+]
+
+.SH DESCRIPTION
+This program checks figlet 2.0 and up font files for format errors.
+It also looks for signs of common problems and gives warnings.
+chkfont does not modify font files.
+
+.SH EXAMPLES
+To use
+.B chkfont
+on the "big" font
+.RS
+
+.B example% chkfont /usr/share/figlet/big.flf
+
+.RE
+
+.SH BUGS
+Doesn't work on compressed font files.
+
+.SH AUTHORS
+chkfont was written by Glenn Chappell
+
+This manual page was written by Jonathon Abbott for the Debian Project.
+
+.SH "SEE ALSO"
+.BR figlet (6),
+.BR showfigfonts (6),
+.BR figlist (6)
diff --git a/externals/figlet/chkfont.c b/externals/figlet/chkfont.c
new file mode 100644
index 0000000000..63bf381b31
--- /dev/null
+++ b/externals/figlet/chkfont.c
@@ -0,0 +1,476 @@
+#include
+#include
+#include
+#ifdef __STDC__
+#include
+#endif
+
+#define DATE "20 Feb 1996"
+#define VERSION "2.2"
+
+/*
+ chkfont
+ By Glenn Chappell
+
+ This program checks figlet 2.0/2.1 font files for format errors.
+ It also looks for signs of common problems and gives warnings.
+ chkfont does not modify font files.
+
+ Usage: chkfont fontfile ...
+
+ Note: This is very much a spare-time project. It's probably
+ full o' bugs ....
+*/
+
+/* #define CHECKBLANKS */
+#define FONTFILESUFFIX ".flf"
+#define FONTFILEMAGICNUMBER "flf2"
+char posshardblanks[9] = { '!', '@', '#', '$', '%', '&', '*', 0x7f, 0 };
+
+char *myname,*fontfilename;
+FILE *fontfile;
+char hardblank;
+int charheight,upheight,maxlen=0,old_layout;
+int spectagcnt;
+char *fileline;
+int maxlinelength=0,currline;
+int ec,wc;
+
+int incon_endmarkwarn,endmark_countwarn,nonincrwarn;
+int bigcodetagwarn,deutschcodetagwarn,asciicodetagwarn;
+int codetagcnt;
+int gone;
+
+void weregone(really)
+int really;
+{
+if (!really && 2*ec+wc<=40) {
+ return;
+ }
+if (ec+wc>0) printf("*******************************************************************************\n");
+if (!really) {
+ printf("%s: Too many errors/warnings.\n",fontfilename);
+ }
+printf("%s: Errors: %d, Warnings: %d\n",fontfilename,ec,wc);
+if (currline>1 && maxlen!=maxlinelength) {
+ printf("%s: maxlen: %d, actual max line length: %d\n",
+ fontfilename,maxlen,maxlinelength);
+ if (codetagcnt>0 && spectagcnt==-1) {
+ printf("%s: Code-tagged characters: %d\n",fontfilename,codetagcnt);
+ }
+ }
+printf("-------------------------------------------------------------------------------\n");
+gone=1;
+}
+
+char *my_alloc(size)
+int size;
+{
+char *ptr;
+
+ptr=(char *)malloc(size);
+if (ptr==NULL) {
+ fprintf(stderr,"%s: Out of memory\n",myname);
+ exit(1);
+ }
+return(ptr);
+}
+
+int badsuffix(path,suffix)
+char *path;
+char *suffix;
+{
+ char ucsuffix[10];
+ char *s;
+
+ strcpy(ucsuffix,suffix);
+ for (s = ucsuffix; *s; s++) {
+ *s = toupper(*s);
+ }
+
+ if (strlen(path)\n");
+fprintf(stderr,"Version: %s, date: %s\n",VERSION,DATE);
+fprintf(stderr,"Checks figlet 2.0/2.1 font files for format errors.\n");
+fprintf(stderr,"(Does not modify font files.)\n");
+fprintf(stderr,"Usage: %s fontfile ...\n",myname);
+exit(1);
+}
+
+void readchar()
+{
+int i,expected_width,k,len,newlen,diff,l;
+char endmark,expected_endmark;
+int leadblanks,minleadblanks,trailblanks,mintrailblanks;
+char *ret;
+
+expected_width = expected_endmark = 0; /* prevent compiler warning */
+for (i=0;imaxlinelength) {
+ maxlinelength=len;
+ }
+ if (len>maxlen) {
+ printf("%s: ERROR- Line length > maxlen in line %d.\n",
+ fontfilename,currline);
+ ec++;
+ weregone(0); if (gone) return;
+ }
+ k=len;
+ endmark=k<0?'\0':(k==0||fileline[k]!='\n')?fileline[k]:fileline[k-1];
+ for(;k>=0?(fileline[k]=='\n' || fileline[k]==endmark):0;k--) {
+ fileline[k]='\0';
+ }
+ newlen=strlen(fileline);
+ for (l=0;l=0 ? fileline[l]==' ' : 0;l--) ;
+ trailblanks = newlen-1-l;
+ if (i==0) {
+ expected_endmark = endmark;
+ expected_width = newlen;
+ minleadblanks = leadblanks;
+ mintrailblanks = trailblanks;
+ if (endmark==' ') {
+ printf("%s: Warning- Blank endmark in line %d.\n",
+ fontfilename,currline);
+ wc++;
+ weregone(0); if (gone) return;
+ }
+ }
+ else {
+ if (leadblanks2) {
+ printf("%s: ERROR- Too many endmarks in line %d.\n",
+ fontfilename,currline);
+ ec++;
+ weregone(0); if (gone) return;
+ }
+ else if (charheight>1 && (diff!=(i==charheight-1)+1)) {
+ if (!endmark_countwarn) {
+ printf("%s: Warning- Endchar count convention violated in line %d.\n",
+ fontfilename,currline);
+ printf("%s: (Above warning will only be printed once.)\n",
+ fontfilename);
+ endmark_countwarn = 1;
+ wc++;
+ weregone(0); if (gone) return;
+ }
+ }
+ }
+#ifdef CHECKBLANKS
+if (minleadblanks+mintrailblanks>0 && old_layout>=0) {
+ printf("%s: Warning- Leading/trailing blanks in char. ending at line %d.\n",
+ fontfilename,currline);
+ printf("%s: (Above warning only given when old_layout > -1.)\n",
+ fontfilename);
+ wc++;
+ weregone(0); if (gone) return;
+ }
+#endif /* #ifdef CHECKBLANKS */
+}
+
+
+void checkit()
+{
+int i,k,cmtcount,numsread,ffrighttoleft,have_layout,layout;
+char magicnum[5],cha;
+long oldord,theord;
+int tmpcnt,len;
+
+ec=0;wc=0;
+incon_endmarkwarn=0; endmark_countwarn=0; nonincrwarn=0;
+bigcodetagwarn=0; deutschcodetagwarn=0;
+asciicodetagwarn=0;
+codetagcnt=0;
+gone=0;
+if (!strcmp(fontfilename,"-")) {
+ fontfilename="(stdin)";
+ fontfile=stdin;
+ }
+else {
+ fontfile=fopen(fontfilename,"r");
+ if (fontfile == NULL) {
+ fprintf(stderr,"%s: Could not open file '%s'\n",myname,fontfilename);
+ exit(1);
+ }
+ }
+
+if (fontfile!=stdin) {
+ if (badsuffix(fontfilename,FONTFILESUFFIX)) {
+ printf("%s: ERROR- Filename does not end with '%s'.\n",
+ fontfilename,FONTFILESUFFIX);
+ ec++;
+ weregone(0); if (gone) return;
+ }
+ }
+numsread=fscanf(fontfile,"%4s",magicnum);
+if (numsread == EOF) {
+ printf("%s: ERROR- can't read magic number.\n",fontfilename);
+ ec++;
+ weregone(0); if (gone) return;
+ }
+if (strcmp(magicnum,FONTFILEMAGICNUMBER)) {
+ printf("%s: ERROR- Incorrect magic number.\n",fontfilename);
+ ec++;
+ weregone(0); if (gone) return;
+ }
+cha=getc(fontfile);
+if (cha!='a') {
+ printf("%s: Warning- Sub-version character is not 'a'.\n",fontfilename);
+ wc++;
+ weregone(0); if (gone) return;
+ }
+fileline=(char*)my_alloc(sizeof(char)*(1001));
+if (fgets(fileline,1001,fontfile)==NULL) {
+ fileline[0] = '\0';
+ }
+if (strlen(fileline)>0 ? fileline[strlen(fileline)-1]!='\n' : 0) {
+ while(k=getc(fontfile),k!='\n'&&k!=EOF) ; /* Advance to end of line */
+ }
+numsread=sscanf(fileline,"%c %d %d %d %d %d %d %d %d",
+ &hardblank,&charheight,&upheight,&maxlen,&old_layout,&cmtcount,
+ &ffrighttoleft,&layout,&spectagcnt);
+free(fileline);
+fileline = NULL;
+if (numsread<7) {
+ ffrighttoleft=0;
+ }
+if (numsread<9) {
+ spectagcnt=-1;
+ }
+have_layout = (numsread>=8);
+if (6>numsread) {
+ printf("%s: ERROR (fatal)- First line improperly formatted.\n",fontfilename);
+ ec++;
+ weregone(1); if (gone) return;
+ }
+if (!strchr(posshardblanks,hardblank)) {
+ printf("%s: Warning- Unusual hardblank.\n",fontfilename);
+ wc++;
+ weregone(0); if (gone) return;
+ }
+if (charheight<1) {
+ printf("%s: ERROR (fatal)- charheight not positive.\n",fontfilename);
+ ec++;
+ weregone(1); if (gone) return;
+ }
+if (upheight>charheight || upheight<1) {
+ printf("%s: ERROR- up_height out of bounds.\n",fontfilename);
+ ec++;
+ weregone(0); if (gone) return;
+ }
+if (maxlen<1) {
+ printf("%s: ERROR (fatal)- maxlen not positive.\n",fontfilename);
+ ec++;
+ weregone(1); if (gone) return;
+ }
+if (old_layout<-1) {
+ printf("%s: ERROR- old_layout < -1.\n",fontfilename);
+ ec++;
+ weregone(0); if (gone) return;
+ }
+if (old_layout>63) {
+ printf("%s: ERROR- old_layout > 63.\n",fontfilename);
+ ec++;
+ weregone(0); if (gone) return;
+ }
+if (have_layout && layout<0) {
+ printf("%s: ERROR- layout < 0.\n", fontfilename);
+ ec++;
+ weregone(0); if (gone) return;
+ }
+if (have_layout &&layout>32767) {
+ printf("%s: ERROR- layout > 32767.\n", fontfilename);
+ ec++;
+ weregone(0); if (gone) return;
+ }
+if (have_layout && old_layout == -1 && (layout & 192)) {
+ printf("%s: ERROR- layout %d is inconsistent with old_layout -1.\n",
+ fontfilename,layout);
+ ec++;
+ weregone(0); if (gone) return;
+ }
+if (have_layout && old_layout == 0 && (layout & 192) != 64 &&
+ (layout & 255) != 128) {
+ printf("%s: ERROR- layout %d is inconsistent with old_layout 0.\n",
+ fontfilename,layout);
+ ec++;
+ weregone(0); if (gone) return;
+ }
+if (have_layout && old_layout > 0 &&
+ (!(layout & 128) || old_layout != (layout & 63))) {
+ printf("%s: ERROR- layout %d is inconsistent with old_layout %d.\n",
+ fontfilename,layout,old_layout);
+ ec++;
+ weregone(0); if (gone) return;
+ }
+if (cmtcount<0) {
+ printf("%s: ERROR- cmt_count is negative.\n",fontfilename);
+ ec++;
+ weregone(0); if (gone) return;
+ }
+if (ffrighttoleft<0 || ffrighttoleft>1) {
+ printf("%s: ERROR- rtol out of bounds.\n",fontfilename);
+ ec++;
+ weregone(0); if (gone) return;
+ }
+
+for (i=1;i<=cmtcount;i++) {
+ while(k=getc(fontfile),k!='\n'&&k!=EOF) ; /* Advance to end of line */
+ }
+
+maxlinelength = 0;
+currline=cmtcount+1;
+fileline=(char*)my_alloc(sizeof(char)*(maxlen+1001));
+for (i=0;i<102;i++) {
+ readchar();
+ if (gone) return;
+ }
+
+oldord=0;
+while(fgets(fileline,maxlen+1000,fontfile)!=NULL) {
+ currline++;
+ len=strlen(fileline)-1;
+ if (len-100>maxlinelength) {
+ maxlinelength=len-100;
+ }
+ if (len>maxlen+100) {
+ printf("%s: ERROR- Code tag line way too long in line %d.\n",
+ fontfilename,currline);
+ ec++;
+ weregone(0); if (gone) return;
+ }
+ tmpcnt=sscanf(fileline,"%li",&theord);
+ if (tmpcnt<1) {
+ printf("%s: Warning- Extra chars after font in line %d.\n",
+ fontfilename,currline);
+ wc++;
+ weregone(0); if (gone) return;
+ break;
+ }
+ codetagcnt++;
+ if (theord>65535 && !bigcodetagwarn) {
+ printf("%s: Warning- Code tag > 65535 in line %d.\n",
+ fontfilename,currline);
+ printf("%s: (Above warning will only be printed once.)\n",
+ fontfilename);
+ bigcodetagwarn = 1;
+ wc++;
+ weregone(0); if (gone) return;
+ }
+ if (theord==-1) {
+ printf("%s: ERROR- Code tag -1 (unusable) in line %d.\n",
+ fontfilename,currline);
+ ec++;
+ weregone(0); if (gone) return;
+ break;
+ }
+ if (theord>=-255 && theord<=-249 &&!deutschcodetagwarn) {
+ printf("%s: Warning- Code tag in old Deutsch area in line %d.\n",
+ fontfilename,currline);
+ printf("%s: (Above warning will only be printed once.)\n",
+ fontfilename);
+ deutschcodetagwarn = 1;
+ wc++;
+ weregone(0); if (gone) return;
+ }
+ if (theord<127 && theord>31 && !asciicodetagwarn) {
+ printf("%s: Warning- Code tag in ASCII range in line %d.\n",
+ fontfilename,currline);
+ printf("%s: (Above warning will only be printed once.)\n",
+ fontfilename);
+ asciicodetagwarn = 1;
+ wc++;
+ weregone(0); if (gone) return;
+ }
+ else if (theord<=oldord && theord>=0 && oldord>=0 && !nonincrwarn) {
+ printf("%s: Warning- Non-increasing code tag in line %d.\n",
+ fontfilename,currline);
+ printf("%s: (Above warning will only be printed once.)\n",
+ fontfilename);
+ nonincrwarn = 1;
+ wc++;
+ weregone(0); if (gone) return;
+ }
+ oldord=theord;
+ readchar();
+ if (gone) return;
+ }
+
+if (spectagcnt!=-1 && spectagcnt!=codetagcnt) {
+ printf("%s: ERROR- Inconsistent Codetag_Cnt value %d\n",
+ fontfilename, spectagcnt);
+ ec++;
+ weregone(0); if (gone) return;
+ }
+
+if (fontfile!=stdin) fclose(fontfile);
+
+weregone(1); if (gone) return;
+}
+
+
+int main(argc,argv)
+int argc;
+char *argv[];
+{
+int arg;
+
+if ((myname=strrchr(argv[0],'/'))!=NULL) {
+ myname++;
+ }
+else {
+ myname = argv[0];
+ }
+if (argc<2) {
+ usageerr();
+ }
+for (arg=1;arg> 8);
+ }
+
+ return crc;
+}
diff --git a/externals/figlet/crc.h b/externals/figlet/crc.h
new file mode 100644
index 0000000000..bd7c5361f8
--- /dev/null
+++ b/externals/figlet/crc.h
@@ -0,0 +1,62 @@
+/*
+ * crc.h - CRC calculation routine
+ *
+ * Version 1.0.1
+ */
+
+/*
+ * Copyright (C) 1995, Edward B. Hamrick
+ *
+ * Permission to use, copy, modify, and distribute this software and
+ * its documentation for any purpose and without fee is hereby granted,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear in
+ * supporting documentation, and that the name of the copyright holders
+ * not be used in advertising or publicity pertaining to distribution of
+ * the software without specific, written prior permission. The copyright
+ * holders makes no representations about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ *
+ * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS
+ * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS,
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT
+ * OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
+ * USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
+ * OF THIS SOFTWARE.
+ */
+
+/*
+ * Changes from 1.0 to 1.0.1:
+ * Relicensed under the MIT license, with consent of the copyright holders.
+ * Claudio Matsuoka (Jan 11 2011)
+ */
+
+/*
+ * This CRC algorithm is the same as that used in zip. Normally it
+ * should be initialized with 0xffffffff, and the final CRC stored
+ * should be crc ^ 0xffffffff.
+ *
+ * It implements the polynomial:
+ *
+ * x^32+x^26+x^23+x^22+x^16+x^12+x^11+x^10+x^8+x^7+x^5+x^4+x^2+x+1
+ */
+
+#ifndef __CRC_H
+#define __CRC_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+unsigned long CrcUpdate( /* returns updated crc */
+ unsigned long crc, /* starting crc */
+ unsigned char *buffer, /* buffer to use to update crc */
+ long length /* length of buffer */
+);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/externals/figlet/figfont.txt b/externals/figlet/figfont.txt
new file mode 100644
index 0000000000..8cbe6ea7b5
--- /dev/null
+++ b/externals/figlet/figfont.txt
@@ -0,0 +1,1695 @@
+ _____ ___ ____ __ _
+ | ___||_ _|/ ___| / _| ___ _ __ | |_ ___ _
+ | |_ | || | _ | |_ / _ \ | '_ \ | __|/ __|(_)
+ | _| | || |_| || _|| (_) || | | || |_ \__ \ _
+ |_| |___|\____||_| \___/ |_| |_| \__||___/(_)
+
+ The FIGfont Version 2 FIGfont and FIGdriver Standard
+ === ======= ======= = ======= === ========= ========
+ Draft 2.0 Copyright 1996, 1997
+ by John Cowan and Paul Burton
+ Portions Copyright 1991, 1993, 1994
+ by Glenn Chappell and Ian Chai
+ May be freely copied and distributed.
+
+ Figlet lives at: http://www.figlet.org/
+
+ _____ __ __
+ / ___/__ ___ / /____ ___ / /____
+/ /__/ _ \/ _ \/ __/ -_) _ \/ __(_-<
+\___/\___/_//_/\__/\__/_//_/\__/___/
+
+ INTRODUCTION
+ BASIC DEFINITIONS AND CONCEPTS
+ "FIGfont"
+ "FIGcharacters" and "Sub-characters"
+ "FIGdriver"
+ "FIGure"
+ "FIG"
+ "Layout Modes"
+ "Smushing Rules"
+ "Hardblanks"
+ CREATING FIGFONTS
+ The Header Line
+ Interpretation of Layout Parameters
+ Setting Layout Parameters Step-by-Step
+ FIGfont Comments
+ FIGcharacter Data
+ - Basic Data Structure
+ - Character Codes
+ - Required FIGcharacters
+ - Code Tagged FIGcharacters
+ NOTES - AVOIDING ERRORS AND GENERAL ADVICE
+ CONTROL FILES
+ Standard Format
+ Extended Commands
+ STANDARDIZED CAPABILITIES OF CURRENT AND FUTURE FIGDRIVERS
+ CHART OF CAPABILITIES OF FIGLET 2.2.2 AND FIGWIN 1.0
+
+
+INTRODUCTION
+============
+
+This document specifies the format of font files, and the associated control
+files, used by the FIGlet and FIGWin programs (FIGdrivers). It is written
+for designers who wish to build fonts (FIGfonts) usable by either program,
+and also serves as a standard for development of future versions or similar
+FIGdrivers. Some features explained here are not supported by both programs.
+See separate documentation to learn how to use FIGlet or FIGWin.
+
+NOTE: FIGWin 1.0 is packaged with a program called FIGfont Editor for Windows
+1.0, which is just that. It does not require a complete understanding of
+this document to create FIGfonts. However it is a good idea to become
+familiar with the "BASIC DEFINITIONS AND CONCEPTS" information before using
+it.
+
+If you design a FIGfont, please send an e-mail announcement to
+, the FIGlet fonts mailing list, and email a copy
+to info@figlet.org for us to put it on the ftp site (ftp://ftp.figlet.org/)
+
+BASIC DEFINITIONS AND CONCEPTS
+===== =========== === ========
+
+"FIGfont"
+
+A FIGfont is a file which represents the graphical arrangement of characters
+representing larger characters. Since a FIGfont file is a text file, it can
+be created with any text editing program on any platform. The filename of a
+FIGfont file must end with ".flf", which stands for "IGettering
+ont".
+
+
+"FIGcharacters" and "Sub-characters"
+
+Because FIGfonts describe large characters which consist of smaller
+characters, confusion can result when descussing one or the other.
+Therefore, the terms "FIGcharacter" and "sub-character" are used,
+respectively.
+
+
+"FIGdriver"
+
+The term FIGdriver is used in this document to encompass FIGlet, FIGWin, and
+any future programs which use FIGfonts.
+
+
+"FIGure"
+
+A FIGure (thusly capitalized) is an image created by a FIGdriver.
+
+
+"FIG"
+
+A bit of history:
+
+In Spring 1991, inspired by the Email signature of a friend named Frank, and
+goaded on by Ian Chai, Glenn Chappell wrote a nifty little 170-line "C"
+program called "newban", which would create large letters out of ordinary
+text characters. At the time, it was only compiled for UNIX. In hindsight,
+we now call it "FIGlet 1.0". FIGlet stands for rank, an, and lenn's
+ters. In various incarnations, newban circulated around the net for a
+couple of years. It had one font, which included only lowercase letters.
+
+In early 1993, Ian decided newban was due for a few changes, so together Ian
+and Glenn added the full ASCII character set, to start with. First, though,
+Ian had to find a copy of the source, since Glenn had tossed it away as not
+worth the disk space. Ian and Glenn discussed what could be done with it,
+decided on a general re-write, and, 7 months later, ended up with 888 lines
+of code, 13 FIGfonts and documentation. This was FIGlet 2.0, the first real
+release.
+
+To their great surprise, FIGlet took the net by storm. They received floods
+of "FIGlet is great!" messages and a new contributed FIGfont about once a
+week. To handle all the traffic, Ian quickly set up a mailing list, Daniel
+Simmons kindly offered space for an FTP site, several people volunteered to
+port FIGlet to non-Unix operating systems, ...and bug reports poured in.
+
+Because of these, and the need to make FIGlet more "international", Ian and
+Glenn released a new version of FIGlet which could handle non-ASCII character
+sets and right-to-left printing. This was FIGlet 2.1, which, in a couple of
+weeks, became figlet 2.1.1. This weighed in at 1314 lines, and there were
+over 60 FIGfonts.
+
+By late 1996, FIGlet had quite a following of fans subscribing to its mailing
+list. It had been ported to MS-DOS, Macintosh, Amiga, Apple II GS, Atari ST,
+Acorn and OS/2. FIGlet had been further updated, and there were nearly 200
+FIGfonts.
+
+John Cowan and Paul Burton are two FIGlet fans who decided to create new
+versions. While John wrote FIGlet version 2.2 using C, Paul wrote FIGWin
+1.0, the first true GUI (Windows) implementation of FIGlet, using Visual
+Basic. John and Paul worked together to add new features to FIGfont files
+which could be read by both programs, and together wrote this document, which
+we hope helps to establish consistency in FIGfonts and help with the creation
+of future FIGdrivers. FIGlet 2.2 has about 4800 lines of code, of which
+over half is a support library for reading compressed files.
+
+Three years later, in July 2005, FIGlet 2.2.2 was released under a new License
+(the ``Academic Free License 2.1''). This version has proved to be very
+stable, and persisted for more five years until minor bugfixes and another
+license change resulted in the release of FIGlet 2.2.3 in January 2011. All
+license concerns involving contributed code were solved and FIGlet is now
+distributed under the ``New BSD License''. Contributed fonts amounted to more
+than 400.
+
+FIGlet 2.2 and FIGWin 1.0 both allow greater flexibility by use of new
+information which can be contained in FIGfont files without interfering with
+the function of older FIGdrivers.
+
+NOTE: The Macintosh version of FIGlet is still command-line driven as of this
+writing, and a GUI version is very much in demand. The FIGlet C code is
+written to be easily plugged in to a GUI shell, so it will be a relatively
+easy task for a Macintosh developer.
+
+
+
+
+"Layout Modes"
+
+A FIGdriver may arrange FIGcharacters using one of three "layout modes",
+which define the spacing between FIGcharacters. The layout mode for the
+horizontal axis may differ from the layout mode for the vertical axis. A
+default choice is defined for each axis by every FIGfont.
+
+The three layout modes are:
+
+ Full Size (Separately called "Full Width" or "Full Height".)
+
+ Represents each FIGcharacter occupying the full width or
+ height of its arrangement of sub-characters as designed.
+
+ Fitting Only (Separately called "Kerning or "Vertical Fitting".)
+
+ Moves FIGcharacters closer together until they touch.
+ Typographers use the term "kerning" for this phenomenon
+ when applied to the horizontal axis, but fitting also
+ includes this as a vertical behavior, for which there is
+ apparently no established typographical term.
+
+ Smushing (Same term for both axes.)
+
+ Moves FIGcharacters one step closer after they touch, so that
+ they partially occupy the same space. A FIGdriver must decide
+ what sub-character to display at each junction. There are two
+ ways of making these decisions: by controlled smushing or by
+ universal smushing.
+
+ Controlled smushing uses a set of "smushing rules" selected by
+ the designer of a FIGfont. (See "Smushing Rules" below.)
+ Each rule is a comparison of the two sub-characters which must
+ be joined to yield what to display at the junction.
+ Controlled smushing will not always allow smushing to occur,
+ because the compared sub-characters may not correspond to any
+ active rule. Wherever smushing cannot occur, fitting occurs
+ instead.
+
+ Universal smushing simply overrides the sub-character from the
+ earlier FIGcharacter with the sub-character from the later
+ FIGcharacter. This produces an "overlapping" effect with some
+ FIGfonts, wherin the latter FIGcharacter may appear to be "in
+ front".
+
+ A FIGfont which does not specify any smushing rules for a
+ particular axis indicates that universal smushing is to occur
+ when smushing is requested. Therefore, it is not possible for
+ a FIGfont designer to "forbid" smushing. However there are
+ ways to ensure that smushing does not cause a FIGfont to be
+ illegible when smushed. This is especially important for
+ smaller FIGfonts. (See "Hardblanks" for details.)
+
+For vertical fitting or smushing, entire lines of output FIGcharacters are
+"moved" as a unit.
+
+Not all FIGdrivers do vertical fitting or smushing. At present, FIGWin 1.0
+does, but FIGlet 2.2 does not. Further, while FIGlet 2.2 allows the user to
+override the FIGfont designer's set of smushing rules, FIGWin 1.0 does not.
+
+NOTE: In the documentation of FIGlet versions prior to 2.2, the term
+"smushmode" was used to mean the layout mode, and this term further included
+the smushing rules (if any) to be applied. However, since the layout mode
+may or may not involve smushing, we are straying from the use of this
+somewhat misleading term.
+
+
+"Smushing Rules"
+
+Again, smushing rules are for controlled smushing. If none are defined to be
+active in a FIGfont, universal smushing occurs instead.
+
+Generally, if a FIGfont is "drawn at the borders" using sub-characters
+"-_|/\[]{}()<>", you will want to use controlled smushing by selecting from
+the rules below. Otherwise, if your FIGfont uses a lot of other
+sub-characters, do not select any rules and universal smushing will occur
+instead. (See "Hardblanks" below if your FIGfont is very small and would
+become illegible if smushed.) Experimentation is the best way to make these
+decisions.
+
+There are six possible horizontal smushing rules and five possible vertical
+smushing rules. Below is a description of all of the rules.
+
+NOTE: Ignore the "code values" for now. They are explained later.
+
+ The Six Horizontal Smushing Rules
+
+ Rule 1: EQUAL CHARACTER SMUSHING (code value 1)
+
+ Two sub-characters are smushed into a single sub-character
+ if they are the same. This rule does not smush
+ hardblanks. (See "Hardblanks" below.)
+
+ Rule 2: UNDERSCORE SMUSHING (code value 2)
+
+ An underscore ("_") will be replaced by any of: "|", "/",
+ "\", "[", "]", "{", "}", "(", ")", "<" or ">".
+
+ Rule 3: HIERARCHY SMUSHING (code value 4)
+
+ A hierarchy of six classes is used: "|", "/\", "[]", "{}",
+ "()", and "<>". When two smushing sub-characters are
+ from different classes, the one from the latter class
+ will be used.
+
+ Rule 4: OPPOSITE PAIR SMUSHING (code value 8)
+
+ Smushes opposing brackets ("[]" or "]["), braces ("{}" or
+ "}{") and parentheses ("()" or ")(") together, replacing
+ any such pair with a vertical bar ("|").
+
+ Rule 5: BIG X SMUSHING (code value 16)
+
+ Smushes "/\" into "|", "\/" into "Y", and "><" into "X".
+ Note that "<>" is not smushed in any way by this rule.
+ The name "BIG X" is historical; originally all three pairs
+ were smushed into "X".
+
+ Rule 6: HARDBLANK SMUSHING (code value 32)
+
+ Smushes two hardblanks together, replacing them with a
+ single hardblank. (See "Hardblanks" below.)
+
+
+ The Five Vertical Smushing Rules
+
+ Rule 1: EQUAL CHARACTER SMUSHING (code value 256)
+
+ Same as horizontal smushing rule 1.
+
+ Rule 2: UNDERSCORE SMUSHING (code value 512)
+
+ Same as horizontal smushing rule 2.
+
+ Rule 3: HIERARCHY SMUSHING (code value 1024)
+
+ Same as horizontal smushing rule 3.
+
+ Rule 4: HORIZONTAL LINE SMUSHING (code value 2048)
+
+ Smushes stacked pairs of "-" and "_", replacing them with
+ a single "=" sub-character. It does not matter which is
+ found above the other. Note that vertical smushing rule 1
+ will smush IDENTICAL pairs of horizontal lines, while this
+ rule smushes horizontal lines consisting of DIFFERENT
+ sub-characters.
+
+ Rule 5: VERTICAL LINE SUPERSMUSHING (code value 4096)
+
+ This one rule is different from all others, in that it
+ "supersmushes" vertical lines consisting of several
+ vertical bars ("|"). This creates the illusion that
+ FIGcharacters have slid vertically against each other.
+ Supersmushing continues until any sub-characters other
+ than "|" would have to be smushed. Supersmushing can
+ produce impressive results, but it is seldom possible,
+ since other sub-characters would usually have to be
+ considered for smushing as soon as any such stacked
+ vertical lines are encountered.
+
+
+"Hardblanks"
+
+A hardblank is a special sub-character which is displayed as a blank (space)
+in rendered FIGures, but is treated more like a "visible" sub-character when
+fitting or smushing horizontally. Therefore, hardblanks keep adjacent
+FIGcharacters a certain distance apart.
+
+NOTE: Hardblanks act the same as blanks for vertical operations.
+
+Hardblanks have three purposes:
+
+ 1) Hardblanks are used to create the blank (space) FIGcharacter.
+
+ Usually the space FIGcharacter is simply one or two vertical
+ columns of hardblanks. Some slanted FIGfonts as shown below
+ have a diagonal arrangement of hardblanks instead.
+
+ 2) Hardblanks can prevent "unreasonable" fitting or smushing.
+
+ Normally when fitting or smushing, the blank (space)
+ sub-character is considered "vacant space". In the following
+ example, a capital "C" FIGcharacter is smushed with a "minus"
+ FIGcharacter.
+ ______ ______
+ / ____/ / ____/
+ / / ____ >>-Becomes-> / / ____
+ / /___ /___/ / /__/___/
+ \____/ \____/
+
+ The FIGure above looks like a capital G. To prevent this, a
+ FIGfont designer might place a hardblank in the center of the
+ capital C. In the following example, the hardblank is
+ represented as a "$":
+ ______ ______
+ / ____/ / ____/
+ / / $ ____ >>-Becomes-> / / ____
+ / /___ /___/ / /___/___/
+ \____/ \____/
+
+ Using hardblanks in this manner ensures that FIGcharacters
+ with a lot of empty space will not be unreasonably "invaded"
+ by adjacent FIGcharacters. Generally, FIGcharacters such as
+ capital C, L or T, or small punctuation marks such as commas,
+ may contain hardblanks, since they may contain a lot of vacant
+ space which is "accessible" from either side.
+
+ 3) Hardblanks can prevent smushing from making FIGfonts illegible.
+
+ This legitimate purpose of hardblanks is often overused. If a
+ FIGfont designer is absolutely sure that smushing "visible"
+ sub-characters would make their FIGfont illegible, hardblanks
+ may be positioned at the end of each row of sub-characters,
+ against the visible sub-characters, creating a barrier.
+
+ With older FIGdrivers, using hardblanks for this purpose meant
+ that FIGcharacters would have to be separated by at least one
+ blank in output FIGures, since only a hardblank could smush
+ with another hardblank. However with the advent of universal
+ smushing, this is no longer necessary. Hardblanks ARE
+ overriden by any visible sub-character when performing
+ universal smushing. Hardblanks still represent a "stopping
+ point", but only AFTER their locations are occupied.
+
+ NOTE: Earlier it was stated that universal smushing overrides
+ the sub-character from the former FIGcharacter with the
+ sub-character from the latter FIGcharacter. Hardblanks (and
+ blanks or spaces) are the exception to this rule; they will
+ always be overriden by visible sub-characters, regardless of
+ which FIGcharacter contains the hardblank. This ensures that
+ no visible sub-characters "disappear".
+
+ Therefore, one can design a FIGfont with a default behavior of
+ universal smushing, while the output FIGure would LOOK like
+ the effect of fitting, or even full size if additional
+ hardblanks are used. If a user "scales down" the layout mode
+ to fitting, the result would look like "extra spacing" between
+ FIGcharacters.
+
+ Taking this concept further, a FIGcharacter may also include
+ extra blanks (spaces) on the left side of each FIGcharacter,
+ which would define the FIGcharacter's width as slightly larger
+ than required for the visible sub-characters and hardblanks.
+ With such a FIGfont, a user who further "scales down" the
+ layout mode to full size would see even greater spacing.
+
+ These techniques prevent horizontal smushing from causing a
+ FIGfont to become illegible, while offering greater
+ flexibility of output to users.
+
+ NOTE: These techniques cannot be used to prevent vertical
+ smushing of visible sub-characters, since hardblanks are not
+ respected in the vertical axis. Although it is possible to
+ select only one vertical smushing rule which involves only
+ sub-characters which are not used in your FIGfont, it is
+ recommend that you do NOT do so. In our opinion, most users
+ would prefer to get what they ask for, rather than being
+ told, in effect: "I, the FIGfont designer, have decided that
+ you wouldn't like the results of vertical smushing, so I have
+ prevented you from trying it." Instead, we recommend setting
+ the default behavior to either fitting or full height, and
+ either allowing universal smushing, or selecting vertical
+ smushing rules which seem most appropriate. A user of your
+ FIGfont will quickly see why you did not choose smushing as
+ the default vertical layout mode, and will agree with you.
+
+
+"Character Sets" and "Character Codes"
+
+When you type using your keyboard, you are actually sending your computer a
+series of numbers. Each number must be interpreted by your computer so that
+it knows what character to display. The computer uses a list of definitions,
+called a "character set". The numbers which represent each character are
+ called "character codes".
+
+There are many character sets, most of which are internationally accepted as
+standards. By far, the most common character set is ASCII, which stands for
+"American Standard Code for Information Interchange". ASCII identifies its
+characters with codes ranging from 0 to 127.
+
+NOTE: The term "ASCII art" has become well-understood to mean artistic images
+which consist of characters on your screen (such as FIGures).
+
+For a list of the printable ASCII characters with the corresponding codes,
+see the section "REQUIRED CHARACTERS" below. The other ASCII codes in the
+range of 0 through 31 are "control characters" such as carriage-return
+(code 13), linefeed/newline (code 10), tab (code 9), backspace (code 8) or
+null (code 0). Code 127 is a delete in ASCII.
+
+Getting more technical for just a moment: A byte consisting of 8 bits (eight
+ 1's or 0's) may represent a number from 0 to 255. Therefore, most computers
+have DIRECT access to 256 characters at any given time. A character set
+which includes 256 characters is called an 8-bit character set.
+
+For Latin-based languages, ASCII is almost always the first half of a larger
+8-bit character set. Latin-1 is the most common example of an 8-bit
+character set. Latin-1 includes all of ASCII, and adds characters with codes
+from 128 to 255 which include umlauted ("double-dotted") letters and
+characters with various other accents. In the United States, Windows and
+most Unix systems have Latin-1 directly available.
+
+Most modern systems allow the possibility of changing 8-bit character sets.
+On Windows systems, character sets are referred to as "code pages". There
+are many other character sets which are not mentioned here. DOS has its own
+character set (which also has international variants) that includes graphics
+characters for drawing lines. It is also an extension of ASCII.
+
+For some languages, 8-bit character sets are insufficient, particularly on
+East Asian systems. Therefore, some systems allow 2 bytes for each
+character, which multiplies the 256 possibilties by 256, resulting in 65536
+possible characters. (Much more than the world will ever need.)
+
+Unicode is a character set standard which is intended to fulfill the
+worldwide need for a single character set which includes all characters used
+worldwide. Unicode includes character codes from 0 to 65535, although at
+present, only about 22,000 characters have been officially assigned and named
+by the Unicode Consortium. The alphabets and other writing systems
+representable with Unicode include all Latin-alphabet systems, Greek,
+Russian and other Cyrillic-alphabet systems, Hebrew, Arabic, the various
+languages of India, Chinese, Japanese, Korean, and others. The existing
+Unicode symbols include chess pieces, astrological signs, gaming symbols,
+telephones, pointing fingers, etc. --- just about any type of FIGcharacter
+you may wish to create. Unicode is constantly (but slowly) being extended
+to handle new writing systems and symbols. Information on Unicode is
+available at http://www.unicode.org and at ftp://unicode.org .
+
+Unicode, Latin-1, and ASCII all specify the same meanings for overlapping
+character codes: ASCII 65 = Latin-1 65 = Unicode 65 = "A", formally known
+as "LATIN CAPITAL LETTER A".
+
+Since a keyboard usually has only about 100 keys, your computer may contain
+a program called a "keyboard map", which will interpret certain keystrokes
+or combinations of keystrokes as different character codes. Keyboard maps
+use "mapping tables" to make these determinations. The appropriate keyboard
+activity for a given character code may involve several keystrokes. Almost
+all systems are capable of handling at least 8-bit character sets (containing
+256 characters), so there is always an active keyboard map, at least for
+those characters which are not actually painted on the keys. (United States
+users may not even know that their computer can interpret special keystrokes.
+Such keystrokes may be something similar to holding down the ALT key while
+typing a character code on the numeric keypad. Try it!)
+
+Below are characters 160 through 255, AS REPRESENTED ON YOUR SYSTEM.
+
+ ������������������������������������������������
+ ������������������������������������������������
+
+IMPORTANT NOTE: Depending on which character set is active on your system,
+you may see different characters. This document (like all computer
+documents) does not contains characters per se, only bytes. What you see
+above is your particular computer's representation of these byte values.
+In other words, your active character set. However, if it is Latin-1, the
+first visible character is an inverted "!", and the last is an umlauted "y".
+Although we can safely assume your computer has ASCII, it does not
+necessarily have the Latin-1 character set active.
+
+What does all this have to do with FIGfonts???
+
+First, it should be evident that it is best to use only ASCII characters for
+sub-characters when possible. This will ensure portability to different
+platforms.
+
+FIGlet has gained international popularity, but early versions were made to
+handle only FIGcharacters with assigned character codes corresponding to
+ASCII. So, over the years there have been four methods used to create
+"virtual mapping tables" within the program itself:
+
+ The first method was simply to create FIGcharacters which do not
+ look like the ASCII character set implies. For example, a
+ FIGfont might contain Greek letters, and within its comments, it
+ may say, "If you type A, you'll get a Greek Alpha" etc. With
+ the advent of newer features, it is preferable not to use this
+ method. Instead, when possible, add new FIGcharacters to
+ existing FIGfonts or create new FIGfonts with FIGcharacters coded
+ to match the expectations of ASCII/Latin-1/Unicode, and create an
+ appropriate control file. (See "CONTROL FILES" below.) Remember
+ that Unicode includes almost any character for which you may want
+ to create a FIGcharacter.
+
+ The second method was very specific, to accommodate the German
+ audience. A special option was added to the FIGlet program
+ which would re-route input characters "[", "\", and "]" to
+ umlauted A, O and U, while "{", "|", and "}" would become the
+ respective lowercase versions of these. Also, "~" was made to
+ become the s-z character when this special option was used. This
+ was called "the -D option." The addition of this feature meant
+ that all compatible FIGfonts must contain these Deutsch (German)
+ FIGcharacters, in addition to the ASCII FIGcharacters. Although
+ this option is still available in the most recent version, it is
+ no longer necessary, as the same result can be achieved by the
+ newer features described below. However, the requirement for
+ Deutsch FIGcharacters remains for backward compatibility. (Or at
+ least zero-width FIGcharacters in their place.)
+
+ Later, FIGlet was made to accept control files, which are quite
+ literally a form of mapping table. (See "CONTROL FILES" below.)
+ This was a significant advance for internationalization.
+
+ FIGlet 2.2 can now accept specially encoded formats of input
+ text which imply more than one byte per character.
+
+
+CREATING FIGFONTS
+======== ========
+
+NOTE: FIGWin 1.0 is packaged with a program called FIGfont Editor for Windows
+1.0, which is just that. There is no need to read further if you intend to
+use it. However, the section "CONTROL FILES" below is still relevant.
+
+Since a FIGfont file is a text file, it can be created with any text editing
+program on any platform, and will still be compatible with FIGdrivers on all
+operating systems, except that the bytes used to indicate the end of each
+text line may vary. (PC's use carriage return and linefeed at the end of
+each line, Macintosh uses carriage return only, and UNIX uses linefeed only.)
+
+This minor difference among operating systems is handled easily by setting
+your FTP program to ASCII mode during upload or download. So there is no
+need to be concerned about this as long as you remember to do this during
+file transfer.
+
+The filename of a FIGfont file must end with ".flf", which stands for
+"IGettering ont". The first part of the filename should contain
+only letters, and should be lowercase on operating systems which permit case
+sensitive filenames. The filename should be unique in the first 8
+characters, since some older file systems truncate longer filenames.
+
+It is easier to modify an existing FIGfont than it is to create a new one
+from scratch. The first step is to read and understand this document.
+You may want to load "standard.flf" or another FIGfont into a text editor as
+an example while you read.
+
+A FIGfont file contains three portions: a header line, comments, and
+FIGcharacter data.
+
+
+THE HEADER LINE
+
+The header line gives information about the FIGfont. Here is an example
+showing the names of all parameters:
+
+ flf2a$ 6 5 20 15 3 0 143 229 NOTE: The first five characters in
+ | | | | | | | | | | the entire file must be "flf2a".
+ / / | | | | | | | \
+ Signature / / | | | | | \ Codetag_Count
+ Hardblank / / | | | \ Full_Layout*
+ Height / | | \ Print_Direction
+ Baseline / \ Comment_Lines
+ Max_Length Old_Layout*
+
+ * The two layout parameters are closely related and fairly complex.
+ (See "INTERPRETATION OF LAYOUT PARAMETERS".)
+
+For those desiring a quick explanation, the above line indicates that this
+FIGfont uses "$" to represent the hardblank in FIGcharacter data, it has
+FIGcharacters which are 6 lines tall, 5 of which are above the baseline, no
+line in the FIGfont data is more than 20 columns wide, the default horizontal
+layout is represented by the number 15, there are 3 comment lines, the
+default print direction for this FIGfont is left-to-right, a complete
+description of default and possible horizontal and vertical layouts is
+represented by the number 143, and there are 229 code-tagged characters.
+
+The first seven parameters are required. The last three (Direction,
+Full_Layout, and Codetag_Count, are not. This allows for backward
+compatibility with older FIGfonts, but a FIGfont without these parameters would
+force a FIGdriver to "guess" (by means not described in this document) the
+information it would expect to find in Full_Layout. For this reason, inclusion
+of all parameters is strongly recommended.
+
+Future versions of this standard may add more parameters after Codetag_Count.
+
+A description of each parameter follows:
+
+ Signature
+
+The signature is the first five characters: "flf2a". The first four
+characters "flf2" identify the file as compatible with FIGlet version 2.0 or
+later (and FIGWin 1.0). The "a" is currently ignored, but cannot be omitted.
+Different characters in the "a" location may mean something in future
+versions of this standard. If so, you can be sure your FIGfonts will still
+work if this character is "a".
+
+ Hardblank
+
+Immediately following the signature is the hardblank character. The
+hardblank character in the header line defines which sub-character will be
+used to represent hardblanks in the FIGcharacter data.
+
+By convention, the usual hardblank is a "$", but it can be any character
+except a blank (space), a carriage-return, a newline (linefeed) or a null
+character. If you want the entire printable ASCII set available to use, make
+the hardblank a "delete" character (character code 127). With the exception
+of delete, it is inadvisable to use non-printable characters as a hardblank.
+
+ Height
+
+The Height parameter specifies the consistent height of every FIGcharacter,
+measured in sub-characters. Note that ALL FIGcharacters in a given FIGfont
+have the same height, since this includes any empty space above or below.
+This is a measurement from the top of the tallest FIGcharacter to the bottom
+of the lowest hanging FIGcharacter, such as a lowercase g.
+
+ Baseline
+
+The Baseline parameter is the number of lines of sub-characters from the
+baseline of a FIGcharacter to the top of the tallest FIGcharacter. The
+baseline of a FIGfont is an imaginary line on top of which capital letters
+would rest, while the tails of lowercase g, j, p, q, and y may hang below.
+In other words, Baseline is the height of a FIGcharacter, ignoring any
+descenders.
+
+This parameter does not affect the output of FIGlet 2.2 or FIGWin 1.0, but
+future versions or other future FIGdrivers may use it. The Baseline
+parameter should be correctly set to reflect the true baseline as described
+above. It is an error for Baseline to be less than 1 or greater than the
+Height parameter.
+
+ Max_Length
+
+The Max_Length parameter is the maximum length of any line describing a
+FIGcharacter. This is usually the width of the widest FIGcharacter, plus 2
+(to accommodate endmarks as described later.) However, you can (and probably
+should) set Max_Length slightly larger than this as a safety measure in case
+your FIGfont is edited to include wider FIGcharacters. FIGlet (but not
+FIGWin 1.0) uses this number to minimize the memory taken up by a FIGfont,
+which is important in the case of FIGfonts with many FIGcharacters.
+
+ Old_Layout
+
+(See "INTERPRETATION OF LAYOUT PARAMETERS" below.)
+
+ Comment_Lines
+
+Between the first line and the actual FIGcharacters of the FIGfont are the
+comment lines. The Comment_Lines parameter specifies how many lines there
+are. Comments are optional, but recommended to properly document the origin
+of a FIGfont.
+
+ Print_Direction
+
+The Print_Direction parameter tells which direction the font is to be
+printed by default. A value of 0 means left-to-right, and 1 means
+right-to-left. If this parameter is absent, 0 (left-to-right) is assumed.
+Print_Direction may not specify vertical print, although FIGdrivers are
+capable of vertical print. Versions of FIGlet prior to 2.1 ignore this
+parameter.
+
+ Full_Layout
+
+(See "INTERPRETATION OF LAYOUT PARAMETERS" just below.)
+
+ Codetag_Count
+
+Indicates the number of code-tagged (non-required) FIGcharacters in this
+FIGfont. This is always equal to the total number of FIGcharacters in the font
+minus 102. This parameter is typically ignored by FIGdrivers, but can be
+used to verify that no characters are missing from the end of the FIGfont.
+The chkfont program will display the number of codetagged characters
+in the FIGfont on which it is run, making it easy to insert this parameter
+after a FIGfont is written.
+
+
+INTERPRETATION OF LAYOUT PARAMETERS
+
+Full_Layout describes ALL information about horizontal and vertical layout:
+the default layout modes and potential smushing rules, even when smushing is
+not a default layout mode.
+
+Old_Layout does not include all of the information desired by the most
+recent FIGdrivers, which is the inspiration for the creation of the new
+Full_Layout parameter. Old_Layout is still required for backward
+compatibility, and FIGdrivers must be able to interpret FIGfonts which do not
+have the Full_Layout parameter. (See "STANDARDIZED CAPABILITIES OF CURRENT
+AND FUTURE FIGDRIVERS".)
+
+Versions of FIGlet prior to 2.2 do not recognize the Full_Layout parameter.
+Documentation accompanying FIGlet versions prior to 2.2 refer to Old_Layout
+as "smushmode", which is somewhat misleading since it can indicate layout
+modes other than smushing.
+
+Old_Layout and Full_Layout must contain some redundant information.
+
+Setting the layout parameters is a matter of adding numbers together ("code
+values"). What follows is a chart of the meanings of all code values.
+(You may skip down to "SETTING LAYOUT PARAMETERS STEP BY STEP" if you prefer,
+or if you find this portion confusing.)
+
+Full_Layout: (Legal values 0 to 32767)
+
+ 1 Apply horizontal smushing rule 1 when smushing
+ 2 Apply horizontal smushing rule 2 when smushing
+ 4 Apply horizontal smushing rule 3 when smushing
+ 8 Apply horizontal smushing rule 4 when smushing
+ 16 Apply horizontal smushing rule 5 when smushing
+ 32 Apply horizontal smushing rule 6 when smushing
+ 64 Horizontal fitting (kerning) by default
+ 128 Horizontal smushing by default (Overrides 64)
+ 256 Apply vertical smushing rule 1 when smushing
+ 512 Apply vertical smushing rule 2 when smushing
+ 1024 Apply vertical smushing rule 3 when smushing
+ 2048 Apply vertical smushing rule 4 when smushing
+ 4096 Apply vertical smushing rule 5 when smushing
+ 8192 Vertical fitting by default
+ 16384 Vertical smushing by default (Overrides 8192)
+
+When no smushing rules are included in Full_Layout for a given axis, the
+meaning is that universal smushing shall occur, either by default or when
+requested.
+
+Old_Layout: (Legal values -1 to 63)
+
+ -1 Full-width layout by default
+ 0 Horizontal fitting (kerning) layout by default*
+ 1 Apply horizontal smushing rule 1 by default
+ 2 Apply horizontal smushing rule 2 by default
+ 4 Apply horizontal smushing rule 3 by default
+ 8 Apply horizontal smushing rule 4 by default
+ 16 Apply horizontal smushing rule 5 by default
+ 32 Apply horizontal smushing rule 6 by default
+
+* When Full_Layout indicates UNIVERSAL smushing as a horizontal default
+(i.e., when none of the code values of horizontal smushing rules are included
+and code value 128 is included in Full_Layout) Old_Layout must be set to 0
+(zero). Older FIGdrivers which cannot read the Full_Layout parameter are
+also incapable of universal smushing. Therefore they would be directed to
+the "next best thing", which is horizontal fitting (kerning).
+
+NOTE: You should NOT add the -1 value to any positive code value for
+Old_Layout. This would be a logical contradiction.
+
+See "STANDARDIZED CAPABILITIES OF CURRENT AND FUTURE FIGDRIVERS" for the
+behavior of a FIGdriver when the Full_Layout parameter is absent (presumably
+in an older FIGfont).
+
+The following rules establish consistency between Old_Layout and Full_Layout.
+
+ If full width is to be the horizontal default:
+ Old_Layout must be -1.
+ Full_Layout must NOT include code values 64 nor 128.
+
+ If horizontal fitting (kerning) is to be default:
+ Old_Layout must be 0.
+ Full_Layout must include code value 64.
+ Full_Layout must NOT include code value 128.
+
+ If CONTROLLED smushing is to be the horizontal default:
+ Old_Layout must be a positive number, represented by the added
+ code values of all desired horizontal smushing rules.
+ Full_Layout must include the code values for the SAME set of
+ horizontal smushing rules as included in Old_Layout.
+ Full_Layout must include code value 128.
+
+ If UNIVERSAL smushing is to be the horizontal default:
+ Old_Layout must be 0.
+ Full_Layout must include code value 128.
+ Full_Layout must NOT include any code value under 64.
+
+In general terms, if Old_Layout specifies horizontal smushing rules,
+Full_Layout must specify the same set of horizontal rules, and both must
+indicate the same horizontal default layout mode.
+
+
+SETTING LAYOUT PARAMETERS STEP-BY-STEP
+
+The following step-by-step process will yield correct and consistent values
+for the two layout parameters. You may skip this if you find the
+explanations above easier to use.
+
+Step 1: Start with 0 for both numbers.
+
+ Write "Old_Layout" and "Full_Layout" on a piece of paper.
+ Write the number 0 next to each.
+ The number 0 may be crossed out and changed several times below.
+ Go to step 2.
+
+Step 2: Set the DEFAULT HORIZONTAL LAYOUT MODE.
+
+ If you want to use FULL WIDTH as the default
+ Make Old_Layout -1
+ Go to step 3.
+ If you want to use HORIZONTAL FITTING (kerning) as the default
+ Make Full_Layout 64
+ Go to step 3.
+ If you want to use HORIZONTAL SMUSHING as the default
+ Make Full_Layout 128
+ Go to step 3.
+
+Step 3: Specify HOW TO SMUSH HORIZONTALLY WHEN SMUSHING.
+
+ If you want to use UNIVERSAL smushing for the horizontal axis
+ Go to step 4.
+ If you want to use CONTROLLED smushing for the horizontal axis
+ Add together the code values for all the horizontal smushing
+ rules you want from the list below to get the horizontal
+ smushing rules total.
+
+ EQUAL CHARACTER SMUSHING 1
+ UNDERSCORE SMUSHING 2
+ HIERARCHY SMUSHING 4
+ OPPOSITE PAIR SMUSHING 8
+ BIG X SMUSHING 16
+ HARDBLANK SMUSHING 32
+
+ Horizontal smushing rules total: ___
+
+ If Full_Layout is currently 128
+ Change Old_Layout to the horizontal smushing rules total.
+ Increase Full_Layout by the horizontal smushing rules total.
+ Go to Step 4.
+ If Full_Layout is currently 0 or 64
+ Increase Full_Layout by the horizontal smusing rules total.
+ Go to Step 4.
+
+Step 4: Set the DEFAULT VERTICAL LAYOUT MODE.
+
+ If you want to use FULL HEIGHT as the default
+ Go to step 5.
+ If you want to use VERTICAL FITTING as the default
+ Increase Full_Layout by 8192.
+ Go to step 5.
+ If you want to use VERTICAL SMUSHING as the default
+ Increase Full_Layout by 16384.
+ Go to step 5.
+
+Step 5: Specify HOW TO SMUSH VERTICALLY WHEN SMUSHING.
+
+ If you want to use UNIVERSAL smushing for the vertical axis
+ Go to step 6.
+ If you want to use CONTROLLED smushing for the vertical axis
+ Add together the code values for all the vertical smushing
+ rules you want from the list below to get the vertical
+ smushing rules total.
+
+ EQUAL CHARACTER SMUSHING 256
+ UNDERSCORE SMUSHING 512
+ HIERARCHY SMUSHING 1024
+ HORIZONTAL LINE SMUSHING 2048
+ VERTICAL LINE SUPERSMUSHING 4096
+
+ Vertical smushing rules total: ____
+
+ Increase Full_Layout by the vertical smushing rules total.
+ Go to step 6.
+
+Step 6: You're done.
+
+The resulting value of Old_Layout will be a number from -1 to 63.
+The resulting value of Full_Layout will be a number from 0 and 32767.
+
+
+FIGFONT COMMENTS
+
+After the header line are FIGfont comments. The comments can be as many
+lines as you like, but should at least include your name and Email address.
+Here is an example which also shows the header line.
+
+ flf2a$ 6 5 20 15 3 0 143
+ Example by Glenn Chappell 8/94
+ Permission is hereby given to modify this font, as long as the
+ modifier's name is placed on a comment line.
+
+Comments are not required, but they are appreciated. Please comment your
+FIGfonts.
+
+Remember to adjust the Comment_Lines parameter as you add lines to your
+comments. Don't forget that blank lines DO count.
+
+
+FIGCHARACTER DATA
+============ ====
+
+The FIGcharacter data begins on the next line after the comments and
+continues to the end of the file.
+
+BASIC DATA STRUCTURE
+
+The sub-characters in the file are given exactly as they should be output,
+with two exceptions:
+
+ 1) Hardblanks should be the hardblank character specified in the
+ header line, not a blank (space).
+
+ 2) Every line has one or two endmark characters, whose column
+ locations define the width of each FIGcharacter.
+
+In most FIGfonts, the endmark character is either "@" or "#". The FIGdriver
+will eliminate the last block of consecutive equal characters from each line
+of sub-characters when the font is read in. By convention, the last line of
+a FIGcharacter has two endmarks, while all the rest have one. This makes it
+easy to see where FIGcharacters begin and end. No line should have more
+than two endmarks.
+
+Below is an example of the first few FIGcharacters, taken from small.flf.
+
+NOTE: The line drawn below consisting of "|" represents the left margin of
+your editor. It is NOT part of the FIGfont. Also note that hardblanks are
+represented as "$" in this FIGfont, as would be described in the header line.
+
+ |$@
+ |$@
+ blank/space |$@
+ |$@
+ |$@@
+ | _ @
+ || |@
+ exclamation point ||_|@
+ |(_)@
+ | @@
+ | _ _ @
+ |( | )@
+ double quote | V V @
+ | $ @
+ | @@
+ | _ _ @
+ | _| | |_ @
+ number sign ||_ . _|@
+ ||_ _|@
+ | |_|_| @@
+ | @
+ | ||_@
+ dollar sign |(_-<@
+ |/ _/@
+ | || @@
+
+Notice that each FIGcharacter occupies the same number of lines (6 lines, in
+this case), which must also be expressed in the header line as the Height
+parameter.
+
+Also notice that for every FIGcharacter, there must be a consistent width
+(length) for each line once the endmarks are removed. To do otherwise would
+be an error.
+
+Be aware of the vertical alignment of each FIGcharacter within its height,
+so that all FIGcharacters will be properly lined up when printed.
+
+If one of the last sub-characters in a particular FIGcharacter is "@", you
+should use another character for the endmark in that FIGcharacter so that
+the intended "@" is not interpreted as an endmark. "#" is a common
+alternative.
+
+Load a few existing FIGfonts into your favorite text editor for other
+examples.
+
+
+REQUIRED FIGCHARACTERS
+
+Some FIGcharacters are required, and must be represented in a specific order.
+Specifically: all of the printable character codes from ASCII shown in the
+table below, in order, plus character codes 196, 214, 220, 228, 246, 252,
+and 223, in that order. In Latin-1, these extra 7 characters represent the
+following German characters: umlauted "A", "O", "U", "a", "o" and "u"; and
+also "ess-zed".
+
+ Printable portion of the ASCII character set:
+
+ 32 (blank/space) 64 @ 96 `
+ 33 ! 65 A 97 a
+ 34 " 66 B 98 b
+ 35 # 67 C 99 c
+ 36 $ 68 D 100 d
+ 37 % 69 E 101 e
+ 38 & 70 F 102 f
+ 39 ' 71 G 103 g
+ 40 ( 72 H 104 h
+ 41 ) 73 I 105 i
+ 42 * 74 J 106 j
+ 43 + 75 K 107 k
+ 44 , 76 L 108 l
+ 45 - 77 M 109 m
+ 46 . 78 N 110 n
+ 47 / 79 O 111 o
+ 48 0 80 P 112 p
+ 49 1 81 Q 113 q
+ 50 2 82 R 114 r
+ 51 3 83 S 115 s
+ 52 4 84 T 116 t
+ 53 5 85 U 117 u
+ 54 6 86 V 118 v
+ 55 7 87 W 119 w
+ 56 8 88 X 120 x
+ 57 9 89 Y 121 y
+ 58 : 90 Z 122 z
+ 59 ; 91 [ 123 {
+ 60 < 92 \ 124 |
+ 61 = 93 ] 125 }
+ 62 > 94 ^ 126 ~
+ 63 ? 95 _
+
+ Additional required Deutsch FIGcharacters, in order:
+
+ 196 (umlauted "A" -- two dots over letter "A")
+ 214 (umlauted "O" -- two dots over letter "O")
+ 220 (umlauted "U" -- two dots over letter "U")
+ 228 (umlauted "a" -- two dots over letter "a")
+ 246 (umlauted "o" -- two dots over letter "o")
+ 252 (umlauted "u" -- two dots over letter "u")
+ 223 ("ess-zed" -- see FIGcharacter illustration below)
+ ___
+ / _ \
+ | |/ /
+ Ess-zed >>---> | |\ \
+ | ||_/
+ |_|
+
+If you do not wish to define FIGcharacters for all of those required above,
+you MAY create "empty" FIGcharacters in their place by placing endmarks flush
+with the left margin. The Deutsch FIGcharacters are commonly created as
+empty. If your FIGfont includes only capital letters, please copy them to
+the appropriate lowercase locations, rather than leaving lowercase letters
+empty. A FIGfont which does not include at least all ASCII letters, a space,
+and a few basic punctuation marks will probably frustrate some users. (For
+example "@" is more frequently desired as a FIGcharacter than you may think,
+since Email addresses may be written as FIGures.)
+
+
+CODE TAGGED FIGCHARACTERS
+
+After the required FIGcharacters, you may create FIGcharacters with any
+character code in the range of -2147483648 to +2147483647. (Over four
+billion possibilities, which is "virtual infinity" for this purpose.)
+One exception: character code -1 is NOT allowed for technical reasons.
+It is advisable to assign character codes such that the appearance of your
+FIGcharacters matches the expectations of ASCII/Latin-1/Unicode, with a few
+exceptions:
+
+ 1) If a FIGcharacter with code 0 is present, it is treated
+ specially. It is a FIGfont's "missing character". Whenever
+ the FIGdriver is told to print a character which doesn't exist
+ in the current FIGfont, it will print FIGcharacter 0. If there
+ is no FIGcharacter 0, nothing will be printed.
+
+ 2) If a FIGfont contains a non-Latin alphabet in character codes
+ in the ASCII range 32-126 (which is discouraged), we have found
+ it helpful to include a human-readable translation table as one
+ of the FIGcharacters instead of a "glyph". Typically, the "~"
+ would contain this table. The translation table FIGcharacter
+ would contain a list of all the special characters in the
+ FIGfont, along with the ASCII characters to which they
+ correspond. Keep this table no more than 79 columns wide.
+ (Thanks to Gedaliah Friedenberg for this idea.)
+
+ 3) In more extensive Unicode fonts, you can assign a negative
+ character code (other than -1) to one or more translation
+ tables, similar to #2 above. (All Unicode character codes are
+ positive.) And, you will most likely suggest within the
+ comments that a user access one of several control files (See
+ "CONTROL FILES" below) to gain access to Latin-2, Latin-3, or
+ other 8-bit standardized character sets. The control files may
+ redirect the "~" character to one of the negative character codes so
+ that the translation table would display the table when "~" is
+ given for input. Doing this allows you to still have a "~"
+ FIGcharacter for those who do not use a control file.
+
+Those FIGcharacters which are not required must have an explicit character
+code in a separate line preceding them, called a "code tag". A code tag
+contains the value of the character code, followed by whitespace (a few
+spaces), and perhaps an optional comment. The comment is usually the name of
+the FIGcharacter. The Unicode Consortium has assigned formal names to all
+officially accepted characters, and these may be used. An entire code tag,
+including the comment, should not occupy more than 95 columns. (Over 100
+characters here may make older versions of FIGlet crash.)
+
+Here is an example, showing two code tagged FIGcharacters after the last two
+required Deutsch FIGcharacters. Again, the line drawn below consisting of
+"|" represents the left margin of your editor, and is NOT part of the FIGfont.
+
+ | _ _ @
+ |(_) (_)@
+ || | | |@
+ || |_| |@
+ | \__,_|@
+ | @@
+ | ___ @
+ | / _ \@
+ || |/ /@
+ || |\ \@
+ || ||_/@
+ ||_| @@
+ |161 INVERTED EXCLAMATION MARK
+ | _ @
+ |(_)@
+ || |@
+ || |@
+ ||_|@
+ | @@
+ |162 CENT SIGN
+ | _ @
+ | | | @
+ | / __)@
+ || (__ @
+ | \ )@
+ | |_| @@
+
+
+A character code may be expressed in decimal (as shown above, numbers we're
+all familiar with), or in Octal (seldom used) or in hexadecimal.
+
+Character codes expressed in octal must be preceded by "0" (zero), and if
+negative, "-" (minus) must precede the "0". There are eight octal digits:
+01234567. You may recall octal numbers from school as "base 8 numbers".
+
+Character codes expressed in hexadecimal must be preceded by "0x" or "0X".
+(That's also a zero.) If negative, the "-" must precede the "0x". There are
+16 hexadecimal digits: 01234567890ABCDEF. (The "letter-digits" may also be
+lowercase.) Hexadecimal is "base 16".
+
+It is common to express character codes less than 256 (in the range of an
+8-bit character set) as decimal, while FIGfonts which extend into the Unicode
+range would have character codes expressed in hexadecimal. This is because
+the Unicode Standard expresses character codes in hexadecimal, which is
+helpful for programmers.
+
+The code tagged FIGcharacters may be listed in any order, but simple
+sequential order is recommended.
+
+If two or more FIGcharacters have the same character code, the last one in
+the FIGfont is the one used. It is common for the Deutsch FIGcharacters to
+be given twice in a FIGfont, just to maintain a consistent order for the
+Latin-1 range (128 to 255).
+
+It is not advisable to assign character codes in the range of 1 to 31, since
+this range includes control characters in ASCII. Character code 127 is a
+delete in ASCII, and is also not advised. Character codes 128 to 159 are
+additional control characters in Latin-1, and they too should not be used.
+All of the above are legal, technically, but are not part of what is legal
+for input, so they could only be accessed by use of a control file.
+(See "CONTROL FILES" below.) If you are still tempted to use them, consider
+negative character codes instead, which are meaningless in all standardized
+character sets.
+
+Again, the character code -1 is illegal for technical reasons.
+
+
+NOTES - AVOIDING ERRORS AND GENERAL ADVICE
+===== ======== ====== === ======= ======
+
+It is very important that every character in a font has the same height, and,
+once the endmarks are removed, that all the lines constituting a single
+FIGcharacter have the same length. Be careful also that no lines in the font
+file have trailing blanks (spaces), as the FIGdriver will take these to be
+the endmarks. (FIGWin 1.0 will not consider blanks to be endmarks.)
+
+Errors in a FIGfont can be detected by using the "chkfont" program,
+part of the standard FIGlet package, and also available, as of this
+writing from http://www.figlet.org/
+�
+For FIGWin users, the FIGWin program will report errors when a FIGfont is
+read in; it is less forgiving than FIGlet, which can produce nonsense if the
+FIGfont is incorrectly formatted.
+
+Remember that sub-characters outside of the ASCII range will not necessarily
+display the same way on your system as on others.
+
+The blank (space) FIGcharacter should usually consist of one or two columns
+of hardblanks and nothing else; slanted fonts are an exception to this rule.
+If the space FIGcharacter does not contain any hardblanks, it will disappear
+when horizontal fitting (kerning) or smushing occurs.
+
+Again, if you design a FIGfont, please let us know!
+
+
+CONTROL FILES
+======= =====
+
+A FIGfont control file is a separate text file, associated with one or more
+FIGfonts, that indicates how to map input characters into FIGfont character
+codes. By default, FIGdrivers read single bytes from the input source and
+interpret them as Latin-1 FIGcharacters.
+
+FIGlet version 2.2 (and later) can optionally interpret its input as DBCS or
+UTF-8 characters, making it possible to access FIGcharacters with codes
+outside the Latin-1 range (greater than 255).
+
+In addition, though, all versions of FIGlet can use control files to
+transform specific character codes (or ranges of codes) as other codes
+(or ranges). Multiple control files can be specified, in which case multiple
+stages of transformation are performed.
+
+The filename of a control file always ends with ".flc".
+
+CONTROL FILE FORMAT
+
+Control files contain several kinds of lines. Lines beginning with "#", as
+well as blank lines, are comment lines and are ignored. All other lines are
+command lines, with one of the following formats:
+
+ t inchar outchar
+ t inchar1-inchar2 outchar1-outchar2
+ number number
+ f
+ h
+ j
+ b
+ u
+ g{0|1|2|3} {94|96|94x94} [char]
+ g{L|R} {0|1|2|3}
+
+where "inchar", "outchar", and "char" are either Latin-1 characters
+representing their own codes, or else are numeric character codes preceded by
+a "\" character; and "number" is a numeric character code with no preceding
+"\" character.
+
+Thus "A" represents the code 65, as does "\65", and "\0x100" represents the
+code 256 (100 in hexadecimal). In addition, "\ " (backslash followed by a
+space) represents the code 32 (space), and the following backslash sequences
+are also understood:
+
+ \a code 7 (a bell/alert)
+ \b code 8 (a backspace)
+ \e code 27 (an ESC character)
+ \f code 12 (a form feed)
+ \n code 10 (a newline/line feed)
+ \r code 13 (a carriage return)
+ \t code 9 (a horizontal tab)
+ \v code 11 (a vertical tab)
+ \\ code 92 (a backslash)
+
+All of these combinations except perhaps "\\" are very unlikely to be used,
+but they are provided just in case they are needed.
+
+Whitespace characters are used between "t" and "inchar" and between "inchar"
+and "outchar", but not around the "-" characters used in the second type of
+"t" command.
+
+The term "string" refers to any number of characters represented in the
+format given above. The characters begin after the whitespace following the
+letter "s", and continue to the end of the line.
+
+Anything following the first letter of an "f", "h", "j", or "u" command is
+ignored.
+
+The first type of "t" command transforms characters with the code "inchar"
+into characters with the code "outchar". The second type of "t" command
+transforms characters in the range "inchar1" to "inchar2" as the
+corresponding codes in the range "outchar1" to "outchar2". Both ranges must
+be of the same size. The form "number number" is equivalent to a "t"
+command of the first type, and is provided for compatibility with the mapping
+tables issued by the Unicode Consortium.
+
+Multiple transformation stages can be encoded in a single control file by
+using "f" commands to separate the stages.
+
+Versions of FIGlet before 2.1 required that the first line of a control file
+consist of the signature string "flc2a". This signature line is still
+permitted in FIGlet 2.2 and later versions, but is no longer required.
+
+Here is an example of a control file. The blanks at the beginning of each
+line are for readability only, and are not part of the file.
+
+The following control file:
+
+ flc2a
+ t # $
+ t A-Z a-z
+
+will map the "#" character to "$", and will also convert uppercase ASCII to
+lowercase ASCII.
+
+If a number of consecutive "t" commands are given, then for each character
+processed, only the first applicable command (if any) will be executed.
+Consider this control file:
+
+ t A B
+ t B A
+
+It will swap the characters "A" and "B". If the FIGdriver reads an "A", the
+first command will change "A" to "B", in which case the second will not be
+executed. If the FIGdriver reads a "B", the first command will have no
+effect, and the second command will change "B" to "A". Here is another
+control file:
+
+ t A B
+ t A C
+
+In this example, the second line is never executed. In short, a sequence of
+"t" lines "does what it ought to".
+
+More complex files, in which a single character is acted upon by several "t"
+commands, can be set up using an "f" command. For example:
+
+ flc2a
+ t a-z A-Z
+ f
+ t Q ~
+
+This control file specifies two transformation stages. In the first stage,
+lowercase ASCII letters are changed to their uppercase equivalents. The
+second stage maps any Q (whether original or a converted "q") into the "~"
+character. If the "f" command were omitted, "q" characters would remain "Q"
+and not be converted to "~".
+
+EXTENDED COMMANDS
+
+The "h", "j", "b", "u", and "g" commands are only understood by FIGlet
+version 2.2 or later. They control how a FIGdriver interprets bytes in the
+input. By default, the FIGdriver interprets each byte of input as a distinct
+character. This mode is suitable for most character encodings. All these
+commands are logically acted on before any other control file commands, no
+matter where in the sequence of control files they appear. They are also
+mutually exclusive; if more than one of these commands is found, only the
+last is acted on. Multiple "g" commands are permitted, however.
+
+The "h" command forces the input to be interpreted in HZ mode, which is used
+for the HZ character encoding of Chinese text. In this mode, the sequence
+"~{" (which is removed from the input) signals that all following characters
+are two bytes long until the sequence "~}" is detected. In addition, the
+sequence "~~" is changed to just "~", and all other two-byte sequences
+beginning with "~" are removed from the input. The character code
+corresponding to a two-byte character is:
+
+ first character * 256 + second character
+
+The "j" command forces the input to be interpreted in Shift-JIS mode (also
+called "MS-Kanji mode"). Input bytes in the ranges 128-159 and 224-239 are
+read as the high-order byte of a two-byte character; all other bytes are
+interpreted as one-byte characters. The value of a two-byte character is
+determined in the same way as in HZ mode.
+
+The "b" command forces the input to be interpreted in DBCS mode, which is
+suitable for processing HZ or Shift-GB Chinese text or Korean text. Input
+bytes in the ranges 128-255 are read as the high-order byte of a two-byte
+character; all other bytes are interpreted as one-byte characters. The
+value of a two-byte character is determined in the same way as in HZ mode.
+
+The "u" command forces the input to be interpreted in UTF-8 mode, which
+causes any input byte in the range 0x80 to 0xFF to be interpreted as the
+first byte of a multi-byte Unicode (ISO 10646) character. UTF-8 characters
+can be from 1 to 6 bytes long. An incorrectly formatted sequence is
+interpreted as the character 128 (normally an unused control character).
+
+Otherwise, the input is allowed to contain ISO 2022 escape sequences, which
+are decoded to generate appropriate character codes. These character codes
+are *not* a subset of Unicode, but may be more useful in processing East
+Asian text. A brief explanation of ISO 2022 is given here in order to
+clarify how a FIGdriver should interpret it. The "g" command provides
+information for the ISO 2022 interpreter, and is explained below.
+
+ISO 2022 text is specified using a mixture of registered character sets.
+At any time, up to four character sets may be available. Character sets
+have one of three sizes: single-byte character sets with 94 characters
+(e.g. ASCII), single-byte character sets with 96 characters (e.g. the top
+halves of ISO Latin-1 to Latin-5), or double-byte character sets with
+94 x 94 characters (e.g. JIS 0208X-1983). Each registered character set has
+a standard designating byte in the range 48 to 125; the bytes are unique withi
+n character set sizes, but may be reused across sizes. For example, byte 66
+designates the 94-character set ASCII, the 96-character set ISO Latin-2 (top
+half), and the 94 x 94 Japanese character set JIS 0208X-1983. In this
+document, the designating byte of a character set will be represented by .
+
+The four available character sets are labeled G0, G1, G2, and G3. Initially,
+G0 is the 94-character set ASCII, and G1 is the 96-character set ISO Latin-1
+(top half). The other character sets are unassigned. The following escape
+sequences (where ESC = the byte 27) specify changes to the available
+character sets:
+
+ ESC ( Set G0 to the 94-character set
+ ESC ) Set G1 to the 94-character set
+ ESC * Set G2 to the 94-character set
+ ESC + Set G3 to the 94-character set
+ ESC - Set G1 to the 96-character set
+ ESC . Set G2 to the 96-character set
+ ESC / Set G3 to the 96-character set
+ ESC $ Set G0 to the 94 x 94 character set
+ ESC $ ( Set G0 to the 94 x 94 character set
+ ESC $ ) Set G1 to the 94 x 94 character set
+ ESC $ * Set G2 to the 94 x 94 character set
+ ESC $ + Set G3 to the 94 x 94 character set
+
+
+Note that G0 may not be a 96-character set, and that there are two ways to
+specify a 94 x 94 character set in G0, of which the first is deprecated.
+
+ISO 2022 decoding affects input bytes in the ranges 33 to 126 and 160 to 255,
+known as "the left half" and "the right half" respectively. All other bytes,
+unless they belong to a control sequence shown in this document, remain
+unchanged. Initially, the left half is interpreted as character set G0,
+and the right half as character set G1. This can be changed by the following
+control sequences:
+
+ SI (byte 15) Interpret the left half as G1 characters
+ SO (byte 14) Interpret the left half as G0 characters
+ ESC n Interpret the left half as G2 characters
+ ESC o Interpret the left half as G3 characters
+ ESC ~ Interpret the right half as G1 characters
+ ESC } Interpret the right half as G2 characters
+ ESC | Interpret the right half as G3 characters
+ SS2 (byte 142) Interpret next character only as G2
+ ESC N Interpret next character only as G2
+ SS3 (byte 143) Interpret next character only as G3
+ ESC O Interpret next character only as G3
+
+
+This rich schema may be used in various ways. In ISO-2022-JP, the Japanese
+flavor of ISO 2022, only the bytes 33-126 and the G0 character set is used,
+and escape sequences are used to switch between ASCII, ISO-646-JP (the
+Japanese national variant of ASCII), and JIS 0208X-1983. In other versions,
+the G1 character set has 94 x 94 size, and so any byte in the range 160-255
+is automatically the first byte of a double-byte character.
+
+FIGdrivers that support ISO 2022 do so in the following way. Each character i
+is decoded and assigned to a character set .
+
+ If the character belongs to a 94-bit character set,
+ then if its value exceeds 128, it is reduced by 128,
+ and the value 65536 * is added to it,
+ unless is 66 (ASCII).
+ If the character belongs to a 96-bit character set,
+ then if its value is less than 128, it is increased by 128,
+ and the value 65536 * is added to it,
+ unless is 65 (ISO Latin-1).
+ If the character belongs to a 94 x 94 character set,
+ then the value is the sum of:
+ the first byte * 256,
+ plus the second byte,
+ plus the value 65536 * .
+
+
+Thus, the character code 65 ("A") in ASCII remains 65, the character code
+196 in ISO Latin-1 ("A-umlaut") remains 196, the character code 65 (0x41)
+in ISO-646-JP (whose is 74 = 0x4A) becomes 0x4A0041 =4849729, and the
+two-byte sequence 33 33 (0x21 0x21) in JIS 0208X-1983 (whose is
+65 = 0x41) becomes 0x412121 = 4268321. These codes may be used in compiling
+FIGfonts suitable for use with ISO 2022 encoded text.
+
+The initial settings of G0 through G3 and their assignments to the left half
+and the right half can be altered in a control file by using "g" commands,
+as follows:
+
+ g {0|1|2|3} {94|96|94x94} []
+
+specifies that one of G0-G3 is a 94, 96, or 94x94 character set with
+designating character . If no designating character is specified, then a
+ value of zero is assumed.
+
+For example, the list of control commands:
+
+ g 0 94 B
+ g 1 96 A
+
+sets the G0 character set to ASCII (94-character set "B") and the G1
+character set to the top half of Latin-1 (96-character set "A"). (This is the
+default setting).
+
+To change the initial assignments of G0 to the left half and G1 to the right
+half, "g" commands of the form
+
+ g {L|R} {0|1|2|3}
+
+For example, the command:
+
+ g R 2
+
+causes right-half bytes (in the range 160-255) to be interpreted as G2.
+Whether these bytes are interpreted singly or in pairs depends on the type
+of character set that is currently available as G2.
+
+Spaces may be freely used or omitted in "g" commands.
+
+The standard FIGlet distribution contains mapping tables for Latin-2 (ISO 8859-2),
+Latin-3 (ISO 8859-3), Latin-4 (ISO 8859-4), and Latin-5 (ISO 8859-9). They
+can be used with the font "standard.flf", which contains all the characters
+used in these standards.
+
+
+STANDARDIZED CAPABILITIES OF CURRENT AND FUTURE FIGDRIVERS
+============ ============ == ======= === ====== ==========
+
+We assert the following as the "Law" of our intentions:
+
+PROFIT
+
+All future FIGdrivers shall be FREE OF CHARGE to the general public via the
+Internet. Any advertisements of other works by the author must be in
+documentation only, and limited to ONE "screenful", and shall not appear by
+normal program behavior, nor interfere with normal behavior. No FIGdriver
+shall disable itself after a set period of time or request "donations".
+No FIGdriver shall offer any other FIGdriver with improved capability for
+creating FIGures in exchange for money.
+
+REQUIRED FEATURES OF FUTURE VERSIONS
+
+Future FIGdrivers must read and process FIGfont files as described in this
+document, but are not necessarily expected to process control files, smush,
+perform fitting or kerning, perform vertical operations, or even produce
+multiple lines in output FIGures.
+
+FIGDRIVER NAMES
+
+Future FIGdrivers must be named to include capitalized "FIG" and shall have
+an incremental version number specific to its own platform.
+
+BACKWARDS COMPATIBILITY OF FUTURE VERSIONS
+
+Any future FIGdriver created for the same platform as an existing FIGdriver,
+and using the same name as the existing FIGdriver, shall be considered a new
+version of the preceding FIGdriver, and shall contain all historical comments
+of updates to past versions on the same platform, and shall have full
+capability of the preceding versions. If the source code is not provided to
+the general public, it shall be at least provided to any potential developers
+of later versions, and such comments relating to past versions shall be
+accessible to any user by other means or documentation. If a new program is
+created on a platform that already has an existing FIGdriver, it must be
+given a new and distinct name. This allows multiple FIGdrivers to exist for
+the same platform with different capabilities.
+
+The format of FIGfonts may not be modified to be non-backwards compatible
+UNLESS:
+
+ 1) The new format is easily editable as an ASCII text file,
+ beginning with the characters "flf" followed by a sequential
+ number.
+
+ 2) At least all of the same information can be derived from the
+ new format as the prior format (currently "flf2"). This
+ includes the main comments which give credit to the FIGfont
+ designer.
+
+ 3) Individuals are found who are willing and have the ability to
+ either port or develop versions for at least UNIX, DOS,
+ Windows, and Amiga which will read both the new formats AND the
+ prior format (currently "flf2"), and retain the capability of
+ past versions. It is intended that this will be expanded to
+ include Macintosh if a GUI version exists. This list of
+ required operating systems may be reduced if an operating
+ system falls out of popularity or increased if a new operating
+ system for which there is a FIGdriver comes into greater
+ popularity, according to the consensus of opinions of past
+ developers for the most popular operating systems.
+
+ 4) A C, Java, or other version must always exist which can
+ receive input and instructions either from a command line, a
+ file, or directly over the internet so that FIGures can be
+ obtained from internet-based services without the need to
+ download any FIGdriver.
+
+ 5) All existing FIGfonts available from the "official" point of
+ distribution (http://www.figlet.org/),
+ must be converted to the new format, and offered for download
+ alongsidethe new versions.
+
+THE FUNCTION OF WORD WRAPPING
+
+All future FIGdrivers should duplicate these behaviors, unless a version is
+only capable of outputting one-line FIGures, which is acceptable as long no
+preceding versions exist for its platform which can output multiple-line
+FIGures.
+
+FIGdrivers which perform word wrapping do so by watching for blanks (spaces)
+in input text, making sure that the FIGure is no more wide than the maximum
+width allowed.
+
+Input text may also include linebreaks, so that a user may specify where
+lines begin or end instead of relying on the word wrapping of the FIGdriver.
+(Linebreaks are represented by different bytes on different platforms, so
+each FIGdriver must watch for the appropriate linebreaks for its particular
+platform.)
+
+When a FIGdriver word wraps and there are several consecutive blanks in input
+text where the wrapping occurred, the FIGdriver will disregard all blanks
+until the next non-blank input character is encountered. However, if blanks
+in input text immediately follow a linebreak, or if blanks are the first
+characters in the input text, the blanks will be "printed", moving any
+visible FIGcharacters which follow on the same output line to the right.
+Similarly, if an image is right-aligned, and blanks immediately precede
+linebreaks or the end of input text, a FIGdriver will move an entire line of
+output FIGcharacters to the left to make room for the blank FIGcharacters
+until the left margin is encountered. (If the print direction is
+right-to-left, everything stated in this paragraph is reversed.)
+
+Word processing programs or text editors usually behave similarly in all
+regards to word wrapping.
+
+GENERAL INTENT FOR CROSS-PLATFORM PORTABILITY
+
+Currently, all versions of FIGlet are compiled from C code, while FIGWin 1.0
+is written in Visual Basic. Over time it is intended that a later version of
+FIGWin will be created using a GUI C programming language, and that the
+FIGlet C code shall continue to be written to be easily "plugged in" to a
+GUI shell. It is preferable for developers of FIGdrivers for new platforms
+to use C or a GUI version of C, so that when the core rendering engine of
+FIGlet is updated, it will be portable to other platforms.
+
+CONTROL FILE COMMANDS
+
+New control file commands may be added to later versions of this standard.
+However, the commands "c", "d", and "s" are permanently reserved and may
+never be given a meaning.
+
+FILE COMPRESSION
+
+FIGfonts (and control files) are often quite long, especially if many
+FIGcharacters are included, or if the FIGcharacters are large. Therefore,
+some FIGdrivers (at present, only FIGlet version 2.2 or later) allow
+compressed FIGfonts and control files.
+
+The standard for FIG compression is to place the FIGfont or control file into
+a ZIP archive. ZIP archives can be created by the proprietary program PKZIP
+on DOS and Windows platforms, or by the free program Info-ZIP ZIP on almost
+all platforms. More information on ZIP can be obtained at
+http://www.cdrom.com/pub/infozip/Info-Zip.html .
+
+The ZIP archive must contain only a single file. Any files in the archive
+after the first are ignored by FIGdrivers. In addition, the standard
+extension ".zip" of the archive must be changed to ".flf" or ".flc" as
+appropriate. It does not matter what the name of the file within the
+archive is.
+
+
+
+CHART OF CAPABILITIES OF FIGLET 2.2 AND FIGWIN 1.0
+===== == ============ == ====== === === ====== ===
+
+The following chart lists all capabilities which are either new with the
+release of both FIGdrivers, or is not a common capability among both.
+
+ FIGlet 2.2 FIGWIN 1.0
+ Interpreting the Full_Layout parameter: Yes Yes
+ Universal smushing: Yes Yes
+ Supporting multi-byte input text formats: Yes No
+ Processing control files: Yes No
+ Changing default smushing rules: Yes No
+ Bundled with a GUI editor of FIGfonts: No Yes
+ Vertical fitting and smushing: No Yes
+
+ ___________ __ _
+ \_ _____/ ____ |__| ____ ___ __ | |
+ | __)_ / \ | |/ _ < | || |
+ | \ | \ | ( <_> )___ | \|
+ /_______ /___| /\__| |\____// ____| __
+ \/ \/\______| \/ \/
diff --git a/externals/figlet/figlet.6 b/externals/figlet/figlet.6
new file mode 100644
index 0000000000..ff2231140e
--- /dev/null
+++ b/externals/figlet/figlet.6
@@ -0,0 +1,1102 @@
+.\" FIGlet
+.\" Copyright (C) 1991, 1993, 1994 Glenn Chappell and Ian Chai
+.\" Internet:
+.\" Portions Copyright 1996, 1997, 1998, 1999, 2000, 2001 by John Cowan
+.\" Portions Copyright 2002 by Christiaan Keet
+.\" Portions Copyright 2011, 2012 by Claudio Matsuoka
+.\" FIGlet, along with the various FIGlet fonts and documentation, may
+.\" be freely copied and distributed.
+.\" If you use FIGlet, please send an e-mail message to
+.\"
+.\"
+.TH FIGLET 6 "31 May 2012" "v2.2.5"
+
+.SH NAME
+FIGlet \- display large characters made up of ordinary screen characters
+
+.SH SYNOPSIS
+.B figlet
+[
+.B \-cklnoprstvxDELNRSWX
+]
+[
+.B \-d
+.I fontdirectory
+]
+.PD 0
+.IP
+.PD
+[
+.B \-f
+.I fontfile
+]
+[
+.B \-m
+.I layoutmode
+]
+.PD 0
+.IP
+.PD
+[
+.B \-w
+.IR outputwidth
+]
+[
+.B \-C
+.I controlfile
+]
+.PD 0
+.IP
+.PD
+[
+.B \-I
+.I infocode
+]
+[
+.I message
+]
+
+.SH DESCRIPTION
+.B FIGlet
+prints its input using large characters
+(called ``FIGcharacters'')made up of ordinary
+screen characters
+(called ``sub-characters'').
+.B FIGlet
+output is generally reminiscent of the
+sort of ``signatures'' many people like to put at the end of e-mail
+and UseNet messages. It is also reminiscent of the output of some banner
+programs, although it is oriented normally, not sideways.
+
+.B FIGlet
+can print in a variety of fonts, both left-to-right and right-to-left,
+with adjacent FIGcharacters kerned and ``smushed'' together in various ways.
+.B FIGlet
+fonts are stored in
+separate files, which can be identified by the suffix
+.RB `` .flf ''.
+In systems with UTF-8 support
+.B FIGlet
+may also support TOIlet
+.RB `` .tlf ''
+fonts. Most
+.B FIGlet
+font files will be stored in
+.B FIGlet's
+default font directory.
+
+.B FIGlet
+can also use ``control files'', which tell it to map certain input
+characters to certain other characters, similar to the Unix
+.B tr
+command. Control files can be identified by the suffix
+.RB `` .flc ''.
+Most
+.B FIGlet
+control files will be stored in
+.B FIGlet's
+default font directory.
+
+You can store
+.B FIGlet
+fonts and control files
+in compressed form.
+See
+.BR "COMPRESSED FONTS" .
+
+.SH USAGE
+Just start up
+.B FIGlet
+(type
+.RB `` figlet '')
+and then type whatever you want.
+Alternatively, pipe a file or the output of another command through
+.BR FIGlet ,
+or put input on the command line
+after the options.
+See
+.B EXAMPLES
+for other things to do.
+
+.SH OPTIONS
+.B FIGlet
+reads command line options from left to right, and only the last
+option that affects a parameter has any effect. Almost every option
+has an inverse, so that, for example, if
+.B FIGlet
+is customized with a shell
+.BR alias ,
+all the options are usually still available.
+
+Commonly-used options are
+.BR \-f ,
+.BR \-c ,
+.BR \-k ,
+.BR \-t ,
+.B \-p
+and
+.BR \-v .
+
+.TP
+.BI \-f \ fontfile
+Select the font. The
+.B .flf
+suffix may be left off of
+.IR fontfile ,
+in which case
+.B FIGlet
+automatically appends it.
+.B FIGlet
+looks for the file first in the default font directory and then
+in the current directory, or, if
+.I fontfile
+was given as a full pathname, in the given directory.
+If the
+.B \-f
+option is not specified,
+.B FIGlet
+uses the font that was specified
+when it was compiled. To find out which font this is, use the
+.B \-I3
+option.
+
+.TP
+.BI \-d \ fontdirectory
+Change the default font directory.
+.B FIGlet
+looks for fonts first in the
+default directory and then in the current directory.
+If the
+.B \-d
+option is not specified,
+.B FIGlet
+uses the directory that was specified
+when it was compiled. To find out which directory this is, use the
+.B \-I2
+option.
+
+.TP
+.B \-c
+.PD 0
+.TP
+.B \-l
+.PD 0
+.TP
+.B \-r
+.PD 0
+.TP
+.B \-x
+.PD
+These options handle the justification of
+.B FIGlet
+output.
+.B \-c
+centers the output horizontally.
+.B \-l
+makes the output flush-left.
+.B \-r
+makes it flush-right.
+.B \-x
+(default) sets the justification according to whether left-to-right or
+right-to-left text is selected. Left-to-right text will be flush-left,
+while right-to-left text will be flush-right. (Left-to-right versus
+right-to-left text is controlled by
+.BR \-L ,
+.B \-R
+and
+.BR \-X .)
+
+.TP
+.B \-t
+.PD 0
+.TP
+.BI \-w \ outputwidth
+.PD
+These options control the
+.IR outputwidth ,
+or the screen width
+.B FIGlet
+assumes when formatting its output.
+.B FIGlet
+uses the
+.I outputwidth
+to determine when to break lines and how to center
+the output. Normally,
+.B FIGlet
+assumes 80 columns so that people with wide terminals
+won't annoy the people they e-mail
+.B FIGlet
+output to.
+.B \-t
+sets the
+.I outputwidth
+to the terminal width. If the terminal width cannot be determined,
+the previous
+.I outputwidth
+is retained.
+.B \-w
+sets the
+.I outputwidth
+to the given integer. An
+.I outputwidth
+of 1 is a special value that tells
+.B FIGlet
+to print each non-space FIGcharacter, in its entirety, on a separate line,
+no matter how wide it is.
+
+.TP
+.B \-p
+.PD 0
+.TP
+.B \-n
+.PD
+These options control how
+.B FIGlet
+handles newlines.
+.B \-p
+puts
+.B FIGlet
+into ``paragraph mode'', which eliminates some unnecessary line
+breaks when piping a multi-line file through
+.BR FIGlet .
+In paragraph mode,
+.B FIGlet
+treats line breaks within a paragraph as if they were merely blanks
+between words. (Specifically,
+.B \-p
+causes
+.B FIGlet
+to convert any newline which is not preceded by a newline and not
+followed by a space character into a blank.)
+.B \-n
+(default) puts
+.B FIGlet
+back to normal, in which every newline
+.B FIGlet
+reads causes it to produce a line break.
+
+.TP
+.B \-D
+.PD 0
+.TP
+.B \-E
+.PD
+.B \-D
+switches to the German (ISO 646-DE) character set. Turns `[', `\e'
+and `]' into umlauted A, O and U, respectively. `{', `|' and `}' turn
+into the respective lower case versions of these. `~' turns into s-z.
+.B \-E
+turns off
+.B \-D
+processing.
+These options are deprecated,
+which means they probably will not appear
+in the next version of
+.BR FIGlet .
+
+.TP
+.BI \-C \ controlfile
+.PD 0
+.TP
+.B \-N
+.PD
+These options deal with
+.B FIGlet
+.IR controlfiles .
+A
+.I controlfile
+is a file containing a list of commands that
+.B FIGlet
+executes each time it reads a character. These commands can map certain
+input characters to other characters, similar to the Unix
+.B tr
+command or the
+.B FIGlet
+.B \-D
+option.
+.B FIGlet
+maintains a list of
+.IR controlfiles ,
+which is empty when
+.B FIGlet
+starts up.
+.B \-C
+adds the given
+.I controlfile
+to the list.
+.B \-N
+clears the
+.I controlfile
+list, cancelling the effect of any previous
+.BR \-C .
+.B FIGlet
+executes the commands in all
+.I controlfiles
+in the list. See
+the file
+.IR figfont.txt ,
+provided with FIGlet,
+for details on how to write a
+.IR controlfile .
+
+.TP
+.B \-s
+.PD 0
+.TP
+.B \-S
+.PD 0
+.TP
+.B \-k
+.PD 0
+.TP
+.B \-W
+.PD
+.TP
+.B \-o
+.PD
+These options control how
+.B FIGlet
+spaces the FIGcharacters that it outputs.
+.B \-s
+(default) and
+.B \-S
+cause ``smushing''.
+The FIGcharacters are displayed
+as close together as possible,
+and overlapping sub-characters are removed.
+Exactly which sub-characters count as ``overlapping''
+depends on the font's
+.IR layoutmode ,
+which is defined by the font's author.
+.B \-k
+causes ``kerning''. As many blanks as possible are
+removed between FIGcharacters, so that they
+touch, but the FIGcharacters are not smushed.
+.B \-W
+makes
+.B FIGlet
+display all FIGcharacters at their full width,
+which may be fixed or variable, depending on the font.
+
+The difference between
+.B \-s
+and
+.B \-S
+is that
+.B \-s
+will not smush a font whose author specified
+kerning or full width as the default
+.IR layoutmode ,
+whereas
+.B \-S
+will attempt to do so.
+
+If there is no information in the font
+about how to smush,
+or if the
+.B \-o
+option is specified,
+then the FIGcharacters are ``overlapped''.
+This means that after kerning,
+the first subcharacter of
+each FIGcharacter is removed.
+(This is not done if a FIGcharacter
+contains only one subcharacter.)
+
+.TP
+.BI \-m \ layoutmode
+Specifies an explicit
+.I layoutmode
+between
+.B 1
+and
+.BR 63 .
+.I Smushmodes
+are explained in
+.IR figfont.txt ,
+which also provides complete information
+on the format of a
+.B FIGlet
+font.
+For the sake of backward compatibility
+with versions of
+.B FIGlet
+before 2.2,
+.B \-m0
+is equivalent to
+.BR \-k ,
+.B \-m-1
+is equivalent to
+.BR \-W ,
+and
+.B \-m-2
+is equivalent to
+.BR \-s .
+The
+.B \-m
+switch is normally
+used only by font designers testing the various
+.I layoutmodes
+with a new font.
+
+.TP
+.B \-v
+.PD 0
+.TP
+.BI \-I \ infocode
+.PD
+These options print various information about
+.BR FIGlet ,
+then exit. If several of these options are given on the command line, only
+the last is executed, and only after
+all other command-line options have been dealt with.
+
+.B \-v
+prints version and copyright information, as well as a ``Usage: ...''
+line.
+.B \-I
+prints the information corresponding to the given
+.I infocode
+in a consistent, reliable (i.e., guaranteed to be the same in
+future releases) format.
+.B \-I
+is primarily intended to be used by programs that use
+.BR FIGlet .
+.I infocode
+can be any of the following.
+.RS
+.TP
+.BR -1 " Normal operation (default)."
+This
+.I infocode
+indicates that
+.B FIGlet
+should operate normally, not giving any informational printout,
+printing its input in the selected font.
+.TP
+.BR 0 " Version and copyright."
+This is identical to
+.BR \-v .
+.TP
+.BR 1 " Version (integer)."
+This will print the version of your copy of
+.B FIGlet
+as a decimal integer. The main version number is multiplied by 10000,
+the sub-version number is multiplied by 100, and the sub-sub-version
+number is multiplied by 1. These are added together, and the result is
+printed out. For example,
+.B FIGlet
+2.2 will print
+.RB `` 20200 ''
+, version 2.2.1 will print
+.RB `` 20201 ''.
+Similarly, version 3.7.2 would print
+.RB `` 30702 ''.
+These numbers are guaranteed to be
+ascending, with later versions having higher numbers. Note that
+the first major release of
+.BR FIGlet ,
+version 2.0, did not have the
+.B \-I
+option.
+.TP
+.BR 2 " Default font directory."
+This will print the default font directory. It is affected by the
+.B \-d
+option.
+.TP
+.BR 3 " Font."
+This will print the name of the font
+.B FIGlet
+would use. It is affected by
+the
+.B \-f
+option.
+This is not a filename; the
+.RB `` .flf ''
+suffix is not printed.
+.TP
+.BR 4 " Output width."
+This will print the value
+.B FIGlet
+would use for
+.IR outputwidth ,
+the number of columns wide
+.B FIGlet
+assumes the screen is.
+It is affected by the
+.B \-w
+and
+.B \-t
+options.
+.TP
+.BR 5 " Supported font formats."
+This will list font formats supported by
+.B FIGlet .
+Possible formats are
+.RB `` flf2 ''
+for FIGfont Version 2
+.B .flf
+files and
+.RB `` tlf2 ''
+for TOIlet
+.B .tlf
+files.
+.RE
+.IP
+If
+.I infocode
+is any other positive value,
+.B FIGlet
+will simply exit without printing anything.
+
+.TP
+.B \-L
+.PD 0
+.TP
+.B \-R
+.PD 0
+.TP
+.B \-X
+.PD
+These options control whether
+.B FIGlet
+prints left-to-right or right-to-left.
+.B \-L
+selects left-to-right printing.
+.B \-R
+selects right-to-left printing.
+.B \-X
+(default) makes
+.B FIGlet
+use whichever is specified in the font file.
+
+Once the options are read,
+if there are any remaining words on the command line,
+they are used instead
+of standard input as the source of text.
+This feature
+allows shell scripts to generate large letters without having to dummy
+up standard input files.
+
+An empty argument, obtained by two sequential quotes,
+results in a line break.
+
+.SH EXAMPLES
+To use
+.B FIGlet
+with its default settings, simply type
+.RS
+.nf
+.ft B
+
+example% figlet
+
+.ft R
+.fi
+.RE
+and then type whatever you like.
+
+To change the font, use the
+.B \-f
+option, for example,
+.RS
+.nf
+.ft B
+
+example% figlet \-f script
+
+.ft R
+.fi
+.RE
+
+Use the
+.B \-c
+option if you would prefer centered output:
+.RS
+.nf
+.ft B
+
+example% figlet \-c
+
+.ft R
+.fi
+.RE
+
+We have found that the most common use of
+.B FIGlet
+is making up large text to be placed in e-mail messages. For this
+reason,
+.B FIGlet
+defaults to 80 column output. If you are using a wider terminal, and
+would like
+.B FIGlet
+to use the full width of your terminal, use the
+.B \-t
+option:
+.RS
+.nf
+.ft B
+
+example% figlet \-t
+
+.ft R
+.fi
+.RE
+
+If you don't want
+.B FIGlet
+to smush FIGcharacters into each other, use the
+.B \-k
+option:
+.RS
+.nf
+.ft B
+
+example% figlet \-k
+
+.ft R
+.fi
+.RE
+
+If
+.B figlet
+gets its input from a file, it is often a good idea to use
+.BR \-p :
+.RS
+.nf
+.ft B
+
+example% figlet \-p < myfile
+
+.ft R
+.fi
+.RE
+
+Of course, the above can be combined:
+.RS
+.nf
+.ft B
+
+example% figlet \-ptk \-f shadow < anotherfile
+example% figlet \-cf slant
+
+.ft R
+.fi
+.RE
+
+Finally, if you want to have
+.B FIGlet
+take the input from the command
+line instead of a file:
+.RS
+.nf
+.ft B
+
+example% figlet Hello world
+
+.ft R
+.fi
+.RE
+
+.SS Other Things to Try
+On many systems nice effects can be obtained from the
+.B lean
+font by piping it through
+.BR tr .
+Some you might want to try are the following:
+
+.RS
+.nf
+.ft B
+example% figlet \-f lean | tr ' _/' ' ()'
+example% figlet \-f lean | tr ' _/' './\e\e'
+example% figlet \-f lean | tr ' _/' ' //'
+example% figlet \-f lean | tr ' _/' '/ '
+.ft R
+.fi
+.RE
+
+Similar things can be done with the
+.B block
+font and many of the other
+.B FIGlet
+fonts.
+
+.SH COMPRESSED FONTS
+You can compress the fonts and controlfiles
+using the
+.B zip
+archiving program.
+Place only one font or controlfile in each archive,
+and rename the archive file (which will have a name
+ending in
+.BR .zip )
+back to
+.B .flf
+or
+.B .flc
+as the case may be.
+If you don't rename the file appropriately,
+.B FIGlet
+won't be able to find it.
+
+.B FIGlet
+does not care what the filename within the
+.B .zip
+archive is, and will process only the first file.
+
+The
+.B .zip
+format was chosen because tools to create and manipulate it
+are widely available for free
+on many platforms.
+
+.SH THE STANDARD FONTS
+
+Here are a few notes about some of the fonts provided with
+.IR FIGlet .
+You can get many other font from the Web site
+.br
+http://www.figlet.org/ This location
+should also contain the latest version of
+.B FIGlet
+and other related utilities.
+
+The font
+.I standard
+is the basic
+.B FIGlet
+font, used when no other font is specified.
+(This default can be changed when
+.B FIGlet
+is compiled on your system.)
+The
+.I controlfiles
+.IR 8859-2 ,
+.IR 8859-3 ,
+.IR 8859-4 ,
+and
+.I 8859-9
+are provided for interpreting those character sets,
+also known as ISO Latin-2 through Latin-5 respectively.
+The character set 8859-1 (ISO Latin-1) is
+.B FIGlet's
+default and requires no special
+.IR controlfile .
+
+Closely related are the fonts
+.IR slant ,
+.IR shadow ,
+.IR small ,
+.I smslant
+(both small and slanted),
+.IR smshadow ,
+(both small and shadowed),
+and
+.IR big .
+These fonts support only Latin-1, except that
+.I big
+supports Greek FIGcharacters as well;
+the
+.I controlfiles
+.I frango
+(for Greek text written in Latin characters, so-called
+.RI `` frangovlakhika ''),
+and
+.I 8859-7
+(for mixed Latin/Greek text)
+are provided.
+
+The
+.I ivrit
+font is a right-to-left font
+including both Latin and Hebrew FIGcharacters;
+the Latin characters are those of the
+.I standard
+font.
+The available
+.I controlfiles
+are
+.IR ilhebrew ,
+which maps the letters you get
+by typing on a U.S. keyboard
+as if it were a Hebrew keyboard;
+.IR ushebrew ,
+which makes a reasonable mapping from
+Latin letters to Hebrew ones;
+and
+.IR 8859-8 ,
+which supports mixed Latin/Hebrew text.
+.B Warning:
+.B FIGlet
+doesn't support bidirectional text,
+so everything will come out right-to-left,
+even Latin letters.
+
+The fonts
+.IR terminal ,
+.IR digital ,
+and
+.I bubble
+output the input character with some decoration around it
+(or no decoration,
+in the case of
+.IR terminal ).
+The characters coded 128 to 159,
+which have varying interpretations, are output as-is.
+You can use the appropriate
+.I controlfiles
+to process Latin-2, Latin-3, or Latin-4 (but not Latin-5) text,
+provided your output device
+has screen or printer fonts that
+are appropriate for these character sets.
+
+Two script fonts are available:
+.IR script ,
+which is larger than
+.IR standard ,
+and
+.IR smscript ,
+which is smaller.
+
+The font
+.I lean
+is made up solely of `/' and `_' sub-characters;
+.I block
+is a straight (non-leaning) version of it.
+
+The font
+.I mini
+is very small, and especially suitable for e-mail signatures.
+
+The font
+.I banner
+looks like the output of the
+.B banner
+program;
+it is a capitals and small capitals font
+that doesn't support the ISO Latin-1 extensions
+to plain ASCII.
+It does, however, support the Japanese
+.I katakana
+syllabary;
+the
+.I controlfile
+.I uskata
+maps the upper-case and lower-case Latin letters
+into the 48 basic
+.I katakana
+characters,
+and the
+.I controlfile
+.I jis0201
+handles JIS 0201X (JIS-Roman)
+mixed Latin and
+.I katakana
+text.
+Furthermore, the
+.I banner
+font also supports Cyrillic (Russian)
+FIGcharacters; the
+.I controlfile
+.I 8859-5
+supports mixed Latin and Cyrillic text,
+the
+.I controlfile
+.I koi8r
+supports the popular KOI8-R mapping of mixed text,
+and the
+.I controlfile
+.I moscow
+supports a
+sensible mapping from Latin to Cyrillic,
+compatible with the
+.I moscow
+font (not supplied).
+
+The fonts
+.I mnemonic
+and
+.I safemnem
+support the mnemonic character set
+documented in RFC 1345.
+They implement a large subset of Unicode
+(over 1800 characters) very crudely,
+using ASCII-based mnemonic sequences,
+and are good for getting a quick look
+at UTF-8 unicode files,
+using the controlfile
+.IR utf8 .
+
+.SH ENVIRONMENT
+.TP
+.B FIGLET_FONTDIR
+If
+.RB $ FIGLET_FONTDIR
+is set, its value is used as a path to search for font files.
+
+.SH FILES
+.PD 0
+.TP 20
+.IB file .flf
+.B FIGlet
+font file
+.TP 20
+.IB file .flc
+.B FIGlet
+control file
+.PD
+
+.SH DIAGNOSTICS
+.B FIGlet's
+diagnostics are intended to be self-explanatory. Possible
+messages are
+
+.RS
+.nf
+.ft B
+Usage: ...
+Out of memory
+Unable to open font file
+Not a FIGlet 2 font file
+Unable to open control file
+Not a FIGlet 2 control file
+"\-t" is disabled, since ioctl is not fully implemented.
+.ft R
+.fi
+.RE
+
+This last message is printed when the
+.B \-t
+option is given, but the operating system in use does not include
+the system call
+.B FIGlet
+uses to determine the terminal width.
+
+.B FIGlet
+also prints an explanatory message if the
+.B \-F
+option is given on the command line.
+The earlier version of
+.BR FIGlet ,
+version 2.0, listed the available fonts when the
+.B \-F
+option was given. This option has been removed from
+.B FIGlet
+2.1. It has been replaced by the
+.B figlist
+script, which is part of the standard
+.B FIGlet
+package.
+
+.SH ORIGIN
+.RB `` FIGlet ''
+stands for ``Frank, Ian and Glenn's LETters''. Inspired by Frank's .sig,
+Glenn wrote (most of) it, and Ian helped.
+
+Most of the standard
+.B FIGlet
+fonts were inspired by signatures on various UseNet
+articles. Since typically hundreds of people use the same style of
+letters in their signatures, it was often not deemed necessary to give
+credit to any one font designer.
+
+.SH BUGS
+Very little error checking is done on font and control files. While
+.B FIGlet
+tries to be forgiving of errors, and should (hopefully) never actually
+crash, using an improperly-formatted file with
+.B FIGlet
+will produce unpredictable output.
+
+.B FIGlet
+does not handle format characters in a very intelligent way.
+A tab character is converted to a blank, and vertical-tab, form-feed and
+carriage-return are each converted to a newline. On many systems, tabs
+can be handled better by piping files through
+.B expand
+before piping through
+.BR FIGlet .
+
+.B FIGlet
+output is quite ugly if it is displayed in a proportionally-spaced font.
+I suppose this is to be expected.
+
+Please report any errors you find in this man page or the program to
+
+.SH WEBSITE AND MAILING LIST
+You can get many fonts which are not in the basic
+.B FIGlet
+package from the Web site
+http://www.figlet.org/ It
+should also contain the latest version of
+.B FIGlet
+and other utilities related to
+.BR FIGlet .
+
+There is a mailing list for
+.B FIGlet
+for general discussions about
+.B FIGlet
+and a place where you can ask questions or share ideas
+with other
+.B FIGlet
+users. It is also the place where we will publish
+news about new fonts, new software updates etc.
+
+To subscribe or unsubscribe from the
+.B FIGlet
+mailing list,
+please send email to figlet-subscribe@figlet.org or figlet-unsubscribe@figlet.org or visit the
+following web page: http://www.figlet.org/mailman/listinfo/figlet
+
+.SH AUTHORS
+Glenn Chappell did most of the work.
+You can e-mail him but he is not an e-mail fanatic; people who e-mail
+Glenn will probably get answers, but if you e-mail his best friend:
+
+Ian Chai, who
+.I is
+an e-mail fanatic, you'll get answers, endless conversation about the
+mysteries of life, invitations to join some 473 mailing lists and a
+free toaster. (Well, ok, maybe not the free toaster.)
+
+Frank inspired this whole project with his .sig, but don't e-mail
+him; he's decidedly an un-e-mail-fanatic.
+
+Gilbert "The Mad Programmer" Healton added the
+.B \-A
+option for version 2.1.1. This option specified input from
+the command line; it is still allowed,
+but has no effect.
+
+John Cowan added the
+.BR \-o ,
+.BR \-s ,
+.BR \-k ,
+.BR \-S ,
+and
+.B \-W
+options, and
+the support for Unicode mapping tables,
+ISO 2022/HZ/Shift-JIS/UTF-8 input,
+and compressed fonts
+and control files.
+He also revised this documentation,
+with a lot of input from
+Paul Burton.
+
+Claudio Matsuoka added the support for
+.B .tlf
+files for version 2.2.4 and performs random hacks and bugfixes.
+
+As a fan of FIGlet, Christiaan Keet revised the official FIGlet documentation
+and set up the new FIGlet website at http://www.figlet.org/ (and the
+corresponding ftp://ftp.figlet.org/pub/figlet/)
+
+.SH SEE ALSO
+.BR figlist (6),
+.BR chkfont (6),
+.BR showfigfonts (6),
+.BR toilet (1)
diff --git a/externals/figlet/figlet.c b/externals/figlet/figlet.c
new file mode 100644
index 0000000000..d34b19a8b8
--- /dev/null
+++ b/externals/figlet/figlet.c
@@ -0,0 +1,2131 @@
+/****************************************************************************
+
+ FIGlet Copyright 1991, 1993, 1994 Glenn Chappell and Ian Chai
+ FIGlet Copyright 1996, 1997, 1998, 1999, 2000, 2001 John Cowan
+ FIGlet Copyright 2002 Christiaan Keet
+ FIGlet Copyright 2011, 2012 Claudio Matsuoka
+ Portions written by Paul Burton and Christiaan Keet
+ Internet:
+ FIGlet, along with the various FIGlet fonts and documentation, is
+ copyrighted under the provisions of the New BSD License (3-clause)
+ (as listed in the file "LICENSE" which is included in this package)
+****************************************************************************/
+
+#define DATE "31 May 2012"
+#define VERSION "2.2.5"
+#define VERSION_INT 20205
+
+/* FIGlet (Frank, Ian & Glenn's Letters) */
+/* by Glenn Chappell */
+/* Apr 1991 */
+/* Automatic file addition by Ian Chai May 1991 */
+/* Punctuation and numbers addition by Ian Chai Jan 1993 */
+/* Full ASCII by Glenn Chappell Feb 1993 */
+/* Line-breaking, general rewrite by Glenn Chappell Mar 1993 */
+/* Hard blanks by Glenn Chappell Apr 1993 */
+/* Release 2.0 5 Aug 1993 */
+/* Right-to-left printing, extended char set by Glenn Chappell Dec 1993 */
+/* Control files by Glenn Chappell Feb 1994 */
+/* Release 2.1 12 Aug 1994 */
+/* Release 2.1.1 25 Aug 1994 */
+/* Release 2.1.2 by Gilbert (Mad Programmer) Healton: Add -A command line
+ option. Sept 8, 1996 */
+/* Release 2.2 by John Cowan: multibyte inputs, compressed fonts,
+ mapping tables, kerning/smushing options. */
+/* Release 2.2.1 by Christiaan Keet: minor updates including readmes
+ FAQs and comments. 13 July 2002. The new official FIGlet website is
+ http://www.figlet.org/ */
+/* Release 2.2.2 by Christiaan Keet: License changed from "Artistic License"
+ to "Academic Free License" as agreed by FIGlet authors. 05 July 2005 */
+/* Release 2.2.3 by Claudio Matsuoka, 12 Jan 2011: BSD license, fixes */
+/* Release 2.2.4 by Claudio Matsuoka, 26 Jan 2011: tlf2 font support */
+/* Release 2.2.5 by Claudio Matsuoka, 31 May 2012: flc licensing, minor fixes */
+
+/*---------------------------------------------------------------------------
+ DEFAULTFONTDIR and DEFAULTFONTFILE should be defined in the Makefile.
+ DEFAULTFONTDIR is the full path name of the directory in which FIGlet
+ will search first for fonts (the ".flf" files).
+ DEFAULTFONTFILE is the filename of the font to be used if no other
+ is specified (standard.flf is recommended, but any other can be
+ used). This file should reside in the directory specified by
+ DEFAULTFONTDIR.
+---------------------------------------------------------------------------*/
+#ifndef DEFAULTFONTDIR
+#define DEFAULTFONTDIR "fonts"
+#endif
+#ifndef DEFAULTFONTFILE
+#define DEFAULTFONTFILE "standard.flf"
+#endif
+
+#include
+#ifdef __STDC__
+#include
+#endif
+#include
+#include
+#include
+#include /* Needed for get_columns */
+
+#if defined(unix) || defined(__unix__) || defined(__APPLE__)
+#include
+#include /* Needed for get_columns */
+#endif
+
+#ifdef TLF_FONTS
+#include
+#include
+#include "utf8.h"
+#endif
+
+#include "zipio.h" /* Package for reading compressed files */
+
+#define MYSTRLEN(x) ((int)strlen(x)) /* Eliminate ANSI problem */
+
+#define DIRSEP '/'
+#define DIRSEP2 '\\'
+/* Leave alone for Unix and MS-DOS/Windows!
+Note: '/' also used in filename in get_columns(). */
+
+#define FONTFILESUFFIX ".flf"
+#define FONTFILEMAGICNUMBER "flf2"
+#define FSUFFIXLEN MYSTRLEN(FONTFILESUFFIX)
+#define CONTROLFILESUFFIX ".flc"
+#define CONTROLFILEMAGICNUMBER "flc2" /* no longer used in 2.2 */
+#define CSUFFIXLEN MYSTRLEN(CONTROLFILESUFFIX)
+#define DEFAULTCOLUMNS 80
+#define MAXLEN 255 /* Maximum character width */
+
+/* Add support for Sam Hocevar's TOIlet fonts */
+#ifdef TLF_FONTS
+#define TOILETFILESUFFIX ".tlf"
+#define TOILETFILEMAGICNUMBER "tlf2"
+#define TSUFFIXLEN MYSTRLEN(TOILETFILESUFFIX)
+
+int toiletfont; /* true if font is a TOIlet TLF font */
+#endif
+
+
+/****************************************************************************
+
+ Globals dealing with chars that are read
+
+****************************************************************************/
+
+typedef long inchr; /* "char" read from stdin */
+
+inchr *inchrline; /* Alloc'd inchr inchrline[inchrlinelenlimit+1]; */
+ /* Note: not null-terminated. */
+int inchrlinelen,inchrlinelenlimit;
+inchr deutsch[7] = {196, 214, 220, 228, 246, 252, 223};
+ /* Latin-1 codes for German letters, respectively:
+ LATIN CAPITAL LETTER A WITH DIAERESIS = A-umlaut
+ LATIN CAPITAL LETTER O WITH DIAERESIS = O-umlaut
+ LATIN CAPITAL LETTER U WITH DIAERESIS = U-umlaut
+ LATIN SMALL LETTER A WITH DIAERESIS = a-umlaut
+ LATIN SMALL LETTER O WITH DIAERESIS = o-umlaut
+ LATIN SMALL LETTER U WITH DIAERESIS = u-umlaut
+ LATIN SMALL LETTER SHARP S = ess-zed
+ */
+
+int hzmode; /* true if reading double-bytes in HZ mode */
+int gndbl[4]; /* gndbl[n] is true if Gn is double-byte */
+inchr gn[4]; /* Gn character sets: ASCII, Latin-1, none, none */
+int gl; /* 0-3 specifies left-half Gn character set */
+int gr; /* 0-3 specifies right-half Gn character set */
+
+int Myargc; /* to avoid passing around argc and argv */
+char **Myargv;
+
+/****************************************************************************
+
+ Globals dealing with chars that are written
+
+****************************************************************************/
+
+#ifdef TLF_FONTS
+typedef wchar_t outchr; /* "char" written to stdout */
+#define STRLEN(x) wcslen(x)
+#define STRCPY(x,y) wcscpy((x),(y))
+#define STRCAT(x,y) wcscat((x),(y))
+#define ISSPACE(x) iswspace(x)
+#else
+typedef char outchr; /* "char" written to stdout */
+#define STRLEN(x) MYSTRLEN(x)
+#define STRCPY(x,y) strcpy((x),(y))
+#define STRCAT(x,y) strcat((x),(y))
+#define ISSPACE(x) isspace(x)
+#endif
+
+typedef struct fc {
+ inchr ord;
+ outchr **thechar; /* Alloc'd char thechar[charheight][]; */
+ struct fc *next;
+ } fcharnode;
+
+fcharnode *fcharlist;
+outchr **currchar;
+int currcharwidth;
+int previouscharwidth;
+outchr **outputline; /* Alloc'd char outputline[charheight][outlinelenlimit+1]; */
+int outlinelen;
+
+
+/****************************************************************************
+
+ Globals dealing with command file storage
+
+****************************************************************************/
+
+typedef struct cfn {
+ char *thename;
+ struct cfn *next;
+ } cfnamenode;
+
+cfnamenode *cfilelist,**cfilelistend;
+
+typedef struct cm {
+ int thecommand;
+ inchr rangelo;
+ inchr rangehi;
+ inchr offset;
+ struct cm *next;
+ } comnode;
+
+comnode *commandlist,**commandlistend;
+
+/****************************************************************************
+
+ Globals affected by command line options
+
+****************************************************************************/
+
+int deutschflag,justification,paragraphflag,right2left,multibyte;
+int cmdinput;
+
+#define SM_SMUSH 128
+#define SM_KERN 64
+#define SM_EQUAL 1
+#define SM_LOWLINE 2
+#define SM_HIERARCHY 4
+#define SM_PAIR 8
+#define SM_BIGX 16
+#define SM_HARDBLANK 32
+
+int smushmode;
+
+#define SMO_NO 0 /* no command-line smushmode */
+#define SMO_YES 1 /* use command-line smushmode, ignore font smushmode */
+#define SMO_FORCE 2 /* logically OR command-line and font smushmodes */
+
+int smushoverride;
+
+int outputwidth;
+int outlinelenlimit;
+char *fontdirname,*fontname;
+
+
+/****************************************************************************
+
+ Globals read from font file
+
+****************************************************************************/
+
+char hardblank;
+int charheight;
+
+
+/****************************************************************************
+
+ Name of program, used in error messages
+
+****************************************************************************/
+
+char *myname;
+
+
+#ifdef TIOCGWINSZ
+/****************************************************************************
+
+ get_columns
+
+ Determines the number of columns of /dev/tty. Returns the number of
+ columns, or -1 if error. May return 0 if columns unknown.
+ Requires include files and .
+ by Glenn Chappell & Ian Chai 14 Apr 1993
+
+****************************************************************************/
+
+int get_columns()
+{
+ struct winsize ws;
+ int fd,result;
+
+ if ((fd = open("/dev/tty",O_WRONLY))<0) return -1;
+ result = ioctl(fd,TIOCGWINSZ,&ws);
+ close(fd);
+ return result?-1:ws.ws_col;
+}
+#endif /* ifdef TIOCGWINSZ */
+
+
+/****************************************************************************
+
+ myalloc
+
+ Calls malloc. If malloc returns error, prints error message and
+ quits.
+
+****************************************************************************/
+
+#ifdef __STDC__
+char *myalloc(size_t size)
+#else
+char *myalloc(size)
+int size;
+#endif
+{
+ char *ptr;
+#ifndef __STDC__
+ extern void *malloc();
+#endif
+
+ if ((ptr = (char*)malloc(size))==NULL) {
+ fprintf(stderr,"%s: Out of memory\n",myname);
+ exit(1);
+ }
+ else {
+ return ptr;
+ }
+}
+
+
+/****************************************************************************
+
+ hasdirsep
+
+ Returns true if s1 contains a DIRSEP or DIRSEP2 character.
+
+****************************************************************************/
+
+int hasdirsep(s1)
+char *s1;
+{
+ if (strchr(s1, DIRSEP)) return 1;
+ else if (strchr(s1, DIRSEP2)) return 1;
+ else return 0;
+}
+
+/****************************************************************************
+
+ suffixcmp
+
+ Returns true if s2 is a suffix of s1; uses case-blind comparison.
+
+****************************************************************************/
+
+int suffixcmp(s1, s2)
+char *s1;
+char *s2;
+{
+ int len1, len2;
+
+ len1 = MYSTRLEN(s1);
+ len2 = MYSTRLEN(s2);
+ if (len2 > len1) return 0;
+ s1 += len1 - len2;
+ while (*s1) {
+ if (tolower(*s1) != tolower(*s2)) return 0;
+ s1++;
+ s2++;
+ }
+ return 1;
+}
+
+/****************************************************************************
+
+ skiptoeol
+
+ Skips to the end of a line, given a stream. Handles \r, \n, or \r\n.
+
+****************************************************************************/
+
+void skiptoeol(fp)
+ZFILE *fp;
+{
+ int dummy;
+
+ while (dummy=Zgetc(fp),dummy!=EOF) {
+ if (dummy == '\n') return;
+ if (dummy == '\r') {
+ dummy = Zgetc(fp);
+ if (dummy != EOF && dummy != '\n') Zungetc(dummy,fp);
+ return;
+ }
+ }
+}
+
+
+/****************************************************************************
+
+ myfgets
+
+ Local version of fgets. Handles \r, \n, and \r\n terminators.
+
+****************************************************************************/
+
+char *myfgets(line,maxlen,fp)
+char *line;
+int maxlen;
+ZFILE *fp;
+{
+ int c = 0;
+ char *p;
+
+ p = line;
+ while((c=Zgetc(fp))!=EOF&&maxlen) {
+ *p++ = c;
+ maxlen--;
+ if (c=='\n') break;
+ if (c=='\r') {
+ c = Zgetc(fp);
+ if (c != EOF && c != '\n') Zungetc(c,fp);
+ *(p-1) = '\n';
+ break;
+ }
+ }
+ *p = 0;
+ return (c==EOF) ? NULL : line;
+}
+
+
+/****************************************************************************
+
+ usageerr
+
+ Prints "Usage: ...." line to the given stream.
+
+****************************************************************************/
+
+void printusage(out)
+FILE *out;
+{
+ fprintf(out,
+ "Usage: %s [ -cklnoprstvxDELNRSWX ] [ -d fontdirectory ]\n",
+ myname);
+ fprintf(out,
+ " [ -f fontfile ] [ -m smushmode ] [ -w outputwidth ]\n");
+ fprintf(out,
+ " [ -C controlfile ] [ -I infocode ] [ message ]\n");
+}
+
+
+/****************************************************************************
+
+ printinfo
+
+ Prints version and copyright message, or utility information.
+
+****************************************************************************/
+
+void printinfo(infonum)
+int infonum;
+{
+ switch (infonum) {
+ case 0: /* Copyright message */
+ printf("FIGlet Copyright (C) 1991-2012 Glenn Chappell, Ian Chai, ");
+ printf("John Cowan,\nChristiaan Keet and Claudio Matsuoka\n");
+ printf("Internet: ");
+ printf("Version: %s, date: %s\n\n",VERSION,DATE);
+ printf("FIGlet, along with the various FIGlet fonts");
+ printf(" and documentation, may be\n");
+ printf("freely copied and distributed.\n\n");
+ printf("If you use FIGlet, please send an");
+ printf(" e-mail message to .\n\n");
+ printf("The latest version of FIGlet is available from the");
+ printf(" web site,\n\thttp://www.figlet.org/\n\n");
+ printusage(stdout);
+ break;
+ case 1: /* Version (integer) */
+ printf("%d\n",VERSION_INT);
+ break;
+ case 2: /* Font directory */
+ printf("%s\n",fontdirname);
+ break;
+ case 3: /* Font */
+ printf("%s\n",fontname);
+ break;
+ case 4: /* Outputwidth */
+ printf("%d\n",outputwidth);
+ break;
+ case 5: /* Font formats */
+ printf("%s", FONTFILEMAGICNUMBER);
+#ifdef TLF_FONTS
+ printf(" %s", TOILETFILEMAGICNUMBER);
+#endif
+ printf("\n");
+ }
+}
+
+
+/****************************************************************************
+
+ readmagic
+
+ Reads a four-character magic string from a stream.
+
+****************************************************************************/
+void readmagic(fp,magic)
+ZFILE *fp;
+char *magic;
+{
+ int i;
+
+ for (i=0;i<4;i++) {
+ magic[i] = Zgetc(fp);
+ }
+ magic[4] = 0;
+ }
+
+/****************************************************************************
+
+ skipws
+
+ Skips whitespace characters from a stream.
+
+****************************************************************************/
+void skipws(fp)
+ZFILE *fp;
+{
+ int c;
+ while (c=Zgetc(fp),isascii(c)&&isspace(c)) ;
+ Zungetc(c,fp);
+ }
+
+/****************************************************************************
+
+ readnum
+
+ Reads a number from a stream. Accepts "0" prefix for octal and
+ "0x" or "0X" for hexadecimal. Ignores leading whitespace.
+
+****************************************************************************/
+void readnum(fp,nump)
+ZFILE *fp;
+inchr *nump;
+{
+ int acc = 0;
+ char *p;
+ int c;
+ int base;
+ int sign = 1;
+ char digits[] = "0123456789ABCDEF";
+
+ skipws(fp);
+ c = Zgetc(fp);
+ if (c=='-') {
+ sign = -1;
+ }
+ else {
+ Zungetc(c,fp);
+ }
+ c = Zgetc(fp);
+ if (c=='0') {
+ c = Zgetc(fp);
+ if (c=='x'||c=='X') {
+ base = 16;
+ }
+ else {
+ base = 8;
+ Zungetc(c,fp);
+ }
+ }
+ else {
+ base = 10;
+ Zungetc(c,fp);
+ }
+
+ while((c=Zgetc(fp))!=EOF) {
+ c=toupper(c);
+ p=strchr(digits,c);
+ if (!p) {
+ Zungetc(c,fp);
+ *nump = acc * sign;
+ return;
+ }
+ acc = acc*base+(p-digits);
+ }
+ *nump = acc * sign;
+ }
+
+/****************************************************************************
+
+ readTchar
+
+ Reads a control file "T" command character specification.
+
+ Character is a single byte, an escape sequence, or
+ an escaped numeric.
+
+****************************************************************************/
+
+inchr readTchar(fp)
+ZFILE *fp;
+{
+ inchr thechar;
+ char next;
+
+ thechar=Zgetc(fp);
+ if (thechar=='\n' || thechar=='\r') { /* Handle badly-formatted file */
+ Zungetc(thechar,fp);
+ return '\0';
+ }
+ if (thechar!='\\') return thechar;
+ next=Zgetc(fp);
+ switch(next) {
+ case 'a':
+ return 7;
+ case 'b':
+ return 8;
+ case 'e':
+ return 27;
+ case 'f':
+ return 12;
+ case 'n':
+ return 10;
+ case 'r':
+ return 13;
+ case 't':
+ return 9;
+ case 'v':
+ return 11;
+ default:
+ if (next=='-' || next=='x' || (next>='0' && next<='9')) {
+ Zungetc(next,fp);
+ readnum(fp,&thechar);
+ return thechar;
+ }
+ return next;
+ }
+}
+
+/****************************************************************************
+
+ charsetname
+
+ Get a Tchar representing a charset name, or 0 if none available.
+ Called in getcharset().
+
+****************************************************************************/
+
+inchr charsetname(fp)
+ZFILE *fp;
+{
+ inchr result;
+
+ result = readTchar(fp);
+ if (result == '\n' || result == '\r') {
+ result = 0;
+ Zungetc(result,fp);
+ }
+ return result;
+ }
+
+/****************************************************************************
+
+ charset
+
+ Processes "g[0123]" character set specifier
+ Called in readcontrol().
+
+****************************************************************************/
+
+void charset(n, controlfile)
+int n;
+ZFILE *controlfile;
+{
+ int ch;
+
+ skipws(controlfile);
+ if (Zgetc(controlfile) != '9') {
+ skiptoeol(controlfile);
+ return;
+ }
+ ch = Zgetc(controlfile);
+ if (ch == '6') {
+ gn[n] = 65536L * charsetname(controlfile) + 0x80;
+ gndbl[n] = 0;
+ skiptoeol(controlfile);
+ return;
+ }
+ if (ch != '4') {
+ skiptoeol(controlfile);
+ return;
+ }
+ ch = Zgetc(controlfile);
+ if (ch == 'x') {
+ if (Zgetc(controlfile) != '9') {
+ skiptoeol(controlfile);
+ return;
+ }
+ if (Zgetc(controlfile) != '4') {
+ skiptoeol(controlfile);
+ return;
+ }
+ skipws(controlfile);
+ gn[n] = 65536L * charsetname(controlfile);
+ gndbl[n] = 1;
+ skiptoeol(controlfile);
+ return;
+ }
+ Zungetc(ch, controlfile);
+ skipws(controlfile);
+ gn[n] = 65536L * charsetname(controlfile);
+ gndbl[n] = 0;
+ return;
+ }
+
+/****************************************************************************
+
+ FIGopen
+
+ Given a FIGlet font or control file name and suffix, return the file
+ or NULL if not found
+
+****************************************************************************/
+
+ZFILE *FIGopen(name,suffix)
+char *name;
+char *suffix;
+{
+ char *fontpath;
+ ZFILE *fontfile;
+ struct stat st;
+ int namelen;
+
+ namelen = MYSTRLEN(fontdirname);
+ fontpath = (char*)alloca(sizeof(char)*
+ (namelen+MYSTRLEN(name)+MYSTRLEN(suffix)+2));
+ fontfile = NULL;
+ if (!hasdirsep(name)) { /* not a full path name */
+ strcpy(fontpath,fontdirname);
+ fontpath[namelen] = DIRSEP;
+ fontpath[namelen+1] = '\0';
+ strcat(fontpath,name);
+ strcat(fontpath,suffix);
+ if(stat(fontpath,&st)==0) goto ok;
+ }
+ /* just append suffix */
+ strcpy(fontpath,name);
+ strcat(fontpath,suffix);
+ if(stat(fontpath,&st)==0) goto ok;
+
+ return NULL;
+
+ok:
+ fontfile = Zopen(fontpath,"rb");
+ return fontfile;
+}
+
+/****************************************************************************
+
+ readcontrol
+
+ Allocates memory and reads in the given control file.
+ Called in readcontrolfiles().
+
+****************************************************************************/
+
+void readcontrol(controlname)
+char *controlname;
+{
+ inchr firstch,lastch;
+ char dashcheck;
+ inchr offset;
+ int command;
+ ZFILE *controlfile;
+
+ controlfile = FIGopen(controlname,CONTROLFILESUFFIX);
+
+ if (controlfile==NULL) {
+ fprintf(stderr,"%s: %s: Unable to open control file\n",myname,
+ controlname);
+ exit(1);
+ }
+
+ (*commandlistend) = (comnode*)myalloc(sizeof(comnode));
+ (*commandlistend)->thecommand = 0; /* Begin with a freeze command */
+ commandlistend = &(*commandlistend)->next;
+ (*commandlistend) = NULL;
+
+ while(command=Zgetc(controlfile),command!=EOF) {
+ switch (command) {
+ case 't': /* Translate */
+ skipws(controlfile);
+ firstch=readTchar(controlfile);
+ if ((dashcheck=Zgetc(controlfile))=='-') {
+ lastch=readTchar(controlfile);
+ }
+ else {
+ Zungetc(dashcheck,controlfile);
+ lastch=firstch;
+ }
+ skipws(controlfile);
+ offset=readTchar(controlfile)-firstch;
+ skiptoeol(controlfile);
+ (*commandlistend) = (comnode*)myalloc(sizeof(comnode));
+ (*commandlistend)->thecommand = 1;
+ (*commandlistend)->rangelo = firstch;
+ (*commandlistend)->rangehi = lastch;
+ (*commandlistend)->offset = offset;
+ commandlistend = &(*commandlistend)->next;
+ (*commandlistend) = NULL;
+ break;
+ case '0': case '1': case '2': case '3': case '4':
+ case '5': case '6': case '7': case '8': case '9':
+ case '-':
+ /* Mapping table entry */
+ Zungetc(command,controlfile);
+ readnum(controlfile,&firstch);
+ skipws(controlfile);
+ readnum(controlfile,&lastch);
+ offset=lastch-firstch;
+ lastch=firstch;
+ skiptoeol(controlfile);
+ (*commandlistend) = (comnode*)myalloc(sizeof(comnode));
+ (*commandlistend)->thecommand = 1;
+ (*commandlistend)->rangelo = firstch;
+ (*commandlistend)->rangehi = lastch;
+ (*commandlistend)->offset = offset;
+ commandlistend = &(*commandlistend)->next;
+ (*commandlistend) = NULL;
+ break;
+ case 'f': /* freeze */
+ skiptoeol(controlfile);
+ (*commandlistend) = (comnode*)myalloc(sizeof(comnode));
+ (*commandlistend)->thecommand = 0;
+ commandlistend = &(*commandlistend)->next;
+ (*commandlistend) = NULL;
+ break;
+ case 'b': /* DBCS input mode */
+ multibyte = 1;
+ break;
+ case 'u': /* UTF-8 input mode */
+ multibyte = 2;
+ break;
+ case 'h': /* HZ input mode */
+ multibyte = 3;
+ break;
+ case 'j': /* Shift-JIS input mode */
+ multibyte = 4;
+ break;
+ case 'g': /* ISO 2022 character set choices */
+ multibyte = 0;
+ skipws(controlfile);
+ command=Zgetc(controlfile);
+ switch (command) {
+ case '0': /* define G0 charset */
+ charset(0, controlfile);
+ break;
+ case '1': /* set G1 charset */
+ charset(1, controlfile);
+ break;
+ case '2': /* set G2 charset */
+ charset(2, controlfile);
+ break;
+ case '3': /* set G3 charset */
+ charset(3, controlfile);
+ break;
+ case 'l': case 'L': /* define left half */
+ skipws(controlfile);
+ gl = Zgetc(controlfile) - '0';
+ skiptoeol(controlfile);
+ break;
+ case 'r': case 'R': /* define right half */
+ skipws(controlfile);
+ gr = Zgetc(controlfile) - '0';
+ skiptoeol(controlfile);
+ break;
+ default: /* meaningless "g" command */
+ skiptoeol(controlfile);
+ }
+ case '\r': case '\n': /* blank line */
+ break;
+ default: /* Includes '#' */
+ skiptoeol(controlfile);
+ }
+ }
+ Zclose(controlfile);
+}
+
+
+/****************************************************************************
+
+ readcontrolfiles
+
+ Reads in the controlfiles names in cfilelist. Uses readcontrol.
+ Called in main().
+
+****************************************************************************/
+
+void readcontrolfiles()
+{
+ cfnamenode *cfnptr;
+
+ for (cfnptr=cfilelist;cfnptr!=NULL;cfnptr=cfnptr->next) {
+ readcontrol(cfnptr->thename);
+ }
+}
+
+
+/****************************************************************************
+
+ clearcfilelist
+
+ Clears the control file list. Assumes thename does not need freeing.
+
+****************************************************************************/
+
+void clearcfilelist()
+{
+ cfnamenode *cfnptr1,*cfnptr2;
+
+ cfnptr1 = cfilelist;
+ while (cfnptr1 != NULL) {
+ cfnptr2 = cfnptr1->next;
+ free(cfnptr1);
+ cfnptr1 = cfnptr2;
+ }
+ cfilelist = NULL;
+ cfilelistend = &cfilelist;
+}
+
+
+/****************************************************************************
+
+ getparams
+
+ Handles all command-line parameters. Puts all parameters within
+ bounds.
+
+****************************************************************************/
+
+void getparams()
+{
+ extern char *optarg;
+ extern int optind;
+ int c; /* "Should" be a char -- need int for "!= -1" test*/
+ int columns,infoprint;
+ char *controlname,*env;
+
+ if ((myname = strrchr(Myargv[0],DIRSEP))!=NULL) {
+ myname++;
+ }
+ else {
+ myname = Myargv[0];
+ }
+ fontdirname = DEFAULTFONTDIR;
+ env = getenv("FIGLET_FONTDIR");
+ if (env!=NULL) {
+ fontdirname = env;
+ }
+ fontname = DEFAULTFONTFILE;
+ cfilelist = NULL;
+ cfilelistend = &cfilelist;
+ commandlist = NULL;
+ commandlistend = &commandlist;
+ smushoverride = SMO_NO;
+ deutschflag = 0;
+ justification = -1;
+ right2left = -1;
+ paragraphflag = 0;
+ infoprint = -1;
+ cmdinput = 0;
+ outputwidth = DEFAULTCOLUMNS;
+ gn[1] = 0x80;
+ gr = 1;
+ while ((c = getopt(Myargc,Myargv,"ADEXLRI:xlcrpntvm:w:d:f:C:NFskSWo"))!= -1) {
+ /* Note: -F is not a legal option -- prints a special err message. */
+ switch (c) {
+ case 'A':
+ cmdinput = 1;
+ break;
+ case 'D':
+ deutschflag = 1;
+ break;
+ case 'E':
+ deutschflag = 0;
+ break;
+ case 'X':
+ right2left = -1;
+ break;
+ case 'L':
+ right2left = 0;
+ break;
+ case 'R':
+ right2left = 1;
+ break;
+ case 'x':
+ justification = -1;
+ break;
+ case 'l':
+ justification = 0;
+ break;
+ case 'c':
+ justification = 1;
+ break;
+ case 'r':
+ justification = 2;
+ break;
+ case 'p':
+ paragraphflag = 1;
+ break;
+ case 'n':
+ paragraphflag = 0;
+ break;
+ case 's':
+ smushoverride = SMO_NO;
+ break;
+ case 'k':
+ smushmode = SM_KERN;
+ smushoverride = SMO_YES;
+ break;
+ case 'S':
+ smushmode = SM_SMUSH;
+ smushoverride = SMO_FORCE;
+ break;
+ case 'o':
+ smushmode = SM_SMUSH;
+ smushoverride = SMO_YES;
+ break;
+ case 'W':
+ smushmode = 0;
+ smushoverride = SMO_YES;
+ break;
+ case 't':
+#ifdef TIOCGWINSZ
+ columns = get_columns();
+ if (columns>0) {
+ outputwidth = columns;
+ }
+#else /* ifdef TIOCGWINSZ */
+ fprintf(stderr,
+ "%s: \"-t\" is disabled, since ioctl is not fully implemented.\n",
+ myname);
+#endif /* ifdef TIOCGWINSZ */
+ break;
+ case 'v':
+ infoprint = 0;
+ break;
+ case 'I':
+ infoprint = atoi(optarg);
+ break;
+ case 'm':
+ smushmode = atoi(optarg);
+ if (smushmode < -1) {
+ smushoverride = SMO_NO;
+ break;
+ }
+ if (smushmode == 0) smushmode = SM_KERN;
+ else if (smushmode == -1) smushmode = 0;
+ else smushmode = (smushmode & 63) | SM_SMUSH;
+ smushoverride = SMO_YES;
+ break;
+ case 'w':
+ columns = atoi(optarg);
+ if (columns>0) {
+ outputwidth = columns;
+ }
+ break;
+ case 'd':
+ fontdirname = optarg;
+ break;
+ case 'f':
+ fontname = optarg;
+ if (suffixcmp(fontname,FONTFILESUFFIX)) {
+ fontname[MYSTRLEN(fontname)-FSUFFIXLEN] = '\0';
+ }
+#ifdef TLF_FONTS
+ else if (suffixcmp(fontname,TOILETFILESUFFIX)) {
+ fontname[MYSTRLEN(fontname)-TSUFFIXLEN] = '\0';
+ }
+#endif
+ break;
+ case 'C':
+ controlname = optarg;
+ if (suffixcmp(controlname, CONTROLFILESUFFIX)) {
+ controlname[MYSTRLEN(controlname)-CSUFFIXLEN] = '\0';
+ }
+ (*cfilelistend) = (cfnamenode*)myalloc(sizeof(cfnamenode));
+ (*cfilelistend)->thename = controlname;
+ cfilelistend = &(*cfilelistend)->next;
+ (*cfilelistend) = NULL;
+ break;
+ case 'N':
+ clearcfilelist();
+ multibyte = 0;
+ gn[0] = 0;
+ gn[1] = 0x80;
+ gn[2] = gn[3] = 0;
+ gndbl[0] = gndbl[1] = gndbl[2] = gndbl[3] = 0;
+ gl = 0;
+ gr = 1;
+ break;
+ case 'F': /* Not a legal option */
+ fprintf(stderr,"%s: illegal option -- F\n",myname);
+ printusage(stderr);
+ fprintf(stderr,"\nBecause of numerous incompatibilities, the");
+ fprintf(stderr," \"-F\" option has been\n");
+ fprintf(stderr,"removed. It has been replaced by the \"figlist\"");
+ fprintf(stderr," program, which is now\n");
+ fprintf(stderr,"included in the basic FIGlet package. \"figlist\"");
+ fprintf(stderr," is also available\n");
+ fprintf(stderr,"from http://www.figlet.org/");
+ fprintf(stderr,"under UNIX utilities.\n");
+ exit(1);
+ break;
+ default:
+ printusage(stderr);
+ exit(1);
+ }
+ }
+ if (optind!=Myargc) cmdinput = 1; /* force cmdinput if more arguments */
+ outlinelenlimit = outputwidth-1;
+ if (infoprint>=0) {
+ printinfo(infoprint);
+ exit(0);
+ }
+}
+
+
+/****************************************************************************
+
+ clearline
+
+ Clears both the input (inchrline) and output (outputline) storage.
+
+****************************************************************************/
+
+void clearline()
+{
+ int i;
+
+ for (i=0;iord = theord;
+ fcharlist->thechar = (outchr**)myalloc(sizeof(outchr*)*charheight);
+ fcharlist->next = fclsave;
+
+ outline[0] = 0;
+
+ for (row=0;row=0 && ISSPACE(outline[k])) { /* remove trailing spaces */
+ k--;
+ }
+ if (k>=0) {
+ endchar = outline[k]; /* remove endmarks */
+ while (k>=0 && outline[k]==endchar) {
+ k--;
+ }
+ }
+ outline[k+1] = '\0';
+ fcharlist->thechar[row] = (outchr*)myalloc(sizeof(outchr)*(STRLEN(outline)+1));
+ STRCPY(fcharlist->thechar[row],outline);
+ }
+}
+
+
+/****************************************************************************
+
+ readfont
+
+ Allocates memory, initializes variables, and reads in the font.
+ Called near beginning of main().
+
+****************************************************************************/
+
+void readfont()
+{
+ int i,row,numsread;
+ inchr theord;
+ int maxlen,cmtlines,ffright2left;
+ int smush,smush2;
+ char fileline[MAXLEN+1],magicnum[5];
+ ZFILE *fontfile;
+
+ fontfile = FIGopen(fontname,FONTFILESUFFIX);
+#ifdef TLF_FONTS
+ if (fontfile==NULL) {
+ fontfile = FIGopen(fontname,TOILETFILESUFFIX);
+ if(fontfile) toiletfont = 1;
+ }
+#endif
+
+ if (fontfile==NULL) {
+ fprintf(stderr,"%s: %s: Unable to open font file\n",myname,fontname);
+ exit(1);
+ }
+
+ readmagic(fontfile,magicnum);
+ if (myfgets(fileline,MAXLEN,fontfile)==NULL) {
+ fileline[0] = '\0';
+ }
+ if (MYSTRLEN(fileline)>0 ? fileline[MYSTRLEN(fileline)-1]!='\n' : 0) {
+ skiptoeol(fontfile);
+ }
+ numsread = sscanf(fileline,"%*c%c %d %*d %d %d %d %d %d",
+ &hardblank,&charheight,&maxlen,&smush,&cmtlines,
+ &ffright2left,&smush2);
+
+ if (maxlen > MAXLEN) {
+ fprintf(stderr,"%s: %s: character is too wide\n",myname,fontname);
+ exit(1);
+ }
+#ifdef TLF_FONTS
+ if ((!toiletfont && strcmp(magicnum,FONTFILEMAGICNUMBER)) ||
+ (toiletfont && strcmp(magicnum,TOILETFILEMAGICNUMBER)) || numsread<5) {
+#else
+ if (strcmp(magicnum,FONTFILEMAGICNUMBER) || numsread<5) {
+#endif
+ fprintf(stderr,"%s: %s: Not a FIGlet 2 font file\n",myname,fontname);
+ exit(1);
+ }
+ for (i=1;i<=cmtlines;i++) {
+ skiptoeol(fontfile);
+ }
+
+ if (numsread<6) {
+ ffright2left = 0;
+ }
+
+ if (numsread<7) { /* if no smush2, decode smush into smush2 */
+ if (smush == 0) smush2 = SM_KERN;
+ else if (smush < 0) smush2 = 0;
+ else smush2 = (smush & 31) | SM_SMUSH;
+ }
+
+ if (charheight<1) {
+ charheight = 1;
+ }
+
+ if (maxlen<1) {
+ maxlen = 1;
+ }
+
+ maxlen += 100; /* Give ourselves some extra room */
+
+ if (smushoverride == SMO_NO)
+ smushmode = smush2;
+ else if (smushoverride == SMO_FORCE)
+ smushmode |= smush2;
+
+ if (right2left<0) {
+ right2left = ffright2left;
+ }
+
+ if (justification<0) {
+ justification = 2*right2left;
+ }
+
+ /* Allocate "missing" character */
+ fcharlist = (fcharnode*)myalloc(sizeof(fcharnode));
+ fcharlist->ord = 0;
+ fcharlist->thechar = (outchr**)myalloc(sizeof(outchr*)*charheight);
+ fcharlist->next = NULL;
+ for (row=0;rowthechar[row] = (outchr*)myalloc(sizeof(outchr));
+ fcharlist->thechar[row][0] = '\0';
+ }
+ for (theord=' ';theord<='~';theord++) {
+ readfontchar(fontfile,theord);
+ }
+ for (theord=0;theord<=6;theord++) {
+ readfontchar(fontfile,deutsch[theord]);
+ }
+ while (myfgets(fileline,maxlen+1,fontfile)==NULL?0:
+ sscanf(fileline,"%li",&theord)==1) {
+ readfontchar(fontfile,theord);
+ }
+ Zclose(fontfile);
+}
+
+
+/****************************************************************************
+
+ linealloc
+
+ Allocates & clears outputline, inchrline. Sets inchrlinelenlimit.
+ Called near beginning of main().
+
+****************************************************************************/
+
+void linealloc()
+{
+ int row;
+
+ outputline = (outchr**)myalloc(sizeof(outchr*)*charheight);
+ for (row=0;roword!=c;
+ charptr=charptr->next) ;
+ if (charptr!=NULL) {
+ currchar = charptr->thechar;
+ }
+ else {
+ for (charptr=fcharlist;charptr==NULL?0:charptr->ord!=0;
+ charptr=charptr->next) ;
+ currchar = charptr->thechar;
+ }
+ previouscharwidth = currcharwidth;
+ currcharwidth = STRLEN(currchar[0]);
+}
+
+
+/****************************************************************************
+
+ smushem
+
+ Given 2 characters, attempts to smush them into 1, according to
+ smushmode. Returns smushed character or '\0' if no smushing can be
+ done.
+
+ smushmode values are sum of following (all values smush blanks):
+ 1: Smush equal chars (not hardblanks)
+ 2: Smush '_' with any char in hierarchy below
+ 4: hierarchy: "|", "/\", "[]", "{}", "()", "<>"
+ Each class in hier. can be replaced by later class.
+ 8: [ + ] -> |, { + } -> |, ( + ) -> |
+ 16: / + \ -> X, > + < -> X (only in that order)
+ 32: hardblank + hardblank -> hardblank
+
+****************************************************************************/
+
+outchr smushem(lch,rch)
+outchr lch,rch;
+{
+ if (lch==' ') return rch;
+ if (rch==' ') return lch;
+
+ if (previouscharwidth<2 || currcharwidth<2) return '\0';
+ /* Disallows overlapping if the previous character */
+ /* or the current character has a width of 1 or zero. */
+
+ if ((smushmode & SM_SMUSH) == 0) return '\0'; /* kerning */
+
+ if ((smushmode & 63) == 0) {
+ /* This is smushing by universal overlapping. */
+ if (lch==' ') return rch;
+ if (rch==' ') return lch;
+ if (lch==hardblank) return rch;
+ if (rch==hardblank) return lch;
+ /* Above four lines ensure overlapping preference to */
+ /* visible characters. */
+ if (right2left==1) return lch;
+ /* Above line ensures that the dominant (foreground) */
+ /* fig-character for overlapping is the latter in the */
+ /* user's text, not necessarily the rightmost character. */
+ return rch;
+ /* Occurs in the absence of above exceptions. */
+ }
+
+ if (smushmode & SM_HARDBLANK) {
+ if (lch==hardblank && rch==hardblank) return lch;
+ }
+
+ if (lch==hardblank || rch==hardblank) return '\0';
+
+ if (smushmode & SM_EQUAL) {
+ if (lch==rch) return lch;
+ }
+
+ if (smushmode & SM_LOWLINE) {
+ if (lch=='_' && strchr("|/\\[]{}()<>",rch)) return rch;
+ if (rch=='_' && strchr("|/\\[]{}()<>",lch)) return lch;
+ }
+
+ if (smushmode & SM_HIERARCHY) {
+ if (lch=='|' && strchr("/\\[]{}()<>",rch)) return rch;
+ if (rch=='|' && strchr("/\\[]{}()<>",lch)) return lch;
+ if (strchr("/\\",lch) && strchr("[]{}()<>",rch)) return rch;
+ if (strchr("/\\",rch) && strchr("[]{}()<>",lch)) return lch;
+ if (strchr("[]",lch) && strchr("{}()<>",rch)) return rch;
+ if (strchr("[]",rch) && strchr("{}()<>",lch)) return lch;
+ if (strchr("{}",lch) && strchr("()<>",rch)) return rch;
+ if (strchr("{}",rch) && strchr("()<>",lch)) return lch;
+ if (strchr("()",lch) && strchr("<>",rch)) return rch;
+ if (strchr("()",rch) && strchr("<>",lch)) return lch;
+ }
+
+ if (smushmode & SM_PAIR) {
+ if (lch=='[' && rch==']') return '|';
+ if (rch=='[' && lch==']') return '|';
+ if (lch=='{' && rch=='}') return '|';
+ if (rch=='{' && lch=='}') return '|';
+ if (lch=='(' && rch==')') return '|';
+ if (rch=='(' && lch==')') return '|';
+ }
+
+ if (smushmode & SM_BIGX) {
+ if (lch=='/' && rch=='\\') return '|';
+ if (rch=='/' && lch=='\\') return 'Y';
+ if (lch=='>' && rch=='<') return 'X';
+ /* Don't want the reverse of above to give 'X'. */
+ }
+
+ return '\0';
+}
+
+
+/****************************************************************************
+
+ smushamt
+
+ Returns the maximum amount that the current character can be smushed
+ into the current line.
+
+****************************************************************************/
+
+int smushamt()
+{
+ int maxsmush,amt;
+ int row,linebd,charbd;
+ outchr ch1,ch2;
+
+ if ((smushmode & (SM_SMUSH | SM_KERN)) == 0) {
+ return 0;
+ }
+ maxsmush = currcharwidth;
+ for (row=0;rowSTRLEN(outputline[row])) {
+ maxsmush=STRLEN(outputline[row]);
+ }
+ for (charbd=STRLEN(currchar[row]);
+ ch1=currchar[row][charbd],(charbd>0&&(!ch1||ch1==' '));charbd--) ;
+ for (linebd=0;ch2=outputline[row][linebd],ch2==' ';linebd++) ;
+ amt = linebd+currcharwidth-1-charbd;
+ }
+ else {
+ for (linebd=STRLEN(outputline[row]);
+ ch1 = outputline[row][linebd],(linebd>0&&(!ch1||ch1==' '));linebd--) ;
+ for (charbd=0;ch2=currchar[row][charbd],ch2==' ';charbd++) ;
+ amt = charbd+outlinelen-1-linebd;
+ }
+ if (!ch1||ch1==' ') {
+ amt++;
+ }
+ else if (ch2) {
+ if (smushem(ch1,ch2)!='\0') {
+ amt++;
+ }
+ }
+ if (amtoutlinelenlimit
+ ||inchrlinelen+1>inchrlinelenlimit) {
+ return 0;
+ }
+
+ templine = (outchr*)myalloc(sizeof(outchr)*(outlinelenlimit+1));
+ for (row=0;row1) {
+ if (len>outputwidth-1) {
+ len = outputwidth-1;
+ }
+ if (justification>0) {
+ for (i=1;(3-justification)*i+len+justification-2=0;i--) {
+ if (!gotspace && inchrline[i]==' ') {
+ gotspace = 1;
+ lastspace = i;
+ }
+ if (gotspace && inchrline[i]!=' ') {
+ break;
+ }
+ }
+ len1 = i+1;
+ len2 = inchrlinelen-lastspace-1;
+ for (i=0;ithecommand ?
+ (c >= cmptr->rangelo && c <= cmptr->rangehi) : 0) {
+ c += cmptr->offset;
+ while(cmptr!=NULL ? cmptr->thecommand : 0) {
+ cmptr=cmptr->next;
+ }
+ }
+ else {
+ cmptr=cmptr->next;
+ }
+ }
+ return c;
+}
+
+/****************************************************************************
+
+ Agetchar
+
+ Replacement to getchar().
+ Acts exactly like getchar if -A is NOT specified,
+ else obtains input from All remaining command line words.
+
+****************************************************************************/
+
+int Agetchar()
+{
+ extern int optind; /* current argv[] element under study */
+ static int AgetMode = 0; /* >= 0 for displacement into argv[n], <0 EOF */
+ char *arg; /* pointer to active character */
+ int c; /* current character */
+
+ if ( ! cmdinput ) /* is -A active? */
+ return( getchar() ); /* no: return stdin character */
+
+ if ( AgetMode < 0 || optind >= Myargc ) /* EOF is sticky: */
+ return( EOF ); /* **ensure it now and forever more */
+
+ /* find next character */
+ arg = Myargv[optind]; /* pointer to active arg */
+ c = arg[AgetMode++]&0xFF; /* get appropriate char of arg */
+
+ if ( ! c ) /* at '\0' that terminates word? */
+ { /* at end of word: return ' ' if normal word, '\n' if empty */
+ c = ' '; /* suppose normal word and return blank */
+ if ( AgetMode == 1 ) /* if ran out in very 1st char, force \n */
+ c = '\n'; /* (allows "hello '' world" to do \n at '') */
+ AgetMode = 0; /* return to char 0 in NEXT word */
+ if ( ++optind >= Myargc ) /* run up word count and check if at "EOF" */
+ { /* just ran out of arguments */
+ c = EOF; /* return EOF */
+ AgetMode = -1; /* ensure all future returns return EOF */
+ }
+ }
+
+ return( c ); /* return appropriate character */
+
+} /* end: Agetchar() */
+
+
+/****************************************************************************
+
+ iso2022
+
+ Called by getinchr. Interprets ISO 2022 sequences
+
+******************************************************************************/
+
+inchr iso2022()
+{
+ inchr ch;
+ inchr ch2;
+ int save_gl;
+ int save_gr;
+
+ ch = Agetchar();
+ if (ch == EOF) return ch;
+ if (ch == 27) ch = Agetchar() + 0x100; /* ESC x */
+ if (ch == 0x100 + '$') ch = Agetchar() + 0x200; /* ESC $ x */
+ switch (ch) {
+ case 14: /* invoke G1 into GL */
+ gl = 1;
+ return iso2022();
+ case 15: /* invoke G0 into GL */
+ gl = 0;
+ return iso2022();
+ case 142: case 'N' + 0x100: /* invoke G2 into GL for next char */
+ save_gl = gl; save_gr = gr;
+ gl = gr = 2;
+ ch = iso2022();
+ gl = save_gl; gr = save_gr;
+ return ch;
+ case 143: case 'O' + 0x100: /* invoke G3 into GL for next char */
+ save_gl = gl; save_gr = gr;
+ gl = gr = 3;
+ ch = iso2022();
+ gl = save_gl; gr = save_gr;
+ return ch;
+ case 'n' + 0x100: /* invoke G2 into GL */
+ gl = 2;
+ return iso2022();
+ case 'o' + 0x100: /* invoke G3 into GL */
+ gl = 3;
+ return iso2022();
+ case '~' + 0x100: /* invoke G1 into GR */
+ gr = 1;
+ return iso2022();
+ case '}' + 0x100: /* invoke G2 into GR */
+ gr = 2;
+ return iso2022();
+ case '|' + 0x100: /* invoke G3 into GR */
+ gr = 3;
+ return iso2022();
+ case '(' + 0x100: /* set G0 to 94-char set */
+ ch = Agetchar();
+ if (ch == 'B') ch = 0; /* ASCII */
+ gn[0] = ch << 16;
+ gndbl[0] = 0;
+ return iso2022();
+ case ')' + 0x100: /* set G1 to 94-char set */
+ ch = Agetchar();
+ if (ch == 'B') ch = 0;
+ gn[1] = ch << 16;
+ gndbl[1] = 0;
+ return iso2022();
+ case '*' + 0x100: /* set G2 to 94-char set */
+ ch = Agetchar();
+ if (ch == 'B') ch = 0;
+ gn[2] = ch << 16;
+ gndbl[2] = 0;
+ return iso2022();
+ case '+' + 0x100: /* set G3 to 94-char set */
+ ch = Agetchar();
+ if (ch == 'B') ch = 0;
+ gn[3] = ch << 16;
+ gndbl[3] = 0;
+ return iso2022();
+ case '-' + 0x100: /* set G1 to 96-char set */
+ ch = Agetchar();
+ if (ch == 'A') ch = 0; /* Latin-1 top half */
+ gn[1] = (ch << 16) | 0x80;
+ gndbl[1] = 0;
+ return iso2022();
+ case '.' + 0x100: /* set G2 to 96-char set */
+ ch = Agetchar();
+ if (ch == 'A') ch = 0;
+ gn[2] = (ch << 16) | 0x80;
+ gndbl[2] = 0;
+ return iso2022();
+ case '/' + 0x100: /* set G3 to 96-char set */
+ ch = Agetchar();
+ if (ch == 'A') ch = 0;
+ gn[3] = (ch << 16) | 0x80;
+ gndbl[3] = 0;
+ return iso2022();
+ case '(' + 0x200: /* set G0 to 94 x 94 char set */
+ ch = Agetchar();
+ gn[0] = ch << 16;
+ gndbl[0] = 1;
+ return iso2022();
+ case ')' + 0x200: /* set G1 to 94 x 94 char set */
+ ch = Agetchar();
+ gn[1] = ch << 16;
+ gndbl[1] = 1;
+ return iso2022();
+ case '*' + 0x200: /* set G2 to 94 x 94 char set */
+ ch = Agetchar();
+ gn[2] = ch << 16;
+ gndbl[2] = 1;
+ return iso2022();
+ case '+' + 0x200: /* set G3 to 94 x 94 char set */
+ ch = Agetchar();
+ gn[3] = ch << 16;
+ gndbl[3] = 1;
+ return iso2022();
+ default:
+ if (ch & 0x200) { /* set G0 to 94 x 94 char set (deprecated) */
+ gn[0] = (ch & ~0x200) << 16;
+ gndbl[0] = 1;
+ return iso2022();
+ }
+ }
+
+ if (ch >= 0x21 && ch <= 0x7E) { /* process GL */
+ if (gndbl[gl]) {
+ ch2 = Agetchar();
+ return gn[gl] | (ch << 8) | ch2;
+ }
+ else return gn[gl] | ch;
+ }
+ else if (ch >= 0xA0 && ch <= 0xFF) { /* process GR */
+ if (gndbl[gr]) {
+ ch2 = Agetchar();
+ return gn[gr] | (ch << 8) | ch2;
+ }
+ else return gn[gr] | (ch & ~0x80);
+ }
+ else return ch;
+ }
+
+/****************************************************************************
+
+ ungetinchr
+
+ Called by main. Pushes back an "inchr" to be read by getinchr
+ on the next call.
+
+******************************************************************************/
+inchr getinchr_buffer;
+int getinchr_flag;
+
+inchr ungetinchr(c)
+inchr c;
+{
+ getinchr_buffer = c;
+ getinchr_flag = 1;
+ return c;
+}
+
+/*****************************************************************************
+
+ getinchr
+
+ Called by main. Processes multibyte characters. Invokes Agetchar.
+ If multibyte = 0, ISO 2022 mode (see iso2022 routine).
+ If multibyte = 1, double-byte mode (0x00-0x7f bytes are characters,
+ 0x80-0xFF bytes are first byte of a double-byte character).
+ If multibyte = 2, Unicode UTF-8 mode (0x00-0x7F bytes are characters,
+ 0x80-0xBF bytes are nonfirst byte of a multibyte character,
+ 0xC0-0xFD bytes are first byte of a multibyte character,
+ 0xFE-0xFF bytes are errors (all errors return code 0x0080)).
+ If multibyte = 3, HZ mode ("~{" starts double-byte mode, "}~" ends it,
+ "~~" is a tilde, "~x" for all other x is ignored).
+ If multibyte = 4, Shift-JIS mode (0x80-0x9F and 0xE0-0xEF are first byte
+ of a double-byte character, all other bytes are characters).
+
+
+*****************************************************************************/
+
+inchr getinchr()
+{
+ int ch, ch2, ch3, ch4, ch5, ch6;
+
+ if (getinchr_flag) {
+ getinchr_flag = 0;
+ return getinchr_buffer;
+ }
+
+ switch(multibyte) {
+ case 0: /* single-byte */
+ return iso2022();
+ case 1: /* DBCS */
+ ch = Agetchar();
+ if ((ch >= 0x80 && ch <= 0x9F) ||
+ (ch >= 0xE0 && ch <= 0xEF)) {
+ ch = (ch << 8) + Agetchar();
+ }
+ return ch;
+ case 2: /* UTF-8 */
+ ch = Agetchar();
+ if (ch < 0x80) return ch; /* handles EOF, too */
+ if (ch < 0xC0 || ch > 0xFD)
+ return 0x0080; /* illegal first character */
+ ch2 = Agetchar() & 0x3F;
+ if (ch < 0xE0) return ((ch & 0x1F) << 6) + ch2;
+ ch3 = Agetchar() & 0x3F;
+ if (ch < 0xF0)
+ return ((ch & 0x0F) << 12) + (ch2 << 6) + ch3;
+ ch4 = Agetchar() & 0x3F;
+ if (ch < 0xF8)
+ return ((ch & 0x07) << 18) + (ch2 << 12) + (ch3 << 6) + ch4;
+ ch5 = Agetchar() & 0x3F;
+ if (ch < 0xFC)
+ return ((ch & 0x03) << 24) + (ch2 << 18) + (ch3 << 12) +
+ (ch4 << 6) + ch5;
+ ch6 = Agetchar() & 0x3F;
+ return ((ch & 0x01) << 30) + (ch2 << 24) + (ch3 << 18) +
+ (ch4 << 12) + (ch5 << 6) + ch6;
+ case 3: /* HZ */
+ ch = Agetchar();
+ if (ch == EOF) return ch;
+ if (hzmode) {
+ ch = (ch << 8) + Agetchar();
+ if (ch == ('}' << 8) + '~') {
+ hzmode = 0;
+ return getinchr();
+ }
+ return ch;
+ }
+ else if (ch == '~') {
+ ch = Agetchar();
+ if (ch == '{') {
+ hzmode = 1;
+ return getinchr();
+ }
+ else if (ch == '~') {
+ return ch;
+ }
+ else {
+ return getinchr();
+ }
+ }
+ else return ch;
+ case 4: /* Shift-JIS */
+ ch = Agetchar();
+ if ((ch >= 0x80 && ch <= 0x9F) ||
+ (ch >= 0xE0 && ch <= 0xEF)) {
+ ch = (ch << 8) + Agetchar();
+ }
+ return ch;
+ default:
+ return 0x80;
+ }
+ }
+
+/****************************************************************************
+
+ main
+
+ The main program, of course.
+ Reads characters 1 by 1 from stdin, and makes lines out of them using
+ addchar. Handles line breaking, (which accounts for most of the
+ complexity in this function).
+
+****************************************************************************/
+
+int main(argc,argv)
+int argc;
+char *argv[];
+{
+ inchr c,c2;
+ int i;
+ int last_was_eol_flag;
+/*---------------------------------------------------------------------------
+ wordbreakmode:
+ -1: /^$/ and blanks are to be absorbed (when line break was forced
+ by a blank or character larger than outlinelenlimit)
+ 0: /^ *$/ and blanks are not to be absorbed
+ 1: /[^ ]$/ no word break yet
+ 2: /[^ ] *$/
+ 3: /[^ ]$/ had a word break
+---------------------------------------------------------------------------*/
+ int wordbreakmode;
+ int char_not_added;
+
+ Myargc = argc;
+ Myargv = argv;
+ getparams();
+ readcontrolfiles();
+ readfont();
+ linealloc();
+
+ wordbreakmode = 0;
+ last_was_eol_flag = 0;
+
+#ifdef TLF_FONTS
+ toiletfont = 0;
+#endif
+
+ while ((c = getinchr())!=EOF) {
+
+ if (c=='\n'&¶graphflag&&!last_was_eol_flag) {
+ ungetinchr(c2 = getinchr());
+ c = ((isascii(c2)&&isspace(c2))?'\n':' ');
+ }
+ last_was_eol_flag = (isascii(c)&&isspace(c)&&c!='\t'&&c!=' ');
+
+ if (deutschflag) {
+ if (c>='[' && c<=']') {
+ c = deutsch[c-'['];
+ }
+ else if (c >='{' && c <= '~') {
+ c = deutsch[c-'{'+3];
+ }
+ }
+
+ c = handlemapping(c);
+
+ if (isascii(c)&&isspace(c)) {
+ c = (c=='\t'||c==' ') ? ' ' : '\n';
+ }
+
+ if ((c>'\0' && c<' ' && c!='\n') || c==127) continue;
+
+/*
+ Note: The following code is complex and thoroughly tested.
+ Be careful when modifying!
+*/
+
+ do {
+ char_not_added = 0;
+
+ if (wordbreakmode== -1) {
+ if (c==' ') {
+ break;
+ }
+ else if (c=='\n') {
+ wordbreakmode = 0;
+ break;
+ }
+ wordbreakmode = 0;
+ }
+
+ if (c=='\n') {
+ printline();
+ wordbreakmode = 0;
+ }
+
+ else if (addchar(c)) {
+ if (c!=' ') {
+ wordbreakmode = (wordbreakmode>=2)?3:1;
+ }
+ else {
+ wordbreakmode = (wordbreakmode>0)?2:0;
+ }
+ }
+
+ else if (outlinelen==0) {
+ for (i=0;i1) {
+ putstring(currchar[i]+STRLEN(currchar[i])-outlinelenlimit);
+ }
+ else {
+ putstring(currchar[i]);
+ }
+ }
+ wordbreakmode = -1;
+ }
+
+ else if (c==' ') {
+ if (wordbreakmode==2) {
+ splitline();
+ }
+ else {
+ printline();
+ }
+ wordbreakmode = -1;
+ }
+
+ else {
+ if (wordbreakmode>=2) {
+ splitline();
+ }
+ else {
+ printline();
+ }
+ wordbreakmode = (wordbreakmode==3)?1:0;
+ char_not_added = 1;
+ }
+
+ } while (char_not_added);
+ }
+
+ if (outlinelen!=0) {
+ printline();
+ }
+ return 0;
+}
diff --git a/externals/figlet/figlist b/externals/figlet/figlist
new file mode 100755
index 0000000000..6dea3b2cf8
--- /dev/null
+++ b/externals/figlet/figlist
@@ -0,0 +1,64 @@
+#!/bin/sh -
+# figlist by Glenn Chappell
+# figlet release 2.1.1 -- 25 Aug 1994
+#
+# Lists all fonts and control files in figlet's default font directory.
+# Replaces "figlet -F", which was removed from figlet version 2.1.
+#
+# Usage: figlist [ -d directory ]
+
+DIR=`dirname $0`
+FIGLET=$DIR/figlet
+
+# Get figlet version
+FIGLETVERSION=`$FIGLET -I1 2>/dev/null`
+if [ -z "$FIGLETVERSION" ]; then
+ FIGLETVERSION=20000
+fi
+
+USAGE="Usage: `basename $0` [ -d directory ]"
+
+if [ "$1" = "-d" ]; then
+ FONTDIROPT="-d $2"
+ if [ $# -ne 2 ]; then
+ echo "$USAGE"
+ exit 1
+ fi
+else
+ FONTDIROPT=""
+ if [ $# -ne 0 ]; then
+ echo "$USAGE"
+ exit 1
+ fi
+fi
+
+if [ "$FIGLETVERSION" -lt 20100 ]; then
+ # figlet 2.0
+ $FIGLET $FONTDIROPT -F
+ exit
+fi
+
+# From here on we may assume figlet 2.1 or later
+
+FONTDIR=`$FIGLET $FONTDIROPT -I2`
+FONT=`$FIGLET -I3`
+echo "Default font: $FONT"
+echo "Font directory: $FONTDIR"
+
+if [ -d "$FONTDIR" ] && [ -r "$FONTDIR" ]; then
+ cd "$FONTDIR"
+ if ls *.flf >/dev/null 2>&1 ; then
+ echo "Figlet fonts in this directory:"
+ ls *.flf 2>/dev/null | sed s/\.flf$//
+ else
+ echo 'No figlet fonts in this directory'
+ fi
+ if ls *.flc >/dev/null 2>&1 ; then
+ echo "Figlet control files in this directory:"
+ ls *.flc 2>/dev/null | sed s/\.flc$//
+ else
+ echo 'No figlet control files in this directory'
+ fi
+else
+ echo 'Unable to open directory'
+fi
diff --git a/externals/figlet/figlist.6 b/externals/figlet/figlist.6
new file mode 100644
index 0000000000..c8b7cae5c9
--- /dev/null
+++ b/externals/figlet/figlist.6
@@ -0,0 +1,52 @@
+.\" figlist by Glenn Chappell
+.\" figlet release 2.1.1 -- 25 Aug 1994
+.\"
+.\" Lists all fonts and control files in figlet's default font directory.
+.\" Replaces "figlet -F", which was removed from figlet version 2.1.
+.\"
+.\" Usage: figlist [ -d directory ]
+.\"
+.\" Manual page by Jonathon Abbott, for the Debian Project
+.\" slightly modified by Francesco Tapparo, for the Debian Project
+.TH FIGLIST 6 "31 May 2012" "v2.2.5"
+
+.SH NAME
+figlist \- lists figlet fonts and control files
+
+.SH SYNOPSIS
+.B figlist
+[
+.B \-d
+.I directory
+]
+
+.SH DESCRIPTION
+Lists all fonts and control files in figlet's default font directory.
+Replaces "figlet \-F", which was removed from figlet version 2.1.
+
+.SH EXAMPLES
+To use
+.B figlist
+with its default settings, simply type
+.RS
+
+.B example% figlist
+
+.RE
+
+To list all the font and control files in /usr/share/fonts/figlet
+.RS
+
+.B example% figlist \-d /usr/share/fonts/figlet
+
+.RE
+
+.SH AUTHORS
+figlist was written by Glenn Chappell
+
+This manual page was written by Jonathon Abbott for the Debian Project.
+
+.SH "SEE ALSO"
+.BR figlet (6),
+.BR chkfont (6),
+.BR showfigfonts (6)
diff --git a/externals/figlet/figmagic b/externals/figlet/figmagic
new file mode 100644
index 0000000000..5e9a01a0de
--- /dev/null
+++ b/externals/figlet/figmagic
@@ -0,0 +1,6 @@
+# Append this file to your /etc/magic or /usr/share/misc/magic file
+# to enable the ``file'' command to report on FIGlet fonts and controlfiles.
+0 string flf FIGlet font
+>3 string >2a version %-2.2s
+0 string flc FIGlet controlfile
+>3 string >2a version %-2.2s
diff --git a/externals/figlet/fonts/646-ca.flc b/externals/figlet/fonts/646-ca.flc
new file mode 100644
index 0000000000..b5f3071183
--- /dev/null
+++ b/externals/figlet/fonts/646-ca.flc
@@ -0,0 +1,157 @@
+#
+# Name: CSA_Z243.4-1985-1 to Unicode
+# Unicode version: 2.0
+# Table version: 0.1
+# Table format: Format A
+# Date: 0097-01-24
+# Authors: John Cowan (conversion)
+# Keld Simonsen (RFC 1345)
+#
+# General notes:
+#
+# This table contains data obtained from RFC 1345 on how
+# CSA_Z243.4-1985-1 characters map into Unicode.
+#
+# Format: Three tab-separated columns
+# Column #1 is the CSA_Z243.4-1985-1 code (in hex as 0xXX)
+# Column #2 is the Unicode (in hex as 0xXXXX)
+# Column #3 the Unicode name (follows a comment sign, '#')
+#
+# The entries are in CSA_Z243.4-1985-1 order
+#
+# Any comments or problems, contact
+#
+# &rem source: ECMA registry
+# &alias iso-ir-121
+# &g0esc x2877 &g1esc x2977 &g2esc x2a77 &g3esc x2b77
+# &alias ISO646-CA
+# &alias csa7-1
+# &alias ca
+0x00 0x0000 # NULL (NUL)
+0x01 0x0001 # START OF HEADING (SOH)
+0x02 0x0002 # START OF TEXT (STX)
+0x03 0x0003 # END OF TEXT (ETX)
+0x04 0x0004 # END OF TRANSMISSION (EOT)
+0x05 0x0005 # ENQUIRY (ENQ)
+0x06 0x0006 # ACKNOWLEDGE (ACK)
+0x07 0x0007 # BELL (BEL)
+0x08 0x0008 # BACKSPACE (BS)
+0x09 0x0009 # CHARACTER TABULATION (HT)
+0x0A 0x000A # LINE FEED (LF)
+0x0B 0x000B # LINE TABULATION (VT)
+0x0C 0x000C # FORM FEED (FF)
+0x0D 0x000D # CARRIAGE RETURN (CR)
+0x0E 0x000E # SHIFT OUT (SO)
+0x0F 0x000F # SHIFT IN (SI)
+0x10 0x0010 # DATALINK ESCAPE (DLE)
+0x11 0x0011 # DEVICE CONTROL ONE (DC1)
+0x12 0x0012 # DEVICE CONTROL TWO (DC2)
+0x13 0x0013 # DEVICE CONTROL THREE (DC3)
+0x14 0x0014 # DEVICE CONTROL FOUR (DC4)
+0x15 0x0015 # NEGATIVE ACKNOWLEDGE (NAK)
+0x16 0x0016 # SYNCRONOUS IDLE (SYN)
+0x17 0x0017 # END OF TRANSMISSION BLOCK (ETB)
+0x18 0x0018 # CANCEL (CAN)
+0x19 0x0019 # END OF MEDIUM (EM)
+0x1A 0x001A # SUBSTITUTE (SUB)
+0x1B 0x001B # ESCAPE (ESC)
+0x1C 0x001C # FILE SEPARATOR (IS4)
+0x1D 0x001D # GROUP SEPARATOR (IS3)
+0x1E 0x001E # RECORD SEPARATOR (IS2)
+0x1F 0x001F # UNIT SEPARATOR (IS1)
+0x20 0x0020 # SPACE
+0x21 0x0021 # EXCLAMATION MARK
+0x22 0x0022 # QUOTATION MARK
+0x23 0x0023 # NUMBER SIGN
+0x24 0x0024 # DOLLAR SIGN
+0x25 0x0025 # PERCENT SIGN
+0x26 0x0026 # AMPERSAND
+0x27 0x0027 # APOSTROPHE
+0x28 0x0028 # LEFT PARENTHESIS
+0x29 0x0029 # RIGHT PARENTHESIS
+0x2A 0x002A # ASTERISK
+0x2B 0x002B # PLUS SIGN
+0x2C 0x002C # COMMA
+0x2D 0x002D # HYPHEN-MINUS
+0x2E 0x002E # FULL STOP
+0x2F 0x002F # SOLIDUS
+0x30 0x0030 # DIGIT ZERO
+0x31 0x0031 # DIGIT ONE
+0x32 0x0032 # DIGIT TWO
+0x33 0x0033 # DIGIT THREE
+0x34 0x0034 # DIGIT FOUR
+0x35 0x0035 # DIGIT FIVE
+0x36 0x0036 # DIGIT SIX
+0x37 0x0037 # DIGIT SEVEN
+0x38 0x0038 # DIGIT EIGHT
+0x39 0x0039 # DIGIT NINE
+0x3A 0x003A # COLON
+0x3B 0x003B # SEMICOLON
+0x3C 0x003C # LESS-THAN SIGN
+0x3D 0x003D # EQUALS SIGN
+0x3E 0x003E # GREATER-THAN SIGN
+0x3F 0x003F # QUESTION MARK
+0x40 0x00E0 # LATIN SMALL LETTER A WITH GRAVE
+0x41 0x0041 # LATIN CAPITAL LETTER A
+0x42 0x0042 # LATIN CAPITAL LETTER B
+0x43 0x0043 # LATIN CAPITAL LETTER C
+0x44 0x0044 # LATIN CAPITAL LETTER D
+0x45 0x0045 # LATIN CAPITAL LETTER E
+0x46 0x0046 # LATIN CAPITAL LETTER F
+0x47 0x0047 # LATIN CAPITAL LETTER G
+0x48 0x0048 # LATIN CAPITAL LETTER H
+0x49 0x0049 # LATIN CAPITAL LETTER I
+0x4A 0x004A # LATIN CAPITAL LETTER J
+0x4B 0x004B # LATIN CAPITAL LETTER K
+0x4C 0x004C # LATIN CAPITAL LETTER L
+0x4D 0x004D # LATIN CAPITAL LETTER M
+0x4E 0x004E # LATIN CAPITAL LETTER N
+0x4F 0x004F # LATIN CAPITAL LETTER O
+0x50 0x0050 # LATIN CAPITAL LETTER P
+0x51 0x0051 # LATIN CAPITAL LETTER Q
+0x52 0x0052 # LATIN CAPITAL LETTER R
+0x53 0x0053 # LATIN CAPITAL LETTER S
+0x54 0x0054 # LATIN CAPITAL LETTER T
+0x55 0x0055 # LATIN CAPITAL LETTER U
+0x56 0x0056 # LATIN CAPITAL LETTER V
+0x57 0x0057 # LATIN CAPITAL LETTER W
+0x58 0x0058 # LATIN CAPITAL LETTER X
+0x59 0x0059 # LATIN CAPITAL LETTER Y
+0x5A 0x005A # LATIN CAPITAL LETTER Z
+0x5B 0x00E2 # LATIN SMALL LETTER A WITH CIRCUMFLEX
+0x5C 0x00E7 # LATIN SMALL LETTER C WITH CEDILLA
+0x5D 0x00EA # LATIN SMALL LETTER E WITH CIRCUMFLEX
+0x5E 0x00EE # LATIN SMALL LETTER I WITH CIRCUMFLEX
+0x5F 0x005F # LOW LINE
+0x60 0x00F4 # LATIN SMALL LETTER O WITH CIRCUMFLEX
+0x61 0x0061 # LATIN SMALL LETTER A
+0x62 0x0062 # LATIN SMALL LETTER B
+0x63 0x0063 # LATIN SMALL LETTER C
+0x64 0x0064 # LATIN SMALL LETTER D
+0x65 0x0065 # LATIN SMALL LETTER E
+0x66 0x0066 # LATIN SMALL LETTER F
+0x67 0x0067 # LATIN SMALL LETTER G
+0x68 0x0068 # LATIN SMALL LETTER H
+0x69 0x0069 # LATIN SMALL LETTER I
+0x6A 0x006A # LATIN SMALL LETTER J
+0x6B 0x006B # LATIN SMALL LETTER K
+0x6C 0x006C # LATIN SMALL LETTER L
+0x6D 0x006D # LATIN SMALL LETTER M
+0x6E 0x006E # LATIN SMALL LETTER N
+0x6F 0x006F # LATIN SMALL LETTER O
+0x70 0x0070 # LATIN SMALL LETTER P
+0x71 0x0071 # LATIN SMALL LETTER Q
+0x72 0x0072 # LATIN SMALL LETTER R
+0x73 0x0073 # LATIN SMALL LETTER S
+0x74 0x0074 # LATIN SMALL LETTER T
+0x75 0x0075 # LATIN SMALL LETTER U
+0x76 0x0076 # LATIN SMALL LETTER V
+0x77 0x0077 # LATIN SMALL LETTER W
+0x78 0x0078 # LATIN SMALL LETTER X
+0x79 0x0079 # LATIN SMALL LETTER Y
+0x7A 0x007A # LATIN SMALL LETTER Z
+0x7B 0x00E9 # LATIN SMALL LETTER E WITH ACUTE
+0x7C 0x00F9 # LATIN SMALL LETTER U WITH GRAVE
+0x7D 0x00E8 # LATIN SMALL LETTER E WITH GRAVE
+0x7E 0x00FB # LATIN SMALL LETTER U WITH CIRCUMFLEX
+0x7F 0x007F # DELETE (DEL)
diff --git a/externals/figlet/fonts/646-ca2.flc b/externals/figlet/fonts/646-ca2.flc
new file mode 100644
index 0000000000..a7be02f68c
--- /dev/null
+++ b/externals/figlet/fonts/646-ca2.flc
@@ -0,0 +1,156 @@
+#
+# Name: CSA_Z243.4-1985-2 to Unicode
+# Unicode version: 2.0
+# Table version: 0.1
+# Table format: Format A
+# Date: 0097-01-24
+# Authors: John Cowan (conversion)
+# Keld Simonsen (RFC 1345)
+#
+# General notes:
+#
+# This table contains data obtained from RFC 1345 on how
+# CSA_Z243.4-1985-2 characters map into Unicode.
+#
+# Format: Three tab-separated columns
+# Column #1 is the CSA_Z243.4-1985-2 code (in hex as 0xXX)
+# Column #2 is the Unicode (in hex as 0xXXXX)
+# Column #3 the Unicode name (follows a comment sign, '#')
+#
+# The entries are in CSA_Z243.4-1985-2 order
+#
+# Any comments or problems, contact
+#
+# &rem source: ECMA registry
+# &alias iso-ir-122
+# &alias ISO646-CA2
+# &g0esc x2878 &g1esc x2978 &g2esc x2a78 &g3esc x2b78
+# &alias csa7-2
+0x00 0x0000 # NULL (NUL)
+0x01 0x0001 # START OF HEADING (SOH)
+0x02 0x0002 # START OF TEXT (STX)
+0x03 0x0003 # END OF TEXT (ETX)
+0x04 0x0004 # END OF TRANSMISSION (EOT)
+0x05 0x0005 # ENQUIRY (ENQ)
+0x06 0x0006 # ACKNOWLEDGE (ACK)
+0x07 0x0007 # BELL (BEL)
+0x08 0x0008 # BACKSPACE (BS)
+0x09 0x0009 # CHARACTER TABULATION (HT)
+0x0A 0x000A # LINE FEED (LF)
+0x0B 0x000B # LINE TABULATION (VT)
+0x0C 0x000C # FORM FEED (FF)
+0x0D 0x000D # CARRIAGE RETURN (CR)
+0x0E 0x000E # SHIFT OUT (SO)
+0x0F 0x000F # SHIFT IN (SI)
+0x10 0x0010 # DATALINK ESCAPE (DLE)
+0x11 0x0011 # DEVICE CONTROL ONE (DC1)
+0x12 0x0012 # DEVICE CONTROL TWO (DC2)
+0x13 0x0013 # DEVICE CONTROL THREE (DC3)
+0x14 0x0014 # DEVICE CONTROL FOUR (DC4)
+0x15 0x0015 # NEGATIVE ACKNOWLEDGE (NAK)
+0x16 0x0016 # SYNCRONOUS IDLE (SYN)
+0x17 0x0017 # END OF TRANSMISSION BLOCK (ETB)
+0x18 0x0018 # CANCEL (CAN)
+0x19 0x0019 # END OF MEDIUM (EM)
+0x1A 0x001A # SUBSTITUTE (SUB)
+0x1B 0x001B # ESCAPE (ESC)
+0x1C 0x001C # FILE SEPARATOR (IS4)
+0x1D 0x001D # GROUP SEPARATOR (IS3)
+0x1E 0x001E # RECORD SEPARATOR (IS2)
+0x1F 0x001F # UNIT SEPARATOR (IS1)
+0x20 0x0020 # SPACE
+0x21 0x0021 # EXCLAMATION MARK
+0x22 0x0022 # QUOTATION MARK
+0x23 0x0023 # NUMBER SIGN
+0x24 0x0024 # DOLLAR SIGN
+0x25 0x0025 # PERCENT SIGN
+0x26 0x0026 # AMPERSAND
+0x27 0x0027 # APOSTROPHE
+0x28 0x0028 # LEFT PARENTHESIS
+0x29 0x0029 # RIGHT PARENTHESIS
+0x2A 0x002A # ASTERISK
+0x2B 0x002B # PLUS SIGN
+0x2C 0x002C # COMMA
+0x2D 0x002D # HYPHEN-MINUS
+0x2E 0x002E # FULL STOP
+0x2F 0x002F # SOLIDUS
+0x30 0x0030 # DIGIT ZERO
+0x31 0x0031 # DIGIT ONE
+0x32 0x0032 # DIGIT TWO
+0x33 0x0033 # DIGIT THREE
+0x34 0x0034 # DIGIT FOUR
+0x35 0x0035 # DIGIT FIVE
+0x36 0x0036 # DIGIT SIX
+0x37 0x0037 # DIGIT SEVEN
+0x38 0x0038 # DIGIT EIGHT
+0x39 0x0039 # DIGIT NINE
+0x3A 0x003A # COLON
+0x3B 0x003B # SEMICOLON
+0x3C 0x003C # LESS-THAN SIGN
+0x3D 0x003D # EQUALS SIGN
+0x3E 0x003E # GREATER-THAN SIGN
+0x3F 0x003F # QUESTION MARK
+0x40 0x00E0 # LATIN SMALL LETTER A WITH GRAVE
+0x41 0x0041 # LATIN CAPITAL LETTER A
+0x42 0x0042 # LATIN CAPITAL LETTER B
+0x43 0x0043 # LATIN CAPITAL LETTER C
+0x44 0x0044 # LATIN CAPITAL LETTER D
+0x45 0x0045 # LATIN CAPITAL LETTER E
+0x46 0x0046 # LATIN CAPITAL LETTER F
+0x47 0x0047 # LATIN CAPITAL LETTER G
+0x48 0x0048 # LATIN CAPITAL LETTER H
+0x49 0x0049 # LATIN CAPITAL LETTER I
+0x4A 0x004A # LATIN CAPITAL LETTER J
+0x4B 0x004B # LATIN CAPITAL LETTER K
+0x4C 0x004C # LATIN CAPITAL LETTER L
+0x4D 0x004D # LATIN CAPITAL LETTER M
+0x4E 0x004E # LATIN CAPITAL LETTER N
+0x4F 0x004F # LATIN CAPITAL LETTER O
+0x50 0x0050 # LATIN CAPITAL LETTER P
+0x51 0x0051 # LATIN CAPITAL LETTER Q
+0x52 0x0052 # LATIN CAPITAL LETTER R
+0x53 0x0053 # LATIN CAPITAL LETTER S
+0x54 0x0054 # LATIN CAPITAL LETTER T
+0x55 0x0055 # LATIN CAPITAL LETTER U
+0x56 0x0056 # LATIN CAPITAL LETTER V
+0x57 0x0057 # LATIN CAPITAL LETTER W
+0x58 0x0058 # LATIN CAPITAL LETTER X
+0x59 0x0059 # LATIN CAPITAL LETTER Y
+0x5A 0x005A # LATIN CAPITAL LETTER Z
+0x5B 0x00E2 # LATIN SMALL LETTER A WITH CIRCUMFLEX
+0x5C 0x00E7 # LATIN SMALL LETTER C WITH CEDILLA
+0x5D 0x00EA # LATIN SMALL LETTER E WITH CIRCUMFLEX
+0x5E 0x00C9 # LATIN CAPITAL LETTER E WITH ACUTE
+0x5F 0x005F # LOW LINE
+0x60 0x00F4 # LATIN SMALL LETTER O WITH CIRCUMFLEX
+0x61 0x0061 # LATIN SMALL LETTER A
+0x62 0x0062 # LATIN SMALL LETTER B
+0x63 0x0063 # LATIN SMALL LETTER C
+0x64 0x0064 # LATIN SMALL LETTER D
+0x65 0x0065 # LATIN SMALL LETTER E
+0x66 0x0066 # LATIN SMALL LETTER F
+0x67 0x0067 # LATIN SMALL LETTER G
+0x68 0x0068 # LATIN SMALL LETTER H
+0x69 0x0069 # LATIN SMALL LETTER I
+0x6A 0x006A # LATIN SMALL LETTER J
+0x6B 0x006B # LATIN SMALL LETTER K
+0x6C 0x006C # LATIN SMALL LETTER L
+0x6D 0x006D # LATIN SMALL LETTER M
+0x6E 0x006E # LATIN SMALL LETTER N
+0x6F 0x006F # LATIN SMALL LETTER O
+0x70 0x0070 # LATIN SMALL LETTER P
+0x71 0x0071 # LATIN SMALL LETTER Q
+0x72 0x0072 # LATIN SMALL LETTER R
+0x73 0x0073 # LATIN SMALL LETTER S
+0x74 0x0074 # LATIN SMALL LETTER T
+0x75 0x0075 # LATIN SMALL LETTER U
+0x76 0x0076 # LATIN SMALL LETTER V
+0x77 0x0077 # LATIN SMALL LETTER W
+0x78 0x0078 # LATIN SMALL LETTER X
+0x79 0x0079 # LATIN SMALL LETTER Y
+0x7A 0x007A # LATIN SMALL LETTER Z
+0x7B 0x00E9 # LATIN SMALL LETTER E WITH ACUTE
+0x7C 0x00F9 # LATIN SMALL LETTER U WITH GRAVE
+0x7D 0x00E8 # LATIN SMALL LETTER E WITH GRAVE
+0x7E 0x00FB # LATIN SMALL LETTER U WITH CIRCUMFLEX
+0x7F 0x007F # DELETE (DEL)
diff --git a/externals/figlet/fonts/646-cn.flc b/externals/figlet/fonts/646-cn.flc
new file mode 100644
index 0000000000..fc42581b87
--- /dev/null
+++ b/externals/figlet/fonts/646-cn.flc
@@ -0,0 +1,156 @@
+#
+# Name: GB_1988-80 to Unicode
+# Unicode version: 2.0
+# Table version: 0.1
+# Table format: Format A
+# Date: 0097-01-24
+# Authors: John Cowan (conversion)
+# Keld Simonsen (RFC 1345)
+#
+# General notes:
+#
+# This table contains data obtained from RFC 1345 on how
+# GB_1988-80 characters map into Unicode.
+#
+# Format: Three tab-separated columns
+# Column #1 is the GB_1988-80 code (in hex as 0xXX)
+# Column #2 is the Unicode (in hex as 0xXXXX)
+# Column #3 the Unicode name (follows a comment sign, '#')
+#
+# The entries are in GB_1988-80 order
+#
+# Any comments or problems, contact
+#
+# &rem source: ECMA registry
+# &alias iso-ir-57
+# &g0esc x2854 &g1esc x2954 &g2esc x2a54 &g3esc x2b54
+# &alias cn
+# &alias ISO646-CN
+0x00 0x0000 # NULL (NUL)
+0x01 0x0001 # START OF HEADING (SOH)
+0x02 0x0002 # START OF TEXT (STX)
+0x03 0x0003 # END OF TEXT (ETX)
+0x04 0x0004 # END OF TRANSMISSION (EOT)
+0x05 0x0005 # ENQUIRY (ENQ)
+0x06 0x0006 # ACKNOWLEDGE (ACK)
+0x07 0x0007 # BELL (BEL)
+0x08 0x0008 # BACKSPACE (BS)
+0x09 0x0009 # CHARACTER TABULATION (HT)
+0x0A 0x000A # LINE FEED (LF)
+0x0B 0x000B # LINE TABULATION (VT)
+0x0C 0x000C # FORM FEED (FF)
+0x0D 0x000D # CARRIAGE RETURN (CR)
+0x0E 0x000E # SHIFT OUT (SO)
+0x0F 0x000F # SHIFT IN (SI)
+0x10 0x0010 # DATALINK ESCAPE (DLE)
+0x11 0x0011 # DEVICE CONTROL ONE (DC1)
+0x12 0x0012 # DEVICE CONTROL TWO (DC2)
+0x13 0x0013 # DEVICE CONTROL THREE (DC3)
+0x14 0x0014 # DEVICE CONTROL FOUR (DC4)
+0x15 0x0015 # NEGATIVE ACKNOWLEDGE (NAK)
+0x16 0x0016 # SYNCRONOUS IDLE (SYN)
+0x17 0x0017 # END OF TRANSMISSION BLOCK (ETB)
+0x18 0x0018 # CANCEL (CAN)
+0x19 0x0019 # END OF MEDIUM (EM)
+0x1A 0x001A # SUBSTITUTE (SUB)
+0x1B 0x001B # ESCAPE (ESC)
+0x1C 0x001C # FILE SEPARATOR (IS4)
+0x1D 0x001D # GROUP SEPARATOR (IS3)
+0x1E 0x001E # RECORD SEPARATOR (IS2)
+0x1F 0x001F # UNIT SEPARATOR (IS1)
+0x20 0x0020 # SPACE
+0x21 0x0021 # EXCLAMATION MARK
+0x22 0x0022 # QUOTATION MARK
+0x23 0x0023 # NUMBER SIGN
+0x24 0x00A5 # YEN SIGN
+0x25 0x0025 # PERCENT SIGN
+0x26 0x0026 # AMPERSAND
+0x27 0x0027 # APOSTROPHE
+0x28 0x0028 # LEFT PARENTHESIS
+0x29 0x0029 # RIGHT PARENTHESIS
+0x2A 0x002A # ASTERISK
+0x2B 0x002B # PLUS SIGN
+0x2C 0x002C # COMMA
+0x2D 0x002D # HYPHEN-MINUS
+0x2E 0x002E # FULL STOP
+0x2F 0x002F # SOLIDUS
+0x30 0x0030 # DIGIT ZERO
+0x31 0x0031 # DIGIT ONE
+0x32 0x0032 # DIGIT TWO
+0x33 0x0033 # DIGIT THREE
+0x34 0x0034 # DIGIT FOUR
+0x35 0x0035 # DIGIT FIVE
+0x36 0x0036 # DIGIT SIX
+0x37 0x0037 # DIGIT SEVEN
+0x38 0x0038 # DIGIT EIGHT
+0x39 0x0039 # DIGIT NINE
+0x3A 0x003A # COLON
+0x3B 0x003B # SEMICOLON
+0x3C 0x003C # LESS-THAN SIGN
+0x3D 0x003D # EQUALS SIGN
+0x3E 0x003E # GREATER-THAN SIGN
+0x3F 0x003F # QUESTION MARK
+0x40 0x0040 # COMMERCIAL AT
+0x41 0x0041 # LATIN CAPITAL LETTER A
+0x42 0x0042 # LATIN CAPITAL LETTER B
+0x43 0x0043 # LATIN CAPITAL LETTER C
+0x44 0x0044 # LATIN CAPITAL LETTER D
+0x45 0x0045 # LATIN CAPITAL LETTER E
+0x46 0x0046 # LATIN CAPITAL LETTER F
+0x47 0x0047 # LATIN CAPITAL LETTER G
+0x48 0x0048 # LATIN CAPITAL LETTER H
+0x49 0x0049 # LATIN CAPITAL LETTER I
+0x4A 0x004A # LATIN CAPITAL LETTER J
+0x4B 0x004B # LATIN CAPITAL LETTER K
+0x4C 0x004C # LATIN CAPITAL LETTER L
+0x4D 0x004D # LATIN CAPITAL LETTER M
+0x4E 0x004E # LATIN CAPITAL LETTER N
+0x4F 0x004F # LATIN CAPITAL LETTER O
+0x50 0x0050 # LATIN CAPITAL LETTER P
+0x51 0x0051 # LATIN CAPITAL LETTER Q
+0x52 0x0052 # LATIN CAPITAL LETTER R
+0x53 0x0053 # LATIN CAPITAL LETTER S
+0x54 0x0054 # LATIN CAPITAL LETTER T
+0x55 0x0055 # LATIN CAPITAL LETTER U
+0x56 0x0056 # LATIN CAPITAL LETTER V
+0x57 0x0057 # LATIN CAPITAL LETTER W
+0x58 0x0058 # LATIN CAPITAL LETTER X
+0x59 0x0059 # LATIN CAPITAL LETTER Y
+0x5A 0x005A # LATIN CAPITAL LETTER Z
+0x5B 0x005B # LEFT SQUARE BRACKET
+0x5C 0x005C # REVERSE SOLIDUS
+0x5D 0x005D # RIGHT SQUARE BRACKET
+0x5E 0x005E # CIRCUMFLEX ACCENT
+0x5F 0x005F # LOW LINE
+0x60 0x0060 # GRAVE ACCENT
+0x61 0x0061 # LATIN SMALL LETTER A
+0x62 0x0062 # LATIN SMALL LETTER B
+0x63 0x0063 # LATIN SMALL LETTER C
+0x64 0x0064 # LATIN SMALL LETTER D
+0x65 0x0065 # LATIN SMALL LETTER E
+0x66 0x0066 # LATIN SMALL LETTER F
+0x67 0x0067 # LATIN SMALL LETTER G
+0x68 0x0068 # LATIN SMALL LETTER H
+0x69 0x0069 # LATIN SMALL LETTER I
+0x6A 0x006A # LATIN SMALL LETTER J
+0x6B 0x006B # LATIN SMALL LETTER K
+0x6C 0x006C # LATIN SMALL LETTER L
+0x6D 0x006D # LATIN SMALL LETTER M
+0x6E 0x006E # LATIN SMALL LETTER N
+0x6F 0x006F # LATIN SMALL LETTER O
+0x70 0x0070 # LATIN SMALL LETTER P
+0x71 0x0071 # LATIN SMALL LETTER Q
+0x72 0x0072 # LATIN SMALL LETTER R
+0x73 0x0073 # LATIN SMALL LETTER S
+0x74 0x0074 # LATIN SMALL LETTER T
+0x75 0x0075 # LATIN SMALL LETTER U
+0x76 0x0076 # LATIN SMALL LETTER V
+0x77 0x0077 # LATIN SMALL LETTER W
+0x78 0x0078 # LATIN SMALL LETTER X
+0x79 0x0079 # LATIN SMALL LETTER Y
+0x7A 0x007A # LATIN SMALL LETTER Z
+0x7B 0x007B # LEFT CURLY BRACKET
+0x7C 0x007C # VERTICAL LINE
+0x7D 0x007D # RIGHT CURLY BRACKET
+0x7E 0x203E # OVERLINE
+0x7F 0x007F # DELETE (DEL)
diff --git a/externals/figlet/fonts/646-cu.flc b/externals/figlet/fonts/646-cu.flc
new file mode 100644
index 0000000000..a9cd5fdb03
--- /dev/null
+++ b/externals/figlet/fonts/646-cu.flc
@@ -0,0 +1,156 @@
+#
+# Name: NC_NC00-10:81 to Unicode
+# Unicode version: 2.0
+# Table version: 0.1
+# Table format: Format A
+# Date: 0097-01-24
+# Authors: John Cowan (conversion)
+# Keld Simonsen (RFC 1345)
+#
+# General notes:
+#
+# This table contains data obtained from RFC 1345 on how
+# NC_NC00-10:81 characters map into Unicode.
+#
+# Format: Three tab-separated columns
+# Column #1 is the NC_NC00-10:81 code (in hex as 0xXX)
+# Column #2 is the Unicode (in hex as 0xXXXX)
+# Column #3 the Unicode name (follows a comment sign, '#')
+#
+# The entries are in NC_NC00-10:81 order
+#
+# Any comments or problems, contact
+#
+# &rem source: ECMA registry
+# &alias cuba
+# &alias iso-ir-151
+# &alias ISO646-CU
+# &g0esc x282141 &g1esc x292141 &g2esc x2a2141 &g3esc x2b2141
+0x00 0x0000 # NULL (NUL)
+0x01 0x0001 # START OF HEADING (SOH)
+0x02 0x0002 # START OF TEXT (STX)
+0x03 0x0003 # END OF TEXT (ETX)
+0x04 0x0004 # END OF TRANSMISSION (EOT)
+0x05 0x0005 # ENQUIRY (ENQ)
+0x06 0x0006 # ACKNOWLEDGE (ACK)
+0x07 0x0007 # BELL (BEL)
+0x08 0x0008 # BACKSPACE (BS)
+0x09 0x0009 # CHARACTER TABULATION (HT)
+0x0A 0x000A # LINE FEED (LF)
+0x0B 0x000B # LINE TABULATION (VT)
+0x0C 0x000C # FORM FEED (FF)
+0x0D 0x000D # CARRIAGE RETURN (CR)
+0x0E 0x000E # SHIFT OUT (SO)
+0x0F 0x000F # SHIFT IN (SI)
+0x10 0x0010 # DATALINK ESCAPE (DLE)
+0x11 0x0011 # DEVICE CONTROL ONE (DC1)
+0x12 0x0012 # DEVICE CONTROL TWO (DC2)
+0x13 0x0013 # DEVICE CONTROL THREE (DC3)
+0x14 0x0014 # DEVICE CONTROL FOUR (DC4)
+0x15 0x0015 # NEGATIVE ACKNOWLEDGE (NAK)
+0x16 0x0016 # SYNCRONOUS IDLE (SYN)
+0x17 0x0017 # END OF TRANSMISSION BLOCK (ETB)
+0x18 0x0018 # CANCEL (CAN)
+0x19 0x0019 # END OF MEDIUM (EM)
+0x1A 0x001A # SUBSTITUTE (SUB)
+0x1B 0x001B # ESCAPE (ESC)
+0x1C 0x001C # FILE SEPARATOR (IS4)
+0x1D 0x001D # GROUP SEPARATOR (IS3)
+0x1E 0x001E # RECORD SEPARATOR (IS2)
+0x1F 0x001F # UNIT SEPARATOR (IS1)
+0x20 0x0020 # SPACE
+0x21 0x0021 # EXCLAMATION MARK
+0x22 0x0022 # QUOTATION MARK
+0x23 0x0023 # NUMBER SIGN
+0x24 0x00A4 # CURRENCY SIGN
+0x25 0x0025 # PERCENT SIGN
+0x26 0x0026 # AMPERSAND
+0x27 0x0027 # APOSTROPHE
+0x28 0x0028 # LEFT PARENTHESIS
+0x29 0x0029 # RIGHT PARENTHESIS
+0x2A 0x002A # ASTERISK
+0x2B 0x002B # PLUS SIGN
+0x2C 0x002C # COMMA
+0x2D 0x002D # HYPHEN-MINUS
+0x2E 0x002E # FULL STOP
+0x2F 0x002F # SOLIDUS
+0x30 0x0030 # DIGIT ZERO
+0x31 0x0031 # DIGIT ONE
+0x32 0x0032 # DIGIT TWO
+0x33 0x0033 # DIGIT THREE
+0x34 0x0034 # DIGIT FOUR
+0x35 0x0035 # DIGIT FIVE
+0x36 0x0036 # DIGIT SIX
+0x37 0x0037 # DIGIT SEVEN
+0x38 0x0038 # DIGIT EIGHT
+0x39 0x0039 # DIGIT NINE
+0x3A 0x003A # COLON
+0x3B 0x003B # SEMICOLON
+0x3C 0x003C # LESS-THAN SIGN
+0x3D 0x003D # EQUALS SIGN
+0x3E 0x003E # GREATER-THAN SIGN
+0x3F 0x003F # QUESTION MARK
+0x40 0x0040 # COMMERCIAL AT
+0x41 0x0041 # LATIN CAPITAL LETTER A
+0x42 0x0042 # LATIN CAPITAL LETTER B
+0x43 0x0043 # LATIN CAPITAL LETTER C
+0x44 0x0044 # LATIN CAPITAL LETTER D
+0x45 0x0045 # LATIN CAPITAL LETTER E
+0x46 0x0046 # LATIN CAPITAL LETTER F
+0x47 0x0047 # LATIN CAPITAL LETTER G
+0x48 0x0048 # LATIN CAPITAL LETTER H
+0x49 0x0049 # LATIN CAPITAL LETTER I
+0x4A 0x004A # LATIN CAPITAL LETTER J
+0x4B 0x004B # LATIN CAPITAL LETTER K
+0x4C 0x004C # LATIN CAPITAL LETTER L
+0x4D 0x004D # LATIN CAPITAL LETTER M
+0x4E 0x004E # LATIN CAPITAL LETTER N
+0x4F 0x004F # LATIN CAPITAL LETTER O
+0x50 0x0050 # LATIN CAPITAL LETTER P
+0x51 0x0051 # LATIN CAPITAL LETTER Q
+0x52 0x0052 # LATIN CAPITAL LETTER R
+0x53 0x0053 # LATIN CAPITAL LETTER S
+0x54 0x0054 # LATIN CAPITAL LETTER T
+0x55 0x0055 # LATIN CAPITAL LETTER U
+0x56 0x0056 # LATIN CAPITAL LETTER V
+0x57 0x0057 # LATIN CAPITAL LETTER W
+0x58 0x0058 # LATIN CAPITAL LETTER X
+0x59 0x0059 # LATIN CAPITAL LETTER Y
+0x5A 0x005A # LATIN CAPITAL LETTER Z
+0x5B 0x00A1 # INVERTED EXCLAMATION MARK
+0x5C 0x00D1 # LATIN CAPITAL LETTER N WITH TILDE
+0x5D 0x005D # RIGHT SQUARE BRACKET
+0x5E 0x00BF # INVERTED QUESTION MARK
+0x5F 0x005F # LOW LINE
+0x60 0x0060 # GRAVE ACCENT
+0x61 0x0061 # LATIN SMALL LETTER A
+0x62 0x0062 # LATIN SMALL LETTER B
+0x63 0x0063 # LATIN SMALL LETTER C
+0x64 0x0064 # LATIN SMALL LETTER D
+0x65 0x0065 # LATIN SMALL LETTER E
+0x66 0x0066 # LATIN SMALL LETTER F
+0x67 0x0067 # LATIN SMALL LETTER G
+0x68 0x0068 # LATIN SMALL LETTER H
+0x69 0x0069 # LATIN SMALL LETTER I
+0x6A 0x006A # LATIN SMALL LETTER J
+0x6B 0x006B # LATIN SMALL LETTER K
+0x6C 0x006C # LATIN SMALL LETTER L
+0x6D 0x006D # LATIN SMALL LETTER M
+0x6E 0x006E # LATIN SMALL LETTER N
+0x6F 0x006F # LATIN SMALL LETTER O
+0x70 0x0070 # LATIN SMALL LETTER P
+0x71 0x0071 # LATIN SMALL LETTER Q
+0x72 0x0072 # LATIN SMALL LETTER R
+0x73 0x0073 # LATIN SMALL LETTER S
+0x74 0x0074 # LATIN SMALL LETTER T
+0x75 0x0075 # LATIN SMALL LETTER U
+0x76 0x0076 # LATIN SMALL LETTER V
+0x77 0x0077 # LATIN SMALL LETTER W
+0x78 0x0078 # LATIN SMALL LETTER X
+0x79 0x0079 # LATIN SMALL LETTER Y
+0x7A 0x007A # LATIN SMALL LETTER Z
+0x7B 0x00B4 # ACUTE ACCENT
+0x7C 0x00F1 # LATIN SMALL LETTER N WITH TILDE
+0x7D 0x005B # LEFT SQUARE BRACKET
+0x7E 0x00A8 # DIAERESIS
+0x7F 0x007F # DELETE (DEL)
diff --git a/externals/figlet/fonts/646-de.flc b/externals/figlet/fonts/646-de.flc
new file mode 100644
index 0000000000..716a42ffbf
--- /dev/null
+++ b/externals/figlet/fonts/646-de.flc
@@ -0,0 +1,156 @@
+#
+# Name: DIN_66003 to Unicode
+# Unicode version: 2.0
+# Table version: 0.1
+# Table format: Format A
+# Date: 0097-01-24
+# Authors: John Cowan (conversion)
+# Keld Simonsen (RFC 1345)
+#
+# General notes:
+#
+# This table contains data obtained from RFC 1345 on how
+# DIN_66003 characters map into Unicode.
+#
+# Format: Three tab-separated columns
+# Column #1 is the DIN_66003 code (in hex as 0xXX)
+# Column #2 is the Unicode (in hex as 0xXXXX)
+# Column #3 the Unicode name (follows a comment sign, '#')
+#
+# The entries are in DIN_66003 order
+#
+# Any comments or problems, contact
+#
+# &rem source: ECMA registry
+# &alias iso-ir-21
+# &g0esc x284b &g1esc x294b &g2esc x2a4b &g3esc x2b4b
+# &alias de
+# &alias ISO646-DE
+0x00 0x0000 # NULL (NUL)
+0x01 0x0001 # START OF HEADING (SOH)
+0x02 0x0002 # START OF TEXT (STX)
+0x03 0x0003 # END OF TEXT (ETX)
+0x04 0x0004 # END OF TRANSMISSION (EOT)
+0x05 0x0005 # ENQUIRY (ENQ)
+0x06 0x0006 # ACKNOWLEDGE (ACK)
+0x07 0x0007 # BELL (BEL)
+0x08 0x0008 # BACKSPACE (BS)
+0x09 0x0009 # CHARACTER TABULATION (HT)
+0x0A 0x000A # LINE FEED (LF)
+0x0B 0x000B # LINE TABULATION (VT)
+0x0C 0x000C # FORM FEED (FF)
+0x0D 0x000D # CARRIAGE RETURN (CR)
+0x0E 0x000E # SHIFT OUT (SO)
+0x0F 0x000F # SHIFT IN (SI)
+0x10 0x0010 # DATALINK ESCAPE (DLE)
+0x11 0x0011 # DEVICE CONTROL ONE (DC1)
+0x12 0x0012 # DEVICE CONTROL TWO (DC2)
+0x13 0x0013 # DEVICE CONTROL THREE (DC3)
+0x14 0x0014 # DEVICE CONTROL FOUR (DC4)
+0x15 0x0015 # NEGATIVE ACKNOWLEDGE (NAK)
+0x16 0x0016 # SYNCRONOUS IDLE (SYN)
+0x17 0x0017 # END OF TRANSMISSION BLOCK (ETB)
+0x18 0x0018 # CANCEL (CAN)
+0x19 0x0019 # END OF MEDIUM (EM)
+0x1A 0x001A # SUBSTITUTE (SUB)
+0x1B 0x001B # ESCAPE (ESC)
+0x1C 0x001C # FILE SEPARATOR (IS4)
+0x1D 0x001D # GROUP SEPARATOR (IS3)
+0x1E 0x001E # RECORD SEPARATOR (IS2)
+0x1F 0x001F # UNIT SEPARATOR (IS1)
+0x20 0x0020 # SPACE
+0x21 0x0021 # EXCLAMATION MARK
+0x22 0x0022 # QUOTATION MARK
+0x23 0x0023 # NUMBER SIGN
+0x24 0x0024 # DOLLAR SIGN
+0x25 0x0025 # PERCENT SIGN
+0x26 0x0026 # AMPERSAND
+0x27 0x0027 # APOSTROPHE
+0x28 0x0028 # LEFT PARENTHESIS
+0x29 0x0029 # RIGHT PARENTHESIS
+0x2A 0x002A # ASTERISK
+0x2B 0x002B # PLUS SIGN
+0x2C 0x002C # COMMA
+0x2D 0x002D # HYPHEN-MINUS
+0x2E 0x002E # FULL STOP
+0x2F 0x002F # SOLIDUS
+0x30 0x0030 # DIGIT ZERO
+0x31 0x0031 # DIGIT ONE
+0x32 0x0032 # DIGIT TWO
+0x33 0x0033 # DIGIT THREE
+0x34 0x0034 # DIGIT FOUR
+0x35 0x0035 # DIGIT FIVE
+0x36 0x0036 # DIGIT SIX
+0x37 0x0037 # DIGIT SEVEN
+0x38 0x0038 # DIGIT EIGHT
+0x39 0x0039 # DIGIT NINE
+0x3A 0x003A # COLON
+0x3B 0x003B # SEMICOLON
+0x3C 0x003C # LESS-THAN SIGN
+0x3D 0x003D # EQUALS SIGN
+0x3E 0x003E # GREATER-THAN SIGN
+0x3F 0x003F # QUESTION MARK
+0x40 0x00A7 # SECTION SIGN
+0x41 0x0041 # LATIN CAPITAL LETTER A
+0x42 0x0042 # LATIN CAPITAL LETTER B
+0x43 0x0043 # LATIN CAPITAL LETTER C
+0x44 0x0044 # LATIN CAPITAL LETTER D
+0x45 0x0045 # LATIN CAPITAL LETTER E
+0x46 0x0046 # LATIN CAPITAL LETTER F
+0x47 0x0047 # LATIN CAPITAL LETTER G
+0x48 0x0048 # LATIN CAPITAL LETTER H
+0x49 0x0049 # LATIN CAPITAL LETTER I
+0x4A 0x004A # LATIN CAPITAL LETTER J
+0x4B 0x004B # LATIN CAPITAL LETTER K
+0x4C 0x004C # LATIN CAPITAL LETTER L
+0x4D 0x004D # LATIN CAPITAL LETTER M
+0x4E 0x004E # LATIN CAPITAL LETTER N
+0x4F 0x004F # LATIN CAPITAL LETTER O
+0x50 0x0050 # LATIN CAPITAL LETTER P
+0x51 0x0051 # LATIN CAPITAL LETTER Q
+0x52 0x0052 # LATIN CAPITAL LETTER R
+0x53 0x0053 # LATIN CAPITAL LETTER S
+0x54 0x0054 # LATIN CAPITAL LETTER T
+0x55 0x0055 # LATIN CAPITAL LETTER U
+0x56 0x0056 # LATIN CAPITAL LETTER V
+0x57 0x0057 # LATIN CAPITAL LETTER W
+0x58 0x0058 # LATIN CAPITAL LETTER X
+0x59 0x0059 # LATIN CAPITAL LETTER Y
+0x5A 0x005A # LATIN CAPITAL LETTER Z
+0x5B 0x00C4 # LATIN CAPITAL LETTER A WITH DIAERESIS
+0x5C 0x00D6 # LATIN CAPITAL LETTER O WITH DIAERESIS
+0x5D 0x00DC # LATIN CAPITAL LETTER U WITH DIAERESIS
+0x5E 0x005E # CIRCUMFLEX ACCENT
+0x5F 0x005F # LOW LINE
+0x60 0x0060 # GRAVE ACCENT
+0x61 0x0061 # LATIN SMALL LETTER A
+0x62 0x0062 # LATIN SMALL LETTER B
+0x63 0x0063 # LATIN SMALL LETTER C
+0x64 0x0064 # LATIN SMALL LETTER D
+0x65 0x0065 # LATIN SMALL LETTER E
+0x66 0x0066 # LATIN SMALL LETTER F
+0x67 0x0067 # LATIN SMALL LETTER G
+0x68 0x0068 # LATIN SMALL LETTER H
+0x69 0x0069 # LATIN SMALL LETTER I
+0x6A 0x006A # LATIN SMALL LETTER J
+0x6B 0x006B # LATIN SMALL LETTER K
+0x6C 0x006C # LATIN SMALL LETTER L
+0x6D 0x006D # LATIN SMALL LETTER M
+0x6E 0x006E # LATIN SMALL LETTER N
+0x6F 0x006F # LATIN SMALL LETTER O
+0x70 0x0070 # LATIN SMALL LETTER P
+0x71 0x0071 # LATIN SMALL LETTER Q
+0x72 0x0072 # LATIN SMALL LETTER R
+0x73 0x0073 # LATIN SMALL LETTER S
+0x74 0x0074 # LATIN SMALL LETTER T
+0x75 0x0075 # LATIN SMALL LETTER U
+0x76 0x0076 # LATIN SMALL LETTER V
+0x77 0x0077 # LATIN SMALL LETTER W
+0x78 0x0078 # LATIN SMALL LETTER X
+0x79 0x0079 # LATIN SMALL LETTER Y
+0x7A 0x007A # LATIN SMALL LETTER Z
+0x7B 0x00E4 # LATIN SMALL LETTER A WITH DIAERESIS
+0x7C 0x00F6 # LATIN SMALL LETTER O WITH DIAERESIS
+0x7D 0x00FC # LATIN SMALL LETTER U WITH DIAERESIS
+0x7E 0x00DF # LATIN SMALL LETTER SHARP S (German)
+0x7F 0x007F # DELETE (DEL)
diff --git a/externals/figlet/fonts/646-dk.flc b/externals/figlet/fonts/646-dk.flc
new file mode 100644
index 0000000000..3d9ddae013
--- /dev/null
+++ b/externals/figlet/fonts/646-dk.flc
@@ -0,0 +1,155 @@
+#
+# Name: DS_2089 to Unicode
+# Unicode version: 2.0
+# Table version: 0.1
+# Table format: Format A
+# Date: 0097-01-24
+# Authors: John Cowan (conversion)
+# Keld Simonsen (RFC 1345)
+#
+# General notes:
+#
+# This table contains data obtained from RFC 1345 on how
+# DS_2089 characters map into Unicode.
+#
+# Format: Three tab-separated columns
+# Column #1 is the DS_2089 code (in hex as 0xXX)
+# Column #2 is the Unicode (in hex as 0xXXXX)
+# Column #3 the Unicode name (follows a comment sign, '#')
+#
+# The entries are in DS_2089 order
+#
+# Any comments or problems, contact
+#
+# &rem source: Danish Standard, DS 2089, February 1974
+# &alias DS2089
+# &alias ISO646-DK
+# &alias dk
+0x00 0x0000 # NULL (NUL)
+0x01 0x0001 # START OF HEADING (SOH)
+0x02 0x0002 # START OF TEXT (STX)
+0x03 0x0003 # END OF TEXT (ETX)
+0x04 0x0004 # END OF TRANSMISSION (EOT)
+0x05 0x0005 # ENQUIRY (ENQ)
+0x06 0x0006 # ACKNOWLEDGE (ACK)
+0x07 0x0007 # BELL (BEL)
+0x08 0x0008 # BACKSPACE (BS)
+0x09 0x0009 # CHARACTER TABULATION (HT)
+0x0A 0x000A # LINE FEED (LF)
+0x0B 0x000B # LINE TABULATION (VT)
+0x0C 0x000C # FORM FEED (FF)
+0x0D 0x000D # CARRIAGE RETURN (CR)
+0x0E 0x000E # SHIFT OUT (SO)
+0x0F 0x000F # SHIFT IN (SI)
+0x10 0x0010 # DATALINK ESCAPE (DLE)
+0x11 0x0011 # DEVICE CONTROL ONE (DC1)
+0x12 0x0012 # DEVICE CONTROL TWO (DC2)
+0x13 0x0013 # DEVICE CONTROL THREE (DC3)
+0x14 0x0014 # DEVICE CONTROL FOUR (DC4)
+0x15 0x0015 # NEGATIVE ACKNOWLEDGE (NAK)
+0x16 0x0016 # SYNCRONOUS IDLE (SYN)
+0x17 0x0017 # END OF TRANSMISSION BLOCK (ETB)
+0x18 0x0018 # CANCEL (CAN)
+0x19 0x0019 # END OF MEDIUM (EM)
+0x1A 0x001A # SUBSTITUTE (SUB)
+0x1B 0x001B # ESCAPE (ESC)
+0x1C 0x001C # FILE SEPARATOR (IS4)
+0x1D 0x001D # GROUP SEPARATOR (IS3)
+0x1E 0x001E # RECORD SEPARATOR (IS2)
+0x1F 0x001F # UNIT SEPARATOR (IS1)
+0x20 0x0020 # SPACE
+0x21 0x0021 # EXCLAMATION MARK
+0x22 0x0022 # QUOTATION MARK
+0x23 0x0023 # NUMBER SIGN
+0x24 0x0024 # DOLLAR SIGN
+0x25 0x0025 # PERCENT SIGN
+0x26 0x0026 # AMPERSAND
+0x27 0x0027 # APOSTROPHE
+0x28 0x0028 # LEFT PARENTHESIS
+0x29 0x0029 # RIGHT PARENTHESIS
+0x2A 0x002A # ASTERISK
+0x2B 0x002B # PLUS SIGN
+0x2C 0x002C # COMMA
+0x2D 0x002D # HYPHEN-MINUS
+0x2E 0x002E # FULL STOP
+0x2F 0x002F # SOLIDUS
+0x30 0x0030 # DIGIT ZERO
+0x31 0x0031 # DIGIT ONE
+0x32 0x0032 # DIGIT TWO
+0x33 0x0033 # DIGIT THREE
+0x34 0x0034 # DIGIT FOUR
+0x35 0x0035 # DIGIT FIVE
+0x36 0x0036 # DIGIT SIX
+0x37 0x0037 # DIGIT SEVEN
+0x38 0x0038 # DIGIT EIGHT
+0x39 0x0039 # DIGIT NINE
+0x3A 0x003A # COLON
+0x3B 0x003B # SEMICOLON
+0x3C 0x003C # LESS-THAN SIGN
+0x3D 0x003D # EQUALS SIGN
+0x3E 0x003E # GREATER-THAN SIGN
+0x3F 0x003F # QUESTION MARK
+0x40 0x0040 # COMMERCIAL AT
+0x41 0x0041 # LATIN CAPITAL LETTER A
+0x42 0x0042 # LATIN CAPITAL LETTER B
+0x43 0x0043 # LATIN CAPITAL LETTER C
+0x44 0x0044 # LATIN CAPITAL LETTER D
+0x45 0x0045 # LATIN CAPITAL LETTER E
+0x46 0x0046 # LATIN CAPITAL LETTER F
+0x47 0x0047 # LATIN CAPITAL LETTER G
+0x48 0x0048 # LATIN CAPITAL LETTER H
+0x49 0x0049 # LATIN CAPITAL LETTER I
+0x4A 0x004A # LATIN CAPITAL LETTER J
+0x4B 0x004B # LATIN CAPITAL LETTER K
+0x4C 0x004C # LATIN CAPITAL LETTER L
+0x4D 0x004D # LATIN CAPITAL LETTER M
+0x4E 0x004E # LATIN CAPITAL LETTER N
+0x4F 0x004F # LATIN CAPITAL LETTER O
+0x50 0x0050 # LATIN CAPITAL LETTER P
+0x51 0x0051 # LATIN CAPITAL LETTER Q
+0x52 0x0052 # LATIN CAPITAL LETTER R
+0x53 0x0053 # LATIN CAPITAL LETTER S
+0x54 0x0054 # LATIN CAPITAL LETTER T
+0x55 0x0055 # LATIN CAPITAL LETTER U
+0x56 0x0056 # LATIN CAPITAL LETTER V
+0x57 0x0057 # LATIN CAPITAL LETTER W
+0x58 0x0058 # LATIN CAPITAL LETTER X
+0x59 0x0059 # LATIN CAPITAL LETTER Y
+0x5A 0x005A # LATIN CAPITAL LETTER Z
+0x5B 0x00C6 # LATIN CAPITAL LETTER AE
+0x5C 0x00D8 # LATIN CAPITAL LETTER O WITH STROKE
+0x5D 0x00C5 # LATIN CAPITAL LETTER A WITH RING ABOVE
+0x5E 0x005E # CIRCUMFLEX ACCENT
+0x5F 0x005F # LOW LINE
+0x60 0x0060 # GRAVE ACCENT
+0x61 0x0061 # LATIN SMALL LETTER A
+0x62 0x0062 # LATIN SMALL LETTER B
+0x63 0x0063 # LATIN SMALL LETTER C
+0x64 0x0064 # LATIN SMALL LETTER D
+0x65 0x0065 # LATIN SMALL LETTER E
+0x66 0x0066 # LATIN SMALL LETTER F
+0x67 0x0067 # LATIN SMALL LETTER G
+0x68 0x0068 # LATIN SMALL LETTER H
+0x69 0x0069 # LATIN SMALL LETTER I
+0x6A 0x006A # LATIN SMALL LETTER J
+0x6B 0x006B # LATIN SMALL LETTER K
+0x6C 0x006C # LATIN SMALL LETTER L
+0x6D 0x006D # LATIN SMALL LETTER M
+0x6E 0x006E # LATIN SMALL LETTER N
+0x6F 0x006F # LATIN SMALL LETTER O
+0x70 0x0070 # LATIN SMALL LETTER P
+0x71 0x0071 # LATIN SMALL LETTER Q
+0x72 0x0072 # LATIN SMALL LETTER R
+0x73 0x0073 # LATIN SMALL LETTER S
+0x74 0x0074 # LATIN SMALL LETTER T
+0x75 0x0075 # LATIN SMALL LETTER U
+0x76 0x0076 # LATIN SMALL LETTER V
+0x77 0x0077 # LATIN SMALL LETTER W
+0x78 0x0078 # LATIN SMALL LETTER X
+0x79 0x0079 # LATIN SMALL LETTER Y
+0x7A 0x007A # LATIN SMALL LETTER Z
+0x7B 0x00E6 # LATIN SMALL LETTER AE
+0x7C 0x00F8 # LATIN SMALL LETTER O WITH STROKE
+0x7D 0x00E5 # LATIN SMALL LETTER A WITH RING ABOVE
+0x7E 0x007E # TILDE
+0x7F 0x007F # DELETE (DEL)
diff --git a/externals/figlet/fonts/646-es.flc b/externals/figlet/fonts/646-es.flc
new file mode 100644
index 0000000000..b996d786b3
--- /dev/null
+++ b/externals/figlet/fonts/646-es.flc
@@ -0,0 +1,155 @@
+#
+# Name: ES to Unicode
+# Unicode version: 2.0
+# Table version: 0.1
+# Table format: Format A
+# Date: 0097-01-24
+# Authors: John Cowan (conversion)
+# Keld Simonsen (RFC 1345)
+#
+# General notes:
+#
+# This table contains data obtained from RFC 1345 on how
+# ES characters map into Unicode.
+#
+# Format: Three tab-separated columns
+# Column #1 is the ES code (in hex as 0xXX)
+# Column #2 is the Unicode (in hex as 0xXXXX)
+# Column #3 the Unicode name (follows a comment sign, '#')
+#
+# The entries are in ES order
+#
+# Any comments or problems, contact
+#
+# &rem source: ECMA registry
+# &alias iso-ir-17
+# &alias ISO646-ES
+# &g0esc x285a &g1esc x295a &g2esc x2a5a &g3esc x2b5a
+0x00 0x0000 # NULL (NUL)
+0x01 0x0001 # START OF HEADING (SOH)
+0x02 0x0002 # START OF TEXT (STX)
+0x03 0x0003 # END OF TEXT (ETX)
+0x04 0x0004 # END OF TRANSMISSION (EOT)
+0x05 0x0005 # ENQUIRY (ENQ)
+0x06 0x0006 # ACKNOWLEDGE (ACK)
+0x07 0x0007 # BELL (BEL)
+0x08 0x0008 # BACKSPACE (BS)
+0x09 0x0009 # CHARACTER TABULATION (HT)
+0x0A 0x000A # LINE FEED (LF)
+0x0B 0x000B # LINE TABULATION (VT)
+0x0C 0x000C # FORM FEED (FF)
+0x0D 0x000D # CARRIAGE RETURN (CR)
+0x0E 0x000E # SHIFT OUT (SO)
+0x0F 0x000F # SHIFT IN (SI)
+0x10 0x0010 # DATALINK ESCAPE (DLE)
+0x11 0x0011 # DEVICE CONTROL ONE (DC1)
+0x12 0x0012 # DEVICE CONTROL TWO (DC2)
+0x13 0x0013 # DEVICE CONTROL THREE (DC3)
+0x14 0x0014 # DEVICE CONTROL FOUR (DC4)
+0x15 0x0015 # NEGATIVE ACKNOWLEDGE (NAK)
+0x16 0x0016 # SYNCRONOUS IDLE (SYN)
+0x17 0x0017 # END OF TRANSMISSION BLOCK (ETB)
+0x18 0x0018 # CANCEL (CAN)
+0x19 0x0019 # END OF MEDIUM (EM)
+0x1A 0x001A # SUBSTITUTE (SUB)
+0x1B 0x001B # ESCAPE (ESC)
+0x1C 0x001C # FILE SEPARATOR (IS4)
+0x1D 0x001D # GROUP SEPARATOR (IS3)
+0x1E 0x001E # RECORD SEPARATOR (IS2)
+0x1F 0x001F # UNIT SEPARATOR (IS1)
+0x20 0x0020 # SPACE
+0x21 0x0021 # EXCLAMATION MARK
+0x22 0x0022 # QUOTATION MARK
+0x23 0x00A3 # POUND SIGN
+0x24 0x0024 # DOLLAR SIGN
+0x25 0x0025 # PERCENT SIGN
+0x26 0x0026 # AMPERSAND
+0x27 0x0027 # APOSTROPHE
+0x28 0x0028 # LEFT PARENTHESIS
+0x29 0x0029 # RIGHT PARENTHESIS
+0x2A 0x002A # ASTERISK
+0x2B 0x002B # PLUS SIGN
+0x2C 0x002C # COMMA
+0x2D 0x002D # HYPHEN-MINUS
+0x2E 0x002E # FULL STOP
+0x2F 0x002F # SOLIDUS
+0x30 0x0030 # DIGIT ZERO
+0x31 0x0031 # DIGIT ONE
+0x32 0x0032 # DIGIT TWO
+0x33 0x0033 # DIGIT THREE
+0x34 0x0034 # DIGIT FOUR
+0x35 0x0035 # DIGIT FIVE
+0x36 0x0036 # DIGIT SIX
+0x37 0x0037 # DIGIT SEVEN
+0x38 0x0038 # DIGIT EIGHT
+0x39 0x0039 # DIGIT NINE
+0x3A 0x003A # COLON
+0x3B 0x003B # SEMICOLON
+0x3C 0x003C # LESS-THAN SIGN
+0x3D 0x003D # EQUALS SIGN
+0x3E 0x003E # GREATER-THAN SIGN
+0x3F 0x003F # QUESTION MARK
+0x40 0x00A7 # SECTION SIGN
+0x41 0x0041 # LATIN CAPITAL LETTER A
+0x42 0x0042 # LATIN CAPITAL LETTER B
+0x43 0x0043 # LATIN CAPITAL LETTER C
+0x44 0x0044 # LATIN CAPITAL LETTER D
+0x45 0x0045 # LATIN CAPITAL LETTER E
+0x46 0x0046 # LATIN CAPITAL LETTER F
+0x47 0x0047 # LATIN CAPITAL LETTER G
+0x48 0x0048 # LATIN CAPITAL LETTER H
+0x49 0x0049 # LATIN CAPITAL LETTER I
+0x4A 0x004A # LATIN CAPITAL LETTER J
+0x4B 0x004B # LATIN CAPITAL LETTER K
+0x4C 0x004C # LATIN CAPITAL LETTER L
+0x4D 0x004D # LATIN CAPITAL LETTER M
+0x4E 0x004E # LATIN CAPITAL LETTER N
+0x4F 0x004F # LATIN CAPITAL LETTER O
+0x50 0x0050 # LATIN CAPITAL LETTER P
+0x51 0x0051 # LATIN CAPITAL LETTER Q
+0x52 0x0052 # LATIN CAPITAL LETTER R
+0x53 0x0053 # LATIN CAPITAL LETTER S
+0x54 0x0054 # LATIN CAPITAL LETTER T
+0x55 0x0055 # LATIN CAPITAL LETTER U
+0x56 0x0056 # LATIN CAPITAL LETTER V
+0x57 0x0057 # LATIN CAPITAL LETTER W
+0x58 0x0058 # LATIN CAPITAL LETTER X
+0x59 0x0059 # LATIN CAPITAL LETTER Y
+0x5A 0x005A # LATIN CAPITAL LETTER Z
+0x5B 0x00A1 # INVERTED EXCLAMATION MARK
+0x5C 0x00D1 # LATIN CAPITAL LETTER N WITH TILDE
+0x5D 0x00BF # INVERTED QUESTION MARK
+0x5E 0x005E # CIRCUMFLEX ACCENT
+0x5F 0x005F # LOW LINE
+0x60 0x0060 # GRAVE ACCENT
+0x61 0x0061 # LATIN SMALL LETTER A
+0x62 0x0062 # LATIN SMALL LETTER B
+0x63 0x0063 # LATIN SMALL LETTER C
+0x64 0x0064 # LATIN SMALL LETTER D
+0x65 0x0065 # LATIN SMALL LETTER E
+0x66 0x0066 # LATIN SMALL LETTER F
+0x67 0x0067 # LATIN SMALL LETTER G
+0x68 0x0068 # LATIN SMALL LETTER H
+0x69 0x0069 # LATIN SMALL LETTER I
+0x6A 0x006A # LATIN SMALL LETTER J
+0x6B 0x006B # LATIN SMALL LETTER K
+0x6C 0x006C # LATIN SMALL LETTER L
+0x6D 0x006D # LATIN SMALL LETTER M
+0x6E 0x006E # LATIN SMALL LETTER N
+0x6F 0x006F # LATIN SMALL LETTER O
+0x70 0x0070 # LATIN SMALL LETTER P
+0x71 0x0071 # LATIN SMALL LETTER Q
+0x72 0x0072 # LATIN SMALL LETTER R
+0x73 0x0073 # LATIN SMALL LETTER S
+0x74 0x0074 # LATIN SMALL LETTER T
+0x75 0x0075 # LATIN SMALL LETTER U
+0x76 0x0076 # LATIN SMALL LETTER V
+0x77 0x0077 # LATIN SMALL LETTER W
+0x78 0x0078 # LATIN SMALL LETTER X
+0x79 0x0079 # LATIN SMALL LETTER Y
+0x7A 0x007A # LATIN SMALL LETTER Z
+0x7B 0x00B0 # DEGREE SIGN
+0x7C 0x00F1 # LATIN SMALL LETTER N WITH TILDE
+0x7D 0x00E7 # LATIN SMALL LETTER C WITH CEDILLA
+0x7E 0x007E # TILDE
+0x7F 0x007F # DELETE (DEL)
diff --git a/externals/figlet/fonts/646-es2.flc b/externals/figlet/fonts/646-es2.flc
new file mode 100644
index 0000000000..1f282ceb78
--- /dev/null
+++ b/externals/figlet/fonts/646-es2.flc
@@ -0,0 +1,155 @@
+#
+# Name: ES2 to Unicode
+# Unicode version: 2.0
+# Table version: 0.1
+# Table format: Format A
+# Date: 0097-01-24
+# Authors: John Cowan (conversion)
+# Keld Simonsen (RFC 1345)
+#
+# General notes:
+#
+# This table contains data obtained from RFC 1345 on how
+# ES2 characters map into Unicode.
+#
+# Format: Three tab-separated columns
+# Column #1 is the ES2 code (in hex as 0xXX)
+# Column #2 is the Unicode (in hex as 0xXXXX)
+# Column #3 the Unicode name (follows a comment sign, '#')
+#
+# The entries are in ES2 order
+#
+# Any comments or problems, contact
+#
+# &rem source: ECMA registry
+# &alias iso-ir-85
+# &alias ISO646-ES2
+# &g0esc x2868 &g1esc x2968 &g2esc x2a68 &g3esc x2b68
+0x00 0x0000 # NULL (NUL)
+0x01 0x0001 # START OF HEADING (SOH)
+0x02 0x0002 # START OF TEXT (STX)
+0x03 0x0003 # END OF TEXT (ETX)
+0x04 0x0004 # END OF TRANSMISSION (EOT)
+0x05 0x0005 # ENQUIRY (ENQ)
+0x06 0x0006 # ACKNOWLEDGE (ACK)
+0x07 0x0007 # BELL (BEL)
+0x08 0x0008 # BACKSPACE (BS)
+0x09 0x0009 # CHARACTER TABULATION (HT)
+0x0A 0x000A # LINE FEED (LF)
+0x0B 0x000B # LINE TABULATION (VT)
+0x0C 0x000C # FORM FEED (FF)
+0x0D 0x000D # CARRIAGE RETURN (CR)
+0x0E 0x000E # SHIFT OUT (SO)
+0x0F 0x000F # SHIFT IN (SI)
+0x10 0x0010 # DATALINK ESCAPE (DLE)
+0x11 0x0011 # DEVICE CONTROL ONE (DC1)
+0x12 0x0012 # DEVICE CONTROL TWO (DC2)
+0x13 0x0013 # DEVICE CONTROL THREE (DC3)
+0x14 0x0014 # DEVICE CONTROL FOUR (DC4)
+0x15 0x0015 # NEGATIVE ACKNOWLEDGE (NAK)
+0x16 0x0016 # SYNCRONOUS IDLE (SYN)
+0x17 0x0017 # END OF TRANSMISSION BLOCK (ETB)
+0x18 0x0018 # CANCEL (CAN)
+0x19 0x0019 # END OF MEDIUM (EM)
+0x1A 0x001A # SUBSTITUTE (SUB)
+0x1B 0x001B # ESCAPE (ESC)
+0x1C 0x001C # FILE SEPARATOR (IS4)
+0x1D 0x001D # GROUP SEPARATOR (IS3)
+0x1E 0x001E # RECORD SEPARATOR (IS2)
+0x1F 0x001F # UNIT SEPARATOR (IS1)
+0x20 0x0020 # SPACE
+0x21 0x0021 # EXCLAMATION MARK
+0x22 0x0022 # QUOTATION MARK
+0x23 0x0023 # NUMBER SIGN
+0x24 0x0024 # DOLLAR SIGN
+0x25 0x0025 # PERCENT SIGN
+0x26 0x0026 # AMPERSAND
+0x27 0x0027 # APOSTROPHE
+0x28 0x0028 # LEFT PARENTHESIS
+0x29 0x0029 # RIGHT PARENTHESIS
+0x2A 0x002A # ASTERISK
+0x2B 0x002B # PLUS SIGN
+0x2C 0x002C # COMMA
+0x2D 0x002D # HYPHEN-MINUS
+0x2E 0x002E # FULL STOP
+0x2F 0x002F # SOLIDUS
+0x30 0x0030 # DIGIT ZERO
+0x31 0x0031 # DIGIT ONE
+0x32 0x0032 # DIGIT TWO
+0x33 0x0033 # DIGIT THREE
+0x34 0x0034 # DIGIT FOUR
+0x35 0x0035 # DIGIT FIVE
+0x36 0x0036 # DIGIT SIX
+0x37 0x0037 # DIGIT SEVEN
+0x38 0x0038 # DIGIT EIGHT
+0x39 0x0039 # DIGIT NINE
+0x3A 0x003A # COLON
+0x3B 0x003B # SEMICOLON
+0x3C 0x003C # LESS-THAN SIGN
+0x3D 0x003D # EQUALS SIGN
+0x3E 0x003E # GREATER-THAN SIGN
+0x3F 0x003F # QUESTION MARK
+0x40 0x2219 # BULLET OPERATOR
+0x41 0x0041 # LATIN CAPITAL LETTER A
+0x42 0x0042 # LATIN CAPITAL LETTER B
+0x43 0x0043 # LATIN CAPITAL LETTER C
+0x44 0x0044 # LATIN CAPITAL LETTER D
+0x45 0x0045 # LATIN CAPITAL LETTER E
+0x46 0x0046 # LATIN CAPITAL LETTER F
+0x47 0x0047 # LATIN CAPITAL LETTER G
+0x48 0x0048 # LATIN CAPITAL LETTER H
+0x49 0x0049 # LATIN CAPITAL LETTER I
+0x4A 0x004A # LATIN CAPITAL LETTER J
+0x4B 0x004B # LATIN CAPITAL LETTER K
+0x4C 0x004C # LATIN CAPITAL LETTER L
+0x4D 0x004D # LATIN CAPITAL LETTER M
+0x4E 0x004E # LATIN CAPITAL LETTER N
+0x4F 0x004F # LATIN CAPITAL LETTER O
+0x50 0x0050 # LATIN CAPITAL LETTER P
+0x51 0x0051 # LATIN CAPITAL LETTER Q
+0x52 0x0052 # LATIN CAPITAL LETTER R
+0x53 0x0053 # LATIN CAPITAL LETTER S
+0x54 0x0054 # LATIN CAPITAL LETTER T
+0x55 0x0055 # LATIN CAPITAL LETTER U
+0x56 0x0056 # LATIN CAPITAL LETTER V
+0x57 0x0057 # LATIN CAPITAL LETTER W
+0x58 0x0058 # LATIN CAPITAL LETTER X
+0x59 0x0059 # LATIN CAPITAL LETTER Y
+0x5A 0x005A # LATIN CAPITAL LETTER Z
+0x5B 0x00A1 # INVERTED EXCLAMATION MARK
+0x5C 0x00D1 # LATIN CAPITAL LETTER N WITH TILDE
+0x5D 0x00C7 # LATIN CAPITAL LETTER C WITH CEDILLA
+0x5E 0x00BF # INVERTED QUESTION MARK
+0x5F 0x005F # LOW LINE
+0x60 0x0060 # GRAVE ACCENT
+0x61 0x0061 # LATIN SMALL LETTER A
+0x62 0x0062 # LATIN SMALL LETTER B
+0x63 0x0063 # LATIN SMALL LETTER C
+0x64 0x0064 # LATIN SMALL LETTER D
+0x65 0x0065 # LATIN SMALL LETTER E
+0x66 0x0066 # LATIN SMALL LETTER F
+0x67 0x0067 # LATIN SMALL LETTER G
+0x68 0x0068 # LATIN SMALL LETTER H
+0x69 0x0069 # LATIN SMALL LETTER I
+0x6A 0x006A # LATIN SMALL LETTER J
+0x6B 0x006B # LATIN SMALL LETTER K
+0x6C 0x006C # LATIN SMALL LETTER L
+0x6D 0x006D # LATIN SMALL LETTER M
+0x6E 0x006E # LATIN SMALL LETTER N
+0x6F 0x006F # LATIN SMALL LETTER O
+0x70 0x0070 # LATIN SMALL LETTER P
+0x71 0x0071 # LATIN SMALL LETTER Q
+0x72 0x0072 # LATIN SMALL LETTER R
+0x73 0x0073 # LATIN SMALL LETTER S
+0x74 0x0074 # LATIN SMALL LETTER T
+0x75 0x0075 # LATIN SMALL LETTER U
+0x76 0x0076 # LATIN SMALL LETTER V
+0x77 0x0077 # LATIN SMALL LETTER W
+0x78 0x0078 # LATIN SMALL LETTER X
+0x79 0x0079 # LATIN SMALL LETTER Y
+0x7A 0x007A # LATIN SMALL LETTER Z
+0x7B 0x00B4 # ACUTE ACCENT
+0x7C 0x00F1 # LATIN SMALL LETTER N WITH TILDE
+0x7D 0x00E7 # LATIN SMALL LETTER C WITH CEDILLA
+0x7E 0x00A8 # DIAERESIS
+0x7F 0x007F # DELETE (DEL)
diff --git a/externals/figlet/fonts/646-fr.flc b/externals/figlet/fonts/646-fr.flc
new file mode 100644
index 0000000000..225b2fb8e6
--- /dev/null
+++ b/externals/figlet/fonts/646-fr.flc
@@ -0,0 +1,156 @@
+#
+# Name: NF_Z_62-010 to Unicode
+# Unicode version: 2.0
+# Table version: 0.1
+# Table format: Format A
+# Date: 0097-01-24
+# Authors: John Cowan (conversion)
+# Keld Simonsen (RFC 1345)
+#
+# General notes:
+#
+# This table contains data obtained from RFC 1345 on how
+# NF_Z_62-010 characters map into Unicode.
+#
+# Format: Three tab-separated columns
+# Column #1 is the NF_Z_62-010 code (in hex as 0xXX)
+# Column #2 is the Unicode (in hex as 0xXXXX)
+# Column #3 the Unicode name (follows a comment sign, '#')
+#
+# The entries are in NF_Z_62-010 order
+#
+# Any comments or problems, contact
+#
+# &rem source: ECMA registry
+# &alias iso-ir-69
+# &alias ISO646-FR
+# &g0esc x2866 &g1esc x2966 &g2esc x2a66 &g3esc x2b66
+# &alias fr
+0x00 0x0000 # NULL (NUL)
+0x01 0x0001 # START OF HEADING (SOH)
+0x02 0x0002 # START OF TEXT (STX)
+0x03 0x0003 # END OF TEXT (ETX)
+0x04 0x0004 # END OF TRANSMISSION (EOT)
+0x05 0x0005 # ENQUIRY (ENQ)
+0x06 0x0006 # ACKNOWLEDGE (ACK)
+0x07 0x0007 # BELL (BEL)
+0x08 0x0008 # BACKSPACE (BS)
+0x09 0x0009 # CHARACTER TABULATION (HT)
+0x0A 0x000A # LINE FEED (LF)
+0x0B 0x000B # LINE TABULATION (VT)
+0x0C 0x000C # FORM FEED (FF)
+0x0D 0x000D # CARRIAGE RETURN (CR)
+0x0E 0x000E # SHIFT OUT (SO)
+0x0F 0x000F # SHIFT IN (SI)
+0x10 0x0010 # DATALINK ESCAPE (DLE)
+0x11 0x0011 # DEVICE CONTROL ONE (DC1)
+0x12 0x0012 # DEVICE CONTROL TWO (DC2)
+0x13 0x0013 # DEVICE CONTROL THREE (DC3)
+0x14 0x0014 # DEVICE CONTROL FOUR (DC4)
+0x15 0x0015 # NEGATIVE ACKNOWLEDGE (NAK)
+0x16 0x0016 # SYNCRONOUS IDLE (SYN)
+0x17 0x0017 # END OF TRANSMISSION BLOCK (ETB)
+0x18 0x0018 # CANCEL (CAN)
+0x19 0x0019 # END OF MEDIUM (EM)
+0x1A 0x001A # SUBSTITUTE (SUB)
+0x1B 0x001B # ESCAPE (ESC)
+0x1C 0x001C # FILE SEPARATOR (IS4)
+0x1D 0x001D # GROUP SEPARATOR (IS3)
+0x1E 0x001E # RECORD SEPARATOR (IS2)
+0x1F 0x001F # UNIT SEPARATOR (IS1)
+0x20 0x0020 # SPACE
+0x21 0x0021 # EXCLAMATION MARK
+0x22 0x0022 # QUOTATION MARK
+0x23 0x00A3 # POUND SIGN
+0x24 0x0024 # DOLLAR SIGN
+0x25 0x0025 # PERCENT SIGN
+0x26 0x0026 # AMPERSAND
+0x27 0x0027 # APOSTROPHE
+0x28 0x0028 # LEFT PARENTHESIS
+0x29 0x0029 # RIGHT PARENTHESIS
+0x2A 0x002A # ASTERISK
+0x2B 0x002B # PLUS SIGN
+0x2C 0x002C # COMMA
+0x2D 0x002D # HYPHEN-MINUS
+0x2E 0x002E # FULL STOP
+0x2F 0x002F # SOLIDUS
+0x30 0x0030 # DIGIT ZERO
+0x31 0x0031 # DIGIT ONE
+0x32 0x0032 # DIGIT TWO
+0x33 0x0033 # DIGIT THREE
+0x34 0x0034 # DIGIT FOUR
+0x35 0x0035 # DIGIT FIVE
+0x36 0x0036 # DIGIT SIX
+0x37 0x0037 # DIGIT SEVEN
+0x38 0x0038 # DIGIT EIGHT
+0x39 0x0039 # DIGIT NINE
+0x3A 0x003A # COLON
+0x3B 0x003B # SEMICOLON
+0x3C 0x003C # LESS-THAN SIGN
+0x3D 0x003D # EQUALS SIGN
+0x3E 0x003E # GREATER-THAN SIGN
+0x3F 0x003F # QUESTION MARK
+0x40 0x00E0 # LATIN SMALL LETTER A WITH GRAVE
+0x41 0x0041 # LATIN CAPITAL LETTER A
+0x42 0x0042 # LATIN CAPITAL LETTER B
+0x43 0x0043 # LATIN CAPITAL LETTER C
+0x44 0x0044 # LATIN CAPITAL LETTER D
+0x45 0x0045 # LATIN CAPITAL LETTER E
+0x46 0x0046 # LATIN CAPITAL LETTER F
+0x47 0x0047 # LATIN CAPITAL LETTER G
+0x48 0x0048 # LATIN CAPITAL LETTER H
+0x49 0x0049 # LATIN CAPITAL LETTER I
+0x4A 0x004A # LATIN CAPITAL LETTER J
+0x4B 0x004B # LATIN CAPITAL LETTER K
+0x4C 0x004C # LATIN CAPITAL LETTER L
+0x4D 0x004D # LATIN CAPITAL LETTER M
+0x4E 0x004E # LATIN CAPITAL LETTER N
+0x4F 0x004F # LATIN CAPITAL LETTER O
+0x50 0x0050 # LATIN CAPITAL LETTER P
+0x51 0x0051 # LATIN CAPITAL LETTER Q
+0x52 0x0052 # LATIN CAPITAL LETTER R
+0x53 0x0053 # LATIN CAPITAL LETTER S
+0x54 0x0054 # LATIN CAPITAL LETTER T
+0x55 0x0055 # LATIN CAPITAL LETTER U
+0x56 0x0056 # LATIN CAPITAL LETTER V
+0x57 0x0057 # LATIN CAPITAL LETTER W
+0x58 0x0058 # LATIN CAPITAL LETTER X
+0x59 0x0059 # LATIN CAPITAL LETTER Y
+0x5A 0x005A # LATIN CAPITAL LETTER Z
+0x5B 0x00B0 # DEGREE SIGN
+0x5C 0x00E7 # LATIN SMALL LETTER C WITH CEDILLA
+0x5D 0x00A7 # SECTION SIGN
+0x5E 0x005E # CIRCUMFLEX ACCENT
+0x5F 0x005F # LOW LINE
+0x60 0x00B5 # MICRO SIGN
+0x61 0x0061 # LATIN SMALL LETTER A
+0x62 0x0062 # LATIN SMALL LETTER B
+0x63 0x0063 # LATIN SMALL LETTER C
+0x64 0x0064 # LATIN SMALL LETTER D
+0x65 0x0065 # LATIN SMALL LETTER E
+0x66 0x0066 # LATIN SMALL LETTER F
+0x67 0x0067 # LATIN SMALL LETTER G
+0x68 0x0068 # LATIN SMALL LETTER H
+0x69 0x0069 # LATIN SMALL LETTER I
+0x6A 0x006A # LATIN SMALL LETTER J
+0x6B 0x006B # LATIN SMALL LETTER K
+0x6C 0x006C # LATIN SMALL LETTER L
+0x6D 0x006D # LATIN SMALL LETTER M
+0x6E 0x006E # LATIN SMALL LETTER N
+0x6F 0x006F # LATIN SMALL LETTER O
+0x70 0x0070 # LATIN SMALL LETTER P
+0x71 0x0071 # LATIN SMALL LETTER Q
+0x72 0x0072 # LATIN SMALL LETTER R
+0x73 0x0073 # LATIN SMALL LETTER S
+0x74 0x0074 # LATIN SMALL LETTER T
+0x75 0x0075 # LATIN SMALL LETTER U
+0x76 0x0076 # LATIN SMALL LETTER V
+0x77 0x0077 # LATIN SMALL LETTER W
+0x78 0x0078 # LATIN SMALL LETTER X
+0x79 0x0079 # LATIN SMALL LETTER Y
+0x7A 0x007A # LATIN SMALL LETTER Z
+0x7B 0x00E9 # LATIN SMALL LETTER E WITH ACUTE
+0x7C 0x00F9 # LATIN SMALL LETTER U WITH GRAVE
+0x7D 0x00E8 # LATIN SMALL LETTER E WITH GRAVE
+0x7E 0x00A8 # DIAERESIS
+0x7F 0x007F # DELETE (DEL)
diff --git a/externals/figlet/fonts/646-gb.flc b/externals/figlet/fonts/646-gb.flc
new file mode 100644
index 0000000000..4e9d648c9b
--- /dev/null
+++ b/externals/figlet/fonts/646-gb.flc
@@ -0,0 +1,157 @@
+#
+# Name: BS_4730 to Unicode
+# Unicode version: 2.0
+# Table version: 0.1
+# Table format: Format A
+# Date: 0097-01-24
+# Authors: John Cowan (conversion)
+# Keld Simonsen (RFC 1345)
+#
+# General notes:
+#
+# This table contains data obtained from RFC 1345 on how
+# BS_4730 characters map into Unicode.
+#
+# Format: Three tab-separated columns
+# Column #1 is the BS_4730 code (in hex as 0xXX)
+# Column #2 is the Unicode (in hex as 0xXXXX)
+# Column #3 the Unicode name (follows a comment sign, '#')
+#
+# The entries are in BS_4730 order
+#
+# Any comments or problems, contact
+#
+# &rem source: ECMA registry
+# &alias iso-ir-4
+# &alias ISO646-GB
+# &g0esc x2841 &g1esc x2941 &g2esc x2a41 &g3esc x2b41
+# &alias gb
+# &alias uk
+0x00 0x0000 # NULL (NUL)
+0x01 0x0001 # START OF HEADING (SOH)
+0x02 0x0002 # START OF TEXT (STX)
+0x03 0x0003 # END OF TEXT (ETX)
+0x04 0x0004 # END OF TRANSMISSION (EOT)
+0x05 0x0005 # ENQUIRY (ENQ)
+0x06 0x0006 # ACKNOWLEDGE (ACK)
+0x07 0x0007 # BELL (BEL)
+0x08 0x0008 # BACKSPACE (BS)
+0x09 0x0009 # CHARACTER TABULATION (HT)
+0x0A 0x000A # LINE FEED (LF)
+0x0B 0x000B # LINE TABULATION (VT)
+0x0C 0x000C # FORM FEED (FF)
+0x0D 0x000D # CARRIAGE RETURN (CR)
+0x0E 0x000E # SHIFT OUT (SO)
+0x0F 0x000F # SHIFT IN (SI)
+0x10 0x0010 # DATALINK ESCAPE (DLE)
+0x11 0x0011 # DEVICE CONTROL ONE (DC1)
+0x12 0x0012 # DEVICE CONTROL TWO (DC2)
+0x13 0x0013 # DEVICE CONTROL THREE (DC3)
+0x14 0x0014 # DEVICE CONTROL FOUR (DC4)
+0x15 0x0015 # NEGATIVE ACKNOWLEDGE (NAK)
+0x16 0x0016 # SYNCRONOUS IDLE (SYN)
+0x17 0x0017 # END OF TRANSMISSION BLOCK (ETB)
+0x18 0x0018 # CANCEL (CAN)
+0x19 0x0019 # END OF MEDIUM (EM)
+0x1A 0x001A # SUBSTITUTE (SUB)
+0x1B 0x001B # ESCAPE (ESC)
+0x1C 0x001C # FILE SEPARATOR (IS4)
+0x1D 0x001D # GROUP SEPARATOR (IS3)
+0x1E 0x001E # RECORD SEPARATOR (IS2)
+0x1F 0x001F # UNIT SEPARATOR (IS1)
+0x20 0x0020 # SPACE
+0x21 0x0021 # EXCLAMATION MARK
+0x22 0x0022 # QUOTATION MARK
+0x23 0x00A3 # POUND SIGN
+0x24 0x0024 # DOLLAR SIGN
+0x25 0x0025 # PERCENT SIGN
+0x26 0x0026 # AMPERSAND
+0x27 0x0027 # APOSTROPHE
+0x28 0x0028 # LEFT PARENTHESIS
+0x29 0x0029 # RIGHT PARENTHESIS
+0x2A 0x002A # ASTERISK
+0x2B 0x002B # PLUS SIGN
+0x2C 0x002C # COMMA
+0x2D 0x002D # HYPHEN-MINUS
+0x2E 0x002E # FULL STOP
+0x2F 0x002F # SOLIDUS
+0x30 0x0030 # DIGIT ZERO
+0x31 0x0031 # DIGIT ONE
+0x32 0x0032 # DIGIT TWO
+0x33 0x0033 # DIGIT THREE
+0x34 0x0034 # DIGIT FOUR
+0x35 0x0035 # DIGIT FIVE
+0x36 0x0036 # DIGIT SIX
+0x37 0x0037 # DIGIT SEVEN
+0x38 0x0038 # DIGIT EIGHT
+0x39 0x0039 # DIGIT NINE
+0x3A 0x003A # COLON
+0x3B 0x003B # SEMICOLON
+0x3C 0x003C # LESS-THAN SIGN
+0x3D 0x003D # EQUALS SIGN
+0x3E 0x003E # GREATER-THAN SIGN
+0x3F 0x003F # QUESTION MARK
+0x40 0x0040 # COMMERCIAL AT
+0x41 0x0041 # LATIN CAPITAL LETTER A
+0x42 0x0042 # LATIN CAPITAL LETTER B
+0x43 0x0043 # LATIN CAPITAL LETTER C
+0x44 0x0044 # LATIN CAPITAL LETTER D
+0x45 0x0045 # LATIN CAPITAL LETTER E
+0x46 0x0046 # LATIN CAPITAL LETTER F
+0x47 0x0047 # LATIN CAPITAL LETTER G
+0x48 0x0048 # LATIN CAPITAL LETTER H
+0x49 0x0049 # LATIN CAPITAL LETTER I
+0x4A 0x004A # LATIN CAPITAL LETTER J
+0x4B 0x004B # LATIN CAPITAL LETTER K
+0x4C 0x004C # LATIN CAPITAL LETTER L
+0x4D 0x004D # LATIN CAPITAL LETTER M
+0x4E 0x004E # LATIN CAPITAL LETTER N
+0x4F 0x004F # LATIN CAPITAL LETTER O
+0x50 0x0050 # LATIN CAPITAL LETTER P
+0x51 0x0051 # LATIN CAPITAL LETTER Q
+0x52 0x0052 # LATIN CAPITAL LETTER R
+0x53 0x0053 # LATIN CAPITAL LETTER S
+0x54 0x0054 # LATIN CAPITAL LETTER T
+0x55 0x0055 # LATIN CAPITAL LETTER U
+0x56 0x0056 # LATIN CAPITAL LETTER V
+0x57 0x0057 # LATIN CAPITAL LETTER W
+0x58 0x0058 # LATIN CAPITAL LETTER X
+0x59 0x0059 # LATIN CAPITAL LETTER Y
+0x5A 0x005A # LATIN CAPITAL LETTER Z
+0x5B 0x005B # LEFT SQUARE BRACKET
+0x5C 0x005C # REVERSE SOLIDUS
+0x5D 0x005D # RIGHT SQUARE BRACKET
+0x5E 0x005E # CIRCUMFLEX ACCENT
+0x5F 0x005F # LOW LINE
+0x60 0x0060 # GRAVE ACCENT
+0x61 0x0061 # LATIN SMALL LETTER A
+0x62 0x0062 # LATIN SMALL LETTER B
+0x63 0x0063 # LATIN SMALL LETTER C
+0x64 0x0064 # LATIN SMALL LETTER D
+0x65 0x0065 # LATIN SMALL LETTER E
+0x66 0x0066 # LATIN SMALL LETTER F
+0x67 0x0067 # LATIN SMALL LETTER G
+0x68 0x0068 # LATIN SMALL LETTER H
+0x69 0x0069 # LATIN SMALL LETTER I
+0x6A 0x006A # LATIN SMALL LETTER J
+0x6B 0x006B # LATIN SMALL LETTER K
+0x6C 0x006C # LATIN SMALL LETTER L
+0x6D 0x006D # LATIN SMALL LETTER M
+0x6E 0x006E # LATIN SMALL LETTER N
+0x6F 0x006F # LATIN SMALL LETTER O
+0x70 0x0070 # LATIN SMALL LETTER P
+0x71 0x0071 # LATIN SMALL LETTER Q
+0x72 0x0072 # LATIN SMALL LETTER R
+0x73 0x0073 # LATIN SMALL LETTER S
+0x74 0x0074 # LATIN SMALL LETTER T
+0x75 0x0075 # LATIN SMALL LETTER U
+0x76 0x0076 # LATIN SMALL LETTER V
+0x77 0x0077 # LATIN SMALL LETTER W
+0x78 0x0078 # LATIN SMALL LETTER X
+0x79 0x0079 # LATIN SMALL LETTER Y
+0x7A 0x007A # LATIN SMALL LETTER Z
+0x7B 0x007B # LEFT CURLY BRACKET
+0x7C 0x007C # VERTICAL LINE
+0x7D 0x007D # RIGHT CURLY BRACKET
+0x7E 0x203E # OVERLINE
+0x7F 0x007F # DELETE (DEL)
diff --git a/externals/figlet/fonts/646-hu.flc b/externals/figlet/fonts/646-hu.flc
new file mode 100644
index 0000000000..9ad58c31e7
--- /dev/null
+++ b/externals/figlet/fonts/646-hu.flc
@@ -0,0 +1,156 @@
+#
+# Name: MSZ_7795.3 to Unicode
+# Unicode version: 2.0
+# Table version: 0.1
+# Table format: Format A
+# Date: 0097-01-24
+# Authors: John Cowan (conversion)
+# Keld Simonsen (RFC 1345)
+#
+# General notes:
+#
+# This table contains data obtained from RFC 1345 on how
+# MSZ_7795.3 characters map into Unicode.
+#
+# Format: Three tab-separated columns
+# Column #1 is the MSZ_7795.3 code (in hex as 0xXX)
+# Column #2 is the Unicode (in hex as 0xXXXX)
+# Column #3 the Unicode name (follows a comment sign, '#')
+#
+# The entries are in MSZ_7795.3 order
+#
+# Any comments or problems, contact
+#
+# &rem source: ECMA registry
+# &alias iso-ir-86
+# &alias ISO646-HU
+# &g0esc x2869 &g1esc x2969 &g2esc x2a69 &g3esc x2b69
+# &alias hu
+0x00 0x0000 # NULL (NUL)
+0x01 0x0001 # START OF HEADING (SOH)
+0x02 0x0002 # START OF TEXT (STX)
+0x03 0x0003 # END OF TEXT (ETX)
+0x04 0x0004 # END OF TRANSMISSION (EOT)
+0x05 0x0005 # ENQUIRY (ENQ)
+0x06 0x0006 # ACKNOWLEDGE (ACK)
+0x07 0x0007 # BELL (BEL)
+0x08 0x0008 # BACKSPACE (BS)
+0x09 0x0009 # CHARACTER TABULATION (HT)
+0x0A 0x000A # LINE FEED (LF)
+0x0B 0x000B # LINE TABULATION (VT)
+0x0C 0x000C # FORM FEED (FF)
+0x0D 0x000D # CARRIAGE RETURN (CR)
+0x0E 0x000E # SHIFT OUT (SO)
+0x0F 0x000F # SHIFT IN (SI)
+0x10 0x0010 # DATALINK ESCAPE (DLE)
+0x11 0x0011 # DEVICE CONTROL ONE (DC1)
+0x12 0x0012 # DEVICE CONTROL TWO (DC2)
+0x13 0x0013 # DEVICE CONTROL THREE (DC3)
+0x14 0x0014 # DEVICE CONTROL FOUR (DC4)
+0x15 0x0015 # NEGATIVE ACKNOWLEDGE (NAK)
+0x16 0x0016 # SYNCRONOUS IDLE (SYN)
+0x17 0x0017 # END OF TRANSMISSION BLOCK (ETB)
+0x18 0x0018 # CANCEL (CAN)
+0x19 0x0019 # END OF MEDIUM (EM)
+0x1A 0x001A # SUBSTITUTE (SUB)
+0x1B 0x001B # ESCAPE (ESC)
+0x1C 0x001C # FILE SEPARATOR (IS4)
+0x1D 0x001D # GROUP SEPARATOR (IS3)
+0x1E 0x001E # RECORD SEPARATOR (IS2)
+0x1F 0x001F # UNIT SEPARATOR (IS1)
+0x20 0x0020 # SPACE
+0x21 0x0021 # EXCLAMATION MARK
+0x22 0x0022 # QUOTATION MARK
+0x23 0x0023 # NUMBER SIGN
+0x24 0x00A4 # CURRENCY SIGN
+0x25 0x0025 # PERCENT SIGN
+0x26 0x0026 # AMPERSAND
+0x27 0x0027 # APOSTROPHE
+0x28 0x0028 # LEFT PARENTHESIS
+0x29 0x0029 # RIGHT PARENTHESIS
+0x2A 0x002A # ASTERISK
+0x2B 0x002B # PLUS SIGN
+0x2C 0x002C # COMMA
+0x2D 0x002D # HYPHEN-MINUS
+0x2E 0x002E # FULL STOP
+0x2F 0x002F # SOLIDUS
+0x30 0x0030 # DIGIT ZERO
+0x31 0x0031 # DIGIT ONE
+0x32 0x0032 # DIGIT TWO
+0x33 0x0033 # DIGIT THREE
+0x34 0x0034 # DIGIT FOUR
+0x35 0x0035 # DIGIT FIVE
+0x36 0x0036 # DIGIT SIX
+0x37 0x0037 # DIGIT SEVEN
+0x38 0x0038 # DIGIT EIGHT
+0x39 0x0039 # DIGIT NINE
+0x3A 0x003A # COLON
+0x3B 0x003B # SEMICOLON
+0x3C 0x003C # LESS-THAN SIGN
+0x3D 0x003D # EQUALS SIGN
+0x3E 0x003E # GREATER-THAN SIGN
+0x3F 0x003F # QUESTION MARK
+0x40 0x00C1 # LATIN CAPITAL LETTER A WITH ACUTE
+0x41 0x0041 # LATIN CAPITAL LETTER A
+0x42 0x0042 # LATIN CAPITAL LETTER B
+0x43 0x0043 # LATIN CAPITAL LETTER C
+0x44 0x0044 # LATIN CAPITAL LETTER D
+0x45 0x0045 # LATIN CAPITAL LETTER E
+0x46 0x0046 # LATIN CAPITAL LETTER F
+0x47 0x0047 # LATIN CAPITAL LETTER G
+0x48 0x0048 # LATIN CAPITAL LETTER H
+0x49 0x0049 # LATIN CAPITAL LETTER I
+0x4A 0x004A # LATIN CAPITAL LETTER J
+0x4B 0x004B # LATIN CAPITAL LETTER K
+0x4C 0x004C # LATIN CAPITAL LETTER L
+0x4D 0x004D # LATIN CAPITAL LETTER M
+0x4E 0x004E # LATIN CAPITAL LETTER N
+0x4F 0x004F # LATIN CAPITAL LETTER O
+0x50 0x0050 # LATIN CAPITAL LETTER P
+0x51 0x0051 # LATIN CAPITAL LETTER Q
+0x52 0x0052 # LATIN CAPITAL LETTER R
+0x53 0x0053 # LATIN CAPITAL LETTER S
+0x54 0x0054 # LATIN CAPITAL LETTER T
+0x55 0x0055 # LATIN CAPITAL LETTER U
+0x56 0x0056 # LATIN CAPITAL LETTER V
+0x57 0x0057 # LATIN CAPITAL LETTER W
+0x58 0x0058 # LATIN CAPITAL LETTER X
+0x59 0x0059 # LATIN CAPITAL LETTER Y
+0x5A 0x005A # LATIN CAPITAL LETTER Z
+0x5B 0x00C9 # LATIN CAPITAL LETTER E WITH ACUTE
+0x5C 0x00D6 # LATIN CAPITAL LETTER O WITH DIAERESIS
+0x5D 0x00DC # LATIN CAPITAL LETTER U WITH DIAERESIS
+0x5E 0x005E # CIRCUMFLEX ACCENT
+0x5F 0x005F # LOW LINE
+0x60 0x00E1 # LATIN SMALL LETTER A WITH ACUTE
+0x61 0x0061 # LATIN SMALL LETTER A
+0x62 0x0062 # LATIN SMALL LETTER B
+0x63 0x0063 # LATIN SMALL LETTER C
+0x64 0x0064 # LATIN SMALL LETTER D
+0x65 0x0065 # LATIN SMALL LETTER E
+0x66 0x0066 # LATIN SMALL LETTER F
+0x67 0x0067 # LATIN SMALL LETTER G
+0x68 0x0068 # LATIN SMALL LETTER H
+0x69 0x0069 # LATIN SMALL LETTER I
+0x6A 0x006A # LATIN SMALL LETTER J
+0x6B 0x006B # LATIN SMALL LETTER K
+0x6C 0x006C # LATIN SMALL LETTER L
+0x6D 0x006D # LATIN SMALL LETTER M
+0x6E 0x006E # LATIN SMALL LETTER N
+0x6F 0x006F # LATIN SMALL LETTER O
+0x70 0x0070 # LATIN SMALL LETTER P
+0x71 0x0071 # LATIN SMALL LETTER Q
+0x72 0x0072 # LATIN SMALL LETTER R
+0x73 0x0073 # LATIN SMALL LETTER S
+0x74 0x0074 # LATIN SMALL LETTER T
+0x75 0x0075 # LATIN SMALL LETTER U
+0x76 0x0076 # LATIN SMALL LETTER V
+0x77 0x0077 # LATIN SMALL LETTER W
+0x78 0x0078 # LATIN SMALL LETTER X
+0x79 0x0079 # LATIN SMALL LETTER Y
+0x7A 0x007A # LATIN SMALL LETTER Z
+0x7B 0x00E9 # LATIN SMALL LETTER E WITH ACUTE
+0x7C 0x00F6 # LATIN SMALL LETTER O WITH DIAERESIS
+0x7D 0x00FC # LATIN SMALL LETTER U WITH DIAERESIS
+0x7E 0x02DD # DOUBLE ACUTE ACCENT
+0x7F 0x007F # DELETE (DEL)
diff --git a/externals/figlet/fonts/646-irv.flc b/externals/figlet/fonts/646-irv.flc
new file mode 100644
index 0000000000..caf629229c
--- /dev/null
+++ b/externals/figlet/fonts/646-irv.flc
@@ -0,0 +1,155 @@
+#
+# Name: ISO_646.irv:1983 to Unicode
+# Unicode version: 2.0
+# Table version: 0.1
+# Table format: Format A
+# Date: 0097-01-24
+# Authors: John Cowan (conversion)
+# Keld Simonsen (RFC 1345)
+#
+# General notes:
+#
+# This table contains data obtained from RFC 1345 on how
+# ISO_646.irv:1983 characters map into Unicode.
+#
+# Format: Three tab-separated columns
+# Column #1 is the ISO_646.irv:1983 code (in hex as 0xXX)
+# Column #2 is the Unicode (in hex as 0xXXXX)
+# Column #3 the Unicode name (follows a comment sign, '#')
+#
+# The entries are in ISO_646.irv:1983 order
+#
+# Any comments or problems, contact
+#
+# &rem source: ECMA registry
+# &alias iso-ir-2
+# &alias irv
+# &g0esc x2840 &g1esc x2940 &g2esc x2a40 &g3esc x2b40
+0x00 0x0000 # NULL (NUL)
+0x01 0x0001 # START OF HEADING (SOH)
+0x02 0x0002 # START OF TEXT (STX)
+0x03 0x0003 # END OF TEXT (ETX)
+0x04 0x0004 # END OF TRANSMISSION (EOT)
+0x05 0x0005 # ENQUIRY (ENQ)
+0x06 0x0006 # ACKNOWLEDGE (ACK)
+0x07 0x0007 # BELL (BEL)
+0x08 0x0008 # BACKSPACE (BS)
+0x09 0x0009 # CHARACTER TABULATION (HT)
+0x0A 0x000A # LINE FEED (LF)
+0x0B 0x000B # LINE TABULATION (VT)
+0x0C 0x000C # FORM FEED (FF)
+0x0D 0x000D # CARRIAGE RETURN (CR)
+0x0E 0x000E # SHIFT OUT (SO)
+0x0F 0x000F # SHIFT IN (SI)
+0x10 0x0010 # DATALINK ESCAPE (DLE)
+0x11 0x0011 # DEVICE CONTROL ONE (DC1)
+0x12 0x0012 # DEVICE CONTROL TWO (DC2)
+0x13 0x0013 # DEVICE CONTROL THREE (DC3)
+0x14 0x0014 # DEVICE CONTROL FOUR (DC4)
+0x15 0x0015 # NEGATIVE ACKNOWLEDGE (NAK)
+0x16 0x0016 # SYNCRONOUS IDLE (SYN)
+0x17 0x0017 # END OF TRANSMISSION BLOCK (ETB)
+0x18 0x0018 # CANCEL (CAN)
+0x19 0x0019 # END OF MEDIUM (EM)
+0x1A 0x001A # SUBSTITUTE (SUB)
+0x1B 0x001B # ESCAPE (ESC)
+0x1C 0x001C # FILE SEPARATOR (IS4)
+0x1D 0x001D # GROUP SEPARATOR (IS3)
+0x1E 0x001E # RECORD SEPARATOR (IS2)
+0x1F 0x001F # UNIT SEPARATOR (IS1)
+0x20 0x0020 # SPACE
+0x21 0x0021 # EXCLAMATION MARK
+0x22 0x0022 # QUOTATION MARK
+0x23 0x0023 # NUMBER SIGN
+0x24 0x00A4 # CURRENCY SIGN
+0x25 0x0025 # PERCENT SIGN
+0x26 0x0026 # AMPERSAND
+0x27 0x0027 # APOSTROPHE
+0x28 0x0028 # LEFT PARENTHESIS
+0x29 0x0029 # RIGHT PARENTHESIS
+0x2A 0x002A # ASTERISK
+0x2B 0x002B # PLUS SIGN
+0x2C 0x002C # COMMA
+0x2D 0x002D # HYPHEN-MINUS
+0x2E 0x002E # FULL STOP
+0x2F 0x002F # SOLIDUS
+0x30 0x0030 # DIGIT ZERO
+0x31 0x0031 # DIGIT ONE
+0x32 0x0032 # DIGIT TWO
+0x33 0x0033 # DIGIT THREE
+0x34 0x0034 # DIGIT FOUR
+0x35 0x0035 # DIGIT FIVE
+0x36 0x0036 # DIGIT SIX
+0x37 0x0037 # DIGIT SEVEN
+0x38 0x0038 # DIGIT EIGHT
+0x39 0x0039 # DIGIT NINE
+0x3A 0x003A # COLON
+0x3B 0x003B # SEMICOLON
+0x3C 0x003C # LESS-THAN SIGN
+0x3D 0x003D # EQUALS SIGN
+0x3E 0x003E # GREATER-THAN SIGN
+0x3F 0x003F # QUESTION MARK
+0x40 0x0040 # COMMERCIAL AT
+0x41 0x0041 # LATIN CAPITAL LETTER A
+0x42 0x0042 # LATIN CAPITAL LETTER B
+0x43 0x0043 # LATIN CAPITAL LETTER C
+0x44 0x0044 # LATIN CAPITAL LETTER D
+0x45 0x0045 # LATIN CAPITAL LETTER E
+0x46 0x0046 # LATIN CAPITAL LETTER F
+0x47 0x0047 # LATIN CAPITAL LETTER G
+0x48 0x0048 # LATIN CAPITAL LETTER H
+0x49 0x0049 # LATIN CAPITAL LETTER I
+0x4A 0x004A # LATIN CAPITAL LETTER J
+0x4B 0x004B # LATIN CAPITAL LETTER K
+0x4C 0x004C # LATIN CAPITAL LETTER L
+0x4D 0x004D # LATIN CAPITAL LETTER M
+0x4E 0x004E # LATIN CAPITAL LETTER N
+0x4F 0x004F # LATIN CAPITAL LETTER O
+0x50 0x0050 # LATIN CAPITAL LETTER P
+0x51 0x0051 # LATIN CAPITAL LETTER Q
+0x52 0x0052 # LATIN CAPITAL LETTER R
+0x53 0x0053 # LATIN CAPITAL LETTER S
+0x54 0x0054 # LATIN CAPITAL LETTER T
+0x55 0x0055 # LATIN CAPITAL LETTER U
+0x56 0x0056 # LATIN CAPITAL LETTER V
+0x57 0x0057 # LATIN CAPITAL LETTER W
+0x58 0x0058 # LATIN CAPITAL LETTER X
+0x59 0x0059 # LATIN CAPITAL LETTER Y
+0x5A 0x005A # LATIN CAPITAL LETTER Z
+0x5B 0x005B # LEFT SQUARE BRACKET
+0x5C 0x005C # REVERSE SOLIDUS
+0x5D 0x005D # RIGHT SQUARE BRACKET
+0x5E 0x005E # CIRCUMFLEX ACCENT
+0x5F 0x005F # LOW LINE
+0x60 0x0060 # GRAVE ACCENT
+0x61 0x0061 # LATIN SMALL LETTER A
+0x62 0x0062 # LATIN SMALL LETTER B
+0x63 0x0063 # LATIN SMALL LETTER C
+0x64 0x0064 # LATIN SMALL LETTER D
+0x65 0x0065 # LATIN SMALL LETTER E
+0x66 0x0066 # LATIN SMALL LETTER F
+0x67 0x0067 # LATIN SMALL LETTER G
+0x68 0x0068 # LATIN SMALL LETTER H
+0x69 0x0069 # LATIN SMALL LETTER I
+0x6A 0x006A # LATIN SMALL LETTER J
+0x6B 0x006B # LATIN SMALL LETTER K
+0x6C 0x006C # LATIN SMALL LETTER L
+0x6D 0x006D # LATIN SMALL LETTER M
+0x6E 0x006E # LATIN SMALL LETTER N
+0x6F 0x006F # LATIN SMALL LETTER O
+0x70 0x0070 # LATIN SMALL LETTER P
+0x71 0x0071 # LATIN SMALL LETTER Q
+0x72 0x0072 # LATIN SMALL LETTER R
+0x73 0x0073 # LATIN SMALL LETTER S
+0x74 0x0074 # LATIN SMALL LETTER T
+0x75 0x0075 # LATIN SMALL LETTER U
+0x76 0x0076 # LATIN SMALL LETTER V
+0x77 0x0077 # LATIN SMALL LETTER W
+0x78 0x0078 # LATIN SMALL LETTER X
+0x79 0x0079 # LATIN SMALL LETTER Y
+0x7A 0x007A # LATIN SMALL LETTER Z
+0x7B 0x007B # LEFT CURLY BRACKET
+0x7C 0x007C # VERTICAL LINE
+0x7D 0x007D # RIGHT CURLY BRACKET
+0x7E 0x203E # OVERLINE
+0x7F 0x007F # DELETE (DEL)
diff --git a/externals/figlet/fonts/646-it.flc b/externals/figlet/fonts/646-it.flc
new file mode 100644
index 0000000000..657125bd85
--- /dev/null
+++ b/externals/figlet/fonts/646-it.flc
@@ -0,0 +1,155 @@
+#
+# Name: IT to Unicode
+# Unicode version: 2.0
+# Table version: 0.1
+# Table format: Format A
+# Date: 0097-01-24
+# Authors: John Cowan (conversion)
+# Keld Simonsen (RFC 1345)
+#
+# General notes:
+#
+# This table contains data obtained from RFC 1345 on how
+# IT characters map into Unicode.
+#
+# Format: Three tab-separated columns
+# Column #1 is the IT code (in hex as 0xXX)
+# Column #2 is the Unicode (in hex as 0xXXXX)
+# Column #3 the Unicode name (follows a comment sign, '#')
+#
+# The entries are in IT order
+#
+# Any comments or problems, contact
+#
+# &rem source: ECMA registry
+# &alias iso-ir-15
+# &alias ISO646-IT
+# &g0esc x2859 &g1esc x2959 &g2esc x2a59 &g3esc x2b59
+0x00 0x0000 # NULL (NUL)
+0x01 0x0001 # START OF HEADING (SOH)
+0x02 0x0002 # START OF TEXT (STX)
+0x03 0x0003 # END OF TEXT (ETX)
+0x04 0x0004 # END OF TRANSMISSION (EOT)
+0x05 0x0005 # ENQUIRY (ENQ)
+0x06 0x0006 # ACKNOWLEDGE (ACK)
+0x07 0x0007 # BELL (BEL)
+0x08 0x0008 # BACKSPACE (BS)
+0x09 0x0009 # CHARACTER TABULATION (HT)
+0x0A 0x000A # LINE FEED (LF)
+0x0B 0x000B # LINE TABULATION (VT)
+0x0C 0x000C # FORM FEED (FF)
+0x0D 0x000D # CARRIAGE RETURN (CR)
+0x0E 0x000E # SHIFT OUT (SO)
+0x0F 0x000F # SHIFT IN (SI)
+0x10 0x0010 # DATALINK ESCAPE (DLE)
+0x11 0x0011 # DEVICE CONTROL ONE (DC1)
+0x12 0x0012 # DEVICE CONTROL TWO (DC2)
+0x13 0x0013 # DEVICE CONTROL THREE (DC3)
+0x14 0x0014 # DEVICE CONTROL FOUR (DC4)
+0x15 0x0015 # NEGATIVE ACKNOWLEDGE (NAK)
+0x16 0x0016 # SYNCRONOUS IDLE (SYN)
+0x17 0x0017 # END OF TRANSMISSION BLOCK (ETB)
+0x18 0x0018 # CANCEL (CAN)
+0x19 0x0019 # END OF MEDIUM (EM)
+0x1A 0x001A # SUBSTITUTE (SUB)
+0x1B 0x001B # ESCAPE (ESC)
+0x1C 0x001C # FILE SEPARATOR (IS4)
+0x1D 0x001D # GROUP SEPARATOR (IS3)
+0x1E 0x001E # RECORD SEPARATOR (IS2)
+0x1F 0x001F # UNIT SEPARATOR (IS1)
+0x20 0x0020 # SPACE
+0x21 0x0021 # EXCLAMATION MARK
+0x22 0x0022 # QUOTATION MARK
+0x23 0x00A3 # POUND SIGN
+0x24 0x0024 # DOLLAR SIGN
+0x25 0x0025 # PERCENT SIGN
+0x26 0x0026 # AMPERSAND
+0x27 0x0027 # APOSTROPHE
+0x28 0x0028 # LEFT PARENTHESIS
+0x29 0x0029 # RIGHT PARENTHESIS
+0x2A 0x002A # ASTERISK
+0x2B 0x002B # PLUS SIGN
+0x2C 0x002C # COMMA
+0x2D 0x002D # HYPHEN-MINUS
+0x2E 0x002E # FULL STOP
+0x2F 0x002F # SOLIDUS
+0x30 0x0030 # DIGIT ZERO
+0x31 0x0031 # DIGIT ONE
+0x32 0x0032 # DIGIT TWO
+0x33 0x0033 # DIGIT THREE
+0x34 0x0034 # DIGIT FOUR
+0x35 0x0035 # DIGIT FIVE
+0x36 0x0036 # DIGIT SIX
+0x37 0x0037 # DIGIT SEVEN
+0x38 0x0038 # DIGIT EIGHT
+0x39 0x0039 # DIGIT NINE
+0x3A 0x003A # COLON
+0x3B 0x003B # SEMICOLON
+0x3C 0x003C # LESS-THAN SIGN
+0x3D 0x003D # EQUALS SIGN
+0x3E 0x003E # GREATER-THAN SIGN
+0x3F 0x003F # QUESTION MARK
+0x40 0x00A7 # SECTION SIGN
+0x41 0x0041 # LATIN CAPITAL LETTER A
+0x42 0x0042 # LATIN CAPITAL LETTER B
+0x43 0x0043 # LATIN CAPITAL LETTER C
+0x44 0x0044 # LATIN CAPITAL LETTER D
+0x45 0x0045 # LATIN CAPITAL LETTER E
+0x46 0x0046 # LATIN CAPITAL LETTER F
+0x47 0x0047 # LATIN CAPITAL LETTER G
+0x48 0x0048 # LATIN CAPITAL LETTER H
+0x49 0x0049 # LATIN CAPITAL LETTER I
+0x4A 0x004A # LATIN CAPITAL LETTER J
+0x4B 0x004B # LATIN CAPITAL LETTER K
+0x4C 0x004C # LATIN CAPITAL LETTER L
+0x4D 0x004D # LATIN CAPITAL LETTER M
+0x4E 0x004E # LATIN CAPITAL LETTER N
+0x4F 0x004F # LATIN CAPITAL LETTER O
+0x50 0x0050 # LATIN CAPITAL LETTER P
+0x51 0x0051 # LATIN CAPITAL LETTER Q
+0x52 0x0052 # LATIN CAPITAL LETTER R
+0x53 0x0053 # LATIN CAPITAL LETTER S
+0x54 0x0054 # LATIN CAPITAL LETTER T
+0x55 0x0055 # LATIN CAPITAL LETTER U
+0x56 0x0056 # LATIN CAPITAL LETTER V
+0x57 0x0057 # LATIN CAPITAL LETTER W
+0x58 0x0058 # LATIN CAPITAL LETTER X
+0x59 0x0059 # LATIN CAPITAL LETTER Y
+0x5A 0x005A # LATIN CAPITAL LETTER Z
+0x5B 0x00B0 # DEGREE SIGN
+0x5C 0x00E7 # LATIN SMALL LETTER C WITH CEDILLA
+0x5D 0x00E9 # LATIN SMALL LETTER E WITH ACUTE
+0x5E 0x005E # CIRCUMFLEX ACCENT
+0x5F 0x005F # LOW LINE
+0x60 0x00F9 # LATIN SMALL LETTER U WITH GRAVE
+0x61 0x0061 # LATIN SMALL LETTER A
+0x62 0x0062 # LATIN SMALL LETTER B
+0x63 0x0063 # LATIN SMALL LETTER C
+0x64 0x0064 # LATIN SMALL LETTER D
+0x65 0x0065 # LATIN SMALL LETTER E
+0x66 0x0066 # LATIN SMALL LETTER F
+0x67 0x0067 # LATIN SMALL LETTER G
+0x68 0x0068 # LATIN SMALL LETTER H
+0x69 0x0069 # LATIN SMALL LETTER I
+0x6A 0x006A # LATIN SMALL LETTER J
+0x6B 0x006B # LATIN SMALL LETTER K
+0x6C 0x006C # LATIN SMALL LETTER L
+0x6D 0x006D # LATIN SMALL LETTER M
+0x6E 0x006E # LATIN SMALL LETTER N
+0x6F 0x006F # LATIN SMALL LETTER O
+0x70 0x0070 # LATIN SMALL LETTER P
+0x71 0x0071 # LATIN SMALL LETTER Q
+0x72 0x0072 # LATIN SMALL LETTER R
+0x73 0x0073 # LATIN SMALL LETTER S
+0x74 0x0074 # LATIN SMALL LETTER T
+0x75 0x0075 # LATIN SMALL LETTER U
+0x76 0x0076 # LATIN SMALL LETTER V
+0x77 0x0077 # LATIN SMALL LETTER W
+0x78 0x0078 # LATIN SMALL LETTER X
+0x79 0x0079 # LATIN SMALL LETTER Y
+0x7A 0x007A # LATIN SMALL LETTER Z
+0x7B 0x00E0 # LATIN SMALL LETTER A WITH GRAVE
+0x7C 0x00F2 # LATIN SMALL LETTER O WITH GRAVE
+0x7D 0x00E8 # LATIN SMALL LETTER E WITH GRAVE
+0x7E 0x00EC # LATIN SMALL LETTER I WITH GRAVE
+0x7F 0x007F # DELETE (DEL)
diff --git a/externals/figlet/fonts/646-jp.flc b/externals/figlet/fonts/646-jp.flc
new file mode 100644
index 0000000000..a3bc3513d6
--- /dev/null
+++ b/externals/figlet/fonts/646-jp.flc
@@ -0,0 +1,156 @@
+#
+# Name: JIS_C6220-1969-ro to Unicode
+# Unicode version: 2.0
+# Table version: 0.1
+# Table format: Format A
+# Date: 0097-01-24
+# Authors: John Cowan (conversion)
+# Keld Simonsen (RFC 1345)
+#
+# General notes:
+#
+# This table contains data obtained from RFC 1345 on how
+# JIS_C6220-1969-ro characters map into Unicode.
+#
+# Format: Three tab-separated columns
+# Column #1 is the JIS_C6220-1969-ro code (in hex as 0xXX)
+# Column #2 is the Unicode (in hex as 0xXXXX)
+# Column #3 the Unicode name (follows a comment sign, '#')
+#
+# The entries are in JIS_C6220-1969-ro order
+#
+# Any comments or problems, contact
+#
+# &rem source: ECMA registry
+# &alias iso-ir-14
+# &g0esc x284a &g1esc x294a &g2esc x2a4a &g3esc x2b4a
+# &alias jp
+# &alias ISO646-JP
+0x00 0x0000 # NULL (NUL)
+0x01 0x0001 # START OF HEADING (SOH)
+0x02 0x0002 # START OF TEXT (STX)
+0x03 0x0003 # END OF TEXT (ETX)
+0x04 0x0004 # END OF TRANSMISSION (EOT)
+0x05 0x0005 # ENQUIRY (ENQ)
+0x06 0x0006 # ACKNOWLEDGE (ACK)
+0x07 0x0007 # BELL (BEL)
+0x08 0x0008 # BACKSPACE (BS)
+0x09 0x0009 # CHARACTER TABULATION (HT)
+0x0A 0x000A # LINE FEED (LF)
+0x0B 0x000B # LINE TABULATION (VT)
+0x0C 0x000C # FORM FEED (FF)
+0x0D 0x000D # CARRIAGE RETURN (CR)
+0x0E 0x000E # SHIFT OUT (SO)
+0x0F 0x000F # SHIFT IN (SI)
+0x10 0x0010 # DATALINK ESCAPE (DLE)
+0x11 0x0011 # DEVICE CONTROL ONE (DC1)
+0x12 0x0012 # DEVICE CONTROL TWO (DC2)
+0x13 0x0013 # DEVICE CONTROL THREE (DC3)
+0x14 0x0014 # DEVICE CONTROL FOUR (DC4)
+0x15 0x0015 # NEGATIVE ACKNOWLEDGE (NAK)
+0x16 0x0016 # SYNCRONOUS IDLE (SYN)
+0x17 0x0017 # END OF TRANSMISSION BLOCK (ETB)
+0x18 0x0018 # CANCEL (CAN)
+0x19 0x0019 # END OF MEDIUM (EM)
+0x1A 0x001A # SUBSTITUTE (SUB)
+0x1B 0x001B # ESCAPE (ESC)
+0x1C 0x001C # FILE SEPARATOR (IS4)
+0x1D 0x001D # GROUP SEPARATOR (IS3)
+0x1E 0x001E # RECORD SEPARATOR (IS2)
+0x1F 0x001F # UNIT SEPARATOR (IS1)
+0x20 0x0020 # SPACE
+0x21 0x0021 # EXCLAMATION MARK
+0x22 0x0022 # QUOTATION MARK
+0x23 0x0023 # NUMBER SIGN
+0x24 0x0024 # DOLLAR SIGN
+0x25 0x0025 # PERCENT SIGN
+0x26 0x0026 # AMPERSAND
+0x27 0x0027 # APOSTROPHE
+0x28 0x0028 # LEFT PARENTHESIS
+0x29 0x0029 # RIGHT PARENTHESIS
+0x2A 0x002A # ASTERISK
+0x2B 0x002B # PLUS SIGN
+0x2C 0x002C # COMMA
+0x2D 0x002D # HYPHEN-MINUS
+0x2E 0x002E # FULL STOP
+0x2F 0x002F # SOLIDUS
+0x30 0x0030 # DIGIT ZERO
+0x31 0x0031 # DIGIT ONE
+0x32 0x0032 # DIGIT TWO
+0x33 0x0033 # DIGIT THREE
+0x34 0x0034 # DIGIT FOUR
+0x35 0x0035 # DIGIT FIVE
+0x36 0x0036 # DIGIT SIX
+0x37 0x0037 # DIGIT SEVEN
+0x38 0x0038 # DIGIT EIGHT
+0x39 0x0039 # DIGIT NINE
+0x3A 0x003A # COLON
+0x3B 0x003B # SEMICOLON
+0x3C 0x003C # LESS-THAN SIGN
+0x3D 0x003D # EQUALS SIGN
+0x3E 0x003E # GREATER-THAN SIGN
+0x3F 0x003F # QUESTION MARK
+0x40 0x0040 # COMMERCIAL AT
+0x41 0x0041 # LATIN CAPITAL LETTER A
+0x42 0x0042 # LATIN CAPITAL LETTER B
+0x43 0x0043 # LATIN CAPITAL LETTER C
+0x44 0x0044 # LATIN CAPITAL LETTER D
+0x45 0x0045 # LATIN CAPITAL LETTER E
+0x46 0x0046 # LATIN CAPITAL LETTER F
+0x47 0x0047 # LATIN CAPITAL LETTER G
+0x48 0x0048 # LATIN CAPITAL LETTER H
+0x49 0x0049 # LATIN CAPITAL LETTER I
+0x4A 0x004A # LATIN CAPITAL LETTER J
+0x4B 0x004B # LATIN CAPITAL LETTER K
+0x4C 0x004C # LATIN CAPITAL LETTER L
+0x4D 0x004D # LATIN CAPITAL LETTER M
+0x4E 0x004E # LATIN CAPITAL LETTER N
+0x4F 0x004F # LATIN CAPITAL LETTER O
+0x50 0x0050 # LATIN CAPITAL LETTER P
+0x51 0x0051 # LATIN CAPITAL LETTER Q
+0x52 0x0052 # LATIN CAPITAL LETTER R
+0x53 0x0053 # LATIN CAPITAL LETTER S
+0x54 0x0054 # LATIN CAPITAL LETTER T
+0x55 0x0055 # LATIN CAPITAL LETTER U
+0x56 0x0056 # LATIN CAPITAL LETTER V
+0x57 0x0057 # LATIN CAPITAL LETTER W
+0x58 0x0058 # LATIN CAPITAL LETTER X
+0x59 0x0059 # LATIN CAPITAL LETTER Y
+0x5A 0x005A # LATIN CAPITAL LETTER Z
+0x5B 0x005B # LEFT SQUARE BRACKET
+0x5C 0x00A5 # YEN SIGN
+0x5D 0x005D # RIGHT SQUARE BRACKET
+0x5E 0x005E # CIRCUMFLEX ACCENT
+0x5F 0x005F # LOW LINE
+0x60 0x0060 # GRAVE ACCENT
+0x61 0x0061 # LATIN SMALL LETTER A
+0x62 0x0062 # LATIN SMALL LETTER B
+0x63 0x0063 # LATIN SMALL LETTER C
+0x64 0x0064 # LATIN SMALL LETTER D
+0x65 0x0065 # LATIN SMALL LETTER E
+0x66 0x0066 # LATIN SMALL LETTER F
+0x67 0x0067 # LATIN SMALL LETTER G
+0x68 0x0068 # LATIN SMALL LETTER H
+0x69 0x0069 # LATIN SMALL LETTER I
+0x6A 0x006A # LATIN SMALL LETTER J
+0x6B 0x006B # LATIN SMALL LETTER K
+0x6C 0x006C # LATIN SMALL LETTER L
+0x6D 0x006D # LATIN SMALL LETTER M
+0x6E 0x006E # LATIN SMALL LETTER N
+0x6F 0x006F # LATIN SMALL LETTER O
+0x70 0x0070 # LATIN SMALL LETTER P
+0x71 0x0071 # LATIN SMALL LETTER Q
+0x72 0x0072 # LATIN SMALL LETTER R
+0x73 0x0073 # LATIN SMALL LETTER S
+0x74 0x0074 # LATIN SMALL LETTER T
+0x75 0x0075 # LATIN SMALL LETTER U
+0x76 0x0076 # LATIN SMALL LETTER V
+0x77 0x0077 # LATIN SMALL LETTER W
+0x78 0x0078 # LATIN SMALL LETTER X
+0x79 0x0079 # LATIN SMALL LETTER Y
+0x7A 0x007A # LATIN SMALL LETTER Z
+0x7B 0x007B # LEFT CURLY BRACKET
+0x7C 0x007C # VERTICAL LINE
+0x7D 0x007D # RIGHT CURLY BRACKET
+0x7E 0x203E # OVERLINE
+0x7F 0x007F # DELETE (DEL)
diff --git a/externals/figlet/fonts/646-kr.flc b/externals/figlet/fonts/646-kr.flc
new file mode 100644
index 0000000000..6966895e56
--- /dev/null
+++ b/externals/figlet/fonts/646-kr.flc
@@ -0,0 +1,152 @@
+#
+# Name: KSC5636 to Unicode
+# Unicode version: 2.0
+# Table version: 0.1
+# Table format: Format A
+# Date: 0097-01-24
+# Authors: John Cowan (conversion)
+# Keld Simonsen (RFC 1345)
+#
+# General notes:
+#
+# This table contains data obtained from RFC 1345 on how
+# KSC5636 characters map into Unicode.
+#
+# Format: Three tab-separated columns
+# Column #1 is the KSC5636 code (in hex as 0xXX)
+# Column #2 is the Unicode (in hex as 0xXXXX)
+# Column #3 the Unicode name (follows a comment sign, '#')
+#
+# The entries are in KSC5636 order
+#
+# Any comments or problems, contact
+#
+# &alias ISO646-KR
+0x00 0x0000 # NULL (NUL)
+0x01 0x0001 # START OF HEADING (SOH)
+0x02 0x0002 # START OF TEXT (STX)
+0x03 0x0003 # END OF TEXT (ETX)
+0x04 0x0004 # END OF TRANSMISSION (EOT)
+0x05 0x0005 # ENQUIRY (ENQ)
+0x06 0x0006 # ACKNOWLEDGE (ACK)
+0x07 0x0007 # BELL (BEL)
+0x08 0x0008 # BACKSPACE (BS)
+0x09 0x0009 # CHARACTER TABULATION (HT)
+0x0A 0x000A # LINE FEED (LF)
+0x0B 0x000B # LINE TABULATION (VT)
+0x0C 0x000C # FORM FEED (FF)
+0x0D 0x000D # CARRIAGE RETURN (CR)
+0x0E 0x000E # SHIFT OUT (SO)
+0x0F 0x000F # SHIFT IN (SI)
+0x10 0x0010 # DATALINK ESCAPE (DLE)
+0x11 0x0011 # DEVICE CONTROL ONE (DC1)
+0x12 0x0012 # DEVICE CONTROL TWO (DC2)
+0x13 0x0013 # DEVICE CONTROL THREE (DC3)
+0x14 0x0014 # DEVICE CONTROL FOUR (DC4)
+0x15 0x0015 # NEGATIVE ACKNOWLEDGE (NAK)
+0x16 0x0016 # SYNCRONOUS IDLE (SYN)
+0x17 0x0017 # END OF TRANSMISSION BLOCK (ETB)
+0x18 0x0018 # CANCEL (CAN)
+0x19 0x0019 # END OF MEDIUM (EM)
+0x1A 0x001A # SUBSTITUTE (SUB)
+0x1B 0x001B # ESCAPE (ESC)
+0x1C 0x001C # FILE SEPARATOR (IS4)
+0x1D 0x001D # GROUP SEPARATOR (IS3)
+0x1E 0x001E # RECORD SEPARATOR (IS2)
+0x1F 0x001F # UNIT SEPARATOR (IS1)
+0x20 0x0020 # SPACE
+0x21 0x0021 # EXCLAMATION MARK
+0x22 0x0022 # QUOTATION MARK
+0x23 0x0023 # NUMBER SIGN
+0x24 0x0024 # DOLLAR SIGN
+0x25 0x0025 # PERCENT SIGN
+0x26 0x0026 # AMPERSAND
+0x27 0x0027 # APOSTROPHE
+0x28 0x0028 # LEFT PARENTHESIS
+0x29 0x0029 # RIGHT PARENTHESIS
+0x2A 0x002A # ASTERISK
+0x2B 0x002B # PLUS SIGN
+0x2C 0x002C # COMMA
+0x2D 0x002D # HYPHEN-MINUS
+0x2E 0x002E # FULL STOP
+0x2F 0x002F # SOLIDUS
+0x30 0x0030 # DIGIT ZERO
+0x31 0x0031 # DIGIT ONE
+0x32 0x0032 # DIGIT TWO
+0x33 0x0033 # DIGIT THREE
+0x34 0x0034 # DIGIT FOUR
+0x35 0x0035 # DIGIT FIVE
+0x36 0x0036 # DIGIT SIX
+0x37 0x0037 # DIGIT SEVEN
+0x38 0x0038 # DIGIT EIGHT
+0x39 0x0039 # DIGIT NINE
+0x3A 0x003A # COLON
+0x3B 0x003B # SEMICOLON
+0x3C 0x003C # LESS-THAN SIGN
+0x3D 0x003D # EQUALS SIGN
+0x3E 0x003E # GREATER-THAN SIGN
+0x3F 0x003F # QUESTION MARK
+0x40 0x0040 # COMMERCIAL AT
+0x41 0x0041 # LATIN CAPITAL LETTER A
+0x42 0x0042 # LATIN CAPITAL LETTER B
+0x43 0x0043 # LATIN CAPITAL LETTER C
+0x44 0x0044 # LATIN CAPITAL LETTER D
+0x45 0x0045 # LATIN CAPITAL LETTER E
+0x46 0x0046 # LATIN CAPITAL LETTER F
+0x47 0x0047 # LATIN CAPITAL LETTER G
+0x48 0x0048 # LATIN CAPITAL LETTER H
+0x49 0x0049 # LATIN CAPITAL LETTER I
+0x4A 0x004A # LATIN CAPITAL LETTER J
+0x4B 0x004B # LATIN CAPITAL LETTER K
+0x4C 0x004C # LATIN CAPITAL LETTER L
+0x4D 0x004D # LATIN CAPITAL LETTER M
+0x4E 0x004E # LATIN CAPITAL LETTER N
+0x4F 0x004F # LATIN CAPITAL LETTER O
+0x50 0x0050 # LATIN CAPITAL LETTER P
+0x51 0x0051 # LATIN CAPITAL LETTER Q
+0x52 0x0052 # LATIN CAPITAL LETTER R
+0x53 0x0053 # LATIN CAPITAL LETTER S
+0x54 0x0054 # LATIN CAPITAL LETTER T
+0x55 0x0055 # LATIN CAPITAL LETTER U
+0x56 0x0056 # LATIN CAPITAL LETTER V
+0x57 0x0057 # LATIN CAPITAL LETTER W
+0x58 0x0058 # LATIN CAPITAL LETTER X
+0x59 0x0059 # LATIN CAPITAL LETTER Y
+0x5A 0x005A # LATIN CAPITAL LETTER Z
+0x5B 0x005B # LEFT SQUARE BRACKET
+0x5C 0x20A9 # WON SIGN
+0x5D 0x005D # RIGHT SQUARE BRACKET
+0x5E 0x005E # CIRCUMFLEX ACCENT
+0x5F 0x005F # LOW LINE
+0x60 0x0060 # GRAVE ACCENT
+0x61 0x0061 # LATIN SMALL LETTER A
+0x62 0x0062 # LATIN SMALL LETTER B
+0x63 0x0063 # LATIN SMALL LETTER C
+0x64 0x0064 # LATIN SMALL LETTER D
+0x65 0x0065 # LATIN SMALL LETTER E
+0x66 0x0066 # LATIN SMALL LETTER F
+0x67 0x0067 # LATIN SMALL LETTER G
+0x68 0x0068 # LATIN SMALL LETTER H
+0x69 0x0069 # LATIN SMALL LETTER I
+0x6A 0x006A # LATIN SMALL LETTER J
+0x6B 0x006B # LATIN SMALL LETTER K
+0x6C 0x006C # LATIN SMALL LETTER L
+0x6D 0x006D # LATIN SMALL LETTER M
+0x6E 0x006E # LATIN SMALL LETTER N
+0x6F 0x006F # LATIN SMALL LETTER O
+0x70 0x0070 # LATIN SMALL LETTER P
+0x71 0x0071 # LATIN SMALL LETTER Q
+0x72 0x0072 # LATIN SMALL LETTER R
+0x73 0x0073 # LATIN SMALL LETTER S
+0x74 0x0074 # LATIN SMALL LETTER T
+0x75 0x0075 # LATIN SMALL LETTER U
+0x76 0x0076 # LATIN SMALL LETTER V
+0x77 0x0077 # LATIN SMALL LETTER W
+0x78 0x0078 # LATIN SMALL LETTER X
+0x79 0x0079 # LATIN SMALL LETTER Y
+0x7A 0x007A # LATIN SMALL LETTER Z
+0x7B 0x007B # LEFT CURLY BRACKET
+0x7C 0x007C # VERTICAL LINE
+0x7D 0x007D # RIGHT CURLY BRACKET
+0x7E 0x007E # TILDE
+0x7F 0x007F # DELETE (DEL)
diff --git a/externals/figlet/fonts/646-no.flc b/externals/figlet/fonts/646-no.flc
new file mode 100644
index 0000000000..3f4776656f
--- /dev/null
+++ b/externals/figlet/fonts/646-no.flc
@@ -0,0 +1,156 @@
+#
+# Name: NS_4551-1 to Unicode
+# Unicode version: 2.0
+# Table version: 0.1
+# Table format: Format A
+# Date: 0097-01-24
+# Authors: John Cowan (conversion)
+# Keld Simonsen (RFC 1345)
+#
+# General notes:
+#
+# This table contains data obtained from RFC 1345 on how
+# NS_4551-1 characters map into Unicode.
+#
+# Format: Three tab-separated columns
+# Column #1 is the NS_4551-1 code (in hex as 0xXX)
+# Column #2 is the Unicode (in hex as 0xXXXX)
+# Column #3 the Unicode name (follows a comment sign, '#')
+#
+# The entries are in NS_4551-1 order
+#
+# Any comments or problems, contact
+#
+# &rem source: ECMA registry
+# &alias iso-ir-60
+# &alias ISO646-NO
+# &g0esc x2860 &g1esc x2960 &g2esc x2a60 &g3esc x2b60
+# &alias no
+0x00 0x0000 # NULL (NUL)
+0x01 0x0001 # START OF HEADING (SOH)
+0x02 0x0002 # START OF TEXT (STX)
+0x03 0x0003 # END OF TEXT (ETX)
+0x04 0x0004 # END OF TRANSMISSION (EOT)
+0x05 0x0005 # ENQUIRY (ENQ)
+0x06 0x0006 # ACKNOWLEDGE (ACK)
+0x07 0x0007 # BELL (BEL)
+0x08 0x0008 # BACKSPACE (BS)
+0x09 0x0009 # CHARACTER TABULATION (HT)
+0x0A 0x000A # LINE FEED (LF)
+0x0B 0x000B # LINE TABULATION (VT)
+0x0C 0x000C # FORM FEED (FF)
+0x0D 0x000D # CARRIAGE RETURN (CR)
+0x0E 0x000E # SHIFT OUT (SO)
+0x0F 0x000F # SHIFT IN (SI)
+0x10 0x0010 # DATALINK ESCAPE (DLE)
+0x11 0x0011 # DEVICE CONTROL ONE (DC1)
+0x12 0x0012 # DEVICE CONTROL TWO (DC2)
+0x13 0x0013 # DEVICE CONTROL THREE (DC3)
+0x14 0x0014 # DEVICE CONTROL FOUR (DC4)
+0x15 0x0015 # NEGATIVE ACKNOWLEDGE (NAK)
+0x16 0x0016 # SYNCRONOUS IDLE (SYN)
+0x17 0x0017 # END OF TRANSMISSION BLOCK (ETB)
+0x18 0x0018 # CANCEL (CAN)
+0x19 0x0019 # END OF MEDIUM (EM)
+0x1A 0x001A # SUBSTITUTE (SUB)
+0x1B 0x001B # ESCAPE (ESC)
+0x1C 0x001C # FILE SEPARATOR (IS4)
+0x1D 0x001D # GROUP SEPARATOR (IS3)
+0x1E 0x001E # RECORD SEPARATOR (IS2)
+0x1F 0x001F # UNIT SEPARATOR (IS1)
+0x20 0x0020 # SPACE
+0x21 0x0021 # EXCLAMATION MARK
+0x22 0x0022 # QUOTATION MARK
+0x23 0x0023 # NUMBER SIGN
+0x24 0x0024 # DOLLAR SIGN
+0x25 0x0025 # PERCENT SIGN
+0x26 0x0026 # AMPERSAND
+0x27 0x0027 # APOSTROPHE
+0x28 0x0028 # LEFT PARENTHESIS
+0x29 0x0029 # RIGHT PARENTHESIS
+0x2A 0x002A # ASTERISK
+0x2B 0x002B # PLUS SIGN
+0x2C 0x002C # COMMA
+0x2D 0x002D # HYPHEN-MINUS
+0x2E 0x002E # FULL STOP
+0x2F 0x002F # SOLIDUS
+0x30 0x0030 # DIGIT ZERO
+0x31 0x0031 # DIGIT ONE
+0x32 0x0032 # DIGIT TWO
+0x33 0x0033 # DIGIT THREE
+0x34 0x0034 # DIGIT FOUR
+0x35 0x0035 # DIGIT FIVE
+0x36 0x0036 # DIGIT SIX
+0x37 0x0037 # DIGIT SEVEN
+0x38 0x0038 # DIGIT EIGHT
+0x39 0x0039 # DIGIT NINE
+0x3A 0x003A # COLON
+0x3B 0x003B # SEMICOLON
+0x3C 0x003C # LESS-THAN SIGN
+0x3D 0x003D # EQUALS SIGN
+0x3E 0x003E # GREATER-THAN SIGN
+0x3F 0x003F # QUESTION MARK
+0x40 0x0040 # COMMERCIAL AT
+0x41 0x0041 # LATIN CAPITAL LETTER A
+0x42 0x0042 # LATIN CAPITAL LETTER B
+0x43 0x0043 # LATIN CAPITAL LETTER C
+0x44 0x0044 # LATIN CAPITAL LETTER D
+0x45 0x0045 # LATIN CAPITAL LETTER E
+0x46 0x0046 # LATIN CAPITAL LETTER F
+0x47 0x0047 # LATIN CAPITAL LETTER G
+0x48 0x0048 # LATIN CAPITAL LETTER H
+0x49 0x0049 # LATIN CAPITAL LETTER I
+0x4A 0x004A # LATIN CAPITAL LETTER J
+0x4B 0x004B # LATIN CAPITAL LETTER K
+0x4C 0x004C # LATIN CAPITAL LETTER L
+0x4D 0x004D # LATIN CAPITAL LETTER M
+0x4E 0x004E # LATIN CAPITAL LETTER N
+0x4F 0x004F # LATIN CAPITAL LETTER O
+0x50 0x0050 # LATIN CAPITAL LETTER P
+0x51 0x0051 # LATIN CAPITAL LETTER Q
+0x52 0x0052 # LATIN CAPITAL LETTER R
+0x53 0x0053 # LATIN CAPITAL LETTER S
+0x54 0x0054 # LATIN CAPITAL LETTER T
+0x55 0x0055 # LATIN CAPITAL LETTER U
+0x56 0x0056 # LATIN CAPITAL LETTER V
+0x57 0x0057 # LATIN CAPITAL LETTER W
+0x58 0x0058 # LATIN CAPITAL LETTER X
+0x59 0x0059 # LATIN CAPITAL LETTER Y
+0x5A 0x005A # LATIN CAPITAL LETTER Z
+0x5B 0x00C6 # LATIN CAPITAL LETTER AE
+0x5C 0x00D8 # LATIN CAPITAL LETTER O WITH STROKE
+0x5D 0x00C5 # LATIN CAPITAL LETTER A WITH RING ABOVE
+0x5E 0x005E # CIRCUMFLEX ACCENT
+0x5F 0x005F # LOW LINE
+0x60 0x0060 # GRAVE ACCENT
+0x61 0x0061 # LATIN SMALL LETTER A
+0x62 0x0062 # LATIN SMALL LETTER B
+0x63 0x0063 # LATIN SMALL LETTER C
+0x64 0x0064 # LATIN SMALL LETTER D
+0x65 0x0065 # LATIN SMALL LETTER E
+0x66 0x0066 # LATIN SMALL LETTER F
+0x67 0x0067 # LATIN SMALL LETTER G
+0x68 0x0068 # LATIN SMALL LETTER H
+0x69 0x0069 # LATIN SMALL LETTER I
+0x6A 0x006A # LATIN SMALL LETTER J
+0x6B 0x006B # LATIN SMALL LETTER K
+0x6C 0x006C # LATIN SMALL LETTER L
+0x6D 0x006D # LATIN SMALL LETTER M
+0x6E 0x006E # LATIN SMALL LETTER N
+0x6F 0x006F # LATIN SMALL LETTER O
+0x70 0x0070 # LATIN SMALL LETTER P
+0x71 0x0071 # LATIN SMALL LETTER Q
+0x72 0x0072 # LATIN SMALL LETTER R
+0x73 0x0073 # LATIN SMALL LETTER S
+0x74 0x0074 # LATIN SMALL LETTER T
+0x75 0x0075 # LATIN SMALL LETTER U
+0x76 0x0076 # LATIN SMALL LETTER V
+0x77 0x0077 # LATIN SMALL LETTER W
+0x78 0x0078 # LATIN SMALL LETTER X
+0x79 0x0079 # LATIN SMALL LETTER Y
+0x7A 0x007A # LATIN SMALL LETTER Z
+0x7B 0x00E6 # LATIN SMALL LETTER AE
+0x7C 0x00F8 # LATIN SMALL LETTER O WITH STROKE
+0x7D 0x00E5 # LATIN SMALL LETTER A WITH RING ABOVE
+0x7E 0x203E # OVERLINE
+0x7F 0x007F # DELETE (DEL)
diff --git a/externals/figlet/fonts/646-no2.flc b/externals/figlet/fonts/646-no2.flc
new file mode 100644
index 0000000000..c5ca075a2c
--- /dev/null
+++ b/externals/figlet/fonts/646-no2.flc
@@ -0,0 +1,156 @@
+#
+# Name: NS_4551-2 to Unicode
+# Unicode version: 2.0
+# Table version: 0.1
+# Table format: Format A
+# Date: 0097-01-24
+# Authors: John Cowan (conversion)
+# Keld Simonsen (RFC 1345)
+#
+# General notes:
+#
+# This table contains data obtained from RFC 1345 on how
+# NS_4551-2 characters map into Unicode.
+#
+# Format: Three tab-separated columns
+# Column #1 is the NS_4551-2 code (in hex as 0xXX)
+# Column #2 is the Unicode (in hex as 0xXXXX)
+# Column #3 the Unicode name (follows a comment sign, '#')
+#
+# The entries are in NS_4551-2 order
+#
+# Any comments or problems, contact
+#
+# &rem source: ECMA registry
+# &alias ISO646-NO2
+# &alias iso-ir-61
+# &g0esc x2861 &g1esc x2961 &g2esc x2a61 &g3esc x2b61
+# &alias no2
+0x00 0x0000 # NULL (NUL)
+0x01 0x0001 # START OF HEADING (SOH)
+0x02 0x0002 # START OF TEXT (STX)
+0x03 0x0003 # END OF TEXT (ETX)
+0x04 0x0004 # END OF TRANSMISSION (EOT)
+0x05 0x0005 # ENQUIRY (ENQ)
+0x06 0x0006 # ACKNOWLEDGE (ACK)
+0x07 0x0007 # BELL (BEL)
+0x08 0x0008 # BACKSPACE (BS)
+0x09 0x0009 # CHARACTER TABULATION (HT)
+0x0A 0x000A # LINE FEED (LF)
+0x0B 0x000B # LINE TABULATION (VT)
+0x0C 0x000C # FORM FEED (FF)
+0x0D 0x000D # CARRIAGE RETURN (CR)
+0x0E 0x000E # SHIFT OUT (SO)
+0x0F 0x000F # SHIFT IN (SI)
+0x10 0x0010 # DATALINK ESCAPE (DLE)
+0x11 0x0011 # DEVICE CONTROL ONE (DC1)
+0x12 0x0012 # DEVICE CONTROL TWO (DC2)
+0x13 0x0013 # DEVICE CONTROL THREE (DC3)
+0x14 0x0014 # DEVICE CONTROL FOUR (DC4)
+0x15 0x0015 # NEGATIVE ACKNOWLEDGE (NAK)
+0x16 0x0016 # SYNCRONOUS IDLE (SYN)
+0x17 0x0017 # END OF TRANSMISSION BLOCK (ETB)
+0x18 0x0018 # CANCEL (CAN)
+0x19 0x0019 # END OF MEDIUM (EM)
+0x1A 0x001A # SUBSTITUTE (SUB)
+0x1B 0x001B # ESCAPE (ESC)
+0x1C 0x001C # FILE SEPARATOR (IS4)
+0x1D 0x001D # GROUP SEPARATOR (IS3)
+0x1E 0x001E # RECORD SEPARATOR (IS2)
+0x1F 0x001F # UNIT SEPARATOR (IS1)
+0x20 0x0020 # SPACE
+0x21 0x0021 # EXCLAMATION MARK
+0x22 0x0022 # QUOTATION MARK
+0x23 0x00B6 # PILCROW SIGN
+0x24 0x0024 # DOLLAR SIGN
+0x25 0x0025 # PERCENT SIGN
+0x26 0x0026 # AMPERSAND
+0x27 0x0027 # APOSTROPHE
+0x28 0x0028 # LEFT PARENTHESIS
+0x29 0x0029 # RIGHT PARENTHESIS
+0x2A 0x002A # ASTERISK
+0x2B 0x002B # PLUS SIGN
+0x2C 0x002C # COMMA
+0x2D 0x002D # HYPHEN-MINUS
+0x2E 0x002E # FULL STOP
+0x2F 0x002F # SOLIDUS
+0x30 0x0030 # DIGIT ZERO
+0x31 0x0031 # DIGIT ONE
+0x32 0x0032 # DIGIT TWO
+0x33 0x0033 # DIGIT THREE
+0x34 0x0034 # DIGIT FOUR
+0x35 0x0035 # DIGIT FIVE
+0x36 0x0036 # DIGIT SIX
+0x37 0x0037 # DIGIT SEVEN
+0x38 0x0038 # DIGIT EIGHT
+0x39 0x0039 # DIGIT NINE
+0x3A 0x003A # COLON
+0x3B 0x003B # SEMICOLON
+0x3C 0x003C # LESS-THAN SIGN
+0x3D 0x003D # EQUALS SIGN
+0x3E 0x003E # GREATER-THAN SIGN
+0x3F 0x003F # QUESTION MARK
+0x40 0x0040 # COMMERCIAL AT
+0x41 0x0041 # LATIN CAPITAL LETTER A
+0x42 0x0042 # LATIN CAPITAL LETTER B
+0x43 0x0043 # LATIN CAPITAL LETTER C
+0x44 0x0044 # LATIN CAPITAL LETTER D
+0x45 0x0045 # LATIN CAPITAL LETTER E
+0x46 0x0046 # LATIN CAPITAL LETTER F
+0x47 0x0047 # LATIN CAPITAL LETTER G
+0x48 0x0048 # LATIN CAPITAL LETTER H
+0x49 0x0049 # LATIN CAPITAL LETTER I
+0x4A 0x004A # LATIN CAPITAL LETTER J
+0x4B 0x004B # LATIN CAPITAL LETTER K
+0x4C 0x004C # LATIN CAPITAL LETTER L
+0x4D 0x004D # LATIN CAPITAL LETTER M
+0x4E 0x004E # LATIN CAPITAL LETTER N
+0x4F 0x004F # LATIN CAPITAL LETTER O
+0x50 0x0050 # LATIN CAPITAL LETTER P
+0x51 0x0051 # LATIN CAPITAL LETTER Q
+0x52 0x0052 # LATIN CAPITAL LETTER R
+0x53 0x0053 # LATIN CAPITAL LETTER S
+0x54 0x0054 # LATIN CAPITAL LETTER T
+0x55 0x0055 # LATIN CAPITAL LETTER U
+0x56 0x0056 # LATIN CAPITAL LETTER V
+0x57 0x0057 # LATIN CAPITAL LETTER W
+0x58 0x0058 # LATIN CAPITAL LETTER X
+0x59 0x0059 # LATIN CAPITAL LETTER Y
+0x5A 0x005A # LATIN CAPITAL LETTER Z
+0x5B 0x00C6 # LATIN CAPITAL LETTER AE
+0x5C 0x00D8 # LATIN CAPITAL LETTER O WITH STROKE
+0x5D 0x00C5 # LATIN CAPITAL LETTER A WITH RING ABOVE
+0x5E 0x005E # CIRCUMFLEX ACCENT
+0x5F 0x005F # LOW LINE
+0x60 0x0060 # GRAVE ACCENT
+0x61 0x0061 # LATIN SMALL LETTER A
+0x62 0x0062 # LATIN SMALL LETTER B
+0x63 0x0063 # LATIN SMALL LETTER C
+0x64 0x0064 # LATIN SMALL LETTER D
+0x65 0x0065 # LATIN SMALL LETTER E
+0x66 0x0066 # LATIN SMALL LETTER F
+0x67 0x0067 # LATIN SMALL LETTER G
+0x68 0x0068 # LATIN SMALL LETTER H
+0x69 0x0069 # LATIN SMALL LETTER I
+0x6A 0x006A # LATIN SMALL LETTER J
+0x6B 0x006B # LATIN SMALL LETTER K
+0x6C 0x006C # LATIN SMALL LETTER L
+0x6D 0x006D # LATIN SMALL LETTER M
+0x6E 0x006E # LATIN SMALL LETTER N
+0x6F 0x006F # LATIN SMALL LETTER O
+0x70 0x0070 # LATIN SMALL LETTER P
+0x71 0x0071 # LATIN SMALL LETTER Q
+0x72 0x0072 # LATIN SMALL LETTER R
+0x73 0x0073 # LATIN SMALL LETTER S
+0x74 0x0074 # LATIN SMALL LETTER T
+0x75 0x0075 # LATIN SMALL LETTER U
+0x76 0x0076 # LATIN SMALL LETTER V
+0x77 0x0077 # LATIN SMALL LETTER W
+0x78 0x0078 # LATIN SMALL LETTER X
+0x79 0x0079 # LATIN SMALL LETTER Y
+0x7A 0x007A # LATIN SMALL LETTER Z
+0x7B 0x00E6 # LATIN SMALL LETTER AE
+0x7C 0x00F8 # LATIN SMALL LETTER O WITH STROKE
+0x7D 0x00E5 # LATIN SMALL LETTER A WITH RING ABOVE
+0x7E 0x007C # VERTICAL LINE
+0x7F 0x007F # DELETE (DEL)
diff --git a/externals/figlet/fonts/646-pt.flc b/externals/figlet/fonts/646-pt.flc
new file mode 100644
index 0000000000..37571886c9
--- /dev/null
+++ b/externals/figlet/fonts/646-pt.flc
@@ -0,0 +1,155 @@
+#
+# Name: PT to Unicode
+# Unicode version: 2.0
+# Table version: 0.1
+# Table format: Format A
+# Date: 0097-01-24
+# Authors: John Cowan (conversion)
+# Keld Simonsen (RFC 1345)
+#
+# General notes:
+#
+# This table contains data obtained from RFC 1345 on how
+# PT characters map into Unicode.
+#
+# Format: Three tab-separated columns
+# Column #1 is the PT code (in hex as 0xXX)
+# Column #2 is the Unicode (in hex as 0xXXXX)
+# Column #3 the Unicode name (follows a comment sign, '#')
+#
+# The entries are in PT order
+#
+# Any comments or problems, contact
+#
+# &rem source: ECMA registry
+# &alias iso-ir-16
+# &alias ISO646-PT
+# &g0esc x284c &g1esc x294c &g2esc x2a4c &g3esc x2b4c
+0x00 0x0000 # NULL (NUL)
+0x01 0x0001 # START OF HEADING (SOH)
+0x02 0x0002 # START OF TEXT (STX)
+0x03 0x0003 # END OF TEXT (ETX)
+0x04 0x0004 # END OF TRANSMISSION (EOT)
+0x05 0x0005 # ENQUIRY (ENQ)
+0x06 0x0006 # ACKNOWLEDGE (ACK)
+0x07 0x0007 # BELL (BEL)
+0x08 0x0008 # BACKSPACE (BS)
+0x09 0x0009 # CHARACTER TABULATION (HT)
+0x0A 0x000A # LINE FEED (LF)
+0x0B 0x000B # LINE TABULATION (VT)
+0x0C 0x000C # FORM FEED (FF)
+0x0D 0x000D # CARRIAGE RETURN (CR)
+0x0E 0x000E # SHIFT OUT (SO)
+0x0F 0x000F # SHIFT IN (SI)
+0x10 0x0010 # DATALINK ESCAPE (DLE)
+0x11 0x0011 # DEVICE CONTROL ONE (DC1)
+0x12 0x0012 # DEVICE CONTROL TWO (DC2)
+0x13 0x0013 # DEVICE CONTROL THREE (DC3)
+0x14 0x0014 # DEVICE CONTROL FOUR (DC4)
+0x15 0x0015 # NEGATIVE ACKNOWLEDGE (NAK)
+0x16 0x0016 # SYNCRONOUS IDLE (SYN)
+0x17 0x0017 # END OF TRANSMISSION BLOCK (ETB)
+0x18 0x0018 # CANCEL (CAN)
+0x19 0x0019 # END OF MEDIUM (EM)
+0x1A 0x001A # SUBSTITUTE (SUB)
+0x1B 0x001B # ESCAPE (ESC)
+0x1C 0x001C # FILE SEPARATOR (IS4)
+0x1D 0x001D # GROUP SEPARATOR (IS3)
+0x1E 0x001E # RECORD SEPARATOR (IS2)
+0x1F 0x001F # UNIT SEPARATOR (IS1)
+0x20 0x0020 # SPACE
+0x21 0x0021 # EXCLAMATION MARK
+0x22 0x0022 # QUOTATION MARK
+0x23 0x0023 # NUMBER SIGN
+0x24 0x0024 # DOLLAR SIGN
+0x25 0x0025 # PERCENT SIGN
+0x26 0x0026 # AMPERSAND
+0x27 0x0027 # APOSTROPHE
+0x28 0x0028 # LEFT PARENTHESIS
+0x29 0x0029 # RIGHT PARENTHESIS
+0x2A 0x002A # ASTERISK
+0x2B 0x002B # PLUS SIGN
+0x2C 0x002C # COMMA
+0x2D 0x002D # HYPHEN-MINUS
+0x2E 0x002E # FULL STOP
+0x2F 0x002F # SOLIDUS
+0x30 0x0030 # DIGIT ZERO
+0x31 0x0031 # DIGIT ONE
+0x32 0x0032 # DIGIT TWO
+0x33 0x0033 # DIGIT THREE
+0x34 0x0034 # DIGIT FOUR
+0x35 0x0035 # DIGIT FIVE
+0x36 0x0036 # DIGIT SIX
+0x37 0x0037 # DIGIT SEVEN
+0x38 0x0038 # DIGIT EIGHT
+0x39 0x0039 # DIGIT NINE
+0x3A 0x003A # COLON
+0x3B 0x003B # SEMICOLON
+0x3C 0x003C # LESS-THAN SIGN
+0x3D 0x003D # EQUALS SIGN
+0x3E 0x003E # GREATER-THAN SIGN
+0x3F 0x003F # QUESTION MARK
+0x40 0x00A7 # SECTION SIGN
+0x41 0x0041 # LATIN CAPITAL LETTER A
+0x42 0x0042 # LATIN CAPITAL LETTER B
+0x43 0x0043 # LATIN CAPITAL LETTER C
+0x44 0x0044 # LATIN CAPITAL LETTER D
+0x45 0x0045 # LATIN CAPITAL LETTER E
+0x46 0x0046 # LATIN CAPITAL LETTER F
+0x47 0x0047 # LATIN CAPITAL LETTER G
+0x48 0x0048 # LATIN CAPITAL LETTER H
+0x49 0x0049 # LATIN CAPITAL LETTER I
+0x4A 0x004A # LATIN CAPITAL LETTER J
+0x4B 0x004B # LATIN CAPITAL LETTER K
+0x4C 0x004C # LATIN CAPITAL LETTER L
+0x4D 0x004D # LATIN CAPITAL LETTER M
+0x4E 0x004E # LATIN CAPITAL LETTER N
+0x4F 0x004F # LATIN CAPITAL LETTER O
+0x50 0x0050 # LATIN CAPITAL LETTER P
+0x51 0x0051 # LATIN CAPITAL LETTER Q
+0x52 0x0052 # LATIN CAPITAL LETTER R
+0x53 0x0053 # LATIN CAPITAL LETTER S
+0x54 0x0054 # LATIN CAPITAL LETTER T
+0x55 0x0055 # LATIN CAPITAL LETTER U
+0x56 0x0056 # LATIN CAPITAL LETTER V
+0x57 0x0057 # LATIN CAPITAL LETTER W
+0x58 0x0058 # LATIN CAPITAL LETTER X
+0x59 0x0059 # LATIN CAPITAL LETTER Y
+0x5A 0x005A # LATIN CAPITAL LETTER Z
+0x5B 0x00C3 # LATIN CAPITAL LETTER A WITH TILDE
+0x5C 0x00C7 # LATIN CAPITAL LETTER C WITH CEDILLA
+0x5D 0x00D5 # LATIN CAPITAL LETTER O WITH TILDE
+0x5E 0x005E # CIRCUMFLEX ACCENT
+0x5F 0x005F # LOW LINE
+0x60 0x0060 # GRAVE ACCENT
+0x61 0x0061 # LATIN SMALL LETTER A
+0x62 0x0062 # LATIN SMALL LETTER B
+0x63 0x0063 # LATIN SMALL LETTER C
+0x64 0x0064 # LATIN SMALL LETTER D
+0x65 0x0065 # LATIN SMALL LETTER E
+0x66 0x0066 # LATIN SMALL LETTER F
+0x67 0x0067 # LATIN SMALL LETTER G
+0x68 0x0068 # LATIN SMALL LETTER H
+0x69 0x0069 # LATIN SMALL LETTER I
+0x6A 0x006A # LATIN SMALL LETTER J
+0x6B 0x006B # LATIN SMALL LETTER K
+0x6C 0x006C # LATIN SMALL LETTER L
+0x6D 0x006D # LATIN SMALL LETTER M
+0x6E 0x006E # LATIN SMALL LETTER N
+0x6F 0x006F # LATIN SMALL LETTER O
+0x70 0x0070 # LATIN SMALL LETTER P
+0x71 0x0071 # LATIN SMALL LETTER Q
+0x72 0x0072 # LATIN SMALL LETTER R
+0x73 0x0073 # LATIN SMALL LETTER S
+0x74 0x0074 # LATIN SMALL LETTER T
+0x75 0x0075 # LATIN SMALL LETTER U
+0x76 0x0076 # LATIN SMALL LETTER V
+0x77 0x0077 # LATIN SMALL LETTER W
+0x78 0x0078 # LATIN SMALL LETTER X
+0x79 0x0079 # LATIN SMALL LETTER Y
+0x7A 0x007A # LATIN SMALL LETTER Z
+0x7B 0x00E3 # LATIN SMALL LETTER A WITH TILDE
+0x7C 0x00E7 # LATIN SMALL LETTER C WITH CEDILLA
+0x7D 0x00F5 # LATIN SMALL LETTER O WITH TILDE
+0x7E 0x00B0 # DEGREE SIGN
+0x7F 0x007F # DELETE (DEL)
diff --git a/externals/figlet/fonts/646-pt2.flc b/externals/figlet/fonts/646-pt2.flc
new file mode 100644
index 0000000000..8a00e61ec8
--- /dev/null
+++ b/externals/figlet/fonts/646-pt2.flc
@@ -0,0 +1,155 @@
+#
+# Name: PT2 to Unicode
+# Unicode version: 2.0
+# Table version: 0.1
+# Table format: Format A
+# Date: 0097-01-24
+# Authors: John Cowan (conversion)
+# Keld Simonsen (RFC 1345)
+#
+# General notes:
+#
+# This table contains data obtained from RFC 1345 on how
+# PT2 characters map into Unicode.
+#
+# Format: Three tab-separated columns
+# Column #1 is the PT2 code (in hex as 0xXX)
+# Column #2 is the Unicode (in hex as 0xXXXX)
+# Column #3 the Unicode name (follows a comment sign, '#')
+#
+# The entries are in PT2 order
+#
+# Any comments or problems, contact
+#
+# &rem source: ECMA registry
+# &alias iso-ir-84
+# &alias ISO646-PT2
+# &g0esc x2867 &g1esc x2967 &g2esc x2a67 &g3esc x2b67
+0x00 0x0000 # NULL (NUL)
+0x01 0x0001 # START OF HEADING (SOH)
+0x02 0x0002 # START OF TEXT (STX)
+0x03 0x0003 # END OF TEXT (ETX)
+0x04 0x0004 # END OF TRANSMISSION (EOT)
+0x05 0x0005 # ENQUIRY (ENQ)
+0x06 0x0006 # ACKNOWLEDGE (ACK)
+0x07 0x0007 # BELL (BEL)
+0x08 0x0008 # BACKSPACE (BS)
+0x09 0x0009 # CHARACTER TABULATION (HT)
+0x0A 0x000A # LINE FEED (LF)
+0x0B 0x000B # LINE TABULATION (VT)
+0x0C 0x000C # FORM FEED (FF)
+0x0D 0x000D # CARRIAGE RETURN (CR)
+0x0E 0x000E # SHIFT OUT (SO)
+0x0F 0x000F # SHIFT IN (SI)
+0x10 0x0010 # DATALINK ESCAPE (DLE)
+0x11 0x0011 # DEVICE CONTROL ONE (DC1)
+0x12 0x0012 # DEVICE CONTROL TWO (DC2)
+0x13 0x0013 # DEVICE CONTROL THREE (DC3)
+0x14 0x0014 # DEVICE CONTROL FOUR (DC4)
+0x15 0x0015 # NEGATIVE ACKNOWLEDGE (NAK)
+0x16 0x0016 # SYNCRONOUS IDLE (SYN)
+0x17 0x0017 # END OF TRANSMISSION BLOCK (ETB)
+0x18 0x0018 # CANCEL (CAN)
+0x19 0x0019 # END OF MEDIUM (EM)
+0x1A 0x001A # SUBSTITUTE (SUB)
+0x1B 0x001B # ESCAPE (ESC)
+0x1C 0x001C # FILE SEPARATOR (IS4)
+0x1D 0x001D # GROUP SEPARATOR (IS3)
+0x1E 0x001E # RECORD SEPARATOR (IS2)
+0x1F 0x001F # UNIT SEPARATOR (IS1)
+0x20 0x0020 # SPACE
+0x21 0x0021 # EXCLAMATION MARK
+0x22 0x0022 # QUOTATION MARK
+0x23 0x0023 # NUMBER SIGN
+0x24 0x0024 # DOLLAR SIGN
+0x25 0x0025 # PERCENT SIGN
+0x26 0x0026 # AMPERSAND
+0x27 0x0027 # APOSTROPHE
+0x28 0x0028 # LEFT PARENTHESIS
+0x29 0x0029 # RIGHT PARENTHESIS
+0x2A 0x002A # ASTERISK
+0x2B 0x002B # PLUS SIGN
+0x2C 0x002C # COMMA
+0x2D 0x002D # HYPHEN-MINUS
+0x2E 0x002E # FULL STOP
+0x2F 0x002F # SOLIDUS
+0x30 0x0030 # DIGIT ZERO
+0x31 0x0031 # DIGIT ONE
+0x32 0x0032 # DIGIT TWO
+0x33 0x0033 # DIGIT THREE
+0x34 0x0034 # DIGIT FOUR
+0x35 0x0035 # DIGIT FIVE
+0x36 0x0036 # DIGIT SIX
+0x37 0x0037 # DIGIT SEVEN
+0x38 0x0038 # DIGIT EIGHT
+0x39 0x0039 # DIGIT NINE
+0x3A 0x003A # COLON
+0x3B 0x003B # SEMICOLON
+0x3C 0x003C # LESS-THAN SIGN
+0x3D 0x003D # EQUALS SIGN
+0x3E 0x003E # GREATER-THAN SIGN
+0x3F 0x003F # QUESTION MARK
+0x40 0x00B4 # ACUTE ACCENT
+0x41 0x0041 # LATIN CAPITAL LETTER A
+0x42 0x0042 # LATIN CAPITAL LETTER B
+0x43 0x0043 # LATIN CAPITAL LETTER C
+0x44 0x0044 # LATIN CAPITAL LETTER D
+0x45 0x0045 # LATIN CAPITAL LETTER E
+0x46 0x0046 # LATIN CAPITAL LETTER F
+0x47 0x0047 # LATIN CAPITAL LETTER G
+0x48 0x0048 # LATIN CAPITAL LETTER H
+0x49 0x0049 # LATIN CAPITAL LETTER I
+0x4A 0x004A # LATIN CAPITAL LETTER J
+0x4B 0x004B # LATIN CAPITAL LETTER K
+0x4C 0x004C # LATIN CAPITAL LETTER L
+0x4D 0x004D # LATIN CAPITAL LETTER M
+0x4E 0x004E # LATIN CAPITAL LETTER N
+0x4F 0x004F # LATIN CAPITAL LETTER O
+0x50 0x0050 # LATIN CAPITAL LETTER P
+0x51 0x0051 # LATIN CAPITAL LETTER Q
+0x52 0x0052 # LATIN CAPITAL LETTER R
+0x53 0x0053 # LATIN CAPITAL LETTER S
+0x54 0x0054 # LATIN CAPITAL LETTER T
+0x55 0x0055 # LATIN CAPITAL LETTER U
+0x56 0x0056 # LATIN CAPITAL LETTER V
+0x57 0x0057 # LATIN CAPITAL LETTER W
+0x58 0x0058 # LATIN CAPITAL LETTER X
+0x59 0x0059 # LATIN CAPITAL LETTER Y
+0x5A 0x005A # LATIN CAPITAL LETTER Z
+0x5B 0x00C3 # LATIN CAPITAL LETTER A WITH TILDE
+0x5C 0x00C7 # LATIN CAPITAL LETTER C WITH CEDILLA
+0x5D 0x00D5 # LATIN CAPITAL LETTER O WITH TILDE
+0x5E 0x005E # CIRCUMFLEX ACCENT
+0x5F 0x005F # LOW LINE
+0x60 0x0060 # GRAVE ACCENT
+0x61 0x0061 # LATIN SMALL LETTER A
+0x62 0x0062 # LATIN SMALL LETTER B
+0x63 0x0063 # LATIN SMALL LETTER C
+0x64 0x0064 # LATIN SMALL LETTER D
+0x65 0x0065 # LATIN SMALL LETTER E
+0x66 0x0066 # LATIN SMALL LETTER F
+0x67 0x0067 # LATIN SMALL LETTER G
+0x68 0x0068 # LATIN SMALL LETTER H
+0x69 0x0069 # LATIN SMALL LETTER I
+0x6A 0x006A # LATIN SMALL LETTER J
+0x6B 0x006B # LATIN SMALL LETTER K
+0x6C 0x006C # LATIN SMALL LETTER L
+0x6D 0x006D # LATIN SMALL LETTER M
+0x6E 0x006E # LATIN SMALL LETTER N
+0x6F 0x006F # LATIN SMALL LETTER O
+0x70 0x0070 # LATIN SMALL LETTER P
+0x71 0x0071 # LATIN SMALL LETTER Q
+0x72 0x0072 # LATIN SMALL LETTER R
+0x73 0x0073 # LATIN SMALL LETTER S
+0x74 0x0074 # LATIN SMALL LETTER T
+0x75 0x0075 # LATIN SMALL LETTER U
+0x76 0x0076 # LATIN SMALL LETTER V
+0x77 0x0077 # LATIN SMALL LETTER W
+0x78 0x0078 # LATIN SMALL LETTER X
+0x79 0x0079 # LATIN SMALL LETTER Y
+0x7A 0x007A # LATIN SMALL LETTER Z
+0x7B 0x00E3 # LATIN SMALL LETTER A WITH TILDE
+0x7C 0x00E7 # LATIN SMALL LETTER C WITH CEDILLA
+0x7D 0x00F5 # LATIN SMALL LETTER O WITH TILDE
+0x7E 0x203E # OVERLINE
+0x7F 0x007F # DELETE (DEL)
diff --git a/externals/figlet/fonts/646-se.flc b/externals/figlet/fonts/646-se.flc
new file mode 100644
index 0000000000..424e886a01
--- /dev/null
+++ b/externals/figlet/fonts/646-se.flc
@@ -0,0 +1,158 @@
+#
+# Name: SEN_850200_B to Unicode
+# Unicode version: 2.0
+# Table version: 0.1
+# Table format: Format A
+# Date: 0097-01-24
+# Authors: John Cowan (conversion)
+# Keld Simonsen (RFC 1345)
+#
+# General notes:
+#
+# This table contains data obtained from RFC 1345 on how
+# SEN_850200_B characters map into Unicode.
+#
+# Format: Three tab-separated columns
+# Column #1 is the SEN_850200_B code (in hex as 0xXX)
+# Column #2 is the Unicode (in hex as 0xXXXX)
+# Column #3 the Unicode name (follows a comment sign, '#')
+#
+# The entries are in SEN_850200_B order
+#
+# Any comments or problems, contact
+#
+# &rem source: ECMA registry
+# &alias iso-ir-10
+# &alias FI
+# &alias ISO646-FI
+# &alias ISO646-SE
+# &alias se
+# &g0esc x2847 &g1esc x2947 &g2esc x2a47 &g3esc x2b47
+0x00 0x0000 # NULL (NUL)
+0x01 0x0001 # START OF HEADING (SOH)
+0x02 0x0002 # START OF TEXT (STX)
+0x03 0x0003 # END OF TEXT (ETX)
+0x04 0x0004 # END OF TRANSMISSION (EOT)
+0x05 0x0005 # ENQUIRY (ENQ)
+0x06 0x0006 # ACKNOWLEDGE (ACK)
+0x07 0x0007 # BELL (BEL)
+0x08 0x0008 # BACKSPACE (BS)
+0x09 0x0009 # CHARACTER TABULATION (HT)
+0x0A 0x000A # LINE FEED (LF)
+0x0B 0x000B # LINE TABULATION (VT)
+0x0C 0x000C # FORM FEED (FF)
+0x0D 0x000D # CARRIAGE RETURN (CR)
+0x0E 0x000E # SHIFT OUT (SO)
+0x0F 0x000F # SHIFT IN (SI)
+0x10 0x0010 # DATALINK ESCAPE (DLE)
+0x11 0x0011 # DEVICE CONTROL ONE (DC1)
+0x12 0x0012 # DEVICE CONTROL TWO (DC2)
+0x13 0x0013 # DEVICE CONTROL THREE (DC3)
+0x14 0x0014 # DEVICE CONTROL FOUR (DC4)
+0x15 0x0015 # NEGATIVE ACKNOWLEDGE (NAK)
+0x16 0x0016 # SYNCRONOUS IDLE (SYN)
+0x17 0x0017 # END OF TRANSMISSION BLOCK (ETB)
+0x18 0x0018 # CANCEL (CAN)
+0x19 0x0019 # END OF MEDIUM (EM)
+0x1A 0x001A # SUBSTITUTE (SUB)
+0x1B 0x001B # ESCAPE (ESC)
+0x1C 0x001C # FILE SEPARATOR (IS4)
+0x1D 0x001D # GROUP SEPARATOR (IS3)
+0x1E 0x001E # RECORD SEPARATOR (IS2)
+0x1F 0x001F # UNIT SEPARATOR (IS1)
+0x20 0x0020 # SPACE
+0x21 0x0021 # EXCLAMATION MARK
+0x22 0x0022 # QUOTATION MARK
+0x23 0x0023 # NUMBER SIGN
+0x24 0x00A4 # CURRENCY SIGN
+0x25 0x0025 # PERCENT SIGN
+0x26 0x0026 # AMPERSAND
+0x27 0x0027 # APOSTROPHE
+0x28 0x0028 # LEFT PARENTHESIS
+0x29 0x0029 # RIGHT PARENTHESIS
+0x2A 0x002A # ASTERISK
+0x2B 0x002B # PLUS SIGN
+0x2C 0x002C # COMMA
+0x2D 0x002D # HYPHEN-MINUS
+0x2E 0x002E # FULL STOP
+0x2F 0x002F # SOLIDUS
+0x30 0x0030 # DIGIT ZERO
+0x31 0x0031 # DIGIT ONE
+0x32 0x0032 # DIGIT TWO
+0x33 0x0033 # DIGIT THREE
+0x34 0x0034 # DIGIT FOUR
+0x35 0x0035 # DIGIT FIVE
+0x36 0x0036 # DIGIT SIX
+0x37 0x0037 # DIGIT SEVEN
+0x38 0x0038 # DIGIT EIGHT
+0x39 0x0039 # DIGIT NINE
+0x3A 0x003A # COLON
+0x3B 0x003B # SEMICOLON
+0x3C 0x003C # LESS-THAN SIGN
+0x3D 0x003D # EQUALS SIGN
+0x3E 0x003E # GREATER-THAN SIGN
+0x3F 0x003F # QUESTION MARK
+0x40 0x0040 # COMMERCIAL AT
+0x41 0x0041 # LATIN CAPITAL LETTER A
+0x42 0x0042 # LATIN CAPITAL LETTER B
+0x43 0x0043 # LATIN CAPITAL LETTER C
+0x44 0x0044 # LATIN CAPITAL LETTER D
+0x45 0x0045 # LATIN CAPITAL LETTER E
+0x46 0x0046 # LATIN CAPITAL LETTER F
+0x47 0x0047 # LATIN CAPITAL LETTER G
+0x48 0x0048 # LATIN CAPITAL LETTER H
+0x49 0x0049 # LATIN CAPITAL LETTER I
+0x4A 0x004A # LATIN CAPITAL LETTER J
+0x4B 0x004B # LATIN CAPITAL LETTER K
+0x4C 0x004C # LATIN CAPITAL LETTER L
+0x4D 0x004D # LATIN CAPITAL LETTER M
+0x4E 0x004E # LATIN CAPITAL LETTER N
+0x4F 0x004F # LATIN CAPITAL LETTER O
+0x50 0x0050 # LATIN CAPITAL LETTER P
+0x51 0x0051 # LATIN CAPITAL LETTER Q
+0x52 0x0052 # LATIN CAPITAL LETTER R
+0x53 0x0053 # LATIN CAPITAL LETTER S
+0x54 0x0054 # LATIN CAPITAL LETTER T
+0x55 0x0055 # LATIN CAPITAL LETTER U
+0x56 0x0056 # LATIN CAPITAL LETTER V
+0x57 0x0057 # LATIN CAPITAL LETTER W
+0x58 0x0058 # LATIN CAPITAL LETTER X
+0x59 0x0059 # LATIN CAPITAL LETTER Y
+0x5A 0x005A # LATIN CAPITAL LETTER Z
+0x5B 0x00C4 # LATIN CAPITAL LETTER A WITH DIAERESIS
+0x5C 0x00D6 # LATIN CAPITAL LETTER O WITH DIAERESIS
+0x5D 0x00C5 # LATIN CAPITAL LETTER A WITH RING ABOVE
+0x5E 0x005E # CIRCUMFLEX ACCENT
+0x5F 0x005F # LOW LINE
+0x60 0x0060 # GRAVE ACCENT
+0x61 0x0061 # LATIN SMALL LETTER A
+0x62 0x0062 # LATIN SMALL LETTER B
+0x63 0x0063 # LATIN SMALL LETTER C
+0x64 0x0064 # LATIN SMALL LETTER D
+0x65 0x0065 # LATIN SMALL LETTER E
+0x66 0x0066 # LATIN SMALL LETTER F
+0x67 0x0067 # LATIN SMALL LETTER G
+0x68 0x0068 # LATIN SMALL LETTER H
+0x69 0x0069 # LATIN SMALL LETTER I
+0x6A 0x006A # LATIN SMALL LETTER J
+0x6B 0x006B # LATIN SMALL LETTER K
+0x6C 0x006C # LATIN SMALL LETTER L
+0x6D 0x006D # LATIN SMALL LETTER M
+0x6E 0x006E # LATIN SMALL LETTER N
+0x6F 0x006F # LATIN SMALL LETTER O
+0x70 0x0070 # LATIN SMALL LETTER P
+0x71 0x0071 # LATIN SMALL LETTER Q
+0x72 0x0072 # LATIN SMALL LETTER R
+0x73 0x0073 # LATIN SMALL LETTER S
+0x74 0x0074 # LATIN SMALL LETTER T
+0x75 0x0075 # LATIN SMALL LETTER U
+0x76 0x0076 # LATIN SMALL LETTER V
+0x77 0x0077 # LATIN SMALL LETTER W
+0x78 0x0078 # LATIN SMALL LETTER X
+0x79 0x0079 # LATIN SMALL LETTER Y
+0x7A 0x007A # LATIN SMALL LETTER Z
+0x7B 0x00E4 # LATIN SMALL LETTER A WITH DIAERESIS
+0x7C 0x00F6 # LATIN SMALL LETTER O WITH DIAERESIS
+0x7D 0x00E5 # LATIN SMALL LETTER A WITH RING ABOVE
+0x7E 0x203E # OVERLINE
+0x7F 0x007F # DELETE (DEL)
diff --git a/externals/figlet/fonts/646-se2.flc b/externals/figlet/fonts/646-se2.flc
new file mode 100644
index 0000000000..38c86cd37c
--- /dev/null
+++ b/externals/figlet/fonts/646-se2.flc
@@ -0,0 +1,156 @@
+#
+# Name: SEN_850200_C to Unicode
+# Unicode version: 2.0
+# Table version: 0.1
+# Table format: Format A
+# Date: 0097-01-24
+# Authors: John Cowan (conversion)
+# Keld Simonsen (RFC 1345)
+#
+# General notes:
+#
+# This table contains data obtained from RFC 1345 on how
+# SEN_850200_C characters map into Unicode.
+#
+# Format: Three tab-separated columns
+# Column #1 is the SEN_850200_C code (in hex as 0xXX)
+# Column #2 is the Unicode (in hex as 0xXXXX)
+# Column #3 the Unicode name (follows a comment sign, '#')
+#
+# The entries are in SEN_850200_C order
+#
+# Any comments or problems, contact
+#
+# &rem source: ECMA registry
+# &alias iso-ir-11
+# &alias ISO646-SE2
+# &g0esc x2848 &g1esc x2948 &g2esc x2a48 &g3esc x2b48
+# &alias se2
+0x00 0x0000 # NULL (NUL)
+0x01 0x0001 # START OF HEADING (SOH)
+0x02 0x0002 # START OF TEXT (STX)
+0x03 0x0003 # END OF TEXT (ETX)
+0x04 0x0004 # END OF TRANSMISSION (EOT)
+0x05 0x0005 # ENQUIRY (ENQ)
+0x06 0x0006 # ACKNOWLEDGE (ACK)
+0x07 0x0007 # BELL (BEL)
+0x08 0x0008 # BACKSPACE (BS)
+0x09 0x0009 # CHARACTER TABULATION (HT)
+0x0A 0x000A # LINE FEED (LF)
+0x0B 0x000B # LINE TABULATION (VT)
+0x0C 0x000C # FORM FEED (FF)
+0x0D 0x000D # CARRIAGE RETURN (CR)
+0x0E 0x000E # SHIFT OUT (SO)
+0x0F 0x000F # SHIFT IN (SI)
+0x10 0x0010 # DATALINK ESCAPE (DLE)
+0x11 0x0011 # DEVICE CONTROL ONE (DC1)
+0x12 0x0012 # DEVICE CONTROL TWO (DC2)
+0x13 0x0013 # DEVICE CONTROL THREE (DC3)
+0x14 0x0014 # DEVICE CONTROL FOUR (DC4)
+0x15 0x0015 # NEGATIVE ACKNOWLEDGE (NAK)
+0x16 0x0016 # SYNCRONOUS IDLE (SYN)
+0x17 0x0017 # END OF TRANSMISSION BLOCK (ETB)
+0x18 0x0018 # CANCEL (CAN)
+0x19 0x0019 # END OF MEDIUM (EM)
+0x1A 0x001A # SUBSTITUTE (SUB)
+0x1B 0x001B # ESCAPE (ESC)
+0x1C 0x001C # FILE SEPARATOR (IS4)
+0x1D 0x001D # GROUP SEPARATOR (IS3)
+0x1E 0x001E # RECORD SEPARATOR (IS2)
+0x1F 0x001F # UNIT SEPARATOR (IS1)
+0x20 0x0020 # SPACE
+0x21 0x0021 # EXCLAMATION MARK
+0x22 0x0022 # QUOTATION MARK
+0x23 0x0023 # NUMBER SIGN
+0x24 0x00A4 # CURRENCY SIGN
+0x25 0x0025 # PERCENT SIGN
+0x26 0x0026 # AMPERSAND
+0x27 0x0027 # APOSTROPHE
+0x28 0x0028 # LEFT PARENTHESIS
+0x29 0x0029 # RIGHT PARENTHESIS
+0x2A 0x002A # ASTERISK
+0x2B 0x002B # PLUS SIGN
+0x2C 0x002C # COMMA
+0x2D 0x002D # HYPHEN-MINUS
+0x2E 0x002E # FULL STOP
+0x2F 0x002F # SOLIDUS
+0x30 0x0030 # DIGIT ZERO
+0x31 0x0031 # DIGIT ONE
+0x32 0x0032 # DIGIT TWO
+0x33 0x0033 # DIGIT THREE
+0x34 0x0034 # DIGIT FOUR
+0x35 0x0035 # DIGIT FIVE
+0x36 0x0036 # DIGIT SIX
+0x37 0x0037 # DIGIT SEVEN
+0x38 0x0038 # DIGIT EIGHT
+0x39 0x0039 # DIGIT NINE
+0x3A 0x003A # COLON
+0x3B 0x003B # SEMICOLON
+0x3C 0x003C # LESS-THAN SIGN
+0x3D 0x003D # EQUALS SIGN
+0x3E 0x003E # GREATER-THAN SIGN
+0x3F 0x003F # QUESTION MARK
+0x40 0x00C9 # LATIN CAPITAL LETTER E WITH ACUTE
+0x41 0x0041 # LATIN CAPITAL LETTER A
+0x42 0x0042 # LATIN CAPITAL LETTER B
+0x43 0x0043 # LATIN CAPITAL LETTER C
+0x44 0x0044 # LATIN CAPITAL LETTER D
+0x45 0x0045 # LATIN CAPITAL LETTER E
+0x46 0x0046 # LATIN CAPITAL LETTER F
+0x47 0x0047 # LATIN CAPITAL LETTER G
+0x48 0x0048 # LATIN CAPITAL LETTER H
+0x49 0x0049 # LATIN CAPITAL LETTER I
+0x4A 0x004A # LATIN CAPITAL LETTER J
+0x4B 0x004B # LATIN CAPITAL LETTER K
+0x4C 0x004C # LATIN CAPITAL LETTER L
+0x4D 0x004D # LATIN CAPITAL LETTER M
+0x4E 0x004E # LATIN CAPITAL LETTER N
+0x4F 0x004F # LATIN CAPITAL LETTER O
+0x50 0x0050 # LATIN CAPITAL LETTER P
+0x51 0x0051 # LATIN CAPITAL LETTER Q
+0x52 0x0052 # LATIN CAPITAL LETTER R
+0x53 0x0053 # LATIN CAPITAL LETTER S
+0x54 0x0054 # LATIN CAPITAL LETTER T
+0x55 0x0055 # LATIN CAPITAL LETTER U
+0x56 0x0056 # LATIN CAPITAL LETTER V
+0x57 0x0057 # LATIN CAPITAL LETTER W
+0x58 0x0058 # LATIN CAPITAL LETTER X
+0x59 0x0059 # LATIN CAPITAL LETTER Y
+0x5A 0x005A # LATIN CAPITAL LETTER Z
+0x5B 0x00C4 # LATIN CAPITAL LETTER A WITH DIAERESIS
+0x5C 0x00D6 # LATIN CAPITAL LETTER O WITH DIAERESIS
+0x5D 0x00C5 # LATIN CAPITAL LETTER A WITH RING ABOVE
+0x5E 0x00DC # LATIN CAPITAL LETTER U WITH DIAERESIS
+0x5F 0x005F # LOW LINE
+0x60 0x00E9 # LATIN SMALL LETTER E WITH ACUTE
+0x61 0x0061 # LATIN SMALL LETTER A
+0x62 0x0062 # LATIN SMALL LETTER B
+0x63 0x0063 # LATIN SMALL LETTER C
+0x64 0x0064 # LATIN SMALL LETTER D
+0x65 0x0065 # LATIN SMALL LETTER E
+0x66 0x0066 # LATIN SMALL LETTER F
+0x67 0x0067 # LATIN SMALL LETTER G
+0x68 0x0068 # LATIN SMALL LETTER H
+0x69 0x0069 # LATIN SMALL LETTER I
+0x6A 0x006A # LATIN SMALL LETTER J
+0x6B 0x006B # LATIN SMALL LETTER K
+0x6C 0x006C # LATIN SMALL LETTER L
+0x6D 0x006D # LATIN SMALL LETTER M
+0x6E 0x006E # LATIN SMALL LETTER N
+0x6F 0x006F # LATIN SMALL LETTER O
+0x70 0x0070 # LATIN SMALL LETTER P
+0x71 0x0071 # LATIN SMALL LETTER Q
+0x72 0x0072 # LATIN SMALL LETTER R
+0x73 0x0073 # LATIN SMALL LETTER S
+0x74 0x0074 # LATIN SMALL LETTER T
+0x75 0x0075 # LATIN SMALL LETTER U
+0x76 0x0076 # LATIN SMALL LETTER V
+0x77 0x0077 # LATIN SMALL LETTER W
+0x78 0x0078 # LATIN SMALL LETTER X
+0x79 0x0079 # LATIN SMALL LETTER Y
+0x7A 0x007A # LATIN SMALL LETTER Z
+0x7B 0x00E4 # LATIN SMALL LETTER A WITH DIAERESIS
+0x7C 0x00F6 # LATIN SMALL LETTER O WITH DIAERESIS
+0x7D 0x00E5 # LATIN SMALL LETTER A WITH RING ABOVE
+0x7E 0x00FC # LATIN SMALL LETTER U WITH DIAERESIS
+0x7F 0x007F # DELETE (DEL)
diff --git a/externals/figlet/fonts/646-yu.flc b/externals/figlet/fonts/646-yu.flc
new file mode 100644
index 0000000000..6307a6aff4
--- /dev/null
+++ b/externals/figlet/fonts/646-yu.flc
@@ -0,0 +1,157 @@
+#
+# Name: JUS_I.B1.002 to Unicode
+# Unicode version: 2.0
+# Table version: 0.1
+# Table format: Format A
+# Date: 0097-01-24
+# Authors: John Cowan (conversion)
+# Keld Simonsen (RFC 1345)
+#
+# General notes:
+#
+# This table contains data obtained from RFC 1345 on how
+# JUS_I.B1.002 characters map into Unicode.
+#
+# Format: Three tab-separated columns
+# Column #1 is the JUS_I.B1.002 code (in hex as 0xXX)
+# Column #2 is the Unicode (in hex as 0xXXXX)
+# Column #3 the Unicode name (follows a comment sign, '#')
+#
+# The entries are in JUS_I.B1.002 order
+#
+# Any comments or problems, contact
+#
+# &rem source: ECMA registry
+# &alias iso-ir-141
+# &g0esc x287a &g1esc x297a &g2esc x2a7a &g3esc x2b7a
+# &alias ISO646-YU
+# &alias js
+# &alias yu
+0x00 0x0000 # NULL (NUL)
+0x01 0x0001 # START OF HEADING (SOH)
+0x02 0x0002 # START OF TEXT (STX)
+0x03 0x0003 # END OF TEXT (ETX)
+0x04 0x0004 # END OF TRANSMISSION (EOT)
+0x05 0x0005 # ENQUIRY (ENQ)
+0x06 0x0006 # ACKNOWLEDGE (ACK)
+0x07 0x0007 # BELL (BEL)
+0x08 0x0008 # BACKSPACE (BS)
+0x09 0x0009 # CHARACTER TABULATION (HT)
+0x0A 0x000A # LINE FEED (LF)
+0x0B 0x000B # LINE TABULATION (VT)
+0x0C 0x000C # FORM FEED (FF)
+0x0D 0x000D # CARRIAGE RETURN (CR)
+0x0E 0x000E # SHIFT OUT (SO)
+0x0F 0x000F # SHIFT IN (SI)
+0x10 0x0010 # DATALINK ESCAPE (DLE)
+0x11 0x0011 # DEVICE CONTROL ONE (DC1)
+0x12 0x0012 # DEVICE CONTROL TWO (DC2)
+0x13 0x0013 # DEVICE CONTROL THREE (DC3)
+0x14 0x0014 # DEVICE CONTROL FOUR (DC4)
+0x15 0x0015 # NEGATIVE ACKNOWLEDGE (NAK)
+0x16 0x0016 # SYNCRONOUS IDLE (SYN)
+0x17 0x0017 # END OF TRANSMISSION BLOCK (ETB)
+0x18 0x0018 # CANCEL (CAN)
+0x19 0x0019 # END OF MEDIUM (EM)
+0x1A 0x001A # SUBSTITUTE (SUB)
+0x1B 0x001B # ESCAPE (ESC)
+0x1C 0x001C # FILE SEPARATOR (IS4)
+0x1D 0x001D # GROUP SEPARATOR (IS3)
+0x1E 0x001E # RECORD SEPARATOR (IS2)
+0x1F 0x001F # UNIT SEPARATOR (IS1)
+0x20 0x0020 # SPACE
+0x21 0x0021 # EXCLAMATION MARK
+0x22 0x0022 # QUOTATION MARK
+0x23 0x0023 # NUMBER SIGN
+0x24 0x0024 # DOLLAR SIGN
+0x25 0x0025 # PERCENT SIGN
+0x26 0x0026 # AMPERSAND
+0x27 0x0027 # APOSTROPHE
+0x28 0x0028 # LEFT PARENTHESIS
+0x29 0x0029 # RIGHT PARENTHESIS
+0x2A 0x002A # ASTERISK
+0x2B 0x002B # PLUS SIGN
+0x2C 0x002C # COMMA
+0x2D 0x002D # HYPHEN-MINUS
+0x2E 0x002E # FULL STOP
+0x2F 0x002F # SOLIDUS
+0x30 0x0030 # DIGIT ZERO
+0x31 0x0031 # DIGIT ONE
+0x32 0x0032 # DIGIT TWO
+0x33 0x0033 # DIGIT THREE
+0x34 0x0034 # DIGIT FOUR
+0x35 0x0035 # DIGIT FIVE
+0x36 0x0036 # DIGIT SIX
+0x37 0x0037 # DIGIT SEVEN
+0x38 0x0038 # DIGIT EIGHT
+0x39 0x0039 # DIGIT NINE
+0x3A 0x003A # COLON
+0x3B 0x003B # SEMICOLON
+0x3C 0x003C # LESS-THAN SIGN
+0x3D 0x003D # EQUALS SIGN
+0x3E 0x003E # GREATER-THAN SIGN
+0x3F 0x003F # QUESTION MARK
+0x40 0x017D # LATIN CAPITAL LETTER Z WITH CARON
+0x41 0x0041 # LATIN CAPITAL LETTER A
+0x42 0x0042 # LATIN CAPITAL LETTER B
+0x43 0x0043 # LATIN CAPITAL LETTER C
+0x44 0x0044 # LATIN CAPITAL LETTER D
+0x45 0x0045 # LATIN CAPITAL LETTER E
+0x46 0x0046 # LATIN CAPITAL LETTER F
+0x47 0x0047 # LATIN CAPITAL LETTER G
+0x48 0x0048 # LATIN CAPITAL LETTER H
+0x49 0x0049 # LATIN CAPITAL LETTER I
+0x4A 0x004A # LATIN CAPITAL LETTER J
+0x4B 0x004B # LATIN CAPITAL LETTER K
+0x4C 0x004C # LATIN CAPITAL LETTER L
+0x4D 0x004D # LATIN CAPITAL LETTER M
+0x4E 0x004E # LATIN CAPITAL LETTER N
+0x4F 0x004F # LATIN CAPITAL LETTER O
+0x50 0x0050 # LATIN CAPITAL LETTER P
+0x51 0x0051 # LATIN CAPITAL LETTER Q
+0x52 0x0052 # LATIN CAPITAL LETTER R
+0x53 0x0053 # LATIN CAPITAL LETTER S
+0x54 0x0054 # LATIN CAPITAL LETTER T
+0x55 0x0055 # LATIN CAPITAL LETTER U
+0x56 0x0056 # LATIN CAPITAL LETTER V
+0x57 0x0057 # LATIN CAPITAL LETTER W
+0x58 0x0058 # LATIN CAPITAL LETTER X
+0x59 0x0059 # LATIN CAPITAL LETTER Y
+0x5A 0x005A # LATIN CAPITAL LETTER Z
+0x5B 0x0160 # LATIN CAPITAL LETTER S WITH CARON
+0x5C 0x0110 # LATIN CAPITAL LETTER D WITH STROKE
+0x5D 0x0106 # LATIN CAPITAL LETTER C WITH ACUTE
+0x5E 0x010C # LATIN CAPITAL LETTER C WITH CARON
+0x5F 0x005F # LOW LINE
+0x60 0x017E # LATIN SMALL LETTER Z WITH CARON
+0x61 0x0061 # LATIN SMALL LETTER A
+0x62 0x0062 # LATIN SMALL LETTER B
+0x63 0x0063 # LATIN SMALL LETTER C
+0x64 0x0064 # LATIN SMALL LETTER D
+0x65 0x0065 # LATIN SMALL LETTER E
+0x66 0x0066 # LATIN SMALL LETTER F
+0x67 0x0067 # LATIN SMALL LETTER G
+0x68 0x0068 # LATIN SMALL LETTER H
+0x69 0x0069 # LATIN SMALL LETTER I
+0x6A 0x006A # LATIN SMALL LETTER J
+0x6B 0x006B # LATIN SMALL LETTER K
+0x6C 0x006C # LATIN SMALL LETTER L
+0x6D 0x006D # LATIN SMALL LETTER M
+0x6E 0x006E # LATIN SMALL LETTER N
+0x6F 0x006F # LATIN SMALL LETTER O
+0x70 0x0070 # LATIN SMALL LETTER P
+0x71 0x0071 # LATIN SMALL LETTER Q
+0x72 0x0072 # LATIN SMALL LETTER R
+0x73 0x0073 # LATIN SMALL LETTER S
+0x74 0x0074 # LATIN SMALL LETTER T
+0x75 0x0075 # LATIN SMALL LETTER U
+0x76 0x0076 # LATIN SMALL LETTER V
+0x77 0x0077 # LATIN SMALL LETTER W
+0x78 0x0078 # LATIN SMALL LETTER X
+0x79 0x0079 # LATIN SMALL LETTER Y
+0x7A 0x007A # LATIN SMALL LETTER Z
+0x7B 0x0161 # LATIN SMALL LETTER S WITH CARON
+0x7C 0x0111 # LATIN SMALL LETTER D WITH STROKE
+0x7D 0x0107 # LATIN SMALL LETTER C WITH ACUTE
+0x7E 0x010D # LATIN SMALL LETTER C WITH CARON
+0x7F 0x007F # DELETE (DEL)
diff --git a/externals/figlet/fonts/8859-2.flc b/externals/figlet/fonts/8859-2.flc
new file mode 100644
index 0000000000..e45df25eb8
--- /dev/null
+++ b/externals/figlet/fonts/8859-2.flc
@@ -0,0 +1,303 @@
+#
+# Name: ISO 8859-2:1999 to Unicode
+# Unicode version: 3.0
+# Table version: 1.0
+# Table format: Format A
+# Date: 1999 July 27
+# Authors: Ken Whistler
+#
+# Copyright (c) 1991-1999 Unicode, Inc. All Rights reserved.
+#
+# This file is provided as-is by Unicode, Inc. (The Unicode Consortium).
+# No claims are made as to fitness for any particular purpose. No
+# warranties of any kind are expressed or implied. The recipient
+# agrees to determine applicability of information provided. If this
+# file has been provided on optical media by Unicode, Inc., the sole
+# remedy for any claim will be exchange of defective media within 90
+# days of receipt.
+#
+# Unicode, Inc. hereby grants the right to freely use the information
+# supplied in this file in the creation of products supporting the
+# Unicode Standard, and to make copies of this file in any form for
+# internal or external distribution as long as this notice remains
+# attached.
+#
+# General notes:
+#
+# This table contains the data the Unicode Consortium has on how
+# ISO/IEC 8859-2:1999 characters map into Unicode.
+#
+# Format: Three tab-separated columns
+# Column #1 is the ISO/IEC 8859-2 code (in hex as 0xXX)
+# Column #2 is the Unicode (in hex as 0xXXXX)
+# Column #3 the Unicode name (follows a comment sign, '#')
+#
+# The entries are in ISO/IEC 8859-2 order.
+#
+# Version history
+# 1.0 version updates 0.1 version by adding mappings for all
+# control characters.
+#
+# Updated versions of this file may be found in:
+#
+#
+# Any comments or problems, contact
+# Please note that is an archival address;
+# notices will be checked, but do not expect an immediate response.
+#
+0x00 0x0000 # NULL
+0x01 0x0001 # START OF HEADING
+0x02 0x0002 # START OF TEXT
+0x03 0x0003 # END OF TEXT
+0x04 0x0004 # END OF TRANSMISSION
+0x05 0x0005 # ENQUIRY
+0x06 0x0006 # ACKNOWLEDGE
+0x07 0x0007 # BELL
+0x08 0x0008 # BACKSPACE
+0x09 0x0009 # HORIZONTAL TABULATION
+0x0A 0x000A # LINE FEED
+0x0B 0x000B # VERTICAL TABULATION
+0x0C 0x000C # FORM FEED
+0x0D 0x000D # CARRIAGE RETURN
+0x0E 0x000E # SHIFT OUT
+0x0F 0x000F # SHIFT IN
+0x10 0x0010 # DATA LINK ESCAPE
+0x11 0x0011 # DEVICE CONTROL ONE
+0x12 0x0012 # DEVICE CONTROL TWO
+0x13 0x0013 # DEVICE CONTROL THREE
+0x14 0x0014 # DEVICE CONTROL FOUR
+0x15 0x0015 # NEGATIVE ACKNOWLEDGE
+0x16 0x0016 # SYNCHRONOUS IDLE
+0x17 0x0017 # END OF TRANSMISSION BLOCK
+0x18 0x0018 # CANCEL
+0x19 0x0019 # END OF MEDIUM
+0x1A 0x001A # SUBSTITUTE
+0x1B 0x001B # ESCAPE
+0x1C 0x001C # FILE SEPARATOR
+0x1D 0x001D # GROUP SEPARATOR
+0x1E 0x001E # RECORD SEPARATOR
+0x1F 0x001F # UNIT SEPARATOR
+0x20 0x0020 # SPACE
+0x21 0x0021 # EXCLAMATION MARK
+0x22 0x0022 # QUOTATION MARK
+0x23 0x0023 # NUMBER SIGN
+0x24 0x0024 # DOLLAR SIGN
+0x25 0x0025 # PERCENT SIGN
+0x26 0x0026 # AMPERSAND
+0x27 0x0027 # APOSTROPHE
+0x28 0x0028 # LEFT PARENTHESIS
+0x29 0x0029 # RIGHT PARENTHESIS
+0x2A 0x002A # ASTERISK
+0x2B 0x002B # PLUS SIGN
+0x2C 0x002C # COMMA
+0x2D 0x002D # HYPHEN-MINUS
+0x2E 0x002E # FULL STOP
+0x2F 0x002F # SOLIDUS
+0x30 0x0030 # DIGIT ZERO
+0x31 0x0031 # DIGIT ONE
+0x32 0x0032 # DIGIT TWO
+0x33 0x0033 # DIGIT THREE
+0x34 0x0034 # DIGIT FOUR
+0x35 0x0035 # DIGIT FIVE
+0x36 0x0036 # DIGIT SIX
+0x37 0x0037 # DIGIT SEVEN
+0x38 0x0038 # DIGIT EIGHT
+0x39 0x0039 # DIGIT NINE
+0x3A 0x003A # COLON
+0x3B 0x003B # SEMICOLON
+0x3C 0x003C # LESS-THAN SIGN
+0x3D 0x003D # EQUALS SIGN
+0x3E 0x003E # GREATER-THAN SIGN
+0x3F 0x003F # QUESTION MARK
+0x40 0x0040 # COMMERCIAL AT
+0x41 0x0041 # LATIN CAPITAL LETTER A
+0x42 0x0042 # LATIN CAPITAL LETTER B
+0x43 0x0043 # LATIN CAPITAL LETTER C
+0x44 0x0044 # LATIN CAPITAL LETTER D
+0x45 0x0045 # LATIN CAPITAL LETTER E
+0x46 0x0046 # LATIN CAPITAL LETTER F
+0x47 0x0047 # LATIN CAPITAL LETTER G
+0x48 0x0048 # LATIN CAPITAL LETTER H
+0x49 0x0049 # LATIN CAPITAL LETTER I
+0x4A 0x004A # LATIN CAPITAL LETTER J
+0x4B 0x004B # LATIN CAPITAL LETTER K
+0x4C 0x004C # LATIN CAPITAL LETTER L
+0x4D 0x004D # LATIN CAPITAL LETTER M
+0x4E 0x004E # LATIN CAPITAL LETTER N
+0x4F 0x004F # LATIN CAPITAL LETTER O
+0x50 0x0050 # LATIN CAPITAL LETTER P
+0x51 0x0051 # LATIN CAPITAL LETTER Q
+0x52 0x0052 # LATIN CAPITAL LETTER R
+0x53 0x0053 # LATIN CAPITAL LETTER S
+0x54 0x0054 # LATIN CAPITAL LETTER T
+0x55 0x0055 # LATIN CAPITAL LETTER U
+0x56 0x0056 # LATIN CAPITAL LETTER V
+0x57 0x0057 # LATIN CAPITAL LETTER W
+0x58 0x0058 # LATIN CAPITAL LETTER X
+0x59 0x0059 # LATIN CAPITAL LETTER Y
+0x5A 0x005A # LATIN CAPITAL LETTER Z
+0x5B 0x005B # LEFT SQUARE BRACKET
+0x5C 0x005C # REVERSE SOLIDUS
+0x5D 0x005D # RIGHT SQUARE BRACKET
+0x5E 0x005E # CIRCUMFLEX ACCENT
+0x5F 0x005F # LOW LINE
+0x60 0x0060 # GRAVE ACCENT
+0x61 0x0061 # LATIN SMALL LETTER A
+0x62 0x0062 # LATIN SMALL LETTER B
+0x63 0x0063 # LATIN SMALL LETTER C
+0x64 0x0064 # LATIN SMALL LETTER D
+0x65 0x0065 # LATIN SMALL LETTER E
+0x66 0x0066 # LATIN SMALL LETTER F
+0x67 0x0067 # LATIN SMALL LETTER G
+0x68 0x0068 # LATIN SMALL LETTER H
+0x69 0x0069 # LATIN SMALL LETTER I
+0x6A 0x006A # LATIN SMALL LETTER J
+0x6B 0x006B # LATIN SMALL LETTER K
+0x6C 0x006C # LATIN SMALL LETTER L
+0x6D 0x006D # LATIN SMALL LETTER M
+0x6E 0x006E # LATIN SMALL LETTER N
+0x6F 0x006F # LATIN SMALL LETTER O
+0x70 0x0070 # LATIN SMALL LETTER P
+0x71 0x0071 # LATIN SMALL LETTER Q
+0x72 0x0072 # LATIN SMALL LETTER R
+0x73 0x0073 # LATIN SMALL LETTER S
+0x74 0x0074 # LATIN SMALL LETTER T
+0x75 0x0075 # LATIN SMALL LETTER U
+0x76 0x0076 # LATIN SMALL LETTER V
+0x77 0x0077 # LATIN SMALL LETTER W
+0x78 0x0078 # LATIN SMALL LETTER X
+0x79 0x0079 # LATIN SMALL LETTER Y
+0x7A 0x007A # LATIN SMALL LETTER Z
+0x7B 0x007B # LEFT CURLY BRACKET
+0x7C 0x007C # VERTICAL LINE
+0x7D 0x007D # RIGHT CURLY BRACKET
+0x7E 0x007E # TILDE
+0x7F 0x007F # DELETE
+0x80 0x0080 #
+0x81 0x0081 #
+0x82 0x0082 #
+0x83 0x0083 #
+0x84 0x0084 #
+0x85 0x0085 #
+0x86 0x0086 #
+0x87 0x0087 #
+0x88 0x0088 #
+0x89 0x0089 #
+0x8A 0x008A #
+0x8B 0x008B #
+0x8C 0x008C #
+0x8D 0x008D #
+0x8E 0x008E #
+0x8F 0x008F #
+0x90 0x0090 #
+0x91 0x0091 #
+0x92 0x0092 #
+0x93 0x0093 #
+0x94 0x0094 #
+0x95 0x0095 #
+0x96 0x0096 #
+0x97 0x0097 #
+0x98 0x0098 #
+0x99 0x0099 #
+0x9A 0x009A #
+0x9B 0x009B #
+0x9C 0x009C #
+0x9D 0x009D #
+0x9E 0x009E #
+0x9F 0x009F #
+0xA0 0x00A0 # NO-BREAK SPACE
+0xA1 0x0104 # LATIN CAPITAL LETTER A WITH OGONEK
+0xA2 0x02D8 # BREVE
+0xA3 0x0141 # LATIN CAPITAL LETTER L WITH STROKE
+0xA4 0x00A4 # CURRENCY SIGN
+0xA5 0x013D # LATIN CAPITAL LETTER L WITH CARON
+0xA6 0x015A # LATIN CAPITAL LETTER S WITH ACUTE
+0xA7 0x00A7 # SECTION SIGN
+0xA8 0x00A8 # DIAERESIS
+0xA9 0x0160 # LATIN CAPITAL LETTER S WITH CARON
+0xAA 0x015E # LATIN CAPITAL LETTER S WITH CEDILLA
+0xAB 0x0164 # LATIN CAPITAL LETTER T WITH CARON
+0xAC 0x0179 # LATIN CAPITAL LETTER Z WITH ACUTE
+0xAD 0x00AD # SOFT HYPHEN
+0xAE 0x017D # LATIN CAPITAL LETTER Z WITH CARON
+0xAF 0x017B # LATIN CAPITAL LETTER Z WITH DOT ABOVE
+0xB0 0x00B0 # DEGREE SIGN
+0xB1 0x0105 # LATIN SMALL LETTER A WITH OGONEK
+0xB2 0x02DB # OGONEK
+0xB3 0x0142 # LATIN SMALL LETTER L WITH STROKE
+0xB4 0x00B4 # ACUTE ACCENT
+0xB5 0x013E # LATIN SMALL LETTER L WITH CARON
+0xB6 0x015B # LATIN SMALL LETTER S WITH ACUTE
+0xB7 0x02C7 # CARON
+0xB8 0x00B8 # CEDILLA
+0xB9 0x0161 # LATIN SMALL LETTER S WITH CARON
+0xBA 0x015F # LATIN SMALL LETTER S WITH CEDILLA
+0xBB 0x0165 # LATIN SMALL LETTER T WITH CARON
+0xBC 0x017A # LATIN SMALL LETTER Z WITH ACUTE
+0xBD 0x02DD # DOUBLE ACUTE ACCENT
+0xBE 0x017E # LATIN SMALL LETTER Z WITH CARON
+0xBF 0x017C # LATIN SMALL LETTER Z WITH DOT ABOVE
+0xC0 0x0154 # LATIN CAPITAL LETTER R WITH ACUTE
+0xC1 0x00C1 # LATIN CAPITAL LETTER A WITH ACUTE
+0xC2 0x00C2 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+0xC3 0x0102 # LATIN CAPITAL LETTER A WITH BREVE
+0xC4 0x00C4 # LATIN CAPITAL LETTER A WITH DIAERESIS
+0xC5 0x0139 # LATIN CAPITAL LETTER L WITH ACUTE
+0xC6 0x0106 # LATIN CAPITAL LETTER C WITH ACUTE
+0xC7 0x00C7 # LATIN CAPITAL LETTER C WITH CEDILLA
+0xC8 0x010C # LATIN CAPITAL LETTER C WITH CARON
+0xC9 0x00C9 # LATIN CAPITAL LETTER E WITH ACUTE
+0xCA 0x0118 # LATIN CAPITAL LETTER E WITH OGONEK
+0xCB 0x00CB # LATIN CAPITAL LETTER E WITH DIAERESIS
+0xCC 0x011A # LATIN CAPITAL LETTER E WITH CARON
+0xCD 0x00CD # LATIN CAPITAL LETTER I WITH ACUTE
+0xCE 0x00CE # LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+0xCF 0x010E # LATIN CAPITAL LETTER D WITH CARON
+0xD0 0x0110 # LATIN CAPITAL LETTER D WITH STROKE
+0xD1 0x0143 # LATIN CAPITAL LETTER N WITH ACUTE
+0xD2 0x0147 # LATIN CAPITAL LETTER N WITH CARON
+0xD3 0x00D3 # LATIN CAPITAL LETTER O WITH ACUTE
+0xD4 0x00D4 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+0xD5 0x0150 # LATIN CAPITAL LETTER O WITH DOUBLE ACUTE
+0xD6 0x00D6 # LATIN CAPITAL LETTER O WITH DIAERESIS
+0xD7 0x00D7 # MULTIPLICATION SIGN
+0xD8 0x0158 # LATIN CAPITAL LETTER R WITH CARON
+0xD9 0x016E # LATIN CAPITAL LETTER U WITH RING ABOVE
+0xDA 0x00DA # LATIN CAPITAL LETTER U WITH ACUTE
+0xDB 0x0170 # LATIN CAPITAL LETTER U WITH DOUBLE ACUTE
+0xDC 0x00DC # LATIN CAPITAL LETTER U WITH DIAERESIS
+0xDD 0x00DD # LATIN CAPITAL LETTER Y WITH ACUTE
+0xDE 0x0162 # LATIN CAPITAL LETTER T WITH CEDILLA
+0xDF 0x00DF # LATIN SMALL LETTER SHARP S
+0xE0 0x0155 # LATIN SMALL LETTER R WITH ACUTE
+0xE1 0x00E1 # LATIN SMALL LETTER A WITH ACUTE
+0xE2 0x00E2 # LATIN SMALL LETTER A WITH CIRCUMFLEX
+0xE3 0x0103 # LATIN SMALL LETTER A WITH BREVE
+0xE4 0x00E4 # LATIN SMALL LETTER A WITH DIAERESIS
+0xE5 0x013A # LATIN SMALL LETTER L WITH ACUTE
+0xE6 0x0107 # LATIN SMALL LETTER C WITH ACUTE
+0xE7 0x00E7 # LATIN SMALL LETTER C WITH CEDILLA
+0xE8 0x010D # LATIN SMALL LETTER C WITH CARON
+0xE9 0x00E9 # LATIN SMALL LETTER E WITH ACUTE
+0xEA 0x0119 # LATIN SMALL LETTER E WITH OGONEK
+0xEB 0x00EB # LATIN SMALL LETTER E WITH DIAERESIS
+0xEC 0x011B # LATIN SMALL LETTER E WITH CARON
+0xED 0x00ED # LATIN SMALL LETTER I WITH ACUTE
+0xEE 0x00EE # LATIN SMALL LETTER I WITH CIRCUMFLEX
+0xEF 0x010F # LATIN SMALL LETTER D WITH CARON
+0xF0 0x0111 # LATIN SMALL LETTER D WITH STROKE
+0xF1 0x0144 # LATIN SMALL LETTER N WITH ACUTE
+0xF2 0x0148 # LATIN SMALL LETTER N WITH CARON
+0xF3 0x00F3 # LATIN SMALL LETTER O WITH ACUTE
+0xF4 0x00F4 # LATIN SMALL LETTER O WITH CIRCUMFLEX
+0xF5 0x0151 # LATIN SMALL LETTER O WITH DOUBLE ACUTE
+0xF6 0x00F6 # LATIN SMALL LETTER O WITH DIAERESIS
+0xF7 0x00F7 # DIVISION SIGN
+0xF8 0x0159 # LATIN SMALL LETTER R WITH CARON
+0xF9 0x016F # LATIN SMALL LETTER U WITH RING ABOVE
+0xFA 0x00FA # LATIN SMALL LETTER U WITH ACUTE
+0xFB 0x0171 # LATIN SMALL LETTER U WITH DOUBLE ACUTE
+0xFC 0x00FC # LATIN SMALL LETTER U WITH DIAERESIS
+0xFD 0x00FD # LATIN SMALL LETTER Y WITH ACUTE
+0xFE 0x0163 # LATIN SMALL LETTER T WITH CEDILLA
+0xFF 0x02D9 # DOT ABOVE
diff --git a/externals/figlet/fonts/8859-3.flc b/externals/figlet/fonts/8859-3.flc
new file mode 100644
index 0000000000..9b6ac69dd8
--- /dev/null
+++ b/externals/figlet/fonts/8859-3.flc
@@ -0,0 +1,296 @@
+#
+# Name: ISO/IEC 8859-3:1999 to Unicode
+# Unicode version: 3.0
+# Table version: 1.0
+# Table format: Format A
+# Date: 1999 July 27
+# Authors: Ken Whistler
+#
+# Copyright (c) 1991-1999 Unicode, Inc. All Rights reserved.
+#
+# This file is provided as-is by Unicode, Inc. (The Unicode Consortium).
+# No claims are made as to fitness for any particular purpose. No
+# warranties of any kind are expressed or implied. The recipient
+# agrees to determine applicability of information provided. If this
+# file has been provided on optical media by Unicode, Inc., the sole
+# remedy for any claim will be exchange of defective media within 90
+# days of receipt.
+#
+# Unicode, Inc. hereby grants the right to freely use the information
+# supplied in this file in the creation of products supporting the
+# Unicode Standard, and to make copies of this file in any form for
+# internal or external distribution as long as this notice remains
+# attached.
+#
+# General notes:
+#
+# This table contains the data the Unicode Consortium has on how
+# ISO/IEC 8859-3:1999 characters map into Unicode.
+#
+# Format: Three tab-separated columns
+# Column #1 is the ISO/IEC 8859-3 code (in hex as 0xXX)
+# Column #2 is the Unicode (in hex as 0xXXXX)
+# Column #3 the Unicode name (follows a comment sign, '#')
+#
+# The entries are in ISO/IEC 8859-3 order.
+#
+# Version history
+# 1.0 version updates 0.1 version by adding mappings for all
+# control characters.
+#
+# Updated versions of this file may be found in:
+#
+#
+# Any comments or problems, contact
+# Please note that is an archival address;
+# notices will be checked, but do not expect an immediate response.
+#
+0x00 0x0000 # NULL
+0x01 0x0001 # START OF HEADING
+0x02 0x0002 # START OF TEXT
+0x03 0x0003 # END OF TEXT
+0x04 0x0004 # END OF TRANSMISSION
+0x05 0x0005 # ENQUIRY
+0x06 0x0006 # ACKNOWLEDGE
+0x07 0x0007 # BELL
+0x08 0x0008 # BACKSPACE
+0x09 0x0009 # HORIZONTAL TABULATION
+0x0A 0x000A # LINE FEED
+0x0B 0x000B # VERTICAL TABULATION
+0x0C 0x000C # FORM FEED
+0x0D 0x000D # CARRIAGE RETURN
+0x0E 0x000E # SHIFT OUT
+0x0F 0x000F # SHIFT IN
+0x10 0x0010 # DATA LINK ESCAPE
+0x11 0x0011 # DEVICE CONTROL ONE
+0x12 0x0012 # DEVICE CONTROL TWO
+0x13 0x0013 # DEVICE CONTROL THREE
+0x14 0x0014 # DEVICE CONTROL FOUR
+0x15 0x0015 # NEGATIVE ACKNOWLEDGE
+0x16 0x0016 # SYNCHRONOUS IDLE
+0x17 0x0017 # END OF TRANSMISSION BLOCK
+0x18 0x0018 # CANCEL
+0x19 0x0019 # END OF MEDIUM
+0x1A 0x001A # SUBSTITUTE
+0x1B 0x001B # ESCAPE
+0x1C 0x001C # FILE SEPARATOR
+0x1D 0x001D # GROUP SEPARATOR
+0x1E 0x001E # RECORD SEPARATOR
+0x1F 0x001F # UNIT SEPARATOR
+0x20 0x0020 # SPACE
+0x21 0x0021 # EXCLAMATION MARK
+0x22 0x0022 # QUOTATION MARK
+0x23 0x0023 # NUMBER SIGN
+0x24 0x0024 # DOLLAR SIGN
+0x25 0x0025 # PERCENT SIGN
+0x26 0x0026 # AMPERSAND
+0x27 0x0027 # APOSTROPHE
+0x28 0x0028 # LEFT PARENTHESIS
+0x29 0x0029 # RIGHT PARENTHESIS
+0x2A 0x002A # ASTERISK
+0x2B 0x002B # PLUS SIGN
+0x2C 0x002C # COMMA
+0x2D 0x002D # HYPHEN-MINUS
+0x2E 0x002E # FULL STOP
+0x2F 0x002F # SOLIDUS
+0x30 0x0030 # DIGIT ZERO
+0x31 0x0031 # DIGIT ONE
+0x32 0x0032 # DIGIT TWO
+0x33 0x0033 # DIGIT THREE
+0x34 0x0034 # DIGIT FOUR
+0x35 0x0035 # DIGIT FIVE
+0x36 0x0036 # DIGIT SIX
+0x37 0x0037 # DIGIT SEVEN
+0x38 0x0038 # DIGIT EIGHT
+0x39 0x0039 # DIGIT NINE
+0x3A 0x003A # COLON
+0x3B 0x003B # SEMICOLON
+0x3C 0x003C # LESS-THAN SIGN
+0x3D 0x003D # EQUALS SIGN
+0x3E 0x003E # GREATER-THAN SIGN
+0x3F 0x003F # QUESTION MARK
+0x40 0x0040 # COMMERCIAL AT
+0x41 0x0041 # LATIN CAPITAL LETTER A
+0x42 0x0042 # LATIN CAPITAL LETTER B
+0x43 0x0043 # LATIN CAPITAL LETTER C
+0x44 0x0044 # LATIN CAPITAL LETTER D
+0x45 0x0045 # LATIN CAPITAL LETTER E
+0x46 0x0046 # LATIN CAPITAL LETTER F
+0x47 0x0047 # LATIN CAPITAL LETTER G
+0x48 0x0048 # LATIN CAPITAL LETTER H
+0x49 0x0049 # LATIN CAPITAL LETTER I
+0x4A 0x004A # LATIN CAPITAL LETTER J
+0x4B 0x004B # LATIN CAPITAL LETTER K
+0x4C 0x004C # LATIN CAPITAL LETTER L
+0x4D 0x004D # LATIN CAPITAL LETTER M
+0x4E 0x004E # LATIN CAPITAL LETTER N
+0x4F 0x004F # LATIN CAPITAL LETTER O
+0x50 0x0050 # LATIN CAPITAL LETTER P
+0x51 0x0051 # LATIN CAPITAL LETTER Q
+0x52 0x0052 # LATIN CAPITAL LETTER R
+0x53 0x0053 # LATIN CAPITAL LETTER S
+0x54 0x0054 # LATIN CAPITAL LETTER T
+0x55 0x0055 # LATIN CAPITAL LETTER U
+0x56 0x0056 # LATIN CAPITAL LETTER V
+0x57 0x0057 # LATIN CAPITAL LETTER W
+0x58 0x0058 # LATIN CAPITAL LETTER X
+0x59 0x0059 # LATIN CAPITAL LETTER Y
+0x5A 0x005A # LATIN CAPITAL LETTER Z
+0x5B 0x005B # LEFT SQUARE BRACKET
+0x5C 0x005C # REVERSE SOLIDUS
+0x5D 0x005D # RIGHT SQUARE BRACKET
+0x5E 0x005E # CIRCUMFLEX ACCENT
+0x5F 0x005F # LOW LINE
+0x60 0x0060 # GRAVE ACCENT
+0x61 0x0061 # LATIN SMALL LETTER A
+0x62 0x0062 # LATIN SMALL LETTER B
+0x63 0x0063 # LATIN SMALL LETTER C
+0x64 0x0064 # LATIN SMALL LETTER D
+0x65 0x0065 # LATIN SMALL LETTER E
+0x66 0x0066 # LATIN SMALL LETTER F
+0x67 0x0067 # LATIN SMALL LETTER G
+0x68 0x0068 # LATIN SMALL LETTER H
+0x69 0x0069 # LATIN SMALL LETTER I
+0x6A 0x006A # LATIN SMALL LETTER J
+0x6B 0x006B # LATIN SMALL LETTER K
+0x6C 0x006C # LATIN SMALL LETTER L
+0x6D 0x006D # LATIN SMALL LETTER M
+0x6E 0x006E # LATIN SMALL LETTER N
+0x6F 0x006F # LATIN SMALL LETTER O
+0x70 0x0070 # LATIN SMALL LETTER P
+0x71 0x0071 # LATIN SMALL LETTER Q
+0x72 0x0072 # LATIN SMALL LETTER R
+0x73 0x0073 # LATIN SMALL LETTER S
+0x74 0x0074 # LATIN SMALL LETTER T
+0x75 0x0075 # LATIN SMALL LETTER U
+0x76 0x0076 # LATIN SMALL LETTER V
+0x77 0x0077 # LATIN SMALL LETTER W
+0x78 0x0078 # LATIN SMALL LETTER X
+0x79 0x0079 # LATIN SMALL LETTER Y
+0x7A 0x007A # LATIN SMALL LETTER Z
+0x7B 0x007B # LEFT CURLY BRACKET
+0x7C 0x007C # VERTICAL LINE
+0x7D 0x007D # RIGHT CURLY BRACKET
+0x7E 0x007E # TILDE
+0x7F 0x007F # DELETE
+0x80 0x0080 #
+0x81 0x0081 #
+0x82 0x0082 #
+0x83 0x0083 #
+0x84 0x0084 #
+0x85 0x0085 #
+0x86 0x0086 #
+0x87 0x0087 #
+0x88 0x0088 #
+0x89 0x0089 #
+0x8A 0x008A #
+0x8B 0x008B #
+0x8C 0x008C #
+0x8D 0x008D #
+0x8E 0x008E #
+0x8F 0x008F #
+0x90 0x0090 #
+0x91 0x0091 #
+0x92 0x0092 #
+0x93 0x0093 #
+0x94 0x0094 #
+0x95 0x0095 #
+0x96 0x0096 #
+0x97 0x0097 #
+0x98 0x0098 #
+0x99 0x0099 #
+0x9A 0x009A #
+0x9B 0x009B #
+0x9C 0x009C #
+0x9D 0x009D #
+0x9E 0x009E #
+0x9F 0x009F #