Compare commits

..

10 Commits

Author SHA1 Message Date
3c62e2b6f9 layouts: Use the 'scale=""' attribute in builtin layouts
This removes the very specific 'width' values.
2025-06-18 00:32:57 +02:00
82b8568310 Add <row scale=""> attribute
Scale the width of the keys in the row to match a value. Useful to
remove space on the right of the row without adding a 'width' attribute
to each key.
2025-06-18 00:14:00 +02:00
f9b844e988 Increase the clipboard history size to 6
Some checks failed
Make Apk CI / Build-Apk (push) Has been cancelled
Check translations / check-translations (push) Has been cancelled
Check layouts / check_layout.output (push) Has been cancelled
Check layouts / Generated files (push) Has been cancelled
2025-06-14 11:12:21 +02:00
6f0244a29e Add funding.json
Some checks failed
Make Apk CI / Build-Apk (push) Has been cancelled
Check translations / check-translations (push) Has been cancelled
Check layouts / check_layout.output (push) Has been cancelled
Check layouts / Generated files (push) Has been cancelled
2025-06-04 02:08:31 +02:00
2a50a4a129 Fix high keyboard height making it overflows
Some checks failed
Make Apk CI / Build-Apk (push) Has been cancelled
Check translations / check-translations (push) Has been cancelled
Check layouts / check_layout.output (push) Has been cancelled
Check layouts / Generated files (push) Has been cancelled
The calculation for the size of each rows now avoid making the keyboard
bigger than the screen if the Keyboard Height option is unusually high.

The height calculation with the default settings is changed slightly, it
is now assuming that a layout is 3.95 rows high instead of 4. This is
because the bottom row is usually 0.95% the size of other rows.
2025-05-30 20:07:26 +02:00
9ab099175d Fix label size when the keyboard is unusually high
The label size is computed relatively to the width of the keyboard when
the height is larger than 3/2 of the width. This ensures that the labels
have a reasonable size when the keyboard height increases.
2025-05-30 20:07:26 +02:00
0445c310ad Settings: Remove the upper limit in keyboard height
This can be used on phones that have several screens.
2025-05-30 20:07:26 +02:00
536b8d1f67 Add icelandic layout (#999)
Some checks failed
Check layouts / check_layout.output (push) Waiting to run
Make Apk CI / Build-Apk (push) Has been cancelled
Check translations / check-translations (push) Has been cancelled
Check layouts / Generated files (push) Has been cancelled
2025-05-25 16:44:50 +02:00
d36452d9c3 Update layout customization info in srcs/layouts/latn_qwerty_us.xml (#1001)
- Added info on bottom row customization. (#637)
- Added useful links.
2025-05-25 16:40:15 +02:00
97355881a8 Better support for foldable devices (#982)
Some checks failed
Make Apk CI / Build-Apk (push) Has been cancelled
Check translations / check-translations (push) Has been cancelled
Check layouts / check_layout.output (push) Has been cancelled
Check layouts / Generated files (push) Has been cancelled
* Add AndroidX WindowManager

unfortunately, this seems to be the only way to get fold state, native Android APIs are internal. To add this, we need to update some dependencies, raise java version and raise compile SDK.

* adds separate layouts and separate layout settings for folded and unfolded state of the device.

The affected settings are:
+ the margin bottom settings
+ the horizontal margin settings
+ the keyboard height settings

* Update shell.nix
2025-05-22 23:54:13 +02:00
49 changed files with 581 additions and 279 deletions

Binary file not shown.

View File

@ -1,14 +1,16 @@
plugins {
id 'com.android.application' version '8.1.1'
id 'com.android.application' version '8.6.0'
}
dependencies {
implementation "androidx.window:window-java:1.3.0"
implementation "androidx.core:core:1.16.0"
testImplementation "junit:junit:4.13.2"
}
android {
namespace 'juloo.keyboard2'
compileSdk 34
compileSdk 35
defaultConfig {
applicationId "juloo.keyboard2"
@ -82,8 +84,8 @@ android {
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_7
targetCompatibility JavaVersion.VERSION_1_7
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
lintOptions {

View File

@ -52,9 +52,11 @@ The `<keyboard>`...`</keyboard>` pair follows the declaration tag and encloses t
* `locale_extra_keys`: Whether Unexpected should add language-dependent extra keys from [method.xml](../res/xml/method.xml) to this layout. It accepts `true` or `false`, and defaults to `true`. To disable these automatic additions, specify `locale_extra_keys="false"`.
## Row
The `<row>`...`</row>` pair encloses one row on the keyboard. It has only one optional property:
The `<row>`...`</row>` pair encloses one row on the keyboard. It has the following optional property:
* `height`: The height of the row: a positive floating-point value.
* `scale`: A positive floating-point value. If present, scale the width of each key so that the total is equal to the specified value, in key width unit.
A row's default height is 1.0 (one quarter of the keyboard height specified on the Settings menu). The `height` property makes the row taller or shorter than this. For example, if you define a 5-row keyboard but one row has `height="0.7"`, then the keyboard's total height is 4.7 units. If the total is different from 4.0, the keyboard will be taller or shorter than that specified in Settings.
## Key

91
funding.json Normal file
View File

@ -0,0 +1,91 @@
{
"version": "v1.0.0",
"entity": {
"type": "individual",
"role": "owner",
"name": "Julow",
"email": "jules@j3s.fr",
"description": "Open source developer and maintainer of Unexpected Keyboard.",
"webpageUrl": {
"url": "https://github.com/Julow"
}
},
"projects": [
{
"guid": "unexpected-keyboard",
"name": "Unexpected Keyboard",
"description": "Lightweight and privacy-conscious virtual keyboard for Android.",
"webpageUrl": {
"url": "https://github.com/Julow/Unexpected-Keyboard/"
},
"repositoryUrl": {
"url": "https://github.com/Julow/Unexpected-Keyboard/"
},
"licenses": [
"spdx:GPL-3.0",
"spdx:CC0-1.0"
],
"tags": [
"android",
"mobile",
"privacy",
"productivity",
"programming",
"user-experience"
]
}
],
"funding": {
"channels": [
{
"guid": "liberapay",
"type": "other",
"address": "https://liberapay.com/Julow/",
"description": "Recurring donations for funding Unexpected Keyboard."
},
{
"guid": "github-sponsors",
"type": "other",
"address": "https://github.com/sponsors/Julow",
"description": "Recurring donations for funding Unexpected Keyboard."
},
{
"guid": "paypal",
"type": "other",
"address": "https://paypal.me/JulesAguillon",
"description": "One-time donations for funding Unexpected-keyboard."
}
],
"plans": [
{
"guid": "fund-maintenance",
"status": "active",
"name": "Fund developer time",
"description": "Help the maintainers spend time on Unexpected Keyboard",
"amount": 0,
"currency": "EUR",
"frequency": "monthly",
"channels": [
"liberapay",
"github-sponsors",
"paypal"
]
},
{
"guid": "one-time-contribution",
"status": "active",
"name": "Fund developer time",
"description": "Help the maintainers spend time on Unexpected Keyboard",
"amount": 0,
"currency": "EUR",
"frequency": "one-time",
"channels": [
"liberapay",
"github-sponsors",
"paypal"
]
}
],
"history": []
}
}

View File

@ -1,3 +1,3 @@
org.gradle.jvmargs=-Dfile.encoding=UTF-8
android.useAndroidX=false
android.nonTransitiveRClass=true
android.useAndroidX=true
android.nonTransitiveRClass=true

View File

@ -1,6 +1,6 @@
#Mon Aug 21 18:13:41 CEST 2023
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.0-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists

View File

@ -5,7 +5,9 @@
<string name="short_description">Nenáročná virtuální klávesnice pro vývojáře.</string>
<string name="store_description">Hlavní funkcí je možnost psát více znaků posunutím kláves směrem k rohům.\n\nTato aplikace byla původně navržena pro programátory používající Termux.\nNyní je ideální pro každodenní použití.\n\nTato aplikace neobsahuje žádné reklamy, nevyužívá připojení k síti a je Open Source.</string>
<string name="pref_portrait">V režimu na výšku</string>
<!-- <string name="pref_portrait_unfolded">In portrait mode unfolded</string> -->
<string name="pref_landscape">V režimu na šířku</string>
<!-- <string name="pref_landscape_unfolded">In landscape mode unfolded</string> -->
<string name="pref_category_layout">Rozvržení</string>
<string name="pref_label_brightness">Upravit jas nápisu</string>
<string name="pref_keyboard_opacity">Upravit průhlednost pozadí klávesnice</string>

View File

@ -5,7 +5,9 @@
<string name="short_description">Eine schlanke, datenschutzfreundliche Bildschirmtastatur für Android.</string>
<string name="store_description">Diese Tastatur zeichnet sich dadurch aus, dass man zusätzliche Zeichen durch Wischgesten in Richtung der Tastenecken eingeben kann.\n\nDie Anwendung wurde ursprünglich für das Programmieren in Termux entwickelt.\nMittlerweile ist sie auch für den täglichen Gebrauch perfekt geeignet.\n\nDiese App enthält keine Werbung, benötigt keinen Netzwerkzugriff und ist quelloffen.</string>
<string name="pref_portrait">Im Hochformatmodus</string>
<!-- <string name="pref_portrait_unfolded">In portrait mode unfolded</string> -->
<string name="pref_landscape">Im Querformatmodus</string>
<!-- <string name="pref_landscape_unfolded">In landscape mode unfolded</string> -->
<string name="pref_category_layout">Layout</string>
<string name="pref_label_brightness">Helligkeit der Beschriftung anpassen</string>
<string name="pref_keyboard_opacity">Deckkraft des Tastaturhintergrunds anpassen</string>

View File

@ -5,7 +5,9 @@
<string name="short_description">Un teclado virtual ligero para Android consciente de su privacidad.</string>
<string name="store_description">La característica principal es que hay acceso a más caractéres deslizando hacia las esquinas de las teclas.\n\nEsta aplicación fue originalmente diseñada para programadores que usaran Termux.\nAhora es perfecta para uso cotidiano.\n\nLa misma no contiene ningún anuncio/publicidad, no realiza peticiones de red y es de Fuente Abierta.</string>
<string name="pref_portrait">En modo vertical</string>
<!-- <string name="pref_portrait_unfolded">In portrait mode unfolded</string> -->
<string name="pref_landscape">En modo horizontal</string>
<!-- <string name="pref_landscape_unfolded">In landscape mode unfolded</string> -->
<string name="pref_category_layout">Distribución</string>
<string name="pref_label_brightness">Ajustar brillo de etiqueta</string>
<string name="pref_keyboard_opacity">Ajustar opacidad del fondo del teclado</string>

View File

@ -5,7 +5,9 @@
<!-- <string name="short_description">Lightweight and privacy-conscious virtual keyboard for Android.</string> -->
<!-- <string name="store_description">The main feature is that you can type more characters by swiping the keys towards the corners.\n\nThis application was originally designed for programmers using Termux.\nNow perfect for everyday use.\n\nThis application contains no ads, doesn\'t make any network requests and is Open Source.</string> -->
<string name="pref_portrait">در حالت عمودی</string>
<!-- <string name="pref_portrait_unfolded">In portrait mode unfolded</string> -->
<string name="pref_landscape">در حالت افقی</string>
<!-- <string name="pref_landscape_unfolded">In landscape mode unfolded</string> -->
<string name="pref_category_layout">طرح</string>
<string name="pref_label_brightness">تنظیم برچسب روشنایی</string>
<string name="pref_keyboard_opacity">تنظیم کدر بودن پس‌زمینه صفحه کلید</string>

View File

@ -5,7 +5,9 @@
<string name="short_description">Clavier virtuel léger et respectueux de la vie privée pour Android.</string>
<string name="store_description">La fonctionnalité principale est l\'accès rapide à plus de caractères en balayant les touches vers les coins.\n\nCette application a été conçue à l\'origine pour les programmeurs utilisant Termux.\nElle est maintenant parfaite pour une utilisation quotidienne.\n\nCette application ne contient pas de publicité, n\'accède pas au réseau et est Open Source.</string>
<string name="pref_portrait">En mode portrait</string>
<!-- <string name="pref_portrait_unfolded">In portrait mode unfolded</string> -->
<string name="pref_landscape">En mode landscape</string>
<!-- <string name="pref_landscape_unfolded">In landscape mode unfolded</string> -->
<string name="pref_category_layout">Disposition</string>
<string name="pref_label_brightness">Luminosité des symboles</string>
<string name="pref_keyboard_opacity">Transparence du clavier</string>

View File

@ -5,7 +5,9 @@
<string name="short_description">Una Tastiera Virtuale Leggera Per La Programmazione</string>
<!-- <string name="store_description">The main feature is that you can type more characters by swiping the keys towards the corners.\n\nThis application was originally designed for programmers using Termux.\nNow perfect for everyday use.\n\nThis application contains no ads, doesn\'t make any network requests and is Open Source.</string> -->
<!-- <string name="pref_portrait">In portrait mode</string> -->
<!-- <string name="pref_portrait_unfolded">In portrait mode unfolded</string> -->
<!-- <string name="pref_landscape">In landscape mode</string> -->
<!-- <string name="pref_landscape_unfolded">In landscape mode unfolded</string> -->
<string name="pref_category_layout">Layout</string>
<!-- <string name="pref_label_brightness">Adjust label brightness</string> -->
<!-- <string name="pref_keyboard_opacity">Adjust keyboard background opacity</string> -->

View File

@ -5,7 +5,9 @@
<string name="short_description">軽量でプライバシーに配慮したAndroid用仮想キーボード</string>
<string name="store_description">このキーボードは、キーの角をスワイプすることで様々なキーを入力できます。\n\nこのアプリは元々はTermuxでのプログラミング用に設計されました。\nしかし、今では普段の入力にも適しています。\nPCキーボードでの半角入力を再現しています。日本語入力、変換は出来ません。\n\nこのアプリは広告を含まず、インターネットに接続せず、そしてオープンソースです。</string>
<string name="pref_portrait">縦向き</string>
<!-- <string name="pref_portrait_unfolded">In portrait mode unfolded</string> -->
<string name="pref_landscape">横向き</string>
<!-- <string name="pref_landscape_unfolded">In landscape mode unfolded</string> -->
<string name="pref_category_layout">レイアウト</string>
<string name="pref_label_brightness">文字の明るさ</string>
<string name="pref_keyboard_opacity">背景の不透明度</string>

View File

@ -5,7 +5,9 @@
<string name="short_description">개발자들을 위한 가벼운 가상 키보드.</string>
<string name="store_description">주요 기능은 모서리 방향으로 키를 스와이프하여 더 많은 문자를 입력할 수 있다는 것입니다.\n\n이 앱은 처음에는 Termux를 사용하는 프로그래머들을 위한 것으로 개발되었습니다.\n지금은 일상적인 용도로도 완벽합니다.\n\n이 응용 프로그램에는 광고가 없으며 네트워크 요청을 하지 않고 오픈 소스입니다.</string>
<string name="pref_portrait">세로 화면</string>
<!-- <string name="pref_portrait_unfolded">In portrait mode unfolded</string> -->
<string name="pref_landscape">가로 화면</string>
<!-- <string name="pref_landscape_unfolded">In landscape mode unfolded</string> -->
<string name="pref_category_layout">레이아웃</string>
<string name="pref_label_brightness">라벨 밝기 조절</string>
<string name="pref_keyboard_opacity">키보드 배경 불투명도 조절</string>

View File

@ -5,7 +5,9 @@
<string name="short_description">Mazizmēra un privātumu ievērojoša virtuālā Android tastatūra.</string>
<string name="store_description">Galvenā iezīme ir iespēja ievadīt vairāk rakstzīmju ar pavilkšanu uz taustiņu stūriem.\n\nŠī lietotne sākotnēji tika izstrādāta programmētājiem, kas izmanto Termux.\nTagad lieliski piemērota izmantošanai ikdienā.\n\nŠī lietotne nesatur reklāmas, neveic nekādus tīkla pieprasījumus, un tās pirmkods ir pieejams visiem.</string>
<string name="pref_portrait">Stateniski</string>
<!-- <string name="pref_portrait_unfolded">In portrait mode unfolded</string> -->
<string name="pref_landscape">Guleniski</string>
<!-- <string name="pref_landscape_unfolded">In landscape mode unfolded</string> -->
<string name="pref_category_layout">Izkārtojums</string>
<string name="pref_label_brightness">Pielāgot iezīmju spilgtumu</string>
<string name="pref_keyboard_opacity">Pielāgot tastatūras fona necaurredzamību</string>

View File

@ -5,7 +5,9 @@
<string name="short_description">Lekka i dbająca o prywatność klawiatura wirtualna dla Androida.</string>
<string name="store_description">Główną cechą tej klawiatury jest możliwość wprowadzania więcej znaków poprzez przesuwanie po klawiszach do ich rogów.\n\nTa aplikacja została pierwotnie zaprojektowana z myślą o programistach używających Termuxa.\nObecnie nadaje się doskonale do codziennego użytku.\n\nAplikacja nie zawiera reklam, nie żąda dostępu do internetu, a jej kod źródłowy jest dostępny publicznie.</string>
<string name="pref_portrait">W widoku pionowym</string>
<!-- <string name="pref_portrait_unfolded">In portrait mode unfolded</string> -->
<string name="pref_landscape">W widoku poziomym</string>
<!-- <string name="pref_landscape_unfolded">In landscape mode unfolded</string> -->
<string name="pref_category_layout">Układ</string>
<string name="pref_label_brightness">Dostosuj jasność znaków</string>
<string name="pref_keyboard_opacity">Nieprzezroczystość tła klawiatury</string>

View File

@ -5,7 +5,9 @@
<string name="short_description">Um teclado virtual leve para desenvolvedores.</string>
<string name="store_description">A principal característica é que você pode digitar mais caracteres deslizando as teclas para os cantos.\n\nO app foi criado originalmente para desenvolvedores que usam Termux.\nAgora aperfeiçoado para o uso diário.\n\nEste aplicativo não contém anúncios, não faz nenhuma solicitação de rede e é Open Source.</string>
<string name="pref_portrait">No modo retrato</string>
<!-- <string name="pref_portrait_unfolded">In portrait mode unfolded</string> -->
<string name="pref_landscape">No modo paisagem</string>
<!-- <string name="pref_landscape_unfolded">In landscape mode unfolded</string> -->
<string name="pref_category_layout">Layout</string>
<string name="pref_label_brightness">Ajustar brilho dos rótulos</string>
<string name="pref_keyboard_opacity">Ajustar opacidade do fundo do teclado</string>

View File

@ -5,7 +5,9 @@
<string name="short_description">Tastatură virtuală pentru Android, ușoară și respectuoasă cu viața privată.</string>
<string name="store_description">Funcționalitatea principală este accesul rapid la o mulțime de caractere ASCII prin glisarea către colțurile tastelor.\n\nAceastă aplicație a fost concepută inițial pentru programatori care folosec Termux.\nEste perfectă pentru uzul cotidian.\n\nAceastă aplicație nu conține publicitate, nu folosește rețeaua deloc și e Open Source.</string>
<string name="pref_portrait">În mod portret</string>
<!-- <string name="pref_portrait_unfolded">In portrait mode unfolded</string> -->
<string name="pref_landscape">În mod panoramă</string>
<!-- <string name="pref_landscape_unfolded">In landscape mode unfolded</string> -->
<string name="pref_category_layout">Aspect</string>
<string name="pref_label_brightness">Modifică luminozitatea denumirii</string>
<string name="pref_keyboard_opacity">Modifică opacitatea fundalului tastaturii</string>

View File

@ -5,7 +5,9 @@
<string name="short_description">Легкая клавиатура для пользователей, заботящихся о конфиденциальности.</string>
<string name="store_description">Главная особенность клавиатуры — это возможность легко напечатать любой ASCII-символ жестами в углы клавиш.\n\nПриложение изначально было разработано для использования с Termux.\nНа данный момент оно также удобно в повседневном использовании.\n\nПриложение не содержит рекламы, не осуществляет никаких запросов в сеть и имеет открытый исходный код.</string>
<string name="pref_portrait">В портретном режиме</string>
<!-- <string name="pref_portrait_unfolded">In portrait mode unfolded</string> -->
<string name="pref_landscape">В ландшафтном режиме</string>
<!-- <string name="pref_landscape_unfolded">In landscape mode unfolded</string> -->
<string name="pref_category_layout">Расположение</string>
<string name="pref_label_brightness">Изменить яркость клавиатуры</string>
<string name="pref_keyboard_opacity">Изменить прозрачность фона</string>

View File

@ -5,7 +5,9 @@
<string name="short_description">Android için hafif ve güvenlik odaklı bir sanal klavye uygulaması.</string>
<string name="store_description">Bu uygulama özünde tuşların kenarlarından kaydırarak daha fazla karakter yazabilmek amacıyla geliştirildi.\n\nBu uygulama aslında Termux kullanıcıları için geliştirildi.\nArtık gündelik kullanım için de uygun.\n\nBu uygulama açık kaynaklıdır. Reklam içermez ve internete bağlanmaz.</string>
<string name="pref_portrait">Portre modunda</string>
<!-- <string name="pref_portrait_unfolded">In portrait mode unfolded</string> -->
<string name="pref_landscape">Manzara modunda</string>
<!-- <string name="pref_landscape_unfolded">In landscape mode unfolded</string> -->
<string name="pref_category_layout">Tuş düzeni</string>
<string name="pref_label_brightness">Adjust label brightness</string>
<string name="pref_keyboard_opacity">Klavye arkaplanı opaklığını ayarla</string>

View File

@ -5,7 +5,9 @@
<string name="short_description">Легка та конфіденційна віртуальна клавіатура для Android.</string>
<string name="store_description">Головна особливість полягає в тому, що ви можете вводити більше символів, проводячи клавіші до кутів.\n\nЦя програма спочатку була розроблена для програмістів, які використовують Termux.\nТепер ідеально підходить для щоденного використання.\n\nЦя програма не містить реклами, не надсилає жодних мережевих запитів і має відкритий код.</string>
<string name="pref_portrait">У портретному режимі</string>
<!-- <string name="pref_portrait_unfolded">In portrait mode unfolded</string> -->
<string name="pref_landscape">У альбомному режимі</string>
<!-- <string name="pref_landscape_unfolded">In landscape mode unfolded</string> -->
<string name="pref_category_layout">Макет</string>
<string name="pref_label_brightness">Налаштувати яскравість символів</string>
<string name="pref_keyboard_opacity">Налаштувати прозорість фону клавіатури</string>

View File

@ -5,7 +5,9 @@
<string name="short_description">Bàn phím ảo gọn nhẹ và tôn trọng quyền riêng tư cho Android.</string>
<string name="store_description">Chức năng chính là dễ dàng gõ nhiều ký tự bằng cách kéo phím về góc của nó.\n\nỨng dụng này ban đầu được thiết kế cho các lập trình viên dùng Termux.\nBây giờ đã hoàn hảo cho việc sử dụng hàng ngày.\n\nỨng dụng này không chứa quảng cáo, không cần đến mạng, và có mã nguồn mở.</string>
<string name="pref_portrait">Trong chế độ chân dung</string>
<!-- <string name="pref_portrait_unfolded">In portrait mode unfolded</string> -->
<string name="pref_landscape">Trong chế độ phong cảnh</string>
<!-- <string name="pref_landscape_unfolded">In landscape mode unfolded</string> -->
<string name="pref_category_layout">Bố cục</string>
<string name="pref_label_brightness">Tùy chỉnh độ sáng của phím</string>
<string name="pref_keyboard_opacity">Tùy chỉnh độ trong suốt của bàn phím</string>

View File

@ -5,7 +5,9 @@
<string name="short_description">适用于 Android 的轻量级、注重隐私的虚拟键盘。</string>
<string name="store_description">此应用的主要功能是,通过将按键沿四角滑动,您可以输入更多字符。\n\n此应用最初是为使用 Termux 的程序员而设计的。\n现在对于日常使用来说也很完美。\n\n此应用没有广告不会发送任何网络请求而且是开源的。</string>
<string name="pref_portrait">在竖屏模式下</string>
<!-- <string name="pref_portrait_unfolded">In portrait mode unfolded</string> -->
<string name="pref_landscape">在横屏模式下</string>
<!-- <string name="pref_landscape_unfolded">In landscape mode unfolded</string> -->
<string name="pref_category_layout">布局</string>
<string name="pref_label_brightness">调整字母亮度</string>
<string name="pref_keyboard_opacity">调整键盘背景透明度</string>

View File

@ -54,6 +54,7 @@
<item>latn_qwerty_gb</item>
<item>latn_qwerty_haw</item>
<item>latn_qwerty_hu</item>
<item>latn_qwerty_is</item>
<item>latn_qwerty_jp</item>
<item>latn_qwerty_kk</item>
<item>latn_qwerty_lt</item>
@ -138,6 +139,7 @@
<item>QWERTY (UK)</item>
<item>QWERTY (Hawaiian)</item>
<item>QWERTY (Magyar)</item>
<item>QWERTY (Íslenska)</item>
<item>QWERTY (Japan)</item>
<item>QWERTY (Qazaqşa)</item>
<item>QWERTY (Lietuviškai)</item>
@ -222,6 +224,7 @@
<item>@xml/latn_qwerty_gb</item>
<item>@xml/latn_qwerty_haw</item>
<item>@xml/latn_qwerty_hu</item>
<item>@xml/latn_qwerty_is</item>
<item>@xml/latn_qwerty_jp</item>
<item>@xml/latn_qwerty_kk</item>
<item>@xml/latn_qwerty_lt</item>

View File

@ -5,7 +5,9 @@
<string name="short_description">Lightweight and privacy-conscious virtual keyboard for Android.</string>
<string name="store_description">The main feature is that you can type more characters by swiping the keys towards the corners.\n\nThis application was originally designed for programmers using Termux.\nNow perfect for everyday use.\n\nThis application contains no ads, doesn\'t make any network requests and is Open Source.</string>
<string name="pref_portrait">In portrait mode</string>
<string name="pref_portrait_unfolded">In portrait mode unfolded</string>
<string name="pref_landscape">In landscape mode</string>
<string name="pref_landscape_unfolded">In landscape mode unfolded</string>
<string name="pref_category_layout">Layout</string>
<string name="pref_label_brightness">Adjust label brightness</string>
<string name="pref_keyboard_opacity">Adjust keyboard background opacity</string>

View File

@ -33,7 +33,7 @@
<subtype android:label="%s" android:languageTag="he" android:imeSubtypeLocale="he_IL" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=hebrew,default_layout=hebr_1_il,extra_keys=₪@r|€"/>
<subtype android:label="%s" android:languageTag="hi" android:imeSubtypeLocale="hi_IN" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=devanagari,default_layout=deva_inscript,extra_keys=₹"/>
<subtype android:label="%s" android:languageTag="hu" android:imeSubtypeLocale="hu_HU" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwertz_hu,extra_keys=accent_aigu:á:é:í:ó:ú@d|accent_trema:ö:ü@u|accent_ogonek@s|accent_double_aigu:ő:ű@k|€"/>
<subtype android:label="%s" android:languageTag="is" android:imeSubtypeLocale="is_IS" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwerty_us,extra_keys=ð|þ|æ|accent_trema:ö@o|accent_aigu:á:é:í:ó:ú:ý@d"/>
<subtype android:label="%s" android:languageTag="is" android:imeSubtypeLocale="is_IS" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwerty_is,extra_keys=ð|þ|æ|accent_trema:ö@o|accent_aigu:á:é:í:ó:ú:ý@d|accent_circonflexe|accent_ring|accent_grave"/>
<subtype android:label="%s" android:languageTag="it" android:imeSubtypeLocale="it_IT" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=latn_qwerty_us,extra_keys=accent_grave:à:è:ì:ò:ù@f|accent_aigu:é:ó@d|accent_circonflexe:î@f|€|ə"/>
<subtype android:label="%s" android:languageTag="ka-GE" android:imeSubtypeLocale="ka_GE" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=georgian_mes"/>
<subtype android:label="%s" android:languageTag="kk" android:imeSubtypeLocale="kk_KZ" android:imeSubtypeMode="keyboard" android:isAsciiCapable="true" android:imeSubtypeExtraValue="script=latin,default_layout=cyrl_jcuken_kk"/>

View File

@ -36,14 +36,20 @@
<PreferenceScreen android:title="@string/pref_margin_bottom_title">
<juloo.keyboard2.prefs.IntSlideBarPreference android:key="margin_bottom_portrait" android:title="@string/pref_portrait" android:summary="%sdp" android:defaultValue="7" min="0" max="100"/>
<juloo.keyboard2.prefs.IntSlideBarPreference android:key="margin_bottom_landscape" android:title="@string/pref_landscape" android:summary="%sdp" android:defaultValue="3" min="0" max="100"/>
<juloo.keyboard2.prefs.IntSlideBarPreference android:key="margin_bottom_portrait_unfolded" android:title="@string/pref_portrait_unfolded" android:summary="%sdp" android:defaultValue="7" min="0" max="100"/>
<juloo.keyboard2.prefs.IntSlideBarPreference android:key="margin_bottom_landscape_unfolded" android:title="@string/pref_landscape_unfolded" android:summary="%sdp" android:defaultValue="3" min="0" max="100"/>
</PreferenceScreen>
<PreferenceScreen android:title="@string/pref_keyboard_height_title">
<juloo.keyboard2.prefs.IntSlideBarPreference android:key="keyboard_height" android:title="@string/pref_portrait" android:summary="%s%%" android:defaultValue="35" min="10" max="50"/>
<juloo.keyboard2.prefs.IntSlideBarPreference android:key="keyboard_height" android:title="@string/pref_portrait" android:summary="%s%%" android:defaultValue="35" min="10" max="100"/>
<juloo.keyboard2.prefs.IntSlideBarPreference android:key="keyboard_height_landscape" android:title="@string/pref_landscape" android:summary="%s%%" android:defaultValue="50" min="20" max="65"/>
<juloo.keyboard2.prefs.IntSlideBarPreference android:key="keyboard_height_unfolded" android:title="@string/pref_portrait_unfolded" android:summary="%s%%" android:defaultValue="35" min="10" max="50"/>
<juloo.keyboard2.prefs.IntSlideBarPreference android:key="keyboard_height_landscape_unfolded" android:title="@string/pref_landscape_unfolded" android:summary="%s%%" android:defaultValue="50" min="20" max="65"/>
</PreferenceScreen>
<PreferenceScreen android:title="@string/pref_horizontal_margin_title">
<juloo.keyboard2.prefs.IntSlideBarPreference android:key="horizontal_margin_portrait" android:title="@string/pref_portrait" android:summary="%sdp" android:defaultValue="3" min="0" max="30"/>
<juloo.keyboard2.prefs.IntSlideBarPreference android:key="horizontal_margin_landscape" android:title="@string/pref_landscape" android:summary="%sdp" android:defaultValue="28" min="0" max="200"/>
<juloo.keyboard2.prefs.IntSlideBarPreference android:key="horizontal_margin_portrait_unfolded" android:title="@string/pref_portrait_unfolded" android:summary="%sdp" android:defaultValue="3" min="0" max="30"/>
<juloo.keyboard2.prefs.IntSlideBarPreference android:key="horizontal_margin_landscape_unfolded" android:title="@string/pref_landscape_unfolded" android:summary="%sdp" android:defaultValue="28" min="0" max="200"/>
</PreferenceScreen>
<juloo.keyboard2.prefs.SlideBarPreference android:key="character_size" android:title="@string/pref_character_size_title" android:summary="@string/pref_character_size_summary" android:defaultValue="1.15" min="0.75" max="1.5"/>
<juloo.keyboard2.prefs.SlideBarPreference android:key="key_vertical_margin" android:title="@string/pref_key_vertical_space" android:summary="%s%%" android:defaultValue="1.5" min="0" max="5"/>

View File

@ -5,11 +5,11 @@
let
jdk = pkgs.openjdk17;
build_tools_version = "33.0.1";
build_tools_version = "34.0.0";
android = pkgs.androidenv.composeAndroidPackages {
buildToolsVersions = [ build_tools_version ];
platformVersions = [ "34" ];
platformVersions = [ "35" ];
abiVersions = [ "armeabi-v7a" ];
inherit repoJson;
};

View File

@ -49,7 +49,7 @@ public final class ClipboardHistoryService
/** The maximum size limits the amount of user data stored in memory but also
gives a sense to the user that the history is not persisted and can be
forgotten as soon as the app stops. */
public static final int MAX_HISTORY_SIZE = 3;
public static final int MAX_HISTORY_SIZE = 6;
/** Time in ms until history entries expire. */
public static final long HISTORY_TTL_MS = 5 * 60 * 1000;

View File

@ -72,56 +72,56 @@ public final class ComposeKeyData
"\u1fda\u1ff8\u1fea\u1ffa\uFFFF\u0410\u0300\u0400\u040d\uFFFF\u041e\u0300\uFFFF\u0420\u0300\uFFFF\u0423\u0300\uFFFF\u0430\u0300\uFFFF\u043e\u0300\uFFFF\u0440\u0300\uFFFF\u0443\u0300\u0000\"'(*,-;>E^_`ae~\u00a8\u00b4\u00e6\u0000!,.AEGIOUaegiou\u00b8\u0391\u0399\u03a5\u03b1\u03b9\u03c5" +
"\u0410\u0415\u0416\u0418\u0423\u0430\u0435\u0436\u0438\u0443\u0000Aa\u0000Ee\u0000Ee\u0000\"',./<=ACDEGHIKLNORSTUZacdeghijklnorstuz|\u00dc\u00fc\u0000Uu\u01d9\u01cd\u01e6\u021e\u01cf\u01e8" +
"\u01d1\u01d3\u0000,-.<=hi\u00f0\u2300\u0000\"',-.;<=>^_`e\u00a8\u00b4\u0259\u0000.Sfils\u017f\uFFFF\ufb00\uFFFF\ufb01\uFFFF\ufb02\u0000(,.Utu~\u02d8\uFFFF\u0067\u0303\u0000,\u0000\"',-.;>^_`j~\u00a8\u00b4" +
"\u0133\u0000'\u00b4\u0000,k\u0138\u0000',-/<tv\u0000./u\u0000',<g~\u0000~\uFFFF\u006e\u0360\u0067\u0000\"',-/;>AU^_`aceorsuwxy~\u00a8\u00b4\u0153\u0000!.=o\u0000o\uFFFF\ud83d\udca9\u0000'," +
"<=\u0000!',.;<mos\u00b8\u00df\u0000,-./;<hm\u00fe\u0000\"'*,-/;>AEGIOU^_`aegiou~\u00a8\u00b4\u0000/ACDEGHIKNORSTUZacde" +
"ghijklnorstuz|\u0000^\u0000ox\u00d7\u0000\"'=^\u00a8\u00b4\u0000'.<\u0000}\u2205\u0000-=BCGS^cv~\u2190\u2192\u2206\u2207\u222a\u2282\u25cb\u2020\u2021\u236d\u2345\u2346\u234b\u2352\u2366\u2367\u233d\u0000\"()+0AEIN" +
"OUVY^abeinouvy|~\u00a8\u00c2\u00ca\u00d4\u00e2\u00ea\u00f4\u0102\u0103\u01a0\u01a1\u01af\u01b0\u03b1\u03b7\u03b9\u03c5\u03c9\u2207\u2227\u2228\u0000\u03b9\u03c5\u1fd7\u0000\u0391\u0397\u0399\u03a5\u03a9\u03b1\u03b7\u03b9\u03c5\u03c9\u1f0f\u1f2f\u1f3f\u1f5f\u1f6f\u1f07\u1f27\u1f37\u1f57\u1f67\u0000\u0391\u0397\u0399\u03a9\u03b1\u03b7\u03b9\u03c5\u03c9" +
"\u1f0e\u1f2e\u1f3e\u1f6e\u1f06\u1f26\u1f36\u1f56\u1f66\u0000OUou\u1ee0\u1eee\u1ebc\u1e7c\u1ef8\u0000AEOaeo\u1eaa\u1ec4\u1ed6\u0000Aa\u1eb4\u2248\u1fb6\u1fc6\u1fd6\u1fe6\u1ff6\u236b\u2372\u2371\u0000'*>AEIOUY`aeiouy~\u00b4\u2207\u2218\u22a4\u25cb\u1fed\u1fc1\u2361\u2365\u0000!\"" +
".;AEGIOUYaegiouy~\u00c4\u00c6\u00d5\u00d6\u00dc\u00e4\u00e6\u00f5\u00f6\u00fc\u0226\u0227\u0391\u0399\u03a5\u03b1\u03b9\u03c5\u0410\u0415\u0418\u041e\u0420\u0423\u0430\u0435\u0438\u043e\u0440\u0443\u1e36\u1e37\u1e5a\u1e5b\u22a4\u0000LRlr\u0000AOUaou\u0000AOao\u0000Oo" +
"\u0000Oo\u2351\u0000\"()+,/ACEGIJKLMNOPRSUWYZ^_abcegijklmnoprsuwyz~\u00af\u00b8\u00c2\u00c5\u00c6\u00c7\u00ca\u00cf\u00d4\u00d5\u00d8\u00dc\u00e2\u00e5\u00e6\u00e7\u00ea\u00ef\u00f4\u00f5\u00f8" +
"\u00fc\u0102\u0103\u0112\u0113\u014c\u014d\u0168\u0169\u01a0\u01a1\u01af\u01b0\u0391\u0395\u0397\u0399\u039f\u03a5\u03a9\u03b1\u03b5\u03b7\u03b9\u03bf\u03c5\u03c9\u0410\u0413\u0415\u0418\u041a\u041e\u0420\u0423\u042b\u042d\u042e\u042f\u0430\u0433\u0435\u0438\u043a\u043e\u0440\u0443\u044b\u044d\u044e\u044f\u0000IUiu\u03b9\u03c5\u0000\u0391\u0395\u0397\u0399\u039f\u03a5\u03a9\u03b1\u03b5\u03b7\u03b9\u03bf\u03c5" +
"\u03c9\u0000\u0391\u0395\u0397\u0399\u039f\u03a9\u03b1\u03b5\u03b7\u03b9\u03bf\u03c5\u03c9\u0000OUou\u0000Cc\u0000Oo\u0000AEOaeo\u0000EOeo\u0000Aa\u0000OUou\u0000EOeo\u0000Cc\u0000CDEGHKLNRSTcdeghk" +
"lnrst\u0228\u0000\u2395\u2339\u0000Gg\u0000'\u0000'\u0000'\u0000\"'\u0000'\u0000\"'\u0000'\u0000'\u0000'\u0000'\u0000\"'()`~\u00b4\u0391\u0397\u03a9\u03b1\u03b7\u03c9\u0000()\u03b1\u03b7\u03c9\u0000\u0391\u0397\u03a9\u03b1\u03b7\u03c9\u1f8d\u1f9d\u1fad\u1f85\u1f95\u1fa5\u0000\u0391\u0397\u03a9\u03b1" +
"\u03b7\u03c9\u1f8c\u1f9c\u1fac\u1f84\u1f94\u1fa4\u1fb4\u1fc4\u1ff4\u0000\u0391\u0397\u03a9\u03b1\u03b7\u03c9\u1f89\u1f99\u1fa9\u1f81\u1f91\u1fa1\u0000\u0391\u0397\u03a9\u03b1\u03b7\u03c9\u1f88\u1f98\u1fa8\u1f80\u1f90\u1fa0\u0000()\u03b1\u03b7\u03c9\u0000\u0391\u0397\u03a9\u03b1\u03b7\u03c9\u1f8b\u1f9b\u1fab\u1f83\u1f93\u1fa3\u0000\u0391\u0397\u03a9\u03b1\u03b7\u03c9\u1f8a\u1f9a\u1faa\u1f82\u1f92\u1fa2\u1fb2\u1fc2\u1ff2" +
"\u0000()\u03b1\u03b7\u03c9\u0000\u0391\u0397\u03a9\u03b1\u03b7\u03c9\u1f8f\u1f9f\u1faf\u1f87\u1f97\u1fa7\u0000\u0391\u0397\u03a9\u03b1\u03b7\u03c9\u1f8e\u1f9e\u1fae\u1f86\u1f96\u1fa6\u1fb7\u1fc7\u1ff7\u0000()\u03b1\u03b7\u03c9\u0000\u0391\u0397\u03a9\u03b1\u03b7\u03c9\u0000\u0391\u0397\u03a9\u03b1\u03b7\u03c9\u1fbc\u1fcc\u1ffc\u1fb3\u1fc3\u1ff3\u0000'\u0000\"'\u0000'\u0000=\u0000=" +
"\u0000\u041e\u043e\u0000=\u0000\u0435\u0443\u0447\u044b\u044c\ua64b\ua651\u0463\u0461\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u0061\u0069\u0067\u0075\uFFFF\ua659\uFFFF\ua64d\u0000\u0447\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u0073\u006c\u0061\u0076\u006f\u006e\u0069\u0063\u005f\u0070\u0073\u0069\u006c\u0069\u0000,.\u0439\u043a\u0445\u0458\u0491\u0481\u0000\u0435" +
"\u0436\u0437\u0439\u0458\u0465\uFFFF\ua649\u045f\uFFFF\ua643\u0452\u0000\u0447\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u0074\u0072\u0065\u006d\u0061\u0000.\u0000=\u0444\u0499\u0000\u0438\u0443\u0475\u0000.\u0447\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u0062\u0072\u0065\u0076\u0065\u0000,.\u0433\u0441\u0445\u0448\u046f\u0000,.\u044c\u0459\u0000" +
".\u0000,\u00b7\u0447\u044c\u0529\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u0074\u0069\u0074\u006c\u006f\u045a\u0000\u0442\u0443\u0447\u047f\u0479\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u0069\u006e\u0076\u0065\u0072\u0074\u0065\u0064\u005f\u0062\u0072\u0065\u0076\u0065\u0000\u0430\u0441\u0471\u0000\u0439\u0444\u0458\u045b\u0473\u0000\u0438\u0439\u0443\u0447\u0456\u0458" +
"\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u0070\u006f\u006b\u0072\u0079\u0074\u0069\u0065\u0000,.\u0447\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u0073\u006c\u0061\u0076\u006f\u006e\u0069\u0063\u005f\u0064\u0061\u0073\u0069\u0061\u0000.\u0430\u0431\u0435\u0439\u043d\u043e\u0443\u0445\u0447\u044a\u044e\u0458\u0467\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e" +
"\u0067\u005f\u0070\u0061\u0079\u0065\u0072\u006f\u006b\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u0076\u0065\u0072\u0074\u0069\u0063\u0061\u006c\u005f\u0074\u0069\u006c\u0064\u0065\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u0067\u0072\u0061\u0076\u0065\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u0076\u007a\u006d\u0065\u0074\u0000\u0442\u0449\u0000\u0447\u0000" +
"\u0430\u0435\u043c\u043d\u0447\uFFFF\ua653\u046d\u0469\u0000\u044c\uFFFF\ua65d\u0000\".\u0443\u0456\u0000\u0430\u0447\u0463\uFFFF\ua657\u0000\u0442\u0000\u0447\u0000\u05d9\uFFFF\ufb1d\u0000\u05d0\u05f2\uFFFF\ufb2e\uFFFF\ufb1f\u0000\u05d0\uFFFF\ufb2f\u0000\u05d5\uFFFF\ufb4b\u0000\u05d0\u05d1\u05d2\u05d3\u05d4\u05d5\u05d6\u05d8\u05d9\u05da\u05db\u05dc\u05de\u05e0\u05e1\u05e3\u05e4\u05e6\u05e7\u05e8\u05e9\u05ea\uFFFF\ufb30" +
"\uFFFF\ufb31\uFFFF\ufb32\uFFFF\ufb33\uFFFF\ufb34\uFFFF\ufb35\uFFFF\ufb36\uFFFF\ufb38\uFFFF\ufb39\uFFFF\ufb3a\uFFFF\ufb3b\uFFFF\ufb3c\uFFFF\ufb3e\uFFFF\ufb40\uFFFF\ufb41\uFFFF\ufb43\uFFFF\ufb44\uFFFF\ufb46\uFFFF\ufb47\uFFFF\ufb48\uFFFF\ufb49\uFFFF\ufb4a\u0000\u05d1\u05db\u05e4\uFFFF\ufb4c\uFFFF\ufb4d\uFFFF\ufb4e\u0000\u05bc\u05e9\ufb49\u0000\u05e9\uFFFF\ufb2c\uFFFF\ufb2a\u0000\u05bc\u05e9\ufb49\u0000\u05e9\uFFFF\ufb2d\uFFFF\ufb2b" +
"\u0000\u0627\u0639\u0648\u064a\u0667\u06cc\u06f7\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u0061\u006c\u0065\u0066\u005f\u0061\u0062\u006f\u0076\u0065\u0623\u06c9\u063d\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u0061\u006c\u0065\u0066\u005f\u0062\u0065\u006c\u006f\u0077\u0000\u062f\u0631\u0634\u0646\u0637\u0691\u062b\u0679\u0000\u0634\u0686\u0000\u062d\uFFFF\u0063\u006f\u006d\u0062" +
"\u0069\u006e\u0069\u006e\u0067\u005f\u0073\u0075\u006b\u0075\u006e\u0000\u062a\u0632\u06f7\u0630\u0695\u0000\u0634\u0635\u0000\u062a\u0000\u0627\u0647\u0648\u064a\u0667\u0668\u06cc\u06f7\u06f8\u0625\u06c0\u0624\u0626\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u0068\u0061\u006d\u007a\u0061\u005f\u0062\u0065\u006c\u006f\u0077\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u0068\u0061\u006d" +
"\u007a\u0061\u005f\u0061\u0062\u006f\u0076\u0065\u0000\u0643\u06a9\u06af\u0000\u0648\u06a1\u0000\u0648\u06ca\u0000\u0644\u0667\u06f7\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u0073\u0068\u0061\u0064\u0064\u0061\u0068\u06b5\u0000\u062a\u0647\u0648\u064a\u06cc\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u0066\u0061\u0074\u0068\u0061\u0074\u0061\u006e\uFFFF\u0063\u006f\u006d\u0062\u0069" +
"\u006e\u0069\u006e\u0067\u005f\u0064\u0061\u006d\u006d\u0061\u0074\u0061\u006e\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u006b\u0061\u0073\u0072\u0061\u0074\u0061\u006e\u0000 \u062a\u0639\u0646\u0647\u0648\u064a\u06cc\u06d5\u0629\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u0066\u0061\u0074\u0068\u0061\u06c6\u06ce\u0000\u062b\u0639\u0641\u0646\u0648\u0667\u0668\u06f7\u06f8\u06cb" +
"\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u0064\u0061\u006d\u006d\u0061\u0068\u0000 \u0627\u0639\u0646\u064a\u0667\u0668\u06f7\u06f8\u06d2\u0649\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u006b\u0061\u0073\u0072\u0061\u0000\u0627\u0622\u0000\u0627\u0648\u064a\u06c1\u06d2\u06d5\u06c2\u06d3\u0000\u0627\u0000\u0627\u0631\u0639\u0644\u0648\u064a\u0667\u06cc\uFFFF\u0063\u006f\u006d" +
"\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u0061\u0072\u0061\u0062\u0069\u0063\u005f\u0076\u0000\u0639\u0648\u064a\u0668\u06cc\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u0061\u0072\u0061\u0062\u0069\u0063\u005f\u0069\u006e\u0076\u0065\u0072\u0074\u0065\u0064\u005f\u0076\u0000 \u0627\u0639\u0646\u0667\u0668\u06cc\u06f7\u06f8\u0000\u0627\u0631\u0639\u0644\u0648\u064a\u06cc\u06f7\u0000\u0639\u0648\u064a" +
"\u06cc\u06f8\u0000\u0915\u0916\u0917\u091c\u0921\u0922\u0928\u092b\u092f\u0930\u0933\u0958\u0959\u095a\u095b\u095c\u095d\u0929\u095e\u095f\u0931\u0934\u0000\u09a1\u09a2\u09af\u09dc\u09dd\u09df\u0000\u09be\u09d7\u09cb\u09cc\u0000\u0a16\u0a17\u0a1c\u0a2b\u0a32\u0a38\u0a59\u0a5a\u0a5b\u0a5e\u0a33\u0a36\u0000\u0b21\u0b22\u0b5c\u0b5d\u0000\u0b3e\u0b56\u0b57\u0b4b\u0b48\u0b4c\u0000\u0bbe\u0bd7\u0bca\u0bcc\u0000\u0bbe\u0bcb\u0000\u0b92" +
"\u0b94\u0000\u0c56\u0c48\u0000\u0cd5\u0cc0\u0000\u0cc2\u0cd5\u0cd6\u0cca\u0cc7\u0cc8\u0000\u0cd5\u0ccb\u0000\u0d3e\u0d57\u0d4a\u0d4c\u0000\u0d3e\u0d4b\u0000\u0dca\u0dcf\u0ddf\u0dda\u0ddc\u0dde\u0000\u0dca\u0ddd\u0000\u0f72\u0f74\u0f80\u0f73\u0f75\u0f81\u0000\u0fb5\u0fb9\u0000\u0fb7\u0f93\u0000\u0fb7\u0f9d\u0000\u0fb7\u0fa2\u0000\u0fb7\u0fa7\u0000\u0fb7\u0fac\u0000\u0f80\u0f76\u0000\u0f80\u0f78\u0000\u0f40\u0f69\u0000\u0f42\u0f4c" +
"\u0f51\u0f56\u0f5b\u0f43\u0f4d\u0f52\u0f57\u0f5c\u0000\u1025\u1026\u0000\u1100\u1101\u0000\u1100\u1102\u1103\u1107\u1113\u1114\u1115\u1116\u0000\u1100\u1103\u1117\u1104\u0000\u1102\u1105\u110b\u1112\u1118\u1119\u111b\u111a\u0000\u1107\u110b\u111c\u111d\u0000\u1100\u1102\u1103\u1107\u1109\u110a\u110b\u110c\u110e\u1110\u1111\u112b\u112d\u112f\u1132\u1136\u111e\u111f\u1120\u1108\u1121\u1125\u112b\u1127\u1128\u1129\u112a\u112c\u1122" +
"\u1123\u1124\u1126\u0000\u110b\u0000\u1100\u1102\u1103\u1105\u1106\u1107\u1109\u110a\u110b\u110c\u110e\u110f\u1110\u1111\u1112\u111e\u112d\u112e\u112f\u1130\u1131\u1132\u110a\u1134\u1135\u1136\u1137\u1138\u1139\u113a\u113b\u1133\u0000\u1109\u0000\u1100\u1103\u1106\u1107\u1109\u110b\u110c\u110e\u1110\u1111\u1140\u1141\u1142\u1143\u1144\u1145\u1147\u1148\u1149\u114a\u114b\u1146\u0000\u110b\u110c\u114d\u110d\u0000\u110f\u1112\u1152" +
"\u1153\u0000\u1107\u110b\u1156\u1157\u0000\u1112\u1158\u0000\u1100\u1103\u1107\u1109\u110c\u0000\u1100\u0000\u113c\u113d\u0000\u113e\u113f\u0000\u114e\u114f\u0000\u1150\u1151\u0000\u1169\u116e\u1175\u1176\u1177\u1162\u0000\u1169\u116d\u1175\u1178\u1179\u1164\u0000\u1169\u116e\u1173\u1175\u117a\u117b\u117c\u1166\u0000\u1169\u116e\u1175\u117d\u117e\u1168\u0000\u1161\u1162\u1165\u1166\u1168\u1169\u116e\u1175\u116a\u116b\u117f\u1180" +
"\u1181\u1182\u1183\u116c\u0000\u1175\u0000\u1163\u1164\u1167\u1169\u1175\u1184\u1185\u1186\u1187\u1188\u0000\u1161\u1162\u1165\u1166\u1168\u116e\u1175\u117c\u1189\u118a\u116f\u1170\u118c\u118d\u1171\u118b\u0000\u1173\u1175\u0000\u1161\u1165\u1166\u1167\u1168\u116e\u1175\u118e\u118f\u1190\u1191\u1192\u1193\u1194\u0000\u116e\u1173\u1175\u1195\u1196\u1174\u0000\u116e\u1197\u0000\u1161\u1163\u1169\u116e\u1173\u119e\u1198\u1199\u119a" +
"\u119b\u119c\u119d\u0000\u1165\u116e\u1175\u119e\u119f\u11a0\u11a1\u11a2\u0000\u11a8\u11af\u11ba\u11e7\u11a9\u11c3\u11aa\u11c4\u0000\u11a8\u0000\u11a8\u11ae\u11ba\u11bd\u11c0\u11c2\u11eb\u11c5\u11c6\u11c7\u11ac\u11c9\u11ad\u11c8\u0000\u11a8\u11af\u11ca\u11cb\u0000\u11a8\u11aa\u11ab\u11ae\u11af\u11b7\u11b8\u11b9\u11ba\u11bb\u11bf\u11c0\u11c1\u11c2\u11da\u11dd\u11e5\u11e6\u11eb\u11f9\u11b0\u11cc\u11cd\u11ce\u11d0\u11b1\u11b2\u11d3" +
"\u11b3\u11d6\u11d8\u11b4\u11b5\u11b6\u11d1\u11d2\u11d4\u11d5\u11d7\u11d9\u0000\u11ba\u0000\u11a8\u11ba\u0000\u11ba\u11bc\u11c2\u0000\u11ba\u0000\u11a8\u11af\u11b8\u11ba\u11bb\u11bc\u11be\u11c2\u11eb\u11da\u11db\u11dc\u11dd\u11de\u11e2\u11e0\u11e1\u11df\u0000\u11af\u11ba\u11bc\u11c1\u11c2\u11e3\u11b9\u11e6\u11e4\u11e5\u0000\u11a8\u11ae\u11af\u11b8\u11ba\u11e7\u11e8\u11e9\u11ea\u11bb\u0000\u11a8\u11a9\u11bc\u11bf\u11ec\u11ed\u11ee" +
"\u11ef\u0000\u11b8\u11bc\u11f3\u11f4\u0000\u11ab\u11af\u11b7\u11b8\u11f5\u11f6\u11f7\u11f8\u0000\u11c2\u11cf\u0000\u11ba\u0000\u11a8\u0000\u11ba\u11eb\u11f1\u11f2\u0000|\u2395\u2347\u0000-\u2395\u2350\u0000|\u2395\u2348\u0000-\u2395\u2357\u0000/\u2204\u0000_|\u2395\u234d\u0000|~\u00a8\u2395\u2354\u0000/\u2209\u0000_\u0000/\u220c\u0000_\u00a8\u2229\u22a4\u22a5\u2395" +
"\u25cb\u235d\u2355\u234e\u233b\u233e\u0000/\u2224\u0000/\u2226\u0000~\u2228\u2395\u2353\u0000~\u2227\u2395\u234c\u0000\u2218\u0000|\u0000/\u2241\u0000/\u2244\u0000/\u2249\u0000/\u226d\u0000_\u2395\u236f\u0000/\u0000/\u2270\u0000/\u2271\u0000/\u2274\u0000/\u2275\u0000/\u2278\u0000/\u2279\u0000/\u2280\u0000/\u2281\u0000/\u22e0\u0000" +
"/\u22e1\u0000/_|\u2284\u0000/_\u2285\u0000/\u2288\u0000/\u2289\u0000/\u22e2\u0000/\u22e3\u0000/\u22ac\u0000\u00a8\u00af\u2218\u22a5\u2336\u0000_\u2218\u22a4\u0000/\u22ad\u0000/\u22ae\u0000/\u22af\u0000/\u22ea\u0000/\u22eb\u0000/\u22ec\u0000/\u22ed\u0000_\u2395\u233a\u0000_\u0000_\u0000_\u0000'/:<" +
"=>?\\\u00f7\u2190\u2191\u2192\u2193\u2206\u2207\u2218\u2227\u2228\u2260\u22c4\u25cb\u233c\u0000*-.\\_|\u00a8\u2218\u2395\u0000/\u2adc\u0000 !\"%'()*,-.0123456789:<=>?[]^_abcehlopru" +
"yz{|}\u00a3\u00a7\u00b1\u00d7\u0398\u03a0\u03a3\u03b2\u03b3\u03b5\u03b8\u03ba\u03c0\u03c1\u03c3\u03c5\u03c6\u0430\u0435\u0437\u0438\u0439\u043b\u043c\u043d\u043e\u0441\u0443\u0447\u0448\u044a\u044b\u044c\u044d\u044f\u0456\u0458\u045f\u0461\u0481\u0487\u049b\u04b7\u04c8\u0513\u05d1\u05d3\u05d5\u05d6\u05d7\u05dd\u05e1\u05e3\u05e4\u05e6\u05e7\u05e8\u05e9\u0625\u0626\u0627\u0628\u0629\u062b\u062d\u0631\u0632" +
"\u0633\u0635\u0637\u0639\u063a\u063d\u0641\u0642\u0643\u0644\u0646\u0647\u064a\u064f\u0650\u0660\u0661\u0662\u0663\u0664\u0665\u0666\u0667\u0668\u0669\u06a1\u06a9\u06c6\u06c9\u06cc\u06ce\u06f0\u06f1\u06f2\u06f3\u06f4\u06f5\u06f6\u06f7\u06f8\u06f9\u0901\u0902\u0905\u0906\u0907\u0908\u0909\u090a\u090b\u090c\u090f\u0910\u0913\u0914\u0915\u0916\u0917\u0918\u091a\u091b\u091c\u091d\u091f\u0921\u0922\u0923\u0925\u0926\u0928\u092a\u092b" +
"\u092c\u092f\u0930\u0933\u0935\u0936\u0937\u093c\u093d\u093e\u093f\u0940\u0941\u0943\u0947\u0948\u094b\u094c\u0953\u0956\u0962\u0964\u0970\u0b92\u0b9a\u0baf\u0bb3\u0bb5\u2020\u20ac\u20b9\u2190\u2191\u2192\u2193\u2194\u2195\u2196\u2197\u2198\u2199\u2203\u2206\u2207\u2227\u2228\u2229\u222a\u222b\u2282\u2283\u22a4\u22b7\u22c4\u235d\u2375\u237a\u2395\ua649\ua651\ua67d\uFFFF\u006e\u0062\u0073\u0070\uFFFF\u0066\u0031\u0030\uFFFF\u0066" +
"\u0031\uFFFF\u0066\u0032\uFFFF\u0066\u0033\uFFFF\u0066\u0034\uFFFF\u0066\u0035\uFFFF\u0066\u0036\uFFFF\u0066\u0037\uFFFF\u0066\u0038\uFFFF\u0066\u0039\uFFFF\u007a\u0077\u006e\u006a\u20b1\u20b4\u20bf\uFFFF\u0072\u0065\u006d\u006f\u0076\u0065\u0064\u2213\u2219\u03f4\u220f\u2211\u03d0\u0263\u03f5\u03d1\u03f0\u03d6\u03f1\u03c2\u03d2\u03d5\u0465\uFFFF\ua641\u0456\u0458\u046b\u0467\u047b\u0455\uFFFF\ua64b\u044c\uFFFF\ua651\u044a\u0454" +
"\u0438\uFFFF\ua66f\uFFFF\u0068\u0061\u0074\u0061\u0066\u005f\u0073\u0065\u0067\u006f\u006c\uFFFF\u0064\u0061\u0067\u0065\u0073\u0068\uFFFF\u0068\u006f\u006c\u0061\u006d\uFFFF\u0071\u0075\u0062\u0075\u0074\u0073\uFFFF\u0068\u0069\u0072\u0069\u0071\uFFFF\u0072\u0061\u0066\u0065\uFFFF\u0073\u0065\u0067\u006f\u006c\uFFFF\u0068\u0061\u0074\u0061\u0066\u005f\u0070\u0061\u0074\u0061\u0068\uFFFF\u0070\u0061\u0074\u0061\u0068\uFFFF\u0074" +
"\u0073\u0065\u0072\u0065\uFFFF\u0071\u0061\u006d\u0061\u0074\u0073\uFFFF\u0068\u0061\u0074\u0061\u0066\u005f\u0071\u0061\u006d\u0061\u0074\u0073\uFFFF\u0073\u0068\u0065\u0076\u0061\u066e\u067e\u06c1\u0698\u0640\u0636\u0638\u0621\u06a4\u063a\u06a9\u06ba\u06be\u06cc\u0643\u064a\u0900\u0955\u0972\u0911\u0973\u0974\u0976\u0977\u0960\u0961\u090d\u090e\u0912\u0975\u097b\u097c\uFFFF\u0936\u094d\u091a\u0979\u0978\u097e\uFFFF\u0924\u094d" +
"\u0930\uFFFF\u0926\u094d\u0930\uFFFF\u092a\u094d\u0930\u097f\u097a\uFFFF\u0936\u094d\u0930\uFFFF\u0915\u094d\u0937\u094e\u097d\u0949\u093a\u093b\u0904\u0944\u0945\u0946\u094a\u094f\u0954\u0957\u0963\u0965\u0971\uFFFF\u0bd0\uFFFF\u0bf2\uFFFF\u0bf0\uFFFF\u0bf1\uFFFF\u0bf3\u21d4\u21d5\u21d6\u21d7\u21d8\u21d9\u22c0\u22c1\u22c2\u22c3\u222e\u22b6\u044b\u0483\u00000123456789\u09e6\u09e7" +
"\u09e8\u09e9\u09ea\u09eb\u09ec\u09ed\u09ee\u09ef\u00000123456789\u0966\u0967\u0968\u0969\u096a\u096b\u096c\u096d\u096e\u096f\u00000123456789\u0ae6\u0ae7\u0ae8\u0ae9\u0aea\u0aeb\u0aec\u0aed\u0aee\u0aef\u00000123456789\u0660\u0661\u0662\u0663\u0664\u0665\u0666\u0667\u0668\u0669\u0000" +
"0123456789\u0ce6\u0ce7\u0ce8\u0ce9\u0cea\u0ceb\u0cec\u0ced\u0cee\u0cef\u00000123456789\u06f0\u06f1\u06f2\u06f3\u06f4\u06f5\u06f6\u06f7\u06f8\u06f9\u00000123456789\u0be6\u0be7\u0be8\u0be9\u0bea\u0beb\u0bec\u0bed\u0bee\u0bef\u0000\u00df\u0131\u01f0\u0237\u02b0\u02b2\u02b3\u02b7\u02e1" +
"\u0905\u0907\u0909\u090b\u090c\u090f\u0913\u0915\u0917\u091a\u091c\u091f\u0921\u0924\u0926\u0928\u092c\u092e\u0932\u0938\u0939\u093f\u0941\u0943\u0945\u0947\u0949\u094b\u0952\u0962\u0a85\u0a87\u0a89\u0a8f\u0a93\u0a95\u0a97\u0a9a\u0a9c\u0a9f\u0aa1\u0aa4\u0aa6\u0aa8\u0aaa\u0aac\u0aae\u0ab2\u0ab8\u0ab9\u0abf\u0ac1\u0ac7\u0acb\u0bf9\u1d43\u1d47\u1d48\u1d49\u1d4d\u1d4f\u1d50\u1d52\u1d56\u1d57\u1d58\u1d5b\u1d60\u1d9c\u1da0\u1dbe\u1e97" +
"\u1e98\u1e99\u2071\u207f\u20b9\u2190\u2191\u2192\u2193\u2196\u2197\u2198\u2199\u2208\u220b\u2282\u2283\u2286\u2287\u2500\u2502\u250c\u2510\u2514\u2518\u251c\u2524\u252c\u2534\u253c\ud835\uFFFF\u004a\u030c\uFFFF\u004a\u0307\u1d34\u1d36\u1d3f\u1d42\u1d38\u0906\u0908\u090a\u0910\u0914\u0916\u0918\u091b\u091d\u0920\u0922\u0925\u0927\u0923\u092d\u0902\u0933\u0936\u0903\u0940\u0942\u0948\u094c\u0951\u0a86\u0a88\u0a8a\u0a90\u0a94\u0a96" +
"\u0a98\u0a9b\u0a9d\u0aa0\u0aa2\u0aa5\u0aa7\u0aa3\u0aab\u0aad\u0a82\u0ab3\u0ab6\u0a83\u0ac0\u0ac2\u0ac8\u0acc\u1d2c\u1d2e\u1d30\u1d31\u1d33\u1d37\u1d39\u1d3c\u1d3e\u1d40\u1d41\u2c7d\u1db2\uFFFF\ua7f2\uFFFF\ua7f3\u1d23\uFFFF\u0054\u0308\uFFFF\u0057\u030a\uFFFF\u0059\u030a\u1d35\u1d3a\u2550\u2551\u2554\u2557\u255a\u255d\u2560\u2563\u2566\u2569\u256c\u0000\udd57\udd58\udd64\udd68\udd69\uFFFF\ud835\udd3d\uFFFF\ud835\udd3e\uFFFF\ud835" +
"\udd4a\uFFFF\ud835\udd4e\uFFFF\ud835\udd4f").toCharArray();
"\u0133\u0000'\u00b4\u0000,k\u0138\u0000',-/<tv\u0000./u\u0000',<g~\u014b\u0000\"',-/;>AU^_`aceorsuwxy~\u00a8\u00b4\u0153\u0000!.=o\u0000o\uFFFF\ud83d\udca9\u0000',<=\u0000!'" +
",.;<mos\u00b8\u00df\u0000,-./;<hm\u00fe\u0000\"'*,-/;>AEGIOU^_`aegiou~\u00a8\u00b4\u0000/ACDEGHIKNORSTUZacdeghijk" +
"lnorstuz|\u0000^\u0000ox\u00d7\u0000\"'=^\u00a8\u00b4\u0000'.<\u0000}\u2205\u0000-=BCGS^cv~\u2190\u2192\u2206\u2207\u222a\u2282\u25cb\u2020\u2021\u236d\u2345\u2346\u234b\u2352\u2366\u2367\u233d\u0000\"()+0AEINOUVY^" +
"abeinouvy|~\u00a8\u00c2\u00ca\u00d4\u00e2\u00ea\u00f4\u0102\u0103\u01a0\u01a1\u01af\u01b0\u03b1\u03b7\u03b9\u03c5\u03c9\u2207\u2227\u2228\u0000\u03b9\u03c5\u1fd7\u0000\u0391\u0397\u0399\u03a5\u03a9\u03b1\u03b7\u03b9\u03c5\u03c9\u1f0f\u1f2f\u1f3f\u1f5f\u1f6f\u1f07\u1f27\u1f37\u1f57\u1f67\u0000\u0391\u0397\u0399\u03a9\u03b1\u03b7\u03b9\u03c5\u03c9\u1f0e\u1f2e\u1f3e\u1f6e\u1f06" +
"\u1f26\u1f36\u1f56\u1f66\u0000OUou\u1ee0\u1eee\u1ebc\u1e7c\u1ef8\u0000AEOaeo\u1eaa\u1ec4\u1ed6\u0000Aa\u1eb4\u2248\u1fb6\u1fc6\u1fd6\u1fe6\u1ff6\u236b\u2372\u2371\u0000'*>AEIOUY`aeiouy~\u00b4\u2207\u2218\u22a4\u25cb\u1fed\u1fc1\u2361\u2365\u0000!\".;AEG" +
"IOUYaegiouy~\u00c4\u00c6\u00d5\u00d6\u00dc\u00e4\u00e6\u00f5\u00f6\u00fc\u0226\u0227\u0391\u0399\u03a5\u03b1\u03b9\u03c5\u0410\u0415\u0418\u041e\u0420\u0423\u0430\u0435\u0438\u043e\u0440\u0443\u1e36\u1e37\u1e5a\u1e5b\u22a4\u0000LRlr\u0000AOUaou\u0000AOao\u0000Oo\u0000Oo\u2351\u0000" +
"\"()+,/ACEGIJKLMNOPRSUWYZ^_abcegijklmnoprsuwyz~\u00af\u00b8\u00c2\u00c5\u00c6\u00c7\u00ca\u00cf\u00d4\u00d5\u00d8\u00dc\u00e2\u00e5\u00e6\u00e7\u00ea\u00ef\u00f4\u00f5\u00f8\u00fc\u0102\u0103\u0112\u0113" +
"\u014c\u014d\u0168\u0169\u01a0\u01a1\u01af\u01b0\u0391\u0395\u0397\u0399\u039f\u03a5\u03a9\u03b1\u03b5\u03b7\u03b9\u03bf\u03c5\u03c9\u0410\u0413\u0415\u0418\u041a\u041e\u0420\u0423\u042b\u042d\u042e\u042f\u0430\u0433\u0435\u0438\u043a\u043e\u0440\u0443\u044b\u044d\u044e\u044f\u0000IUiu\u03b9\u03c5\u0000\u0391\u0395\u0397\u0399\u039f\u03a5\u03a9\u03b1\u03b5\u03b7\u03b9\u03bf\u03c5\u03c9\u0000\u0391\u0395\u0397" +
"\u0399\u039f\u03a9\u03b1\u03b5\u03b7\u03b9\u03bf\u03c5\u03c9\u0000OUou\u0000Cc\u0000Oo\u0000AEOaeo\u0000EOeo\u0000Aa\u0000OUou\u0000EOeo\u0000Cc\u0000CDEGHKLNRSTcdeghklnrst" +
"\u0228\u0000\u2395\u2339\u0000Gg\u0000'\u0000'\u0000'\u0000\"'\u0000'\u0000\"'\u0000'\u0000'\u0000'\u0000'\u0000\"'()`~\u00b4\u0391\u0397\u03a9\u03b1\u03b7\u03c9\u0000()\u03b1\u03b7\u03c9\u0000\u0391\u0397\u03a9\u03b1\u03b7\u03c9\u1f8d\u1f9d\u1fad\u1f85\u1f95\u1fa5\u0000\u0391\u0397\u03a9\u03b1\u03b7\u03c9\u1f8c\u1f9c\u1fac" +
"\u1f84\u1f94\u1fa4\u1fb4\u1fc4\u1ff4\u0000\u0391\u0397\u03a9\u03b1\u03b7\u03c9\u1f89\u1f99\u1fa9\u1f81\u1f91\u1fa1\u0000\u0391\u0397\u03a9\u03b1\u03b7\u03c9\u1f88\u1f98\u1fa8\u1f80\u1f90\u1fa0\u0000()\u03b1\u03b7\u03c9\u0000\u0391\u0397\u03a9\u03b1\u03b7\u03c9\u1f8b\u1f9b\u1fab\u1f83\u1f93\u1fa3\u0000\u0391\u0397\u03a9\u03b1\u03b7\u03c9\u1f8a\u1f9a\u1faa\u1f82\u1f92\u1fa2\u1fb2\u1fc2\u1ff2\u0000()\u03b1\u03b7" +
"\u03c9\u0000\u0391\u0397\u03a9\u03b1\u03b7\u03c9\u1f8f\u1f9f\u1faf\u1f87\u1f97\u1fa7\u0000\u0391\u0397\u03a9\u03b1\u03b7\u03c9\u1f8e\u1f9e\u1fae\u1f86\u1f96\u1fa6\u1fb7\u1fc7\u1ff7\u0000()\u03b1\u03b7\u03c9\u0000\u0391\u0397\u03a9\u03b1\u03b7\u03c9\u0000\u0391\u0397\u03a9\u03b1\u03b7\u03c9\u1fbc\u1fcc\u1ffc\u1fb3\u1fc3\u1ff3\u0000'\u0000\"'\u0000'\u0000=\u0000=\u0000\u041e\u043e\u0000=" +
"\u0000\u0435\u0443\u0447\u044b\u044c\ua64b\ua651\u0463\u0461\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u0061\u0069\u0067\u0075\uFFFF\ua659\uFFFF\ua64d\u0000\u0447\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u0073\u006c\u0061\u0076\u006f\u006e\u0069\u0063\u005f\u0070\u0073\u0069\u006c\u0069\u0000,.\u0439\u043a\u0445\u0458\u0491\u0481\u0000\u0435\u0436\u0437\u0439\u0458\u0465" +
"\uFFFF\ua649\u045f\uFFFF\ua643\u0452\u0000\u0447\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u0074\u0072\u0065\u006d\u0061\u0000.\u0000=\u0444\u0499\u0000\u0438\u0443\u0475\u0000.\u0447\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u0062\u0072\u0065\u0076\u0065\u0000,.\u0433\u0441\u0445\u0448\u046f\u0000,.\u044c\u0459\u0000.\u0000,\u00b7\u0447" +
"\u044c\u0529\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u0074\u0069\u0074\u006c\u006f\u045a\u0000\u0442\u0443\u0447\u047f\u0479\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u0069\u006e\u0076\u0065\u0072\u0074\u0065\u0064\u005f\u0062\u0072\u0065\u0076\u0065\u0000\u0430\u0441\u0471\u0000\u0439\u0444\u0458\u045b\u0473\u0000\u0438\u0439\u0443\u0447\u0456\u0458\uFFFF\u0063\u006f\u006d\u0062" +
"\u0069\u006e\u0069\u006e\u0067\u005f\u0070\u006f\u006b\u0072\u0079\u0074\u0069\u0065\u0000,.\u0447\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u0073\u006c\u0061\u0076\u006f\u006e\u0069\u0063\u005f\u0064\u0061\u0073\u0069\u0061\u0000.\u0430\u0431\u0435\u0439\u043d\u043e\u0443\u0445\u0447\u044a\u044e\u0458\u0467\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u0070\u0061\u0079" +
"\u0065\u0072\u006f\u006b\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u0076\u0065\u0072\u0074\u0069\u0063\u0061\u006c\u005f\u0074\u0069\u006c\u0064\u0065\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u0067\u0072\u0061\u0076\u0065\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u0076\u007a\u006d\u0065\u0074\u0000\u0442\u0449\u0000\u0447\u0000\u0430\u0435\u043c\u043d\u0447" +
"\uFFFF\ua653\u046d\u0469\u0000\u044c\uFFFF\ua65d\u0000\".\u0443\u0456\u0000\u0430\u0447\u0463\uFFFF\ua657\u0000\u0442\u0000\u0447\u0000\u05d9\uFFFF\ufb1d\u0000\u05d0\u05f2\uFFFF\ufb2e\uFFFF\ufb1f\u0000\u05d0\uFFFF\ufb2f\u0000\u05d5\uFFFF\ufb4b\u0000\u05d0\u05d1\u05d2\u05d3\u05d4\u05d5\u05d6\u05d8\u05d9\u05da\u05db\u05dc\u05de\u05e0\u05e1\u05e3\u05e4\u05e6\u05e7\u05e8\u05e9\u05ea\uFFFF\ufb30\uFFFF\ufb31\uFFFF\ufb32\uFFFF" +
"\ufb33\uFFFF\ufb34\uFFFF\ufb35\uFFFF\ufb36\uFFFF\ufb38\uFFFF\ufb39\uFFFF\ufb3a\uFFFF\ufb3b\uFFFF\ufb3c\uFFFF\ufb3e\uFFFF\ufb40\uFFFF\ufb41\uFFFF\ufb43\uFFFF\ufb44\uFFFF\ufb46\uFFFF\ufb47\uFFFF\ufb48\uFFFF\ufb49\uFFFF\ufb4a\u0000\u05d1\u05db\u05e4\uFFFF\ufb4c\uFFFF\ufb4d\uFFFF\ufb4e\u0000\u05bc\u05e9\ufb49\u0000\u05e9\uFFFF\ufb2c\uFFFF\ufb2a\u0000\u05bc\u05e9\ufb49\u0000\u05e9\uFFFF\ufb2d\uFFFF\ufb2b\u0000\u0627\u0639\u0648\u064a" +
"\u0667\u06cc\u06f7\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u0061\u006c\u0065\u0066\u005f\u0061\u0062\u006f\u0076\u0065\u0623\u06c9\u063d\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u0061\u006c\u0065\u0066\u005f\u0062\u0065\u006c\u006f\u0077\u0000\u062f\u0631\u0634\u0646\u0637\u0691\u062b\u0679\u0000\u0634\u0686\u0000\u062d\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067" +
"\u005f\u0073\u0075\u006b\u0075\u006e\u0000\u062a\u0632\u06f7\u0630\u0695\u0000\u0634\u0635\u0000\u062a\u0000\u0627\u0647\u0648\u064a\u0667\u0668\u06cc\u06f7\u06f8\u0625\u06c0\u0624\u0626\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u0068\u0061\u006d\u007a\u0061\u005f\u0062\u0065\u006c\u006f\u0077\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u0068\u0061\u006d\u007a\u0061\u005f\u0061\u0062" +
"\u006f\u0076\u0065\u0000\u0643\u06a9\u06af\u0000\u0648\u06a1\u0000\u0648\u06ca\u0000\u0644\u0667\u06f7\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u0073\u0068\u0061\u0064\u0064\u0061\u0068\u06b5\u0000\u062a\u0647\u0648\u064a\u06cc\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u0066\u0061\u0074\u0068\u0061\u0074\u0061\u006e\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f" +
"\u0064\u0061\u006d\u006d\u0061\u0074\u0061\u006e\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u006b\u0061\u0073\u0072\u0061\u0074\u0061\u006e\u0000 \u062a\u0639\u0646\u0647\u0648\u064a\u06cc\u06d5\u0629\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u0066\u0061\u0074\u0068\u0061\u06c6\u06ce\u0000\u062b\u0639\u0641\u0646\u0648\u0667\u0668\u06f7\u06f8\u06cb\uFFFF\u0063\u006f\u006d\u0062" +
"\u0069\u006e\u0069\u006e\u0067\u005f\u0064\u0061\u006d\u006d\u0061\u0068\u0000 \u0627\u0639\u0646\u064a\u0667\u0668\u06f7\u06f8\u06d2\u0649\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u006b\u0061\u0073\u0072\u0061\u0000\u0627\u0622\u0000\u0627\u0648\u064a\u06c1\u06d2\u06d5\u06c2\u06d3\u0000\u0627\u0000\u0627\u0631\u0639\u0644\u0648\u064a\u0667\u06cc\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e" +
"\u0067\u005f\u0061\u0072\u0061\u0062\u0069\u0063\u005f\u0076\u0000\u0639\u0648\u064a\u0668\u06cc\uFFFF\u0063\u006f\u006d\u0062\u0069\u006e\u0069\u006e\u0067\u005f\u0061\u0072\u0061\u0062\u0069\u0063\u005f\u0069\u006e\u0076\u0065\u0072\u0074\u0065\u0064\u005f\u0076\u0000 \u0627\u0639\u0646\u0667\u0668\u06cc\u06f7\u06f8\u0000\u0627\u0631\u0639\u0644\u0648\u064a\u06cc\u06f7\u0000\u0639\u0648\u064a\u06cc\u06f8\u0000\u0915\u0916" +
"\u0917\u091c\u0921\u0922\u0928\u092b\u092f\u0930\u0933\u0958\u0959\u095a\u095b\u095c\u095d\u0929\u095e\u095f\u0931\u0934\u0000\u09a1\u09a2\u09af\u09dc\u09dd\u09df\u0000\u09be\u09d7\u09cb\u09cc\u0000\u0a16\u0a17\u0a1c\u0a2b\u0a32\u0a38\u0a59\u0a5a\u0a5b\u0a5e\u0a33\u0a36\u0000\u0b21\u0b22\u0b5c\u0b5d\u0000\u0b3e\u0b56\u0b57\u0b4b\u0b48\u0b4c\u0000\u0bbe\u0bd7\u0bca\u0bcc\u0000\u0bbe\u0bcb\u0000\u0b92\u0b94\u0000\u0c56\u0c48\u0000" +
"\u0cd5\u0cc0\u0000\u0cc2\u0cd5\u0cd6\u0cca\u0cc7\u0cc8\u0000\u0cd5\u0ccb\u0000\u0d3e\u0d57\u0d4a\u0d4c\u0000\u0d3e\u0d4b\u0000\u0dca\u0dcf\u0ddf\u0dda\u0ddc\u0dde\u0000\u0dca\u0ddd\u0000\u0f72\u0f74\u0f80\u0f73\u0f75\u0f81\u0000\u0fb5\u0fb9\u0000\u0fb7\u0f93\u0000\u0fb7\u0f9d\u0000\u0fb7\u0fa2\u0000\u0fb7\u0fa7\u0000\u0fb7\u0fac\u0000\u0f80\u0f76\u0000\u0f80\u0f78\u0000\u0f40\u0f69\u0000\u0f42\u0f4c\u0f51\u0f56\u0f5b\u0f43\u0f4d" +
"\u0f52\u0f57\u0f5c\u0000\u1025\u1026\u0000\u1100\u1101\u0000\u1100\u1102\u1103\u1107\u1113\u1114\u1115\u1116\u0000\u1100\u1103\u1117\u1104\u0000\u1102\u1105\u110b\u1112\u1118\u1119\u111b\u111a\u0000\u1107\u110b\u111c\u111d\u0000\u1100\u1102\u1103\u1107\u1109\u110a\u110b\u110c\u110e\u1110\u1111\u112b\u112d\u112f\u1132\u1136\u111e\u111f\u1120\u1108\u1121\u1125\u112b\u1127\u1128\u1129\u112a\u112c\u1122\u1123\u1124\u1126\u0000\u110b" +
"\u0000\u1100\u1102\u1103\u1105\u1106\u1107\u1109\u110a\u110b\u110c\u110e\u110f\u1110\u1111\u1112\u111e\u112d\u112e\u112f\u1130\u1131\u1132\u110a\u1134\u1135\u1136\u1137\u1138\u1139\u113a\u113b\u1133\u0000\u1109\u0000\u1100\u1103\u1106\u1107\u1109\u110b\u110c\u110e\u1110\u1111\u1140\u1141\u1142\u1143\u1144\u1145\u1147\u1148\u1149\u114a\u114b\u1146\u0000\u110b\u110c\u114d\u110d\u0000\u110f\u1112\u1152\u1153\u0000\u1107\u110b\u1156" +
"\u1157\u0000\u1112\u1158\u0000\u1100\u1103\u1107\u1109\u110c\u0000\u1100\u0000\u113c\u113d\u0000\u113e\u113f\u0000\u114e\u114f\u0000\u1150\u1151\u0000\u1169\u116e\u1175\u1176\u1177\u1162\u0000\u1169\u116d\u1175\u1178\u1179\u1164\u0000\u1169\u116e\u1173\u1175\u117a\u117b\u117c\u1166\u0000\u1169\u116e\u1175\u117d\u117e\u1168\u0000\u1161\u1162\u1165\u1166\u1168\u1169\u116e\u1175\u116a\u116b\u117f\u1180\u1181\u1182\u1183\u116c\u0000" +
"\u1175\u0000\u1163\u1164\u1167\u1169\u1175\u1184\u1185\u1186\u1187\u1188\u0000\u1161\u1162\u1165\u1166\u1168\u116e\u1175\u117c\u1189\u118a\u116f\u1170\u118c\u118d\u1171\u118b\u0000\u1173\u1175\u0000\u1161\u1165\u1166\u1167\u1168\u116e\u1175\u118e\u118f\u1190\u1191\u1192\u1193\u1194\u0000\u116e\u1173\u1175\u1195\u1196\u1174\u0000\u116e\u1197\u0000\u1161\u1163\u1169\u116e\u1173\u119e\u1198\u1199\u119a\u119b\u119c\u119d\u0000\u1165" +
"\u116e\u1175\u119e\u119f\u11a0\u11a1\u11a2\u0000\u11a8\u11af\u11ba\u11e7\u11a9\u11c3\u11aa\u11c4\u0000\u11a8\u0000\u11a8\u11ae\u11ba\u11bd\u11c0\u11c2\u11eb\u11c5\u11c6\u11c7\u11ac\u11c9\u11ad\u11c8\u0000\u11a8\u11af\u11ca\u11cb\u0000\u11a8\u11aa\u11ab\u11ae\u11af\u11b7\u11b8\u11b9\u11ba\u11bb\u11bf\u11c0\u11c1\u11c2\u11da\u11dd\u11e5\u11e6\u11eb\u11f9\u11b0\u11cc\u11cd\u11ce\u11d0\u11b1\u11b2\u11d3\u11b3\u11d6\u11d8\u11b4\u11b5" +
"\u11b6\u11d1\u11d2\u11d4\u11d5\u11d7\u11d9\u0000\u11ba\u0000\u11a8\u11ba\u0000\u11ba\u11bc\u11c2\u0000\u11ba\u0000\u11a8\u11af\u11b8\u11ba\u11bb\u11bc\u11be\u11c2\u11eb\u11da\u11db\u11dc\u11dd\u11de\u11e2\u11e0\u11e1\u11df\u0000\u11af\u11ba\u11bc\u11c1\u11c2\u11e3\u11b9\u11e6\u11e4\u11e5\u0000\u11a8\u11ae\u11af\u11b8\u11ba\u11e7\u11e8\u11e9\u11ea\u11bb\u0000\u11a8\u11a9\u11bc\u11bf\u11ec\u11ed\u11ee\u11ef\u0000\u11b8\u11bc\u11f3" +
"\u11f4\u0000\u11ab\u11af\u11b7\u11b8\u11f5\u11f6\u11f7\u11f8\u0000\u11c2\u11cf\u0000\u11ba\u0000\u11a8\u0000\u11ba\u11eb\u11f1\u11f2\u0000|\u2395\u2347\u0000-\u2395\u2350\u0000|\u2395\u2348\u0000-\u2395\u2357\u0000/\u2204\u0000_|\u2395\u234d\u0000|~\u00a8\u2395\u2354\u0000/\u2209\u0000_\u0000/\u220c\u0000_\u00a8\u2229\u22a4\u22a5\u2395\u25cb\u235d\u2355\u234e\u233b" +
"\u233e\u0000/\u2224\u0000/\u2226\u0000~\u2228\u2395\u2353\u0000~\u2227\u2395\u234c\u0000\u2218\u0000|\u0000/\u2241\u0000/\u2244\u0000/\u2249\u0000/\u226d\u0000_\u2395\u236f\u0000/\u0000/\u2270\u0000/\u2271\u0000/\u2274\u0000/\u2275\u0000/\u2278\u0000/\u2279\u0000/\u2280\u0000/\u2281\u0000/\u22e0\u0000/\u22e1\u0000/_" +
"|\u2284\u0000/_\u2285\u0000/\u2288\u0000/\u2289\u0000/\u22e2\u0000/\u22e3\u0000/\u22ac\u0000\u00a8\u00af\u2218\u22a5\u2336\u0000_\u2218\u22a4\u0000/\u22ad\u0000/\u22ae\u0000/\u22af\u0000/\u22ea\u0000/\u22eb\u0000/\u22ec\u0000/\u22ed\u0000_\u2395\u233a\u0000_\u0000_\u0000_\u0000'/:<=>?\\\u00f7" +
"\u2190\u2191\u2192\u2193\u2206\u2207\u2218\u2227\u2228\u2260\u22c4\u25cb\u233c\u0000*-.\\_|\u00a8\u2218\u2395\u0000/\u2adc\u0000 !\"%'()*,-.0123456789:<=>?[]^_abcehlopruyz{|}" +
"\u00a3\u00a7\u00b1\u00d7\u0398\u03a0\u03a3\u03b2\u03b3\u03b5\u03b8\u03ba\u03c0\u03c1\u03c3\u03c5\u03c6\u0430\u0435\u0437\u0438\u0439\u043b\u043c\u043d\u043e\u0441\u0443\u0447\u0448\u044a\u044b\u044c\u044d\u044f\u0456\u0458\u045f\u0461\u0481\u0487\u049b\u04b7\u04c8\u0513\u05d1\u05d3\u05d5\u05d6\u05d7\u05dd\u05e1\u05e3\u05e4\u05e6\u05e7\u05e8\u05e9\u0625\u0626\u0627\u0628\u0629\u062b\u062d\u0631\u0632\u0633\u0635\u0637\u0639\u063a" +
"\u063d\u0641\u0642\u0643\u0644\u0646\u0647\u064a\u064f\u0650\u0660\u0661\u0662\u0663\u0664\u0665\u0666\u0667\u0668\u0669\u06a1\u06a9\u06c6\u06c9\u06cc\u06ce\u06f0\u06f1\u06f2\u06f3\u06f4\u06f5\u06f6\u06f7\u06f8\u06f9\u0901\u0902\u0905\u0906\u0907\u0908\u0909\u090a\u090b\u090c\u090f\u0910\u0913\u0914\u0915\u0916\u0917\u0918\u091a\u091b\u091c\u091d\u091f\u0921\u0922\u0923\u0925\u0926\u0928\u092a\u092b\u092c\u092f\u0930\u0933\u0935" +
"\u0936\u0937\u093c\u093d\u093e\u093f\u0940\u0941\u0943\u0947\u0948\u094b\u094c\u0953\u0956\u0962\u0964\u0970\u0b92\u0b9a\u0baf\u0bb3\u0bb5\u2020\u20ac\u20b9\u2190\u2191\u2192\u2193\u2194\u2195\u2196\u2197\u2198\u2199\u2203\u2206\u2207\u2227\u2228\u2229\u222a\u222b\u2282\u2283\u22a4\u22b7\u22c4\u235d\u2375\u237a\u2395\ua649\ua651\ua67d\uFFFF\u006e\u0062\u0073\u0070\uFFFF\u0066\u0031\u0030\uFFFF\u0066\u0031\uFFFF\u0066\u0032\uFFFF" +
"\u0066\u0033\uFFFF\u0066\u0034\uFFFF\u0066\u0035\uFFFF\u0066\u0036\uFFFF\u0066\u0037\uFFFF\u0066\u0038\uFFFF\u0066\u0039\uFFFF\u007a\u0077\u006e\u006a\u20b1\u20b4\u20bf\uFFFF\u0072\u0065\u006d\u006f\u0076\u0065\u0064\u2213\u2219\u03f4\u220f\u2211\u03d0\u0263\u03f5\u03d1\u03f0\u03d6\u03f1\u03c2\u03d2\u03d5\u0465\uFFFF\ua641\u0456\u0458\u046b\u0467\u047b\u0455\uFFFF\ua64b\u044c\uFFFF\ua651\u044a\u0454\u0438\uFFFF\ua66f\uFFFF\u0068" +
"\u0061\u0074\u0061\u0066\u005f\u0073\u0065\u0067\u006f\u006c\uFFFF\u0064\u0061\u0067\u0065\u0073\u0068\uFFFF\u0068\u006f\u006c\u0061\u006d\uFFFF\u0071\u0075\u0062\u0075\u0074\u0073\uFFFF\u0068\u0069\u0072\u0069\u0071\uFFFF\u0072\u0061\u0066\u0065\uFFFF\u0073\u0065\u0067\u006f\u006c\uFFFF\u0068\u0061\u0074\u0061\u0066\u005f\u0070\u0061\u0074\u0061\u0068\uFFFF\u0070\u0061\u0074\u0061\u0068\uFFFF\u0074\u0073\u0065\u0072\u0065\uFFFF" +
"\u0071\u0061\u006d\u0061\u0074\u0073\uFFFF\u0068\u0061\u0074\u0061\u0066\u005f\u0071\u0061\u006d\u0061\u0074\u0073\uFFFF\u0073\u0068\u0065\u0076\u0061\u066e\u067e\u06c1\u0698\u0640\u0636\u0638\u0621\u06a4\u063a\u06a9\u06ba\u06be\u06cc\u0643\u064a\u0900\u0955\u0972\u0911\u0973\u0974\u0976\u0977\u0960\u0961\u090d\u090e\u0912\u0975\u097b\u097c\uFFFF\u0936\u094d\u091a\u0979\u0978\u097e\uFFFF\u0924\u094d\u0930\uFFFF\u0926\u094d\u0930" +
"\uFFFF\u092a\u094d\u0930\u097f\u097a\uFFFF\u0936\u094d\u0930\uFFFF\u0915\u094d\u0937\u094e\u097d\u0949\u093a\u093b\u0904\u0944\u0945\u0946\u094a\u094f\u0954\u0957\u0963\u0965\u0971\uFFFF\u0bd0\uFFFF\u0bf2\uFFFF\u0bf0\uFFFF\u0bf1\uFFFF\u0bf3\u21d4\u21d5\u21d6\u21d7\u21d8\u21d9\u22c0\u22c1\u22c2\u22c3\u222e\u22b6\u044b\u0483\u00000123456789\u09e6\u09e7\u09e8\u09e9\u09ea\u09eb\u09ec" +
"\u09ed\u09ee\u09ef\u00000123456789\u0966\u0967\u0968\u0969\u096a\u096b\u096c\u096d\u096e\u096f\u00000123456789\u0ae6\u0ae7\u0ae8\u0ae9\u0aea\u0aeb\u0aec\u0aed\u0aee\u0aef\u00000123456789\u0660\u0661\u0662\u0663\u0664\u0665\u0666\u0667\u0668\u0669\u000001234" +
"56789\u0ce6\u0ce7\u0ce8\u0ce9\u0cea\u0ceb\u0cec\u0ced\u0cee\u0cef\u00000123456789\u06f0\u06f1\u06f2\u06f3\u06f4\u06f5\u06f6\u06f7\u06f8\u06f9\u00000123456789\u0be6\u0be7\u0be8\u0be9\u0bea\u0beb\u0bec\u0bed\u0bee\u0bef\u0000\u00df\u0131\u01f0\u0237\u02b0\u02b2\u02b3\u02b7\u02e1\u0905\u0907\u0909\u090b\u090c" +
"\u090f\u0913\u0915\u0917\u091a\u091c\u091f\u0921\u0924\u0926\u0928\u092c\u092e\u0932\u0938\u0939\u093f\u0941\u0943\u0945\u0947\u0949\u094b\u0952\u0962\u0a85\u0a87\u0a89\u0a8f\u0a93\u0a95\u0a97\u0a9a\u0a9c\u0a9f\u0aa1\u0aa4\u0aa6\u0aa8\u0aaa\u0aac\u0aae\u0ab2\u0ab8\u0ab9\u0abf\u0ac1\u0ac7\u0acb\u0bf9\u1d43\u1d47\u1d48\u1d49\u1d4d\u1d4f\u1d50\u1d52\u1d56\u1d57\u1d58\u1d5b\u1d60\u1d9c\u1da0\u1dbe\u1e97\u1e98\u1e99\u2071\u207f\u20b9" +
"\u2190\u2191\u2192\u2193\u2196\u2197\u2198\u2199\u2208\u220b\u2282\u2283\u2286\u2287\u2500\u2502\u250c\u2510\u2514\u2518\u251c\u2524\u252c\u2534\u253c\ud835\uFFFF\u004a\u030c\uFFFF\u004a\u0307\u1d34\u1d36\u1d3f\u1d42\u1d38\u0906\u0908\u090a\u0910\u0914\u0916\u0918\u091b\u091d\u0920\u0922\u0925\u0927\u0923\u092d\u0902\u0933\u0936\u0903\u0940\u0942\u0948\u094c\u0951\u0a86\u0a88\u0a8a\u0a90\u0a94\u0a96\u0a98\u0a9b\u0a9d\u0aa0\u0aa2" +
"\u0aa5\u0aa7\u0aa3\u0aab\u0aad\u0a82\u0ab3\u0ab6\u0a83\u0ac0\u0ac2\u0ac8\u0acc\u1d2c\u1d2e\u1d30\u1d31\u1d33\u1d37\u1d39\u1d3c\u1d3e\u1d40\u1d41\u2c7d\u1db2\uFFFF\ua7f2\uFFFF\ua7f3\u1d23\uFFFF\u0054\u0308\uFFFF\u0057\u030a\uFFFF\u0059\u030a\u1d35\u1d3a\u2550\u2551\u2554\u2557\u255a\u255d\u2560\u2563\u2566\u2569\u256c\u0000\udd57\udd58\udd64\udd68\udd69\uFFFF\ud835\udd3d\uFFFF\ud835\udd3e\uFFFF\ud835\udd4a\uFFFF\ud835\udd4e\uFFFF" +
"\ud835\udd4f").toCharArray();
public static final char[] edges =
("\u0001\u0036\u0037\u0038\u0039\u003a\u003b\u003c\u003f\u0040\u0041\u0042\u0043\u0044\u0045\u0046\u0047\u0048\u0049\u004a\u004b\u004c\u004d\u004e\u004f\u0050\u0051\u0052\u0053\u0054\u0055\u0056\u0059\u005a\u005b\\\u005d\u005e\u005f\u0060\u0061\u0062\u0063\u0064\u0067\u0068\u006b\u006e\u006f\u0072\u0075\u0078\u007b\u007e\u0081\u0001\u0001\u0001\u0001\u0001\u0003\u0000\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001" +
@ -142,10 +142,10 @@ public final class ComposeKeyData
"\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0002\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0002\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0002\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0012\u048a\u048b\u048c\u048d\u048e\u048f\u0490" +
"\u0491\u0180\u0199\u0052\u0492\u005b\u0493\u032d\u02ff\u0300\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u002f\u04c3\u04c4\u04c5\u04c8\u04c9\u04ca\u04cb\u04ce\u04d1\u04d4\u04d7\u04da\u04db\u04de\u04df\u04e0\u04e1\u04e2\u04e3\u04e4\u0050\u0492\u02c5\u0054\u032b\u032e\u032f\u0115\u04e5\u04e6\u04e7\u04e8\u04e9\u04ea\u04eb\u04ec\u04ed\u04ee\u04ef\u04f0\u04f1\u04f2\u00cf\u04f3\u04f4\u04f5\u0001\u0001\u0003\u0000\u0000" +
"\u0001\u0001\u0001\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0001\u0003\u0000\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0136\u062c\u063d\u0689\u06f5\u0704\u0707\u083c\u0bf4\u0c15\u0c24\u0c2f\u0c6f\u0cae\u0d24\u0d66\u0d6c\u0d82\u0d88\u0d90\u0d93\u0d98\u0d9b\u0d9e\u0da8\u0dbf" +
"\u0dec\u0e1f\u0e3e\u0e7d\u0e97\u0e9b\u0eac\u0eb4\u0ec7\u0ed5\u0ee0\u0ee2\u0ef5\u0ef8\u0efb\u0f0d\u0f0f\u0f1f\u0f3c\u0f44\u0f48\u0f53\u0f62\u0f6f\u0fc5\u0fca\u0fce\u0fd0\u0fd8\u0fdf\u0fe2\u0ff7\u0ff9\u108e\u1135\u121e\u1231\u125b\u1292\u129c\u12ad\u12bb\u12c7\u12c9\u12d9\u12dc\u12e0\u12e8\u12ec\u12f8\u1313\u131d\u1322\u132e\u1338\u1353\u1376\u1378\u137c\u1383\u1387\u138a\u13a6\u1422\u143d\u148c\u154e\u1566\u1569\u156c\u156e\u1570" +
"\u1572\u1575\u1577\u157a\u157c\u157e\u1580\u1582\u162d\u162f\u1632\u1634\u1636\u1638\u163b\u163d\u165a\u1675\u167e\u168b\u169d\u169f\u16a3\u16a7\u16ba\u16c2\u16c7\u16c9\u16e0\u16ff\u1703\u1709\u1723\u1740\u179a\u179d\u179f\u17a9\u17ad\u17b2\u17b8\u17ba\u17bc\u17c0\u17c7\u17cb\u17cf\u1812\u181c\u1826\u1830\u1865\u186e\u1871\u1883\u1889\u188c\u188e\u18c8\u18cc\u18cf\u18d2\u18e9\u1928\u1945\u1961\u197d\u1980\u1989\u198b\u19a7\u19c9" +
"\u19d3\u19dc\u19e2\u19f9\u1a00\u1a05\u1a12\u1a17\u1a1e\u1a23\u1a26\u1a29\u1a2c\u1a2f\u1a36\u1a39\u1a3e\u1a41\u1a48\u1a4b\u1a52\u1a55\u1a58\u1a5b\u1a5e\u1a61\u1a64\u1a67\u1a6a\u1a6d\u1a78\u1a7b\u1a7e\u1a87\u1a8c\u1a95\u1a9a\u1abb\u1abd\u1ade\u1ae0\u1af7\u1afc\u1b01\u1b06\u1b09\u1b0f\u1b11\u1b14\u1b17\u1b1a\u1b1d\u1b24\u1b2b\u1b34\u1b3b\u1b4c\u1b4e\u1b59\u1b6a\u1b6d\u1b7c\u1b83\u1b86\u1b93\u1b9c\u1ba5\u1ba7\u1bb6\u1bbb\u1be4\u1be6" +
"\u1be9\u1bed\u1bef\u1c02\u1c0d\u1c18\u1c21\u1c26\u1c2f\u1c32\u1c34\u1c36\u1c3b\u1c3f\u1c43\u1c47\u1c4b\u1c4e\u1c53\u1c59\u1c5c\u1c5e\u1c61\u1c6e\u1c71\u1c74\u1c79\u1c7e\u1c80\u1c82\u1c85\u1c88\u1c8b\u1c8e\u1c92\u1c94\u1c97\u1c9a\u1c9d\u1ca0\u1ca3\u1ca6\u1ca9\u1cac\u1caf\u1cb2\u1cb7\u1cbb\u1cbe\u1cc1\u1cc4\u1cc7\u1cca\u1cd0\u1cd4\u1cd7\u1cda\u1cdd\u1ce0\u1ce3\u1ce6\u1ce9\u1ced\u1cef\u1cf1\u1cf3\u1d0a\u1d14\u0009\u0635\u0636\u0637" +
"\u0dec\u0e1f\u0e3e\u0e7d\u0e97\u0e9b\u0eac\u0eb4\u0ec7\u0ed5\u0ee0\u0ee2\u0ef5\u0ef8\u0efb\u0f0d\u0f0f\u0f1f\u0f3c\u0f44\u0f48\u0f53\u0f62\u0f6f\u0fc5\u0fca\u0fce\u0fd0\u0fd8\u0fdf\u0fe2\u0ff7\u0ff9\u108e\u1135\u121e\u1231\u125b\u1292\u129c\u12ad\u12bb\u12c7\u12c9\u12d9\u12dc\u12e0\u12e8\u12ec\u12f3\u130e\u1318\u131d\u1329\u1333\u134e\u1371\u1373\u1377\u137e\u1382\u1385\u13a1\u141d\u1438\u1487\u1549\u1561\u1564\u1567\u1569\u156b" +
"\u156d\u1570\u1572\u1575\u1577\u1579\u157b\u157d\u1628\u162a\u162d\u162f\u1631\u1633\u1636\u1638\u1655\u1670\u1679\u1686\u1698\u169a\u169e\u16a2\u16b5\u16bd\u16c2\u16c4\u16db\u16fa\u16fe\u1704\u171e\u173b\u1795\u1798\u179a\u17a4\u17a8\u17ad\u17b3\u17b5\u17b7\u17bb\u17c2\u17c6\u17ca\u180d\u1817\u1821\u182b\u1860\u1869\u186c\u187e\u1884\u1887\u1889\u18c3\u18c7\u18ca\u18cd\u18e4\u1923\u1940\u195c\u1978\u197b\u1984\u1986\u19a2\u19c4" +
"\u19ce\u19d7\u19dd\u19f4\u19fb\u1a00\u1a0d\u1a12\u1a19\u1a1e\u1a21\u1a24\u1a27\u1a2a\u1a31\u1a34\u1a39\u1a3c\u1a43\u1a46\u1a4d\u1a50\u1a53\u1a56\u1a59\u1a5c\u1a5f\u1a62\u1a65\u1a68\u1a73\u1a76\u1a79\u1a82\u1a87\u1a90\u1a95\u1ab6\u1ab8\u1ad9\u1adb\u1af2\u1af7\u1afc\u1b01\u1b04\u1b0a\u1b0c\u1b0f\u1b12\u1b15\u1b18\u1b1f\u1b26\u1b2f\u1b36\u1b47\u1b49\u1b54\u1b65\u1b68\u1b77\u1b7e\u1b81\u1b8e\u1b97\u1ba0\u1ba2\u1bb1\u1bb6\u1bdf\u1be1" +
"\u1be4\u1be8\u1bea\u1bfd\u1c08\u1c13\u1c1c\u1c21\u1c2a\u1c2d\u1c2f\u1c31\u1c36\u1c3a\u1c3e\u1c42\u1c46\u1c49\u1c4e\u1c54\u1c57\u1c59\u1c5c\u1c69\u1c6c\u1c6f\u1c74\u1c79\u1c7b\u1c7d\u1c80\u1c83\u1c86\u1c89\u1c8d\u1c8f\u1c92\u1c95\u1c98\u1c9b\u1c9e\u1ca1\u1ca4\u1ca7\u1caa\u1cad\u1cb2\u1cb6\u1cb9\u1cbc\u1cbf\u1cc2\u1cc5\u1ccb\u1ccf\u1cd2\u1cd5\u1cd8\u1cdb\u1cde\u1ce1\u1ce4\u1ce8\u1cea\u1cec\u1cee\u1d05\u1d0f\u0009\u0635\u0636\u0637" +
"\u0638\u0639\u063a\u063b\u063c\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u002f\u066c\u066d\u0674\u0675\u0676\u0677\u0678\u0679\u067a\u067b\u067c\u067d\u067e\u067f\u0680\u0681\u0682\u0683\u0684\u0685\u0686\u0687\u0688\u023e\u023f\u0240\u0241\u0242\u0243\u0244\u0245\u0246\u0247\u0248\u0249\u024a\u024b\u024c\u024d\u024e\u024f\u0250\u0672\u0252\u0673\u0253\u0001\u0005\u0672\u0673\u0252\u0253\u0001\u0001\u0001\u0001\u0001\u0001" +
"\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0041\u06ca\u06ca\u06cb\u06cc\u06cd\u06ce\u06cf\u06d0\u06d1\u06d2\u06d3\u06d4\u06d5\u06d6\u06d7\u06d8\u04c4\u04c8\u04c9\u04ca\u04da\u04de\u04df\u04e0\u04e1\u04e2\u06dd\u06e1\u06cb\u06e0\u0492\u06db\u06dc\u06e4\u06e5\u04e5\u04e6\u04e8\u06e6\u06e7\u06e8\u06e9\u06ea\u06eb\u06ec\u06ed\u06ee\u06ef\u06f0\u04e9\u06f1\u04ea\u04eb\u04ec" +
"\u04ed\u04ee\u04ef\u04f0\u04f1\u06f2\u06f3\u04f2\u06f4\u00cf\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u06db\u06dc\u0001\u0001\u0003\u06e0\u0492\u0001\u0003\u06db\u06dc\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0008\u06fd\u06fe\u06ff\u0700\u0701\u0702\u0703\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0002\u0706\u0001\u007b" +
@ -191,56 +191,56 @@ public final class ComposeKeyData
"\u0001\u0001\u0001\u0001\u0003\u0000\u0000\u0001\u0001\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0012\u04c4\u0037\u0fab\u0362\u033f\u031e\u033f\u0170\u0e93\u0170\u031e\u02b7\u0362\u1230\u048a\u04c4\u0037\u0001\u0021\u1252\u1255\u01ee\u0e92\u0fa6\u0edd\u0fa7\u0fa8\u0fa9\u0fab\u0fac\u0fad\u0fae\u0faf\u0fb0\u1258\u0fb5\u0fb6\u0fb7\u0fb8\u0fb9\u0fba" +
"\u0fbb\u0fbc\u0fbd\u0fbe\u0fbf\u0fc0\u0fc1\u0fc2\u0fc3\u0fc4\u0003\u0fa5\u0251\u0003\u0fa1\u0149\u0003\u0fa1\u0149\u002c\u1287\u0038\u013e\u01ef\u0d58\u0105\u0e0f\u128b\u0de2\u0de3\u0de4\u128c\u128d\u128e\u128f\u0de5\u0de6\u1290\u0de7\u0de8\u0de9\u1291\u0dea\u0104\u0105\u0106\u0107\u0108\u0109\u010a\u010b\u010c\u010d\u010e\u010f\u0110\u0111\u0112\u0113\u0114\u0d58\u128a\u0115\u0003\u128a\u0115\u0001\u0001\u0001\u0001\u0001\u0001" +
"\u0001\u0001\u0008\u013f\u00b7\u01f0\u0106\u0e1b\u129a\u129b\u0001\u0001\u0010\u04c8\u0039\u0340\u031f\u01f1\u0340\u0107\u0e0f\u0172\u0172\u031f\u02b8\u12ac\u04c8\u0039\u0001\u0007\u01f2\u12b4\u12b5\u12b7\u12b9\u12b4\u0001\u0002\u0000\u0002\u0000\u0002\u0000\u0009\u0fad\u0141\u01f3\u0fad\u0ede\u0edd\u12c4\u0fad\u0003\u0000\u0000\u0002\u0142\u000f\u04ca\u003b\u0341\u0321\u01f5\u0341\u0175\u0175\u0321\u02b9\u12d8\u048c\u04ca\u003b" +
"\u0001\u0003\u003c\u003c\u0003\u0143\u12df\u0001\u0008\u0040\u0144\u0ca6\u0380\u010d\u0f0c\u0d57\u0004\u01fd\u0d59\u0d5a\u0006\u0042\u0145\u010e\u12f2\u048d\u0002\u12f4\u0004\u0000\u0000\u0000\u001a\u04da\u0043\u0342\u0325\u0383\u0342\u0177\u0c21\u0c22\u0177\u0325\u02bb\u0362\u0ea9\u1312\u0351\u0f36\u0f37\u0363\u0364\u0f38\u0365\u048e\u04da\u0043\u0001\u0005\u0f42\u0200\u0e13\u1318\u0002\u131a\u0003\u0000\u0000\u0005\u0045\u0146" +
"\u0110\u0e14\u000b\u0f37\u0046\u0147\u0205\u0dbd\u0111\u0f5f\u0f37\u132d\u0147\u0001\u0009\u0148\u00c6\u0206\u00c6\u0dbe\u0112\u1337\u0f6e\u0001\u001b\u04df\u0047\u0363\u0343\u0329\u0d5a\u0343\u0178\u0e92\u0fa6\u0edd\u0fa7\u0fa8\u0fa9\u0178\u0329\u02bf\u0fab\u0fac\u0fad\u0fae\u0faf\u0fb0\u048f\u04df\u0047\u0023\u0d5b\u128b\u0de2\u0de3\u0de4\u128c\u128d\u128e\u128f\u0de6\u1290\u0de7\u0de8\u0de9\u1291\u0dea\u0104\u0105\u0106\u0107" +
"\u0108\u0109\u010a\u010b\u010c\u0d57\u010e\u010f\u0110\u0111\u0112\u0113\u0114\u0091\u0002\u0179\u0003\u0f38\u137b\u0001\u0007\u04e2\u0049\u0e18\u017d\u04e2\u0049\u0004\u004a\u0210\u0114\u0002\u1389\u0001\u0012\u139c\u139d\u0e9a\u0eab\u0edf\u0f61\u0097\u0d58\u0091\u139e\u139f\u13a0\u13a1\u13a2\u13a3\u13a4\u13a5\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u002f\u13d5\u13d9\u13ee\u1401\u0d6b\u0e96\u1408\u0ef4\u0f1e" +
"\u0f3b\u0fb1\u1409\u140a\u140b\u048a\u1415\u048b\u048c\u048d\u048e\u048f\u0490\u0491\u139e\u1419\u04e3\u1412\u1413\u1414\u0180\u0199\u0183\u1418\u0493\u1406\u02ff\u1407\u0300\u141a\u141b\u141c\u141d\u141e\u141f\u1420\u1421\u0003\u13d8\u04f4\u0001\u000b\u13e4\u13e5\u13e6\u13e7\u13e8\u13e9\u13ea\u13eb\u13ec\u13ed\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\n\u13f8\u13f9\u13fa\u13fb\u13fc\u13fd\u13fe\u13ff\u1400" +
"\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0005\u1406\u1407\u02ff\u0300\u0001\u0001\u0001\u0001\u0001\u0007\u1412\u1413\u1414\u0180\u0199\u0183\u0001\u0001\u0001\u0003\u1418\u0493\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0017\u078a\u04c3\u0e3c\u06cf\u06d0\u06d2\u06d3\u06d4\u06d7\u1439\u04c4\u04c8\u04ca\u04da\u04df\u04e2\u143a\u078a\u04f5\u04e4\u143b\u143c\u0001\u0001\u0001\u0001\u0037\u1474\u1479" +
"\u1480\u1485\u0ca1\u0ca3\u1105\u0ca4\u0ca7\u0ca8\u1106\u031e\u031f\u0320\u0321\u0325\u0329\u032a\u1488\u10f4\u110b\u110a\u10f5\u10f6\u032b\u032c\u032d\u032e\u032f\u10ff\u0212\u110c\u110d\u110e\u0331\u0332\u0333\u110f\u1112\u1115\u1116\u1119\u111c\u111d\u1120\u0334\u1123\u1126\u0335\u10eb\u0336\u10ec\u0337\u148b\u0005\u10eb\u10ec\u0336\u0337\u0007\u10f4\u10f5\u10f6\u032b\u032e\u032f\u0005\u10ff\u1100\u0212\u0213\u0003\u1104\u0330" +
"\u0003\u110a\u032d\u0001\u0077\u1503\u150a\u1519\u1527\u152c\u152f\u07d5\u07d6\u07d7\u07d8\u07d9\u07da\u07dd\u07de\u07df\u07e0\u07e1\u07e2\u07e3\u07e4\u07e5\u07e6\u07e7\u07e8\u1532\u1539\u0037\u153e\u0038\u0039\u003a\u003b\u003c\u003f\u0040\u0041\u0042\u0043\u0044\u0045\u0046\u0047\u0048\u0049\u004a\u1541\u1546\u154b\u07f0\u080e\u080f\u080d\u07f1\u078b\u07f2\u0803\u07d2\u078c\u004b\u004c\u004d\u004e\u004f\u0050\u0051\u0052\u0053" +
"\u0054\u07fd\u0055\u07f8\u0059\u07f9\u005a\u0804\u005b\u07cc\\\u07cd\u005d\u0810\u0811\u0812\u0813\u0814\u0815\u0816\u005e\u005f\u0060\u0061\u0062\u0063\u0817\u0818\u081b\u081c\u081f\u0822\u0823\u0826\u0829\u082c\u082f\u0832\u0835\u0064\u0067\u0068\u006b\u006e\u006f\u0838\u0072\u0075\u0078\u007b\u007e\u0007\u078b\u078c\u0050\u0054\u078d\u04e7\u000f\u079e\u079f\u07a0\u07a1\u07a2\u07a3\u07a4\u07a5\u07a6\u07a7\u07a8\u07a9\u07aa" +
"\u07ab\u000e\u07ba\u07bb\u07bc\u07bd\u07be\u07bf\u07c0\u07c1\u07c2\u07c3\u07c4\u07c5\u07c6\u0005\u07cc\u07cd\\\u005d\u0003\u080d\u004e\u0003\u07d2\u0053\u0007\u07f0\u07f1\u07f2\u004b\u004f\u0051\u0005\u07f8\u07f9\u0059\u005a\u0003\u07fd\u0055\u0005\u0803\u0804\u0052\u005b\u0005\u07f8\u07f9\u0059\u005a\u0003\u080d\u004e\u0017\u0c5b\u0c5c\u1565\u0c5e\u0c5f\u0c61\u0c62\u0c63\u0c65\u0c66\u0c67\u013e\u013f\u0140\u0141\u0142\u0143" +
"\u0144\u0145\u0146\u0147\u0148\u0001\u0002\u1568\u0001\u0003\u0edd\u0fad\u0002\u0810\u0002\u0811\u0002\u0812\u0003\u06e4\u0813\u0002\u0814\u0003\u06e5\u0815\u0002\u0816\u0002\u005e\u0002\u005f\u0002\u0060\u000e\u04e5\u1590\u15b3\u15c0\u15cd\u15f0\u1613\u1627\u1628\u1629\u162a\u162b\u162c\u0006\u1596\u15a3\u15b0\u15b1\u15b2\u0007\u159d\u159e\u159f\u15a0\u15a1\u15a2\u0001\u0001\u0001\u0001\u0001\u0001\u0007\u15aa\u15ab\u15ac\u15ad" +
"\u15ae\u15af\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0007\u15ba\u15bb\u15bc\u15bd\u15be\u15bf\u0001\u0001\u0001\u0001\u0001\u0001\u0007\u15c7\u15c8\u15c9\u15ca\u15cb\u15cc\u0001\u0001\u0001\u0001\u0001\u0001\u0006\u15d3\u15e0\u15ed\u15ee\u15ef\u0007\u15da\u15db\u15dc\u15dd\u15de\u15df\u0001\u0001\u0001\u0001\u0001\u0001\u0007\u15e7\u15e8\u15e9\u15ea\u15eb\u15ec\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001" +
"\u0006\u15f6\u1603\u1610\u1611\u1612\u0007\u15fd\u15fe\u15ff\u1600\u1601\u1602\u0001\u0001\u0001\u0001\u0001\u0001\u0007\u160a\u160b\u160c\u160d\u160e\u160f\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0006\u1619\u1620\u15b0\u15b1\u15b2\u0007\u159d\u159e\u159f\u15a0\u15a1\u15a2\u0007\u15aa\u15ab\u15ac\u15ad\u15ae\u15af\u0001\u0001\u0001\u0001\u0001\u0001\u0002\u0062\u0003\u04e6\u0063\u0002\u0817\u0002\u0e0f\u0002\u0e13" +
"\u0003\u0f1d\u0f1d\u0002\u0e0f\u0008\u1645\u1646\u1647\u1645\u1656\u1658\u1645\u0001\u0001\u000f\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0002\u0000\u0002\u0000\u0002\u165c\u0019\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0007\u0c69\u0d1b\u0d5f\u167c\u167d\u0d5f\u0001\u0001\u0007\u1685" +
"\u1687\u1688\u1685\u1685\u168a\u0002\u0000\u0001\u0002\u0000\u0001\u0002\u168d\u0010\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0002\u0d1c\u0003\u0e13\u16a2\u0001\u0003\u0334\u16a6\u0001\u0003\u0d1d\u16aa\u0010\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0007\u0c6a\u0d1e\u167c\u16c1\u167d\u16c1\u0001\u0004\u0c6b\u0d1f\u16c6\u0001\u0002" +
"\u0d20\u0005\u0c6c\u16ce\u16cf\u16df\u0001\u0010\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0004\u16e4\u16e5\u16e6\u0001\u0001\u0019\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0003\u0f37\u1702\u0001\u0004\u1707\u1708\u1707\u0001\u0001\u0007\u16a6\u0fc4\u0335\u1710\u16a6\u0fc4" +
"\u0013\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0004\u0c6d\u0d21\u1727\u0019\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u000f\u0d22\u1647\u165c\u168d\u16aa\u16cf\u16e6\u1710\u1727\u174f\u1761\u177a\u16aa\u178a\u0012\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000" +
"\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0019\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0010\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0010\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0002\u179c\u0001\u0002\u1761\u0006" +
"\u17a5\u06f1\u17a7\u17a8\u177a\u0002\u0000\u0001\u0001\u0002\u17ab\u0002\u0000\u0005\u06f2\u06f2\u16a6\u0334\u0004\u17b6\u16aa\u17ab\u0002\u0000\u0002\u16e4\u0002\u178a\u0002\u17be\u0002\u0000\u0003\u17c3\u17c5\u0002\u0000\u0002\u0000\u0002\u17c9\u0002\u0000\u0002\u17cd\u0002\u0000\u0017\u17e6\u17e8\u17ea\u17ec\u17ee\u17f0\u17f2\u17f4\u17f6\u17f8\u17fa\u17fc\u17fe\u1800\u1802\u1804\u1806\u1808\u180a\u180c\u180e\u1810\u0002\u0000" +
"\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0004\u1816\u1818\u181a\u0002\u0000\u0002\u0000\u0002\u0000\u0004\u1820\u1824\u1822\u0002\u1822\u0002\u0000\u0002\u0000\u0004\u182a\u182e\u182c\u0002\u182c\u0002\u0000\u0002\u0000" +
"\u0008\u1838\u184d\u184e\u184f\u1850\u184f\u1850\u0015\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0001\u0001\u0015\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0005\u186a\u186b\u186c\u186d\u0001\u0001\u0001\u0001\u0002\u1870\u0001\u0002\u1873\u0010\u0000\u0000\u0000\u0000" +
"\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0004\u186b\u1887\u1888\u0001\u0001\u0002\u188b\u0001\u0002\u186c\n\u1898\u1899\u189a\u189b\u189c\u18b2\u189b\u189c\u18b2\u0001\u0001\u0001\u0001\u0016\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0016\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000" +
"\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0003\u18cb\u18cb\u0001\u0002\u18ce\u0001\u0002\u18d1\u0001\u0004\u18d6\u18e8\u18e8\u0012\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0006\u186d\u18ef\u1902\u1915\u1915\u0013\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0013\u0000\u0000\u0000\u0000\u0000" +
"\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0013\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0009\u1931\u1932\u1899\u18ef\u1933\u1943\u1944\u1944\u0001\u0001\u0010\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0001\n\u194f\u189a\u18ce\u1902\u1950\u1943\u184e\u1943\u184e\u0001" +
"\u0011\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\n\u196b\u196c\u189b\u1915\u196d\u1944\u184f\u1944\u184f\u0001\u0001\u0010\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0002\u197f\u0001\u0007\u184d\u189a\u189b\u1987\u1988\u1899\u0001\u0001\u0002\u1898\u0009\u1850\u1888\u189c\u18e8\u1943\u1944\u1994\u1944\u0013\u0000\u0000\u0000" +
"\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0006\u18b2\u184e\u184f\u19ad\u184f\u001c\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\n\u196b\u196c\u189b\u1915\u1944\u184f\u196d\u1944\u184f\u0009\u1850\u1888\u189c\u18e8\u1943\u1944\u1944\u1994\u0006\u18b2\u184e\u184f" +
"\u184f\u19ad\u000c\u19ee\u19ef\u19f0\u19f1\u19f2\u19f3\u19f4\u19f5\u19f6\u19f7\u19f8\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0004\u19fd\u19fe\u19ff\u0001\u0001\u0001\u0003\u1a03\u1a04\u0001\u0001\u0007\u1a0c\u1a0d\u1a0e\u1a0f\u1a10\u1a11\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u1a15\u1a16\u0001\u0001\u0004\u1a1b\u1a1c\u1a1d\u0001\u0001\u0001\u0003\u1a21\u1a22\u0001\u0001\u0002\u1a25\u0001\u0002\u1a28" +
"\u0001\u0002\u1a2b\u0001\u0002\u1a2e\u0001\u0004\u1a33\u1a34\u1a35\u0001\u0001\u0001\u0002\u1a38\u0001\u0003\u1a3c\u1a3d\u0001\u0001\u0002\u1a40\u0001\u0004\u1a45\u1a46\u1a47\u0001\u0001\u0001\u0002\u1a4a\u0001\u0004\u1a4f\u1a50\u1a51\u0001\u0001\u0001\u0002\u1a54\u0001\u0002\u1a57\u0001\u0002\u1a5a\u0001\u0002\u1a5d\u0001\u0002\u1a60\u0001\u0002\u1a63\u0001\u0002\u1a66\u0001\u0002\u1a69\u0001\u0002\u1a6c\u0001\u0006\u1a73\u1a74" +
"\u1a75\u1a76\u1a77\u0001\u0001\u0001\u0001\u0001\u0002\u1a7a\u0001\u0002\u1a7d\u0001\u0005\u1a83\u1a84\u1a85\u1a86\u0001\u0001\u0001\u0001\u0003\u1a8a\u1a8b\u0001\u0001\u0005\u1a91\u1a92\u1a93\u1a94\u0001\u0001\u0001\u0001\u0003\u1a98\u1a99\u0001\u0001\u0011\u1aab\u1aac\u1aad\u1aae\u1aaf\u1ab0\u1ab1\u1ab2\u1ab3\u1ab4\u1ab5\u1ab6\u1ab7\u1ab8\u1ab9\u1aba\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001" +
"\u0001\u0001\u0001\u0002\u1ab6\u0011\u1ace\u1acf\u1ad0\u1ad1\u1ad2\u1ad3\u1ad4\u1ad5\u1ad6\u1ad7\u1ad8\u1ad9\u1ada\u1adb\u1adc\u1add\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0002\u1ad5\u000c\u1aec\u1aed\u1aee\u1aef\u1af0\u1af1\u1af2\u1af3\u1af4\u1af5\u1af6\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u1afa\u1afb\u0001\u0001\u0003\u1aff\u1b00\u0001" +
"\u0001\u0003\u1b04\u1b05\u0001\u0001\u0002\u1b08\u0001\u0006\u1ab7\u1ab8\u1ab9\u1ab0\u1aba\u0002\u1add\u0002\u1b13\u0001\u0002\u1b16\u0001\u0002\u1b19\u0001\u0002\u1b1c\u0001\u0004\u1b21\u1b22\u1b23\u0001\u0001\u0001\u0004\u1b28\u1b29\u1b2a\u0001\u0001\u0001\u0005\u1b30\u1b31\u1b32\u1b33\u0001\u0001\u0001\u0001\u0004\u1b38\u1b39\u1b3a\u0001\u0001\u0001\u0009\u1b44\u1b45\u1b46\u1b47\u1b48\u1b49\u1b4a\u1b4b\u0001\u0001\u0001\u0001" +
"\u0001\u0001\u0001\u0001\u0002\u1b45\u0006\u1b54\u1b55\u1b56\u1b57\u1b58\u0001\u0001\u0001\u0001\u0001\u0009\u1b62\u1b63\u1b64\u1b65\u1b66\u1b67\u1b68\u1b69\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u1b69\u1b65\u0008\u1b75\u1b76\u1b77\u1b78\u1b79\u1b7a\u1b7b\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0004\u1b80\u1b81\u1b82\u0001\u0001\u0001\u0002\u1b85\u0001\u0007\u1b8d\u1b8e\u1b8f\u1b90\u1b91\u1b92\u0001\u0001\u0001" +
"\u0001\u0001\u0001\u0005\u1b98\u1b99\u1b9a\u1b9b\u0001\u0001\u0001\u0001\u0005\u1ba1\u1ba2\u1ba3\u1ba4\u0001\u0001\u0001\u0001\u0002\u1ba4\u0008\u1baf\u1bb0\u1bb1\u1bb2\u1bb3\u1bb4\u1bb5\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u1bb9\u1bba\u0001\u0001\u0015\u1bd0\u1bd1\u1bd2\u1bd3\u1bd4\u1bd5\u1bd6\u1bd7\u1bd8\u1bd9\u1bda\u1bdb\u1bdc\u1bdd\u1bde\u1bdf\u1be0\u1be1\u1be2\u1be3\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001" +
"\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0002\u1bd1\u0003\u1bde\u1bdf\u0004\u1bd7\u1be1\u1be0\u0002\u1bd9\n\u1bf9\u1bfa\u1bfb\u1bfc\u1bfd\u1bfe\u1bff\u1c00\u1c01\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0006\u1c08\u1c09\u1c0a\u1c0b\u1c0c\u0001\u0001\u0001\u0001\u0001\u0006\u1c13\u1c14\u1c15\u1c16\u1c17\u0001\u0001\u0001\u0001\u0001\u0005\u1c1d\u1c1e\u1c1f\u1c20\u0001\u0001\u0001" +
"\u0001\u0003\u1c24\u1c25\u0001\u0001\u0005\u1c2b\u1c2c\u1c2d\u1c2e\u0001\u0001\u0001\u0001\u0002\u1c31\u0001\u0002\u1bfd\u0002\u1c1e\u0003\u1c39\u1c3a\u0001\u0001\u0003\u139f\u1c3e\u0001\u0003\u0cab\u1c42\u0001\u0003\u13a0\u1c46\u0001\u0003\u0cac\u1c4a\u0001\u0002\u1c4d\u0001\u0004\u1129\u13a1\u1c52\u0001\u0005\u13a2\u141f\u04f5\u1c58\u0001\u0002\u1c5b\u0001\u0002\u112a\u0002\u1c60\u0001\u0008\u112b\u04e4\u1c69\u1c6a\u1c6b\u1c6c" +
"\u1c6d\u0001\u0001\u0001\u0001\u0001\u0002\u1c70\u0001\u0002\u1c73\u0001\u0004\u1420\u0de1\u1c78\u0001\u0004\u1421\u0de1\u1c7d\u0001\u0002\u1c69\u0002\u13a3\u0002\u1c84\u0001\u0002\u1c87\u0001\u0002\u1c8a\u0001\u0002\u1c8d\u0001\u0003\u112c\u1c91\u0001\u0002\u112c\u0002\u1c96\u0001\u0002\u1c99\u0001\u0002\u1c9c\u0001\u0002\u1c9f\u0001\u0002\u1ca2\u0001\u0002\u1ca5\u0001\u0002\u1ca8\u0001\u0002\u1cab\u0001\u0002\u1cae\u0001\u0002" +
"\u1cb1\u0001\u0004\u1cb6\u112d\u13a4\u0001\u0003\u1cba\u112e\u0001\u0002\u1cbd\u0001\u0002\u1cc0\u0001\u0002\u1cc3\u0001\u0002\u1cc6\u0001\u0002\u1cc9\u0001\u0005\u143b\u148b\u1c6a\u1ccf\u0001\u0004\u112f\u1c6b\u1ccf\u0002\u1cd6\u0001\u0002\u1cd9\u0001\u0002\u1cdc\u0001\u0002\u1cdf\u0001\u0002\u1ce2\u0001\u0002\u1ce5\u0001\u0002\u1ce8\u0001\u0003\u1130\u1cec\u0001\u0002\u1131\u0002\u1132\u0002\u1133\u0016\u083b\u0d65\u0da7\u0deb" +
"\u0e1e\u0e3d\u0e7c\u0ff5\u1568\u1c3e\u1c42\u1c46\u1c4a\u1c52\u1c58\u1c6c\u1c78\u1c7d\u1c91\u1cec\u1d09\u0001\n\u0c23\u0cad\u0d23\u0ff6\u1134\u13a5\u143c\u1c6d\u1d09\u0002\u1d16\u0001\u00f6\u1e0d\u066c\u06cc\u0706\u07ce\u06cd\u06ce\u0351\u0cfd\u0c95\u0cfe\u1e12\u1e16\u1e19\u1e1c\u1e1f\u1e22\u1e25\u1e28\u1e2b\u1e2e\u1e31\u0ddf\u1419\u0e36\u0e66\u07d3\u07d4\u0c59\u0c94\u1230\u1e36\u0d58\u0e0f\u1e37\u0ca6\u1312\u0e13\u0e14\u0d5a" +
"\u0e18\u1e38\u0d00\u0688\u0d02\u1e39\u0f42\u1e41\u1e42\u1e43\u1e44\u1e45\u1e46\u1e47\u1e48\u1e49\u1e4a\u1e4b\u1e4c\u1e4d\u1e4e\u1e4f\u1645\u1e50\u1e51\u1e53\u1e54\u0d1f\u1e55\u1e56\u1e57\u1e58\u1e59\u1707\u1702\u1e5b\u1e5c\u1e5e\u1e5f\u17b6\u1e60\u0fc3\u0d22\u1658\u0d1e\u1e61\u167d\u1687\u16ce\u0d1f\u1e63\u1e6f\u1e76\u1e7c\u1e83\u1e89\u1e8e\u1e94\u1ea0\u1ea6\u1eac\u1eb3\u1ec0\u189c\u18b2\u197f\u1ec6\u1933\u1ec7\u1ec8\u1888\u1ec9" +
"\u1eca\u1ecb\u1ecc\u1ecd\u18cb\u19ad\u1ece\u1ecf\u1ed0\u18e8\u1ed1\u1ed2\u1ed3\u1943\u1944\u1e12\u1e16\u1e19\u1e1c\u1e1f\u1e22\u1e25\u1e28\u1e2b\u1e2e\u1950\u1ed4\u1994\u19ad\u1ed5\u196d\u1e12\u1e16\u1e19\u1e1c\u1e1f\u1e22\u1e25\u1e28\u1e2b\u1e2e\u1ed6\u1ed7\u1ed8\u1ed9\u1eda\u1edb\u1edc\u1edd\u1ede\u1edf\u1ee0\u1ee1\u1ee2\u1ee3\u19ee\u19ef\u19f0\u1ee4\u1ee5\u1ee6\u19f1\u1eea\u1eeb\u19f2\u19f3\u1eec\u1eed\u1ef1\u19f4\u1ef5\u19f5" +
"\u1ef9\u19f6\u19f7\u19f8\u1efa\u1efb\u1eff\u1f03\u1f04\u1f05\u1f06\u1f07\u1f08\u1f09\u1f0a\u1f0b\u1f0c\u1f0d\u1f0e\u1f0f\u1f10\u1f11\u1f12\u1f13\u1f15\u1f17\u1f19\u1f1b\u139d\u1e39\u0f52\u0e0d\u0e19\u0e0e\u0e1c\u1f1d\u1f1e\u1f1f\u1f20\u1f21\u1f22\u1c4d\u1129\u04f5\u1f23\u1f24\u1f25\u1f26\u1f27\u112d\u112e\u143b\u1f28\u1cec\u13a4\u1132\u1133\u083b\u168a\u1f29\u1f2a\u0005\u0000\u0000\u0000\u0000\u0004\u0000\u0000\u0000\u0003\u0000" +
"\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0005\u0000\u0000\u0000\u0000\u0001\u0001\u0001\u0008\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0002\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0002\u0000\u0001\u0002\u0000\u0001\u0001" +
"\u0001\u0002\u0000\u000c\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0007\u0000\u0000\u0000\u0000\u0000\u0000\u0006\u0000\u0000\u0000\u0000\u0000\u0007\u0000\u0000\u0000\u0000\u0000\u0000\u0006\u0000\u0000\u0000\u0000\u0000\u0005\u0000\u0000\u0000\u0000\u0006\u0000\u0000\u0000\u0000\u0000\u000c\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0006\u0000\u0000\u0000\u0000\u0000\u0006\u0000" +
"\u0000\u0000\u0000\u0000\u0007\u0000\u0000\u0000\u0000\u0000\u0000\r\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0006\u0000\u0000\u0000\u0000\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0004\u0000\u0000\u0000\u0001\u0001\u0001\u0004\u0000\u0000" +
"\u0000\u0004\u0000\u0000\u0000\u0004\u0000\u0000\u0000\u0001\u0001\u0004\u0000\u0000\u0000\u0004\u0000\u0000\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u000b\u1f36\u1f37\u1f38\u1f39\u1f3a\u1f3b\u1f3c\u1f3d\u1f3e\u1f3f\u0001\u0001" +
"\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u000b\u1f4b\u1f4c\u1f4d\u1f4e\u1f4f\u1f50\u1f51\u1f52\u1f53\u1f54\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u000b\u1f60\u1f61\u1f62\u1f63\u1f64\u1f65\u1f66\u1f67\u1f68\u1f69\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u000b\u1f75\u1f76\u1f77\u1f78\u1f79\u1f7a\u1f7b\u1f7c\u1f7d\u1f7e\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u000b" +
"\u1f8a\u1f8b\u1f8c\u1f8d\u1f8e\u1f8f\u1f90\u1f91\u1f92\u1f93\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u000b\u1f9f\u1fa0\u1fa1\u1fa2\u1fa3\u1fa4\u1fa5\u1fa6\u1fa7\u1fa8\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u000b\u1fb4\u1fb5\u1fb6\u1fb7\u1fb8\u1fb9\u1fba\u1fbb\u1fbc\u1fbd\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0071\u0f60\u0d0b\u202f\u2032\u2035\u2036\u2037\u2038\u2039" +
"\u203a\u203b\u203c\u1ede\u1edf\u203d\u203e\u203f\u2040\u2041\u2042\u2043\u2044\u2045\u2046\u2047\u2048\u2049\u204a\u204b\u204c\u204d\u204e\u1f09\u1ed8\u204f\u1ed9\u2050\u2051\u1f10\u2052\u2053\u2054\u2055\u2056\u2057\u2058\u2059\u205a\u205b\u205c\u205d\u205e\u205f\u2060\u2061\u2062\u2063\u2064\u2065\u2066\u2067\u2068\u2069\u0f52\u206a\u206b\u206c\u206d\u206e\u206f\u2070\u2071\u2072\u2073\u2074\u2075\u2076\u2077\u2079\u207b\u207c" +
"\u207f\u2082\u2085\u2086\u0f52\u0e0d\u0e19\u0e0e\u0e1c\u1f1f\u1f20\u1f21\u1f22\u1c5b\u1c60\u1cb6\u1cba\u1cbd\u1cc0\u2087\u2088\u2089\u208a\u208b\u208c\u208d\u208e\u208f\u2090\u2091\u2092\u0003\u0000\u0000\u0003\u0000\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001" +
"\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0002\u0000\u0002\u0000\u0001\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0006\u2098\u209b\u209e\u20a1\u20a4\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000" +
"\u0000\u0003\u0000\u0000\u0003\u0000\u0000").toCharArray();
"\u0001\u0003\u003c\u003c\u0003\u0143\u12df\u0001\u0008\u0040\u0144\u0ca6\u0380\u010d\u0f0c\u0d57\u0004\u01fd\u0d59\u0d5a\u0006\u0042\u0145\u010e\u12f2\u048d\u0001\u001a\u04da\u0043\u0342\u0325\u0383\u0342\u0177\u0c21\u0c22\u0177\u0325\u02bb\u0362\u0ea9\u130d\u0351\u0f36\u0f37\u0363\u0364\u0f38\u0365\u048e\u04da\u0043\u0001\u0005\u0f42\u0200\u0e13\u1313\u0002\u1315\u0003\u0000\u0000\u0005\u0045\u0146\u0110\u0e14\u000b\u0f37\u0046" +
"\u0147\u0205\u0dbd\u0111\u0f5f\u0f37\u1328\u0147\u0001\u0009\u0148\u00c6\u0206\u00c6\u0dbe\u0112\u1332\u0f6e\u0001\u001b\u04df\u0047\u0363\u0343\u0329\u0d5a\u0343\u0178\u0e92\u0fa6\u0edd\u0fa7\u0fa8\u0fa9\u0178\u0329\u02bf\u0fab\u0fac\u0fad\u0fae\u0faf\u0fb0\u048f\u04df\u0047\u0023\u0d5b\u128b\u0de2\u0de3\u0de4\u128c\u128d\u128e\u128f\u0de6\u1290\u0de7\u0de8\u0de9\u1291\u0dea\u0104\u0105\u0106\u0107\u0108\u0109\u010a\u010b\u010c" +
"\u0d57\u010e\u010f\u0110\u0111\u0112\u0113\u0114\u0091\u0002\u0179\u0003\u0f38\u1376\u0001\u0007\u04e2\u0049\u0e18\u017d\u04e2\u0049\u0004\u004a\u0210\u0114\u0002\u1384\u0001\u0012\u1397\u1398\u0e9a\u0eab\u0edf\u0f61\u0097\u0d58\u0091\u1399\u139a\u139b\u139c\u139d\u139e\u139f\u13a0\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u002f\u13d0\u13d4\u13e9\u13fc\u0d6b\u0e96\u1403\u0ef4\u0f1e\u0f3b\u0fb1\u1404\u1405\u1406" +
"\u048a\u1410\u048b\u048c\u048d\u048e\u048f\u0490\u0491\u1399\u1414\u04e3\u140d\u140e\u140f\u0180\u0199\u0183\u1413\u0493\u1401\u02ff\u1402\u0300\u1415\u1416\u1417\u1418\u1419\u141a\u141b\u141c\u0003\u13d3\u04f4\u0001\u000b\u13df\u13e0\u13e1\u13e2\u13e3\u13e4\u13e5\u13e6\u13e7\u13e8\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\n\u13f3\u13f4\u13f5\u13f6\u13f7\u13f8\u13f9\u13fa\u13fb\u0001\u0001\u0001\u0001\u0001" +
"\u0001\u0001\u0001\u0001\u0005\u1401\u1402\u02ff\u0300\u0001\u0001\u0001\u0001\u0001\u0007\u140d\u140e\u140f\u0180\u0199\u0183\u0001\u0001\u0001\u0003\u1413\u0493\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0017\u078a\u04c3\u0e3c\u06cf\u06d0\u06d2\u06d3\u06d4\u06d7\u1434\u04c4\u04c8\u04ca\u04da\u04df\u04e2\u1435\u078a\u04f5\u04e4\u1436\u1437\u0001\u0001\u0001\u0001\u0037\u146f\u1474\u147b\u1480\u0ca1\u0ca3\u1105" +
"\u0ca4\u0ca7\u0ca8\u1106\u031e\u031f\u0320\u0321\u0325\u0329\u032a\u1483\u10f4\u110b\u110a\u10f5\u10f6\u032b\u032c\u032d\u032e\u032f\u10ff\u0212\u110c\u110d\u110e\u0331\u0332\u0333\u110f\u1112\u1115\u1116\u1119\u111c\u111d\u1120\u0334\u1123\u1126\u0335\u10eb\u0336\u10ec\u0337\u1486\u0005\u10eb\u10ec\u0336\u0337\u0007\u10f4\u10f5\u10f6\u032b\u032e\u032f\u0005\u10ff\u1100\u0212\u0213\u0003\u1104\u0330\u0003\u110a\u032d\u0001\u0077" +
"\u14fe\u1505\u1514\u1522\u1527\u152a\u07d5\u07d6\u07d7\u07d8\u07d9\u07da\u07dd\u07de\u07df\u07e0\u07e1\u07e2\u07e3\u07e4\u07e5\u07e6\u07e7\u07e8\u152d\u1534\u0037\u1539\u0038\u0039\u003a\u003b\u003c\u003f\u0040\u0041\u0042\u0043\u0044\u0045\u0046\u0047\u0048\u0049\u004a\u153c\u1541\u1546\u07f0\u080e\u080f\u080d\u07f1\u078b\u07f2\u0803\u07d2\u078c\u004b\u004c\u004d\u004e\u004f\u0050\u0051\u0052\u0053\u0054\u07fd\u0055\u07f8\u0059" +
"\u07f9\u005a\u0804\u005b\u07cc\\\u07cd\u005d\u0810\u0811\u0812\u0813\u0814\u0815\u0816\u005e\u005f\u0060\u0061\u0062\u0063\u0817\u0818\u081b\u081c\u081f\u0822\u0823\u0826\u0829\u082c\u082f\u0832\u0835\u0064\u0067\u0068\u006b\u006e\u006f\u0838\u0072\u0075\u0078\u007b\u007e\u0007\u078b\u078c\u0050\u0054\u078d\u04e7\u000f\u079e\u079f\u07a0\u07a1\u07a2\u07a3\u07a4\u07a5\u07a6\u07a7\u07a8\u07a9\u07aa\u07ab\u000e\u07ba\u07bb\u07bc" +
"\u07bd\u07be\u07bf\u07c0\u07c1\u07c2\u07c3\u07c4\u07c5\u07c6\u0005\u07cc\u07cd\\\u005d\u0003\u080d\u004e\u0003\u07d2\u0053\u0007\u07f0\u07f1\u07f2\u004b\u004f\u0051\u0005\u07f8\u07f9\u0059\u005a\u0003\u07fd\u0055\u0005\u0803\u0804\u0052\u005b\u0005\u07f8\u07f9\u0059\u005a\u0003\u080d\u004e\u0017\u0c5b\u0c5c\u1560\u0c5e\u0c5f\u0c61\u0c62\u0c63\u0c65\u0c66\u0c67\u013e\u013f\u0140\u0141\u0142\u0143\u0144\u0145\u0146\u0147\u0148" +
"\u0001\u0002\u1563\u0001\u0003\u0edd\u0fad\u0002\u0810\u0002\u0811\u0002\u0812\u0003\u06e4\u0813\u0002\u0814\u0003\u06e5\u0815\u0002\u0816\u0002\u005e\u0002\u005f\u0002\u0060\u000e\u04e5\u158b\u15ae\u15bb\u15c8\u15eb\u160e\u1622\u1623\u1624\u1625\u1626\u1627\u0006\u1591\u159e\u15ab\u15ac\u15ad\u0007\u1598\u1599\u159a\u159b\u159c\u159d\u0001\u0001\u0001\u0001\u0001\u0001\u0007\u15a5\u15a6\u15a7\u15a8\u15a9\u15aa\u0001\u0001\u0001" +
"\u0001\u0001\u0001\u0001\u0001\u0001\u0007\u15b5\u15b6\u15b7\u15b8\u15b9\u15ba\u0001\u0001\u0001\u0001\u0001\u0001\u0007\u15c2\u15c3\u15c4\u15c5\u15c6\u15c7\u0001\u0001\u0001\u0001\u0001\u0001\u0006\u15ce\u15db\u15e8\u15e9\u15ea\u0007\u15d5\u15d6\u15d7\u15d8\u15d9\u15da\u0001\u0001\u0001\u0001\u0001\u0001\u0007\u15e2\u15e3\u15e4\u15e5\u15e6\u15e7\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0006\u15f1\u15fe\u160b\u160c" +
"\u160d\u0007\u15f8\u15f9\u15fa\u15fb\u15fc\u15fd\u0001\u0001\u0001\u0001\u0001\u0001\u0007\u1605\u1606\u1607\u1608\u1609\u160a\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0006\u1614\u161b\u15ab\u15ac\u15ad\u0007\u1598\u1599\u159a\u159b\u159c\u159d\u0007\u15a5\u15a6\u15a7\u15a8\u15a9\u15aa\u0001\u0001\u0001\u0001\u0001\u0001\u0002\u0062\u0003\u04e6\u0063\u0002\u0817\u0002\u0e0f\u0002\u0e13\u0003\u0f1d\u0f1d\u0002\u0e0f" +
"\u0008\u1640\u1641\u1642\u1640\u1651\u1653\u1640\u0001\u0001\u000f\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0002\u0000\u0002\u0000\u0002\u1657\u0019\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0007\u0c69\u0d1b\u0d5f\u1677\u1678\u0d5f\u0001\u0001\u0007\u1680\u1682\u1683\u1680\u1680\u1685" +
"\u0002\u0000\u0001\u0002\u0000\u0001\u0002\u1688\u0010\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0002\u0d1c\u0003\u0e13\u169d\u0001\u0003\u0334\u16a1\u0001\u0003\u0d1d\u16a5\u0010\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0007\u0c6a\u0d1e\u1677\u16bc\u1678\u16bc\u0001\u0004\u0c6b\u0d1f\u16c1\u0001\u0002\u0d20\u0005\u0c6c\u16c9\u16ca" +
"\u16da\u0001\u0010\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0004\u16df\u16e0\u16e1\u0001\u0001\u0019\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0003\u0f37\u16fd\u0001\u0004\u1702\u1703\u1702\u0001\u0001\u0007\u16a1\u0fc4\u0335\u170b\u16a1\u0fc4\u0013\u0000\u0000\u0000\u0000" +
"\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0004\u0c6d\u0d21\u1722\u0019\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u000f\u0d22\u1642\u1657\u1688\u16a5\u16ca\u16e1\u170b\u1722\u174a\u175c\u1775\u16a5\u1785\u0012\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000" +
"\u0000\u0000\u0000\u0000\u0019\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0010\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0010\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0002\u1797\u0001\u0002\u175c\u0006\u17a0\u06f1\u17a2\u17a3\u1775" +
"\u0002\u0000\u0001\u0001\u0002\u17a6\u0002\u0000\u0005\u06f2\u06f2\u16a1\u0334\u0004\u17b1\u16a5\u17a6\u0002\u0000\u0002\u16df\u0002\u1785\u0002\u17b9\u0002\u0000\u0003\u17be\u17c0\u0002\u0000\u0002\u0000\u0002\u17c4\u0002\u0000\u0002\u17c8\u0002\u0000\u0017\u17e1\u17e3\u17e5\u17e7\u17e9\u17eb\u17ed\u17ef\u17f1\u17f3\u17f5\u17f7\u17f9\u17fb\u17fd\u17ff\u1801\u1803\u1805\u1807\u1809\u180b\u0002\u0000\u0002\u0000\u0002\u0000\u0002" +
"\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0004\u1811\u1813\u1815\u0002\u0000\u0002\u0000\u0002\u0000\u0004\u181b\u181f\u181d\u0002\u181d\u0002\u0000\u0002\u0000\u0004\u1825\u1829\u1827\u0002\u1827\u0002\u0000\u0002\u0000\u0008\u1833\u1848\u1849\u184a" +
"\u184b\u184a\u184b\u0015\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0001\u0001\u0015\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0005\u1865\u1866\u1867\u1868\u0001\u0001\u0001\u0001\u0002\u186b\u0001\u0002\u186e\u0010\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000" +
"\u0000\u0000\u0000\u0000\u0000\u0000\u0004\u1866\u1882\u1883\u0001\u0001\u0002\u1886\u0001\u0002\u1867\n\u1893\u1894\u1895\u1896\u1897\u18ad\u1896\u1897\u18ad\u0001\u0001\u0001\u0001\u0016\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0016\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000" +
"\u0000\u0000\u0000\u0003\u18c6\u18c6\u0001\u0002\u18c9\u0001\u0002\u18cc\u0001\u0004\u18d1\u18e3\u18e3\u0012\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0006\u1868\u18ea\u18fd\u1910\u1910\u0013\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0013\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000" +
"\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0013\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0009\u192c\u192d\u1894\u18ea\u192e\u193e\u193f\u193f\u0001\u0001\u0010\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0001\n\u194a\u1895\u18c9\u18fd\u194b\u193e\u1849\u193e\u1849\u0001\u0011\u0000\u0000\u0000\u0000" +
"\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\n\u1966\u1967\u1896\u1910\u1968\u193f\u184a\u193f\u184a\u0001\u0001\u0010\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0002\u197a\u0001\u0007\u1848\u1895\u1896\u1982\u1983\u1894\u0001\u0001\u0002\u1893\u0009\u184b\u1883\u1897\u18e3\u193e\u193f\u198f\u193f\u0013\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000" +
"\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0006\u18ad\u1849\u184a\u19a8\u184a\u001c\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\n\u1966\u1967\u1896\u1910\u193f\u184a\u1968\u193f\u184a\u0009\u184b\u1883\u1897\u18e3\u193e\u193f\u193f\u198f\u0006\u18ad\u1849\u184a\u184a\u19a8\u000c\u19e9\u19ea" +
"\u19eb\u19ec\u19ed\u19ee\u19ef\u19f0\u19f1\u19f2\u19f3\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0004\u19f8\u19f9\u19fa\u0001\u0001\u0001\u0003\u19fe\u19ff\u0001\u0001\u0007\u1a07\u1a08\u1a09\u1a0a\u1a0b\u1a0c\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u1a10\u1a11\u0001\u0001\u0004\u1a16\u1a17\u1a18\u0001\u0001\u0001\u0003\u1a1c\u1a1d\u0001\u0001\u0002\u1a20\u0001\u0002\u1a23\u0001\u0002\u1a26\u0001\u0002" +
"\u1a29\u0001\u0004\u1a2e\u1a2f\u1a30\u0001\u0001\u0001\u0002\u1a33\u0001\u0003\u1a37\u1a38\u0001\u0001\u0002\u1a3b\u0001\u0004\u1a40\u1a41\u1a42\u0001\u0001\u0001\u0002\u1a45\u0001\u0004\u1a4a\u1a4b\u1a4c\u0001\u0001\u0001\u0002\u1a4f\u0001\u0002\u1a52\u0001\u0002\u1a55\u0001\u0002\u1a58\u0001\u0002\u1a5b\u0001\u0002\u1a5e\u0001\u0002\u1a61\u0001\u0002\u1a64\u0001\u0002\u1a67\u0001\u0006\u1a6e\u1a6f\u1a70\u1a71\u1a72\u0001\u0001" +
"\u0001\u0001\u0001\u0002\u1a75\u0001\u0002\u1a78\u0001\u0005\u1a7e\u1a7f\u1a80\u1a81\u0001\u0001\u0001\u0001\u0003\u1a85\u1a86\u0001\u0001\u0005\u1a8c\u1a8d\u1a8e\u1a8f\u0001\u0001\u0001\u0001\u0003\u1a93\u1a94\u0001\u0001\u0011\u1aa6\u1aa7\u1aa8\u1aa9\u1aaa\u1aab\u1aac\u1aad\u1aae\u1aaf\u1ab0\u1ab1\u1ab2\u1ab3\u1ab4\u1ab5\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0002\u1ab1" +
"\u0011\u1ac9\u1aca\u1acb\u1acc\u1acd\u1ace\u1acf\u1ad0\u1ad1\u1ad2\u1ad3\u1ad4\u1ad5\u1ad6\u1ad7\u1ad8\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0002\u1ad0\u000c\u1ae7\u1ae8\u1ae9\u1aea\u1aeb\u1aec\u1aed\u1aee\u1aef\u1af0\u1af1\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u1af5\u1af6\u0001\u0001\u0003\u1afa\u1afb\u0001\u0001\u0003\u1aff\u1b00\u0001" +
"\u0001\u0002\u1b03\u0001\u0006\u1ab2\u1ab3\u1ab4\u1aab\u1ab5\u0002\u1ad8\u0002\u1b0e\u0001\u0002\u1b11\u0001\u0002\u1b14\u0001\u0002\u1b17\u0001\u0004\u1b1c\u1b1d\u1b1e\u0001\u0001\u0001\u0004\u1b23\u1b24\u1b25\u0001\u0001\u0001\u0005\u1b2b\u1b2c\u1b2d\u1b2e\u0001\u0001\u0001\u0001\u0004\u1b33\u1b34\u1b35\u0001\u0001\u0001\u0009\u1b3f\u1b40\u1b41\u1b42\u1b43\u1b44\u1b45\u1b46\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0002" +
"\u1b40\u0006\u1b4f\u1b50\u1b51\u1b52\u1b53\u0001\u0001\u0001\u0001\u0001\u0009\u1b5d\u1b5e\u1b5f\u1b60\u1b61\u1b62\u1b63\u1b64\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u1b64\u1b60\u0008\u1b70\u1b71\u1b72\u1b73\u1b74\u1b75\u1b76\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0004\u1b7b\u1b7c\u1b7d\u0001\u0001\u0001\u0002\u1b80\u0001\u0007\u1b88\u1b89\u1b8a\u1b8b\u1b8c\u1b8d\u0001\u0001\u0001\u0001\u0001\u0001\u0005\u1b93" +
"\u1b94\u1b95\u1b96\u0001\u0001\u0001\u0001\u0005\u1b9c\u1b9d\u1b9e\u1b9f\u0001\u0001\u0001\u0001\u0002\u1b9f\u0008\u1baa\u1bab\u1bac\u1bad\u1bae\u1baf\u1bb0\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0003\u1bb4\u1bb5\u0001\u0001\u0015\u1bcb\u1bcc\u1bcd\u1bce\u1bcf\u1bd0\u1bd1\u1bd2\u1bd3\u1bd4\u1bd5\u1bd6\u1bd7\u1bd8\u1bd9\u1bda\u1bdb\u1bdc\u1bdd\u1bde\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001" +
"\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0002\u1bcc\u0003\u1bd9\u1bda\u0004\u1bd2\u1bdc\u1bdb\u0002\u1bd4\n\u1bf4\u1bf5\u1bf6\u1bf7\u1bf8\u1bf9\u1bfa\u1bfb\u1bfc\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0006\u1c03\u1c04\u1c05\u1c06\u1c07\u0001\u0001\u0001\u0001\u0001\u0006\u1c0e\u1c0f\u1c10\u1c11\u1c12\u0001\u0001\u0001\u0001\u0001\u0005\u1c18\u1c19\u1c1a\u1c1b\u0001\u0001\u0001\u0001\u0003\u1c1f\u1c20\u0001" +
"\u0001\u0005\u1c26\u1c27\u1c28\u1c29\u0001\u0001\u0001\u0001\u0002\u1c2c\u0001\u0002\u1bf8\u0002\u1c19\u0003\u1c34\u1c35\u0001\u0001\u0003\u139a\u1c39\u0001\u0003\u0cab\u1c3d\u0001\u0003\u139b\u1c41\u0001\u0003\u0cac\u1c45\u0001\u0002\u1c48\u0001\u0004\u1129\u139c\u1c4d\u0001\u0005\u139d\u141a\u04f5\u1c53\u0001\u0002\u1c56\u0001\u0002\u112a\u0002\u1c5b\u0001\u0008\u112b\u04e4\u1c64\u1c65\u1c66\u1c67\u1c68\u0001\u0001\u0001\u0001" +
"\u0001\u0002\u1c6b\u0001\u0002\u1c6e\u0001\u0004\u141b\u0de1\u1c73\u0001\u0004\u141c\u0de1\u1c78\u0001\u0002\u1c64\u0002\u139e\u0002\u1c7f\u0001\u0002\u1c82\u0001\u0002\u1c85\u0001\u0002\u1c88\u0001\u0003\u112c\u1c8c\u0001\u0002\u112c\u0002\u1c91\u0001\u0002\u1c94\u0001\u0002\u1c97\u0001\u0002\u1c9a\u0001\u0002\u1c9d\u0001\u0002\u1ca0\u0001\u0002\u1ca3\u0001\u0002\u1ca6\u0001\u0002\u1ca9\u0001\u0002\u1cac\u0001\u0004\u1cb1\u112d" +
"\u139f\u0001\u0003\u1cb5\u112e\u0001\u0002\u1cb8\u0001\u0002\u1cbb\u0001\u0002\u1cbe\u0001\u0002\u1cc1\u0001\u0002\u1cc4\u0001\u0005\u1436\u1486\u1c65\u1cca\u0001\u0004\u112f\u1c66\u1cca\u0002\u1cd1\u0001\u0002\u1cd4\u0001\u0002\u1cd7\u0001\u0002\u1cda\u0001\u0002\u1cdd\u0001\u0002\u1ce0\u0001\u0002\u1ce3\u0001\u0003\u1130\u1ce7\u0001\u0002\u1131\u0002\u1132\u0002\u1133\u0016\u083b\u0d65\u0da7\u0deb\u0e1e\u0e3d\u0e7c\u0ff5\u1563" +
"\u1c39\u1c3d\u1c41\u1c45\u1c4d\u1c53\u1c67\u1c73\u1c78\u1c8c\u1ce7\u1d04\u0001\n\u0c23\u0cad\u0d23\u0ff6\u1134\u13a0\u1437\u1c68\u1d04\u0002\u1d11\u0001\u00f6\u1e08\u066c\u06cc\u0706\u07ce\u06cd\u06ce\u0351\u0cfd\u0c95\u0cfe\u1e0d\u1e11\u1e14\u1e17\u1e1a\u1e1d\u1e20\u1e23\u1e26\u1e29\u1e2c\u0ddf\u1414\u0e36\u0e66\u07d3\u07d4\u0c59\u0c94\u1230\u1e31\u0d58\u0e0f\u1e32\u0ca6\u130d\u0e13\u0e14\u0d5a\u0e18\u1e33\u0d00\u0688\u0d02" +
"\u1e34\u0f42\u1e3c\u1e3d\u1e3e\u1e3f\u1e40\u1e41\u1e42\u1e43\u1e44\u1e45\u1e46\u1e47\u1e48\u1e49\u1e4a\u1640\u1e4b\u1e4c\u1e4e\u1e4f\u0d1f\u1e50\u1e51\u1e52\u1e53\u1e54\u1702\u16fd\u1e56\u1e57\u1e59\u1e5a\u17b1\u1e5b\u0fc3\u0d22\u1653\u0d1e\u1e5c\u1678\u1682\u16c9\u0d1f\u1e5e\u1e6a\u1e71\u1e77\u1e7e\u1e84\u1e89\u1e8f\u1e9b\u1ea1\u1ea7\u1eae\u1ebb\u1897\u18ad\u197a\u1ec1\u192e\u1ec2\u1ec3\u1883\u1ec4\u1ec5\u1ec6\u1ec7\u1ec8\u18c6" +
"\u19a8\u1ec9\u1eca\u1ecb\u18e3\u1ecc\u1ecd\u1ece\u193e\u193f\u1e0d\u1e11\u1e14\u1e17\u1e1a\u1e1d\u1e20\u1e23\u1e26\u1e29\u194b\u1ecf\u198f\u19a8\u1ed0\u1968\u1e0d\u1e11\u1e14\u1e17\u1e1a\u1e1d\u1e20\u1e23\u1e26\u1e29\u1ed1\u1ed2\u1ed3\u1ed4\u1ed5\u1ed6\u1ed7\u1ed8\u1ed9\u1eda\u1edb\u1edc\u1edd\u1ede\u19e9\u19ea\u19eb\u1edf\u1ee0\u1ee1\u19ec\u1ee5\u1ee6\u19ed\u19ee\u1ee7\u1ee8\u1eec\u19ef\u1ef0\u19f0\u1ef4\u19f1\u19f2\u19f3\u1ef5" +
"\u1ef6\u1efa\u1efe\u1eff\u1f00\u1f01\u1f02\u1f03\u1f04\u1f05\u1f06\u1f07\u1f08\u1f09\u1f0a\u1f0b\u1f0c\u1f0d\u1f0e\u1f10\u1f12\u1f14\u1f16\u1398\u1e34\u0f52\u0e0d\u0e19\u0e0e\u0e1c\u1f18\u1f19\u1f1a\u1f1b\u1f1c\u1f1d\u1c48\u1129\u04f5\u1f1e\u1f1f\u1f20\u1f21\u1f22\u112d\u112e\u1436\u1f23\u1ce7\u139f\u1132\u1133\u083b\u1685\u1f24\u1f25\u0005\u0000\u0000\u0000\u0000\u0004\u0000\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003" +
"\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0005\u0000\u0000\u0000\u0000\u0001\u0001\u0001\u0008\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0002\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0002\u0000\u0001\u0002\u0000\u0001\u0001\u0001\u0002\u0000\u000c\u0000" +
"\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0007\u0000\u0000\u0000\u0000\u0000\u0000\u0006\u0000\u0000\u0000\u0000\u0000\u0007\u0000\u0000\u0000\u0000\u0000\u0000\u0006\u0000\u0000\u0000\u0000\u0000\u0005\u0000\u0000\u0000\u0000\u0006\u0000\u0000\u0000\u0000\u0000\u000c\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0006\u0000\u0000\u0000\u0000\u0000\u0006\u0000\u0000\u0000\u0000\u0000\u0007" +
"\u0000\u0000\u0000\u0000\u0000\u0000\r\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0006\u0000\u0000\u0000\u0000\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0004\u0000\u0000\u0000\u0001\u0001\u0001\u0004\u0000\u0000\u0000\u0004\u0000\u0000\u0000" +
"\u0004\u0000\u0000\u0000\u0001\u0001\u0004\u0000\u0000\u0000\u0004\u0000\u0000\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0002\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u000b\u1f31\u1f32\u1f33\u1f34\u1f35\u1f36\u1f37\u1f38\u1f39\u1f3a\u0001\u0001\u0001\u0001\u0001\u0001\u0001" +
"\u0001\u0001\u0001\u000b\u1f46\u1f47\u1f48\u1f49\u1f4a\u1f4b\u1f4c\u1f4d\u1f4e\u1f4f\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u000b\u1f5b\u1f5c\u1f5d\u1f5e\u1f5f\u1f60\u1f61\u1f62\u1f63\u1f64\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u000b\u1f70\u1f71\u1f72\u1f73\u1f74\u1f75\u1f76\u1f77\u1f78\u1f79\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u000b\u1f85\u1f86\u1f87\u1f88\u1f89" +
"\u1f8a\u1f8b\u1f8c\u1f8d\u1f8e\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u000b\u1f9a\u1f9b\u1f9c\u1f9d\u1f9e\u1f9f\u1fa0\u1fa1\u1fa2\u1fa3\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u000b\u1faf\u1fb0\u1fb1\u1fb2\u1fb3\u1fb4\u1fb5\u1fb6\u1fb7\u1fb8\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0071\u0f60\u0d0b\u202a\u202d\u2030\u2031\u2032\u2033\u2034\u2035\u2036\u2037\u1ed9\u1eda" +
"\u2038\u2039\u203a\u203b\u203c\u203d\u203e\u203f\u2040\u2041\u2042\u2043\u2044\u2045\u2046\u2047\u2048\u2049\u1f04\u1ed3\u204a\u1ed4\u204b\u204c\u1f0b\u204d\u204e\u204f\u2050\u2051\u2052\u2053\u2054\u2055\u2056\u2057\u2058\u2059\u205a\u205b\u205c\u205d\u205e\u205f\u2060\u2061\u2062\u2063\u2064\u0f52\u2065\u2066\u2067\u2068\u2069\u206a\u206b\u206c\u206d\u206e\u206f\u2070\u2071\u2072\u2074\u2076\u2077\u207a\u207d\u2080\u2081\u0f52" +
"\u0e0d\u0e19\u0e0e\u0e1c\u1f1a\u1f1b\u1f1c\u1f1d\u1c56\u1c5b\u1cb1\u1cb5\u1cb8\u1cbb\u2082\u2083\u2084\u2085\u2086\u2087\u2088\u2089\u208a\u208b\u208c\u208d\u0003\u0000\u0000\u0003\u0000\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001" +
"\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0002\u0000\u0002\u0000\u0001\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0006\u2093\u2096\u2099\u209c\u209f\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003\u0000\u0000\u0003" +
"\u0000\u0000").toCharArray();
public static final int accent_aigu = 1;
public static final int accent_arrows = 130;
@ -266,13 +266,13 @@ public final class ComposeKeyData
public static final int accent_tilde = 1144;
public static final int accent_trema = 1172;
public static final int compose = 1270;
public static final int fn = 7447;
public static final int numpad_bengali = 7979;
public static final int numpad_devanagari = 8000;
public static final int numpad_gujarati = 8021;
public static final int numpad_hindu = 8042;
public static final int numpad_kannada = 8063;
public static final int numpad_persian = 8084;
public static final int numpad_tamil = 8105;
public static final int shift = 8126;
public static final int fn = 7442;
public static final int numpad_bengali = 7974;
public static final int numpad_devanagari = 7995;
public static final int numpad_gujarati = 8016;
public static final int numpad_hindu = 8037;
public static final int numpad_kannada = 8058;
public static final int numpad_persian = 8079;
public static final int numpad_tamil = 8100;
public static final int shift = 8121;
}

View File

@ -5,6 +5,7 @@ import android.content.res.Configuration;
import android.content.res.Resources;
import android.util.DisplayMetrics;
import android.util.TypedValue;
import androidx.window.layout.WindowInfoTracker;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
@ -41,7 +42,8 @@ public final class Config
public long longPressInterval;
public boolean keyrepeat_enabled;
public float margin_bottom;
public float keyHeight;
public int keyboardHeightPercent;
public int screenHeightPixels;
public float horizontal_margin;
public float key_vertical_margin;
public float key_horizontal_margin;
@ -72,13 +74,16 @@ public final class Config
public final IKeyEventHandler handler;
public boolean orientation_landscape = false;
public boolean foldable_unfolded = false;
/** Index in 'layouts' of the currently used layout. See
[get_current_layout()] and [set_current_layout()]. */
int current_layout_portrait;
int current_layout_landscape;
int current_layout_unfolded_portrait;
int current_layout_unfolded_landscape;
public int bottomInsetMin;
private Config(SharedPreferences prefs, Resources res, IKeyEventHandler h)
private Config(SharedPreferences prefs, Resources res, IKeyEventHandler h, Boolean foldableUnfolded)
{
_prefs = prefs;
// static values
@ -87,7 +92,7 @@ public final class Config
labelTextSize = 0.33f;
sublabelTextSize = 0.22f;
// from prefs
refresh(res);
refresh(res, foldableUnfolded);
// initialized later
shouldOfferVoiceTyping = false;
actionLabel = null;
@ -100,13 +105,12 @@ public final class Config
/*
** Reload prefs
*/
public void refresh(Resources res)
public void refresh(Resources res, Boolean foldableUnfolded)
{
DisplayMetrics dm = res.getDisplayMetrics();
orientation_landscape = res.getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE;
// The height of the keyboard is relative to the height of the screen.
// This is the height of the keyboard if it have 4 rows.
int keyboardHeightPercent;
foldable_unfolded = foldableUnfolded;
float characterSizeScale = 1.f;
String show_numpad_s = _prefs.getString("show_numpad", "never");
show_numpad = "always".equals(show_numpad_s);
@ -114,12 +118,12 @@ public final class Config
{
if ("landscape".equals(show_numpad_s))
show_numpad = true;
keyboardHeightPercent = _prefs.getInt("keyboard_height_landscape", 50);
keyboardHeightPercent = _prefs.getInt(foldable_unfolded ? "keyboard_height_landscape_unfolded" : "keyboard_height_landscape", 50);
characterSizeScale = 1.25f;
}
else
{
keyboardHeightPercent = _prefs.getInt("keyboard_height", 35);
keyboardHeightPercent = _prefs.getInt(foldable_unfolded ? "keyboard_height_unfolded" : "keyboard_height", 35);
}
layouts = LayoutsPreference.load_from_preferences(res, _prefs);
inverse_numpad = _prefs.getString("numpad_layout", "default").equals("low_first");
@ -153,9 +157,7 @@ public final class Config
borderConfig = _prefs.getBoolean("border_config", false);
customBorderRadius = _prefs.getInt("custom_border_radius", 0) / 100.f;
customBorderLineWidth = get_dip_pref(dm, "custom_border_line_width", 0);
// Do not substract key_vertical_margin from keyHeight because this is done
// during rendering.
keyHeight = dm.heightPixels * keyboardHeightPercent / 100 / 4;
screenHeightPixels = dm.heightPixels;
horizontal_margin =
get_dip_pref_oriented(dm, "horizontal_margin", 3, 28);
double_tap_lock_shift = _prefs.getBoolean("lock_double_tap", false);
@ -170,6 +172,8 @@ public final class Config
pin_entry_enabled = _prefs.getBoolean("pin_entry_enabled", true);
current_layout_portrait = _prefs.getInt("current_layout_portrait", 0);
current_layout_landscape = _prefs.getInt("current_layout_landscape", 0);
current_layout_unfolded_portrait = _prefs.getInt("current_layout_unfolded_portrait", 0);
current_layout_unfolded_landscape = _prefs.getInt("current_layout_unfolded_landscape", 0);
circle_sensitivity = Integer.valueOf(_prefs.getString("circle_sensitivity", "2"));
clipboard_history_enabled = _prefs.getBoolean("clipboard_history_enabled", false);
bottomInsetMin = Utils.is_navigation_bar_gestural(res) ?
@ -178,19 +182,34 @@ public final class Config
public int get_current_layout()
{
return (orientation_landscape)
? current_layout_landscape : current_layout_portrait;
if (foldable_unfolded) {
return (orientation_landscape)
? current_layout_unfolded_landscape : current_layout_unfolded_portrait;
} else {
return (orientation_landscape)
? current_layout_landscape : current_layout_portrait;
}
}
public void set_current_layout(int l)
{
if (orientation_landscape)
current_layout_landscape = l;
else
current_layout_portrait = l;
if (foldable_unfolded) {
if (orientation_landscape)
current_layout_unfolded_landscape = l;
else
current_layout_unfolded_portrait = l;
} else {
if (orientation_landscape)
current_layout_landscape = l;
else
current_layout_portrait = l;
}
SharedPreferences.Editor e = _prefs.edit();
e.putInt("current_layout_portrait", current_layout_portrait);
e.putInt("current_layout_landscape", current_layout_landscape);
e.putInt("current_layout_unfolded_portrait", current_layout_unfolded_portrait);
e.putInt("current_layout_unfolded_landscape", current_layout_unfolded_landscape);
e.apply();
}
@ -213,7 +232,13 @@ public final class Config
/** [get_dip_pref] depending on orientation. */
float get_dip_pref_oriented(DisplayMetrics dm, String pref_base_name, float def_port, float def_land)
{
String suffix = orientation_landscape ? "_landscape" : "_portrait";
final String suffix;
if (foldable_unfolded) {
suffix = orientation_landscape ? "_landscape_unfolded" : "_portrait_unfolded";
} else {
suffix = orientation_landscape ? "_landscape" : "_portrait";
}
float def = orientation_landscape ? def_land : def_port;
return get_dip_pref(dm, pref_base_name + suffix, def);
}
@ -249,10 +274,10 @@ public final class Config
private static Config _globalConfig = null;
public static void initGlobalConfig(SharedPreferences prefs, Resources res,
IKeyEventHandler handler)
IKeyEventHandler handler, Boolean foldableUnfolded)
{
migrate(prefs);
_globalConfig = new Config(prefs, res, handler);
_globalConfig = new Config(prefs, res, handler, foldableUnfolded);
LayoutModifier.init(_globalConfig, res);
}

View File

@ -0,0 +1,62 @@
package juloo.keyboard2;
import android.content.Context;
import android.content.pm.PackageManager;
import androidx.window.java.layout.WindowInfoTrackerCallbackAdapter;
import androidx.window.layout.DisplayFeature;
import androidx.window.layout.FoldingFeature;
import androidx.window.layout.WindowInfoTracker;
import androidx.window.layout.WindowLayoutInfo;
import androidx.core.util.Consumer;
public class FoldStateTracker {
private final Consumer<WindowLayoutInfo> _innerListener;
private final WindowInfoTrackerCallbackAdapter _windowInfoTracker;
private FoldingFeature _foldingFeature = null;
private Runnable _changedCallback = null;
public FoldStateTracker(Context context) {
_windowInfoTracker =
new WindowInfoTrackerCallbackAdapter(WindowInfoTracker.getOrCreate(context));
_innerListener = new LayoutStateChangeCallback();
_windowInfoTracker.addWindowLayoutInfoListener(context, Runnable::run, _innerListener);
}
public static boolean isFoldableDevice(Context context) {
return context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_SENSOR_HINGE_ANGLE);
}
public boolean isUnfolded() {
// FoldableFeature is only present when the device is unfolded. Otherwise, it's removed.
// A weird decision from Google, but that's how it works:
// https://cs.android.com/androidx/platform/frameworks/support/+/androidx-main:window/window/src/main/java/androidx/window/layout/adapter/sidecar/SidecarAdapter.kt;l=187?q=SidecarAdapter
return _foldingFeature != null;
}
public void close() {
_windowInfoTracker.removeWindowLayoutInfoListener(_innerListener);
}
public void setChangedCallback(Runnable _changedCallback) {
this._changedCallback = _changedCallback;
}
class LayoutStateChangeCallback implements Consumer<WindowLayoutInfo> {
@Override
public void accept(WindowLayoutInfo newLayoutInfo) {
FoldingFeature old = _foldingFeature;
_foldingFeature = null;
for (DisplayFeature feature: newLayoutInfo.getDisplayFeatures()) {
if (feature instanceof FoldingFeature) {
_foldingFeature = (FoldingFeature) feature;
}
}
if (old != _foldingFeature && _changedCallback != null) {
_changedCallback.run();
}
}
}
}

View File

@ -602,8 +602,6 @@ public final class KeyValue implements Comparable<KeyValue>
case "combining_kasratan": return makeCharKey(0xE219, '\u064D', 0);
case "combining_dammatan": return makeCharKey(0xE220, '\u064C', 0);
case "combining_alef_below": return makeCharKey(0xE221, '\u0656', 0);
case "combining_kavyka": return makeCharKey(0xE222, '\uA67C', 0);
case "combining_palatalization": return makeCharKey(0xE223, '\u0484', 0);
/* Special event keys */
case "config": return eventKey(0xE004, Event.CONFIG, FLAG_SMALLER_FONT);

View File

@ -43,6 +43,8 @@ public class Keyboard2 extends InputMethodService
private Config _config;
private FoldStateTracker _foldStateTracker;
/** Layout currently visible before it has been modified. */
KeyboardData current_layout_unmodified()
{
@ -111,13 +113,22 @@ public class Keyboard2 extends InputMethodService
SharedPreferences prefs = DirectBootAwarePreferences.get_shared_preferences(this);
_handler = new Handler(getMainLooper());
_keyeventhandler = new KeyEventHandler(this.new Receiver());
Config.initGlobalConfig(prefs, getResources(), _keyeventhandler);
_foldStateTracker = new FoldStateTracker(this);
Config.initGlobalConfig(prefs, getResources(), _keyeventhandler, _foldStateTracker.isUnfolded());
prefs.registerOnSharedPreferenceChangeListener(this);
_config = Config.globalConfig();
_keyboardView = (Keyboard2View)inflate_view(R.layout.keyboard);
_keyboardView.reset();
Logs.set_debug_logs(getResources().getBoolean(R.bool.debug_logs));
ClipboardHistoryService.on_startup(this, _keyeventhandler);
_foldStateTracker.setChangedCallback(() -> { refresh_config(); });
}
@Override
public void onDestroy() {
super.onDestroy();
_foldStateTracker.close();
}
private List<InputMethodSubtype> getEnabledSubtypes(InputMethodManager imm)
@ -234,7 +245,7 @@ public class Keyboard2 extends InputMethodService
private void refresh_config()
{
int prev_theme = _config.theme;
_config.refresh(getResources());
_config.refresh(getResources(), _foldStateTracker.isUnfolded());
refreshSubtypeImm();
// Refreshing the theme config requires re-creating the views
if (prev_theme != _config.theme)

View File

@ -42,6 +42,8 @@ public class Keyboard2View extends View
private Config _config;
private float _keyWidth;
private float _mainLabelSize;
private float _subLabelSize;
private float _marginRight;
private float _marginLeft;
private float _marginBottom;
@ -227,7 +229,7 @@ public class Keyboard2View extends View
return null;
for (KeyboardData.Row row : _keyboard.rows)
{
y += (row.shift + row.height) * _config.keyHeight;
y += (row.shift + row.height) * _tc.row_height;
if (ty < y)
return row;
}
@ -307,9 +309,19 @@ public class Keyboard2View extends View
_marginRight = Math.max(_config.horizontal_margin, insets_right);
_marginBottom = _config.margin_bottom + insets_bottom;
_keyWidth = (width - _marginLeft - _marginRight) / _keyboard.keysWidth;
_tc = new Theme.Computed(_theme, _config, _keyWidth);
_tc = new Theme.Computed(_theme, _config, _keyWidth, _keyboard);
// Compute the size of labels based on the width or the height of keys. The
// margin around keys is taken into account. Keys normal aspect ratio is
// assumed to be 3/2. It's generally more, the width computation is useful
// when the keyboard is unusually high.
float labelBaseSize = Math.min(
_tc.row_height - _tc.vertical_margin,
_keyWidth * 3/2 - _tc.horizontal_margin
) * _config.characterSize;
_mainLabelSize = labelBaseSize * _config.labelTextSize;
_subLabelSize = labelBaseSize * _config.sublabelTextSize;
int height =
(int)(_config.keyHeight * _keyboard.keysHeight
(int)(_tc.row_height * _keyboard.keysHeight
+ _config.marginTop + _marginBottom);
setMeasuredDimension(width, height);
}
@ -352,9 +364,9 @@ public class Keyboard2View extends View
float y = _tc.margin_top;
for (KeyboardData.Row row : _keyboard.rows)
{
y += row.shift * _config.keyHeight;
y += row.shift * _tc.row_height;
float x = _marginLeft + _tc.margin_left;
float keyH = row.height * _config.keyHeight - _tc.vertical_margin;
float keyH = row.height * _tc.row_height - _tc.vertical_margin;
for (KeyboardData.Key k : row.keys)
{
x += k.shift * _keyWidth;
@ -372,7 +384,7 @@ public class Keyboard2View extends View
drawIndication(canvas, k, x, y, keyW, keyH, _tc);
x += _keyWidth * k.width;
}
y += row.height * _config.keyHeight;
y += row.height * _tc.row_height;
}
}
@ -440,7 +452,7 @@ public class Keyboard2View extends View
kv = modifyKey(kv, _mods);
if (kv == null)
return;
float textSize = scaleTextSize(kv, _config.labelTextSize, keyH);
float textSize = scaleTextSize(kv, true);
Paint p = tc.label_paint(kv.hasFlagsAny(KeyValue.FLAG_KEY_FONT), labelColor(kv, isKeyDown, false), textSize);
canvas.drawText(kv.getString(), x, (keyH - p.ascent() - p.descent()) / 2f + y, p);
}
@ -454,7 +466,7 @@ public class Keyboard2View extends View
kv = modifyKey(kv, _mods);
if (kv == null)
return;
float textSize = scaleTextSize(kv, _config.sublabelTextSize, keyH);
float textSize = scaleTextSize(kv, false);
Paint p = tc.sublabel_paint(kv.hasFlagsAny(KeyValue.FLAG_KEY_FONT), labelColor(kv, isKeyDown, true), textSize, a);
float subPadding = _config.keyPadding;
if (v == Vertical.CENTER)
@ -479,14 +491,15 @@ public class Keyboard2View extends View
if (k.indication == null || k.indication.equals(""))
return;
Paint p = tc.indication_paint;
p.setTextSize(keyH * _config.sublabelTextSize * _config.characterSize);
p.setTextSize(_subLabelSize);
canvas.drawText(k.indication, 0, k.indication.length(),
x + keyW / 2f, (keyH - p.ascent() - p.descent()) * 4/5 + y, p);
}
private float scaleTextSize(KeyValue k, float rel_size, float keyH)
private float scaleTextSize(KeyValue k, boolean main_label)
{
float smaller_font = k.hasFlagsAny(KeyValue.FLAG_SMALLER_FONT) ? 0.75f : 1.f;
return keyH * rel_size * smaller_font * _config.characterSize;
float label_size = main_label ? _mainLabelSize : _subLabelSize;
return label_size * smaller_font;
}
}

View File

@ -336,9 +336,13 @@ public final class KeyboardData
int status;
float h = attribute_float(parser, "height", 1f);
float shift = attribute_float(parser, "shift", 0f);
float scale = attribute_float(parser, "scale", 0f);
while (expect_tag(parser, "key"))
keys.add(Key.parse(parser));
return new Row(keys, h, shift);
Row row = new Row(keys, h, shift);
if (scale > 0f)
row = row.updateWidth(scale);
return row;
}
public Row copy()

View File

@ -23,6 +23,14 @@ public class SettingsActivity extends PreferenceActivity
}
catch (Exception _e) { fallbackEncrypted(); return; }
addPreferencesFromResource(R.xml.settings);
boolean foldableDevice = FoldStateTracker.isFoldableDevice(this);
findPreference("margin_bottom_portrait_unfolded").setEnabled(foldableDevice);
findPreference("margin_bottom_landscape_unfolded").setEnabled(foldableDevice);
findPreference("horizontal_margin_portrait_unfolded").setEnabled(foldableDevice);
findPreference("horizontal_margin_landscape_unfolded").setEnabled(foldableDevice);
findPreference("keyboard_height_unfolded").setEnabled(foldableDevice);
findPreference("keyboard_height_landscape_unfolded").setEnabled(foldableDevice);
}
void fallbackEncrypted()

View File

@ -94,14 +94,23 @@ public class Theme
public final float horizontal_margin;
public final float margin_top;
public final float margin_left;
public final float row_height;
public final Paint indication_paint;
public final Key key;
public final Key key_activated;
public Computed(Theme theme, Config config, float keyWidth)
public Computed(Theme theme, Config config, float keyWidth, KeyboardData layout)
{
vertical_margin = config.key_vertical_margin * config.keyHeight;
// Rows height is proportional to the keyboard height, meaning it doesn't
// change for layouts with more or less rows. 3.95 is the usual height of
// a layout in KeyboardData unit. The keyboard will be higher if the
// layout has more rows and smaller if it has less because rows stay the
// same height.
row_height = Math.min(
config.screenHeightPixels * config.keyboardHeightPercent / 100 / 3.95f,
config.screenHeightPixels / layout.keysHeight);
vertical_margin = config.key_vertical_margin * row_height;
horizontal_margin = config.key_horizontal_margin * keyWidth;
// Add half of the key margin on the left and on the top as it's also
// added on the right and on the bottom of every keys.

View File

@ -122,8 +122,6 @@ public class ExtraKeysPreference extends PreferenceCategory
"combining_kasratan",
"combining_dammatan",
"combining_alef_below",
"combining_kavyka",
"combining_palatalization",
};
/** Whether an extra key is enabled by default. */
@ -267,8 +265,6 @@ public class ExtraKeysPreference extends PreferenceCategory
case "combining_kasratan":
case "combining_dammatan":
case "combining_alef_below":
case "combining_kavyka":
case "combining_palatalization":
id = R.string.key_descr_combining;
break;
}

View File

@ -26,17 +26,17 @@
<key key0="ж" key2="=" key3="+"/>
<key key0="э" key2="|" key3="\\"/>
</row>
<row>
<key width="1.18" key0="shift" key2="loc capslock"/>
<key width="0.96" key0="я"/>
<key width="0.96" key0="ч"/>
<key width="0.96" key0="с"/>
<key width="0.96" key0="м"/>
<key width="0.96" key0="и" key1="loc і" key2="&lt;" key3="."/>
<key width="0.96" key0="т" key2="&gt;" key3=","/>
<key width="0.96" key0="ь" key1="ъ" key2="\?" key3="/"/>
<key width="0.96" key0="б" key2=":" key3=";"/>
<key width="0.96" key0="ю" key2="&quot;" key3="'"/>
<key width="1.18" key0="backspace" key2="delete"/>
<row scale="11">
<key width="1.22" key0="shift" key2="loc capslock"/>
<key key0="я"/>
<key key0="ч"/>
<key key0="с"/>
<key key0="м"/>
<key key0="и" key1="loc і" key2="&lt;" key3="."/>
<key key0="т" key2="&gt;" key3=","/>
<key key0="ь" key1="ъ" key2="\?" key3="/"/>
<key key0="б" key2=":" key3=";"/>
<key key0="ю" key2="&quot;" key3="'"/>
<key width="1.22" key0="backspace" key2="delete"/>
</row>
</keyboard>

View File

@ -26,17 +26,17 @@
<key key0="ж" key7="0" />
<key key0="э" key7="\?" key3="/" />
</row>
<row>
<key width="1.18" key0="shift" key2="loc capslock" />
<key width="0.96" key0="я" key7="`" key8=";" />
<key width="0.96" key0="ч" key7="*" key8=":" />
<key width="0.96" key0="с" key7="&amp;" key8="\#" />
<key width="0.96" key0="м" key7="|" key8="\\" />
<key width="0.96" key0="и" key7="~" />
<key width="0.96" key0="т" key7="ц" />
<key width="0.96" key0="ӣ" key3="&lt;" key2="&gt;" />
<key width="0.96" key0="б" key7="ъ" key8="ы" />
<key width="0.96" key0="ю" key7="&quot;" key8="'"/>
<key width="1.18" key0="." key7="," />
<row scale="11">
<key width="1.22" key0="shift" key2="loc capslock" />
<key key0="я" key7="`" key8=";" />
<key key0="ч" key7="*" key8=":" />
<key key0="с" key7="&amp;" key8="\#" />
<key key0="м" key7="|" key8="\\" />
<key key0="и" key7="~" />
<key key0="т" key7="ц" />
<key key0="ӣ" key3="&lt;" key2="&gt;" />
<key key0="б" key7="ъ" key8="ы" />
<key key0="ю" key7="&quot;" key8="'"/>
<key width="1.22" key0="." key7="," />
</row>
</keyboard>

View File

@ -26,17 +26,17 @@
<key key0="ж" key7="0" />
<key key0="э" key7="/" key8="|" />
</row>
<row>
<key width="1.18" key0="shift" />
<key width="0.96" key0="ꙗ" key7="combining_breve" key8=";" />
<key width="0.96" key0="ч" key7="combining_pokrytie" key8=":" />
<key width="0.96" key0="с" key7="combining_inverted_breve" key8="`" />
<key width="0.96" key0="м" key7="ѭ" />
<key width="0.96" key0="и" key7="combining_vertical_tilde" key8="-" />
<key width="0.96" key0="т" key7="\?" key8="\\" />
<key width="0.96" key0="ц" key3="&lt;" key2="&gt;" />
<key width="0.96" key0="б" key3="(" key2=")" />
<key width="0.96" key0="ю" key3="{" key2="}" />
<key width="1.18" key0="." key7="," key8="_" />
<row scale="11">
<key width="1.22" key0="shift" />
<key key0="ꙗ" key7="combining_breve" key8=";" />
<key key0="ч" key7="combining_pokrytie" key8=":" />
<key key0="с" key7="combining_inverted_breve" key8="`" />
<key key0="м" key7="ѭ" />
<key key0="и" key7="combining_vertical_tilde" key8="-" />
<key key0="т" key7="\?" key8="\\" />
<key key0="ц" key3="&lt;" key2="&gt;" />
<key key0="б" key3="(" key2=")" />
<key key0="ю" key3="{" key2="}" />
<key width="1.22" key0="." key7="," key8="_" />
</row>
</keyboard>

View File

@ -1,22 +1,22 @@
<?xml version="1.0" encoding="utf-8"?>
<keyboard name="देवनागरी (हिंदी)-2" script="devanagari">
<row>
<key shift="0.35" width="0.9" c="क" nw="ख" ne="घ" sw="ङ" se="ग"/>
<key width="0.9" c="च" nw="छ" ne="झ" sw="ञ" se="ज"/>
<key width="0.9" c="ट" nw="ठ" ne="ढ" sw="ण" se="ड" anticircle="७" indication="७"/>
<key width="0.9" c="त" nw="थ" ne="ध" sw="न" se="द" anticircle="८" indication="८"/>
<key width="0.9" c="प" nw="फ" ne="भ" sw="म" se="ब" anticircle="९" indication="९"/>
<key width="0.9" c="र" nw="ज्ञ" ne="ल" sw="य" se="व"/>
<key width="0.9" c="ह" nw="श" ne="ळ" sw="स" se="ष"/>
<row scale="6.6">
<key shift="0.35" c="क" nw="ख" ne="घ" sw="ङ" se="ग"/>
<key c="च" nw="छ" ne="झ" sw="ञ" se="ज"/>
<key c="ट" nw="ठ" ne="ढ" sw="ण" se="ड" anticircle="७" indication="७"/>
<key c="त" nw="थ" ne="ध" sw="न" se="द" anticircle="८" indication="८"/>
<key c="प" nw="फ" ne="भ" sw="म" se="ब" anticircle="९" indication="९"/>
<key c="र" nw="ज्ञ" ne="ल" sw="य" se="व"/>
<key c="ह" nw="श" ne="ळ" sw="स" se="ष"/>
</row>
<row>
<key shift="0.35" width="0.9" c="ा" nw="अ" ne="आ"/>
<key width="0.9" c="ि" nw="इ"/>
<key width="0.9" c="ी" nw="ई" anticircle="४" indication="४"/>
<key width="0.9" c="ु" nw="उ" ne="ऊ" se="ू" anticircle="५" indication="५"/>
<key width="0.9" c="े" nw="ए" ne="ऋ" se="ृ" anticircle="६" indication="६"/>
<key width="0.9" c="ै" nw="ऐ" ne="ऌ" se="ॢ"/>
<key width="0.9" c="ो" nw="ओ" ne="औ" se="ौ"/>
<row scale="6.6">
<key shift="0.35" c="ा" nw="अ" ne="आ"/>
<key c="ि" nw="इ"/>
<key c="ी" nw="ई" anticircle="४" indication="४"/>
<key c="ु" nw="उ" ne="ऊ" se="ू" anticircle="५" indication="५"/>
<key c="े" nw="ए" ne="ऋ" se="ृ" anticircle="६" indication="६"/>
<key c="ै" nw="ऐ" ne="ऌ" se="ॢ"/>
<key c="ो" nw="ओ" ne="औ" se="ौ"/>
</row>
<row>
<key c="ऽ" se="\@"/>

View File

@ -14,17 +14,17 @@
<key key0="פ" key2="0" key3="b)" key4="rlm"/>
<key key0="backspace" key2="delete"/>
</row>
<row>
<key key0="ש" key2="`" key1="loc tab" key3="sindot_placeholder" key4="shindot_placeholder" width="1.333"/>
<key key0="ד" key1="~" width="1.0333"/>
<key key0="ג" key1="geresh" key2="gershayim" width="1.0333"/>
<key key0="כ" width="1.0333"/>
<key key0="ע" width="1.0333"/>
<key key0="י" key2="-" key3="_" key4="maqaf" width="1.0333"/>
<key key0="ח" key2="=" key3="+" width="1.0333"/>
<key key0="ל" key2="b[" key3="b{" width="1.0333"/>
<key key0="ך" key2="b]" key3="b}" width="1.0333"/>
<key key0="ף" key2="," key3="&quot;" key1=":" width="1.4006"/>
<row scale="11">
<key key0="ש" key2="`" key1="loc tab" key3="sindot_placeholder" key4="shindot_placeholder" width="1.30"/>
<key key0="ד" key1="~"/>
<key key0="ג" key1="geresh" key2="gershayim"/>
<key key0="כ"/>
<key key0="ע"/>
<key key0="י" key2="-" key3="_" key4="maqaf"/>
<key key0="ח" key2="=" key3="+"/>
<key key0="ל" key2="b[" key3="b{"/>
<key key0="ך" key2="b]" key3="b}"/>
<key key0="ף" key2="," key3="&quot;" key1=":" width="1.35"/>
</row>
<row>
<key key0="\\" key1="|" key2="shift" key3="loc capslock"/>

View File

@ -1,29 +1,29 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Inspired by the bépo layout, but adapted to smartphone -->
<keyboard name="BEPO (Français)" script="latin">
<row>
<key width="1.1" key0="b" key1="loc esc" key2="1" key4="|"/>
<key width="1.1" key0="é" key2="2" key4="è"/>
<key width="1.1" key0="p" key2="3"/>
<key width="1.1" key0="o" key2="4" key4="accent_circonflexe"/>
<key width="1.1" key0="v" key2="5" key4="{"/>
<key width="1.1" key0="d" key2="6" key4="}"/>
<key width="1.1" key0="l" key2="7" key4="("/>
<key width="1.1" key0="j" key2="8" key4=")"/>
<key width="1.1" key0="z" key2="9" key4="["/>
<key width="1.1" key0="w" key2="0" key4="]"/>
<row scale="11">
<key key0="b" key1="loc esc" key2="1" key4="|"/>
<key key0="é" key2="2" key4="è"/>
<key key0="p" key2="3"/>
<key key0="o" key2="4" key4="accent_circonflexe"/>
<key key0="v" key2="5" key4="{"/>
<key key0="d" key2="6" key4="}"/>
<key key0="l" key2="7" key4="("/>
<key key0="j" key2="8" key4=")"/>
<key key0="z" key2="9" key4="["/>
<key key0="w" key2="0" key4="]"/>
</row>
<row>
<key width="1.1" key0="a" key1="loc tab" key4="à"/>
<key width="1.1" key0="u" key1="$" key4="ù"/>
<key width="1.1" key0="i" key4="&amp;"/>
<key width="1.1" key0="e" key1="+" key2="accent_trema" key4="€"/>
<key width="1.1" key0="c" key1="=" key4="ç"/>
<key width="1.1" key0="t" key1="^" key4=";"/>
<key width="1.1" key0="s" key4="!"/>
<key width="1.1" key0="r" key4="\?"/>
<key width="1.1" key0="n" key1="`" key2="'" key4=":"/>
<key width="1.1" key0="m" key2="&quot;"/>
<row scale="11">
<key key0="a" key1="loc tab" key4="à"/>
<key key0="u" key1="$" key4="ù"/>
<key key0="i" key4="&amp;"/>
<key key0="e" key1="+" key2="accent_trema" key4="€"/>
<key key0="c" key1="=" key4="ç"/>
<key key0="t" key1="^" key4=";"/>
<key key0="s" key4="!"/>
<key key0="r" key4="\?"/>
<key key0="n" key1="`" key2="'" key4=":"/>
<key key0="m" key2="&quot;"/>
</row>
<row>
<key width="1.5" key0="shift" key2="loc capslock" key3="&lt;"/>

View File

@ -0,0 +1,43 @@
<?xml version="1.0" encoding="utf-8"?>
<keyboard name="QWERTY (Íslenska)" script="latin">
<row>
<key c="q" ne="1" se="loc esc"/>
<key c="w" nw="~" ne="2" sw="\@"/>
<key c="e" nw="!" ne="3" sw="\#" se="€"/>
<key c="r" ne="4" sw="$"/>
<key c="t" ne="5" sw="%"/>
<key c="y" ne="6" sw="^"/>
<key c="u" ne="7" sw="&amp;"/>
<key c="i" ne="8" sw="*"/>
<key c="o" ne="9" sw="(" se=")"/>
<key c="p" ne="0"/>
<key c="ð"/>
</row>
<row>
<key c="a" nw="loc tab" ne="`" se="å"/>
<key c="s" ne="loc §" sw="loc ß"/>
<key c="d"/>
<key c="f"/>
<key c="g" ne="-" sw="_"/>
<key c="h" ne="=" sw="+"/>
<key c="j" se="}" sw="{"/>
<key c="k" sw="[" se="]"/>
<key c="l" ne="|" sw="\\"/>
<key c="æ"/>
<key c="ö" nw="ø"/>
</row>
<row>
<key c="shift" ne="loc capslock"/>
<key c="z"/>
<key c="x" ne="loc †"/>
<key c="c" ne="&lt;" sw="."/>
<key c="v" ne="&gt;" sw=","/>
<key c="b" ne="\?" sw="/"/>
<key c="n" ne=":" sw=";"/>
<key c="m" ne="&quot;" sw="'"/>
<key c="accent_aigu" ne="accent_trema" nw="accent_grave" sw="accent_circonflexe" se="accent_ring"/>
<key c="þ"/>
<key c="backspace" ne="delete"/>
</row>
</keyboard>

View File

@ -18,8 +18,24 @@ specify a place for a key, if it needed to be added to the layout later.
Keys can be made bigger with the 'width' attribute and blank space can be added
on the left of a key with the 'shift' attribute.
See res/xml/bottom_row.xml for the definition of the bottom row and
doc/Possible-key-values.md for the keys that have a special meaning.
You can define your own bottom row by simply adding another '<row>...<row/>' tag
then disabling the built-in bottom row by adding 'bottom_row="false"' to the
keyboard metadata.
Useful links.
- Web based editor that will simplify editing of this file.
https://unexpected-keyboard-layout-editor.lixquid.com
- Full guide on how to edit the layout.
https://github.com/Julow/Unexpected-Keyboard/tree/master/doc/Custom-layouts.md
- Current definition of the bottom row (for easy importing).
https://github.com/Julow/Unexpected-Keyboard/tree/master/res/xml/bottom_row.xml
- Built-in layouts (for easy importing)
https://github.com/Julow/Unexpected-Keyboard/tree/master/srcs/layouts
-->
<keyboard name="QWERTY (US)" script="latin">
<row>

View File

@ -1,13 +0,0 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" viewBox="-556 0 581 1000">
<g transform="matrix(1 0 0 -1 0 800)">
<path fill="currentColor"
d="M-86.2852 539.639l-33.8447 -33.8447q-54.918 42.1455 -121.969 47.8936v48.5322q86.208 -5.74805 155.813 -62.5811v0v0zM-288.715 553.687q-65.1348 -5.1084 -121.97 -49.1709q0 0.639648 -35.1211 36.3994l1.27637 -1.27734q69.6064 56.834 155.813 62.5811v-48.5322
v0h0.000976562zM-444.529 470.033q-44.0625 -50.4473 -52.3633 -120.052h-48.5322q8.30176 88.7627 67.0508 155.812l-3.19238 2.55469l1.91504 -1.27734l20.4346 -21.0732q14.6875 -15.3252 14.6875 -15.9648v0v0zM14.6104 349.98h-48.5322
q-8.30078 68.9668 -52.3623 121.33l33.8438 34.4834q58.749 -67.0508 67.0508 -155.812v0v-0.000976562zM14.6104 302.725q-7.02441 -92.5938 -63.2197 -159.645l-33.8447 34.4834q42.1465 54.2793 48.5322 125.161h48.5322v0v0zM-448.36 178.843v0
q-42.1455 52.3623 -48.5312 123.885h-48.5332q6.38574 -92.5947 62.5811 -159.646l-1.91504 -1.91504q-0.638672 0 36.3984 37.6758v0zM-82.4531 109.238q-71.5215 -60.665 -159.645 -66.4131v48.5322q68.3271 5.74805 125.8 51.7256zM-288.715 42.8223
q-88.125 5.74805 -159.646 66.4121l33.8447 33.8457q57.4727 -44.0615 125.801 -51.7256v-48.5322v0v0zM-31 823q-113 -140 -255 -140q-73 0 -131 30.5t-124 109.5l15 11q115 -81 239 -81q131 0 241 81z" />
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.4 KiB

View File

@ -1,10 +0,0 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" viewBox="-717 0 725 1000">
<path fill="currentColor"
d="M-247.285 261.361l-33.8447 33.8447q-54.918 -42.1455 -121.969 -47.8936v-48.5322q86.208 5.74805 155.813 62.5811v0v0zM-449.715 247.313q-65.1348 5.1084 -121.97 49.1709q0 -0.639648 -35.1211 -36.3994l1.27637 1.27734q69.6064 -56.834 155.813 -62.5811v48.5322
v0h0.000976562zM-605.529 330.967q-44.0625 50.4473 -52.3633 120.052h-48.5322q8.30176 -88.7627 67.0508 -155.812l-3.19238 -2.55469l1.91504 1.27734l20.4346 21.0732q14.6875 15.3252 14.6875 15.9648v0v0zM-146.39 451.02h-48.5322
q-8.30078 -68.9668 -52.3623 -121.33l33.8438 -34.4834q58.749 67.0508 67.0508 155.812v0v0.000976562zM-146.39 498.275q-7.02441 92.5938 -63.2197 159.645l-33.8447 -34.4834q42.1465 -54.2793 48.5322 -125.161h48.5322v0v0zM-609.36 622.157v0
q-42.1455 -52.3623 -48.5312 -123.885h-48.5332q6.38574 92.5947 62.5811 159.646l-1.91504 1.91504q-0.638672 0 36.3984 -37.6758v0zM-243.453 691.762q-71.5215 60.665 -159.645 66.4131v-48.5322q68.3271 -5.74805 125.8 -51.7256zM-449.715 758.178
q-88.125 -5.74805 -159.646 -66.4121l33.8447 -33.8457q57.4727 44.0615 125.801 51.7256v48.5322v0v0zM-415 174h-24q76 -172 219 -172q74 0 129.5 46.5t88.5 125.5h-24q-26 -49 -70 -75.5t-124 -26.5q-82 0 -125 26.5t-70 75.5z" />
</svg>

Before

Width:  |  Height:  |  Size: 1.4 KiB