#!/usr/bin/perl

#     ckbcomp -- translate XKB layout to loadkeys or kbdcontrol format
#     Copyright © 2005,2006 Anton Zinoviev <anton@lml.bas.bg>

#     This program is free software; you can redistribute it and/or modify
#     it under the terms of the GNU General Public License as published by
#     the Free Software Foundation; either version 2 of the License, or
#     (at your option) any later version.

#     This program is distributed in the hope that it will be useful,
#     but WITHOUT ANY WARRANTY; without even the implied warranty of
#     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#     GNU General Public License for more details.

#     If you have not received a copy of the GNU General Public License
#     along with this program, write to the Free Software Foundation, Inc.,
#     59 Temple Place, Suite 330, Boston, MA  02111-1307  USA

use warnings 'all';
use strict;

my $debug_flag = 1;
sub debug {
    if ($debug_flag) {
	print STDERR "@_";
    }
}

sub warning {
    print STDERR  "WARNING: @_";
}

########### ARGUMENTS ###############################################

my $charmap;
my $compose_charmap;
my $acm;

my $verbosity = 0;

my $installdir=$0;
$installdir =~ s|/[^/]*$||g;
if ($installdir =~ m|/bin$|) {
    $installdir =~ s|/bin$||;
} else {
    $installdir .= "/..";
}
if ( $installdir eq '' || ! -d "$installdir/bin") {
    $installdir = '/usr';
}

my @xdirs = ('/etc/console-setup/ckb',
             "$installdir/etc/console-setup/ckb",
	     '/usr/local/share/X11/xkb',
	     '/usr/share/X11/xkb',
	     '/etc/X11/xkb');

my $keycodes;
my $symbols;

my $rules;
my $model;
my @layouts;
my @variants = ();
my @options = ();
my $compact = 0;
my $backspace = '';
my $freebsd = 0;

while (@ARGV) {
    $_ = shift @ARGV;
    if (s/^-//) {
	if (/^charmap$/) {
	    if ($charmap) {
		die "$0: No more than one -charmap option is allowed\n";
	    }
	    $charmap = $ARGV[0];
	    shift @ARGV;
	} elsif (/^ccharmap$/) {
	    if ($compose_charmap) {
		die "$0: No more than one -ccharmap option is allowed\n";
	    }
	    $compose_charmap = $ARGV[0];
	    shift @ARGV;
	} elsif (/^v(erbose)?$/) {
	    if ($verbosity) {
		die "$0: No more than one -verbose option is allowed\n";
	    }
	    if ($ARGV[0] =~ /^[0-9]|10$/) {
		$verbosity = $ARGV[0];
		shift @ARGV;
	    } else {
		$verbosity = 5;
	    }
	} elsif (/^I(.*)$/) {
	    @xdirs = ($1, @xdirs);
	} elsif (/^keycodes$/) {
	    if ($keycodes) {
		die "$0: No more than one -keycodes option is allowed\n";
	    }
	    $keycodes = $ARGV[0];
	    shift @ARGV;
	} elsif (/^symbols$/) {
	    if ($symbols) {
		die "$0: No more than one -symbols option is allowed\n";
	    }
	    $symbols = $ARGV[0];
	    shift @ARGV;
	} elsif (/^rules$/) {
	    if ($rules) {
		die "$0: No more than one -rules option is allowed\n";
	    }
	    $rules = $ARGV[0];
	    shift @ARGV;
	} elsif (/^model$/) {
	    if ($model) {
		die "$0: No more than one -model option is allowed\n";
	    }
	    $model = $ARGV[0];
	    $model =~ s/[[:space:]]//g;
	    shift @ARGV;
	} elsif (/^layout$/) {
	    if (@layouts) {
		die "$0: No more than one -layout option is allowed\n";
	    }
	    $ARGV[0] =~ s/[[:space:]]//g;
	    @layouts = split (/,/, $ARGV[0], -1);
	    shift @ARGV;
	} elsif (/^variant$/) {
	    if (@variants) {
		die "$0: No more than one -variant option is allowed\n";
	    }
	    $ARGV[0] =~ s/[[:space:]]//g;
	    @variants = split (/,/, $ARGV[0], -1);
	    shift @ARGV;
	} elsif (/^option$/) {
	    $ARGV[0] =~ s/[[:space:]]//g;
	    @options = (@options, split (/,/, $ARGV[0], -1));
	    shift @ARGV;
	} elsif (/^help$|^-help$|^\?$/) {
	    print <<EOT;
Usage: ckbcomp [args] [<layout> [<variant> [<option> ... ]]]
Where legal args are:
-?,-help            Print this message
-charmap <name>     Specifies the encoding to use
-ccharmap <name>    Specifies the encoding to use for compose sequences
-I<dir>             Add <dir> to list of directories to be used
-keycodes <name>    Specifies keycodes component name
-symbols <name>     Specifies symbols component name
-rules <name>       Name of rules file to use
-model <name>       Specifies model used to choose component names
-layout <name>      Specifies layout used to choose component names
-variant <name>     Specifies layout variant used to choose component names
-option <name>      Adds an option used to choose component names
-v[erbose] [<lvl>]  Sets verbosity (1..10).  Higher values yield
                    more messages
-compact            Generate compact keymap
-freebsd            Generate keymap for FreeBSD
-backspace bs|del   Backspace is BS (^h) or DEL (^?)
EOT
            exit 0;
	} elsif (/^compact$/) {
	    $compact = 1;
	} elsif (/^freebsd$/) {
	    $freebsd = 1;
	} elsif (/^backspace$/) {
	    $backspace = $ARGV[0];
            if ($backspace ne 'del' && $backspace ne 'bs') {
                die "$0: Option -backspace accepts either del or bs\n";
            }
            shift @ARGV;
	} else {
	    die "$0: Unknown option -$_\n";
	}
    } else {
	if (! @layouts) {
	    $_ =~ s/[[:space:]]//g;
	    @layouts = split (/,/, $_, -1);
	    @layouts = ('us') if (! @layouts);
	} elsif (! @variants) {
	    $_ =~ s/[[:space:]]//g;
	    @variants = split (/,/, $_, -1);
	    @variants = ('') if (! @variants);
	} else {
	    $_ =~ s/[[:space:]]//g;
	    @options = (@options, split (/,/, $_, -1));
	}
    }
}

$rules = 'base' if (! $rules);
$model = 'pc104' if (! $model);
$backspace = $freebsd ? 'bs' : 'del' if (! $backspace);

########### GLOBAL VARIABLES #########################################

my %rules_variables = (); # The variables defined in the rules file

my $arch = 'at'; # The name of a mapping between X key codes and kernel
                 # keycodes

my %acmtable; # Unicode -> legacy code (defined only when -charmap is given)

my $KEYMAP = ''; # This variable contains the generated keymap

my $broken_caps = 0; # In unicode mode Caps_Lock doesn't work for non-ASCII
                     # letters.  1 = the keymap contains non-ascii letters.
                     # See http://bugzilla.kernel.org/show_bug.cgi?id=7746#c21

my %keycodes_table; # x keysym -> x key code
my %aliases;        # x keysym -> x keysym

my %symbols_table;   # x key code -> [[symbols for group0,...],
                     #                [symbols for group1,...], ...]
my %types_table;     # x key code -> key type (i.e. "TWO_LEVEL")

my $augment_method = 1;   # Constants for different XKB include methods
my $override_method = 2;
my $replace_method = 3;
my $alternate_method = 4;
my $ignore_method = 5;    # This is not a XKB method and means "don't include"

my $filename;       # The name of the currently read file
my $stream = '';    # The contents of $filename that still has not been parsed
my $method = $override_method; # The current method (by default "override")
my $base_group = 0; # The base group to include in (for "symbols" files only)

my %kernel_modifiers = ( # Linux
                         'Shift' => 0x01,
                         'Shift_Lock' => 0x01,
                         'AltGr' => 0x02,
                         'AltGr_Lock' => 0x02,
                         'Control' => 0x04,
                         'Control_Lock' => 0x04,
                         'Alt' => 0x08,
                         'Alt_Lock' => 0x08,
                         'ShiftL' => 0x10,
                         'ShiftL_Lock' => 0x10,
                         'ShiftR' => 0x20,
                         'ShiftR_Lock' => 0x20,
                         'CtrlL' => 0x40,
                         'CtrlL_Lock' => 0x40,
                         'CtrlR' => 0x80,
                         'CtrlR_Lock' => 0x80,
                         # FreeBSD
                         'lshift' => 0x01,
                         'rshift' => 0x01,
                         'shifta' => 0x01, # is this correct ?
                         'lshifta' => 0x01, # is this correct ?
                         'rshifta' => 0x01, # is this correct ?
                         'alt' => 0x02,
                         'lalt' => 0x02,
                         'ralt' => 0x02,
                         'alta' => 0x02, # is this correct ?
                         'lalta' => 0x02, # is this correct ?
                         'ralta' => 0x02, # is this correct ?
                         'ctrl' => 0x04,
                         'lctrl' => 0x04,
                         'rctrl' => 0x04,
                         'ctrla' => 0x04, # is this correct ?
                         'lctrla' => 0x04, # is this correct ?
                         'rctrla' => 0x04, # is this correct ?
                         'alock' => 0x10,
                         'ashift' => 0x10,
    );

my @modifier_combinations = ('plain',
                             'shift',
                             'altgr',
                             'altgr shift',
                             'control',
                             'control shift',
                             'control altgr',
                             'control altgr shift',
                             'alt',
                             'alt shift',
                             'alt altgr',
                             'alt altgr shift',
                             'alt control',
                             'alt control shift',
                             'alt control altgr',
                             'alt control altgr shift',
                             'shiftl',
                             'shiftl shift',
                             'shiftl altgr',
                             'shiftl altgr shift',
                             'shiftl control',
                             'shiftl control shift',
                             'shiftl control altgr',
                             'shiftl control altgr shift',
                             'shiftl alt',
                             'shiftl alt shift',
                             'shiftl alt altgr',
                             'shiftl alt altgr shift',
                             'shiftl alt control',
                             'shiftl alt control shift',
                             'shiftl alt control altgr',
                             'shiftl alt control altgr shift',
                             'shiftr',
                             'shiftr shift',
                             'shiftr altgr',
                             'shiftr altgr shift',
                             'shiftr control',
                             'shiftr control shift',
                             'shiftr control altgr',
                             'shiftr control altgr shift',
                             'shiftr alt',
                             'shiftr alt shift',
                             'shiftr alt altgr',
                             'shiftr alt altgr shift',
                             'shiftr alt control',
                             'shiftr alt control shift',
                             'shiftr alt control altgr',
                             'shiftr alt control altgr shift',
                             'shiftr shiftl',
                             'shiftr shiftl shift',
                             'shiftr shiftl altgr',
                             'shiftr shiftl altgr shift',
                             'shiftr shiftl control',
                             'shiftr shiftl control shift',
                             'shiftr shiftl control altgr',
                             'shiftr shiftl control altgr shift',
                             'shiftr shiftl alt',
                             'shiftr shiftl alt shift',
                             'shiftr shiftl alt altgr',
                             'shiftr shiftl alt altgr shift',
                             'shiftr shiftl alt control',
                             'shiftr shiftl alt control shift',
                             'shiftr shiftl alt control altgr',
                             'shiftr shiftl alt control altgr shift',
                             'ctrll',
                             'ctrll shift',
                             'ctrll altgr',
                             'ctrll altgr shift',
                             'ctrll control',
                             'ctrll control shift',
                             'ctrll control altgr',
                             'ctrll control altgr shift',
                             'ctrll alt',
                             'ctrll alt shift',
                             'ctrll alt altgr',
                             'ctrll alt altgr shift',
                             'ctrll alt control',
                             'ctrll alt control shift',
                             'ctrll alt control altgr',
                             'ctrll alt control altgr shift',
                             'ctrll shiftl',
                             'ctrll shiftl shift',
                             'ctrll shiftl altgr',
                             'ctrll shiftl altgr shift',
                             'ctrll shiftl control',
                             'ctrll shiftl control shift',
                             'ctrll shiftl control altgr',
                             'ctrll shiftl control altgr shift',
                             'ctrll shiftl alt',
                             'ctrll shiftl alt shift',
                             'ctrll shiftl alt altgr',
                             'ctrll shiftl alt altgr shift',
                             'ctrll shiftl alt control',
                             'ctrll shiftl alt control shift',
                             'ctrll shiftl alt control altgr',
                             'ctrll shiftl alt control altgr shift',
                             'ctrll shiftr',
                             'ctrll shiftr shift',
                             'ctrll shiftr altgr',
                             'ctrll shiftr altgr shift',
                             'ctrll shiftr control',
                             'ctrll shiftr control shift',
                             'ctrll shiftr control altgr',
                             'ctrll shiftr control altgr shift',
                             'ctrll shiftr alt',
                             'ctrll shiftr alt shift',
                             'ctrll shiftr alt altgr',
                             'ctrll shiftr alt altgr shift',
                             'ctrll shiftr alt control',
                             'ctrll shiftr alt control shift',
                             'ctrll shiftr alt control altgr',
                             'ctrll shiftr alt control altgr shift',
                             'ctrll shiftr shiftl',
                             'ctrll shiftr shiftl shift',
                             'ctrll shiftr shiftl altgr',
                             'ctrll shiftr shiftl altgr shift',
                             'ctrll shiftr shiftl control',
                             'ctrll shiftr shiftl control shift',
                             'ctrll shiftr shiftl control altgr',
                             'ctrll shiftr shiftl control altgr shift',
                             'ctrll shiftr shiftl alt',
                             'ctrll shiftr shiftl alt shift',
                             'ctrll shiftr shiftl alt altgr',
                             'ctrll shiftr shiftl alt altgr shift',
                             'ctrll shiftr shiftl alt control',
                             'ctrll shiftr shiftl alt control shift',
                             'ctrll shiftr shiftl alt control altgr',
                             'ctrll shiftr shiftl alt control altgr shift',
			    );

# Some Unicodes cause the kernel/loadkeys to issue "Segmentation fault"
# kbd 1.15-1 (deliberately) fails on anything in the range 0xf000..0xffff;
# see http://bugs.debian.org/500116.
my %forbidden;
{
    for my $i (0xf000..0xffff) {
	$forbidden{$i} = 1;
    }
}

my %xkbsym_table = (
    'space' => '0020',
    'exclam' => '0021',
    'quotedbl' => '0022',
    'numbersign' => '0023',
    'dollar' => '0024',
    'percent' => '0025',
    'ampersand' => '0026',
    'apostrophe' => '0027',
    'quoteright' => '0027',
    'parenleft' => '0028',
    'parenlef' => '0028', # Is this recognised by X ? (speling error)
    'parenright' => '0029',
    'asterisk' => '002a',
    'asterix' => '002a', # Is this recognised by X ? (speling error)
    'plus' => '002b',
    'comma' => '002c',
    'minus' => '002d',
    'period' => '002e',
    'slash' => '002f',
    '0' => '0030',
    '1' => '0031',
    '2' => '0032',
    '3' => '0033',
    '4' => '0034',
    '5' => '0035',
    '6' => '0036',
    '7' => '0037',
    '8' => '0038',
    '9' => '0039',
    'colon' => '003a',
    'semicolon' => '003b',
    'less' => '003c',
    'equal' => '003d',
    'greater' => '003e',
    'question' => '003f',
    'at' => '0040',
    'A' => '0041',
    'B' => '0042',
    'C' => '0043',
    'D' => '0044',
    'E' => '0045',
    'F' => '0046',
    'G' => '0047',
    'H' => '0048',
    'I' => '0049',
    'J' => '004a',
    'K' => '004b',
    'L' => '004c',
    'M' => '004d',
    'N' => '004e',
    'O' => '004f',
    'P' => '0050',
    'Q' => '0051',
    'R' => '0052',
    'S' => '0053',
    'T' => '0054',
    'U' => '0055',
    'V' => '0056',
    'W' => '0057',
    'X' => '0058',
    'Y' => '0059',
    'Z' => '005a',
    'bracketleft' => '005b',
    'backslash' => '005c',
    'backlash' => '005c',   # Is this recognised by X ? (speling error)
    'bracketright' => '005d',
    'circumflex' => '005e',
    'asciicircum' => '005e',
    'underscore' => '005f',
    'grave' => '0060',
    'quoteleft' => '0060',
    'a' => '0061',
    'b' => '0062',
    'c' => '0063',
    'd' => '0064',
    'e' => '0065',
    'f' => '0066',
    'g' => '0067',
    'h' => '0068',
    'i' => '0069',
    'j' => '006a',
    'k' => '006b',
    'l' => '006c',
    'm' => '006d',
    'n' => '006e',
    'o' => '006f',
    'p' => '0070',
    'q' => '0071',
    'r' => '0072',
    's' => '0073',
    't' => '0074',
    'u' => '0075',
    'v' => '0076',
    'w' => '0077',
    'x' => '0078',
    'y' => '0079',
    'z' => '007a',
    'braceleft' => '007b',
    'pipe' => '007c', # Is this recognised by X ?
    'bar' => '007c',
    'braceright' => '007d',
    'asciitilde' => '007e',
    'nobreakspace' => '00a0',
    'exclamdown' => '00a1',
    'cent' => '00a2',
    'sterling' => '00a3',
    'currency' => '00a4',
    'yen' => '00a5',
    'brokenbar' => '00a6',
    'section' => '00a7',
    'diaeresis' => '00a8',
    'copyright' => '00a9',
    'ordfeminine' => '00aa',
    'guillemotleft' => '00ab',
    'notsign' => '00ac',
    'hyphen' => '00ad',
    'registered' => '00ae',
    'macron' => '00af',
    'overbar' => '00af',
    'degree' => '00b0',
    'plusminus' => '00b1',
    'twosuperior' => '00b2',
    'threesuperior' => '00b3',
    'acute' => '0027', # APOSTROPHE instead of ACUTE ACCENT
    'mu' => '00b5',
    'paragraph' => '00b6',
    'periodcentered' => '00b7',
    'cedilla' => '00b8',
    'onesuperior' => '00b9',
    'masculine' => '00ba',
    'guillemotright' => '00bb',
    'onequarter' => '00bc',
    'onehalf' => '00bd',
    'threequarters' => '00be',
    'questiondown' => '00bf',
    'Agrave' => '00c0',
    'Aacute' => '00c1',
    'Acircumflex' => '00c2',
    'Atilde' => '00c3',
    'Adiaeresis' => '00c4',
    'Aring' => '00c5',
    'AE' => '00c6',
    'Ccedilla' => '00c7',
    'Egrave' => '00c8',
    'Eacute' => '00c9',
    'Ecircumflex' => '00ca',
    'Ediaeresis' => '00cb',
    'Igrave' => '00cc',
    'Iacute' => '00cd',
    'Icircumflex' => '00ce',
    'Idiaeresis' => '00cf',
    'ETH' => '00d0',
    'Eth' => '00d0',
    'Ntilde' => '00d1',
    'Ograve' => '00d2',
    'Oacute' => '00d3',
    'Ocircumflex' => '00d4',
    'Otilde' => '00d5',
    'Odiaeresis' => '00d6',
    'multiply' => '00d7',
    'Ooblique' => '00d8',
    'Oslash' => '00d8',
    'Ugrave' => '00d9',
    'Uacute' => '00da',
    'Ucircumflex' => '00db',
    'Udiaeresis' => '00dc',
    'Yacute' => '00dd',
    'THORN' => '00de',
    'Thorn' => '00de',
    'ssharp' => '00df',
    'agrave' => '00e0',
    'aacute' => '00e1',
    'acircumflex' => '00e2',
    'atilde' => '00e3',
    'adiaeresis' => '00e4',
    'aring' => '00e5',
    'ae' => '00e6',
    'ccedilla' => '00e7',
    'egrave' => '00e8',
    'eacute' => '00e9',
    'ecircumflex' => '00ea',
    'ediaeresis' => '00eb',
    'igrave' => '00ec',
    'iacute' => '00ed',
    'icircumflex' => '00ee',
    'idiaeresis' => '00ef',
    'eth' => '00f0',
    'ntilde' => '00f1',
    'ograve' => '00f2',
    'oacute' => '00f3',
    'ocircumflex' => '00f4',
    'otilde' => '00f5',
    'odiaeresis' => '00f6',
    'division' => '00f7',
    'oslash' => '00f8',
    'ooblique' => '00f8',
    'ugrave' => '00f9',
    'uacute' => '00fa',
    'ucircumflex' => '00fb',
    'udiaeresis' => '00fc',
    'yacute' => '00fd',
    'thorn' => '00fe',
    'ydiaeresis' => '00ff',
    'Amacron' => '0100',
    'amacron' => '0101',
    'Abreve' => '0102',
    'abreve' => '0103',
    'Aogonek' => '0104',
    'aogonek' => '0105',
    'Cacute' => '0106',
    'cacute' => '0107',
    'Ccircumflex' => '0108',
    'ccircumflex' => '0109',
    'Cabovedot' => '010a',
    'cabovedot' => '010b',
    'Ccaron' => '010c',
    'ccaron' => '010d',
    'Dcaron' => '010e',
    'dcaron' => '010f',
    'Dstroke' => '0110',
    'dstroke' => '0111',
    'Emacron' => '0112',
    'emacron' => '0113',
    'Eabovedot' => '0116',
    'eabovedot' => '0117',
    'Eogonek' => '0118',
    'eogonek' => '0119',
    'Ecaron' => '011a',
    'ecaron' => '011b',
    'Gcircumflex' => '011c',
    'gcircumflex' => '011d',
    'Gbreve' => '011e',
    'gbreve' => '011f',
    'Gabovedot' => '0120',
    'gabovedot' => '0121',
    'Gcedilla' => '0122',
    'gcedilla' => '0123',
    'Hcircumflex' => '0124',
    'hcircumflex' => '0125',
    'Hstroke' => '0126',
    'hstroke' => '0127',
    'Itilde' => '0128',
    'itilde' => '0129',
    'Imacron' => '012a',
    'imacron' => '012b',
    'Ibreve' => '012c',
    'ibreve' => '012d',
    'Iogonek' => '012e',
    'iogonek' => '012f',
    'Iabovedot' => '0130',
    'idotless' => '0131',
    'Jcircumflex' => '0134',
    'jcircumflex' => '0135',
    'Kcedilla' => '0136',
    'kcedilla' => '0137',
    'kra' => '0138',
    'Lacute' => '0139',
    'lacute' => '013a',
    'Lcedilla' => '013b',
    'lcedilla' => '013c',
    'Lcaron' => '013d',
    'lcaron' => '013e',
    'Lstroke' => '0141',
    'lstroke' => '0142',
    'Nacute' => '0143',
    'nacute' => '0144',
    'Ncedilla' => '0145',
    'ncedilla' => '0146',
    'Ncaron' => '0147',
    'ncaron' => '0148',
    'ENG' => '014a',
    'eng' => '014b',
    'Omacron' => '014c',
    'omacron' => '014d',
    'Odoubleacute' => '0150',
    'odoubleacute' => '0151',
    'OE' => '0152',
    'oe' => '0153',
    'Racute' => '0154',
    'racute' => '0155',
    'Rcedilla' => '0156',
    'rcedilla' => '0157',
    'Rcaron' => '0158',
    'rcaron' => '0159',
    'Sacute' => '015a',
    'sacute' => '015b',
    'Scircumflex' => '015c',
    'scircumflex' => '015d',
    'Scedilla' => '015e',
    'scedilla' => '015f',
    'Scaron' => '0160',
    'scaron' => '0161',
    'Tcedilla' => '0162',
    'tcedilla' => '0163',
    'Tcaron' => '0164',
    'tcaron' => '0165',
    'Tslash' => '0166',
    'tslash' => '0167',
    'Utilde' => '0168',
    'utilde' => '0169',
    'Umacron' => '016a',
    'umacron' => '016b',
    'Ubreve' => '016c',
    'ubreve' => '016d',
    'Uring' => '016e',
    'uring' => '016f',
    'Udoubleacute' => '0170',
    'udoubleacute' => '0171',
    'Uogonek' => '0172',
    'uogonek' => '0173',
    'Wcircumflex' => '0174',
    'wcircumflex' => '0175',
    'Ycircumflex' => '0176',
    'ycircumflex' => '0177',
    'Ydiaeresis' => '0178',
    'Zacute' => '0179',
    'zacute' => '017a',
    'Zabovedot' => '017b',
    'zabovedot' => '017c',
    'Zcaron' => '017d',
    'zcaron' => '017e',
    'SCHWA' => '018f',
    'Schwa' => '018f', # Is this recognised by X ?
    'function' => '0192',
    'Obarred' => '019f',
    'Ohorn' => '01a0', # Is this recognised by X ?
    'ohorn' => '01a1', # Is this recognised by X ?
    'Uhorn' => '01af',
    'uhorn' => '01b0',
    'Zstroke' => '01b5',
    'zstroke' => '01b6',
    'EZH' => '01b7',
    'Ezh' => '01b7',
    'Ocaron' => '01d1',
    'ocaron' => '01d2',
    'Gcaron' => '01e6', # Is this recognised by X ?
    'gcaron' => '01e7', # Is this recognised by X ?
    'schwa' => '0259', # Is this recognised by X ?
    'obarred' => '0275',
    'ezh' => '0292',
    'caron' => '02c7',
    'breve' => '02d8',
    'abovedot' => '02d9',
    'ogonek' => '02db',
    'doubleacute' => '02dd',
    'Greek_accentdieresis' => '0385',
    'Greek_ALPHAaccent' => '0386',
    'Greek_EPSILONaccent' => '0388',
    'Greek_ETAaccent' => '0389',
    'Greek_IOTAaccent' => '038a',
    'Greek_OMICRONaccent' => '038c',
    'Greek_UPSILONaccent' => '038e',
    'Greek_OMEGAaccent' => '038f',
    'Greek_iotaaccentdieresis' => '0390',
    'Greek_ALPHA' => '0391',
    'Greek_BETA' => '0392',
    'Greek_GAMMA' => '0393',
    'Greek_DELTA' => '0394',
    'Greek_EPSILON' => '0395',
    'Greek_ZETA' => '0396',
    'Greek_ETA' => '0397',
    'Greek_THETA' => '0398',
    'Greek_IOTA' => '0399',
    'Greek_KAPPA' => '039a',
    'Greek_LAMBDA' => '039b',
    'Greek_LAMDA' => '039b',   # Is this recognised by X ? (speling error)
    'Greek_MU' => '039c',
    'Greek_NU' => '039d',
    'Greek_XI' => '039e',
    'Greek_OMICRON' => '039f',
    'Greek_PI' => '03a0',
    'Greek_RHO' => '03a1',
    'Greek_SIGMA' => '03a3',
    'Greek_TAU' => '03a4',
    'Greek_UPSILON' => '03a5',
    'Greek_PHI' => '03a6',
    'Greek_CHI' => '03a7',
    'Greek_PSI' => '03a8',
    'Greek_OMEGA' => '03a9',
    'Greek_IOTAdiaeresis' => '03aa',
    'Greek_UPSILONdieresis' => '03ab',
    'Greek_alphaaccent' => '03ac',
    'Greek_epsilonaccent' => '03ad',
    'Greek_etaaccent' => '03ae',
    'Greek_iotaaccent' => '03af',
    'Greek_upsilonaccentdieresis' => '03b0',
    'Greek_alpha' => '03b1',
    'Greek_beta' => '03b2',
    'Greek_gamma' => '03b3',
    'Greek_delta' => '03b4',
    'Greek_epsilon' => '03b5',
    'Greek_zeta' => '03b6',
    'Greek_eta' => '03b7',
    'Greek_theta' => '03b8',
    'Greek_iota' => '03b9',
    'Greek_kappa' => '03ba',
    'Greek_lambda' => '03bb',
    'Greek_lamda' => '03bb', # Is this recognised by X ? (speling error)
    'Greek_mu' => '03bc',
    'Greek_nu' => '03bd',
    'Greek_xi' => '03be',
    'Greek_omicron' => '03bf',
    'Greek_pi' => '03c0',
    'Greek_rho' => '03c1',
    'Greek_finalsmallsigma' => '03c2',
    'Greek_sigma' => '03c3',
    'Greek_tau' => '03c4',
    'Greek_upsilon' => '03c5',
    'Greek_phi' => '03c6',
    'Greek_chi' => '03c7',
    'Greek_psi' => '03c8',
    'Greek_omega' => '03c9',
    'Greek_iotadieresis' => '03ca',
    'Greek_upsilondieresis' => '03cb',
    'Greek_omicronaccent' => '03cc',
    'Greek_upsilonaccent' => '03cd',
    'Greek_omegaaccent' => '03ce',
    'Cyrillic_IO' => '0401',
    'Serbian_DJE' => '0402',
    'Macedonia_GJE' => '0403',
    'Ukrainian_IE' => '0404',
    'Macedonia_DSE' => '0405',
    'Ukrainian_I' => '0406',
    'Ukrainian_YI' => '0407',
    'Cyrillic_JE' => '0408',
    'Cyrillic_LJE' => '0409',
    'Cyrillic_NJE' => '040a',
    'Serbian_TSHE' => '040b',
    'Macedonia_KJE' => '040c',
    'Byelorussian_SHORTU' => '040e',
    'Cyrillic_DZHE' => '040f',
    'Cyrillic_A' => '0410',
    'Cyrillic_BE' => '0411',
    'Cyrillic_VE' => '0412',
    'Cyrillic_GHE' => '0413',
    'Cyrillic_DE' => '0414',
    'Cyrillic_IE' => '0415',
    'Cyrillic_ZHE' => '0416',
    'Cyrillic_ZH' => '0416',
    'Cyrillic_ZE' => '0417',
    'Cyrillic_I' => '0418',
    'Cyrillic_SHORTI' => '0419',
    'Cyrillic_KA' => '041a',
    'Cyrillic_EL' => '041b',
    'Cyrillic_EM' => '041c',
    'Cyrillic_EN' => '041d',
    'Cyrillic_N' => '041d',
    'Cyrillic_O' => '041e',
    'Cyrillic_PE' => '041f',
    'Cyrillic_ER' => '0420',
    'Cyrillic_ES' => '0421',
    'Cyrillic_TE' => '0422',
    'Cyrillic_U' => '0423',
    'Cyrillic_EF' => '0424',
    'Cyrillic_F' => '0424',
    'Cyrillic_HA' => '0425',
    'Cyrillic_TSE' => '0426',
    'Cyrillic_CHE' => '0427',
    'Cyrillic_SHA' => '0428',
    'Cyrillic_SHCHA' => '0429',
    'Cyrillic_HARDSIGN' => '042a',
    'Cyrillic_YERU' => '042b',
    'Cyrillic_UI' => '042b',
    'Cyrillic_SOFTSIGN' => '042c',
    'Cyrillic_E' => '042d',
    'Cyrillic_YU' => '042e',
    'Cyrillic_YA' => '042f',
    'Cyrillic_a' => '0430',
    'Cyrillic_be' => '0431',
    'Cyrillic_ve' => '0432',
    'Cyrillic_ghe' => '0433',
    'Cyrillic_de' => '0434',
    'Cyrillic_ie' => '0435',
    'Cyrillic_zhe' => '0436',
    'Cyrillic_zh' => '0436',
    'Cyrillic_ze' => '0437',
    'Cyrillic_i' => '0438',
    'Cyrillic_shorti' => '0439',
    'Cyrillic_ka' => '043a',
    'Cyrillic_el' => '043b',
    'Cyrillic_em' => '043c',
    'Cyrillic_en' => '043d',
    'Cyrillic_n' => '043d',
    'Cyrillic_o' => '043e',
    'Cyrillic_pe' => '043f',
    'Cyrillic_er' => '0440',
    'Cyrillic_es' => '0441',
    'Cyrillic_te' => '0442',
    'Cyrillic_u' => '0443',
    'Cyrillic_ef' => '0444',
    'Cyrillic_f' => '0444',
    'Cyrillic_ha' => '0445',
    'Cyrillic_tse' => '0446',
    'Cyrillic_che' => '0447',
    'Cyrillic_sha' => '0448',
    'Cyrillic_shcha' => '0449',
    'Cyrillic_hardsign' => '044a',
    'Cyrillic_yeru' => '044b',
    'Cyrillic_ui' => '044b',
    'Cyrillic_softsign' => '044c',
    'Cyrillic_e' => '044d',
    'Cyrillic_yu' => '044e',
    'Cyrillic_ya' => '044f',
    'Cyrillic_io' => '0451',
    'Serbian_dje' => '0452',
    'Macedonia_gje' => '0453',
    'Ukrainian_ie' => '0454',
    'Macedonia_dse' => '0455',
    'Ukrainian_i' => '0456',
    'Ukrainian_yi' => '0457',
    'Cyrillic_je' => '0458',
    'Cyrillic_lje' => '0459',
    'Cyrillic_nje' => '045a',
    'Serbian_tshe' => '045b',
    'Macedonia_kje' => '045c',
    'Byelorussian_shortu' => '045e',
    'Cyrillic_dzhe' => '045f',
    'Ukrainian_GHE_WITH_UPTURN' => '0490', # Is this recognised by X ?
    'Ukrainian_ghe_with_upturn' => '0491', # Is this recognised by X ?
    'Cyrillic_GHE_bar' => '0492', # Is this recognised by X ?
    'Cyrillic_ghe_bar' => '0493', # Is this recognised by X ?
    'Cyrillic_ZHE_descender' => '0496',
    'Cyrillic_zhe_descender' => '0497',
    'Cyrillic_KA_descender' => '049a', # Is this recognised by X ?
    'Cyrillic_ka_descender' => '049b', # Is this recognised by X ?
    'Cyrillic_KA_vertstroke' => '049c', # Is this recognised by X ?
    'Cyrillic_ka_vertstroke' => '049d', # Is this recognised by X ?
    'Cyrillic_EN_descender' => '04a2', # Is this recognised by X ?
    'Cyrillic_en_descender' => '04a3', # Is this recognised by X ?
    'Cyrillic_U_straight' => '04ae', # Is this recognised by X ?
    'Cyrillic_u_straight' => '04af', # Is this recognised by X ?
    'Cyrillic_U_straight_bar' => '04b0', # Is this recognised by X ?
    'Cyrillic_u_straight_bar' => '04b1', # Is this recognised by X ?
    'Cyrillic_HA_descender' => '04b2', # Is this recognised by X ?
    'Cyrillic_ha_descender' => '04b3', # Is this recognised by X ?
    'Cyrillic_CHE_descender' => '04b6',
    'Cyrillic_che_descender' => '04b7',
    'Cyrillic_CHE_vertstroke' => '04b8', # Is this recognised by X ?
    'Cyrillic_che_vertstroke' => '04b9', # Is this recognised by X ?
    'Cyrillic_SHHA' => '04ba', # Is this recognised by X ?
    'Cyrillic_shha' => '04bb', # Is this recognised by X ?
    'Cyrillic_SCHWA' => '04d8', # Is this recognised by X ?
    'Cyrillic_schwa' => '04d9', # Is this recognised by X ?
    'Cyrillic_I_macron' => '04e2',
    'Cyrillic_i_macron' => '04e3',
    'Cyrillic_O_bar' => '04e8', # Is this recognised by X ?
    'Cyrillic_o_bar' => '04e9', # Is this recognised by X ?
    'Cyrillic_U_macron' => '04ee',
    'Cyrillic_u_macron' => '04ef',
    'Armenian_AYB' => '0531',
    'Armenian_BEN' => '0532',
    'Armenian_GIM' => '0533',
    'Armenian_DA' => '0534',
    'Armenian_YECH' => '0535',
    'Armenian_ZA' => '0536',
    'Armenian_E' => '0537',
    'Armenian_AT' => '0538',
    'Armenian_TO' => '0539',
    'Armenian_ZHE' => '053a',
    'Armenian_INI' => '053b',
    'Armenian_LYUN' => '053c',
    'Armenian_KHE' => '053d',
    'Armenian_TSA' => '053e',
    'Armenian_KEN' => '053f',
    'Armenian_HO' => '0540',
    'Armenian_DZA' => '0541',
    'Armenian_GHAT' => '0542',
    'Armenian_TCHE' => '0543',
    'Armenian_MEN' => '0544',
    'Armenian_HI' => '0545',
    'Armenian_NU' => '0546',
    'Armenian_SHA' => '0547',
    'Armenian_VO' => '0548',
    'Armenian_CHA' => '0549',
    'Armenian_PE' => '054a',
    'Armenian_JE' => '054b',
    'Armenian_RA' => '054c',
    'Armenian_SE' => '054d',
    'Armenian_VEV' => '054e',
    'Armenian_TYUN' => '054f',
    'Armenian_RE' => '0550',
    'Armenian_TSO' => '0551',
    'Armenian_VYUN' => '0552',
    'Armenian_PYUR' => '0553',
    'Armenian_KE' => '0554',
    'Armenian_O' => '0555',
    'Armenian_FE' => '0556',
    'Armenian_apostrophe' => '055a',
    'Armenian_accent' => '055b',
    'Armenian_shesht' => '055b',
    'Armenian_amanak' => '055c',
    'Armenian_exclam' => '055c',
    'Armenian_but' => '055d',
    'Armenian_separation_mark' => '055d',
    'Armenian_paruyk' => '055e',
    'Armenian_question' => '055e',
    'Armenian_ayb' => '0561',
    'Armenian_ben' => '0562',
    'Armenian_gim' => '0563',
    'Armenian_da' => '0564',
    'Armenian_yech' => '0565',
    'Armenian_za' => '0566',
    'Armenian_e' => '0567',
    'Armenian_at' => '0568',
    'Armenian_to' => '0569',
    'Armenian_zhe' => '056a',
    'Armenian_ini' => '056b',
    'Armenian_lyun' => '056c',
    'Armenian_khe' => '056d',
    'Armenian_tsa' => '056e',
    'Armenian_ken' => '056f',
    'Armenian_ho' => '0570',
    'Armenian_dza' => '0571',
    'Armenian_ghat' => '0572',
    'Armenian_tche' => '0573',
    'Armenian_men' => '0574',
    'Armenian_hi' => '0575',
    'Armenian_nu' => '0576',
    'Armenian_sha' => '0577',
    'Armenian_vo' => '0578',
    'Armenian_cha' => '0579',
    'Armenian_pe' => '057a',
    'Armenian_je' => '057b',
    'Armenian_ra' => '057c',
    'Armenian_se' => '057d',
    'Armenian_vev' => '057e',
    'Armenian_tyun' => '057f',
    'Armenian_re' => '0580',
    'Armenian_tso' => '0581',
    'Armenian_vyun' => '0582',
    'Armenian_pyur' => '0583',
    'Armenian_ke' => '0584',
    'Armenian_o' => '0585',
    'Armenian_fe' => '0586',
    'Armenian_ligature_ew' => '0587',
    'Armenian_full_stop' => '0589',
    'Armenian_verjaket' => '0589',
    'Armenian_hyphen' => '058a',
    'Armenian_yentamna' => '058a',
    'hebrew_aleph' => '05d0',
    'hebrew_bet' => '05d1',
    'hebrew_gimel' => '05d2',
    'hebrew_dalet' => '05d3',
    'hebrew_he' => '05d4',
    'hebrew_waw' => '05d5',
    'hebrew_zain' => '05d6',
    'hebrew_chet' => '05d7',
    'hebrew_tet' => '05d8',
    'hebrew_yod' => '05d9',
    'hebrew_finalkaph' => '05da',
    'hebrew_kaph' => '05db',
    'hebrew_lamed' => '05dc',
    'hebrew_finalmem' => '05dd',
    'hebrew_mem' => '05de',
    'hebrew_finalnun' => '05df',
    'hebrew_nun' => '05e0',
    'hebrew_samech' => '05e1',
    'hebrew_ayin' => '05e2',
    'hebrew_finalpe' => '05e3',
    'hebrew_pe' => '05e4',
    'hebrew_finalzade' => '05e5',
    'hebrew_zade' => '05e6',
    'hebrew_qoph' => '05e7',
    'hebrew_resh' => '05e8',
    'hebrew_shin' => '05e9',
    'hebrew_taw' => '05ea',
    'Arabic_comma' => '060c',
    'Arabic_semicolon' => '061b',
    'Arabic_question_mark' => '061f',
    'Arabic_hamza' => '0621',
    'Arabic_maddaonalef' => '0622',
    'Arabic_hamzaonalef' => '0623',
    'Arabic_hamzaonwaw' => '0624',
    'Arabic_hamzaunderalef' => '0625',
    'Arabic_hamzaonyeh' => '0626',
    'Arabic_alef' => '0627',
    'Arabic_beh' => '0628',
    'Arabic_tehmarbuta' => '0629',
    'Arabic_teh' => '062a',
    'Arabic_theh' => '062b',
    'Arabic_jeem' => '062c',
    'Arabic_hah' => '062d',
    'Arabic_khah' => '062e',
    'Arabic_dal' => '062f',
    'Arabic_thal' => '0630',
    'Arabic_ra' => '0631',
    'Arabic_zain' => '0632',
    'Arabic_seen' => '0633',
    'Arabic_sheen' => '0634',
    'Arabic_sad' => '0635',
    'Arabic_dad' => '0636',
    'Arabic_tah' => '0637',
    'Arabic_zah' => '0638',
    'Arabic_ain' => '0639',
    'Arabic_ghain' => '063a',
    'Arabic_tatweel' => '0640',
    'Arabic_feh' => '0641',
    'Arabic_qaf' => '0642',
    'Arabic_kaf' => '0643',
    'Arabic_lam' => '0644',
    'Arabic_meem' => '0645',
    'Arabic_noon' => '0646',
    'Arabic_ha' => '0647',
    'Arabic_heh' => '0647', # Is this recognised by X ?
    'Arabic_waw' => '0648',
    'Arabic_alefmaksura' => '0649',
    'Arabic_yeh' => '064a',
    'Arabic_fathatan' => '064b',
    'Arabic_dammatan' => '064c',
    'Arabic_kasratan' => '064d',
    'Arabic_fatha' => '064e',
    'Arabic_damma' => '064f',
    'Arabic_kasra' => '0650',
    'Arabic_shadda' => '0651',
    'Arabic_sukun' => '0652',
    'Arabic_madda_above' => '0653', # Is this recognised by X ?
    'Arabic_hamza_above' => '0654', # Is this recognised by X ?
    'Arabic_hamza_below' => '0655', # Is this recognised by X ?
    'Arabic_0' => '0660',
    'Arabic_1' => '0661',
    'Arabic_2' => '0662',
    'Arabic_3' => '0663',
    'Arabic_4' => '0664',
    'Arabic_5' => '0665',
    'Arabic_6' => '0666',
    'Arabic_7' => '0667',
    'Arabic_8' => '0668',
    'Arabic_9' => '0669',
    'Arabic_percent' => '066a',
    'Arabic_superscript_alef' => '0670', # Is this recognised by X ?
    'Arabic_tteh' => '0679',
    'Arabic_peh' => '067e',
    'Arabic_tcheh' => '0686',
    'Arabic_ddal' => '0688',
    'Arabic_rreh' => '0691',
    'Arabic_jeh' => '0698',
    'Arabic_veh' => '06a4',
    'Arabic_keheh' => '06a9',
    'Arabic_gaf' => '06af',
    'Arabic_noon_ghunna' => '06ba',
    'Arabic_heh_doachashmee' => '06be',
    'Arabic_heh_goal' => '06c1',
    'Arabic_farsi_yeh' => '06cc',
    'Farsi_yeh' => '06cc',
    'Arabic_yeh_baree' => '06d2',
    'Arabic_fullstop' => '06d4',
    'Farsi_0' => '06f0',
    'Farsi_1' => '06f1',
    'Farsi_2' => '06f2',
    'Farsi_3' => '06f3',
    'Farsi_4' => '06f4',
    'Farsi_5' => '06f5',
    'Farsi_6' => '06f6',
    'Farsi_7' => '06f7',
    'Farsi_8' => '06f8',
    'Farsi_9' => '06f9',
    'Sinh_ng' => '0d82',
    'Sinh_h2' => '0d83',
    'Sinh_a' => '0d85',
    'Sinh_aa' => '0d86',
    'Sinh_ae' => '0d87',
    'Sinh_aee' => '0d88',
    'Sinh_i' => '0d89',
    'Sinh_ii' => '0d8a',
    'Sinh_u' => '0d8b',
    'Sinh_uu' => '0d8c',
    'Sinh_ri' => '0d8d',
    'Sinh_rii' => '0d8e',
    'Sinh_lu' => '0d8f',
    'Sinh_luu' => '0d90',
    'Sinh_e' => '0d91',
    'Sinh_ee' => '0d92',
    'Sinh_ai' => '0d93',
    'Sinh_o' => '0d94',
    'Sinh_oo' => '0d95',
    'Sinh_au' => '0d96',
    'Sinh_ka' => '0d9a',
    'Sinh_kha' => '0d9b',
    'Sinh_ga' => '0d9c',
    'Sinh_gha' => '0d9d',
    'Sinh_ng2' => '0d9e',
    'Sinh_nga' => '0d9f',
    'Sinh_ca' => '0da0',
    'Sinh_cha' => '0da1',
    'Sinh_ja' => '0da2',
    'Sinh_jha' => '0da3',
    'Sinh_nya' => '0da4',
    'Sinh_jnya' => '0da5',
    'Sinh_nja' => '0da6',
    'Sinh_tta' => '0da7',
    'Sinh_ttha' => '0da8',
    'Sinh_dda' => '0da9',
    'Sinh_ddha' => '0daa',
    'Sinh_nna' => '0dab',
    'Sinh_ndda' => '0dac',
    'Sinh_tha' => '0dad',
    'Sinh_thha' => '0dae',
    'Sinh_dha' => '0daf',
    'Sinh_dhha' => '0db0',
    'Sinh_na' => '0db1',
    'Sinh_ndha' => '0db3',
    'Sinh_pa' => '0db4',
    'Sinh_pha' => '0db5',
    'Sinh_ba' => '0db6',
    'Sinh_bha' => '0db7',
    'Sinh_ma' => '0db8',
    'Sinh_mba' => '0db9',
    'Sinh_ya' => '0dba',
    'Sinh_ra' => '0dbb',
    'Sinh_la' => '0dbd',
    'Sinh_va' => '0dc0',
    'Sinh_sha' => '0dc1',
    'Sinh_ssha' => '0dc2',
    'Sinh_sa' => '0dc3',
    'Sinh_ha' => '0dc4',
    'Sinh_lla' => '0dc5',
    'Sinh_fa' => '0dc6',
    'Sinh_al' => '0dca',
    'Sinh_aa2' => '0dcf',
    'Sinh_ae2' => '0dd0',
    'Sinh_aee2' => '0dd1',
    'Sinh_i2' => '0dd2',
    'Sinh_ii2' => '0dd3',
    'Sinh_u2' => '0dd4',
    'Sinh_uu2' => '0dd6',
    'Sinh_ru2' => '0dd8',
    'Sinh_e2' => '0dd9',
    'Sinh_ee2' => '0dda',
    'Sinh_ai2' => '0ddb',
    'Sinh_o2' => '0ddc',
    'Sinh_oo2' => '0ddd',
    'Sinh_au2' => '0dde',
    'Sinh_lu2' => '0ddf',
    'Sinh_ruu2' => '0df2',
    'Sinh_luu2' => '0df3',
    'Thai_kokai' => '0e01',
    'Thai_khokhai' => '0e02',
    'Thai_khokhuat' => '0e03',
    'Thai_khokhwai' => '0e04',
    'Thai_khokhon' => '0e05',
    'Thai_khorakhang' => '0e06',
    'Thai_ngongu' => '0e07',
    'Thai_chochan' => '0e08',
    'Thai_choching' => '0e09',
    'Thai_chochang' => '0e0a',
    'Thai_soso' => '0e0b',
    'Thai_chochoe' => '0e0c',
    'Thai_yoying' => '0e0d',
    'Thai_dochada' => '0e0e',
    'Thai_topatak' => '0e0f',
    'Thai_thothan' => '0e10',
    'Thai_thonangmontho' => '0e11',
    'Thai_thophuthao' => '0e12',
    'Thai_nonen' => '0e13',
    'Thai_dodek' => '0e14',
    'Thai_totao' => '0e15',
    'Thai_thothung' => '0e16',
    'Thai_thothahan' => '0e17',
    'Thai_thothong' => '0e18',
    'Thai_nonu' => '0e19',
    'Thai_bobaimai' => '0e1a',
    'Thai_popla' => '0e1b',
    'Thai_phophung' => '0e1c',
    'Thai_fofa' => '0e1d',
    'Thai_phophan' => '0e1e',
    'Thai_fofan' => '0e1f',
    'Thai_phosamphao' => '0e20',
    'Thai_moma' => '0e21',
    'Thai_yoyak' => '0e22',
    'Thai_rorua' => '0e23',
    'Thai_ru' => '0e24',
    'Thai_loling' => '0e25',
    'Thai_lu' => '0e26',
    'Thai_wowaen' => '0e27',
    'Thai_sosala' => '0e28',
    'Thai_sorusi' => '0e29',
    'Thai_sosua' => '0e2a',
    'Thai_hohip' => '0e2b',
    'Thai_lochula' => '0e2c',
    'Thai_oang' => '0e2d',
    'Thai_honokhuk' => '0e2e',
    'Thai_paiyannoi' => '0e2f',
    'Thai_saraa' => '0e30',
    'Thai_maihanakat' => '0e31',
    'Thai_saraaa' => '0e32',
    'Thai_saraam' => '0e33',
    'Thai_sarai' => '0e34',
    'Thai_saraii' => '0e35',
    'Thai_saraue' => '0e36',
    'Thai_sarauee' => '0e37',
    'Thai_sarau' => '0e38',
    'Thai_sarauu' => '0e39',
    'Thai_phinthu' => '0e3a',
    'Thai_baht' => '0e3f',
    'Thai_sarae' => '0e40',
    'Thai_saraae' => '0e41',
    'Thai_sarao' => '0e42',
    'Thai_saraaimaimuan' => '0e43',
    'Thai_saraaimaimalai' => '0e44',
    'Thai_lakkhangyao' => '0e45',
    'Thai_maiyamok' => '0e46',
    'Thai_maitaikhu' => '0e47',
    'Thai_maiek' => '0e48',
    'Thai_maitho' => '0e49',
    'Thai_maitri' => '0e4a',
    'Thai_maichattawa' => '0e4b',
    'Thai_thanthakhat' => '0e4c',
    'Thai_nikhahit' => '0e4d',
    'Thai_leksun' => '0e50',
    'Thai_leknung' => '0e51',
    'Thai_leksong' => '0e52',
    'Thai_leksam' => '0e53',
    'Thai_leksi' => '0e54',
    'Thai_lekha' => '0e55',
    'Thai_lekhok' => '0e56',
    'Thai_lekchet' => '0e57',
    'Thai_lekpaet' => '0e58',
    'Thai_lekkao' => '0e59',
    'Georgian_an' => '10d0',
    'Georgian_ban' => '10d1',
    'Georgian_gan' => '10d2',
    'Georgian_don' => '10d3',
    'Georgian_en' => '10d4',
    'Georgian_vin' => '10d5',
    'Georgian_zen' => '10d6',
    'Georgian_tan' => '10d7',
    'Georgian_in' => '10d8',
    'Georgian_kan' => '10d9',
    'Georgian_las' => '10da',
    'Georgian_man' => '10db',
    'Georgian_nar' => '10dc',
    'Georgian_on' => '10dd',
    'Georgian_par' => '10de',
    'Georgian_zhar' => '10df',
    'Georgian_rae' => '10e0',
    'Georgian_san' => '10e1',
    'Georgian_tar' => '10e2',
    'Georgian_un' => '10e3',
    'Georgian_phar' => '10e4',
    'Georgian_khar' => '10e5',
    'Georgian_ghan' => '10e6',
    'Georgian_qar' => '10e7',
    'Georgian_shin' => '10e8',
    'Georgian_chin' => '10e9',
    'Georgian_can' => '10ea',
    'Georgian_jil' => '10eb',
    'Georgian_cil' => '10ec',
    'Georgian_char' => '10ed',
    'Georgian_xan' => '10ee',
    'Georgian_jhan' => '10ef',
    'Georgian_hae' => '10f0',
    'Georgian_he' => '10f1',
    'Georgian_hie' => '10f2',
    'Georgian_we' => '10f3',
    'Georgian_har' => '10f4',
    'Georgian_hoe' => '10f5',
    'Georgian_fi' => '10f6',
    'Hangul_J_Kiyeog' => '11a8',
    'Hangul_J_SsangKiyeog' => '11a9',
    'Hangul_J_KiyeogSios' => '11aa',
    'Hangul_J_Nieun' => '11ab',
    'Hangul_J_NieunJieuj' => '11ac',
    'Hangul_J_NieunHieuh' => '11ad',
    'Hangul_J_Dikeud' => '11ae',
    'Hangul_J_Rieul' => '11af',
    'Hangul_J_RieulKiyeog' => '11b0',
    'Hangul_J_RieulMieum' => '11b1',
    'Hangul_J_RieulPieub' => '11b2',
    'Hangul_J_RieulSios' => '11b3',
    'Hangul_J_RieulTieut' => '11b4',
    'Hangul_J_RieulPhieuf' => '11b5',
    'Hangul_J_RieulHieuh' => '11b6',
    'Hangul_J_Mieum' => '11b7',
    'Hangul_J_Pieub' => '11b8',
    'Hangul_J_PieubSios' => '11b9',
    'Hangul_J_Sios' => '11ba',
    'Hangul_J_SsangSios' => '11bb',
    'Hangul_J_Ieung' => '11bc',
    'Hangul_J_Jieuj' => '11bd',
    'Hangul_J_Cieuc' => '11be',
    'Hangul_J_Khieuq' => '11bf',
    'Hangul_J_Tieut' => '11c0',
    'Hangul_J_Phieuf' => '11c1',
    'Hangul_J_Hieuh' => '11c2',
    'Hangul_J_PanSios' => '11eb',
    'Hangul_J_KkogjiDalrinIeung' => '11f0',
    'Hangul_J_YeorinHieuh' => '11f9',
    'Babovedot' => '1e02', # Is this recognised by X ?
    'babovedot' => '1e03', # Is this recognised by X ?
    'Dabovedot' => '1e0a', # Is this recognised by X ?
    'dabovedot' => '1e0b', # Is this recognised by X ?
    'Fabovedot' => '1e1e', # Is this recognised by X ?
    'fabovedot' => '1e1f', # Is this recognised by X ?
    'Lbelowdot' => '1e36',
    'lbelowdot' => '1e37',
    'Mabovedot' => '1e40', # Is this recognised by X ?
    'mabovedot' => '1e41', # Is this recognised by X ?
    'Pabovedot' => '1e56', # Is this recognised by X ?
    'pabovedot' => '1e57', # Is this recognised by X ?
    'Sabovedot' => '1e60', # Is this recognised by X ?
    'sabovedot' => '1e61', # Is this recognised by X ?
    'Tabovedot' => '1e6a', # Is this recognised by X ?
    'tabovedot' => '1e6b', # Is this recognised by X ?
    'Wgrave' => '1e80',
    'wgrave' => '1e81',
    'Wacute' => '1e82',
    'wacute' => '1e83',
    'Wdiaeresis' => '1e84',
    'wdiaeresis' => '1e85',
    'Xabovedot' => '1e8a',
    'xabovedot' => '1e8b',
    'Abelowdot' => '1ea0',
    'abelowdot' => '1ea1',
    'Ahook' => '1ea2',
    'ahook' => '1ea3',
    'Acircumflexacute' => '1ea4',
    'acircumflexacute' => '1ea5',
    'Acircumflexgrave' => '1ea6',
    'acircumflexgrave' => '1ea7',
    'Acircumflexhook' => '1ea8',
    'acircumflexhook' => '1ea9',
    'Acircumflextilde' => '1eaa',
    'acircumflextilde' => '1eab',
    'Acircumflexbelowdot' => '1eac',
    'acircumflexbelowdot' => '1ead',
    'Abreveacute' => '1eae',
    'abreveacute' => '1eaf',
    'Abrevegrave' => '1eb0',
    'abrevegrave' => '1eb1',
    'Abrevehook' => '1eb2',
    'abrevehook' => '1eb3',
    'Abrevetilde' => '1eb4',
    'abrevetilde' => '1eb5',
    'Abrevebelowdot' => '1eb6',
    'abrevebelowdot' => '1eb7',
    'Ebelowdot' => '1eb8',
    'ebelowdot' => '1eb9',
    'Ehook' => '1eba',
    'ehook' => '1ebb',
    'Etilde' => '1ebc',
    'etilde' => '1ebd',
    'Ecircumflexacute' => '1ebe',
    'ecircumflexacute' => '1ebf',
    'Ecircumflexgrave' => '1ec0',
    'ecircumflexgrave' => '1ec1',
    'Ecircumflexhook' => '1ec2',
    'ecircumflexhook' => '1ec3',
    'Ecircumflextilde' => '1ec4',
    'ecircumflextilde' => '1ec5',
    'Ecircumflexbelowdot' => '1ec6',
    'ecircumflexbelowdot' => '1ec7',
    'Ihook' => '1ec8',
    'ihook' => '1ec9',
    'Ibelowdot' => '1eca',
    'ibelowdot' => '1ecb',
    'Obelowdot' => '1ecc',
    'obelowdot' => '1ecd',
    'Ohook' => '1ece',
    'ohook' => '1ecf',
    'Ocircumflexacute' => '1ed0',
    'ocircumflexacute' => '1ed1',
    'Ocircumflexgrave' => '1ed2',
    'ocircumflexgrave' => '1ed3',
    'Ocircumflexhook' => '1ed4',
    'ocircumflexhook' => '1ed5',
    'Ocircumflextilde' => '1ed6',
    'ocircumflextilde' => '1ed7',
    'Ocircumflexbelowdot' => '1ed8',
    'ocircumflexbelowdot' => '1ed9',
    'Ohornacute' => '1eda',
    'ohornacute' => '1edb',
    'Ohorngrave' => '1edc',
    'ohorngrave' => '1edd',
    'Ohornhook' => '1ede',
    'ohornhook' => '1edf',
    'Ohorntilde' => '1ee0',
    'ohorntilde' => '1ee1',
    'Ohornbelowdot' => '1ee2',
    'ohornbelowdot' => '1ee3',
    'Ubelowdot' => '1ee4',
    'ubelowdot' => '1ee5',
    'Uhook' => '1ee6',
    'uhook' => '1ee7',
    'Uhornacute' => '1ee8',
    'uhornacute' => '1ee9',
    'Uhorngrave' => '1eea',
    'uhorngrave' => '1eeb',
    'Uhornhook' => '1eec',
    'uhornhook' => '1eed',
    'Uhorntilde' => '1eee',
    'uhorntilde' => '1eef',
    'Uhornbelowdot' => '1ef0',
    'uhornbelowdot' => '1ef1',
    'Ygrave' => '1ef2',
    'ygrave' => '1ef3',
    'Ybelowdot' => '1ef4',
    'ybelowdot' => '1ef5',
    'Yhook' => '1ef6',
    'yhook' => '1ef7',
    'Ytilde' => '1ef8',
    'ytilde' => '1ef9',
    'enspace' => '2002',
    'emspace' => '2003',
    'em3space' => '2004',
    'em4space' => '2005',
    'digitspace' => '2007',
    'punctspace' => '2008',
    'thinspace' => '2009',
    'hairspace' => '200a',
    'figdash' => '2012',
    'endash' => '2013',
    'emdash' => '2014',
    'Greek_horizbar' => '2015',
    'hebrew_doublelowline' => '2017',
    'leftsinglequotemark' => '2018',
    'rightsinglequotemark' => '2019',
    'singlelowquotemark' => '201a',
    'leftdoublequotemark' => '201c',
    'rightdoublequotemark' => '201d',
    'doublelowquotemark' => '201e',
    'dagger' => '2020',
    'doubledagger' => '2021',
    'enfilledcircbullet' => '2022',
    'doubbaselinedot' => '2025',
    'ellipsis' => '2026',
    'permille' => '2030',
    'minutes' => '2032',
    'seconds' => '2033',
    'caret' => '2038',
    'guilsinglleft' => '2039',
    'guilsinglright' => '203a',
    'overline' => '203e',
    'zerosuperior' => '2070',
    'foursuperior' => '2074',
    'fivesuperior' => '2075',
    'sixsuperior' => '2076',
    'sevensuperior' => '2077',
    'eightsuperior' => '2078',
    'ninesuperior' => '2079',
    'zerosubscript' => '2080',
    'onesubscript' => '2081',
    'twosubscript' => '2082',
    'threesubscript' => '2083',
    'foursubscript' => '2084',
    'fivesubscript' => '2085',
    'sixsubscript' => '2086',
    'sevensubscript' => '2087',
    'eightsubscript' => '2088',
    'ninesubscript' => '2089',
    'EcuSign' => '20a0',
    'ColonSign' => '20a1',
    'CruzeiroSign' => '20a2',
    'FFrancSign' => '20a3',
    'LiraSign' => '20a4',
    'MillSign' => '20a5',
    'NairaSign' => '20a6',
    'PesetaSign' => '20a7',
    'RupeeSign' => '20a8',
    'WonSign' => '20a9',
    'Korean_Won' => '20a9',
    'NewSheqelSign' => '20aa',
    'DongSign' => '20ab', # Is this recognised by X ?
    'EuroSign' => '20ac',
    'Euro' => '20ac',
    'careof' => '2105',
    'numerosign' => '2116',
    'phonographcopyright' => '2117',
    'prescription' => '211e',
    'trademark' => '2122',
    'onethird' => '2153',
    'twothirds' => '2154',
    'onefifth' => '2155',
    'twofifths' => '2156',
    'threefifths' => '2157',
    'fourfifths' => '2158',
    'onesixth' => '2159',
    'fivesixths' => '215a',
    'oneeighth' => '215b',
    'threeeighths' => '215c',
    'fiveeighths' => '215d',
    'seveneighths' => '215e',
    'leftarrow' => '2190',
    'uparrow' => '2191',
    'rightarrow' => '2192',
    'downarrow' => '2193',
    'implies' => '21d2',
    'ifonlyif' => '21d4',
    'partialderivative' => '2202',
    'partdifferential' => '2202',
    'emptyset' => '2205',
    'nabla' => '2207',
    'elementof' => '2208',
    'notelementof' => '2209',
    'containsas' => '220B',
    'jot' => '2218',
    'radical' => '221a',
    'squareroot' => '221a',
    'cuberoot' => '221b',
    'fourthroot' => '221c',
    'variation' => '221d',
    'infinity' => '221e',
    'logicaland' => '2227',
    'upcaret' => '2227',
    'downcaret' => '2228',
    'logicalor' => '2228',
    'intersection' => '2229',
    'upshoe' => '2229',
    'downshoe' => '222a',
    'union' => '222a',
    'integral' => '222b',
    'dintegral' => '222c',
    'tintegral' => '222d',
    'therefore' => '2234',
    'because' => '2235',
    'approximate' => '223c',
    'similarequal' => '2243',
    'notapproxeq' => '2247',
    'approxeq' => '2248',
    'notidentical' => '2262',
    'notequal' => '2260',
    'identical' => '2261',
    'stricteq' => '2263',
    'lessthanequal' => '2264',
    'greaterthanequal' => '2265',
    'includedin' => '2282',
    'leftshoe' => '2282',
    'includes' => '2283',
    'rightshoe' => '2283',
    'lefttack' => '22a2',
    'righttack' => '22a3',
    'uptack' => '22a4',
    'downtack' => '22a5',
    'upstile' => '2308',
    'downstile' => '230a',
    'telephonerecorder' => '2315',
    'topintegral' => '2320',
    'botintegral' => '2321',
    'leftanglebracket' => '2329',
    'rightanglebracket' => '232a',
    'quad' => '2395',
    'topleftparens' => '239b',
    'botleftparens' => '239d',
    'toprightparens' => '239e',
    'botrightparens' => '23a0',
    'topleftsqbracket' => '23a1',
    'botleftsqbracket' => '23a3',
    'toprightsqbracket' => '23a4',
    'botrightsqbracket' => '23a6',
    'leftmiddlecurlybrace' => '23a8',
    'rightmiddlecurlybrace' => '23ac',
    'leftradical' => '23b7',
    'horizlinescan1' => '23ba',
    'horizlinescan3' => '23bb',
    'horizlinescan7' => '23bc',
    'horizlinescan9' => '23bd',
    'ht' => '2409',
    'lf' => '240a',
    'vt' => '240b',
    'ff' => '240c',
    'cr' => '240d',
    'nl' => '2424',
    'horizconnector' => '2500',
    'horizlinescan5' => '2500',
    'vertbar' => '2502',
    'vertconnector' => '2502',
    'topleftradical' => '250c',
    'upleftcorner' => '250c',
    'uprightcorner' => '2510',
    'lowleftcorner' => '2514',
    'lowrightcorner' => '2518',
    'leftt' => '251c',
    'rightt' => '2524',
    'topt' => '252c',
    'bott' => '2534',
    'crossinglines' => '253c',
    'checkerboard' => '2592',
    'enfilledsqbullet' => '25aa',
    'enopensquarebullet' => '25ab',
    'filledrectbullet' => '25ac',
    'openrectbullet' => '25ad',
    'emfilledrect' => '25ae',
    'emopenrectangle' => '25af',
    'filledtribulletup' => '25b2',
    'opentribulletup' => '25b3',
    'filledrighttribullet' => '25b6',
    'rightopentriangle' => '25b7',
    'filledtribulletdown' => '25bc',
    'opentribulletdown' => '25bd',
    'filledlefttribullet' => '25c0',
    'leftopentriangle' => '25c1',
    'soliddiamond' => '25c6',
    'circle' => '25cb',
    'emopencircle' => '25cb',
    'emfilledcircle' => '25cf',
    'enopencircbullet' => '25e6',
    'openstar' => '2606',
    'telephone' => '260e',
    'signaturemark' => '2613',
    'leftpointer' => '261c',
    'rightpointer' => '261e',
    'femalesymbol' => '2640',
    'malesymbol' => '2642',
    'club' => '2663',
    'heart' => '2665',
    'diamond' => '2666',
    'musicalflat' => '266d',
    'musicalsharp' => '266f',
    'checkmark' => '2713',
    'ballotcross' => '2717',
    'latincross' => '271d',
    'maltesecross' => '2720',
    'braille_dots_1' => '2801',
    'braille_dots_2' => '2802',
    'braille_dots_12' => '2803',
    'braille_dots_3' => '2804',
    'braille_dots_13' => '2805',
    'braille_dots_23' => '2806',
    'braille_dots_123' => '2807',
    'braille_dots_4' => '2808',
    'braille_dots_14' => '2809',
    'braille_dots_24' => '280a',
    'braille_dots_124' => '280b',
    'braille_dots_34' => '280c',
    'braille_dots_134' => '280d',
    'braille_dots_234' => '280e',
    'braille_dots_1234' => '280f',
    'braille_dots_5' => '2810',
    'braille_dots_15' => '2811',
    'braille_dots_25' => '2812',
    'braille_dots_125' => '2813',
    'braille_dots_35' => '2814',
    'braille_dots_135' => '2815',
    'braille_dots_235' => '2816',
    'braille_dots_1235' => '2817',
    'braille_dots_45' => '2818',
    'braille_dots_145' => '2819',
    'braille_dots_245' => '281a',
    'braille_dots_1245' => '281b',
    'braille_dots_345' => '281c',
    'braille_dots_1345' => '281d',
    'braille_dots_2345' => '281e',
    'braille_dots_12345' => '281f',
    'braille_dots_6' => '2820',
    'braille_dots_16' => '2821',
    'braille_dots_26' => '2822',
    'braille_dots_126' => '2823',
    'braille_dots_36' => '2824',
    'braille_dots_136' => '2825',
    'braille_dots_236' => '2826',
    'braille_dots_1236' => '2827',
    'braille_dots_46' => '2828',
    'braille_dots_146' => '2829',
    'braille_dots_246' => '282a',
    'braille_dots_1246' => '282b',
    'braille_dots_346' => '282c',
    'braille_dots_1346' => '282d',
    'braille_dots_2346' => '282e',
    'braille_dots_12346' => '282f',
    'braille_dots_56' => '2830',
    'braille_dots_156' => '2831',
    'braille_dots_256' => '2832',
    'braille_dots_1256' => '2833',
    'braille_dots_356' => '2834',
    'braille_dots_1356' => '2835',
    'braille_dots_2356' => '2836',
    'braille_dots_12356' => '2837',
    'braille_dots_456' => '2838',
    'braille_dots_1456' => '2839',
    'braille_dots_2456' => '283a',
    'braille_dots_12456' => '283b',
    'braille_dots_3456' => '283c',
    'braille_dots_13456' => '283d',
    'braille_dots_23456' => '283e',
    'braille_dots_123456' => '283f',
    'braille_dots_7' => '2840',
    'braille_dots_17' => '2841',
    'braille_dots_27' => '2842',
    'braille_dots_127' => '2843',
    'braille_dots_37' => '2844',
    'braille_dots_137' => '2845',
    'braille_dots_237' => '2846',
    'braille_dots_1237' => '2847',
    'braille_dots_47' => '2848',
    'braille_dots_147' => '2849',
    'braille_dots_247' => '284a',
    'braille_dots_1247' => '284b',
    'braille_dots_347' => '284c',
    'braille_dots_1347' => '284d',
    'braille_dots_2347' => '284e',
    'braille_dots_12347' => '284f',
    'braille_dots_57' => '2850',
    'braille_dots_157' => '2851',
    'braille_dots_257' => '2852',
    'braille_dots_1257' => '2853',
    'braille_dots_357' => '2854',
    'braille_dots_1357' => '2855',
    'braille_dots_2357' => '2856',
    'braille_dots_12357' => '2857',
    'braille_dots_457' => '2858',
    'braille_dots_1457' => '2859',
    'braille_dots_2457' => '285a',
    'braille_dots_12457' => '285b',
    'braille_dots_3457' => '285c',
    'braille_dots_13457' => '285d',
    'braille_dots_23457' => '285e',
    'braille_dots_123457' => '285f',
    'braille_dots_67' => '2860',
    'braille_dots_167' => '2861',
    'braille_dots_267' => '2862',
    'braille_dots_1267' => '2863',
    'braille_dots_367' => '2864',
    'braille_dots_1367' => '2865',
    'braille_dots_2367' => '2866',
    'braille_dots_12367' => '2867',
    'braille_dots_467' => '2868',
    'braille_dots_1467' => '2869',
    'braille_dots_2467' => '286a',
    'braille_dots_12467' => '286b',
    'braille_dots_3467' => '286c',
    'braille_dots_13467' => '286d',
    'braille_dots_23467' => '286e',
    'braille_dots_123467' => '286f',
    'braille_dots_567' => '2870',
    'braille_dots_1567' => '2871',
    'braille_dots_2567' => '2872',
    'braille_dots_12567' => '2873',
    'braille_dots_3567' => '2874',
    'braille_dots_13567' => '2875',
    'braille_dots_23567' => '2876',
    'braille_dots_123567' => '2877',
    'braille_dots_4567' => '2878',
    'braille_dots_14567' => '2879',
    'braille_dots_24567' => '287a',
    'braille_dots_124567' => '287b',
    'braille_dots_34567' => '287c',
    'braille_dots_134567' => '287d',
    'braille_dots_234567' => '287e',
    'braille_dots_1234567' => '287f',
    'braille_dots_8' => '2880',
    'braille_dots_18' => '2881',
    'braille_dots_28' => '2882',
    'braille_dots_128' => '2883',
    'braille_dots_38' => '2884',
    'braille_dots_138' => '2885',
    'braille_dots_238' => '2886',
    'braille_dots_1238' => '2887',
    'braille_dots_48' => '2888',
    'braille_dots_148' => '2889',
    'braille_dots_248' => '288a',
    'braille_dots_1248' => '288b',
    'braille_dots_348' => '288c',
    'braille_dots_1348' => '288d',
    'braille_dots_2348' => '288e',
    'braille_dots_12348' => '288f',
    'braille_dots_58' => '2890',
    'braille_dots_158' => '2891',
    'braille_dots_258' => '2892',
    'braille_dots_1258' => '2893',
    'braille_dots_358' => '2894',
    'braille_dots_1358' => '2895',
    'braille_dots_2358' => '2896',
    'braille_dots_12358' => '2897',
    'braille_dots_458' => '2898',
    'braille_dots_1458' => '2899',
    'braille_dots_2458' => '289a',
    'braille_dots_12458' => '289b',
    'braille_dots_3458' => '289c',
    'braille_dots_13458' => '289d',
    'braille_dots_23458' => '289e',
    'braille_dots_123458' => '289f',
    'braille_dots_68' => '28a0',
    'braille_dots_168' => '28a1',
    'braille_dots_268' => '28a2',
    'braille_dots_1268' => '28a3',
    'braille_dots_368' => '28a4',
    'braille_dots_1368' => '28a5',
    'braille_dots_2368' => '28a6',
    'braille_dots_12368' => '28a7',
    'braille_dots_468' => '28a8',
    'braille_dots_1468' => '28a9',
    'braille_dots_2468' => '28aa',
    'braille_dots_12468' => '28ab',
    'braille_dots_3468' => '28ac',
    'braille_dots_13468' => '28ad',
    'braille_dots_23468' => '28ae',
    'braille_dots_123468' => '28af',
    'braille_dots_568' => '28b0',
    'braille_dots_1568' => '28b1',
    'braille_dots_2568' => '28b2',
    'braille_dots_12568' => '28b3',
    'braille_dots_3568' => '28b4',
    'braille_dots_13568' => '28b5',
    'braille_dots_23568' => '28b6',
    'braille_dots_123568' => '28b7',
    'braille_dots_4568' => '28b8',
    'braille_dots_14568' => '28b9',
    'braille_dots_24568' => '28ba',
    'braille_dots_124568' => '28bb',
    'braille_dots_34568' => '28bc',
    'braille_dots_134568' => '28bd',
    'braille_dots_234568' => '28be',
    'braille_dots_1234568' => '28bf',
    'braille_dots_78' => '28c0',
    'braille_dots_178' => '28c1',
    'braille_dots_278' => '28c2',
    'braille_dots_1278' => '28c3',
    'braille_dots_378' => '28c4',
    'braille_dots_1378' => '28c5',
    'braille_dots_2378' => '28c6',
    'braille_dots_12378' => '28c7',
    'braille_dots_478' => '28c8',
    'braille_dots_1478' => '28c9',
    'braille_dots_2478' => '28ca',
    'braille_dots_12478' => '28cb',
    'braille_dots_3478' => '28cc',
    'braille_dots_13478' => '28cd',
    'braille_dots_23478' => '28ce',
    'braille_dots_123478' => '28cf',
    'braille_dots_578' => '28d0',
    'braille_dots_1578' => '28d1',
    'braille_dots_2578' => '28d2',
    'braille_dots_12578' => '28d3',
    'braille_dots_3578' => '28d4',
    'braille_dots_13578' => '28d5',
    'braille_dots_23578' => '28d6',
    'braille_dots_123578' => '28d7',
    'braille_dots_4578' => '28d8',
    'braille_dots_14578' => '28d9',
    'braille_dots_24578' => '28da',
    'braille_dots_124578' => '28db',
    'braille_dots_34578' => '28dc',
    'braille_dots_134578' => '28dd',
    'braille_dots_234578' => '28de',
    'braille_dots_1234578' => '28df',
    'braille_dots_678' => '28e0',
    'braille_dots_1678' => '28e1',
    'braille_dots_2678' => '28e2',
    'braille_dots_12678' => '28e3',
    'braille_dots_3678' => '28e4',
    'braille_dots_13678' => '28e5',
    'braille_dots_23678' => '28e6',
    'braille_dots_123678' => '28e7',
    'braille_dots_4678' => '28e8',
    'braille_dots_14678' => '28e9',
    'braille_dots_24678' => '28ea',
    'braille_dots_124678' => '28eb',
    'braille_dots_34678' => '28ec',
    'braille_dots_134678' => '28ed',
    'braille_dots_234678' => '28ee',
    'braille_dots_1234678' => '28ef',
    'braille_dots_5678' => '28f0',
    'braille_dots_15678' => '28f1',
    'braille_dots_25678' => '28f2',
    'braille_dots_125678' => '28f3',
    'braille_dots_35678' => '28f4',
    'braille_dots_135678' => '28f5',
    'braille_dots_235678' => '28f6',
    'braille_dots_1235678' => '28f7',
    'braille_dots_45678' => '28f8',
    'braille_dots_145678' => '28f9',
    'braille_dots_245678' => '28fa',
    'braille_dots_1245678' => '28fb',
    'braille_dots_345678' => '28fc',
    'braille_dots_1345678' => '28fd',
    'braille_dots_2345678' => '28fe',
    'braille_dots_12345678' => '28ff',
    'kana_comma' => '3001',
    'kana_fullstop' => '3002',
    'kana_openingbracket' => '300c',
    'kana_closingbracket' => '300d',
    'voicedsound' => '309b',
    'semivoicedsound' => '309c',
    'kana_a' => '30a1',
    'kana_A' => '30a2',
    'kana_i' => '30a3',
    'kana_I' => '30a4',
    'kana_u' => '30a5',
    'kana_U' => '30a6',
    'kana_e' => '30a7',
    'kana_E' => '30a8',
    'kana_o' => '30a9',
    'kana_O' => '30aa',
    'kana_KA' => '30ab',
    'kana_KI' => '30ad',
    'kana_KU' => '30af',
    'kana_KE' => '30b1',
    'kana_KO' => '30b3',
    'kana_SA' => '30b5',
    'kana_SHI' => '30b7',
    'kana_SU' => '30b9',
    'kana_SE' => '30bb',
    'kana_SO' => '30bd',
    'kana_TA' => '30bf',
    'kana_CHI' => '30c1',
    'kana_tsu' => '30c3',
    'kana_TSU' => '30c4',
    'kana_TE' => '30c6',
    'kana_TO' => '30c8',
    'kana_NA' => '30ca',
    'kana_NI' => '30cb',
    'kana_NU' => '30cc',
    'kana_NE' => '30cd',
    'kana_NO' => '30ce',
    'kana_HA' => '30cf',
    'kana_HI' => '30d2',
    'kana_FU' => '30d5',
    'kana_HE' => '30d8',
    'kana_HO' => '30db',
    'kana_MA' => '30de',
    'kana_MI' => '30df',
    'kana_MU' => '30e0',
    'kana_ME' => '30e1',
    'kana_MO' => '30e2',
    'kana_ya' => '30e3',
    'kana_YA' => '30e4',
    'kana_yu' => '30e5',
    'kana_YU' => '30e6',
    'kana_yo' => '30e7',
    'kana_YO' => '30e8',
    'kana_RA' => '30e9',
    'kana_RI' => '30ea',
    'kana_RU' => '30eb',
    'kana_RE' => '30ec',
    'kana_RO' => '30ed',
    'kana_WA' => '30ef',
    'kana_WO' => '30f2',
    'kana_N' => '30f3',
    'kana_conjunctive' => '30fb',
    'kana_middledot' => '30fb', # Is this recognised by X ?
    'prolongedsound' => '30fc',
    'Hangul_Kiyeog' => '3131',
    'Hangul_SsangKiyeog' => '3132',
    'Hangul_KiyeogSios' => '3133',
    'Hangul_Nieun' => '3134',
    'Hangul_NieunJieuj' => '3135',
    'Hangul_NieunHieuh' => '3136',
    'Hangul_Dikeud' => '3137',
    'Hangul_SsangDikeud' => '3138',
    'Hangul_Rieul' => '3139',
    'Hangul_RieulKiyeog' => '313a',
    'Hangul_RieulMieum' => '313b',
    'Hangul_RieulPieub' => '313c',
    'Hangul_RieulSios' => '313d',
    'Hangul_RieulTieut' => '313e',
    'Hangul_RieulPhieuf' => '313f',
    'Hangul_RieulHieuh' => '3140',
    'Hangul_Mieum' => '3141',
    'Hangul_Pieub' => '3142',
    'Hangul_SsangPieub' => '3143',
    'Hangul_PieubSios' => '3144',
    'Hangul_Sios' => '3145',
    'Hangul_SsangSios' => '3146',
    'Hangul_Ieung' => '3147',
    'Hangul_Jieuj' => '3148',
    'Hangul_SsangJieuj' => '3149',
    'Hangul_Cieuc' => '314a',
    'Hangul_Khieuq' => '314b',
    'Hangul_Tieut' => '314c',
    'Hangul_Phieuf' => '314d',
    'Hangul_Hieuh' => '314e',
    'Hangul_A' => '314f',
    'Hangul_AE' => '3150',
    'Hangul_YA' => '3151',
    'Hangul_YAE' => '3152',
    'Hangul_EO' => '3153',
    'Hangul_E' => '3154',
    'Hangul_YEO' => '3155',
    'Hangul_YE' => '3156',
    'Hangul_O' => '3157',
    'Hangul_WA' => '3158',
    'Hangul_WAE' => '3159',
    'Hangul_OE' => '315a',
    'Hangul_YO' => '315b',
    'Hangul_U' => '315c',
    'Hangul_WEO' => '315d',
    'Hangul_WE' => '315e',
    'Hangul_WI' => '315f',
    'Hangul_YU' => '3160',
    'Hangul_EU' => '3161',
    'Hangul_YI' => '3162',
    'Hangul_I' => '3163',
    'Hangul_RieulYeorinHieuh' => '316d',
    'Hangul_SunkyeongeumMieum' => '3171',
    'Hangul_SunkyeongeumPieub' => '3178',
    'Hangul_PanSios' => '317f',
    'Hangul_KkogjiDalrinIeung' => '3181',
    'Hangul_SunkyeongeumPhieuf' => '3184',
    'Hangul_YeorinHieuh' => '3186',
    'Hangul_AraeA' => '318d',
    'Hangul_AraeAE' => '318e',
);

if ($freebsd) {
    %xkbsym_table = 
        (%xkbsym_table,
# Control symbols
         'BackSpace' => 'bs',      # 0008
         'Tab' => 'ht',            # 0009
         'Linefeed' => 'nl',       # 000a
         'Return' => 'cr',         # 000d
         'Escape' => 'esc',        # 001b
# Keypad keys
         'KP_Multiply' => '\'*\'',
         'KP_Add' => 'fkey56',
         'KP_Seprator' => '\',\'', # Is this recognised by X ?
         'KP_Separator' => '\',\'',
         'KP_Subtract' => 'fkey52',
         'KP_Decimal' => '\'.\'',
         'KP_Divide' => '\'/\'',
         'KP_0' => '\'0\'',
         'KP_1' => '\'1\'',
         'KP_2' => '\'2\'',
         'KP_3' => '\'3\'',
         'KP_4' => '\'4\'',
         'KP_5' => '\'5\'',
         'KP_6' => '\'6\'',
         'KP_7' => '\'7\'',
         'KP_8' => '\'8\'',
         'KP_9' => '\'9\'',
         'KP_Enter' => 'cr',
         'KP_Home' => 'fkey49',
         'KP_Left' => 'fkey53',
         'KP_Up' => 'fkey50',
         'KP_Right' => 'fkey55',
         'KP_Down' => 'fkey58',
         'KP_Prior' => 'fkey51',
         'KP_Page_Up' => 'fkey51',
         'KP_Next' => 'fkey59',
         'KP_Page_Down' => 'fkey59',
         'KP_End' => 'fkey57',
         'KP_Begin' => 'fkey54',
         'KP_Insert' => 'fkey60',
         'KP_Delete' => 'del',
         'KP_Space' => 'sp',
         'KP_Equal' => '\'=\'',
         'KP_Tab' => 'ht',
         'KP_F1' => 'fkey01',
         'KP_F2' => 'fkey02',
         'KP_F3' => 'fkey03',
         'KP_F4' => 'fkey04',
# Dead symbols
         'dead_grave' => 'dgra',
         'SunFA_Grave' => 'dgra_grave', # Is this recognised by X ?
         'dead_acute' => 'dacu',
         'SunFA_Acute' => 'dacu', # Is this recognised by X ?
         'dead_circumflex' => 'dcir',
         'SunFA_Circum' => 'dcir', # Is this recognised by X ?
         'dead_tilde' => 'dtil',
         'SunFA_Tilde' => 'dtil',
         'dead_breve' => 'dbre',
         'dead_diaeresis' => 'ddia',
         'SunFA_Diaeresis' => 'ddia', # Is this recognised by X ?
         'dead_doubleacute' => 'ddac',
         'dead_caron' => 'dcar',
         'dead_V' => 'dcar', # Is this correct?
         'dead_cedilla' => 'dced',
         'SunFA_Cedilla' => 'dced', # Is this recognised by X ?
         'dead_ogonek' => 'dogo',
         'dead_macron' => 'dmac',
         'dead_abovedot' => 'ddot',
         'dead_abovering' => 'drin',
         'dead_stroke' => 'nop',
         'dead_belowdot' => '0323',       # ???? Vietnamese
         'dead_hook' => 'dsla',           # ???? Vietnamese
         'dead_belowcomma' => 'nop',
         'dead_currency' => 'nop',
         'dead_doublegrave' => 'nop',
         'dead_invertedbreve' => 'nop',
         'dead_iota' => '03b9',           # ???? Greek
         'dead_horn' => '031b',           # ???? Greek
         'dead_psili' => 'nop',           # ???? Greek
         'dead_dasia' => 'nop',           # ???? Greek
         'dead_greek' => 'fe8c',
# Modifiers
         'Multi_key' => 'nop',
         'Mode_switch' => 'ashift',
         'script_switch' => 'nop',
         'Shift_L' => 'lshift',
         'Shift_R' => 'rshift',
         'Control_L' => 'lctrl',
         'Control_R' => 'rctrl',
         'Caps_Lock' => 'clock',
         'Shift_Lock' => 'clock',
         'Meta_L' => 'meta',
         'Meta_R' => 'meta',
         'Alt_L' => 'lalt',
         'Alt_R' => 'ralt',
         'Super_L' => 'fkey62',
         'Super_R' => 'fkey63',
         'Hyper_L' => 'meta',
         'Hyper_R' => 'meta',
         'ISO_Lock' => 'clock',
         'ISO_Level2_Latch' => 'lshift',
         'ISO_Level3_Shift' => 'alt',
         'ISO_Level3_Latch' => 'alt',
         'ISO_Level3_Lock' => 'alta',
         'ISO_Level5_Shift' => 'alt',
         'ISO_Level5_Latch' => 'alt',
         'ISO_Level5_Lock' => 'alta',
         'ISO_Group_Shift' => 'ashift',
         'ISO_Group_Latch' => 'ashift',
         'ISO_Group_Lock' => 'alock',
         'ISO_Next_Group' => 'alock',
         'ISO_Next_Group_Lock' => 'alock',
         'ISO_Prev_Group' => 'alock',
         'ISO_Prev_Group_Lock' => 'alock',
         'ISO_First_Group' => 'alock',
         'ISO_First_Group_Lock' => 'alock',
         'ISO_Last_Group' => 'alock',
         'ISO_Last_Group_Lock' => 'alock',
# Other symbols
         'NoAction' => 'NoSymbol', # Is this recognised by X ?
         'nosymbol' => 'NoSymbol', # Is this recognised by X ?
         'Nosymbol' => 'NoSymbol', # Is this recognised by X ?
         'noSymbol' => 'NoSymbol', # Is this recognised by X ?
         'NoSymbol' => 'NoSymbol',
         'any' => 'NoSymbol', # Is this recognised by X ?
         'VoidSymbol' => 'nop',
         'voidsymbol' => 'nop', # Is this recognised by X ?
         'ISO_Left_Tab' => 'ht',
         'Clear' => 'nop',
         'Pause' => 'saver',
         'Scroll_Lock' => 'slock',
         'Sys_Req' => 'nop',
         'Delete' => 'fkey61',
         'Codeinput' => 'nop',
         'SingleCandidate' => 'nop',
         'MultipleCandidate' => 'nop',
         'PreviousCandidate' => 'nop',
         'Home' => 'fkey49',
         'Left' => 'fkey53',
         'Up' => 'fkey50',
         'Right' => 'fkey55',
         'Down' => 'fkey58',
         'Prior' => 'fkey51',
         'Page_Up' => 'fkey51',
         'Next' => 'fkey59',
         'Page_Down' => 'fkey59',
         'End' => 'fkey57',
         'Begin' => 'fkey54',
         'Select' => 'fkey57',
         'Print' => 'nscr',
         'Execute' => 'nop',
         'Insert' => 'fkey60',
         'Undo' => 'nop',
         'Redo' => 'nop',
         'Menu' => 'fkey64',
         'Find' => 'fkey49',
         'Cancel' => 'nop',
         'Help' => 'slock', # Is this correct?
         'Break' => 'nop',
         'Num_Lock' => 'nlock',
         'F1' => 'fkey01',
         'F2' => 'fkey02',
         'F3' => 'fkey03',
         'F4' => 'fkey04',
         'F5' => 'fkey05',
         'F6' => 'fkey06',
         'F7' => 'fkey07',
         'F8' => 'fkey08',
         'F9' => 'fkey09',
         'F10' => 'fkey10',
         'F11' => 'fkey11',
         'L1' => 'fkey11',
         'F12' => 'fkey12',
         'L2' => 'fkey12',
         'F13' => 'fkey13',
         'L3' => 'fkey13',
         'F14' => 'fkey14',
         'L4' => 'fkey14',
         'F15' => 'fkey15',
         'L5' => 'fkey15',
         'F16' => 'fkey16',
         'L6' => 'fkey16',
         'F17' => 'fkey17',
         'L7' => 'fkey17',
         'F18' => 'fkey18',
         'L8' => 'fkey18',
         'F19' => 'fkey19',
         'L9' => 'fkey19',
         'F20' => 'fkey20',
         'L10' => 'fkey20',
         'F21' => 'fkey21',
         'R1' => 'fkey21',
         'F22' => 'fkey22',
         'R2' => 'fkey22',
         'F23' => 'fkey23',
         'R3' => 'fkey23',
         'F24' => 'fkey24',
         'R4' => 'fkey24',
         'F25' => 'fkey25',
         'R5' => 'fkey25',
         'F26' => 'fkey26',
         'R6' => 'fkey26',
         'F27' => 'fkey27',
         'R7' => 'fkey27',
         'F28' => 'fkey28',
         'R8' => 'fkey28',
         'F29' => 'fkey29',
         'R9' => 'fkey29',
         'F30' => 'fkey30',
         'R10' => 'fkey30',
         'F31' => 'fkey31',
         'R11' => 'fkey31',
         'F32' => 'fkey32',
         'R12' => 'fkey32',
         'F33' => 'fkey33',
         'R13' => 'fkey33',
         'F34' => 'fkey34',
         'R14' => 'fkey34',
         'F35' => 'fkey35',
         'R15' => 'fkey35',
         'Terminate_Server' => 'nop',
         'Pointer_EnableKeys' => 'nop',
         'XF86_Switch_VT_1' => 'scr01',
         'XF86_Switch_VT_2' => 'scr02',
         'XF86_Switch_VT_3' => 'scr03',
         'XF86_Switch_VT_4' => 'scr04',
         'XF86_Switch_VT_5' => 'scr05',
         'XF86_Switch_VT_6' => 'scr06',
         'XF86_Switch_VT_7' => 'scr07',
         'XF86_Switch_VT_8' => 'scr08',
         'XF86_Switch_VT_9' => 'scr09',
         'XF86_Switch_VT_10' => 'scr10',
         'XF86_Switch_VT_11' => 'scr11',
         'XF86_Switch_VT_12' => 'scr12',
         'XF86_ClearGrab' => 'nop',
         'XF86_Ungrab' => 'nop',
         'XF86_Next_VMode' => 'nop',
         'XF86_Prev_VMode' => 'nop',
         'XF86Copy' => 'nop',
         'XF86Cut' => 'nop',
         'XF86Paste' => 'nop',
         'XF86AudioLowerVolume' => 'nop',
         'XF86AudioRaiseVolume' => 'nop',
         'XF86AudioMute' => 'nop',
         'XF86PowerOff' => 'nop',
         'XF86AudioForward' => 'nop',
         'XF86AudioMedia' => 'nop',
         'XF86AudioNext' => 'nop',
         'XF86AudioPause' => 'nop',
         'XF86AudioPlay' => 'nop',
         'XF86AudioPrev' => 'nop',
         'XF86AudioRecord' => 'nop',
         'XF86AudioRewind' => 'nop',
         'XF86AudioStop' => 'nop',
         'XF86Back' => 'nop',
         'XF86Battery' => 'nop',
         'XF86Bluetooth' => 'nop',
         'XF86Calculator' => 'nop',
         'XF86Close' => 'nop',
         'XF86Display' => 'nop',
         'XF86Documents' => 'nop',
         'XF86DOS' => 'nop',
         'XF86Eject' => 'nop',
         'XF86Explorer' => 'nop',
         'XF86Favorites' => 'nop',
         'XF86Finance' => 'nop',
         'XF86Forward' => 'nop',
         'XF86HomePage' => 'nop',
         'XF86KbdBrightnessDown' => 'nop',
         'XF86KbdBrightnessUp' => 'nop',
         'XF86KbdLightOnOff' => 'nop',
         'XF86Launch1' => 'nop',
         'XF86Launch2' => 'nop',
         'XF86Launch3' => 'nop',
         'XF86Launch4' => 'nop',
         'XF86Mail' => 'nop',
         'XF86MailForward' => 'nop',
         'XF86MenuKB' => 'nop',
         'XF86MonBrightnessDown' => 'nop',
         'XF86MonBrightnessUp' => 'nop',
         'XF86MyComputer' => 'nop',
         'XF86New' => 'nop',
         'XF86Phone' => 'nop',
         'XF86Reload' => 'nop',
         'XF86Reply' => 'nop',
         'XF86RotateWindows' => 'nop',
         'XF86Save' => 'nop',
         'XF86ScreenSaver' => 'nop',
         'XF86ScrollDown' => 'nop',
         'XF86ScrollUp' => 'nop',
         'XF86Search' => 'nop',
         'XF86Send' => 'nop',
         'XF86Shop' => 'nop',
         'XF86Sleep' => 'nop',
         'XF86Suspend' => 'nop',
         'XF86Tools' => 'nop',
         'XF86TouchpadToggle' => 'nop',
         'XF86WakeUp' => 'nop',
         'XF86WebCam' => 'nop',
         'XF86WLAN' => 'nop',
         'XF86WWW' => 'nop',
         'XF86Xfer' => 'nop',
         'braille_blank' => '2800', # What does correspond to these?
         'braille_dot_1' => 'nop', 
         'braille_dot_2' => 'nop',
         'braille_dot_3' => 'nop',
         'braille_dot_4' => 'nop',
         'braille_dot_5' => 'nop',
         'braille_dot_6' => 'nop',
         'braille_dot_7' => 'nop',
         'braille_dot_8' => 'nop',
         'braille_dot_9' => 'nop',
         'braille_dot_10' => 'nop',
# I do not know the Unicodes of these
         '0x1000' => 'nop', # Special symbol for X or syntax error?
         '0x13a4' => 'nop', # Special symbol for X or syntax error?
         '0xfe11' => 'nop', # Special symbol for X or syntax error?
         'leftcaret' => 'nop', # Is this recognised by X ?
         'guj_rra' => 'nop', # Is this recognised by X ?
         'guj_nnna' => 'nop', # Is this recognised by X ?
         'guj_llla' => 'nop', # Is this recognised by X ?
         'gur_visarga' => 'nop', # Is this recognised by X ?
         'gur_v_r' => 'nop', # Is this recognised by X ?
         'gur_v_r_s' => 'nop', # Is this recognised by X ?
         'Eisu_toggle' => 'nop', # Is this recognised by X ?
         'Zenkaku_Hankaku' => 'nop', # Is this recognised by X ?
         'Kanji' => 'nop', # Is this recognised by X ?
         'Hangul' => 'nop', # Is this recognised by X ?
         'Hangul_Hanja' => 'nop', # Is this recognised by X ?
         'Henkan' => 'nop',
         'Hiragana' => 'nop',
         'Hiragana_Katakana' => 'nop',
         'Katakana' => 'nop',
         'Muhenkan' => 'nop',
# XFree86 does not recognise these
         'SunAudioLowerVolume' => 'nop',
         'SunAudioRaiseVolume' => 'nop',
         'SunAudioMute' => 'nop',
         'SunCopy' => 'nop',
         'SunCut' => 'nop',
         'SunPaste' => 'nop',
         'SunAgain' => 'nop',
         'SunUndo' => 'nop',
         'SunFind' => 'nop',
         'SunStop' => 'nop',
         'SunF36' => 'nop',
         'SunF37' => 'nop',
         'SunFront' => 'nop',
         'SunOpen' => 'nop',
         'SunPowerSwitch' => 'nop',
         'SunPowerSwitchShift' => 'nop',
         'SunProps' => 'nop',
         'SunSys_Req' => 'nop',
         'SunVideoDegauss' => 'nop',
         'SunVideoLowerBrightness' => 'nop',
         'SunVideoRaiseBrightness' => 'nop',
        );
    if ($backspace eq 'del') {
        $xkbsym_table{'BackSpace'} = 'del';
        $xkbsym_table{'Delete'} = 'fkey70';
        $xkbsym_table{'KP_Delete'} = 'fkey70';
    }
} else {
    %xkbsym_table = 
        (%xkbsym_table,
# Control symbols
         'BackSpace' => 'Delete',  # 0008
         'Tab' => 'Tab',           # 0009
         'Linefeed' => 'Linefeed', # 000a
         'Return' => 'Return',     # 000d
         'Escape' => 'Escape',     # 001b
# Keypad keys
         'KP_Multiply' => 'KP_Multiply',
         'KP_Add' => 'KP_Add',
         'KP_Seprator' => 'KP_Comma', # Is this recognised by X ?
         'KP_Separator' => 'KP_Comma',
         'KP_Subtract' => 'KP_Subtract',
         'KP_Decimal' => 'KP_Period',
         'KP_Divide' => 'KP_Divide',
         'KP_0' => 'KP_0',
         'KP_1' => 'KP_1',
         'KP_2' => 'KP_2',
         'KP_3' => 'KP_3',
         'KP_4' => 'KP_4',
         'KP_5' => 'KP_5',
         'KP_6' => 'KP_6',
         'KP_7' => 'KP_7',
         'KP_8' => 'KP_8',
         'KP_9' => 'KP_9',
         'KP_Enter' => 'KP_Enter',
# Keypad keys (alternate level)
         'KP_Home' => 'KP_7',
         'KP_Left' => 'KP_4',
         'KP_Up' => 'KP_8',
         'KP_Right' => 'KP_6',
         'KP_Down' => 'KP_2',
         'KP_Prior' => 'KP_9',
         'KP_Page_Up' => 'KP_9',
         'KP_Next' => 'KP_3',
         'KP_Page_Down' => 'KP_3',
         'KP_End' => 'KP_1',
         'KP_Begin' => 'VoidSymbol', # What does correspond to this?
         'KP_Insert' => 'KP_0',
         'KP_Delete' => 'VoidSymbol', # has to be 'KP_Period' or 'KP_Decimal'
# Keypad keys with missing support in the kernel
         'KP_Space' => 'space',
         'KP_Equal' => 'equal',
         'KP_Tab' => 'Tab',
         'KP_F1' => 'F1',
         'KP_F2' => 'F2',
         'KP_F3' => 'F3',
         'KP_F4' => 'F4',
# Dead symbols
         'dead_grave' => 'dead_grave',
         'SunFA_Grave' => 'dead_grave', # Is this recognised by X ?
         'dead_acute' => 'dead_acute',
         'SunFA_Acute' => 'dead_acute', # Is this recognised by X ?
         'dead_circumflex' => 'dead_circumflex',
         'SunFA_Circum' => 'dead_circumflex', # Is this recognised by X ?
         'dead_tilde' => 'dead_tilde',
         'SunFA_Tilde' => 'dead_tilde',
         'dead_breve' => 'dead_kbreve',
         'dead_diaeresis' => 'dead_diaeresis',
         'SunFA_Diaeresis' => 'dead_diaeresis', # Is this recognised by X ?
         'dead_doubleacute' => 'dead_kdoubleacute',
         'dead_caron' => 'dead_kcaron',
         'dead_V' => 'dead_caron', # Is this correct?
         'dead_cedilla' => 'dead_cedilla',
         'SunFA_Cedilla' => 'dead_cedilla', # Is this recognised by X ?
         'dead_ogonek' => 'dead_kogonek',
         'dead_macron' => 'dead_macron',
         'dead_abovedot' => 'dead_abovedot',
         'dead_abovering' => 'dead_abovering',
         'dead_stroke' => 'dead_stroke',
         'dead_belowdot' => 'dead_belowdot',
         'dead_hook' => 'dead_hook',
         'dead_belowcomma' => 'dead_belowcomma',
         'dead_currency' => 'dead_currency',
         'dead_doublegrave' => 'dead_doublegrave',
         'dead_invertedbreve' => 'dead_invertedbreve',
         'dead_iota' => 'dead_iota',
         'dead_horn' => 'dead_horn',
# Dead symbols with no support in the kernel
         'dead_psili' => 'VoidSymbol',    # ???? Greek
         'dead_dasia' => 'VoidSymbol',    # ???? Greek
# Modifiers
         'Multi_key' => 'Compose',
         'Mode_switch' => 'ShiftL',
         'script_switch' => 'VoidSymbol',
         'Shift_L' => 'Shift',
         'Shift_R' => 'Shift',
         'Control_L' => 'Control',
         'Control_R' => 'Control',
         'Caps_Lock' => 'Caps_Lock',
         'Shift_Lock' => 'Shift_Lock',
         'Meta_L' => 'Alt',
         'Meta_R' => 'Alt',
         'Alt_L' => 'Alt',
         'Alt_R' => 'Alt',
         'Super_L' => 'Alt',
         'Super_R' => 'Alt',
         'Hyper_L' => 'Alt',
         'Hyper_R' => 'Alt',
         'ISO_Lock' => 'Caps_Lock',
         'ISO_Level2_Latch' => 'Shift',
         'ISO_Level3_Shift' => 'AltGr',
         'ISO_Level3_Latch' => 'AltGr',
         'ISO_Level3_Lock' => 'AltGr_Lock',
         'ISO_Level5_Shift' => 'AltGr',
         'ISO_Level5_Latch' => 'AltGr',
         'ISO_Level5_Lock' => 'AltGr_Lock',
         'ISO_Group_Shift' => 'ShiftL',
         'ISO_Group_Latch' => 'ShiftL',
         'ISO_Group_Lock' => 'ShiftL_Lock',
         'ISO_Next_Group' => 'ShiftL_Lock',
         'ISO_Next_Group_Lock' => 'ShiftL_Lock',
         'ISO_Prev_Group' => 'ShiftL_Lock',
         'ISO_Prev_Group_Lock' => 'ShiftL_Lock',
         'ISO_First_Group' => 'ShiftL_Lock',
         'ISO_First_Group_Lock' => 'ShiftL_Lock',
         'ISO_Last_Group' => 'ShiftL_Lock',
         'ISO_Last_Group_Lock' => 'ShiftL_Lock',
# Other symbols
         'NoAction' => 'NoSymbol', # Is this recognised by X ?
         'nosymbol' => 'NoSymbol', # Is this recognised by X ?
         'Nosymbol' => 'NoSymbol', # Is this recognised by X ?
         'noSymbol' => 'NoSymbol', # Is this recognised by X ?
         'NoSymbol' => 'NoSymbol',
         'any' => 'NoSymbol', # Is this recognised by X ?
         'VoidSymbol' => 'VoidSymbol',
         'voidsymbol' => 'VoidSymbol', # Is this recognised by X ?
         'ISO_Left_Tab' => 'Meta_Tab',
         'Clear' => 'VoidSymbol',
         'Pause' => 'Pause',
         'Scroll_Lock' => 'Scroll_Lock',
         'Sys_Req' => 'Last_Console',
         'Delete' => 'Remove',
         'Codeinput' => 'VoidSymbol',
         'SingleCandidate' => 'VoidSymbol',
         'MultipleCandidate' => 'VoidSymbol',
         'PreviousCandidate' => 'VoidSymbol',
         'Home' => 'Home',
         'Left' => 'Left',
         'Up' => 'Up',
         'Right' => 'Right',
         'Down' => 'Down',
         'Prior' => 'Prior',
         'Page_Up' => 'PageUp',
         'Next' => 'Next',
         'Page_Down' => 'PageDown',
         'End' => 'End',
         'Begin' => 'VoidSymbol',
         'Select' => 'Select',
         'Print' => 'Control_backslash',
         'Execute' => 'VoidSymbol',
         'Insert' => 'Insert',
         'Undo' => 'VoidSymbol',
         'Redo' => 'VoidSymbol',
         'Menu' => 'VoidSymbol',
         'Find' => 'Find',
         'Cancel' => 'VoidSymbol',
         'Help' => 'Help',
         'Break' => 'Break',
         'Num_Lock' => 'Num_Lock',
         'F1' => 'F1',
         'F2' => 'F2',
         'F3' => 'F3',
         'F4' => 'F4',
         'F5' => 'F5',
         'F6' => 'F6',
         'F7' => 'F7',
         'F8' => 'F8',
         'F9' => 'F9',
         'F10' => 'F10',
         'F11' => 'F11',
         'L1' => 'F11',
         'F12' => 'F12',
         'L2' => 'F12',
         'F13' => 'F13',
         'L3' => 'F13',
         'F14' => 'F14',
         'L4' => 'F14',
         'F15' => 'F15',
         'L5' => 'F15',
         'F16' => 'F16',
         'L6' => 'F16',
         'F17' => 'F17',
         'L7' => 'F17',
         'F18' => 'F18',
         'L8' => 'F18',
         'F19' => 'F19',
         'L9' => 'F19',
         'F20' => 'F20',
         'L10' => 'F20',
         'F21' => 'F21',
         'R1' => 'F21',
         'F22' => 'F22',
         'R2' => 'F22',
         'F23' => 'F23',
         'R3' => 'F23',
         'F24' => 'F24',
         'R4' => 'F24',
         'F25' => 'F25',
         'R5' => 'F25',
         'F26' => 'F26',
         'R6' => 'F26',
         'F27' => 'F27',
         'R7' => 'F27',
         'F28' => 'F28',
         'R8' => 'F28',
         'F29' => 'F29',
         'R9' => 'F29',
         'F30' => 'F30',
         'R10' => 'F30',
         'F31' => 'F31',
         'R11' => 'F31',
         'F32' => 'F32',
         'R12' => 'F32',
         'F33' => 'F33',
         'R13' => 'F33',
         'F34' => 'F34',
         'R14' => 'F34',
         'F35' => 'F35',
         'R15' => 'F35',
         'Terminate_Server' => 'VoidSymbol',
         'Pointer_EnableKeys' => 'VoidSymbol',
         'XF86_Switch_VT_1' => 'Console_1',
         'XF86_Switch_VT_2' => 'Console_2',
         'XF86_Switch_VT_3' => 'Console_3',
         'XF86_Switch_VT_4' => 'Console_4',
         'XF86_Switch_VT_5' => 'Console_5',
         'XF86_Switch_VT_6' => 'Console_6',
         'XF86_Switch_VT_7' => 'Console_7',
         'XF86_Switch_VT_8' => 'Console_8',
         'XF86_Switch_VT_9' => 'Console_9',
         'XF86_Switch_VT_10' => 'Console_10',
         'XF86_Switch_VT_11' => 'Console_11',
         'XF86_Switch_VT_12' => 'Console_12',
         'XF86_ClearGrab' => 'VoidSymbol',
         'XF86_Ungrab' => 'VoidSymbol',
         'XF86_Next_VMode' => 'VoidSymbol',
         'XF86_Prev_VMode' => 'VoidSymbol',
         'XF86Copy' => 'VoidSymbol',
         'XF86Cut' => 'VoidSymbol',
         'XF86Paste' => 'VoidSymbol',
         'XF86AudioLowerVolume' => 'VoidSymbol',
         'XF86AudioRaiseVolume' => 'VoidSymbol',
         'XF86AudioMute' => 'VoidSymbol',
         'XF86PowerOff' => 'VoidSymbol',
         'XF86AudioForward' => 'VoidSymbol',
         'XF86AudioMedia' => 'VoidSymbol',
         'XF86AudioNext' => 'VoidSymbol',
         'XF86AudioPause' => 'VoidSymbol',
         'XF86AudioPlay' => 'VoidSymbol',
         'XF86AudioPrev' => 'VoidSymbol',
         'XF86AudioRecord' => 'VoidSymbol',
         'XF86AudioRewind' => 'VoidSymbol',
         'XF86AudioStop' => 'VoidSymbol',
         'XF86Back' => 'VoidSymbol',
         'XF86Battery' => 'VoidSymbol',
         'XF86Bluetooth' => 'VoidSymbol',
         'XF86Calculator' => 'VoidSymbol',
         'XF86Close' => 'VoidSymbol',
         'XF86Display' => 'VoidSymbol',
         'XF86Documents' => 'VoidSymbol',
         'XF86DOS' => 'VoidSymbol',
         'XF86Eject' => 'VoidSymbol',
         'XF86Explorer' => 'VoidSymbol',
         'XF86Favorites' => 'VoidSymbol',
         'XF86Finance' => 'VoidSymbol',
         'XF86Forward' => 'VoidSymbol',
         'XF86HomePage' => 'VoidSymbol',
         'XF86KbdBrightnessDown' => 'VoidSymbol',
         'XF86KbdBrightnessUp' => 'VoidSymbol',
         'XF86KbdLightOnOff' => 'VoidSymbol',
         'XF86Launch1' => 'VoidSymbol',
         'XF86Launch2' => 'VoidSymbol',
         'XF86Launch3' => 'VoidSymbol',
         'XF86Launch4' => 'VoidSymbol',
         'XF86Mail' => 'VoidSymbol',
         'XF86MailForward' => 'VoidSymbol',
         'XF86MenuKB' => 'VoidSymbol',
         'XF86MonBrightnessDown' => 'VoidSymbol',
         'XF86MonBrightnessUp' => 'VoidSymbol',
         'XF86MyComputer' => 'VoidSymbol',
         'XF86New' => 'VoidSymbol',
         'XF86Phone' => 'VoidSymbol',
         'XF86Reload' => 'VoidSymbol',
         'XF86Reply' => 'VoidSymbol',
         'XF86RotateWindows' => 'VoidSymbol',
         'XF86Save' => 'VoidSymbol',
         'XF86ScreenSaver' => 'VoidSymbol',
         'XF86ScrollDown' => 'VoidSymbol',
         'XF86ScrollUp' => 'VoidSymbol',
         'XF86Search' => 'VoidSymbol',
         'XF86Send' => 'VoidSymbol',
         'XF86Shop' => 'VoidSymbol',
         'XF86Sleep' => 'VoidSymbol',
         'XF86Suspend' => 'VoidSymbol',
         'XF86Tools' => 'VoidSymbol',
         'XF86TouchpadToggle' => 'VoidSymbol',
         'XF86WakeUp' => 'VoidSymbol',
         'XF86WebCam' => 'VoidSymbol',
         'XF86WLAN' => 'VoidSymbol',
         'XF86WWW' => 'VoidSymbol',
         'XF86Xfer' => 'VoidSymbol',
         'braille_blank' => 'Brl_blank',
         'braille_dot_1' => 'Brl_dot1',
         'braille_dot_2' => 'Brl_dot2',
         'braille_dot_3' => 'Brl_dot3',
         'braille_dot_4' => 'Brl_dot4',
         'braille_dot_5' => 'Brl_dot5',
         'braille_dot_6' => 'Brl_dot6',
         'braille_dot_7' => 'Brl_dot7',
         'braille_dot_8' => 'Brl_dot8',
         'braille_dot_9' => 'Brl_dot9',
         'braille_dot_10' => 'Brl_dot10',
# I do not know the Unicodes of these
         '0x1000' => 'VoidSymbol', # Special symbol for X or syntax error?
         '0x13a4' => 'VoidSymbol', # Special symbol for X or syntax error?
         '0xfe11' => 'VoidSymbol', # Special symbol for X or syntax error?
         'leftcaret' => 'VoidSymbol', # Is this recognised by X ?
         'guj_rra' => 'VoidSymbol', # Is this recognised by X ?
         'guj_nnna' => 'VoidSymbol', # Is this recognised by X ?
         'guj_llla' => 'VoidSymbol', # Is this recognised by X ?
         'gur_visarga' => 'VoidSymbol', # Is this recognised by X ?
         'gur_v_r' => 'VoidSymbol', # Is this recognised by X ?
         'gur_v_r_s' => 'VoidSymbol', # Is this recognised by X ?
         'Eisu_toggle' => 'VoidSymbol', # Is this recognised by X ?
         'Zenkaku_Hankaku' => 'VoidSymbol', # Is this recognised by X ?
         'Kanji' => 'VoidSymbol', # Is this recognised by X ?
         'Hangul' => 'VoidSymbol', # Is this recognised by X ?
         'Hangul_Hanja' => 'VoidSymbol', # Is this recognised by X ?
         'Henkan' => 'VoidSymbol',
         'Hiragana' => 'VoidSymbol',
         'Hiragana_Katakana' => 'VoidSymbol',
         'Katakana' => 'VoidSymbol',
         'Muhenkan' => 'VoidSymbol',
# XFree86 does not recognise these
         'SunAudioLowerVolume' => 'VoidSymbol',
         'SunAudioRaiseVolume' => 'VoidSymbol',
         'SunAudioMute' => 'VoidSymbol',
         'SunCopy' => 'VoidSymbol',
         'SunCut' => 'VoidSymbol',
         'SunPaste' => 'VoidSymbol',
         'SunAgain' => 'VoidSymbol',
         'SunUndo' => 'VoidSymbol',
         'SunFind' => 'VoidSymbol',
         'SunStop' => 'VoidSymbol',
         'SunF36' => 'VoidSymbol',
         'SunF37' => 'VoidSymbol',
         'SunFront' => 'VoidSymbol',
         'SunOpen' => 'VoidSymbol',
         'SunPowerSwitch' => 'VoidSymbol',
         'SunPowerSwitchShift' => 'VoidSymbol',
         'SunProps' => 'VoidSymbol',
         'SunSys_Req' => 'VoidSymbol',
         'SunVideoDegauss' => 'VoidSymbol',
         'SunVideoLowerBrightness' => 'VoidSymbol',
         'SunVideoRaiseBrightness' => 'VoidSymbol',
        );

    if ($compact) {
        $xkbsym_table{'Mode_switch'} = 'AltGr';
        $xkbsym_table{'ISO_Group_Shift'} = 'AltGr';
        $xkbsym_table{'ISO_Group_Latch'} = 'AltGr';
        $xkbsym_table{'ISO_Group_Lock'} = 'AltGr_Lock';
        $xkbsym_table{'ISO_Next_Group'} = 'AltGr_Lock';
        $xkbsym_table{'ISO_Next_Group_Lock'} = 'AltGr_Lock';
        $xkbsym_table{'ISO_Prev_Group'} = 'AltGr_Lock';
        $xkbsym_table{'ISO_Prev_Group_Lock'} = 'AltGr_Lock';
        $xkbsym_table{'ISO_First_Group'} = 'AltGr_Lock';
        $xkbsym_table{'ISO_First_Group_Lock'} = 'AltGr_Lock';
        $xkbsym_table{'ISO_Last_Group'} = 'AltGr_Lock';
        $xkbsym_table{'ISO_Last_Group_Lock'} = 'AltGr_Lock';
    }
    if ($backspace eq 'bs') {
        $xkbsym_table{'BackSpace'} = 'BackSpace';
        $xkbsym_table{'Delete'} = 'Delete';
    }
}

my $voidsymbol = $freebsd ? 'nop' : 'VoidSymbol';

my @controlsyms;
my @metasyms;
my @metacontrolsyms;
my %controlsyms_hash;

{
    if ($freebsd) {

        %controlsyms_hash = (
            'nul' => 0x00,
            'soh' => 0x01,
            'stx' => 0x02,
            'etx' => 0x03,
            'eot' => 0x04,
            'enq' => 0x05,
            'ack' => 0x06,
            'bel' => 0x07,
            'bs' => 0x08,
            'ht' => 0x09,
            'nl' => 0x0a,
            'vt' => 0x0b,
            'ff' => 0x0c,
            'cr' => 0x0d,
            'so' => 0x0e,
            'si' => 0x0f,
            'dle' => 0x10,
            'dc1' => 0x11,
            'dc2' => 0x12,
            'dc3' => 0x13,
            'dc4' => 0x14,
            'nak' => 0x15,
            'syn' => 0x16,
            'etb' => 0x17,
            'can' => 0x18,
            'em' => 0x19,
            'sub' => 0x1a,
            'esc' => 0x1b,
            'fs' => 0x1c,
            'gs' => 0x1d,
            'rs' => 0x1e,
            'us' => 0x1f,
            'del' => 0x7f,
            );
    } else {
        %controlsyms_hash = (
            'nul' => 0x00,
            'Control_a' => 0x01,
            'Control_b' => 0x02,
            'Control_c' => 0x03,
            'Control_d' => 0x04,
            'Control_e' => 0x05,
            'Control_f' => 0x06,
            'Control_g' => 0x07,
            'BackSpace' => 0x08,
            'Tab' => 0x09,
            'Linefeed' => 0x0a,
            'Control_k' => 0x0b,
            'Control_l' => 0x0c,
            'Return' => 0x0d,
            'Control_n' => 0x0e,
            'Control_o' => 0x0f,
            'Control_p' => 0x10,
            'Control_q' => 0x11,
            'Control_r' => 0x12,
            'Control_s' => 0x13,
            'Control_t' => 0x14,
            'Control_u' => 0x15,
            'Control_v' => 0x16,
            'Control_w' => 0x17,
            'Control_x' => 0x18,
            'Control_y' => 0x19,
            'Control_z' => 0x1a,
            'Escape' => 0x1b,
            'Control_backslash' => 0x1c,
            'Control_bracketright' => 0x1d,
            'Control_asciicircum' => 0x1e,
            'Control_underscore' => 0x1f,
            'Delete' => 0x7f,
            );
    }        
    for my $special (keys %controlsyms_hash) {
        $controlsyms[$controlsyms_hash{$special}] = $special;
    }
    for my $code (0 .. 255) {
        if (! defined $controlsyms[$code]) {
            if ($code >= 64 && $code <= 127
                && defined (my $special = $controlsyms[$code % 32])) {
                $controlsyms[$code] = $special;
            } else {
                $controlsyms[$code] = $voidsymbol;
            }
        }
    }
# Ctrl + BS = DEL, Ctrl + DEL = BS
    if ($freebsd) {
        $controlsyms[0x08] = 'del';
        $controlsyms[0x7f] = 'bs';
    } else {
        $controlsyms[0x08] = 'Delete';
        $controlsyms[0x7f] = 'BackSpace';
    }
# Some particularities of FreeBSD and Linux
    if ($freebsd) {
        $controlsyms[0x0d] = 'nl';                     # Ctrl+m = ^J
        $controlsyms[0x20] = 'nul';                    # Ctrl+space = ^@
        $controlsyms[0x3f] = 'del';                    # Ctrl+? = ^?
    } else {
        $controlsyms[0x0d] = 'Control_m';              # I don't know
        $controlsyms[0x20] = 'nul';                    # Ctrl+space = ^@
        $controlsyms[0x2e] = 'Compose';                # Ctrl+. = Compose
        $controlsyms[0x3f] = 'Delete';                 # Ctrl+? = ^?
# I suppose these are not necessary:
        # $controlsyms[0x27] = 'Control_g';              # Ctrl+' = ^G
        # $controlsyms[0x32] = 'nul';                    # 2
        # $controlsyms[0x33] = 'Escape';                 # 3
        # $controlsyms[0x34] = 'Control_backslash';      # 4
        # $controlsyms[0x35] = 'Control_bracketright';   # 5
        # $controlsyms[0x36] = 'Control_asciicircum';    # 6
        # $controlsyms[0x37] = 'Control_underscore';     # 7
        # $controlsyms[0x38] = 'Delete';                 # 8
    }

    my %metasyms_hash = (
	' ' => 'space',
	'`' => 'grave',
	'^' => 'asciicircum',
	'~' => 'asciitilde',
	'<' => 'less',
	'=' => 'equal',
	'>' => 'greater',
	'|' => 'bar',
	'_' => 'underscore',
	'-' => 'minus',
	',' => 'comma',
	';' => 'semicolon',
	':' => 'colon',
	'!' => 'exclam',
	'?' => 'question',
	'/' => 'slash',
	'.' => 'period',
	'\'' => 'apostrophe',
	'"' => 'quotedbl',
	'(' => 'parenleft',
	')' => 'parenright',
	'[' => 'bracketleft',
	']' => 'bracketright',
	'{' => 'braceleft',
	'}' => 'braceright',
	'@' => 'at',
	'$' => 'dollar',
	'*' => 'asterisk',
	'\\' => 'backslash',
	'&' => 'ampersand',
	'#' => 'numbersign',
	'%' => 'percent',
	'+' => 'plus',
	'0' => 'zero',
	'1' => 'one',
	'2' => 'two',
	'3' => 'three',
	'4' => 'four',
	'5' => 'five',
	'6' => 'six',
	'7' => 'seven',
	'8' => 'eight',
	'9' => 'nine',
	chr(0x08) => 'BackSpace',
	chr(0x09) => 'Tab',
	chr(0x0a) => 'Linefeed',
	chr(0x0d) => 'Control_m',
	chr(0x1b) => 'Escape',
        chr(0x1c) => 'Control_backslash',
	chr(0x7f) => 'Delete',
    );
    
    for my $code (0 .. 255) {
	my $sym = chr($code);
	if (defined (my $special = $metasyms_hash{$sym})) {
	    $sym = $special;
	}
	$metasyms[$code] = "Meta_". $sym;
    }

    for my $code (0 .. 255) {
	my $control = $controlsyms[$code];
	if ($control eq 'Compose') {
	    $metacontrolsyms[$code] = 'Compose';
	} elsif ($control eq 'Return') {
	    $metacontrolsyms[$code] = 'Meta_Control_m';
	} elsif ($control eq 'NoSymbol') {
	    $metacontrolsyms[$code] = 'NoSymbol';
	} elsif ($control eq 'VoidSymbol') {
	    $metacontrolsyms[$code] = 'VoidSymbol';
	} else {
	    $metacontrolsyms[$code] = 'Meta_'. $control;
	}
    }
}

############ GLOBAL FUNCTIONS #########################################

# Looks for $_[0] in the known directories and returns ready to use
# file name
sub xfilename {
    my $file = $_[0];
    (my $base = $file) =~ s/.*\/(.+)/$1/;
    for my $dir (@xdirs) {
	if (-f "$dir/$file") {
	    return "$dir/$file";
	}
	if (-f "$dir/$base") {
	    return "$dir/$base";
	}
    }
    die "$0: Can not find file \"$file\" in any known directory\n";
}

########### READ THE RULES FILE #######################################

# The string $_[0] matches the pattern $_[1]. 
# The pattern may be "*", a variable name, or a plain string.
# If the string is 'OPTIONS' then match the pattern against any of the
# options from @options.
sub matches_pattern {
    my ($string, $pattern) = @_;
    if ($string eq 'OPTIONS') {
	for my $option (@options) {
	    next if ($option eq '');
	    if ($pattern eq $option) {
		return 1;
	    }
	}
    } else {
	if ($pattern eq '*') {
	    return $string ne '';
	}
	if ($pattern =~ /^\$([a-zA-Z0-9_]+)$/) {
	    for my $member (@{$rules_variables{$1}}) {
		if ($string eq $member) {
		    return 1;
		}
	    }
	    return 0;
	}
	if ($string eq $pattern) {
	    return 1;
	}
    }
    return 0;
}

if (@layouts) {
    for my $i (0 .. $#layouts) {
	if (! defined $variants[$i]) {
	    $variants[$i] = '';
	}
    }
    my $rules_keycodes;
    my $rules_symbols;
    open (RULES, xfilename ("rules/$rules"))
	or die "$0: ". xfilename ("rules/$rules") .": $!\n";
    my $oldline = '';
    my @antecedents;
    my @consequents;
    my $match_found = 0;
    while (<RULES>) {
	next if (/^\s*\/\//);
	next if (/^\s*$/);
	chomp;
	s/^\s*//;
	s/\s+/ /g;
	if ($oldline) {
	    $_ = $oldline . $_;
	    $oldline = '';
	}
	if (s/\\$/ /) {
	    $oldline = $_;
	    next;
	}
	if (/^! ?\$([a-zA-Z0-9_]+) ?= ?(.+)$/) {
	    $rules_variables{$1} = [ split ' ', $2 ];
	    next;
	}
	if (/^! ?(.+)= ?(.+)$/) {
	    @antecedents = split ' ', $1;
	    @consequents = split ' ', $2;
	    foreach my $i (0 .. $#antecedents) {
		if ($antecedents[$i] eq 'model') {
		    $antecedents[$i] = $model;
		} elsif ($antecedents[$i] eq 'layout' && @layouts == 1) {
		    $antecedents[$i] = $layouts[0];
		} elsif ($antecedents[$i] =~ /layout\[([1-4])\]/) {
		    if (@layouts > 1) {
			$antecedents[$i] = $layouts[$1 - 1];
		    } else {
			$antecedents[$i] = '';
		    }
		} elsif ($antecedents[$i] eq 'variant' && @variants == 1) {
		    $antecedents[$i] = $variants[0];
		} elsif ($antecedents[$i] =~ /variant\[([1-4])\]/) {
		    if (@variants > 1) {
			$antecedents[$i] = $variants[$1 - 1];
		    } else {
			$antecedents[$i] = '';
		    }
		} elsif ($antecedents[$i] eq 'option') {
		    $antecedents[$i] = 'OPTIONS';
		} elsif ($antecedents[$i] eq 'layout'
			 || $antecedents[$i] eq 'variant') {
		    $antecedents[$i] = '';
		} else {
                    warning "Unknown name \"$antecedents[$i]\" in the following line in \"rules/$rules\":\n";
                    warning "$_\n";
		    $antecedents[$i] = '';
		}
		if (! defined $antecedents[$i]) {
		    $antecedents[$i] = '';
		}
	    }
	    $match_found = 0;
	    next;
	}
	if (/^(.+)= ?(.+)$/) {
	    next if ($match_found);
	    my @antecedent_patterns = split ' ', $1;
	    my $consequent_str = $2;
	    if (@antecedent_patterns != @antecedents ) {
		warning "Bad number of antecedents in the following line in \"rules/$rules\":\n";
                warning "$_\n";
                next;
            }
	    my $matches = 1;
	    for my $i (0 .. $#antecedents) {
		if (! matches_pattern ($antecedents[$i], 
				       $antecedent_patterns[$i])) {
		    $matches = 0;
		    last;
		}
	    }
	    if ($matches) {
		$match_found = $antecedents[0] ne 'OPTIONS';
		my @consequent_values = split ' ', $2;
                if (@consequent_values != @consequents) {
                    warning "Bad number of consequents in the following line in \"rules/$rules\":\n";
                    warning "$_\n";
                }
		for my $i (0 .. $#consequents) {
                    # The purpose of the semicolons is to make %(v) and %_v
                    # empty strings if %v is an empty string
		    $consequent_values[$i] =~ s/%\(/\(;%/g;
		    $consequent_values[$i] =~ s/%_/_;%/g;
		    $consequent_values[$i] =~ s/(%[lvm](\[[1-4]\])?)/$1;/g;
		    $consequent_values[$i] =~ s/%m/$model/g;
		    $consequent_values[$i] =~ s/%l\[1\]/$layouts[0]/g;
		    $consequent_values[$i] =~ s/%l\[2\]/$layouts[1]/g;
		    $consequent_values[$i] =~ s/%l\[3\]/$layouts[2]/g;
		    $consequent_values[$i] =~ s/%l\[4\]/$layouts[3]/g;
		    $consequent_values[$i] =~ s/%l/$layouts[0]/g;
		    $consequent_values[$i] =~ s/%v\[1\]/$variants[0]/g;
		    $consequent_values[$i] =~ s/%v\[2\]/$variants[1]/g;
		    $consequent_values[$i] =~ s/%v\[3\]/$variants[2]/g;
		    $consequent_values[$i] =~ s/%v\[4\]/$variants[3]/g;
		    $consequent_values[$i] =~ s/%v/$variants[0]/g;
		    $consequent_values[$i] =~ s/\(;;\)//g;
		    $consequent_values[$i] =~ s/_;;//g;
		    $consequent_values[$i] =~ s/;//g;
		    if ($consequent_values[$i] =~ /^\+/) {
			if ($consequents[$i] eq 'keycodes') {
			    $rules_keycodes = $rules_keycodes .
				$consequent_values[$i];
			} elsif ($consequents[$i] eq 'symbols') {
			    $rules_symbols = $rules_symbols .
				$consequent_values[$i];
			}
		    } else {
			if ($consequents[$i] eq 'keycodes') {
			    if (! $rules_keycodes) {
				$rules_keycodes = $consequent_values[$i];
			    }
			} elsif ($consequents[$i] eq 'symbols') {
			    if (! $rules_symbols) {
				$rules_symbols = $consequent_values[$i];
			    }
			}
		    }
		}
	    }
	    next;
	}    
	warning "Syntax error in the following line in \"rules/$rules\":\n";
        warning "$_\n";
        die;
    }
    close RULES;

    if ($verbosity >= 1) {
	print STDERR  "Acording to the rules file:\n"
	    ." keycodes = $rules_keycodes\n"
	    ." symbols = $rules_symbols\n";
    }

    if (! $keycodes) {
	$keycodes = $rules_keycodes;
    }
    if (! $symbols) {
	$symbols = $rules_symbols;
    }
}

if (! $keycodes) {
    die "$0: No keycodes, nor layout specified\n";
}
if (! $symbols) {
    die "$0: No symbols, nor layout specified\n";
}

########### COMPUTE ARCH ###########################################

if ($keycodes =~ /(^|\+|\|)ataritt(\([^\)]*\))?($|\+|\|)/) {
    $arch = 'ataritt';
} elsif ($keycodes =~ /(^|\+|\|)amiga(\([^\)]*\))?($|\+|\|)/) {
    $arch = 'amiga';
} elsif ($keycodes =~ /(^|\+|\|)sun(\(type[45][^\)]*\))?($|\+|\|)/) {
    $arch = 'sun';
} elsif ($keycodes =~ /(^|\+|\|)evdev(\([^\)]*\))?($|\+|\|)/) {
    $arch = 'evdev';
}

########### READ ACM ###############################################

if ($charmap) {
    for my $acmfile ("$installdir/share/consoletrans/${charmap}",
                     "$installdir/share/consoletrans/${charmap}.gz",
                     "$installdir/share/consoletrans/${charmap}.acm",
                     "$installdir/share/consoletrans/${charmap}.acm.gz",
                     "/usr/share/consoletrans/${charmap}",
                     "/usr/share/consoletrans/${charmap}.gz",
                     "/usr/share/consoletrans/${charmap}.acm",
                     "/usr/share/consoletrans/${charmap}.acm.gz",
                     "${charmap}") {
	if (-f $acmfile) {
	    $acm = $acmfile;
	    last;
	}
    }
    (-f $acm) or die "$0: no ACM for ${charmap} exists\n";
    if ($acm =~ /gz$/) {
	open (ACM, '-|:utf8', "zcat $acm") or die "$0: $acm: $!\n";
    } else {
	open (ACM, '<:utf8', $acm) or die "$0: $acm: $!\n";
    }
    while (<ACM>) {
	s/\#.*//;
	chomp;
	next unless (/[^\s]/);
	if (/^\s*0x([0-9a-fA-F]{1,2})\s+\'([^\']+)\'\s*$/) {
	    my $uni = ord ($2);
	    my $c = hex ($1);
	    $acmtable{$uni} = $c;
	} else {
	    die "$0: Syntax error in ACM file: $_\n";
	}
    }
    close ACM;
}

########### PARSING ###############################################

# Report a syntax error in $filename. $_[0] should describe what was
# expected at $stream.
sub syntax_error {
    die "$0: instead of \"". (substr ($stream, 0, 50))
	."\" in $filename expected $_[0].\n";
}

# Opens the text file $_[0], reads it and saves its contents in $stream
# The comments are removed, all new lines are replaced by spaces and
# all redundant spaces are removed.
sub file_to_string {
    my $file = $_[0];
    my $string = '';
    open (FILE, "$file") or die "$0: $file: $!\n";
    while (<FILE>) {
	chomp;
	s{//.*}{};
	s{\#.*}{};
	$string = $string . $_ .' ';
    }
    close FILE;
    
    my $normalized = '';
    my $final_letter = 0;
    while ($string) {
	if ($string =~ s/^\s+// && $final_letter && $string =~ /^[a-zA-Z0-9_]/) {
	    $normalized = $normalized .' ';
	    $final_letter = 0;
	}
	if ($string =~ s/^([^\"\s]+)//) {
	    $normalized = $normalized . $1;
	    $final_letter = ($1 =~ /[a-zA-Z0-9_]$/);
	    next;
	}
	if ($string =~ s/^(\"[^\"]*(\"|$))//) {
	    $normalized = $normalized . $1;
	    $final_letter = 0;
	    if ($2 ne '"') {
		die "$0: missing quote in ". (substr ($1, 0, 50)) ."...\n";
	    }
	    next;
	}
	(! $string ) or die "Internal error";
    }
    $stream = $normalized;
}

# removes from $stream initial sequence of xkb flags (default, partial,
# hidden, etc.) Returns true if the "default" flag was among them.
sub xkb_flags {
    my $default = 0;
    while ($stream =~ s/^(default|partial|hidden
			  |alphanumeric_keys|modifier_keys
			  |keypad_keys|function_keys
			  |alternate_group)\s?(.*)/$2/ix) {
	$default = 1 if ($1 =~ /default/i);
    }
    return $default;
}

# Removes and returns identifier from $stream. 
sub xkb_identifier {
    if ($stream =~ s/^([a-zA-Z0-1_]+) ?(.*)/$2/) {
	return $1;
    } else {
	syntax_error "identifier";
    }
}

# Removes and returns a string from $stream.
sub xkb_string {
    if ($stream =~ /^\"([^\"]*)\"(.*)/) {
	$stream = $2;
	return $1;
    } else {
	syntax_error "string";
    }
}

# Removes an include method name from $stream and returns $alternate_method,
# $augment_method, $replace_method, or $override_method.  If $stream
# does not start with a method name, return the default method (i.e. $method)
sub xkb_method {
    if ($stream =~ s/^alternate ?(.*)/$1/i) {
	return $alternate_method;
    } elsif ($stream =~ s/^augment ?(.*)/$1/i) {
	return $augment_method;
    } elsif ($stream =~ s/^replace ?(.*)/$1/i) {
	return $replace_method;
    } elsif ($stream =~ s/^override ?(.*)/$1/i) {
	return $override_method;
    } else {
	return $method;
    }
}

# If $stream starts with an include statement - process it and return true.
# Otherwise return false. $_[0] is the file type ("symbols" or "keycodes")
sub xkb_include {
    my $file_type = $_[0];
    if ($stream =~ s/^(include|replace|augment|override)\"([^\"]*)\";?
                        (.*)/$3/ix) {
	my $method_name = $1;
	my $include_request = $2;
	if ($method != $ignore_method) {
	    my $oldmethod = $method;
	    if ($method_name =~ /replace/i) {
		$method = $replace_method;
	    } elsif ($method_name =~ /augment/i) {
		$method = $augment_method;
	    } elsif ($method_name =~ /override/i) {
		$method = $override_method;
	    }
	    &include_xkb_file ($file_type, $include_request);
	    $method = $oldmethod;
	}
	return 1;
    } else {
	return 0;
    }
}

sub xkb_keycodes_definitions {
    my $oldmethod = $method;
    while ($stream) {
	$method = $oldmethod;

	if (xkb_include ('keycodes')) {
	    next;
	}

	$method = xkb_method ();
	
	if ($stream =~ (s/^(minimum|maximum|indicator|virtual\sindicator)
			[^;]*;(.*)/$2/ix)) {
	    next;
	}

	if ($stream =~ /^<([^>]*)>=/) {
	    $stream =~ s/^<([^>]+)>=([0-9]*);(.*)/$3/
		or syntax_error "keycode definition";
	    my $key = $1;
	    my $code = $2;
	    if ($method == $replace_method
		|| $method == $override_method
		|| ($method == $augment_method
		    && ! defined $keycodes_table{$key})) {
		$keycodes_table{$key} = [ $code ];
		delete $aliases{$key};
	    } elsif ($method == $alternate_method) {
		push @{$keycodes_table{$key}}, $code;
	    }
	    next;
	}
	if ($stream =~ /^alias/) {
	    $stream =~ s/^alias<([^>]+)>=<([^>]+)>;(.*)/$3/
		or syntax_error "alias definition";
	    my $alias = $1;
	    my $key = $2;
	    if ($method == $replace_method
		|| $method == $override_method
		|| ($method == $augment_method
		    && ! defined $keycodes_table{$alias})) {
		$keycodes_table{$alias} = [];
		$aliases{$alias} = $key;
	    }
	    next;
	}
	last;
    }
    $method = $oldmethod;
}

# Fill @{$symbols_table{$code}[$group]} with symbols
sub symbols_for_group {
    my $code = shift;
    my $group = shift;
    if ($method == $replace_method
	|| ($method == $override_method
	    && (@_ || ! defined $symbols_table{$code}[$group]))
	|| ($method == $augment_method &&
	    ! defined $symbols_table{$code})) {
	my $level = 0;
	for my $symbol (@_) {
	    if ($symbol !~ /\(/ && $symbol =~ /./
		&& (! defined $xkbsym_table{$symbol}
		    || $xkbsym_table{$symbol} ne 'NoSymbol'
		    || ! defined $symbols_table{$code}[$group][$level])) {
		$symbols_table{$code}[$group][$level] = $symbol;
	    }
	    $level++;
	}
    }
}

sub xkb_key {
    my $default_key_type = $_[0];
    if ($stream =~ /^key</i) {
	$stream =~ s/^key<([^>]+)>\{([^\}]*?)\};(.*)/$3/i
	    or syntax_error "key definition";
	my $key = $1;
	my $list = $2 .",";
	if ($verbosity >= 4 && ! defined $keycodes_table{$key}) {
	    warning "No scan code for <$key> is defined.\n";
	}
	for my $code (@{$keycodes_table{$key}}) {
	    if ($method == $replace_method) {
		$symbols_table{$code} = [];
	    }
	    my $group = $base_group;
	    while ($list =~ /[^ ]/) {
		# [ X1, X2, ... ]
		if ($list =~ s/^\[([^\]]*?)\],(.*)/$2/) {
		    (my $symbols = $1) =~ s/,/ /g;
		    my @groupsymbols = split ' ', $symbols;
		    symbols_for_group $code, $group, @groupsymbols;
		    $group++;
		    next;
		}
		# symbols[GroupN] = [ X1, X2, ... ]
		if ($list =~ (s/^symbols\[Group([1-4])\]
			      =\[([^\]]*?)\],(.*)/$3/x)) {
		    my $group = $1 - 1 + $base_group;
		    (my $symbols = $2) =~ s/,/ /g;
		    my @groupsymbols = split ' ', $symbols;
		    symbols_for_group $code, $group, @groupsymbols;
		    next;
		}
		# type = "...."
		if ($list =~ (s/^type(?:\[Group1\])?
                              =\"([^\"]+)\",(.*)/$2/x)) {
		    if ($method == $replace_method
			|| $method == $override_method
			|| ($method == $augment_method
			    && ! defined $types_table{$code})) {
			$types_table{$code} = $1;
		    }
		    next;
		}
                # virtualMods = AltGr
                # overlay1=<KO7>
		next if ($list =~ s/^[a-zA-Z0-9_]+(=[a-zA-Z0-9_<>]+)?,
                                   (.*)/$2/x);
		# type = "CTRL+ALT"
		next if ($list =~ s/^[a-zA-Z0-9_]+=\"[^\"]+\",(.*)/$1/);
		# type[...] = "..."
		next if ($list =~ s/^type\[[a-zA-Z0-9_]+\]=\"[^\"]+\",
                                    (.*)/$1/x);
		# actions[...] = [ ... ]
		next if ($list =~ s/^actions\[[a-zA-Z0-9_]+\]=\[[^\]]*?\],
                                    (.*)/$1/x);
		die "$0: garbage in a key definition: \"$list\""
		    ." in $filename.\n";
	    }
	    if (! defined $types_table{$code}
		|| $types_table{$code} eq 'DEFAULT') {
		$types_table{$code} = $default_key_type;
	    }
	}
	return 1;
    } else {
	return 0;
    }
}

sub xkb_symbols_definitions {
    my $oldmethod = $method;
    my $default_key_type = 'DEFAULT';
    while ($stream) {
	$method = $oldmethod;

	if (xkb_include ('symbols')) {
	    next;
	}

	$method = xkb_method ();

	if ($stream =~ /^name/i) {
	    $stream =~ s/^name\[[a-zA-Z0-9_]+\]=\"[^\"]*\";(.*)/$1/i
		or syntax_error "group name";
	    next;
	}

	if ($stream =~ (s/^key\.type(?:\[Group1\])?=\"([^\"]+)\";(.*)/$2/)) {
	    $default_key_type = $1;
	    next;
	}
	
	if ($stream =~ s/^[a-zA-Z0-9_]+\.[a-zA-Z0-9_]+=.*?;(.*)/$1/i) {
	    next;
	}

	if ($stream =~ s/^[a-zA-Z0-9_]+\.[a-zA-Z0-9_]+\[[a-zA-Z0-9_]+\]
                       =.*?;(.*)/$1/ix) {
	    next;
	}

	if (xkb_key $default_key_type) {
	    next;
	}

	if ($stream =~ /^(modifier_map|modmap|mod_map)/i) {
	    $stream =~ (s/^(modifier_map|modmap|mod_map)\s?[a-zA-Z0-9_]+
			\{[^\}]*\};(.*)/$2/ix)
		or syntax_error "modifier_map";
	    next;
	}

	if ($stream =~ /^virtual_modifiers/i) {
	    $stream =~ (s/^virtual_modifiers\s?[a-zA-Z0-9_,]+;(.*)/$1/ix)
		or syntax_error "virtual_modifiers";
	    next;
	}
	last;
    }
    $method = $oldmethod;
}

sub xkb_definitions {
    my $file_type = $_[0];
    if ($file_type eq 'symbols') {
	xkb_symbols_definitions();
    } elsif ($file_type eq 'keycodes') {
	xkb_keycodes_definitions();
    } else {
	die "$0: Bad xkb file type $file_type\n";
    }
}

# Remove from $stream the characters up to the first unmatched "}"
sub skip_to_brace {
    while ($stream && ($stream =~ s/^[^\}\{]*\{//)) {
	&skip_to_brace;
    }
    $stream =~ s/^[^\}\{]*(\}|$)//;
}

sub xkb_block_list {
    my $file_type = $_[0];
    my $block = $_[1];
    my $first = 1;
    my $ok = 0;
    my $mystream = $stream;
    while ($stream) {
	my $default = xkb_flags();
	xkb_identifier() eq "xkb_". $file_type
	    or syntax_error "xkb_". $file_type;
	my $name = xkb_string();
	my $structured;
	if ($stream =~ s/^\{//) {
	    $structured = 1;
	} else {
	    $structured = 0;
	}
	if ($name eq $block || ($first && ! $block)) {
	    xkb_definitions ($file_type);
	    if ($structured) {
		$stream =~ s/^\};.*// or syntax_error "};";
	    } else {
		$stream = '';
	    }
	    $ok = 1;
	} else {
	    if ($structured) {
		skip_to_brace;
		$stream =~ s/^;// or syntax_error ";";
	    } else {
		last;
	    }
	}
	$first = 0;
    }
    if (! $ok) {
	$stream = $mystream;
    }
    return $ok;
}

sub include_xkb_file {
    my $file_type = $_[0];
    my $include_list = '^'. $_[1];

    my $oldmethod = $method;
    my $oldbase_group = $base_group;
    while ($include_list) {
	my $file;
	my $block;
	if ($include_list =~ (s/^(\^|\+|\|)([^\(\|\+]+)\(([^\)]+)\)
			      :([1234])(.*)/$5/x)) {
	    if ($1 eq '+') {
		$method = $override_method;
	    } elsif ($1 eq '|') {
		$method = $augment_method;
	    }
	    $file = $2;
	    $block = $3;
	    $base_group = $4 - 1 + $base_group;
	} elsif ($include_list =~ (s/^(\^|\+|\|)([^\(\|\+]+)\(([^\)]+)\)
				   (.*)/$4/x)) {
	    if ($1 eq '+') {
		$method = $override_method;
	    } elsif ($1 eq '|') {
		$method = $augment_method;
	    }
	    $file = $2;
	    $block = $3;
	} elsif ($include_list =~ s/^(\^|\+|\|)([^\(\|\+]+):([1234])(.*)/$4/) {
	    if ($1 eq '+') {
		$method = $override_method;
	    } elsif ($1 eq '|') {
		$method = $augment_method;
	    }
	    $file = $2;
	    $block = '';
	    $base_group = $3 - 1 + $base_group;
	} elsif ($include_list =~ s/^(\^|\+|\|)([^\(\|\+]+)(.*)/$3/) {
	    if ($1 eq '+') {
		$method = $override_method;
	    } elsif ($1 eq '|') {
		$method = $augment_method;
	    }
	    $file = $2;
	    $block = '';
	} else {
	    die "$0: bad include list $include_list.\n";
	}
	
	my $oldstream = $stream;
	if ($file =~ /^\.?\//) {
	    $stream = file_to_string ("$file");
	} else {
	    $stream = file_to_string (xfilename "$file_type/$file");
	}
	my $oldfilename = $filename;
	$filename = $file;
	if (!xkb_block_list ($file_type, $block)) {
	    warning "Can not find \"$block\" in \"$file\".\n";
	    xkb_block_list ($file_type, '');
	}

	# Patch the Greek symbols. See Bug#1026986 and http://kbdlayout.info/kbdhe :
	# - xkb-data makes shift-w a SIGMA, which is not that useful.
	# - On the other hand, the kernel doesn't support double-dead-keys, and it
	# is common usage to make shift-w a dead-acute-diaeresis (here encoded
	# as dead_breve)
	if ($file eq "gr") {
		my $code = $keycodes_table{'AD02'}[0];
		if (defined $code) {
			my $symbol = $symbols_table{$code}[$base_group][1];
			if ($symbol eq "Greek_SIGMA") {
				$symbols_table{$code}[$base_group][1] = "dead_breve";
			}
		}
	}

	$stream = $oldstream;
	$filename = $oldfilename;
	$method = $oldmethod;
	$base_group = $oldbase_group;
    }
}

include_xkb_file 'keycodes', $keycodes;

foreach my $alias (keys %aliases) {
    if (! defined $keycodes_table{$aliases{$alias}}) {
	die "$0: undefined keyname $aliases{$alias} in ".
	    "an keycode alias definition in $filename.\n";
    }
    $keycodes_table{$alias} = [ @{$keycodes_table{$alias}},
				@{$keycodes_table{$aliases{$alias}}} ];
}

include_xkb_file 'symbols', $symbols;

if ($arch eq 'at' || $arch eq 'evdev') {
# Pause - 110, Break - 114, PrintScreen - 111, SysRq - 92
    for my $group (0 .. 3) {
        # no separate Break key on AT keyboards.  Break = Ctrl+Pause
        if (defined $symbols_table{110}[$group][1]) {
            $symbols_table{114}[$group] = [$symbols_table{110}[$group][1]];
        }
        # no separate SysRq key on AT keyboards.  SysRq = Alt+PrintScreen
        if (defined $symbols_table{111}[$group][1]) {
            $symbols_table{92}[$group] = [$symbols_table{111}[$group][1]];
        }
    }
}

foreach my $key (keys %symbols_table) {
    foreach my $group (0 .. $#{$symbols_table{$key}}) {
	if (! defined $symbols_table{$key}[$group]) {
	    $symbols_table{$key}[$group] = [];
	} else {
	    foreach my $level (0 .. $#{$symbols_table{$key}[$group]}) {
		if (! defined $symbols_table{$key}[$group][$level]) {
		    $symbols_table{$key}[$group][$level] = 'NoSymbol';
		}
	    }
	}
    }
    if (! defined $types_table{$key}) {
	$types_table{$key} = 'DEFAULT';
    }
}

sub uni_to_legacy {
    my $uni = $_[0];
    if ($acm) {
	if ($uni <= 0x7f) {
            if ($freebsd && $uni >= 0x20 && $uni <= 0x7e) {
                return sprintf "\'%c\'", $uni;
            } else {
                return sprintf "0x%02x", $uni;
            }
	} elsif (defined $acmtable{$uni}) {
            if ($freebsd) {
                return sprintf "%i", $acmtable{$uni};
            } else {
                return sprintf "0x%02x", $acmtable{$uni};
            }
	} else {
	    if ($verbosity >= 8) {
		warning sprintf ("Unicode U+%04x does not exist "
				 ."in the legacy encoding\n", $uni);
	    }
	    return $voidsymbol;
	}
    } else {
	return 'U+'. sprintf ("%04x", $uni);
    }
}

sub x_to_kernelsym {
    my $xkeysym = $_[0];
    my $kernelkeysym = $xkbsym_table{$xkeysym};
    if (defined $kernelkeysym) {
        if ($kernelkeysym !~ /^[0-9][0-9a-fA-F]{3}$/) {
	    return $kernelkeysym;
	}
    } else {
	$kernelkeysym = ($xkeysym =~ /^0x0*(100)?([0-9a-fA-F]{4})$/
			 ? $2
			 : ($xkeysym =~ /^U([0-9a-fA-F]+)$/
			    ? $1 
			    : undef));
    }
    if (defined $kernelkeysym) {
	my $uni = hex ($kernelkeysym);
	if ($uni > 0xFFFF || defined $forbidden{$uni}) {
            if ($verbosity >= 8) {
                warning "Forbidden Unicode \"U+$kernelkeysym\"\n";
            }
	    return $voidsymbol;
	} else {
	    if (pack("U", $uni) =~ /\p{IsAlpha}/) {
		my $legacy = uni_to_legacy ($uni);
		if ($legacy ne $voidsymbol) {
		    return '+'. $legacy; # further processed for FreeBSD
		} else {
		    return $legacy;
		}
	    } elsif ($uni <= 0x1f) {
		return $controlsyms[$uni];
	    } else {
		return uni_to_legacy ($uni);
	    }
	}
    } else {
	warning "Unknown X keysym \"$xkeysym\"\n";
	return $voidsymbol;
    }
}

sub x_to_ascii {
    my $xkeysym = $_[0];
    my $kernelkeysym = $xkbsym_table{$xkeysym};
    if (defined $kernelkeysym) {
        if (defined $controlsyms_hash{$kernelkeysym}) {
            return $controlsyms_hash{$kernelkeysym};
	} elsif ($kernelkeysym !~ /^[0-9][0-9a-fA-F]{3}$/) {
	    return undef;
	}
    } else {
	$kernelkeysym = ($xkeysym =~ /^0x0*(100)?([0-9a-fA-F]{4})$/
			 ? $2
			 : ($xkeysym =~ /^U([0-9a-fA-F]+)$/
			    ? $1 
			    : undef));
    }
    if (defined $kernelkeysym) {
	my $uni = hex ($kernelkeysym);
	if (0x00 <= $uni && 0x7f >= $uni) {
	    return $uni;
	}
    }
    return undef;
}

# A vector of symbol codes for a key
my @vector;
# $numlockable[group] -> whether the group is numlockable
my @numlockable;
# A vector with same length as @vector.  Measures how well each element of
# @vector represents the xkb symbol for the particular key.  Bigger values
# mean lower quality.
my @quality;

sub approximate {
    my ($coord, $new_sym, $new_quality) = @_;
    # $new_sym represents the xkb symbol for position $coord in @vector
    # with quality $new_quality
    if ((! defined $quality[$coord] || $quality[$coord] > $new_quality)
	&& $new_sym ne $voidsymbol) {
	$vector[$coord] = $new_sym;
	$quality[$coord] = $new_quality;
    }
}

# Fill @vector with data for key number $_[0]
sub flatten {
    #    Kernel         X
    # -----------------------------------------
    # 1  Shift          level 2 (Shift)
    # 2  AltGr          levels 3 and 4 (AltGr)
    # 4  Control        Control
    # 8  Alt            Alt
    # 0                 Group1
    # 16 ShiftL         Group2
    # 32 ShiftR         Group4
    # 48 ShiftL+ShiftR  Group3
    my $key = $_[0];
    @vector = ();
    @quality = ();
    @numlockable = (0,0,0,0);
    my @real_group_table = ([-1, -1, -1, -1],
			    [0, 0, 0, 0], # gr1 -> gr1 -> gr1 -> gr1
			    [0, 1, 1, 0], # gr1 -> gr2 -> gr1 -> gr2
			    [0, 1, 2, 0], # gr1 -> gr2 -> gr1 -> gr3
			    [0, 1, 3, 2]);# gr1 -> gr2 -> gr3 -> gr4
    for my $group (0..3) {
	my $real_group = $real_group_table[1+$#{$symbols_table{$key}}][$group];
        my $last_level;
        while ($real_group >= 0
               && ($last_level = $#{$symbols_table{$key}[$real_group]}) < 0) {
            $real_group = $real_group - 1;
        }
	next if ($real_group < 0);
	for my $level (0..3) {
	    my $real_level = $level;
	    if ($types_table{$key} eq 'ONE_LEVEL') {
		$real_level = 0;
	    } elsif ($types_table{$key} eq 'TWO_LEVEL') {
                $real_level = $real_level % 2;
	    } elsif ($types_table{$key} eq 'THREE_LEVEL') {
		if ($real_level > 2) {
		    $real_level = 2;
		}
	    }
            if ($last_level == -1) {
                next;
            } elsif ($last_level == 0) {
                $real_level = 0;
            } elsif ($last_level == 1) {
                $real_level = $real_level % 2;
            } elsif ($last_level == 2 && $real_level == 3) {
                $real_level = 2;
            } elsif ($real_level > $last_level) {
                $real_level = $last_level;
            }
	    my $coord;
	    for ($types_table{$key}) {
		if (/^(DEFAULT|ONE_LEVEL|TWO_LEVEL
                      |THREE_LEVEL|ALPHABETIC
                      |EIGHT_LEVEL|EIGHT_LEVEL_ALPHABETIC
                      |EIGHT_LEVEL_SEMIALPHABETIC
                      |FOUR_LEVEL|FOUR_LEVEL_ALPHABETIC
                      |FOUR_LEVEL_SEMIALPHABETIC
                      |SEPARATE_CAPS_AND_SHIFT_ALPHABETIC
		      |KEYPAD|FOUR_LEVEL_X|FOUR_LEVEL_MIXED_KEYPAD
		      |FOUR_LEVEL_KEYPAD|LOCAL_EIGHT_LEVEL
                      |FOUR_LEVEL_PLUS_LOCK
                      )$/x) {
		    # Level0: plain
		    # Level1: shift
		    # Level2: altgr
		    # Level3: shift+altgr
		    $coord = ($group << 4) + $level;
		} elsif (/^(PC_BREAK|PC_CONTROL_LEVEL2
                           |PC_LCONTROL_LEVEL2|PC_RCONTROL_LEVEL2)$/x) {
		    # Level0: plain
		    # Level1: control
		    if ($level == 0 || $level == 2) {
			$coord = ($group << 4) + $level;
		    } else {
			$coord = ($group << 4) + $level + 3;
		    }
		} elsif (/^(PC_SYSRQ|PC_ALT_LEVEL2
                           |PC_LALT_LEVEL2|PC_RALT_LEVEL2)$/x) {
		    # Level0: plain
		    # Level1: alt
		    if ($level == 0 || $level == 2) {
			$coord = ($group << 4) + $level;
		    } else {
			# notice that $level is 1 or 3
			$coord = ($group << 4) + $level + 7;
		    }
		} elsif (/^SHIFT\+ALT$/) {
		    # Level0: plain
		    # Level1: shift+alt
		    if ($level == 0 || $level == 2) {
			$coord = ($group << 4) + $level;
		    } else {
			$coord = ($group << 4) + $level + 8;
		    }
		} elsif (/^CTRL\+ALT$/) {
		    # Level0: plain
		    # Level1: control+alt
		    if ($level == 0 || $level == 2) {
			$coord = ($group << 4) + $level;
		    } else {
			$coord = ($group << 4) + $level + 11;
		    }
		} elsif (/^PC_FN_LEVEL2$/) {
		    # Level0: plain
		    # Level1: altgr
                    $coord = ($group << 4) + ($level << 1);
		} else {
		    warning "Unknown key type $types_table{$key}\n";
		    $coord = ($group << 4) + $level;
		}
	    }
	    my $xkeysym = $symbols_table{$key}[$real_group][$real_level];
	    if ($xkeysym =~ /^KP_/) {
                $numlockable[$group] = 1;
	    }
	    my $is_special = ($xkeysym !~ /^U[0-9a-fA-F]+$/
			      && defined $xkbsym_table{$xkeysym}
			      && ($xkbsym_table{$xkeysym}
				  !~ /^[0-9][0-9a-fA-F]{3}$/));
	    my $kernelkeysym = x_to_kernelsym ($xkeysym);
	    approximate ($coord, $kernelkeysym, 0);
            if (defined (my $ascii = x_to_ascii ($xkeysym))) {
                approximate (($coord | 0x08), $metasyms[$ascii], 1);
                approximate (($coord | 0x04), $controlsyms[$ascii], 1);
                approximate (($coord | 0x0c), $metacontrolsyms[$ascii], 1);
            }
	}
    }
    for my $x (0..1) {
        my $mask = 1 << $x;
        for my $coord (0..63) {
            next if (! defined $vector[$coord]);
            approximate($coord ^ $mask, $vector[$coord],
                        $quality[$coord] + $mask << 2);
        }
    }
    for my $x (2..3) {
        my $mask = 1 << $x;
        for my $coord (0..63) {
            next if (! defined $vector[$coord]);
            approximate($coord | $mask, $vector[$coord],
                        $quality[$coord] + $mask << 2);
        }
    }
    for my $coord (0..16) {
        next if (! defined $vector[$coord]);
        for my $mask (1<<4, 2<<4, 3<<4) {
            approximate($coord | $mask, $vector[$coord],
                        $quality[$coord] + 1 << 6);
        }
    }
    for my $coord (0 .. 63) {
	if (! defined $vector[$coord]) {
	    $vector[$coord] = $voidsymbol;
	}
    }

    for my $coord (0 .. 63) {
	next if ($coord & 0x0c); # next if Control and/or Alt
	my $mask = $kernel_modifiers{$vector[$coord]};
	next unless (defined $mask);
	for my $mod (4, 8, 12) {
	    if ($vector[$coord + $mod] eq $voidsymbol
		&& ($vector[($coord + $mod) ^ $mask] eq $voidsymbol)) {
		$vector[$coord + $mod] = $vector[$coord];
	    }
	}
    }
    
    # Without this it would be possible to lock permanently
    # a modifier key such as Control or Alt
    for my $coord (0 .. 63) {
	my $mask = $kernel_modifiers{$vector[$coord]};
	if (defined $mask) {
	    $vector[$coord ^ $mask] = $vector[$coord];
	    if ($compact && ! $freebsd) {
                # In non-Latin layouts AltGr=ShiftL
		# AltGr = 0x02,  ShiftL = 0x10
		if (($mask & 0x02) && ($mask & 0x10)) {
		    $vector[$coord ^ $mask ^ 0x02] = $vector[$coord];
		    $vector[$coord ^ $mask ^ 0x10] = $vector[$coord];
		} elsif ($mask & 0x02) {
		    $vector[$coord ^ $mask ^ 0x10] = $vector[$coord];
		    $vector[$coord ^ $mask ^ 0x10 ^ 0x02] = $vector[$coord];
		} elsif ($mask & 0x10) {
		    $vector[$coord ^ $mask ^ 0x02] = $vector[$coord];
		    $vector[$coord ^ $mask ^ 0x02 ^ 0x10] = $vector[$coord];
		}
	    }
	}
    }
    
    if ($freebsd || ! $compact) {
	for my $coord (16 .. 63) {
	    if ($vector[$coord] =~ /^(ShiftL|ShiftL_Lock|ashift|alock)$/) {
		$vector[$coord] = $voidsymbol;
	    }
	}
	for my $coord (0 .. 15) {
	    if ($vector[$coord] eq 'ShiftL_Lock') {   #  0 => 16
		$vector[$coord + 16] = 'ShiftR_Lock'; # 16 => 48
		$vector[$coord + 32] = 'ShiftR_Lock'; # 32 => 0
		$vector[$coord + 48] = 'ShiftL_Lock'; # 48 => 32
	    } elsif ($vector[$coord] =~ /^(ShiftL|ashift|alock)$/) {
		$vector[$coord + 16] = $vector[$coord];
		$vector[$coord + 32] = $vector[$coord];
		$vector[$coord + 48] = $vector[$coord];
	    }
	}
    } else {
	for my $coord (16 .. 63) {
	    if ($vector[$coord] =~ /^(AltGr|AltGr_Lock)$/) {
		$vector[$coord] = $voidsymbol;
	    }
	}
	for my $coord (0 .. 15) {
            if ($vector[$coord] =~ /^(AltGr_Lock|AltGr)$/) {
		$vector[$coord + 16] = $vector[$coord];
		$vector[$coord + 32] = $vector[$coord];
		$vector[$coord + 48] = $vector[$coord];
	    }
	}
    }

    for my $group (0 .. 3) {
	my $kp = undef;
	for my $x (0 .. 15) {
	    my $coord = 16 * $group + $x;
	    if ($vector[$coord] =~ /^KP_/) {
		$kp = $vector[$coord];
		last;
	    }
	}
	if ($types_table{$key} =~ /^(KEYPAD|FOUR_LEVEL_X
                                    |FOUR_LEVEL_MIXED_KEYPAD
		                    |FOUR_LEVEL_KEYPAD)$/x
	    && ! defined $kp) {
	    $kp = 'VoidSymbol';
            $numlockable[$group] = 1;
	}
	if ($kp && ! $freebsd) {
	    for my $x (0 .. 15) {
		my $coord = 16 * $group + $x;
		for ($vector[$coord]) {
		    if (/^VoidSymbol$/) {
			# KP_Begin and KP_Delete are mapped to VoidSymbol
			$vector[$coord] = $kp;
		    } elsif (/$xkbsym_table{'plus'}/) {# not anchored match!
			$vector[$coord] = 'KP_Add';
		    } elsif (/$xkbsym_table{'minus'}/) {
			$vector[$coord] = 'KP_Subtract';
		    } elsif (/$xkbsym_table{'asterisk'}/) {
			$vector[$coord] = 'KP_Multiply';
		    } elsif (/$xkbsym_table{'slash'}/) {
			$vector[$coord] = 'KP_Divide';
		    } elsif (/$xkbsym_table{'comma'}/) {
			$vector[$coord] = 'KP_Comma';
		    } elsif (/$xkbsym_table{'period'}/) {
			$vector[$coord] = 'KP_Period';
		    } elsif (/$xkbsym_table{'0'}/) {
			$vector[$coord] = 'KP_0';
		    } elsif (/$xkbsym_table{'1'}/) {
			$vector[$coord] = 'KP_1';
		    } elsif (/$xkbsym_table{'2'}/) {
			$vector[$coord] = 'KP_2';
		    } elsif (/$xkbsym_table{'3'}/) {
			$vector[$coord] = 'KP_3';
		    } elsif (/$xkbsym_table{'4'}/) {
			$vector[$coord] = 'KP_4';
		    } elsif (/$xkbsym_table{'5'}/) {
			$vector[$coord] = 'KP_5';
		    } elsif (/$xkbsym_table{'6'}/) {
			$vector[$coord] = 'KP_6';
		    } elsif (/$xkbsym_table{'7'}/) {
			$vector[$coord] = 'KP_7';
		    } elsif (/$xkbsym_table{'8'}/) {
			$vector[$coord] = 'KP_8';
		    } elsif (/$xkbsym_table{'9'}/) {
			$vector[$coord] = 'KP_9';
		    } elsif (/^(Return|Enter)$/) {
			$vector[$coord] = 'KP_Enter';
		    } elsif (/^Home$/) {
			$vector[$coord] = 'KP_7';
		    } elsif (/^Left$/) {
			$vector[$coord] = 'KP_4';
		    } elsif (/^Up$/) {
			$vector[$coord] = 'KP_8';
		    } elsif (/^Right$/) {
			$vector[$coord] = 'KP_6';
		    } elsif (/^Down$/) {
			$vector[$coord] = 'KP_2';
		    } elsif (/^Prior$/) {
			$vector[$coord] = 'KP_9';
		    } elsif (/^Next$/) {
			$vector[$coord] = 'KP_3';
		    } elsif (/^End$/) {
			$vector[$coord] = 'KP_1';
		    } elsif (/^Insert$/) {
			$vector[$coord] = 'KP_0';
		    }
		}
	    }
	}
    }

    for my $group (0 .. 3) {
	my $coord = $group << 4;
	my $mainsym = $vector[$coord];
	if ($mainsym =~ /^fkey([0-9]+)$/) {
	    my $num = $1;
            if (1 <= $num && $num <= 12) {
                $vector[$coord + 1] = 'fkey'. ($num+12); # shift
                $vector[$coord + 4] = 'fkey'. ($num+24); # control
                $vector[$coord + 5] = 'fkey'. ($num+36); # control + shift
                $vector[$coord + 2] = 'scr'. sprintf("%02i", $num); #altgr
                my $x = sprintf("%02i", ($num <= 6) ? $num+10 : $num);
                $vector[$coord + 3] = 'scr'. $x; # altgr + shift
                $vector[$coord + 6] = 'scr'. sprintf("%02i", $num); # altgr+ctrl
                $vector[$coord + 7] = 'scr'. $x; # altgr + control + shift
            } elsif ($num == 52 || $num == 56) {
                my $sym = $num == 52 ? '\'-\'' : '\'+\'';
                for my $i ($coord .. $coord+15) {
                    if ($vector[$i] eq $mainsym && $vector[$i^1] eq $mainsym) {
                        $vector[$i | 1] = $sym;
                    }
                }
            } elsif ($num == 60 && $vector[$coord + 1] eq 'fkey60') {
                $vector[$coord + 1] = 'paste';
            }
        } elsif ($mainsym =~ /^esc$/) {
            $vector[$coord + 6] = 'debug';
            $vector[$coord + 7] = 'debug';
        } elsif ($mainsym =~ /^saver$/) { # 'Pause' key
            $vector[$coord] = 'slock';
            $vector[$coord + 1] = 'saver'; # shift
            $vector[$coord + 2] = 'susp';  # altgr
            $vector[$coord + 3] = 'susp';  # altgr + shift
            $vector[$coord + 4] = 'slock'; # ctrl
            $vector[$coord + 5] = 'saver'; # ctrl + shift
            $vector[$coord + 6] = 'susp';  # ctrl + altgr
            $vector[$coord + 7] = 'susp';  # ctrl + altgr + shift
        } elsif ($freebsd && $mainsym =~ /^\' \'$/) {
            $vector[$coord + 6] = 'susp';
            $vector[$coord + 7] = 'susp';
        } elsif ($mainsym =~ /^ht$/) {
            for my $i ($coord .. $coord+15) {
                if ($vector[$i] eq 'ht' && $vector[$i ^ 1] eq 'ht') {
                    $vector[$i | 1] = 'btab';
                }
            }
        } elsif ($mainsym =~ /^nscr$/) {
            for my $i ($coord .. $coord+15) {
                if ($vector[$i] eq 'nscr' && $vector[$i ^ 1] eq 'nscr') {
                    $vector[$i | 1] = 'pscr';
                }
            }
            $vector[$coord + 4] = 'debug';
            $vector[$coord + 5] = 'debug';
	} elsif ($mainsym =~ /^F([0-9]+)$/) {
	    my $num = $1;
	    $vector[$coord + 1] = 'F'. ($num + 12); # shift
	    $vector[$coord + 2] = 'Console_'. ($num + 12); # altgr
	    $vector[$coord + 3] = 'Console_'. ($num + 24); # altgr + shift
	    $vector[$coord + 4] = 'F'. ($num + 24); # control
	    $vector[$coord + 5] = 'F'. ($num + 36); # control + shift
	    $vector[$coord + 6] = 'Console_'. ($num + 12); # control + altgr
	    $vector[$coord + 7] = 'Console_'. ($num + 24); # control+altgr+shift
	    $vector[$coord + 8] = 'Console_'. $num; # alt
	    $vector[$coord + 9] = 'Console_'. ($num + 12); # alt + shift
	    $vector[$coord + 12] = 'Console_'. $num; # control + alt
	    $vector[$coord + 13] = 'Console_'. ($num + 12); # control+alt+shift
	} elsif ($mainsym eq 'Scroll_Lock' || $mainsym eq 'Help') {
	    $vector[$coord + 1] = 'Show_Memory';
	    $vector[$coord + 2] = 'Show_Registers';
	    $vector[$coord + 4] = 'Show_State';
	    $vector[$coord + 8] = 'Show_Registers';
	} elsif ($mainsym =~ /^KP_([0-9])$/) {
	    my $num = $1;
	    $vector[$coord + 2] = 'Hex_'. $num;
	    $vector[$coord + 9] = 'Hex_'. $num;
	    $vector[$coord + 8] = 'Ascii_'. $num;
	} elsif ($mainsym eq 'Num_Lock') {
	    $vector[$coord + 2] = 'Hex_A';
	    $vector[$coord + 9] = 'Hex_A';
	} elsif ($mainsym eq 'KP_Divide') {
	    $vector[$coord + 2] = 'Hex_B';
	    $vector[$coord + 9] = 'Hex_B';
	} elsif ($mainsym eq 'KP_Multiply') {
	    $vector[$coord + 2] = 'Hex_C';
	    $vector[$coord + 9] = 'Hex_C';
	} elsif ($mainsym eq 'KP_Subtract') {
	    $vector[$coord + 2] = 'Hex_D';
	    $vector[$coord + 9] = 'Hex_D';
	} elsif ($mainsym eq 'KP_Add') {
	    $vector[$coord + 2] = 'Hex_E';
	    $vector[$coord + 9] = 'Hex_E';
	} elsif ($mainsym eq 'KP_Enter') {
	    $vector[$coord + 2] = 'Hex_F';
	    $vector[$coord + 9] = 'Hex_F';
	} elsif ($mainsym eq 'Prior' || $mainsym eq 'PageUp') {
	    $vector[$coord + 1] = 'Scroll_Backward';
	} elsif ($mainsym eq 'Next' || $mainsym eq 'PageDown') {
	    $vector[$coord + 1] = 'Scroll_Forward';
	} elsif ($mainsym eq 'Left') {
	    $vector[$coord + 8] = 'Decr_Console';
	} elsif ($mainsym eq 'Right') {
	    $vector[$coord + 8] = 'Incr_Console';
	} elsif ($mainsym eq 'Up') {
	    $vector[$coord + 8] = 'KeyboardSignal';
	}
    }
    return @vector;
}

sub print_vector {
    my $kernel_code = $_[0];
    my $only_VoidSymbol = 1;
    my $no_NoSymbol = 1;
    for my $mask (0 .. 63) {
	if ($vector[$mask] ne $voidsymbol && $vector[$mask] ne 'NoSymbol') {
	    $only_VoidSymbol = 0;
	    last;
	}
    }
    return if ($only_VoidSymbol && $compact);
    for my $mask (0 .. 63) {
	if ($vector[$mask] eq 'NoSymbol') {
	    $no_NoSymbol = 0;
	    last;
	}
    }
    if ($freebsd) {
        my @capslockable = (0,0,0,0);
	for my $group (0 .. 3) {
	    if ($vector[$group * 16] =~ /^\+/) {
                $capslockable[$group] = 1;
                last;
            }
        }
	for my $mask (0 .. 63) {
	    $vector[$mask] =~ s/^\+//;
	    $vector[$mask] =~ s/^NoSymbol$/nop/;
        }
        for my $group (0 .. 1) {
            next if ($group && $symbols !~ /:2/);
            my $lockstate = ($capslockable[$group] ? 
                             ($numlockable[$group] ? 'B' : 'C')
                             : ($numlockable[$group] ? 'N' : 'O'));
            $KEYMAP .= sprintf "  %03i   ", $kernel_code + 128*$group;
            for my $mask (0, 1, 4, 5, 2, 3, 6, 7) {
                $KEYMAP .= sprintf "%-6s ", $vector[$mask + 16*$group];
            }
            $KEYMAP .= " $lockstate\n";
        }
    } elsif ($compact) {
	my $line = ($symbols =~ /:2/ # true if the keymap is non-latin
		    ? "@vector[0, 1, 16, 17, 4, 20, 8, 24, 12, 28]"
		    : "@vector[0, 1, 2, 3, 4, 6, 8, 10, 12, 14]");
	$line =~ s/NoSymbol/VoidSymbol/g;
	$KEYMAP .= "keycode $kernel_code = $line\n";
    } else {
	my @capsvector = @vector;
	for my $mask (0 .. 63) {
	    if ($capsvector[$mask] =~ /^(\+?)U\+([0-9a-fA-F]+)$/) {
		my $v = hex ($2);
		my $l = ord (lc (pack ("U", $v)));
		my $u = ord (uc (pack ("U", $v)));
		my $c = ($v == $l ? $u : $l);
		$capsvector[$mask] = $1 ."U+". sprintf ("%04x", $c);
		if ($v != $c && $v > 0x7f) {
		    $broken_caps = 1;
		}
	    }
	}
	if ($no_NoSymbol) {
	    $KEYMAP .= "keycode $kernel_code = @vector @capsvector\n";
	} else {
	    for my $mask (0 .. 63) {
		if ($vector[$mask] ne 'NoSymbol') {
		    $KEYMAP .= "$modifier_combinations[$mask]"
			." keycode $kernel_code = $vector[$mask]\n";
		    if ($modifier_combinations[$mask] =~ /plain/) {
			$KEYMAP .= "ctrll"
			    ." keycode $kernel_code = $capsvector[$mask]\n";
		    } else {
			$KEYMAP .= "ctrll $modifier_combinations[$mask]"
			    ." keycode $kernel_code = $capsvector[$mask]\n";
		    }
		}
	    }
	}
    }
}

my %at_scancodes = (
    9 => 1,
    10 => 2,
    11 => 3,
    12 => 4,
    13 => 5,
    14 => 6,
    15 => 7,
    16 => 8,
    17 => 9,
    18 => 10,
    19 => 11,
    20 => 12,
    21 => 13,
    22 => 14,
    23 => 15,
    24 => 16,
    25 => 17,
    26 => 18,
    27 => 19,
    28 => 20,
    29 => 21,
    30 => 22,
    31 => 23,
    32 => 24,
    33 => 25,
    34 => 26,
    35 => 27,
    36 => 28,
    37 => 29,
    38 => 30,
    39 => 31,
    40 => 32,
    41 => 33,
    42 => 34,
    43 => 35,
    44 => 36,
    45 => 37,
    46 => 38,
    47 => 39,
    48 => 40,
    49 => 41,
    50 => 42,
    51 => 43,
    52 => 44,
    53 => 45,
    54 => 46,
    55 => 47,
    56 => 48,
    57 => 49,
    58 => 50,
    59 => 51,
    60 => 52,
    61 => 53,
    62 => 54,
    63 => 55,
    64 => 56,
    65 => 57,
    66 => 58,
    67 => 59,
    68 => 60,
    69 => 61,
    70 => 62,
    71 => 63,
    72 => 64,
    73 => 65,
    74 => 66,
    75 => 67,
    76 => 68,
    77 => 69,
    78 => 70,
    79 => 71,
    80 => 72,
    81 => 73,
    82 => 74,
    83 => 75,
    84 => 76,
    85 => 77,
    86 => 78,
    87 => 79,
    88 => 80,
    89 => 81,
    90 => 82,
    91 => 83,
    92 => 84,
    93 => -1, # fake key (KP_Equal)
    94 => 86,
    95 => 87,
    96 => 88,
    97 => 102,
    98 => 103,
    99 => 104,
    100 => 105,
    102 => 106,
    103 => 107,
    104 => 108,
    105 => 109,
    106 => 110,
    107 => 111,
    108 => 96,
    109 => 97,
    110 => 119,
    111 => 99,
    112 => 98,
    113 => 100,
    114 => 101,
    115 => 125,
    116 => 126,
    117 => 127,
    118 => -1,  # Japanese
    119 => -1,  # Japanese
    120 => -1,  # Japanese
    123 => -1,
    124 => -1,  # fake key
    125 => -1,  # fake key
    126 => -1,  # fake key
    127 => -1,  # fake key
    128 => -1,  # fake key
    129 => -1,  # Japanese
    131 => -1,  # Japanese
    133 => 124, # Japanese
    134 => 121, # Brasilian ABNT2
    144 => -1,  # Japanese
    156 => -1,  # fake key
    208 => -1,  # Japanese
    209 => -1,  # Korean
    210 => -1,  # Korean
    211 => 89,  # Brasilian ABNT2, Japanese
    214 => -1,  # alternate between internal and multimedia display
    215 => -1,  # turn light on/of
    216 => -1,  # brightness down
    217 => -1,  # brightness up
);

my %freebsd_scancodes = (
    9 => 1,
    10 => 2,
    11 => 3,
    12 => 4,
    13 => 5,
    14 => 6,
    15 => 7,
    16 => 8,
    17 => 9,
    18 => 10,
    19 => 11,
    20 => 12,
    21 => 13,
    22 => 14,
    23 => 15,
    24 => 16,
    25 => 17,
    26 => 18,
    27 => 19,
    28 => 20,
    29 => 21,
    30 => 22,
    31 => 23,
    32 => 24,
    33 => 25,
    34 => 26,
    35 => 27,
    36 => 28,
    37 => 29,
    38 => 30,
    39 => 31,
    40 => 32,
    41 => 33,
    42 => 34,
    43 => 35,
    44 => 36,
    45 => 37,
    46 => 38,
    47 => 39,
    48 => 40,
    49 => 41,
    50 => 42,
    51 => 43,
    52 => 44,
    53 => 45,
    54 => 46,
    55 => 47,
    56 => 48,
    57 => 49,
    58 => 50,
    59 => 51,
    60 => 52,
    61 => 53,
    62 => 54,
    63 => 55,
    64 => 56,
    65 => 57,
    66 => 58,
    67 => 59,
    68 => 60,
    69 => 61,
    70 => 62,
    71 => 63,
    72 => 64,
    73 => 65,
    74 => 66,
    75 => 67,
    76 => 68,
    77 => 69,
    78 => 70,
    79 => 71,
    80 => 72,
    81 => 73,
    82 => 74,
    83 => 75,
    84 => 76,
    85 => 77,
    86 => 78,
    87 => 79,
    88 => 80,
    89 => 81,
    90 => 82,
    91 => 83,
    92 => 84,
    93 => -1, # fake key (KP_Equal)
    94 => 86,
    95 => 87,
    96 => 88,
    97 => 94,
    98 => 95,
    99 => 96,
    100 => 97,
    102 => 98,
    103 => 99,
    104 => 100,
    105 => 101,
    106 => 102,
    107 => 103,
    108 => 89,
    109 => 90,
    110 => 104,
    111 => 92,
    112 => 91,
    113 => 93,
    114 => 108,
    115 => 105,
    116 => 106,
    117 => 107,
    118 => -1,  # Japanese
    119 => -1,  # Japanese
    120 => -1,  # Japanese
    123 => -1,
    124 => -1,  # fake key
    125 => -1,  # fake key
    126 => -1,  # fake key
    127 => -1,  # fake key
    128 => -1,  # fake key
    129 => -1,  # Japanese
    131 => -1,  # Japanese
    133 => 125, # Japanese
    134 => 126, # Brasilian ABNT2
    144 => -1,  # Japanese
    156 => -1,  # fake key
    208 => -1,  # Japanese
    209 => -1,  # Korean
    210 => -1,  # Korean
    211 => 115,  # Brasilian ABNT2, Japanese
    214 => -1,  # alternate between internal and multimedia display
    215 => -1,  # turn light on/of
    216 => -1,  # brightness down
    217 => -1,  # brightness up
);

if ($freebsd) {
    $KEYMAP .= 
"#                                                         alt\n".
"# scan                       cntrl          alt    alt   cntrl lock\n".
"# code  base   shift  cntrl  shift  alt    shift  cntrl  shift state\n".
"# ------------------------------------------------------------------\n";
#"  000   nop    nop    nop    nop    nop    nop    nop    nop     O\n";
} elsif ($compact) {
    $KEYMAP .= "keymaps 0-4,6,8,10,12,14\n";
} else {
    $KEYMAP .= "keymaps 0-127\n";
}

if ($freebsd) {
    foreach my $key (sort {$a <=> $b} (keys %symbols_table)) {
	my $kernel_code = $freebsd_scancodes{$key};
	next if (! defined $kernel_code || $kernel_code < 0);
	@vector = flatten ($key);
	if ($kernel_code == 83 || $kernel_code == 103) {
	    for my $coord (0+6, 0+7, 16+6, 16+7, 32+6, 32+7, 48+6, 48+7,) {
		$vector[$coord] = 'boot';
	    }
        }
	print_vector $kernel_code;
    }
} elsif ($arch eq 'at' || $arch eq 'evdev') {
    foreach my $key (sort {$a <=> $b} (keys %symbols_table)) {
	my $kernel_code = (($arch eq 'at') ? $at_scancodes{$key} : $key - 8);
	next if (! defined $kernel_code || $kernel_code < 0);
        @vector = flatten ($key);
        if ($kernel_code == 99) {
	    for my $coord (0, 1, 16, 17, 32, 33, 48, 49) {
		$vector[$coord] = 'VoidSymbol';
	    }
 	} elsif ($kernel_code == 83 || $kernel_code == 111) {
	    for my $coord (0+6, 0+12, 0+14, 
                           16+6, 16+12, 16+14,
                           32+6, 32+12, 32+14, 
                           48+6, 48+12, 48+14) {
		$vector[$coord] = 'Boot';
	    }
	}
	print_vector $kernel_code;
    }
} elsif ($arch eq 'macintosh') {
    foreach my $key (sort {$a <=> $b} (keys %symbols_table)) {
	my $kernel_code = $key - 8;
	@vector = flatten ($key);
	print_vector $kernel_code;
    }
    $KEYMAP .= '\
keycode 127 =
        shift   control keycode 127 = Boot
'
} elsif ($arch eq 'ataritt') {
    foreach my $key (sort {$a <=> $b} (keys %symbols_table)) {
	my $kernel_code = $key - 8;
	if ($kernel_code == 97) {
	    @vector = ('F246', 'Break', 'F246', 'F246',
		       'F246', 'F246', 'F246', 'F246', 
		       'Last_Console', 'F246', 'F246', 'F246', 
		       'F246', 'F246', 'F246', 'F246') x 4;
	} else {
	    @vector = flatten ($key);
	}
	if ($kernel_code == 83 || $kernel_code == 113) {
	    for my $coord (0+6, 0+12, 0+14, 
                           16+6, 16+12, 16+14,
                           32+6, 32+12, 32+14, 
                           48+6, 48+12, 48+14) {
		$vector[$coord] = 'Boot';
	    }
	}
	print_vector $kernel_code;
    }
} elsif ($arch eq 'amiga') {
    foreach my $key (sort {$a <=> $b} (keys %symbols_table)) {
	my $kernel_code = $key - 8;
	@vector = flatten ($key);
	if ($kernel_code == 60) {
	    for my $coord (0+6, 0+12, 0+14, 
                           16+6, 16+12, 16+14,
                           32+6, 32+12, 32+14, 
                           48+6, 48+12, 48+14) {
		$vector[$coord] = 'Boot';
	    }
	}
	print_vector $kernel_code;
    }
} elsif ($arch eq 'sun') {
    foreach my $key (sort {$a <=> $b} (keys %symbols_table)) {
	my $kernel_code = $key - 7;
	@vector = flatten ($key);
	if ($kernel_code == 50) {
	    for my $coord (0+6, 0+12, 0+14, 
                           16+6, 16+12, 16+14,
                           32+6, 32+12, 32+14, 
                           48+6, 48+12, 48+14) {
		$vector[$coord] = 'Boot';
	    }
	}
	print_vector $kernel_code;
    }
} else {
    die "$0: Unsupported keyboard type $arch\n";
}

if ($broken_caps) {
    $KEYMAP =~ s/Caps_Lock/CtrlL_Lock/g;
}

print $KEYMAP;

if (!$compose_charmap && $charmap) {
    $compose_charmap = $charmap;
}

if ($freebsd) {
    if ($compose_charmap) {
        my $file1 = "/etc/console-setup/dkey.${compose_charmap}.inc";
        my $file2 = "$installdir/etc/console-setup/dkey.${compose_charmap}.inc";
        if (-f $file1) {
            system("cat $file1");
        } elsif (-f $file2) {
            system("cat $file2");
        }
    }
} else {
    print "strings as usual\n";

    if ($compose_charmap) {
        my $file1 = "/etc/console-setup/compose.${compose_charmap}.inc";
        my $file2 = "$installdir/etc/console-setup/compose.${compose_charmap}.inc";
        if (-f $file1) {
            system("cat $file1");
        } elsif (-f $file2) {
            system("cat $file2");
        }
    }
}
my $file1 = "/etc/console-setup/remap.inc";
my $file2 = "$installdir/etc/console-setup/remap.inc";
if (-f $file1) {
    system("cat $file1");
} elsif (-f $file2) {
    system("cat $file2");
}

exit 0;
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    /*
 * Copyright 2020-2021 The OpenSSL Project Authors. All Rights Reserved.
 *
 * Licensed under the Apache License 2.0 (the "License").  You may not use
 * this file except in compliance with the License.  You can obtain a copy
 * in the file LICENSE in the source distribution or at
 * https://www.openssl.org/source/license.html
 */

/*
 * This header file preserves symbols from pre-3.0 OpenSSL.
 * It should never be included directly, as it's already included
 * by the public {lib}err.h headers, and since it will go away some
 * time in the future.
 */

#ifndef OPENSSL_CRYPTOERR_LEGACY_H
# define OPENSSL_CRYPTOERR_LEGACY_H
# pragma once

# include <openssl/macros.h>
# include <openssl/symhacks.h>

# ifdef  __cplusplus
extern "C" {
# endif

# ifndef OPENSSL_NO_DEPRECATED_3_0
OSSL_DEPRECATEDIN_3_0 int ERR_load_ASN1_strings(void);
OSSL_DEPRECATEDIN_3_0 int ERR_load_ASYNC_strings(void);
OSSL_DEPRECATEDIN_3_0 int ERR_load_BIO_strings(void);
OSSL_DEPRECATEDIN_3_0 int ERR_load_BN_strings(void);
OSSL_DEPRECATEDIN_3_0 int ERR_load_BUF_strings(void);
#  ifndef OPENSSL_NO_CMS
OSSL_DEPRECATEDIN_3_0 int ERR_load_CMS_strings(void);
#  endif
#  ifndef OPENSSL_NO_COMP
OSSL_DEPRECATEDIN_3_0 int ERR_load_COMP_strings(void);
#  endif
OSSL_DEPRECATEDIN_3_0 int ERR_load_CONF_strings(void);
OSSL_DEPRECATEDIN_3_0 int ERR_load_CRYPTO_strings(void);
#  ifndef OPENSSL_NO_CT
OSSL_DEPRECATEDIN_3_0 int ERR_load_CT_strings(void);
#  endif
#  ifndef OPENSSL_NO_DH
OSSL_DEPRECATEDIN_3_0 int ERR_load_DH_strings(void);
#  endif
#  ifndef OPENSSL_NO_DSA
OSSL_DEPRECATEDIN_3_0 int ERR_load_DSA_strings(void);
#  endif
#  ifndef OPENSSL_NO_EC
OSSL_DEPRECATEDIN_3_0 int ERR_load_EC_strings(void);
#  endif
#  ifndef OPENSSL_NO_ENGINE
OSSL_DEPRECATEDIN_3_0 int ERR_load_ENGINE_strings(void);
#  endif
OSSL_DEPRECATEDIN_3_0 int ERR_load_ERR_strings(void);
OSSL_DEPRECATEDIN_3_0 int ERR_load_EVP_strings(void);
OSSL_DEPRECATEDIN_3_0 int ERR_load_KDF_strings(void);
OSSL_DEPRECATEDIN_3_0 int ERR_load_OBJ_strings(void);
#  ifndef OPENSSL_NO_OCSP
OSSL_DEPRECATEDIN_3_0 int ERR_load_OCSP_strings(void);
#  endif
OSSL_DEPRECATEDIN_3_0 int ERR_load_PEM_strings(void);
OSSL_DEPRECATEDIN_3_0 int ERR_load_PKCS12_strings(void);
OSSL_DEPRECATEDIN_3_0 int ERR_load_PKCS7_strings(void);
OSSL_DEPRECATEDIN_3_0 int ERR_load_RAND_strings(void);
OSSL_DEPRECATEDIN_3_0 int ERR_load_RSA_strings(void);
OSSL_DEPRECATEDIN_3_0 int ERR_load_OSSL_STORE_strings(void);
#  ifndef OPENSSL_NO_TS
OSSL_DEPRECATEDIN_3_0 int ERR_load_TS_strings(void);
#  endif
OSSL_DEPRECATEDIN_3_0 int ERR_load_UI_strings(void);
OSSL_DEPRECATEDIN_3_0 int ERR_load_X509_strings(void);
OSSL_DEPRECATEDIN_3_0 int ERR_load_X509V3_strings(void);

/* Collected _F_ macros from OpenSSL 1.1.1 */

/*
 * ASN1 function codes.
 */
#  define ASN1_F_A2D_ASN1_OBJECT                           0
#  define ASN1_F_A2I_ASN1_INTEGER                          0
#  define ASN1_F_A2I_ASN1_STRING                           0
#  define ASN1_F_APPEND_EXP                                0
#  define ASN1_F_ASN1_BIO_INIT                             0
#  define ASN1_F_ASN1_BIT_STRING_SET_BIT                   0
#  define ASN1_F_ASN1_CB                                   0
#  define ASN1_F_ASN1_CHECK_TLEN                           0
#  define ASN1_F_ASN1_COLLECT                              0
#  define ASN1_F_ASN1_D2I_EX_PRIMITIVE                     0
#  define ASN1_F_ASN1_D2I_FP                               0
#  define ASN1_F_ASN1_D2I_READ_BIO                         0
#  define ASN1_F_ASN1_DIGEST                               0
#  define ASN1_F_ASN1_DO_ADB                               0
#  define ASN1_F_ASN1_DO_LOCK                              0
#  define ASN1_F_ASN1_DUP                                  0
#  define ASN1_F_ASN1_ENC_SAVE                             0
#  define ASN1_F_ASN1_EX_C2I                               0
#  define ASN1_F_ASN1_FIND_END                             0
#  define ASN1_F_ASN1_GENERALIZEDTIME_ADJ                  0
#  define ASN1_F_ASN1_GENERATE_V3                          0
#  define ASN1_F_ASN1_GET_INT64                            0
#  define ASN1_F_ASN1_GET_OBJECT                           0
#  define ASN1_F_ASN1_GET_UINT64                           0
#  define ASN1_F_ASN1_I2D_BIO                              0
#  define ASN1_F_ASN1_I2D_FP                               0
#  define ASN1_F_ASN1_ITEM_D2I_FP                          0
#  define ASN1_F_ASN1_ITEM_DUP                             0
#  define ASN1_F_ASN1_ITEM_EMBED_D2I                       0
#  define ASN1_F_ASN1_ITEM_EMBED_NEW                       0
#  define ASN1_F_ASN1_ITEM_FLAGS_I2D                       0
#  define ASN1_F_ASN1_ITEM_I2D_BIO                         0
#  define ASN1_F_ASN1_ITEM_I2D_FP                          0
#  define ASN1_F_ASN1_ITEM_PACK                            0
#  define ASN1_F_ASN1_ITEM_SIGN                            0
#  define ASN1_F_ASN1_ITEM_SIGN_CTX                        0
#  define ASN1_F_ASN1_ITEM_UNPACK                          0
#  define ASN1_F_ASN1_ITEM_VERIFY                          0
#  define ASN1_F_ASN1_MBSTRING_NCOPY                       0
#  define ASN1_F_ASN1_OBJECT_NEW                           0
#  define ASN1_F_ASN1_OUTPUT_DATA                          0
#  define ASN1_F_ASN1_PCTX_NEW                             0
#  define ASN1_F_ASN1_PRIMITIVE_NEW                        0
#  define ASN1_F_ASN1_SCTX_NEW                             0
#  define ASN1_F_ASN1_SIGN                                 0
#  define ASN1_F_ASN1_STR2TYPE                             0
#  define ASN1_F_ASN1_STRING_GET_INT64                     0
#  define ASN1_F_ASN1_STRING_GET_UINT64                    0
#  define ASN1_F_ASN1_STRING_SET                           0
#  define ASN1_F_ASN1_STRING_TABLE_ADD                     0
#  define ASN1_F_ASN1_STRING_TO_BN                         0
#  define ASN1_F_ASN1_STRING_TYPE_NEW                      0
#  define ASN1_F_ASN1_TEMPLATE_EX_D2I                      0
#  define ASN1_F_ASN1_TEMPLATE_NEW                         0
#  define ASN1_F_ASN1_TEMPLATE_NOEXP_D2I                   0
#  define ASN1_F_ASN1_TIME_ADJ                             0
#  define ASN1_F_ASN1_TYPE_GET_INT_OCTETSTRING             0
#  define ASN1_F_ASN1_TYPE_GET_OCTETSTRING                 0
#  define ASN1_F_ASN1_UTCTIME_ADJ                          0
#  define ASN1_F_ASN1_VERIFY                               0
#  define ASN1_F_B64_READ_ASN1                             0
#  define ASN1_F_B64_WRITE_ASN1                            0
#  define ASN1_F_BIO_NEW_NDEF                              0
#  define ASN1_F_BITSTR_CB                                 0
#  define ASN1_F_BN_TO_ASN1_STRING                         0
#  define ASN1_F_C2I_ASN1_BIT_STRING                       0
#  define ASN1_F_C2I_ASN1_INTEGER                          0
#  define ASN1_F_C2I_ASN1_OBJECT                           0
#  define ASN1_F_C2I_IBUF                                  0
#  define ASN1_F_C2I_UINT64_INT                            0
#  define ASN1_F_COLLECT_DATA                              0
#  define ASN1_F_D2I_ASN1_OBJECT                           0
#  define ASN1_F_D2I_ASN1_UINTEGER                         0
#  define ASN1_F_D2I_AUTOPRIVATEKEY                        0
#  define ASN1_F_D2I_PRIVATEKEY                            0
#  define ASN1_F_D2I_PUBLICKEY                             0
#  define ASN1_F_DO_BUF                                    0
#  define ASN1_F_DO_CREATE                                 0
#  define ASN1_F_DO_DUMP                                   0
#  define ASN1_F_DO_TCREATE                                0
#  define ASN1_F_I2A_ASN1_OBJECT                           0
#  define ASN1_F_I2D_ASN1_BIO_STREAM                       0
#  define ASN1_F_I2D_ASN1_OBJECT                           0
#  define ASN1_F_I2D_DSA_PUBKEY                            0
#  define ASN1_F_I2D_EC_PUBKEY                             0
#  define ASN1_F_I2D_PRIVATEKEY                            0
#  define ASN1_F_I2D_PUBLICKEY                             0
#  define ASN1_F_I2D_RSA_PUBKEY                            0
#  define ASN1_F_LONG_C2I                                  0
#  define ASN1_F_NDEF_PREFIX                               0
#  define ASN1_F_NDEF_SUFFIX                               0
#  define ASN1_F_OID_MODULE_INIT                           0
#  define ASN1_F_PARSE_TAGGING                             0
#  define ASN1_F_PKCS5_PBE2_SET_IV                         0
#  define ASN1_F_PKCS5_PBE2_SET_SCRYPT                     0
#  define ASN1_F_PKCS5_PBE_SET                             0
#  define ASN1_F_PKCS5_PBE_SET0_ALGOR                      0
#  define ASN1_F_PKCS5_PBKDF2_SET                          0
#  define ASN1_F_PKCS5_SCRYPT_SET                          0
#  define ASN1_F_SMIME_READ_ASN1                           0
#  define ASN1_F_SMIME_TEXT                                0
#  define ASN1_F_STABLE_GET                                0
#  define ASN1_F_STBL_MODULE_INIT                          0
#  define ASN1_F_UINT32_C2I                                0
#  define ASN1_F_UINT32_NEW                                0
#  define ASN1_F_UINT64_C2I                                0
#  define ASN1_F_UINT64_NEW                                0
#  define ASN1_F_X509_CRL_ADD0_REVOKED                     0
#  define ASN1_F_X509_INFO_NEW                             0
#  define ASN1_F_X509_NAME_ENCODE                          0
#  define ASN1_F_X509_NAME_EX_D2I                          0
#  define ASN1_F_X509_NAME_EX_NEW                          0
#  define ASN1_F_X509_PKEY_NEW                             0

/*
 * ASYNC function codes.
 */
#  define ASYNC_F_ASYNC_CTX_NEW                            0
#  define ASYNC_F_ASYNC_INIT_THREAD                        0
#  define ASYNC_F_ASYNC_JOB_NEW                            0
#  define ASYNC_F_ASYNC_PAUSE_JOB                          0
#  define ASYNC_F_ASYNC_START_FUNC                         0
#  define ASYNC_F_ASYNC_START_JOB                          0
#  define ASYNC_F_ASYNC_WAIT_CTX_SET_WAIT_FD               0

/*
 * BIO function codes.
 */
#  define BIO_F_ACPT_STATE                                 0
#  define BIO_F_ADDRINFO_WRAP                              0
#  define BIO_F_ADDR_STRINGS                               0
#  define BIO_F_BIO_ACCEPT                                 0
#  define BIO_F_BIO_ACCEPT_EX                              0
#  define BIO_F_BIO_ACCEPT_NEW                             0
#  define BIO_F_BIO_ADDR_NEW                               0
#  define BIO_F_BIO_BIND                                   0
#  define BIO_F_BIO_CALLBACK_CTRL                          0
#  define BIO_F_BIO_CONNECT                                0
#  define BIO_F_BIO_CONNECT_NEW                            0
#  define BIO_F_BIO_CTRL                                   0
#  define BIO_F_BIO_GETS                                   0
#  define BIO_F_BIO_GET_HOST_IP                            0
#  define BIO_F_BIO_GET_NEW_INDEX                          0
#  define BIO_F_BIO_GET_PORT                               0
#  define BIO_F_BIO_LISTEN                                 0
#  define BIO_F_BIO_LOOKUP                                 0
#  define BIO_F_BIO_LOOKUP_EX                              0
#  define BIO_F_BIO_MAKE_PAIR                              0
#  define BIO_F_BIO_METH_NEW                               0
#  define BIO_F_BIO_NEW                                    0
#  define BIO_F_BIO_NEW_DGRAM_SCTP                         0
#  define BIO_F_BIO_NEW_FILE                               0
#  define BIO_F_BIO_NEW_MEM_BUF                            0
#  define BIO_F_BIO_NREAD                                  0
#  define BIO_F_BIO_NREAD0                                 0
#  define BIO_F_BIO_NWRITE                                 0
#  define BIO_F_BIO_NWRITE0                                0
#  define BIO_F_BIO_PARSE_HOSTSERV                         0
#  define BIO_F_BIO_PUTS                                   0
#  define BIO_F_BIO_READ                                   0
#  define BIO_F_BIO_READ_EX                                0
#  define BIO_F_BIO_READ_INTERN                            0
#  define BIO_F_BIO_SOCKET                                 0
#  define BIO_F_BIO_SOCKET_NBIO                            0
#  define BIO_F_BIO_SOCK_INFO                              0
#  define BIO_F_BIO_SOCK_INIT                              0
#  define BIO_F_BIO_WRITE                                  0
#  define BIO_F_BIO_WRITE_EX                               0
#  define BIO_F_BIO_WRITE_INTERN                           0
#  define BIO_F_BUFFER_CTRL                                0
#  define BIO_F_CONN_CTRL                                  0
#  define BIO_F_CONN_STATE                                 0
#  define BIO_F_DGRAM_SCTP_NEW                             0
#  define BIO_F_DGRAM_SCTP_READ                            0
#  define BIO_F_DGRAM_SCTP_WRITE                           0
#  define BIO_F_DOAPR_OUTCH                                0
#  define BIO_F_FILE_CTRL                                  0
#  define BIO_F_FILE_READ                                  0
#  define BIO_F_LINEBUFFER_CTRL                            0
#  define BIO_F_LINEBUFFER_NEW                             0
#  define BIO_F_MEM_WRITE                                  0
#  define BIO_F_NBIOF_NEW                                  0
#  define BIO_F_SLG_WRITE                                  0
#  define BIO_F_SSL_NEW                                    0

/*
 * BN function codes.
 */
#  define BN_F_BNRAND                                      0
#  define BN_F_BNRAND_RANGE                                0
#  define BN_F_BN_BLINDING_CONVERT_EX                      0
#  define BN_F_BN_BLINDING_CREATE_PARAM                    0
#  define BN_F_BN_BLINDING_INVERT_EX                       0
#  define BN_F_BN_BLINDING_NEW                             0
#  define BN_F_BN_BLINDING_UPDATE                          0
#  define BN_F_BN_BN2DEC                                   0
#  define BN_F_BN_BN2HEX                                   0
#  define BN_F_BN_COMPUTE_WNAF                             0
#  define BN_F_BN_CTX_GET                                  0
#  define BN_F_BN_CTX_NEW                                  0
#  define BN_F_BN_CTX_START                                0
#  define BN_F_BN_DIV                                      0
#  define BN_F_BN_DIV_RECP                                 0
#  define BN_F_BN_EXP                                      0
#  define BN_F_BN_EXPAND_INTERNAL                          0
#  define BN_F_BN_GENCB_NEW                                0
#  define BN_F_BN_GENERATE_DSA_NONCE                       0
#  define BN_F_BN_GENERATE_PRIME_EX                        0
#  define BN_F_BN_GF2M_MOD                                 0
#  define BN_F_BN_GF2M_MOD_EXP                             0
#  define BN_F_BN_GF2M_MOD_MUL                             0
#  define BN_F_BN_GF2M_MOD_SOLVE_QUAD                      0
#  define BN_F_BN_GF2M_MOD_SOLVE_QUAD_ARR                  0
#  define BN_F_BN_GF2M_MOD_SQR                             0
#  define BN_F_BN_GF2M_MOD_SQRT                            0
#  define BN_F_BN_LSHIFT                                   0
#  define BN_F_BN_MOD_EXP2_MONT                            0
#  define BN_F_BN_MOD_EXP_MONT                             0
#  define BN_F_BN_MOD_EXP_MONT_CONSTTIME                   0
#  define BN_F_BN_MOD_EXP_MONT_WORD                        0
#  define BN_F_BN_MOD_EXP_RECP                             0
#  define BN_F_BN_MOD_EXP_SIMPLE                           0
#  define BN_F_BN_MOD_INVERSE                              0
#  define BN_F_BN_MOD_INVERSE_NO_BRANCH                    0
#  define BN_F_BN_MOD_LSHIFT_QUICK                         0
#  define BN_F_BN_MOD_SQRT                                 0
#  define BN_F_BN_MONT_CTX_NEW                             0
#  define BN_F_BN_MPI2BN                                   0
#  define BN_F_BN_NEW                                      0
#  define BN_F_BN_POOL_GET                                 0
#  define BN_F_BN_RAND                                     0
#  define BN_F_BN_RAND_RANGE                               0
#  define BN_F_BN_RECP_CTX_NEW                             0
#  define BN_F_BN_RSHIFT                                   0
#  define BN_F_BN_SET_WORDS                                0
#  define BN_F_BN_STACK_PUSH                               0
#  define BN_F_BN_USUB                                     0

/*
 * BUF function codes.
 */
#  define BUF_F_BUF_MEM_GROW                               0
#  define BUF_F_BUF_MEM_GROW_CLEAN                         0
#  define BUF_F_BUF_MEM_NEW                                0

#  ifndef OPENSSL_NO_CMS
/*
 * CMS function codes.
 */
#   define CMS_F_CHECK_CONTENT                              0
#   define CMS_F_CMS_ADD0_CERT                              0
#   define CMS_F_CMS_ADD0_RECIPIENT_KEY                     0
#   define CMS_F_CMS_ADD0_RECIPIENT_PASSWORD                0
#   define CMS_F_CMS_ADD1_RECEIPTREQUEST                    0
#   define CMS_F_CMS_ADD1_RECIPIENT_CERT                    0
#   define CMS_F_CMS_ADD1_SIGNER                            0
#   define CMS_F_CMS_ADD1_SIGNINGTIME                       0
#   define CMS_F_CMS_COMPRESS                               0
#   define CMS_F_CMS_COMPRESSEDDATA_CREATE                  0
#   define CMS_F_CMS_COMPRESSEDDATA_INIT_BIO                0
#   define CMS_F_CMS_COPY_CONTENT                           0
#   define CMS_F_CMS_COPY_MESSAGEDIGEST                     0
#   define CMS_F_CMS_DATA                                   0
#   define CMS_F_CMS_DATAFINAL                              0
#   define CMS_F_CMS_DATAINIT                               0
#   define CMS_F_CMS_DECRYPT                                0
#   define CMS_F_CMS_DECRYPT_SET1_KEY                       0
#   define CMS_F_CMS_DECRYPT_SET1_PASSWORD                  0
#   define CMS_F_CMS_DECRYPT_SET1_PKEY                      0
#   define CMS_F_CMS_DIGESTALGORITHM_FIND_CTX               0
#   define CMS_F_CMS_DIGESTALGORITHM_INIT_BIO               0
#   define CMS_F_CMS_DIGESTEDDATA_DO_FINAL                  0
#   define CMS_F_CMS_DIGEST_VERIFY                          0
#   define CMS_F_CMS_ENCODE_RECEIPT                         0
#   define CMS_F_CMS_ENCRYPT                                0
#   define CMS_F_CMS_ENCRYPTEDCONTENT_INIT                  0
#   define CMS_F_CMS_ENCRYPTEDCONTENT_INIT_BIO              0
#   define CMS_F_CMS_ENCRYPTEDDATA_DECRYPT                  0
#   define CMS_F_CMS_ENCRYPTEDDATA_ENCRYPT                  0
#   define CMS_F_CMS_ENCRYPTEDDATA_SET1_KEY                 0
#   define CMS_F_CMS_ENVELOPEDDATA_CREATE                   0
#   define CMS_F_CMS_ENVELOPEDDATA_INIT_BIO                 0
#   define CMS_F_CMS_ENVELOPED_DATA_INIT                    0
#   define CMS_F_CMS_ENV_ASN1_CTRL                          0
#   define CMS_F_CMS_FINAL                                  0
#   define CMS_F_CMS_GET0_CERTIFICATE_CHOICES               0
#   define CMS_F_CMS_GET0_CONTENT                           0
#   define CMS_F_CMS_GET0_ECONTENT_TYPE                     0
#   define CMS_F_CMS_GET0_ENVELOPED                         0
#   define CMS_F_CMS_GET0_REVOCATION_CHOICES                0
#   define CMS_F_CMS_GET0_SIGNED                            0
#   define CMS_F_CMS_MSGSIGDIGEST_ADD1                      0
#   define CMS_F_CMS_RECEIPTREQUEST_CREATE0                 0
#   define CMS_F_CMS_RECEIPT_VERIFY                         0
#   define CMS_F_CMS_RECIPIENTINFO_DECRYPT                  0
#   define CMS_F_CMS_RECIPIENTINFO_ENCRYPT                  0
#   define CMS_F_CMS_RECIPIENTINFO_KARI_ENCRYPT             0
#   define CMS_F_CMS_RECIPIENTINFO_KARI_GET0_ALG            0
#   define CMS_F_CMS_RECIPIENTINFO_KARI_GET0_ORIG_ID        0
#   define CMS_F_CMS_RECIPIENTINFO_KARI_GET0_REKS           0
#   define CMS_F_CMS_RECIPIENTINFO_KARI_ORIG_ID_CMP         0
#   define CMS_F_CMS_RECIPIENTINFO_KEKRI_DECRYPT            0
#   define CMS_F_CMS_RECIPIENTINFO_KEKRI_ENCRYPT            0
#   define CMS_F_CMS_RECIPIENTINFO_KEKRI_GET0_ID            0
#   define CMS_F_CMS_RECIPIENTINFO_KEKRI_ID_CMP             0
#   define CMS_F_CMS_RECIPIENTINFO_KTRI_CERT_CMP            0
#   define CMS_F_CMS_RECIPIENTINFO_KTRI_DECRYPT             0
#   define CMS_F_CMS_RECIPIENTINFO_KTRI_ENCRYPT             0
#   define CMS_F_CMS_RECIPIENTINFO_KTRI_GET0_ALGS           0
#   define CMS_F_CMS_RECIPIENTINFO_KTRI_GET0_SIGNER_ID      0
#   define CMS_F_CMS_RECIPIENTINFO_PWRI_CRYPT               0
#   define CMS_F_CMS_RECIPIENTINFO_SET0_KEY                 0
#   define CMS_F_CMS_RECIPIENTINFO_SET0_PASSWORD            0
#   define CMS_F_CMS_RECIPIENTINFO_SET0_PKEY                0
#   define CMS_F_CMS_SD_ASN1_CTRL                           0
#   define CMS_F_CMS_SET1_IAS                               0
#   define CMS_F_CMS_SET1_KEYID                             0
#   define CMS_F_CMS_SET1_SIGNERIDENTIFIER                  0
#   define CMS_F_CMS_SET_DETACHED                           0
#   define CMS_F_CMS_SIGN                                   0
#   define CMS_F_CMS_SIGNED_DATA_INIT                       0
#   define CMS_F_CMS_SIGNERINFO_CONTENT_SIGN                0
#   define CMS_F_CMS_SIGNERINFO_SIGN                        0
#   define CMS_F_CMS_SIGNERINFO_VERIFY                      0
#   define CMS_F_CMS_SIGNERINFO_VERIFY_CERT                 0
#   define CMS_F_CMS_SIGNERINFO_VERIFY_CONTENT              0
#   define CMS_F_CMS_SIGN_RECEIPT                           0
#   define CMS_F_CMS_SI_CHECK_ATTRIBUTES                    0
#   define CMS_F_CMS_STREAM                                 0
#   define CMS_F_CMS_UNCOMPRESS                             0
#   define CMS_F_CMS_VERIFY                                 0
#   define CMS_F_KEK_UNWRAP_KEY                             0
#  endif

#  ifndef OPENSSL_NO_COMP
/*
 * COMP function codes.
 */
#   define COMP_F_BIO_ZLIB_FLUSH                            0
#   define COMP_F_BIO_ZLIB_NEW                              0
#   define COMP_F_BIO_ZLIB_READ                             0
#   define COMP_F_BIO_ZLIB_WRITE                            0
#   define COMP_F_COMP_CTX_NEW                              0
#  endif

/*
 * CONF function codes.
 */
#  define CONF_F_CONF_DUMP_FP                              0
#  define CONF_F_CONF_LOAD                                 0
#  define CONF_F_CONF_LOAD_FP                              0
#  define CONF_F_CONF_PARSE_LIST                           0
#  define CONF_F_DEF_LOAD                                  0
#  define CONF_F_DEF_LOAD_BIO                              0
#  define CONF_F_GET_NEXT_FILE                             0
#  define CONF_F_MODULE_ADD                                0
#  define CONF_F_MODULE_INIT                               0
#  define CONF_F_MODULE_LOAD_DSO                           0
#  define CONF_F_MODULE_RUN                                0
#  define CONF_F_NCONF_DUMP_BIO                            0
#  define CONF_F_NCONF_DUMP_FP                             0
#  define CONF_F_NCONF_GET_NUMBER_E                        0
#  define CONF_F_NCONF_GET_SECTION                         0
#  define CONF_F_NCONF_GET_STRING                          0
#  define CONF_F_NCONF_LOAD                                0
#  define CONF_F_NCONF_LOAD_BIO                            0
#  define CONF_F_NCONF_LOAD_FP                             0
#  define CONF_F_NCONF_NEW                                 0
#  define CONF_F_PROCESS_INCLUDE                           0
#  define CONF_F_SSL_MODULE_INIT                           0
#  define CONF_F_STR_COPY                                  0

/*
 * CRYPTO function codes.
 */
#  define CRYPTO_F_CMAC_CTX_NEW                            0
#  define CRYPTO_F_CRYPTO_DUP_EX_DATA                      0
#  define CRYPTO_F_CRYPTO_FREE_EX_DATA                     0
#  define CRYPTO_F_CRYPTO_GET_EX_NEW_INDEX                 0
#  define CRYPTO_F_CRYPTO_MEMDUP                           0
#  define CRYPTO_F_CRYPTO_NEW_EX_DATA                      0
#  define CRYPTO_F_CRYPTO_OCB128_COPY_CTX                  0
#  define CRYPTO_F_CRYPTO_OCB128_INIT                      0
#  define CRYPTO_F_CRYPTO_SET_EX_DATA                      0
#  define CRYPTO_F_GET_AND_LOCK                            0
#  define CRYPTO_F_OPENSSL_ATEXIT                          0
#  define CRYPTO_F_OPENSSL_BUF2HEXSTR                      0
#  define CRYPTO_F_OPENSSL_FOPEN                           0
#  define CRYPTO_F_OPENSSL_HEXSTR2BUF                      0
#  define CRYPTO_F_OPENSSL_INIT_CRYPTO                     0
#  define CRYPTO_F_OPENSSL_LH_NEW                          0
#  define CRYPTO_F_OPENSSL_SK_DEEP_COPY                    0
#  define CRYPTO_F_OPENSSL_SK_DUP                          0
#  define CRYPTO_F_PKEY_HMAC_INIT                          0
#  define CRYPTO_F_PKEY_POLY1305_INIT                      0
#  define CRYPTO_F_PKEY_SIPHASH_INIT                       0
#  define CRYPTO_F_SK_RESERVE                              0

#  ifndef OPENSSL_NO_CT
/*
 * CT function codes.
 */
#   define CT_F_CTLOG_NEW                                   0
#   define CT_F_CTLOG_NEW_FROM_BASE64                       0
#   define CT_F_CTLOG_NEW_FROM_CONF                         0
#   define CT_F_CTLOG_STORE_LOAD_CTX_NEW                    0
#   define CT_F_CTLOG_STORE_LOAD_FILE                       0
#   define CT_F_CTLOG_STORE_LOAD_LOG                        0
#   define CT_F_CTLOG_STORE_NEW                             0
#   define CT_F_CT_BASE64_DECODE                            0
#   define CT_F_CT_POLICY_EVAL_CTX_NEW                      0
#   define CT_F_CT_V1_LOG_ID_FROM_PKEY                      0
#   define CT_F_I2O_SCT                                     0
#   define CT_F_I2O_SCT_LIST                                0
#   define CT_F_I2O_SCT_SIGNATURE                           0
#   define CT_F_O2I_SCT                                     0
#   define CT_F_O2I_SCT_LIST                                0
#   define CT_F_O2I_SCT_SIGNATURE                           0
#   define CT_F_SCT_CTX_NEW                                 0
#   define CT_F_SCT_CTX_VERIFY                              0
#   define CT_F_SCT_NEW                                     0
#   define CT_F_SCT_NEW_FROM_BASE64                         0
#   define CT_F_SCT_SET0_LOG_ID                             0
#   define CT_F_SCT_SET1_EXTENSIONS                         0
#   define CT_F_SCT_SET1_LOG_ID                             0
#   define CT_F_SCT_SET1_SIGNATURE                          0
#   define CT_F_SCT_SET_LOG_ENTRY_TYPE                      0
#   define CT_F_SCT_SET_SIGNATURE_NID                       0
#   define CT_F_SCT_SET_VERSION                             0
#  endif

#  ifndef OPENSSL_NO_DH
/*
 * DH function codes.
 */
#   define DH_F_COMPUTE_KEY                                 0
#   define DH_F_DHPARAMS_PRINT_FP                           0
#   define DH_F_DH_BUILTIN_GENPARAMS                        0
#   define DH_F_DH_CHECK_EX                                 0
#   define DH_F_DH_CHECK_PARAMS_EX                          0
#   define DH_F_DH_CHECK_PUB_KEY_EX                         0
#   define DH_F_DH_CMS_DECRYPT                              0
#   define DH_F_DH_CMS_SET_PEERKEY                          0
#   define DH_F_DH_CMS_SET_SHARED_INFO                      0
#   define DH_F_DH_METH_DUP                                 0
#   define DH_F_DH_METH_NEW                                 0
#   define DH_F_DH_METH_SET1_NAME                           0
#   define DH_F_DH_NEW_BY_NID                               0
#   define DH_F_DH_NEW_METHOD                               0
#   define DH_F_DH_PARAM_DECODE                             0
#   define DH_F_DH_PKEY_PUBLIC_CHECK                        0
#   define DH_F_DH_PRIV_DECODE                              0
#   define DH_F_DH_PRIV_ENCODE                              0
#   define DH_F_DH_PUB_DECODE                               0
#   define DH_F_DH_PUB_ENCODE                               0
#   define DH_F_DO_DH_PRINT                                 0
#   define DH_F_GENERATE_KEY                                0
#   define DH_F_PKEY_DH_CTRL_STR                            0
#   define DH_F_PKEY_DH_DERIVE                              0
#   define DH_F_PKEY_DH_INIT                                0
#   define DH_F_PKEY_DH_KEYGEN                              0
#  endif

#  ifndef OPENSSL_NO_DSA
/*
 * DSA function codes.
 */
#   define DSA_F_DSAPARAMS_PRINT                            0
#   define DSA_F_DSAPARAMS_PRINT_FP                         0
#   define DSA_F_DSA_BUILTIN_PARAMGEN                       0
#   define DSA_F_DSA_BUILTIN_PARAMGEN2                      0
#   define DSA_F_DSA_DO_SIGN                                0
#   define DSA_F_DSA_DO_VERIFY                              0
#   define DSA_F_DSA_METH_DUP                               0
#   define DSA_F_DSA_METH_NEW                               0
#   define DSA_F_DSA_METH_SET1_NAME                         0
#   define DSA_F_DSA_NEW_METHOD                             0
#   define DSA_F_DSA_PARAM_DECODE                           0
#   define DSA_F_DSA_PRINT_FP                               0
#   define DSA_F_DSA_PRIV_DECODE                            0
#   define DSA_F_DSA_PRIV_ENCODE                            0
#   define DSA_F_DSA_PUB_DECODE                             0
#   define DSA_F_DSA_PUB_ENCODE                             0
#   define DSA_F_DSA_SIGN                                   0
#   define DSA_F_DSA_SIGN_SETUP                             0
#   define DSA_F_DSA_SIG_NEW                                0
#   define DSA_F_OLD_DSA_PRIV_DECODE                        0
#   define DSA_F_PKEY_DSA_CTRL                              0
#   define DSA_F_PKEY_DSA_CTRL_STR                          0
#   define DSA_F_PKEY_DSA_KEYGEN                            0
#  endif

#  ifndef OPENSSL_NO_EC
/*
 * EC function codes.
 */
#   define EC_F_BN_TO_FELEM                                 0
#   define EC_F_D2I_ECPARAMETERS                            0
#   define EC_F_D2I_ECPKPARAMETERS                          0
#   define EC_F_D2I_ECPRIVATEKEY                            0
#   define EC_F_DO_EC_KEY_PRINT                             0
#   define EC_F_ECDH_CMS_DECRYPT                            0
#   define EC_F_ECDH_CMS_SET_SHARED_INFO                    0
#   define EC_F_ECDH_COMPUTE_KEY                            0
#   define EC_F_ECDH_SIMPLE_COMPUTE_KEY                     0
#   define EC_F_ECDSA_DO_SIGN_EX                            0
#   define EC_F_ECDSA_DO_VERIFY                             0
#   define EC_F_ECDSA_SIGN_EX                               0
#   define EC_F_ECDSA_SIGN_SETUP                            0
#   define EC_F_ECDSA_SIG_NEW                               0
#   define EC_F_ECDSA_VERIFY                                0
#   define EC_F_ECD_ITEM_VERIFY                             0
#   define EC_F_ECKEY_PARAM2TYPE                            0
#   define EC_F_ECKEY_PARAM_DECODE                          0
#   define EC_F_ECKEY_PRIV_DECODE                           0
#   define EC_F_ECKEY_PRIV_ENCODE                           0
#   define EC_F_ECKEY_PUB_DECODE                            0
#   define EC_F_ECKEY_PUB_ENCODE                            0
#   define EC_F_ECKEY_TYPE2PARAM                            0
#   define EC_F_ECPARAMETERS_PRINT                          0
#   define EC_F_ECPARAMETERS_PRINT_FP                       0
#   define EC_F_ECPKPARAMETERS_PRINT                        0
#   define EC_F_ECPKPARAMETERS_PRINT_FP                     0
#   define EC_F_ECP_NISTZ256_GET_AFFINE                     0
#   define EC_F_ECP_NISTZ256_INV_MOD_ORD                    0
#   define EC_F_ECP_NISTZ256_MULT_PRECOMPUTE                0
#   define EC_F_ECP_NISTZ256_POINTS_MUL                     0
#   define EC_F_ECP_NISTZ256_PRE_COMP_NEW                   0
#   define EC_F_ECP_NISTZ256_WINDOWED_MUL                   0
#   define EC_F_ECX_KEY_OP                                  0
#   define EC_F_ECX_PRIV_ENCODE                             0
#   define EC_F_ECX_PUB_ENCODE                              0
#   define EC_F_EC_ASN1_GROUP2CURVE                         0
#   define EC_F_EC_ASN1_GROUP2FIELDID                       0
#   define EC_F_EC_GF2M_MONTGOMERY_POINT_MULTIPLY           0
#   define EC_F_EC_GF2M_SIMPLE_FIELD_INV                    0
#   define EC_F_EC_GF2M_SIMPLE_GROUP_CHECK_DISCRIMINANT     0
#   define EC_F_EC_GF2M_SIMPLE_GROUP_SET_CURVE              0
#   define EC_F_EC_GF2M_SIMPLE_LADDER_POST                  0
#   define EC_F_EC_GF2M_SIMPLE_LADDER_PRE                   0
#   define EC_F_EC_GF2M_SIMPLE_OCT2POINT                    0
#   define EC_F_EC_GF2M_SIMPLE_POINT2OCT                    0
#   define EC_F_EC_GF2M_SIMPLE_POINTS_MUL                   0
#   define EC_F_EC_GF2M_SIMPLE_POINT_GET_AFFINE_COORDINATES 0
#   define EC_F_EC_GF2M_SIMPLE_POINT_SET_AFFINE_COORDINATES 0
#   define EC_F_EC_GF2M_SIMPLE_SET_COMPRESSED_COORDINATES   0
#   define EC_F_EC_GFP_MONT_FIELD_DECODE                    0
#   define EC_F_EC_GFP_MONT_FIELD_ENCODE                    0
#   define EC_F_EC_GFP_MONT_FIELD_INV                       0
#   define EC_F_EC_GFP_MONT_FIELD_MUL                       0
#   define EC_F_EC_GFP_MONT_FIELD_SET_TO_ONE                0
#   define EC_F_EC_GFP_MONT_FIELD_SQR                       0
#   define EC_F_EC_GFP_MONT_GROUP_SET_CURVE                 0
#   define EC_F_EC_GFP_NISTP224_GROUP_SET_CURVE             0
#   define EC_F_EC_GFP_NISTP224_POINTS_MUL                  0
#   define EC_F_EC_GFP_NISTP224_POINT_GET_AFFINE_COORDINATES 0
#   define EC_F_EC_GFP_NISTP256_GROUP_SET_CURVE             0
#   define EC_F_EC_GFP_NISTP256_POINTS_MUL                  0
#   define EC_F_EC_GFP_NISTP256_POINT_GET_AFFINE_COORDINATES 0
#   define EC_F_EC_GFP_NISTP521_GROUP_SET_CURVE             0
#   define EC_F_EC_GFP_NISTP521_POINTS_MUL                  0
#   define EC_F_EC_GFP_NISTP521_POINT_GET_AFFINE_COORDINATES 0
#   define EC_F_EC_GFP_NIST_FIELD_MUL                       0
#   define EC_F_EC_GFP_NIST_FIELD_SQR                       0
#   define EC_F_EC_GFP_NIST_GROUP_SET_CURVE                 0
#   define EC_F_EC_GFP_SIMPLE_BLIND_COORDINATES             0
#   define EC_F_EC_GFP_SIMPLE_FIELD_INV                     0
#   define EC_F_EC_GFP_SIMPLE_GROUP_CHECK_DISCRIMINANT      0
#   define EC_F_EC_GFP_SIMPLE_GROUP_SET_CURVE               0
#   define EC_F_EC_GFP_SIMPLE_MAKE_AFFINE                   0
#   define EC_F_EC_GFP_SIMPLE_OCT2POINT                     0
#   define EC_F_EC_GFP_SIMPLE_POINT2OCT                     0
#   define EC_F_EC_GFP_SIMPLE_POINTS_MAKE_AFFINE            0
#   define EC_F_EC_GFP_SIMPLE_POINT_GET_AFFINE_COORDINATES  0
#   define EC_F_EC_GFP_SIMPLE_POINT_SET_AFFINE_COORDINATES  0
#   define EC_F_EC_GFP_SIMPLE_SET_COMPRESSED_COORDINATES    0
#   define EC_F_EC_GROUP_CHECK                              0
#   define EC_F_EC_GROUP_CHECK_DISCRIMINANT                 0
#   define EC_F_EC_GROUP_COPY                               0
#   define EC_F_EC_GROUP_GET_CURVE                          0
#   define EC_F_EC_GROUP_GET_CURVE_GF2M                     0
#   define EC_F_EC_GROUP_GET_CURVE_GFP                      0
#   define EC_F_EC_GROUP_GET_DEGREE                         0
#   define EC_F_EC_GROUP_GET_ECPARAMETERS                   0
#   define EC_F_EC_GROUP_GET_ECPKPARAMETERS                 0
#   define EC_F_EC_GROUP_GET_PENTANOMIAL_BASIS              0
#   define EC_F_EC_GROUP_GET_TRINOMIAL_BASIS                0
#   define EC_F_EC_GROUP_NEW                                0
#   define EC_F_EC_GROUP_NEW_BY_CURVE_NAME                  0
#   define EC_F_EC_GROUP_NEW_FROM_DATA                      0
#   define EC_F_EC_GROUP_NEW_FROM_ECPARAMETERS              0
#   define EC_F_EC_GROUP_NEW_FROM_ECPKPARAMETERS            0
#   define EC_F_EC_GROUP_SET_CURVE                          0
#   define EC_F_EC_GROUP_SET_CURVE_GF2M                     0
#   define EC_F_EC_GROUP_SET_CURVE_GFP                      0
#   define EC_F_EC_GROUP_SET_GENERATOR                      0
#   define EC_F_EC_GROUP_SET_SEED                           0
#   define EC_F_EC_KEY_CHECK_KEY                            0
#   define EC_F_EC_KEY_COPY                                 0
#   define EC_F_EC_KEY_GENERATE_KEY                         0
#   define EC_F_EC_KEY_NEW                                  0
#   define EC_F_EC_KEY_NEW_METHOD                           0
#   define EC_F_EC_KEY_OCT2PRIV                             0
#   define EC_F_EC_KEY_PRINT                                0
#   define EC_F_EC_KEY_PRINT_FP                             0
#   define EC_F_EC_KEY_PRIV2BUF                             0
#   define EC_F_EC_KEY_PRIV2OCT                             0
#   define EC_F_EC_KEY_SET_PUBLIC_KEY_AFFINE_COORDINATES    0
#   define EC_F_EC_KEY_SIMPLE_CHECK_KEY                     0
#   define EC_F_EC_KEY_SIMPLE_OCT2PRIV                      0
#   define EC_F_EC_KEY_SIMPLE_PRIV2OCT                      0
#   define EC_F_EC_PKEY_CHECK                               0
#   define EC_F_EC_PKEY_PARAM_CHECK                         0
#   define EC_F_EC_POINTS_MAKE_AFFINE                       0
#   define EC_F_EC_POINTS_MUL                               0
#   define EC_F_EC_POINT_ADD                                0
#   define EC_F_EC_POINT_BN2POINT                           0
#   define EC_F_EC_POINT_CMP                                0
#   define EC_F_EC_POINT_COPY                               0
#   define EC_F_EC_POINT_DBL                                0
#   define EC_F_EC_POINT_GET_AFFINE_COORDINATES             0
#   define EC_F_EC_POINT_GET_AFFINE_COORDINATES_GF2M        0
#   define EC_F_EC_POINT_GET_AFFINE_COORDINATES_GFP         0
#   define EC_F_EC_POINT_GET_JPROJECTIVE_COORDINATES_GFP    0
#   define EC_F_EC_POINT_INVERT                             0
#   define EC_F_EC_POINT_IS_AT_INFINITY                     0
#   define EC_F_EC_POINT_IS_ON_CURVE                        0
#   define EC_F_EC_POINT_MAKE_AFFINE                        0
#   define EC_F_EC_POINT_NEW                                0
#   define EC_F_EC_POINT_OCT2POINT                          0
#   define EC_F_EC_POINT_POINT2BUF                          0
#   define EC_F_EC_POINT_POINT2OCT                          0
#   define EC_F_EC_POINT_SET_AFFINE_COORDINATES             0
#   define EC_F_EC_POINT_SET_AFFINE_COORDINATES_GF2M        0
#   define EC_F_EC_POINT_SET_AFFINE_COORDINATES_GFP         0
#   define EC_F_EC_POINT_SET_COMPRESSED_COORDINATES         0
#   define EC_F_EC_POINT_SET_COMPRESSED_COORDINATES_GF2M    0
#   define EC_F_EC_POINT_SET_COMPRESSED_COORDINATES_GFP     0
#   define EC_F_EC_POINT_SET_JPROJECTIVE_COORDINATES_GFP    0
#   define EC_F_EC_POINT_SET_TO_INFINITY                    0
#   define EC_F_EC_PRE_COMP_NEW                             0
#   define EC_F_EC_SCALAR_MUL_LADDER                        0
#   define EC_F_EC_WNAF_MUL                                 0
#   define EC_F_EC_WNAF_PRECOMPUTE_MULT                     0
#   define EC_F_I2D_ECPARAMETERS                            0
#   define EC_F_I2D_ECPKPARAMETERS                          0
#   define EC_F_I2D_ECPRIVATEKEY                            0
#   define EC_F_I2O_ECPUBLICKEY                             0
#   define EC_F_NISTP224_PRE_COMP_NEW                       0
#   define EC_F_NISTP256_PRE_COMP_NEW                       0
#   define EC_F_NISTP521_PRE_COMP_NEW                       0
#   define EC_F_O2I_ECPUBLICKEY                             0
#   define EC_F_OLD_EC_PRIV_DECODE                          0
#   define EC_F_OSSL_ECDH_COMPUTE_KEY                       0
#   define EC_F_OSSL_ECDSA_SIGN_SIG                         0
#   define EC_F_OSSL_ECDSA_VERIFY_SIG                       0
#   define EC_F_PKEY_ECD_CTRL                               0
#   define EC_F_PKEY_ECD_DIGESTSIGN                         0
#   define EC_F_PKEY_ECD_DIGESTSIGN25519                    0
#   define EC_F_PKEY_ECD_DIGESTSIGN448                      0
#   define EC_F_PKEY_ECX_DERIVE                             0
#   define EC_F_PKEY_EC_CTRL                                0
#   define EC_F_PKEY_EC_CTRL_STR                            0
#   define EC_F_PKEY_EC_DERIVE                              0
#   define EC_F_PKEY_EC_INIT                                0
#   define EC_F_PKEY_EC_KDF_DERIVE                          0
#   define EC_F_PKEY_EC_KEYGEN                              0
#   define EC_F_PKEY_EC_PARAMGEN                            0
#   define EC_F_PKEY_EC_SIGN                                0
#   define EC_F_VALIDATE_ECX_DERIVE                         0
#  endif

#  ifndef OPENSSL_NO_ENGINE
/*
 * ENGINE function codes.
 */
#   define ENGINE_F_DIGEST_UPDATE                           0
#   define ENGINE_F_DYNAMIC_CTRL                            0
#   define ENGINE_F_DYNAMIC_GET_DATA_CTX                    0
#   define ENGINE_F_DYNAMIC_LOAD                            0
#   define ENGINE_F_DYNAMIC_SET_DATA_CTX                    0
#   define ENGINE_F_ENGINE_ADD                              0
#   define ENGINE_F_ENGINE_BY_ID                            0
#   define ENGINE_F_ENGINE_CMD_IS_EXECUTABLE                0
#   define ENGINE_F_ENGINE_CTRL                             0
#   define ENGINE_F_ENGINE_CTRL_CMD                         0
#   define ENGINE_F_ENGINE_CTRL_CMD_STRING                  0
#   define ENGINE_F_ENGINE_FINISH                           0
#   define ENGINE_F_ENGINE_GET_CIPHER                       0
#   define ENGINE_F_ENGINE_GET_DIGEST                       0
#   define ENGINE_F_ENGINE_GET_FIRST                        0
#   define ENGINE_F_ENGINE_GET_LAST                         0
#   define ENGINE_F_ENGINE_GET_NEXT                         0
#   define ENGINE_F_ENGINE_GET_PKEY_ASN1_METH               0
#   define ENGINE_F_ENGINE_GET_PKEY_METH                    0
#   define ENGINE_F_ENGINE_GET_PREV                         0
#   define ENGINE_F_ENGINE_INIT                             0
#   define ENGINE_F_ENGINE_LIST_ADD                         0
#   define ENGINE_F_ENGINE_LIST_REMOVE                      0
#   define ENGINE_F_ENGINE_LOAD_PRIVATE_KEY                 0
#   define ENGINE_F_ENGINE_LOAD_PUBLIC_KEY                  0
#   define ENGINE_F_ENGINE_LOAD_SSL_CLIENT_CERT             0
#   define ENGINE_F_ENGINE_NEW                              0
#   define ENGINE_F_ENGINE_PKEY_ASN1_FIND_STR               0
#   define ENGINE_F_ENGINE_REMOVE                           0
#   define ENGINE_F_ENGINE_SET_DEFAULT_STRING               0
#   define ENGINE_F_ENGINE_SET_ID                           0
#   define ENGINE_F_ENGINE_SET_NAME                         0
#   define ENGINE_F_ENGINE_TABLE_REGISTER                   0
#   define ENGINE_F_ENGINE_UNLOCKED_FINISH                  0
#   define ENGINE_F_ENGINE_UP_REF                           0
#   define ENGINE_F_INT_CLEANUP_ITEM                        0
#   define ENGINE_F_INT_CTRL_HELPER                         0
#   define ENGINE_F_INT_ENGINE_CONFIGURE                    0
#   define ENGINE_F_INT_ENGINE_MODULE_INIT                  0
#   define ENGINE_F_OSSL_HMAC_INIT                          0
#  endif

/*
 * EVP function codes.
 */
#  define EVP_F_AESNI_INIT_KEY                             0
#  define EVP_F_AESNI_XTS_INIT_KEY                         0
#  define EVP_F_AES_GCM_CTRL                               0
#  define EVP_F_AES_INIT_KEY                               0
#  define EVP_F_AES_OCB_CIPHER                             0
#  define EVP_F_AES_T4_INIT_KEY                            0
#  define EVP_F_AES_T4_XTS_INIT_KEY                        0
#  define EVP_F_AES_WRAP_CIPHER                            0
#  define EVP_F_AES_XTS_INIT_KEY                           0
#  define EVP_F_ALG_MODULE_INIT                            0
#  define EVP_F_ARIA_CCM_INIT_KEY                          0
#  define EVP_F_ARIA_GCM_CTRL                              0
#  define EVP_F_ARIA_GCM_INIT_KEY                          0
#  define EVP_F_ARIA_INIT_KEY                              0
#  define EVP_F_B64_NEW                                    0
#  define EVP_F_CAMELLIA_INIT_KEY                          0
#  define EVP_F_CHACHA20_POLY1305_CTRL                     0
#  define EVP_F_CMLL_T4_INIT_KEY                           0
#  define EVP_F_DES_EDE3_WRAP_CIPHER                       0
#  define EVP_F_DO_SIGVER_INIT                             0
#  define EVP_F_ENC_NEW                                    0
#  define EVP_F_EVP_CIPHERINIT_EX                          0
#  define EVP_F_EVP_CIPHER_ASN1_TO_PARAM                   0
#  define EVP_F_EVP_CIPHER_CTX_COPY                        0
#  define EVP_F_EVP_CIPHER_CTX_CTRL                        0
#  define EVP_F_EVP_CIPHER_CTX_SET_KEY_LENGTH              0
#  define EVP_F_EVP_CIPHER_PARAM_TO_ASN1                   0
#  define EVP_F_EVP_DECRYPTFINAL_EX                        0
#  define EVP_F_EVP_DECRYPTUPDATE                          0
#  define EVP_F_EVP_DIGESTFINALXOF                         0
#  define EVP_F_EVP_DIGESTINIT_EX                          0
#  define EVP_F_EVP_ENCRYPTDECRYPTUPDATE                   0
#  define EVP_F_EVP_ENCRYPTFINAL_EX                        0
#  define EVP_F_EVP_ENCRYPTUPDATE                          0
#  define EVP_F_EVP_MD_CTX_COPY_EX                         0
#  define EVP_F_EVP_MD_SIZE                                0
#  define EVP_F_EVP_OPENINIT                               0
#  define EVP_F_EVP_PBE_ALG_ADD                            0
#  define EVP_F_EVP_PBE_ALG_ADD_TYPE                       0
#  define EVP_F_EVP_PBE_CIPHERINIT                         0
#  define EVP_F_EVP_PBE_SCRYPT                             0
#  define EVP_F_EVP_PKCS82PKEY                             0
#  define EVP_F_EVP_PKEY2PKCS8                             0
#  define EVP_F_EVP_PKEY_ASN1_ADD0                         0
#  define EVP_F_EVP_PKEY_CHECK                             0
#  define EVP_F_EVP_PKEY_COPY_PARAMETERS                   0
#  define EVP_F_EVP_PKEY_CTX_CTRL                          0
#  define EVP_F_EVP_PKEY_CTX_CTRL_STR                      0
#  define EVP_F_EVP_PKEY_CTX_DUP                           0
#  define EVP_F_EVP_PKEY_CTX_MD                            0
#  define EVP_F_EVP_PKEY_DECRYPT                           0
#  define EVP_F_EVP_PKEY_DECRYPT_INIT                      0
#  define EVP_F_EVP_PKEY_DECRYPT_OLD                       0
#  define EVP_F_EVP_PKEY_DERIVE                            0
#  define EVP_F_EVP_PKEY_DERIVE_INIT                       0
#  define EVP_F_EVP_PKEY_DERIVE_SET_PEER                   0
#  define EVP_F_EVP_PKEY_ENCRYPT                           0
#  define EVP_F_EVP_PKEY_ENCRYPT_INIT                      0
#  define EVP_F_EVP_PKEY_ENCRYPT_OLD                       0
#  define EVP_F_EVP_PKEY_GET0_DH                           0
#  define EVP_F_EVP_PKEY_GET0_DSA                          0
#  define EVP_F_EVP_PKEY_GET0_EC_KEY                       0
#  define EVP_F_EVP_PKEY_GET0_HMAC                         0
#  define EVP_F_EVP_PKEY_GET0_POLY1305                     0
#  define EVP_F_EVP_PKEY_GET0_RSA                          0
#  define EVP_F_EVP_PKEY_GET0_SIPHASH                      0
#  define EVP_F_EVP_PKEY_GET_RAW_PRIVATE_KEY               0
#  define EVP_F_EVP_PKEY_GET_RAW_PUBLIC_KEY                0
#  define EVP_F_EVP_PKEY_KEYGEN                            0
#  define EVP_F_EVP_PKEY_KEYGEN_INIT                       0
#  define EVP_F_EVP_PKEY_METH_ADD0                         0
#  define EVP_F_EVP_PKEY_METH_NEW                          0
#  define EVP_F_EVP_PKEY_NEW                               0
#  define EVP_F_EVP_PKEY_NEW_CMAC_KEY                      0
#  define EVP_F_EVP_PKEY_NEW_RAW_PRIVATE_KEY               0
#  define EVP_F_EVP_PKEY_NEW_RAW_PUBLIC_KEY                0
#  define EVP_F_EVP_PKEY_PARAMGEN                          0
#  define EVP_F_EVP_PKEY_PARAMGEN_INIT                     0
#  define EVP_F_EVP_PKEY_PARAM_CHECK                       0
#  define EVP_F_EVP_PKEY_PUBLIC_CHECK                      0
#  define EVP_F_EVP_PKEY_SET1_ENGINE                       0
#  define EVP_F_EVP_PKEY_SET_ALIAS_TYPE                    0
#  define EVP_F_EVP_PKEY_SIGN                              0
#  define EVP_F_EVP_PKEY_SIGN_INIT                         0
#  define EVP_F_EVP_PKEY_VERIFY                            0
#  define EVP_F_EVP_PKEY_VERIFY_INIT                       0
#  define EVP_F_EVP_PKEY_VERIFY_RECOVER                    0
#  define EVP_F_EVP_PKEY_VERIFY_RECOVER_INIT               0
#  define EVP_F_EVP_SIGNFINAL                              0
#  define EVP_F_EVP_VERIFYFINAL                            0
#  define EVP_F_INT_CTX_NEW                                0
#  define EVP_F_OK_NEW                                     0
#  define EVP_F_PKCS5_PBE_KEYIVGEN                         0
#  define EVP_F_PKCS5_V2_PBE_KEYIVGEN                      0
#  define EVP_F_PKCS5_V2_PBKDF2_KEYIVGEN                   0
#  define EVP_F_PKCS5_V2_SCRYPT_KEYIVGEN                   0
#  define EVP_F_PKEY_SET_TYPE                              0
#  define EVP_F_RC2_MAGIC_TO_METH                          0
#  define EVP_F_RC5_CTRL                                   0
#  define EVP_F_R_32_12_16_INIT_KEY                        0
#  define EVP_F_S390X_AES_GCM_CTRL                         0
#  define EVP_F_UPDATE                                     0

/*
 * KDF function codes.
 */
#  define KDF_F_PKEY_HKDF_CTRL_STR                         0
#  define KDF_F_PKEY_HKDF_DERIVE                           0
#  define KDF_F_PKEY_HKDF_INIT                             0
#  define KDF_F_PKEY_SCRYPT_CTRL_STR                       0
#  define KDF_F_PKEY_SCRYPT_CTRL_UINT64                    0
#  define KDF_F_PKEY_SCRYPT_DERIVE                         0
#  define KDF_F_PKEY_SCRYPT_INIT                           0
#  define KDF_F_PKEY_SCRYPT_SET_MEMBUF                     0
#  define KDF_F_PKEY_TLS1_PRF_CTRL_STR                     0
#  define KDF_F_PKEY_TLS1_PRF_DERIVE                       0
#  define KDF_F_PKEY_TLS1_PRF_INIT                         0
#  define KDF_F_TLS1_PRF_ALG                               0

/*
 * KDF reason codes.
 */
#  define KDF_R_INVALID_DIGEST                             0
#  define KDF_R_MISSING_ITERATION_COUNT                    0
#  define KDF_R_MISSING_KEY                                0
#  define KDF_R_MISSING_MESSAGE_DIGEST                     0
#  define KDF_R_MISSING_PARAMETER                          0
#  define KDF_R_MISSING_PASS                               0
#  define KDF_R_MISSING_SALT                               0
#  define KDF_R_MISSING_SECRET                             0
#  define KDF_R_MISSING_SEED                               0
#  define KDF_R_UNKNOWN_PARAMETER_TYPE                     0
#  define KDF_R_VALUE_ERROR                                0
#  define KDF_R_VALUE_MISSING                              0

/*
 * OBJ function codes.
 */
#  define OBJ_F_OBJ_ADD_OBJECT                             0
#  define OBJ_F_OBJ_ADD_SIGID                              0
#  define OBJ_F_OBJ_CREATE                                 0
#  define OBJ_F_OBJ_DUP                                    0
#  define OBJ_F_OBJ_NAME_NEW_INDEX                         0
#  define OBJ_F_OBJ_NID2LN                                 0
#  define OBJ_F_OBJ_NID2OBJ                                0
#  define OBJ_F_OBJ_NID2SN                                 0
#  define OBJ_F_OBJ_TXT2OBJ                                0

#  ifndef OPENSSL_NO_OCSP
/*
 * OCSP function codes.
 */
#   define OCSP_F_D2I_OCSP_NONCE                            0
#   define OCSP_F_OCSP_BASIC_ADD1_STATUS                    0
#   define OCSP_F_OCSP_BASIC_SIGN                           0
#   define OCSP_F_OCSP_BASIC_SIGN_CTX                       0
#   define OCSP_F_OCSP_BASIC_VERIFY                         0
#   define OCSP_F_OCSP_CERT_ID_NEW                          0
#   define OCSP_F_OCSP_CHECK_DELEGATED                      0
#   define OCSP_F_OCSP_CHECK_IDS                            0
#   define OCSP_F_OCSP_CHECK_ISSUER                         0
#   define OCSP_F_OCSP_CHECK_VALIDITY                       0
#   define OCSP_F_OCSP_MATCH_ISSUERID                       0
#   define OCSP_F_OCSP_PARSE_URL                            0
#   define OCSP_F_OCSP_REQUEST_SIGN                         0
#   define OCSP_F_OCSP_REQUEST_VERIFY                       0
#   define OCSP_F_OCSP_RESPONSE_GET1_BASIC                  0
#   define OCSP_F_PARSE_HTTP_LINE1                          0
#  endif

/*
 * PEM function codes.
 */
#  define PEM_F_B2I_DSS                                    0
#  define PEM_F_B2I_PVK_BIO                                0
#  define PEM_F_B2I_RSA                                    0
#  define PEM_F_CHECK_BITLEN_DSA                           0
#  define PEM_F_CHECK_BITLEN_RSA                           0
#  define PEM_F_D2I_PKCS8PRIVATEKEY_BIO                    0
#  define PEM_F_D2I_PKCS8PRIVATEKEY_FP                     0
#  define PEM_F_DO_B2I                                     0
#  define PEM_F_DO_B2I_BIO                                 0
#  define PEM_F_DO_BLOB_HEADER                             0
#  define PEM_F_DO_I2B                                     0
#  define PEM_F_DO_PK8PKEY                                 0
#  define PEM_F_DO_PK8PKEY_FP                              0
#  define PEM_F_DO_PVK_BODY                                0
#  define PEM_F_DO_PVK_HEADER                              0
#  define PEM_F_GET_HEADER_AND_DATA                        0
#  define PEM_F_GET_NAME                                   0
#  define PEM_F_I2B_PVK                                    0
#  define PEM_F_I2B_PVK_BIO                                0
#  define PEM_F_LOAD_IV                                    0
#  define PEM_F_PEM_ASN1_READ                              0
#  define PEM_F_PEM_ASN1_READ_BIO                          0
#  define PEM_F_PEM_ASN1_WRITE                             0
#  define PEM_F_PEM_ASN1_WRITE_BIO                         0
#  define PEM_F_PEM_DEF_CALLBACK                           0
#  define PEM_F_PEM_DO_HEADER                              0
#  define PEM_F_PEM_GET_EVP_CIPHER_INFO                    0
#  define PEM_F_PEM_READ                                   0
#  define PEM_F_PEM_READ_BIO                               0
#  define PEM_F_PEM_READ_BIO_DHPARAMS                      0
#  define PEM_F_PEM_READ_BIO_EX                            0
#  define PEM_F_PEM_READ_BIO_PARAMETERS                    0
#  define PEM_F_PEM_READ_BIO_PRIVATEKEY                    0
#  define PEM_F_PEM_READ_DHPARAMS                          0
#  define PEM_F_PEM_READ_PRIVATEKEY                        0
#  define PEM_F_PEM_SIGNFINAL                              0
#  define PEM_F_PEM_WRITE                                  0
#  define PEM_F_PEM_WRITE_BIO                              0
#  define PEM_F_PEM_WRITE_BIO_PRIVATEKEY_TRADITIONAL       0
#  define PEM_F_PEM_WRITE_PRIVATEKEY                       0
#  define PEM_F_PEM_X509_INFO_READ                         0
#  define PEM_F_PEM_X509_INFO_READ_BIO                     0
#  define PEM_F_PEM_X509_INFO_WRITE_BIO                    0

/*
 * PKCS12 function codes.
 */
#  define PKCS12_F_OPENSSL_ASC2UNI                         0
#  define PKCS12_F_OPENSSL_UNI2ASC                         0
#  define PKCS12_F_OPENSSL_UNI2UTF8                        0
#  define PKCS12_F_OPENSSL_UTF82UNI                        0
#  define PKCS12_F_PKCS12_CREATE                           0
#  define PKCS12_F_PKCS12_GEN_MAC                          0
#  define PKCS12_F_PKCS12_INIT                             0
#  define PKCS12_F_PKCS12_ITEM_DECRYPT_D2I                 0
#  define PKCS12_F_PKCS12_ITEM_I2D_ENCRYPT                 0
#  define PKCS12_F_PKCS12_ITEM_PACK_SAFEBAG                0
#  define PKCS12_F_PKCS12_KEY_GEN_ASC                      0
#  define PKCS12_F_PKCS12_KEY_GEN_UNI                      0
#  define PKCS12_F_PKCS12_KEY_GEN_UTF8                     0
#  define PKCS12_F_PKCS12_NEWPASS                          0
#  define PKCS12_F_PKCS12_PACK_P7DATA                      0
#  define PKCS12_F_PKCS12_PACK_P7ENCDATA                   0
#  define PKCS12_F_PKCS12_PARSE                            0
#  define PKCS12_F_PKCS12_PBE_CRYPT                        0
#  define PKCS12_F_PKCS12_PBE_KEYIVGEN                     0
#  define PKCS12_F_PKCS12_SAFEBAG_CREATE0_P8INF            0
#  define PKCS12_F_PKCS12_SAFEBAG_CREATE0_PKCS8            0
#  define PKCS12_F_PKCS12_SAFEBAG_CREATE_PKCS8_ENCRYPT     0
#  define PKCS12_F_PKCS12_SETUP_MAC                        0
#  define PKCS12_F_PKCS12_SET_MAC                          0
#  define PKCS12_F_PKCS12_UNPACK_AUTHSAFES                 0
#  define PKCS12_F_PKCS12_UNPACK_P7DATA                    0
#  define PKCS12_F_PKCS12_VERIFY_MAC                       0
#  define PKCS12_F_PKCS8_ENCRYPT                           0
#  define PKCS12_F_PKCS8_SET0_PBE                          0

/*
 * PKCS7 function codes.
 */
#  define PKCS7_F_DO_PKCS7_SIGNED_ATTRIB                   0
#  define PKCS7_F_PKCS7_ADD0_ATTRIB_SIGNING_TIME           0
#  define PKCS7_F_PKCS7_ADD_ATTRIB_SMIMECAP                0
#  define PKCS7_F_PKCS7_ADD_CERTIFICATE                    0
#  define PKCS7_F_PKCS7_ADD_CRL                            0
#  define PKCS7_F_PKCS7_ADD_RECIPIENT_INFO                 0
#  define PKCS7_F_PKCS7_ADD_SIGNATURE                      0
#  define PKCS7_F_PKCS7_ADD_SIGNER                         0
#  define PKCS7_F_PKCS7_BIO_ADD_DIGEST                     0
#  define PKCS7_F_PKCS7_COPY_EXISTING_DIGEST               0
#  define PKCS7_F_PKCS7_CTRL                               0
#  define PKCS7_F_PKCS7_DATADECODE                         0
#  define PKCS7_F_PKCS7_DATAFINAL                          0
#  define PKCS7_F_PKCS7_DATAINIT                           0
#  define PKCS7_F_PKCS7_DATAVERIFY                         0
#  define PKCS7_F_PKCS7_DECRYPT                            0
#  define PKCS7_F_PKCS7_DECRYPT_RINFO                      0
#  define PKCS7_F_PKCS7_ENCODE_RINFO                       0
#  define PKCS7_F_PKCS7_ENCRYPT                            0
#  define PKCS7_F_PKCS7_FINAL                              0
#  define PKCS7_F_PKCS7_FIND_DIGEST                        0
#  define PKCS7_F_PKCS7_GET0_SIGNERS                       0
#  define PKCS7_F_PKCS7_RECIP_INFO_SET                     0
#  define PKCS7_F_PKCS7_SET_CIPHER                         0
#  define PKCS7_F_PKCS7_SET_CONTENT                        0
#  define PKCS7_F_PKCS7_SET_DIGEST                         0
#  define PKCS7_F_PKCS7_SET_TYPE                           0
#  define PKCS7_F_PKCS7_SIGN                               0
#  define PKCS7_F_PKCS7_SIGNATUREVERIFY                    0
#  define PKCS7_F_PKCS7_SIGNER_INFO_SET                    0
#  define PKCS7_F_PKCS7_SIGNER_INFO_SIGN                   0
#  define PKCS7_F_PKCS7_SIGN_ADD_SIGNER                    0
#  define PKCS7_F_PKCS7_SIMPLE_SMIMECAP                    0
#  define PKCS7_F_PKCS7_VERIFY                             0

/*
 * RAND function codes.
 */
#  define RAND_F_DATA_COLLECT_METHOD                       0
#  define RAND_F_DRBG_BYTES                                0
#  define RAND_F_DRBG_GET_ENTROPY                          0
#  define RAND_F_DRBG_SETUP                                0
#  define RAND_F_GET_ENTROPY                               0
#  define RAND_F_RAND_BYTES                                0
#  define RAND_F_RAND_DRBG_ENABLE_LOCKING                  0
#  define RAND_F_RAND_DRBG_GENERATE                        0
#  define RAND_F_RAND_DRBG_GET_ENTROPY                     0
#  define RAND_F_RAND_DRBG_GET_NONCE                       0
#  define RAND_F_RAND_DRBG_INSTANTIATE                     0
#  define RAND_F_RAND_DRBG_NEW                             0
#  define RAND_F_RAND_DRBG_RESEED                          0
#  define RAND_F_RAND_DRBG_RESTART                         0
#  define RAND_F_RAND_DRBG_SET                             0
#  define RAND_F_RAND_DRBG_SET_DEFAULTS                    0
#  define RAND_F_RAND_DRBG_UNINSTANTIATE                   0
#  define RAND_F_RAND_LOAD_FILE                            0
#  define RAND_F_RAND_POOL_ACQUIRE_ENTROPY                 0
#  define RAND_F_RAND_POOL_ADD                             0
#  define RAND_F_RAND_POOL_ADD_BEGIN                       0
#  define RAND_F_RAND_POOL_ADD_END                         0
#  define RAND_F_RAND_POOL_ATTACH                          0
#  define RAND_F_RAND_POOL_BYTES_NEEDED                    0
#  define RAND_F_RAND_POOL_GROW                            0
#  define RAND_F_RAND_POOL_NEW                             0
#  define RAND_F_RAND_PSEUDO_BYTES                         0
#  define RAND_F_RAND_WRITE_FILE                           0

/*
 * RSA function codes.
 */
#  define RSA_F_CHECK_PADDING_MD                           0
#  define RSA_F_ENCODE_PKCS1                               0
#  define RSA_F_INT_RSA_VERIFY                             0
#  define RSA_F_OLD_RSA_PRIV_DECODE                        0
#  define RSA_F_PKEY_PSS_INIT                              0
#  define RSA_F_PKEY_RSA_CTRL                              0
#  define RSA_F_PKEY_RSA_CTRL_STR                          0
#  define RSA_F_PKEY_RSA_SIGN                              0
#  define RSA_F_PKEY_RSA_VERIFY                            0
#  define RSA_F_PKEY_RSA_VERIFYRECOVER                     0
#  define RSA_F_RSA_ALGOR_TO_MD                            0
#  define RSA_F_RSA_BUILTIN_KEYGEN                         0
#  define RSA_F_RSA_CHECK_KEY                              0
#  define RSA_F_RSA_CHECK_KEY_EX                           0
#  define RSA_F_RSA_CMS_DECRYPT                            0
#  define RSA_F_RSA_CMS_VERIFY                             0
#  define RSA_F_RSA_ITEM_VERIFY                            0
#  define RSA_F_RSA_METH_DUP                               0
#  define RSA_F_RSA_METH_NEW                               0
#  define RSA_F_RSA_METH_SET1_NAME                         0
#  define RSA_F_RSA_MGF1_TO_MD                             0
#  define RSA_F_RSA_MULTIP_INFO_NEW                        0
#  define RSA_F_RSA_NEW_METHOD                             0
#  define RSA_F_RSA_NULL                                   0
#  define RSA_F_RSA_NULL_PRIVATE_DECRYPT                   0
#  define RSA_F_RSA_NULL_PRIVATE_ENCRYPT                   0
#  define RSA_F_RSA_NULL_PUBLIC_DECRYPT                    0
#  define RSA_F_RSA_NULL_PUBLIC_ENCRYPT                    0
#  define RSA_F_RSA_OSSL_PRIVATE_DECRYPT                   0
#  define RSA_F_RSA_OSSL_PRIVATE_ENCRYPT                   0
#  define RSA_F_RSA_OSSL_PUBLIC_DECRYPT                    0
#  define RSA_F_RSA_OSSL_PUBLIC_ENCRYPT                    0
#  define RSA_F_RSA_PADDING_ADD_NONE                       0
#  define RSA_F_RSA_PADDING_ADD_PKCS1_OAEP                 0
#  define RSA_F_RSA_PADDING_ADD_PKCS1_OAEP_MGF1            0
#  define RSA_F_RSA_PADDING_ADD_PKCS1_PSS                  0
#  define RSA_F_RSA_PADDING_ADD_PKCS1_PSS_MGF1             0
#  define RSA_F_RSA_PADDING_ADD_PKCS1_TYPE_1               0
#  define RSA_F_RSA_PADDING_ADD_PKCS1_TYPE_2               0
#  define RSA_F_RSA_PADDING_ADD_SSLV23                     0
#  define RSA_F_RSA_PADDING_ADD_X931                       0
#  define RSA_F_RSA_PADDING_CHECK_NONE                     0
#  define RSA_F_RSA_PADDING_CHECK_PKCS1_OAEP               0
#  define RSA_F_RSA_PADDING_CHECK_PKCS1_OAEP_MGF1          0
#  define RSA_F_RSA_PADDING_CHECK_PKCS1_TYPE_1             0
#  define RSA_F_RSA_PADDING_CHECK_PKCS1_TYPE_2             0
#  define RSA_F_RSA_PADDING_CHECK_SSLV23                   0
#  define RSA_F_RSA_PADDING_CHECK_X931                     0
#  define RSA_F_RSA_PARAM_DECODE                           0
#  define RSA_F_RSA_PRINT                                  0
#  define RSA_F_RSA_PRINT_FP                               0
#  define RSA_F_RSA_PRIV_DECODE                            0
#  define RSA_F_RSA_PRIV_ENCODE                            0
#  define RSA_F_RSA_PSS_GET_PARAM                          0
#  define RSA_F_RSA_PSS_TO_CTX                             0
#  define RSA_F_RSA_PUB_DECODE                             0
#  define RSA_F_RSA_SETUP_BLINDING                         0
#  define RSA_F_RSA_SIGN                                   0
#  define RSA_F_RSA_SIGN_ASN1_OCTET_STRING                 0
#  define RSA_F_RSA_VERIFY                                 0
#  define RSA_F_RSA_VERIFY_ASN1_OCTET_STRING               0
#  define RSA_F_RSA_VERIFY_PKCS1_PSS_MGF1                  0
#  define RSA_F_SETUP_TBUF                                 0

/*
 * OSSL_STORE function codes.
 */
#  define OSSL_STORE_F_FILE_CTRL                           0
#  define OSSL_STORE_F_FILE_FIND                           0
#  define OSSL_STORE_F_FILE_GET_PASS                       0
#  define OSSL_STORE_F_FILE_LOAD                           0
#  define OSSL_STORE_F_FILE_LOAD_TRY_DECODE                0
#  define OSSL_STORE_F_FILE_NAME_TO_URI                    0
#  define OSSL_STORE_F_FILE_OPEN                           0
#  define OSSL_STORE_F_OSSL_STORE_ATTACH_PEM_BIO           0
#  define OSSL_STORE_F_OSSL_STORE_EXPECT                   0
#  define OSSL_STORE_F_OSSL_STORE_FILE_ATTACH_PEM_BIO_INT  0
#  define OSSL_STORE_F_OSSL_STORE_FIND                     0
#  define OSSL_STORE_F_OSSL_STORE_GET0_LOADER_INT          0
#  define OSSL_STORE_F_OSSL_STORE_INFO_GET1_CERT           0
#  define OSSL_STORE_F_OSSL_STORE_INFO_GET1_CRL            0
#  define OSSL_STORE_F_OSSL_STORE_INFO_GET1_NAME           0
#  define OSSL_STORE_F_OSSL_STORE_INFO_GET1_NAME_DESCRIPTION 0
#  define OSSL_STORE_F_OSSL_STORE_INFO_GET1_PARAMS         0
#  define OSSL_STORE_F_OSSL_STORE_INFO_GET1_PKEY           0
#  define OSSL_STORE_F_OSSL_STORE_INFO_NEW_CERT            0
#  define OSSL_STORE_F_OSSL_STORE_INFO_NEW_CRL             0
#  define OSSL_STORE_F_OSSL_STORE_INFO_NEW_EMBEDDED        0
#  define OSSL_STORE_F_OSSL_STORE_INFO_NEW_NAME            0
#  define OSSL_STORE_F_OSSL_STORE_INFO_NEW_PARAMS          0
#  define OSSL_STORE_F_OSSL_STORE_INFO_NEW_PKEY            0
#  define OSSL_STORE_F_OSSL_STORE_INFO_SET0_NAME_DESCRIPTION 0
#  define OSSL_STORE_F_OSSL_STORE_INIT_ONCE                0
#  define OSSL_STORE_F_OSSL_STORE_LOADER_NEW               0
#  define OSSL_STORE_F_OSSL_STORE_OPEN                     0
#  define OSSL_STORE_F_OSSL_STORE_OPEN_INT                 0
#  define OSSL_STORE_F_OSSL_STORE_REGISTER_LOADER_INT      0
#  define OSSL_STORE_F_OSSL_STORE_SEARCH_BY_ALIAS          0
#  define OSSL_STORE_F_OSSL_STORE_SEARCH_BY_ISSUER_SERIAL  0
#  define OSSL_STORE_F_OSSL_STORE_SEARCH_BY_KEY_FINGERPRINT 0
#  define OSSL_STORE_F_OSSL_STORE_SEARCH_BY_NAME           0
#  define OSSL_STORE_F_OSSL_STORE_UNREGISTER_LOADER_INT    0
#  define OSSL_STORE_F_TRY_DECODE_PARAMS                   0
#  define OSSL_STORE_F_TRY_DECODE_PKCS12                   0
#  define OSSL_STORE_F_TRY_DECODE_PKCS8ENCRYPTED           0

#  ifndef OPENSSL_NO_TS
/*
 * TS function codes.
 */
#   define TS_F_DEF_SERIAL_CB                               0
#   define TS_F_DEF_TIME_CB                                 0
#   define TS_F_ESS_ADD_SIGNING_CERT                        0
#   define TS_F_ESS_ADD_SIGNING_CERT_V2                     0
#   define TS_F_ESS_CERT_ID_NEW_INIT                        0
#   define TS_F_ESS_CERT_ID_V2_NEW_INIT                     0
#   define TS_F_ESS_SIGNING_CERT_NEW_INIT                   0
#   define TS_F_ESS_SIGNING_CERT_V2_NEW_INIT                0
#   define TS_F_INT_TS_RESP_VERIFY_TOKEN                    0
#   define TS_F_PKCS7_TO_TS_TST_INFO                        0
#   define TS_F_TS_ACCURACY_SET_MICROS                      0
#   define TS_F_TS_ACCURACY_SET_MILLIS                      0
#   define TS_F_TS_ACCURACY_SET_SECONDS                     0
#   define TS_F_TS_CHECK_IMPRINTS                           0
#   define TS_F_TS_CHECK_NONCES                             0
#   define TS_F_TS_CHECK_POLICY                             0
#   define TS_F_TS_CHECK_SIGNING_CERTS                      0
#   define TS_F_TS_CHECK_STATUS_INFO                        0
#   define TS_F_TS_COMPUTE_IMPRINT                          0
#   define TS_F_TS_CONF_INVALID                             0
#   define TS_F_TS_CONF_LOAD_CERT                           0
#   define TS_F_TS_CONF_LOAD_CERTS                          0
#   define TS_F_TS_CONF_LOAD_KEY                            0
#   define TS_F_TS_CONF_LOOKUP_FAIL                         0
#   define TS_F_TS_CONF_SET_DEFAULT_ENGINE                  0
#   define TS_F_TS_GET_STATUS_TEXT                          0
#   define TS_F_TS_MSG_IMPRINT_SET_ALGO                     0
#   define TS_F_TS_REQ_SET_MSG_IMPRINT                      0
#   define TS_F_TS_REQ_SET_NONCE                            0
#   define TS_F_TS_REQ_SET_POLICY_ID                        0
#   define TS_F_TS_RESP_CREATE_RESPONSE                     0
#   define TS_F_TS_RESP_CREATE_TST_INFO                     0
#   define TS_F_TS_RESP_CTX_ADD_FAILURE_INFO                0
#   define TS_F_TS_RESP_CTX_ADD_MD                          0
#   define TS_F_TS_RESP_CTX_ADD_POLICY                      0
#   define TS_F_TS_RESP_CTX_NEW                             0
#   define TS_F_TS_RESP_CTX_SET_ACCURACY                    0
#   define TS_F_TS_RESP_CTX_SET_CERTS                       0
#   define TS_F_TS_RESP_CTX_SET_DEF_POLICY                  0
#   define TS_F_TS_RESP_CTX_SET_SIGNER_CERT                 0
#   define TS_F_TS_RESP_CTX_SET_STATUS_INFO                 0
#   define TS_F_TS_RESP_GET_POLICY                          0
#   define TS_F_TS_RESP_SET_GENTIME_WITH_PRECISION          0
#   define TS_F_TS_RESP_SET_STATUS_INFO                     0
#   define TS_F_TS_RESP_SET_TST_INFO                        0
#   define TS_F_TS_RESP_SIGN                                0
#   define TS_F_TS_RESP_VERIFY_SIGNATURE                    0
#   define TS_F_TS_TST_INFO_SET_ACCURACY                    0
#   define TS_F_TS_TST_INFO_SET_MSG_IMPRINT                 0
#   define TS_F_TS_TST_INFO_SET_NONCE                       0
#   define TS_F_TS_TST_INFO_SET_POLICY_ID                   0
#   define TS_F_TS_TST_INFO_SET_SERIAL                      0
#   define TS_F_TS_TST_INFO_SET_TIME                        0
#   define TS_F_TS_TST_INFO_SET_TSA                         0
#   define TS_F_TS_VERIFY                                   0
#   define TS_F_TS_VERIFY_CERT                              0
#   define TS_F_TS_VERIFY_CTX_NEW                           0
#  endif

/*
 * UI function codes.
 */
#  define UI_F_CLOSE_CONSOLE                               0
#  define UI_F_ECHO_CONSOLE                                0
#  define UI_F_GENERAL_ALLOCATE_BOOLEAN                    0
#  define UI_F_GENERAL_ALLOCATE_PROMPT                     0
#  define UI_F_NOECHO_CONSOLE                              0
#  define UI_F_OPEN_CONSOLE                                0
#  define UI_F_UI_CONSTRUCT_PROMPT                         0
#  define UI_F_UI_CREATE_METHOD                            0
#  define UI_F_UI_CTRL                                     0
#  define UI_F_UI_DUP_ERROR_STRING                         0
#  define UI_F_UI_DUP_INFO_STRING                          0
#  define UI_F_UI_DUP_INPUT_BOOLEAN                        0
#  define UI_F_UI_DUP_INPUT_STRING                         0
#  define UI_F_UI_DUP_USER_DATA                            0
#  define UI_F_UI_DUP_VERIFY_STRING                        0
#  define UI_F_UI_GET0_RESULT                              0
#  define UI_F_UI_GET_RESULT_LENGTH                        0
#  define UI_F_UI_NEW_METHOD                               0
#  define UI_F_UI_PROCESS                                  0
#  define UI_F_UI_SET_RESULT                               0
#  define UI_F_UI_SET_RESULT_EX                            0

/*
 * X509 function codes.
 */
#  define X509_F_ADD_CERT_DIR                              0
#  define X509_F_BUILD_CHAIN                               0
#  define X509_F_BY_FILE_CTRL                              0
#  define X509_F_CHECK_NAME_CONSTRAINTS                    0
#  define X509_F_CHECK_POLICY                              0
#  define X509_F_DANE_I2D                                  0
#  define X509_F_DIR_CTRL                                  0
#  define X509_F_GET_CERT_BY_SUBJECT                       0
#  define X509_F_I2D_X509_AUX                              0
#  define X509_F_LOOKUP_CERTS_SK                           0
#  define X509_F_NETSCAPE_SPKI_B64_DECODE                  0
#  define X509_F_NETSCAPE_SPKI_B64_ENCODE                  0
#  define X509_F_NEW_DIR                                   0
#  define X509_F_X509AT_ADD1_ATTR                          0
#  define X509_F_X509V3_ADD_EXT                            0
#  define X509_F_X509_ATTRIBUTE_CREATE_BY_NID              0
#  define X509_F_X509_ATTRIBUTE_CREATE_BY_OBJ              0
#  define X509_F_X509_ATTRIBUTE_CREATE_BY_TXT              0
#  define X509_F_X509_ATTRIBUTE_GET0_DATA                  0
#  define X509_F_X509_ATTRIBUTE_SET1_DATA                  0
#  define X509_F_X509_CHECK_PRIVATE_KEY                    0
#  define X509_F_X509_CRL_DIFF                             0
#  define X509_F_X509_CRL_METHOD_NEW                       0
#  define X509_F_X509_CRL_PRINT_FP                         0
#  define X509_F_X509_EXTENSION_CREATE_BY_NID              0
#  define X509_F_X509_EXTENSION_CREATE_BY_OBJ              0
#  define X509_F_X509_GET_PUBKEY_PARAMETERS                0
#  define X509_F_X509_LOAD_CERT_CRL_FILE                   0
#  define X509_F_X509_LOAD_CERT_FILE                       0
#  define X509_F_X509_LOAD_CRL_FILE                        0
#  define X509_F_X509_LOOKUP_METH_NEW                      0
#  define X509_F_X509_LOOKUP_NEW                           0
#  define X509_F_X509_NAME_ADD_ENTRY                       0
#  define X509_F_X509_NAME_CANON                           0
#  define X509_F_X509_NAME_ENTRY_CREATE_BY_NID             0
#  define X509_F_X509_NAME_ENTRY_CREATE_BY_TXT             0
#  define X509_F_X509_NAME_ENTRY_SET_OBJECT                0
#  define X509_F_X509_NAME_ONELINE                         0
#  define X509_F_X509_NAME_PRINT                           0
#  define X509_F_X509_OBJECT_NEW                           0
#  define X509_F_X509_PRINT_EX_FP                          0
#  define X509_F_X509_PUBKEY_DECODE                        0
#  define X509_F_X509_PUBKEY_GET                           0
#  define X509_F_X509_PUBKEY_GET0                          0
#  define X509_F_X509_PUBKEY_SET                           0
#  define X509_F_X509_REQ_CHECK_PRIVATE_KEY                0
#  define X509_F_X509_REQ_PRINT_EX                         0
#  define X509_F_X509_REQ_PRINT_FP                         0
#  define X509_F_X509_REQ_TO_X509                          0
#  define X509_F_X509_STORE_ADD_CERT                       0
#  define X509_F_X509_STORE_ADD_CRL                        0
#  define X509_F_X509_STORE_ADD_LOOKUP                     0
#  define X509_F_X509_STORE_CTX_GET1_ISSUER                0
#  define X509_F_X509_STORE_CTX_INIT                       0
#  define X509_F_X509_STORE_CTX_NEW                        0
#  define X509_F_X509_STORE_CTX_PURPOSE_INHERIT            0
#  define X509_F_X509_STORE_NEW                            0
#  define X509_F_X509_TO_X509_REQ                          0
#  define X509_F_X509_TRUST_ADD                            0
#  define X509_F_X509_TRUST_SET                            0
#  define X509_F_X509_VERIFY_CERT                          0
#  define X509_F_X509_VERIFY_PARAM_NEW                     0

/*
 * X509V3 function codes.
 */
#  define X509V3_F_A2I_GENERAL_NAME                        0
#  define X509V3_F_ADDR_VALIDATE_PATH_INTERNAL             0
#  define X509V3_F_ASIDENTIFIERCHOICE_CANONIZE             0
#  define X509V3_F_ASIDENTIFIERCHOICE_IS_CANONICAL         0
#  define X509V3_F_BIGNUM_TO_STRING                        0
#  define X509V3_F_COPY_EMAIL                              0
#  define X509V3_F_COPY_ISSUER                             0
#  define X509V3_F_DO_DIRNAME                              0
#  define X509V3_F_DO_EXT_I2D                              0
#  define X509V3_F_DO_EXT_NCONF                            0
#  define X509V3_F_GNAMES_FROM_SECTNAME                    0
#  define X509V3_F_I2S_ASN1_ENUMERATED                     0
#  define X509V3_F_I2S_ASN1_IA5STRING                      0
#  define X509V3_F_I2S_ASN1_INTEGER                        0
#  define X509V3_F_I2V_AUTHORITY_INFO_ACCESS               0
#  define X509V3_F_LEVEL_ADD_NODE                          0
#  define X509V3_F_NOTICE_SECTION                          0
#  define X509V3_F_NREF_NOS                                0
#  define X509V3_F_POLICY_CACHE_CREATE                     0
#  define X509V3_F_POLICY_CACHE_NEW                        0
#  define X509V3_F_POLICY_DATA_NEW                         0
#  define X509V3_F_POLICY_SECTION                          0
#  define X509V3_F_PROCESS_PCI_VALUE                       0
#  define X509V3_F_R2I_CERTPOL                             0
#  define X509V3_F_R2I_PCI                                 0
#  define X509V3_F_S2I_ASN1_IA5STRING                      0
#  define X509V3_F_S2I_ASN1_INTEGER                        0
#  define X509V3_F_S2I_ASN1_OCTET_STRING                   0
#  define X509V3_F_S2I_SKEY_ID                             0
#  define X509V3_F_SET_DIST_POINT_NAME                     0
#  define X509V3_F_SXNET_ADD_ID_ASC                        0
#  define X509V3_F_SXNET_ADD_ID_INTEGER                    0
#  define X509V3_F_SXNET_ADD_ID_ULONG                      0
#  define X509V3_F_SXNET_GET_ID_ASC                        0
#  define X509V3_F_SXNET_GET_ID_ULONG                      0
#  define X509V3_F_TREE_INIT                               0
#  define X509V3_F_V2I_ASIDENTIFIERS                       0
#  define X509V3_F_V2I_ASN1_BIT_STRING                     0
#  define X509V3_F_V2I_AUTHORITY_INFO_ACCESS               0
#  define X509V3_F_V2I_AUTHORITY_KEYID                     0
#  define X509V3_F_V2I_BASIC_CONSTRAINTS                   0
#  define X509V3_F_V2I_CRLD                                0
#  define X509V3_F_V2I_EXTENDED_KEY_USAGE                  0
#  define X509V3_F_V2I_GENERAL_NAMES                       0
#  define X509V3_F_V2I_GENERAL_NAME_EX                     0
#  define X509V3_F_V2I_IDP                                 0
#  define X509V3_F_V2I_IPADDRBLOCKS                        0
#  define X509V3_F_V2I_ISSUER_ALT                          0
#  define X509V3_F_V2I_NAME_CONSTRAINTS                    0
#  define X509V3_F_V2I_POLICY_CONSTRAINTS                  0
#  define X509V3_F_V2I_POLICY_MAPPINGS                     0
#  define X509V3_F_V2I_SUBJECT_ALT                         0
#  define X509V3_F_V2I_TLS_FEATURE                         0
#  define X509V3_F_V3_GENERIC_EXTENSION                    0
#  define X509V3_F_X509V3_ADD1_I2D                         0
#  define X509V3_F_X509V3_ADD_VALUE                        0
#  define X509V3_F_X509V3_EXT_ADD                          0
#  define X509V3_F_X509V3_EXT_ADD_ALIAS                    0
#  define X509V3_F_X509V3_EXT_I2D                          0
#  define X509V3_F_X509V3_EXT_NCONF                        0
#  define X509V3_F_X509V3_GET_SECTION                      0
#  define X509V3_F_X509V3_GET_STRING                       0
#  define X509V3_F_X509V3_GET_VALUE_BOOL                   0
#  define X509V3_F_X509V3_PARSE_LIST                       0
#  define X509V3_F_X509_PURPOSE_ADD                        0
#  define X509V3_F_X509_PURPOSE_SET                        0

/*
 * Compatibility defines.
 */
# define EVP_R_OPERATON_NOT_INITIALIZED    EVP_R_OPERATION_NOT_INITIALIZED

# endif

# ifdef  __cplusplus
}
# endif
#endif
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    istóbal, Santa Lucía, Santo Tomás, San Vicente, Swift Current, Tegucigalpa, Thule, Thunder Bay, Tijuana, Toronto, Tórtola, Vancouver, Virgin, Whitehorse, Winnipeg, Yakutat, Yellowknife
Choices-eu.utf-8: Adak, Anchorage, Anguila, Antigua, Araguaina, Argentina/Buenos Aires, Argentina/Catamarca, Argentina/Cordoba, Argentina/Jujuy, Argentina/La Rioja, Argentina/Mendoza, Argentina/Rio Gallegos, Argentina/Salta, Argentina/San Juan, Argentina/San Lui, Argentina/Tucuman, Argentina/Ushuaia, Aruba, Asuncion, Atikokan, Atka, Bahia, Bahia Banderas, Barbados, Belem, Belize, Blanc-Sablon, Boa Vista, Bogota, Boise, Cambridge Bay, Campo Grande, Cancun, Caracas, Cayenne, Kaiman, Chicago, Chihuahua, Ciudad_Juarez, Salliit, Costa Rica, Coyhaique, Creston, Kuiaba, Curacao, Danmarkshavn, Dawson, Dawson Creek, Denver, Detroit, Dominica, Edmonton, Eirunepe, El Salvador, Ensenada, Fort_Nelson, Fortaleza, Glace Bay, Godthab, Goose Bay, Grand Turk, Granada, Guadalupe, Guatemala, Guayaquil, Guyana, Halifax, Havana, Hermosillo, Indiana/Indianapolis, Indiana/Knox, Indiana/Marengo, Indiana/Petersburg, Indiana/Tell City, Indiana/Vevay, Indiana/Vincennes, Indiana/Winamac, Inuvik, Iqaluit, Jamaica, Juneau, Kentucky/Louisville, Kentucky/Monticello, Kralendijk, La Paz, Lima, Los Angeles, Lower Princes, Maceio, Managua, Manao, Marigot, Martinika, Matamoros, Mazatlan, Menominee, Merida, Metlakatla, Mexico Hiria, Miquelon, Moncton, Monterrey, Montevideo, Montreal, Montserrat, Nassau, New York, Nipigon, Nome, Noronha, Ipar Dakota/Beulah, Ipar Dakota/Erdia, Ipar Dakota/New Salem, Nuuk, Ojinaga, Panama, Pangnirtung, Paramaribo, Phoenix, Port-au-Prince, Port of Spain, Porto Acre, Porto Velho, Puerto Rico, Punta_Arenas, Rainy River, Rankin Inlet, Recife, Regina, Resolute, Rio Branco, Santa Isabel, Santarem, Santiago, Santo Domingo, Sao Paulo, Scoresbysund, Shiprock, Sitka, St Barthelemy, St Johns, St Kitts, St Lucia, St Thomas, St Vincent, Swift Current, Tegucigalpa, Thule, Thunder Bay, Tijuana, Toronto, Tortola, Vancouver, Virgin, Whitehorse, Winnipeg, Yakutat, Yellowknife
Choices-fi.utf-8: Adak, Anchorage, Anguilla, Antigua, Araguaina, Argentiina/Buenos Aires, Argentiina/Catamarca, Argentiina/Córdoba, Argentiina/Jujuy, Argentiina/La Rioja, Argentiina/Mendoza, Argentiina/Rio Gallegos, Argentiina/Salta, Argentiina/San Juan, Argentiina/San Luis, Argentiina/Tucuman, Argentiina/Ushuaia, Aruba, Asunción, Atikokan, Atka, Bahia, Bahia_Banderas, Barbados, Belém, Belize, Blanc-Sablon, Boa Vista, Bogotá, Boise, Cambridge Bay, Campo Grande, Cancún, Caracas, Cayenne, Cayman, Chicago, Chihuahua, Ciudad_Juarez, Coral Harbour, Costa Rica, Coyhaique, Creston, Cuiabá, Curaçao, Danmarkshavn, Dawson, Dawson Creek, Denver, Detroit, Dominica, Edmonton, Eirunepe, El Salvador, Ensenada, Fort_Nelson, Fortaleza, Glace Bay, Nuuk, Goose Bay, Grand Turk, Grenada, Guadeloupe, Guatemala, Guayaquil, Guyana, Halifax, Havana, Hermosillo, Indiana/Indianapolis, Indiana/Knox, Indiana/Marengo, Indiana/Petersburg, Indiana/Tell City, Indiana/Vevay, Indiana/Vincennes, Indiana/Winamac, Inuvik, Iqaluit, Jamaika, Juneau, Kentucky/Louisville, Kentucky/Monticello, Kralendijk, La Paz, Lima, Los Angeles, Lower_Princes, Maceió, Managua, Manaus, Marigot, Martinique, Matamoros, Mazatlan, Menominee, Mérida, Metlakatla, México, Miquelon, Moncton, Monterrey, Montevideo, Montreal, Montserrat, Nassau, New York, Nipigon, Nome, Noronha, North_Dakota/Beulah, Pohjois-Dakota/Keskusta, Pohjois-Dakota/New Salem, Nuuk, Ojinaga, Panama, Pangnirtung, Paramaribo, Phoenix, Port-au-Prince, Port of Spain, Porto Acre, Porto Velho, Puerto Rico, Punta_Arenas, Rainy River, Rankin Inlet, Recife, Regina, Resolute, Rio Branco, Santa_Isabel, Santarém, Santiago, Santo Domingo, São Paulo, Ittoqqortoormiit, Shiprock, Sitka, Saint Barthélemy, St Johns, St Kitts, St Lucia, St Thomas, St Vincent, Swift Current, Tegucigalpa, Qaanaaq, Thunder Bay, Tijuana, Toronto, Tortola, Vancouver, Virgin, Whitehorse, Winnipeg, Yakutat, Yellowknife
Choices-fr.utf-8: Adak, Anchorage, Anguilla, Antigua, Araguaina, Buenos Aires, Catamarca, Córdoba, Jujuy, La Rioja, Mendoza, Rio Gallegos, Salta, San Juan, San Luis, Tucuman, Ushuaia, Aruba, Asuncion, Atikokan, Atka, Bahia, Bahia Banderas, La Barbade, Belém, Belize, Blanc-Sablon, Boa Vista, Bogota, Boise, Cambridge Bay, Campo Grande, Cancun, Caracas, Cayenne, Îles Caïman, Chicago, Chihuahua, Ciudad Juárez, Coral Harbour, Costa Rica, Coyhaique, Creston, Cuiabá, Curaçao, Danmarkshavn, Dawson, Dawson Creek, Denver, Détroit, Dominique, Edmonton, Eirunepe, El Salvador, Ensenada, Fort Nelson, Fortaleza, Glace Bay, Godthab, Goose Bay, Grand Turk, Grenade, Guadeloupe, Guatemala, Guayaquil, Guyana, Halifax, La Havane, Hermosillo, Indiana/Indianapolis, Indiana/Knox, Indiana/Marengo, Indiana/Petersburg, Indiana/Tell City, Indiana/Vevay, Indiana/Vincennes, Indiana/Winamac, Inuvik, Iqaluit, Jamaïque, Juneau, Kentucky/Louisville, Kentucky/Monticello, Kralendijk, La Paz, Lima, Los Angeles, Lower Princes, Maceió, Managua, Manaus, Marigot, Martinique, Matamoros, Mazatlan, Menominee, Merida, Metlakatla, Mexico City, Miquelon, Moncton, Monterrey, Montevideo, Montréal, Montserrat, Nassau, New York, Nipigon, Nome, Noronha, Dakota du Nord/Beulah, Dakota du Nord/Centre, Dakota du Nord/New Salem, Nuuk, Ojinaga, Panama, Pangnirtung, Paramaribo, Phoenix, Port-au-Prince, Port d'Espagne, Porto Acre, Porto Velho, Porto-Rico, Punta Arenas, Rainy River, Rankin Inlet, Recife, Regina, Resolute, Rio Branco, Santa Isabel, Santarém, Santiago, Saint-Domingue, São Paulo, Scoresbysund, Shiprock, Sitka, Saint Barthélemy, Saint-Johns, Saint-Kitts, Sainte-Lucie, Saint-Thomas, Saint-Vincent, Swift Current, Tegucigalpa, Thulé, Thunder Bay, Tijuana, Toronto, Tortola, Vancouver, Vierges (îles), Whitehorse, Winnipeg, Yakutat, Yellowknife
Choices-gl.utf-8: Adak, Anchorage, Anguila, Antigua, Araguaina, Arxentina/Buenos Aires, Arxentina/Catamarca, Arxentina/Córdoba, Arxentina/Jujuy, Arxentina/La Rioja, Arxentina/Mendoza, Arxentina/Río Gallegos, Arxentina/Salta, Arxentina/San Juan, Arxentina/San Luis, Arxentina/Tucumán, Arxentina/Ushuaia, Aruba, Asunción, Atikokan, Atka, Bahia, Bahia de Banderas, Barbados, Belém, Belize, Blanc-Sablon, Boa Vista, Bogotá, Boise, Cambridge Bay, Campo Grande, Cancún, Caracas, Cayenne, Cayman, Chicago, Chihuahua, Ciudad_Juarez, Porto Coral, Costa Rica, Coyhaique, Crestón, Cuiaba, Curação, Danmarkshavn, Dawson, Dawson Creek, Denver, Detroit, Dominica, Edmonton, Eirunepe, El Salvador, Ensenada, Fort Nelson, Fortaleza, Glace Bay, Godthab, Goose Bay, Gran Turk, Granada, Guadalupe, Guatemala, Guayaquil, Güiana, Halifax, A Habana, Hermosillo, Indiana/Indianapolis, Indiana/Knox, Indiana/Marengo, Indiana/Petersburg, Indiana/Tell City, Indiana/Vevay, Indiana/Vincennes, Indiana/Winamac, Inuvik, Iqaluit, Xamaica, Juneau, Kentucky/Louisville, Kentucky/Monticello, Kralendijk, La Paz, Lima, Los Angeles, Lower Prince's, Maceió, Managua, Manaus, Marigot, Martinica, Matamoros, Mazatlán, Menominee, Mérida, Metlakatla, Cidade de México, Miquelon, Moncton, Monterrei, Montevideo, Montreal, Montserrat, Nassau, Nova York, Nipigon, Nome, Noronha, Dakota do norte/Beulah, Dakota do norte/Centro, Dakota do norte/New Salem, Nuuk, Ojinaga, Panamá, Pangnirtung, Paramaribo, Phoenix, Porto Príncipe, Porto España, Porto Acre, Porto Velho, Porto Rico, Punta Arenas, Rainy River, Rankin Inlet, Recife, Regina, Resolute, Rio Branco, Santa Isabel, Santarém, Santiago, Santo Domingo, São Paulo, Scoresbysund, Shiprock, Sitka, San Bartolomé, St. Johns, St. Kitts, St. Lucía, St. Thomas, St. Vincent, Swift Current, Tegucigalpa, Thule, Thunder Bay, Tijuana, Toronto, Tortola, Vancouver, Virgin, Whitehorse, Winnipeg, Yakutat, Yellowknife
Choices-gu.utf-8: અડાક, એન્ચોરાગે, એનગુલ્લા, એન્ટિગુઆ, આરાગુએના, આર્જેન્ટિના/બુએનાસ એરિસ, આર્જેન્ટિના/કાટામાર્કા, આર્જેન્ટિના/કોર્ડોબા, આર્જેન્ટિના/જુજુય, આર્જેન્ટિના/લા રીઓજા, આર્જેન્ટિના/મેન્ડોઝા, આર્જેન્ટિના/રીઓ ગાલેગોસ, આર્જેન્ટિના/સાલ્ટા, આર્જેન્ટિના/સાન જુઆન, આર્જેન્ટિના/સાન લુઇસ, આર્જેન્ટિના/તુકુમાન, આર્જેન્ટિના/ઉસ્હુઇઆ, અરુબા, અસુન્કિઓન, અટિકોકાન, અટ્કા, બાહીઆ, બાહીઆ બાન્ડેરાસ, બાર્બાડોસ, બેલેમ, બેલિઝે, બ્લાન્ક-સેબ્લોન, બોઆ વિસ્ટા, બોગોટા, બોઇસે, કેન્બ્રિજ બે, કામ્પો ગ્રાન્ડે, કાન્કુન, કારાકાસ, સાયેને, કેયમેન, શિકાગો, ચિહુઆહુઆ, Ciudad_Juarez, કોરલ હાર્બર, કોસ્ટા રીકા, Coyhaique, Creston, ક્યુબા, કુરાકાઓ, ડેન્માર્કશોન, ડાઉસન, ડાઉસન ખાડી, ડેન્વર, ડેટ્રોઇટ, ડોમિનિકા, એડમોન્ટોન, ઇરુનેપે, અલ સાલ્વાડોર, એન્સેનાડા, Fort_Nelson, ફોર્ટાલેઝા, ગ્લેસ બે, ગોડથાબ, ગૂસ અખાત, ગ્રાન્ડ તુર્ક, ગ્રેનેડા, ગ્યુડેલોપ, ગ્વાટેમાલા, ગ્યુઆકીલ, ગુઆના, હાલિફેક્સ, હવાના, હેર્મોસિલ્લો, ઇન્ડિયાના/ઇન્ડિયાનાપોલિસ, ઇન્ડિયાના/નોક્સ, ઇન્ડિયાના/મારેન્ગો, ઇન્ડિયાના/પીટ્સબર્ગ, ઇન્ડિયાના/ટેલ સીટી, ઇન્ડિયાના/વેવાય, ઇન્ડિયાના/વિન્સેન્નેસ, ઇન્ડિયાના/વિનમેક, ઇનુવિક, ઇકાલુઇટ, જમૈકા, જુનેયુ, કેનટુકી/લુઇસવિલે, કેનટુકી/મોન્ટિસેલો, ક્રાલેન્ડિઝક, લા પાઝ, લિમા, લોસ એન્જેલસ, લોઅર પ્રિન્સેસ, મેસીઓ, માનાગુઆ, માનુસ, મારીગોટ, માર્ટિનિક, માતામોરોસ, મઝાટલાન, મેનોમિની, મેરિડા, મેટલાકાટલા, મેક્સિકો શહેર, મિક્લોન, મોન્કટોન, મોન્ટેર્રે, મોન્ટવિડીઓ, મોન્ટ્રિઅલ, મોન્ટસેર્રાટ, નાસાઉ, ન્યુ યોર્ક, નિપિગોન, નોમ, નોરોન્હા, નોર્થ ડાકોટા/બેઉલાહ, નોર્થ ડાકોટા/મધ્ય, નોર્થ ડાકોટા/ન્યુ સાલેમ, Nuuk, ઓજીનાગા, પનામા, પાન્ગનિર્તુગ, પારામારિબો, ફિનિક્સ, પોર્ટ-ઓફ-પ્રિન્સ, પોર્ટ ઓફ સ્પેન, પોર્ટો એકર, પોર્ટો વેલ્હો, પુએર્તો રિકો, Punta_Arenas, રેઇની નદી, રાન્કિન ઇન્લેટ, રેસિફે, રેગિના, રેસોલુટ, રીઓ બ્રાન્કો, સાન્ટા ઈઝાબેલ, સાન્ટારેમ, સાન્તિઆગો, સાન્ટો ડોમિન્ગો, સાઓ પાઉલો, સ્કોરબાયસન્ડ, શિપરોક, સિટ્કા, સેન્ટ બાર્થેલેમી, સેન્ટ જોહ્ન્સ, સેન્ટ કિટ્ટસ, સેન્ટ લુસિઆ, સેન્ટ થોમસ, સેન્ટ વિન્સેન્ટ, સ્વિફ્ટ પ્રવાહ, ટેગુસિગાલ્પા, થુલે, થન્ડર અખાત, ટિજુઆના, ટોર્નેડો, ટોર્ટોલા, વાનકુવર, વર્જીન, વ્હાઇટહોર્સ, વિનિપેગ, યાકુટાક, યેલોનાઇફ
Choices-he.utf-8: אדאק, אנקורג', אנגווילה, אנטיגואה, אראגואינה, ארגנטינה/בואנוס איירס, ארגנטינה/קטמרקה, ארגנטינה/קורדובה, ארגנטינה/חוחוי, ארגנטינה/לה ריוחה, ארגנטינה/מנדוסה, ארגנטינה/ריו גז'גוס, ארגנטינה/סלטה, ארגנטינה/סן חואן, ארגנטינה/סן לואיס, ארגנטינה/טוקומאן, ארגנטינה/אושואיה, ארובה, אסונסיון, אטיקוקן, אטקה, באהיה, באהיה באנדרס, ברבדוס, בלם, בליז, בלאנק-סאבלון, בואה ויסטה, בוגוטה, בויסי, מפרץ קמברידג', קאמפו קראנדה, קנקון, קראקס, קאיין, איי קיימן, שיקגו, צ'יהואהואה, סיודאד חוארס, קוראל הרבור, קוסטה ריקה, Coyhaique, קרסטון, קויאבה, קוראסאו, דנמרקשייבן, דוסון, דוסון קריק, דנבר, דטרויט, דומיניקה, אדמונטון, Eirunepe, אל סלוודור, אנסנדה, מבצר נלסון, פורטלזה, גלייס באי, נאוק, גוז באי, גרנד טורק, גרנדה, גוואדלופ, גואטמלה, גוויאקיל, גיאנה, הליפקס, הוואנה, ארמוסיו, אינדיאנה/אינדיאנפוליס, אינדיאנה/נוקס, אינדיאנה/מרנגו, אינדיאנה/פטרבורג, אינדיאנה/טל סיטי, אינדיאנה/ויוי, אינדיאנה/ונסן, אינדיאנה/וינמק, אינוביק, איקאלואיט, ג'מייקה, ג'ונו, קנטקי/לואיוויל, קנטקי/מונטיצ'לו, Kralendijk, לה פאס, לימה, לוס אנג'לס, Lower Princes, מסיו, מנגואה, מנאוס, מריגו, מרטיניק, מטמורוס, מזטיאן, מנומיני, מרידה, Metiakatia, מקסיקו סיטי, מיקול, מונקטון, מונטרי, מונטווידאו, מונטריאול, מונטסראט, נסאו, ניו יורק, ניפיגון, נום, נורוניה, דקוטה הצפונית/באולה, דקוטה הצפונית/סנטר, דקוטה הצפונית/ניו סאלם, נוק, Ojinaga, פנמה, פנגנירטונג, פרמריבו, פניקס, פורט-או-פרנס, פורט אוף ספיין, פורטו אקרי, פורטו ולאהו, פורטו ריקו, פונטה ארנס, Rainy River, Rankin Inlet, רסיפה, רג'ינה, רזולוט, ריו ברנקו, סנטה איזבל, סנטרם, סניאגו, סנטו דומינגו, סאו פאולו, Scoresbysund, שיפרוק, סיטקה, סנט ברתלמי, סנט ג'ונס, סנט קיטס, סנט לוסיה, סנט תומאס, סנט וינסנט, סויפט קורנט, טגוסיגלפה, תולה, Thunder Bay, טיחואנה, טורונטו, טורטולה, ונקובר, וירג'ין, Whitehorse, ויניפג, Yakutat, ילונייף
Choices-hr.utf-8: Adak, Anchorage, Anguilla, Antigua, Araguaina, Argentina/Buenos Aires, Argentina/Catamarca, Argentina/Cordoba, Argentina/Jujuy, Argentina/La Rioja, Argentina/Mendoza, Argentina/Rio Gallegos, Argentina/Salta, Argentina/San Juan, Argentina/San Luis, Argentina/Tucuman, Argentina/Ushuaia, Aruba, Asuncion, Atikokan, Atka, Bahia, Bahia Banderas, Barbados, Belem, Belize, Blanc-Sablon, Boa Vista, Bogota, Boise, Cambridge Bay, Campo Grande, Cancun, Caracas, Cayenne, Cayman, Chicago, Chihuahua, Ciudad Juarez, Coral Harbour, Kostarika, Coyhaique, Creston, Cuiaba, Curacao, Danmarkshavn, Dawson, Dawson Creek, Denver, Detroit, Dominica, Edmonton, Eirunepe, El Salvador, Ensenada, Fort Nelson, Fortaleza, Glace Bay, Godthab, Goose Bay, Grand Turk, Grenada, Guadeloupe, Gvatemala, Guayaquil, Guyana, Halifax, Havana, Hermosillo, Indiana/Indianapolis, Indiana/Knox, Indiana/Marengo, Indiana/Petersburg, Indiana/Tell City, Indiana/Vevay, Indiana/Vincennes, Indiana/Winamac, Inuvik, Iqaluit, Jamajka, Juneau, Kentucky/Louisville, Kentucky/Monticello, Kralendijk, La Paz, Lima, Los Angeles, Lower Princes, Maceio, Managua, Manaus, Marigot, Martinique, Matamoros, Mazatlan, Menominee, Merida, Metlakatla, Mexico City, Miquelon, Moncton, Monterrey, Montevideo, Montreal, Montserrat, Nassau, New York, Nipigon, Nome, Noronha, North Dakota/Beulah, North Dakota/Center, North Dakota/New Salem, Nuuk, Ojinaga, Panama, Pangnirtung, Paramaribo, Phoenix, Port-au-Prince, Port of Spain, Porto Acre, Porto Velho, Portoriko, Punta Arenas, Rainy River, Rankin Inlet, Recife, Regina, Resolute, Rio Branco, Santa Isabel, Santarem, Santiago, Santo Domingo, Sao Paulo, Scoresbysund, Shiprock, Sitka, St Barthelemy, St Johns, St Kitts, St Lucia, St Thomas, St Vincent, Swift Current, Tegucigalpa, Thule, Thunder Bay, Tijuana, Toronto, Tortola, Vancouver, Virgin, Whitehorse, Winnipeg, Yakutat, Yellowknife
Choices-hu.utf-8: Adak, Anchorage, Anguilla, Antigua, Araguaina, Argentína/Buenos Aires, Argentína/Catamarca, Argentína/Cordoba, Argentína/Jujuy, Argentína/La Rioja, Argentína/Mendoza, Argentína/Rio Gallegos, Argentína/Salta, Argentina/San Juan, Argentína/San Luis, Argentina/Tucuman, Argentína/Ushuaia, Aruba, Asuncion, Atikokan, Atka, Bahia, Bahía de Banderas, Barbados, Belem, Belize, Blanc-Sablon, Boa Vista, Bogotá, Boáz, Cambridge Bay, Campo Grande, Cancun, Caracas, Cayenne, Cayman, Chicago, Csihuahua, Ciudad_Juarez, Coral Harbour, Costa Rica, Coyhaique, Creston, Cuiaba, Curacao, Danmarkshavn, Dawson, Dawson Creek, Denver, Detroit, Dominica, Edmonton, Eirunepe, El Salvador, Ensenada, Fort_Nelson, Fortaleza, Glace Bay, Godthab, Goose Bay, Grand Turk, Grenada, Guadeloupe, Guatemala, Guayaquil, Guyana, Halifax, Havanna, Hermosillo, Indiana/Indianapolis, Indiana/Knox, Indiana/Marengo, Indiana/Petersburg, Indiana/Tell City, Indiana/Vevay, Indiana/Vincennes, Indiana/Winamac, Inuvik, Iqaluit, Jamaica, Juneau, Kentucky/Louisville, Kentucky/Monticello, Kralendijk, La Paz, Lima, Los Angeles, Lower Princes, Maceio, Managua, Manausz, Marigot, Martinique, Matamoros, Mazatlán, Menominee, Merida, Metlakatla, Mexikóváros, Miquelon, Moncton, Monterrey, Montevideo, Montreal, Montserrat, Nassau, New York, Nipigon, Nome, Noronha, Észak-Dakota/Beulah, Észak-Dakota/Közép, Észak-Dakota/New Salem, Nuuk, Ojinaga, Panama, Pangnirtung, Paramaribo, Phoenix, Port-au-Prince, Port of Spain, Porto Acre, Porto Velho, Puerto Rico, Punta_Arenas, Rainy River, Rankin Inlet, Recife, Regina, Resolute, Rio Branco, Santa Isabel, Santarém, Santiago, Santo Domingo, Sao Paulo, Scoresbysund, Shiprock, Sitka, Szent Bertalan, St Johns, St Kitts, St Lucia, St Thomas, St Vincent, Swift Current, Tegucigalpa, Thule, Thunder Bay, Tijuana, Toronto, Tortola, Vancouver, Virgin, Whitehorse, Winnipeg, Yakutat, Yellowknife
Choices-id.utf-8: Adak, Anchoraga, Anguila, Antigua, Araguaina, Argentina/Buenos Aires, Argentina/Katamarka, Argentina/Kordoba, Argentina/Jujuy, Argentina/La Rioja, Argentina/Mendoza, Argentina/Rio Gallegos, Argentina/Salta, Argentina/San Juan, Argentina/San Luis, Argentina/Tucuman, Argentina/Ushuaia, Aruba, Asuncion, Atikokan, Atka, Bahia, Bahia Banderas, Barbados, Belem, Belize, Blanc-Sablon, Boa Vista, Bogota, Boise, Pantai Cambridge, Campo Grande, Cancun, Karakas, Cayenne, Cayman, Chicago, Cihuahua, Ciudad_Juarez, Karang Harbour, Costa Rica, Coyhaique, Creston, Cuiaba, Curacao, Danmarkshavn, Dawson, Dawson Creek, Denver, Detroit, Dominica, Edmonton, Eirunepe, El Savador, Ensenada, Fort_Nelson, Fortaleza, Pantai Glace, Godthab, Pantai Goose, Grand Turk, Grenada, Guadaloupa, Guatemala, Guayaquil, Guyana, Halifax, Havana, Hermisilo, Indiana/Indianapolis, Indiana/Knox, Indiana/Marengo, Indiana/Petersburg, Indiana/Tell CIty, Indiana/Vevay, Indiana/Vincennes, Argentina/Winamac, Inuvik, Iqaluit, Jamaica, Juneau, Kentucky/Louisville, Kentucky/Monticello, Kralendijk, La Paz, Lima, Los Angeles, Lower Princes, Maceio, Managua, Manaus, Marigot, Martinik, Matamoros, Mazatlan, Menominee, Merida, Metlakatla, Mexico City, Miquelon, Moncton, Monterrey, Montevideo, Montreal, Montserrat, Nassau, New York, Nipigon, Noma, Noronha, Dakota Utara/Beulah, Dakota Utara/Pusat, Dakota Utara/Salem Baru, Nuuk, Ojinaga, Panama, Pangnirtung, Paramaribo, Phoenix, Port-au-Prince, Pelabuhan Spanyol, Porto Acre, Porto Velho, Puerto Rico, Punta_Arenas, Sungai Rainy, Rankin Inlet, Recife, Regina, Resolute, Rio Branco, Santa Isabel, Santarem, Santiago, Santo Domingo, Sao Paulo, Scoresbysund, Shiprock, Sitka, Saint Barthelemy, Saint John, Saint Kitt, Saint Lucia, Saint Thomas, Saint Vincent, Swift Current, Tegucigalpa, Thule, Pantai Thunder, Tijuana, Toronto, Tortoka, Vancouver, Virgin, Whitehorse, Winnipeg, Yakutat, Yellowknife
Choices-it.utf-8: Adak, Anchorage, Anguilla, Antigua, Araguaina, Argentina/Buenos Aires, Argentina/Catamarca, Argentina/Córdoba, Argentina/Jujuy, Argentina/La Rioja, Argentina/Mendoza, Argentina/Rio Gallego, Argentina/Salta, Argentina/San Juan, Argentina/San Luis, Argentina/Tucumán, Argentina/Ushuaia, Aruba, Asunción, Atikokan, Atka, Bahia, Bahía de Banderas, Barbados, Belém, Belize, Blanc-Sablon, Boa Vista, Bogotá, Boise, Cambrige Bay, Campo Grande, Cancún, Caracas, Caienna, Isole Cayman, Chicago, Chihuahua, Ciudad_Juarez, Coral Harbour, Costa Rica, Coyhaique, Creston, Cuiabá, Curaçao, Danmarks Havn, Dawson, Dawson Creek, Denver, Detroit, Dominìca, Edmonton, Eirunepé, El Salvador, Ensenada, Fort_Nelson, Fortaleza, Glace Bay, Nuuk, Goose Bay, Grand Turk, Grenada, Guadalupa, Guatemala, Guayaquil, Guyana, Halifax, L'Avana, Hermosillo, Indiana/Indianapolis, Indiana/Knox, Indiana/Marengo, Indiana/Petersburg, Indiana/Tell City, Indiana/Vevay, Indiana/Vincennes, Indiana/Winamac, Inuvik, Iqaluit, Giamaica, Juneau, Kentucky/Louisville, Kentucky/Monticello, Kralendijk, La Paz, Lima, Los Angeles, Lower Princes, Maceió, Managua, Manaus, Marigot, Martinica, Matamoros, Mazatlán, Menominee, Mérida, Metlakatla, Città del Messico, Miquelon, Moncton, Monterrey, Montevideo, Montréal, Montserrat, Nassau, New York, Nipigon, Nome, Noronha, Nord Dakota/Beulah, Nord Dakota/Center, Nord Dakota/New Salem, Nuuk, Ojinaga, Panama, Pangnirtung, Paramaribo, Phoenix, Port-au-Prince, Port of Spain, Porto Acre, Porto Velho, Porto Rico, Punta_Arenas, Rainy River, Rankin Inlet, Recife, Regina, Resolute, Rio Branco, Santa Isabel, Santarém, Santiago, Santo Domingo, San Paolo, Scoresbysund, Shiprock, Sitka, St Barthelemy, St Johns, St Kitts, St Lucia, St Thomas, St Vincent, Swift Current, Tegucigalpa, Thule, Thunder Bay, Tijuana, Toronto, Tortola, Vancouver, Virgin, Whitehorse, Winnipeg, Yakutat, Yellowknife
Choices-ja.utf-8: エイダック, アンカレジ, アングイラ, アンティグア, アラグアイナ, アルゼンチン/ブエノスアイレス, アルゼンチン/カタマルカ, アルゼンチン/コルドバ, アルゼンチン/フフイ, アルゼンチン/ラリオハ, アルゼンチン/メンドサ, アルゼンチン/リオガエゴス, アルゼンチン/サルタ, アルゼンチン/サンファン, アルゼンチン/サンルイス, アルゼンチン/トゥクマン, アルゼンチン/ウシュアイア, アルバ, アスンシオン, アティコカン, アトカ, バイア, バイアバンデラス, バルバドス, ベレン, ベリーズ, ブランサブロン, ボアヴィスタ, ボゴタ, ボイシ, ケンブリッジ湾, カンポグランデ, カンクン, カラカス, カイエンヌ, ケイマン, シカゴ, チワワ, Ciudad_Juarez, コーラルハーバー, コスタリカ, Coyhaique, クレストン, クヤバ, キュラソー, デンマークシャウン, ドーソン, ドーソン運河, デンヴァー, デトロイト, ドミニカ, エドモントン, エイルネペ, エルサルバドル, エンセナダ, フォートネルソン, フォルタレザ, グラッセ湾, ゴッドホープ, グース湾, グランドターク, グレナダ, グアドループ, グアテマラ, グアヤキル, ガイアナ, ハリファックス, ハバナ, エルモシヨ, インディアナ/インディアナポリス, インディアナ/ノックス, インディアナ/マレンゴ, インディアナ/ピーターズバーグ, インディアナ/テルシティ, インディアナ/ビベー, インディアナ/ヴィンセンズ, インディアナ/ウィナマック, イヌヴィック, イカルイット, ジャマイカ, ジュノー, ケンタッキー/ルーイヴィル, ケンタッキー/モンティセロ, クラレンディーク, ラパス, リマ, ロサンゼルス, ロワプリンセス, マセイオ, マナグア, マナウス, マリゴット, マルティニク, マタモロス, マサトラン, メノミニー, メリダ, メトラカトラ, メキシコシティ, ミクロン, マンクトン, モンテレー, モンテビデオ, モントリオール, モントセラト, ナッソー, ニューヨーク, ニピゴン, ノーム, ノロニャ, 北ダコタ/ベウラ, 北ダコタ/中央, 北ダコタ/ニューセイラム, ヌーク, オヒナガ, パナマ, パンナータング, パラマリボ, フェニックス, ポルトープランス, ポートオブスペイン, ポルトアクレ, ポルトヴェリエ, プエルトリコ, プンタアレナス, レイニーリバー, ランキン湾, レシフェ, レジャイナ, レソリュート, リオブランコ, サンタイサベル, サンタレン, サンチアゴ, セントドミニゴ, サンパウロ, スコレスビスン, シップロック, シトカ, セントバルテルミ, セントジョーンズ, セントキッツ, セントルチア, セントトーマス, セントビンセント, スイフトカレント, テグシガルパ, テューレ, サンダー湾, ティフアナ, トロント, トルトラ, バンクーバー, バージン, ホワイトホース, ウィニペグ, ヤクタト, イエローナイフ
Choices-ko.utf-8: 아닥, 앵커러지, 앵귈라, 앤티가 섬, 아라구아이나, 아르헨티나/부에노스아이레스, 아르헨티나/카타마르카, 아르헨티나/코르도바, 아르헨티나/후후이, 아르헨티나/라리오하, 아르헨티나/멘도사, 아르헨티나/리오가예고스, 아르헨티나/살타, 아르헨티나/산후안, 아르헨티나/산루이스, 아르헨티나/투쿠만, 아르헨티나/우수아이아, 아루바, 아순시온, 아티코칸, 애트카, 바이아, 바이아 데 반데라스, 바베이도스, 벨렘, 벨리즈, 블렁싸블롱, 보아비스타 섬, 보고타, 보이시, 캠브리지 베이, 캄푸그란데, 칸쿤, 카라카스, 카옌, 케이맨 제도, 시카고, 치와와, 시우다드 후아레스, 코랄 하버, 코스타리카, Coyhaique, 크레스턴, 쿠이아바, 퀴라소, 덴마크샤븐, 도슨, 도슨크릭, 덴버, 디트로이트, 도미니카, 에드먼턴, 에이루네페, 엘살바도르, 엔세나다, 포트 넬슨, 포르탈레자, 글레이스 베이, 고트호프, 구스 베이, 그랑 터크, 그레나다, 과들루프, 과테말라, 과야킬, 가이아나, 핼리팩스, 아바나, 에르모시요, 인디애나/인디애나폴리스, 인디애나/녹스, 인디애나/마렝고, 인디애나/페테스부르크, 인디애나/텔시티, 인디애나/베베이, 인디애나/빈센느, 인디애나/위나막, 이누빅, 이칼루이트, 자메이카, 주노, 켄터키/루이스빌, 켄터키/몬티첼로, 크랄렌데이크, 라파스, 리마, 로스앤젤레스, 로워 프린스, 마세이오, 마나과, 마나우스, 마리고, 마르티니크, 마타모로스, 마사틀란, 매노미니, 메리다, 메틀라카틀라, 멕시코시티, 미클롱, 멍크턴, 몬테레이, 몬테비데오, 몬트리올, 몬세라트, 나사우, 뉴욕, 니피곤, 놈, 노로냐, 노스다코타/뷰러, 노스다코타/중부, 노스다코타/뉴 살렘, 누크, 오지나가, 파ELF          >                             @     @ 4 3          GNU PܚtU{1,%y        Linux                Linux   6.1.0-37-amd64      HHHD    fD      USHH  HH      H    H@      H    H    H[]    D      SHHvHt'H  SE1   H       HC    H;Ht       H    HC    [        UfSH   H@  H@      H	  1[]            UfSH   H@  H@      H	  1[]            Vu:N	t2U   HSH^1H    H@  H1    1[]        ff.     @     H@  H耋 tNUSHuJH  H    u   []    H@     H       []        H@  uH5    H	              AUATIUS  L     1I   #H;Ht    H    A$  9s;HI$   HsHtSE1   L    1HC    fCHI$   1    A$  I$  1    I$  1IǄ$      (  I$  0  []A\A]    1롐    AW1AVIAUATUSH H    HD$H  HHH   HD$  9r  )ЉL`Io  g  VH)HHD$   1L    M   A,  HD$LH$L       H$   L   %  L`  H   H+5    HE1A   HHLHH5        HCH   HI  HHB A9  u11II   It]L9d$tVL+MA,  H|$ 
      IHt$HA,  fC=     tJHCA  A;  tA  UtcI  0  H []A\A]A^A_    HD$    L   MuL   L    LH    H    vA  PH5    ff.         ATUSH@  HH       tS%     ~hH@     H@         H@  
   @[]A\    Dȉ́        H=        
      IHtH@     H  H  LH9tr(Hqr,fqHH9u拓  H@  1L    L    H@     . H@  %[]A\    D      AWAVAUATLUSHHP|L  t$HHHWjDIL`AF   L,$IHEEDIHHsIL`AF
tHCLAAF    DtHA9u1E1D9uHCl0DIL`AFtDyL,$D|IE8   { tHSC HHTH  DSH  MHD$(H  ILKD$IMLSAA  |$  H   D$    MHD$ D$    Ld$@|  $IԉHILcH|$ H9    IuHDHKE1A$HAU   D$HD$    1IE    ANfAvAe  AF
_  9
    L$8rNκ 
  H߉L$0    L$0Ht2DD$8H   L$<H   HD$0A    Im L$<Hl$0H    AF$< uAF
    HCHt$(H    Af   tAF      f   f   H    |$AF    AD$   L$9L$   Ll$MD$Im E~IE     <$KH   G9P$    1Ҿ   E1O       HC&D     H    |$AF UH|$@   D$    AD$>Ld$@<$C1ɉ{9rKԋ$)t   L$9L$   D$HP[]A\A]A^A_    H    H           H    YHD$H    H
    H)H   H  Q     I  H    H      LL$9L$Jt$H    H  /f       H  E   H  @D$    x1D9BD)ȍDD$ I  H   H      CHSEVH5    D|L\DxH     H    H  ARVH    UAS    H f         H5    H               H  H    H      D$     19r  )кȃw    H  H    1҃(              AWIAVAUATUSHPH@  n  DopEa      1I  9ǉ|$HBу)Ѓ  A   h  A   D$4   D$LI   A   HJf  AB~tR )փ  A   1E1HHRI+   ҍ4A   H1BB    f1fjH
fD"M     A   fAD9I   A   E   M   IHHHxM)L)L)L)E  DCLMIM   HI   I{   X1A@p
@DPfD@@xfXfH@ ARp)   PE;  U  D$HL$4E  A   HD$@I   JI8  RABpA+Btt$H|$8AƉT$0  H   LD$    HD$ D$    !шL$(A @  EIM   E9ENހ|$( MD  I|$ fAl$  H    E1ҋT$fET$ID$H   HHL$H$    H$HL$5  Hп   %  Hm  H   H+5    HH|$ E1HHA   HH5        ID$HA  E1ɃD$fEL$A)t\AE;  uE1l$11L׹ 
  L$    L$     L    1HP[]A\A]A^A_    IDD$0E  HD$81LH   HD$D   HIL   Ec8E   HD$|$ME1Hl$(MHD$ ADHE;  u1E1 @  |$I   A9AN  H    fkE1ɉ   H|$A   L$HCDfsAW<Iw0H    L$HHC  1ɃD$AfKA)`|$Hl$(M׃9|$0IDT$HI   LHD$@HI   fDh  A8  D$4  DD$4AEA  D\$L
   @D$4ED$HHI   HI   LIL
IB 	DB
JfDZA9  u1s   	JA  I@     A  A  1A  9Bփ)ЃLD$09D$SA @  FEE3=     ILtfHCH|$ H    L$    l$1L$$HCI	      4A @  AACE HD$8    H   HtuH|$ L$    HH    H    L$WD$L    D$4       L    HD$@HI   H@    D$HA  ~H   낁   A   E1HL$0¸   CA  L$D$HI   A   L2A   `@`   |$HA   A+   A   I   HH|$@HHI   HHz uH       E1ۈH@p     HxfDXD$HDhE;  uE1E  A   I   L$4JD$    iID$HHD$@AzH5    MLT$(ILff.          ATIUS     1HI$  HsHt(I$  SE1   H       HC    H;Ht       H    HC    A$  9rHI$  1    A$  I$  1    I$  1IǄ$        I$     []A\    1@     AV1IH  AUATUIn(SLg1I$0  E$       LI  Ӿ   Ӿ   H    Hf=vA  I  I    I  H   I    1I    I     I  A  (     I     A  %   -  A  I     A   	A,     v   0  
I     A  I  I     I     I  A  8  I  H  I  H   I     I  H(  1I  0  I  @  A   tI  HX   I  X  I     A  A  19rA  pL)Ѝ4I     I  H  I     I  MM1H          Å   I  AE;     E  ADh A    wqA  I          fA$    EI     I  H I$      H5    L    []A\A]A^    I   uI  q    wq
@ A9NI  &A   uSA      []A\A]A^    I      AƆ  1
@  BKI      ff.         USHH  H	      HC8tH        H    H5    H[]    D      UH  SHH    H    u
      H  HP       vH   uH  []    ff.         ATUSHHHH  eH%(   HD$11D$    fD$       C8t&   HT$eH+%(     H[]A\    H    H    H  H    H      H	  H@      H    u%P  t    P         nHHt$L<         1HHT$    ]  H    H0  s4   uV<  u@  	P  t    HI|$HH<  HDIDI)B#L)H<  tDfAD돀=     i    H    HH            @<  DADC    ff.         AU1ATUHSHeH%(   HD$1D$    fT$    Åt%HD$eH+%(     H[]A\A]    L   HL    Å    HL    H    H    ÅN  H                 IH  
    Lp  L	  HH  H0  H8  LH     w1t
   fA$P  1H    I$@  H  H   H@  HPHtHH)Ht
@  H@H9uIǄ$       L    I$  @   LAǄ$    H        H   HuH      L    I$8      AǄ$      I$0  A$  B<fA$  B>fA$  J@fA$  RBfA$     Jf=HA$  f=A$|  u
f=H  AǄ$t     AƄ$Z  A$@  H    I$@  I$    I$   HHD   >  IǄ$    I$       u=A$P  (      H    H    8L    Ht$H       1LHT$    I$0     R	   H    E111A$  H    L    A$eth%LH   I$  I$  I$  I$  d   IǄ$      fAD$    ÅuCL    A$P      L    L        :A$P  u=I$@      A$P  C    I$@  0            ATAUSHH    H    H       H     H  H H        H  H         uHEuTǃ4      H    H  H      H    HH[]A\wH      EtH    ff.         ATUSLH  HL       tID$8uH       []A\    I$	         fD      SH      H    H[FfD      AUL	  ATDfUSHG8Hu"HC8D     u[1]A\A]       L    L    1[]A\A]            ATL	     USHL    LH8  H       H  H   Hǃ         E1H       LH8  Hǃ       H      Hh  E1Hǃ      H`  p  H       1Hǃ`      []A\    ff.     f    H   H      H1HtYUH(H	  SHG8H@  uH    1[]       H    H    H    1[]    1    f    USHH    Hc    H  Htb  H  E1  H            H  HtHǃ      1[]    H      f         USHH    Hc    H   Htb  H  E1  H            H  HtHǃ      1[]    H       f         AUATL	  UHLS    ÅtL    []A\A]    H    L    Åu~L    ÅuH     []A\A]    LL8  )H      Hh  E1Hǅ      H`  p  I       Hǅ`      LL8  eH       H  E1Hǅ       H     I       Hǅ       ff.         USHH  H      H  E1Hǃ      H    H       Hǃ      []    ff.          USHH  H       H  E1Hǃ       H    H       Hǃ      []    ff.          H  H   r  H  H  H         R  D	EH  D   H     H  EH L	H   	H L	II)H9ICL  H   H  H H  HH   H      H  H     H  H     H  H     H  H      H  H  $   H  H   (   H  H(  ,   H  H0  0   H  H8  4   H  H@  8   H  HH  <   H  HP  @   H  HX  D   H  H`  H   H  Hh  P   H  Hp  X   H  Hx  `   H  H  h   H  H  p   H  H  x   H  H     H  H   !  H  H  !  H  H  !  H  H  !  H  H  !  H  H  !  H  H  !  H  H  !  H  H   !  H  H  $!  H  H  (!  H  H  ,!  H  H   0!  H  H  4!  H  H  8!  H  H  <!  H  H   @!  H  H(  D!  H  H0  H!  H  H8  P!  H  H@  p!  H  HH  x!  H  HP  !  H  HX  !  H  H`  !  H  Hh  !  H  Hp  !  H  Hx  !  H  H  !  H  H  !  H  H  !  H  H  !  H  H  !  H  H  !  H  H  H0  H  H8  HH  H@  H  HH  H  Hǂx      Hp  Hp  H  Hx  H  H  H  HP  H  H  H  H  H  H  HǂX      H  Hǂ      Hǂ      Hǂ      Hǂ      Hǂ      Hǂ               	H  H     H  H     H  H     H   ff.         ATL  USHH  L    L          HE8tl    H    HE8t!    1ҋ  9C)9r^ƃ  H        H5    H[]A\H      u    H  H    H      \H5    H8      []A\    f.     @     SHft+f1[    H    H    H        uKf#C!ft&	Ѹ   uf1H    H        1f1H    H        1H    H        1i     ATA   UHS   HU t7      HE H tHE H    t[   ]A\    Au[1]A\    ff.     @     ATAUSHH`  AHA	D   @X  
   Ƨ      HHX      @tuA   DHDX  
   Ƨ      HHX      @tu[]A\    f    ATAUHA	SHD   @X  
   Ƨ      HE HX      @tuA   HHE DX  
   Ƨ      HE HX      @tuHE `  []A\    ff.     @     UHSHeH%(   HD$11HD$    fD$f1ۍ:     HfD\HHuf|$I   t7HT$eH+%(   uLH[]    H    H    H        f|$Nuf|$
Tuf|$Eu1f|$L    ff.          U  SHH       H(f{dt;{8t	[]    H߹      1Hߺ   1#[]    H  PH %H
    HH 1        d     H߾  ,     H     H     H߾         H      Hm1      	ff.          USHD  {]    C]D  H   HH   HH   HH 
       fHcfH   H   []    H    H    H        {] ^f1[]    H    H        H    H        rH    H        H    H        1ff.          ATIUSHfAD$H3    A$
   H  H   H  []A\    H    H    H        뤐    AWIAVAUAATAUSHHD  EgDD  IH  1I?  I?  I?  D     1IH
HH=   uA   1Eu+   DHL    D  AEAHA9t~D  D  AvD  AG@     9  KC	%  D  I   H2   I	AEHA9uD  H[]A\A]A^A_    HىH    H        W7  K%  H    H        $H    H    L$$    L$$FH    H    H        AG@KC	%  H    H        KC	H    H        H    H        H    H    H        HH    H    []A\A]A^A_    fH    H        fD      H    H       f    SHfH   HPt   tC\[    u-HqC\[    H    H    H        fHBH    H        H%     USHD  D  HD  H    P
       H    u1[]    H    fC^D  f=H      f=H   f=   D  Ha  D  V  H    H        hH    H        CH    H    H        f=Hu-D  ^  H    H    H        C^;D  1&D     H   D     f{d   DC8D  HkHHi  D  D  1HH    D  HH  1H3  H3  H3  Hń'  fhH    H        PD     QH    H        H    H        1H    H        <H    H           fH    H        pH    H        H    H        H    H    H        HkHHHH    D  C] HP   1   C 1K(C$D     1HH
HH=   u1HH
HH=   uD  {]   HH     HH    HH    HH    HH    HH    HH    HH    HH     HH$    HH(    HH,    HH0    HH4    HH8    HH<    HH@    HHD    HHH    HHP    HHX    HH`    HHh    HHp    HHx    HH    HH !   HH!   HH!   HH!   HH!   HH!   HH!   HH!   HH !   HH$!   HH(!   HH,!   HH0!   HH4!   HH8!   HH<!   HH@!   HHD!   HHH!   HHP!   HHp!   HHx!   HH!   HH!   HH!   HH!   HH!   HH!   HH!   HH!   HH!   HH!   HH!   HH!   D  H S%  wD|  
   HHH  C   H3  H    []      S
   HtH@  H    H        HH    H        HH    H        й   %   = @     =      { C   
   HS  $H    H    H        H    H    H        H    H        fwH    H        _HgS
      G   =H    H        UH    H        fH    H                18t    ATUSHH!  H7D!       9r'     D9r  D  []A\    f   H    H           f.         H H%            H H
               USHHhHhHH F     HPHH F     HPHH F     HhH@F []    ff.     f    AVJAUA   ATAUSHHD`ADDAHEAEhHH F     HPHH F A    AHD`HH F     AuHh[]A\A]A^        ATAUHSHH HAHA         1HHn      HA   H   HH   .F        HE H tHH         1HrHE H HM AHE XHE PHE H F     HE XHE H F     1f   []A\    D      AUATUHSHH HAHA         HHE XA   E1HE EXHE H F     HE XDDEHE XHE H F     AuHD[]A\A]    @     ATIU1S1ۉL    Ń@uf[]A\    ff.         ATIU1S1ۉL    Ń?u캺[L?   )]A\a    ATUHSff1E1H    fD]zHAH@ufAu%      f% f= @tf1[]A\    f1f   1H    H        H    H    H        mH    H        1f   H    H        1z        f?v1    SH   f% f= @uD_zH[    t$H<$    H<$t$uH1[        UHSHf   f% f= @u:1TzT HHuf[]    H    H    H        H    u[]    H[]H    H        ff.            SHf% f= @u   [        u1[    f            SHf% f= @u
   [        u1[             F    \  tt
t    F       F       H      HF    ff.     @     P      ff.     @     fP      ff.     @                HH    	   OH@  	
H@  NJH@  NJH@  NJH@  N JH@     JH@     JH@     JH@     J H@     J$H@    J(H@    J,H@    J0H@    J4H@     J8H@  (  J<H@  0  J@H@  8  JDH@  @  JHH@  H  JLH@  X  JP  H@  H΋6
H@  Ht6
HH   uH@        H@       H@       H@       H@       H@        H@  (     H@  0     H@  8     H@  @     H@        H@       H@      H@      H@       H@  (    H@  0    H@  8    H@  @    H@  H     H@  P  $  H@  X  (  H@  `  ,  HX  0  H`  4  Hh  8  Hp  <  Hx  @  H  D  H  H  H  L  H  P  H  T  H  X  H  \  H  `  H  d  H  h  H  l  H  p  H  t  H  x  H  |  H    H     H    H    H    H     H(    H0    H8    H@    HH    HP    HX    H`    Hh    Hp    Hx    H    H    H    H    H    H    H    H    H    H    H    H    H    H    H    H     H     H    H    H    H     H(    H0    G                       F   F   t  F  F     fD      $   D    fD      ATL	  UHLSH    H    H11H,H2HH=    t&0tuHcHLxuH1HcHH[]A\        t(wt       uH@      1    H@      1    ff.         t    H    HH,H HJHHHJHHHJHHHJH=    u    fD      AWAVAUATUSH^H$v      I	9FM  nL  L@        AH=             IH  AGM   AWШ   Ё       H4$HL1    A)x!Í4+LAD    D9~߃?   L    1H[]A\A]A^A_       A?   ?   )F:DLLD$)HIDHT$    HT$LD$fAWEL    MD$fA$AGL    hh^T@     ATLfUHH    SH        H    HH tHH     H    L    H8  H   HuH       HHd    HH    H tHH     HH[]A\        AWH@  AVAUATUSHH$FHT$       In	ʉV   =      X)CHH< H         IHtvE1x&Bt= H<$IcAM,D    fAE D9}AvAVH|$L    L    1H[]A\A]A^A_       ?   )FbҸf    ~Vt}F='  upUH	  SH0  HH@8uH    1[]       H    H    H    Hǃ  '     H      1[]        ff.         ~   UH	  SVHFt\\  H0  H@8tH   H    H    Hǃ  '     H      1[]    H    1[]                 HF0HF0    H@    H(H(
HF@HF@    H@    H(H(
F	H0  H@8F H<҃<V%'  F1    f    AWAVAUATUSHĀH   VL`  Lh  H$H  Lp  Lx  HD$H  HD$ H  HD$(H   HD$H  HD$  FI  H0  HH	  HA8   A@@   9Bƾ   9Gƾ@   t  A@ 9Bƾ   9Gƃ  HA8u1   H       HD$L`  HLh  H  H$Lp  H   HD$Lx  H  HD$ L$0H  HD$(H  HD$H       L$0H쀉[]A\A]A^A_    Ht$0H߾       H0  LD$0H      H  L  L   Hh  Lh  HL$PHL$L`  Hp  HD$@H  H$L  H  L\$xH   HL$H   Hx  HT$8H  HL$ LT$pLL$hLD$`Ht$XHD$HH|$0HL`  Lp  Lx  H  HL$(H  HL$H       H    HD$@H|$0HL$PL\$xHh  HT$8LT$pLL$hHx  HLD$`Ht$XH  HD$HL`  Hp  L  L   L  H  H       Cǅ  ' H    H      1H߉D$0    L$0        SHǇ  '     H  [    ff.         HǇ          f.         UHS?HtEuKHcV     HF(HH
HH9    ;8uHp>     []    FE []    wtHv;{             ff.         USHHHc(  eH%(   HD$1    ;-          ;-           ;-      S  ƃ  ;-      ǃ     ;-      ǃ           ;-      ǃ          ;-    7  f          9     ;-       ǃ  H   ;-       ǃ      ;-    rZƃ  HD$eH+%(     H[]    HcH  H                H    H|$D$D$  HcH  H          KHcH  H          g
HcH    H|$    D$CD$f  HcH  H          YHcH  H          HcH    H|$    D$D$  HcH    H|$    D$L$  HcH  H          a  6            H    H        H    H        H    H    H        H        Et'AuHIHI       sM    E  I  H            [H    ]    H  H            H0  H            H0  H            H0  H            H            I$0  H            I$0  H            H            I$0  H              tdthH    H    HDHH        Hǃ4  '         1HH    4      H        H    H    H        H        H        [H    ]    HsHKH        CE     Hv9{$r؉[H    ]    Hvtu[H    ]    [H    ]    H        H            H            H            H                  H        H     H        ixgb_clean_rx_irq                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               debug                                                                             H                                                        H                            H                                                                  copybreak               Copyright (c) 1999-2008 Intel Corporation.      ixgb_check_for_bad_link         ixgb_check_for_link     ixgb_rar_set            ixgb_hash_mc_addr               ixgb_mc_addr_list_update        ixgb_setup_fc   ixgb_clear_hw_cntrs     mac_addr_valid          ixgb_init_rx_addrs              ixgb_identify_xpak_vendor       ixgb_identify_phy       ixgb_init_hw            ixgb_adapter_stop               ixgb_get_ee_mac_addr            ixgb_get_eeprom_data                            strnlen strscpy                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                H                                                                                                                                                                                                                                                                                                                                                                             @                                                            @              IntDelayEnable  	                              FCReqTimeout                    	                              RxFCLowThresh                   	                              RxFCHighThresh                  	                              RxIntDelay                      	                              TxIntDelay                      	                              XsumRX                          	                              FlowControl                     	                              RxDescriptors                   	                              TxDescriptors                   	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              6ixgb: %s
 ixgb include/linux/dma-mapping.h TX DMA map failed
 ixgb_init_hw failed
 unsupported device id
 Invalid MAC Address
 RX RX/TX None TX NIC Link is Down
 ixgb: %s
 ixgb: Clearing RAR[1-15]
 ixgb: Clearing MTA
 ixgb: MC Addr #%d = %pM
 ixgb: Hash value = 0x%03X
 ixgb: MC Update Complete
 ixgb: Identified CX4
 ixgb: New MAC Addr = %pM
 ixgb: Zeroing the MTA
 ixgb MAC address is all zeros
 MAC address is broadcast
 MAC address is multicast
 %s
 MC Update Complete
 Hash value = 0x%03X
 MC Addr #%d = %pM
 Clearing MTA
 Clearing RAR[1-15]
 New MAC Addr = %pM
 Zeroing the MTA
 Issuing an EE reset to MAC
 Identified G6005 optics
 Identified TXN17201 optics
 Identified CX4
 Identified G6104 optics
 Identified TXN17401 optics
 Masking off all interrupts
 ixgb: %s
 ixgb: Reading eeprom data
 ixgb: Checksum invalid
 ixgb: Signature invalid
 ixgb eeprom mac address = %pM
 %s
 Signature invalid
 Checksum invalid
 Reading eeprom data
 memcpy 6ixgb: %s Enabled
 6ixgb: %s Disabled
 6ixgb: %s set to %i
 6ixgb: %s
 Flow Control Disabled Flow Control Receive Only Flow Control Transmit Only Flow Control Enabled Flow Control Hardware Default Tx Interrupt Delay Enable defaulting to Enabled Transmit Interrupt Delay using default of 32 Receive Interrupt Delay using default of 72 using default of 0xFFFF Rx Flow Control Low Threshold using default of 0x28000 using default of 0x30000 Flow Control Receive Checksum Offload Receive Descriptors using default of 512 Transmit Descriptors using default of 256                                                       %s %s: rejecting DMA map of vmalloc memory
     Detected Tx Unit Hang
  TDH                  <%x>
  TDT                  <%x>
  next_to_use          <%x>
  next_to_clean        <%x>
buffer_info[next_to_clean]
  time_stamp           <%lx>
  next_to_watch        <%x>
  jiffies              <%lx>
  next_to_watch.status <%x>
     ixgb: Receive packet consumed multiple buffers length<%x>
      drivers/net/ethernet/intel/ixgb/ixgb_main.c     Unable to allocate interrupt Error: %d
 3ixgb: can't bring device back up after reset
 Cannot re-enable PCI device after reset
        After reset, the EEPROM checksum is not valid
  field "netdev->perm_addr" at drivers/net/ethernet/intel/ixgb/ixgb_main.c:2248   memcpy: detected field-spanning write (size %zu) of single %s (size %zu)
       After reset, invalid MAC address
       3ixgb: No usable DMA configuration, aborting
  The EEPROM Checksum Is Not Valid
       Intel(R) PRO/10GbE Network Connection
  NIC Link is Up 10 Gbps Full Duplex, Flow Control: %s
   Receive packet consumed multiple buffers length<%x>
    ixgb: MAC address is multicast
 ixgb: MAC address is broadcast
 ixgb: MAC address is all zeros
 drivers/net/ethernet/intel/ixgb/ixgb_hw.c       ixgb: Exiting because the adapter is already stopped!!!
        ixgb: Masking off all interrupts
       ixgb: Issuing a global reset to MAC
    ixgb: Adding the multicast addresses:
  ixgb: Added a multicast address to RAR[%d]
     ixgb: MC filter type param set incorrectly
     ixgb: XPCSS Not Aligned while Status:LU is set
 ixgb: Issuing an EE reset to MAC
       ixgb: Identified TXN17401 optics
       ixgb: Identified TXN17201 optics
       ixgb: Identified G6005 optics
  ixgb: Identified G6104 optics
  ixgb: Unknown physical layer module
    ixgb: Keeping Permanent MAC Addr = %pM
 ixgb: Overriding MAC Address in RAR[0]
 ixgb: MAC address invalid after ixgb_init_rx_addrs
     ixgb: Exiting because the adapter is stopped!!!
        ixgb: Flow control param set incorrectly
       ixgb: BAD LINK! too many LFC/RFC since last check
      Exiting because the adapter is stopped!!!
      BAD LINK! too many LFC/RFC since last check
    XPCSS Not Aligned while Status:LU is set
       Flow control param set incorrectly
     MC filter type param set incorrectly
   Added a multicast address to RAR[%d]
   Adding the multicast addresses:
        Overriding MAC Address in RAR[0]
       Keeping Permanent MAC Addr = %pM
       MAC address invalid after ixgb_init_rx_addrs
   Issuing a global reset to MAC
  Unknown physical layer module
  Exiting because the adapter is already stopped!!!
      drivers/net/ethernet/intel/ixgb/ixgb_ee.c       ixgb: eeprom mac address = %pM
 drivers/net/ethernet/intel/ixgb/ixgb_param.c    6ixgb: Invalid %s specified (%i) %s
   5ixgb: Warning: no configuration for board #%i
        5ixgb: Using defaults for all values
  6ixgb: Ignoring RxFCHighThresh when no RxFC
   6ixgb: Ignoring RxFCLowThresh when no RxFC
    6ixgb: Ignoring FCReqTimeout when no RxFC
     6ixgb: RxFCHighThresh must be >= (RxFCLowThresh + 8), Using Defaults
  Flow Control Pause Time Request Rx Flow Control High Threshold  reading default settings from EEPROM parm=debug:Debug level (0=none,...,16=all) parmtype=debug:int license=GPL v2 description=Intel(R) PRO/10GbE Network Driver author=Intel Corporation, <linux.nics@intel.com> parm=copybreak:Maximum size of packet that is copied to a new buffer on receive parmtype=copybreak:uint parm=IntDelayEnable:Transmit Interrupt Delay Enable parmtype=IntDelayEnable:array of int parm=FCReqTimeout:Flow Control Request Timeout parmtype=FCReqTimeout:array of int parm=RxFCLowThresh:Receive Flow Control Low Threshold parmtype=RxFCLowThresh:array of int parm=RxFCHighThresh:Receive Flow Control High Threshold parmtype=RxFCHighThresh:array of int parm=RxIntDelay:Receive Interrupt Delay parmtype=RxIntDelay:array of int parm=TxIntDelay:Transmit Interrupt Delay parmtype=TxIntDelay:array of int parm=XsumRX:Disable or enable Receive Checksum offload parmtype=XsumRX:array of int parm=FlowControl:Flow Control setting parmtype=FlowControl:array of int parm=RxDescriptors:Number of receive descriptors parmtype=RxDescriptors:array of int parm=TxDescriptors:Number of transmit descriptors parmtype=TxDescriptors:array of int alias=pci:v00008086d00001B48sv*sd*bc*sc*i* alias=pci:v00008086d00001A48sv*sd*bc*sc*i* alias=pci:v00008086d0000109Esv*sd*bc*sc*i* alias=pci:v00008086d00001048sv*sd*bc*sc*i* depends= retpoline=Y intree=Y name=ixgb vermagic=6.1.0-37-amd64 SMP preempt mod_unload modversions                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  (                 (                         (    0  8  X  8  0  (                     X                                                                   (    0  8    8  0  (                                                                            (    0  8    8  0  (                                                                              (  0  (                   0  (                   0                                                             0               0                       (  8  (                 8                                                                                                         (                 (                                                                                                                                           (                 (                 (                                                                                                                          0            0  8                                                                                                                                             0          0                                                                                                                     (    0  8  @  8  0  (                     @  8  0  (                     @                                                                                                                                                                       (  0  (                                                                        (                                                                                                                                                                                                                                                                                                                                                                                         (    0  8  P  8  0  (                     P                                                      (    0  8  H  8  0  (                     H                                                                                           (    0  8    8  0  (                                                         P                                                 (          (                                        (                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          .    alloc_etherdev_mqs                                      ;JQ    free_irq                                                ΰ    is_vmalloc_addr                                         §s%    param_ops_uint                                          R    pci_enable_device                                       S>    skb_put                                                 V_    __napi_alloc_skb                                        #WK    consume_skb                                             ,X    netif_napi_add_weight                                   6    queue_work_on                                           @    unregister_netdev                                       o4    dma_unmap_page_attrs                                    ׂ    __pci_register_driver                                   S9    iounmap                                                 "T͎    pci_disable_msi                                         j    param_array_ops                                         ;䒲    pci_request_regions                                     8߬i    memcpy                                                  z    kfree                                                   X    eth_validate_addr                                       ܐ    timer_delete_sync                                       i    pci_ioremap_bar                                         *v    pci_unregister_driver                                       fortify_panic                                           ,    netdev_err                                              m    __fentry__                                              y_,    pskb_expand_head                                        ם    dev_driver_string                                       (
    dev_addr_mod                                            y6    eth_type_trans                                          ٣    dma_map_page_attrs                                      "    napi_complete_done                                      ~    _printk                                                 V
    __stack_chk_fail                                        a*    __napi_schedule                                             strnlen                                                 BW\    netif_device_detach                                     I@    vzalloc                                                 "*    netif_device_attach                                     ^|    page_offset_base                                        u#    synchronize_irq                                         -~    pci_enable_msi                                          9I    _dev_err                                                Ւ    request_threaded_irq                                        mod_timer                                               \g    __dev_kfree_skb_irq                                     MxN    dma_alloc_attrs                                         p*    napi_enable                                                  netif_receive_skb                                       xB<    register_netdev                                         f    strncpy                                                 m    free_netdev                                             (L    phys_base                                               S    _find_next_bit                                          ^    ethtool_op_get_link                                     a    netif_tx_wake_queue                                     ŏW    memset                                                  U<!)    pci_set_master                                          9[    __x86_return_thunk                                      #    __netdev_alloc_skb                                      e,    skb_trim                                                P    jiffies                                                     dma_set_coherent_mask                                   le    vmemmap_base                                            9d    strscpy                                                 Tn    dma_free_attrs                                              vfree                                                   9c    init_timer_key                                          b    pci_release_regions                                         __const_udelay                                          @    __dev_kfree_skb_any                                     eb,    __dynamic_pr_debug                                      -    cancel_work_sync                                        GV    __warn_printk                                               netif_carrier_off                                       I    netif_carrier_on                                        C6    pci_disable_device                                      G}    dma_set_mask                                            wX    kmalloc_trace                                               napi_schedule_prep                                      ұ    napi_disable                                                 param_ops_int                                               msleep                                                  E:#    __kmalloc                                               -    kmalloc_caches                                          _5    netdev_info                                             Ӆ3-    system_wq                                               zR    module_layout                                                   L		        	        L		        	        	        		        N          i                    	                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               Intel(R) PRO/10GbE Network Driver ixgb                          rx_packets                             0  tx_packets                             8  rx_bytes                               @  tx_bytes                               H  rx_errors                              P  tx_errors                              X  rx_dropped                             `  tx_dropped                             h  multicast                              p  collisions                             x  rx_over_errors                           rx_crc_errors                            rx_frame_errors                          rx_no_buffer_count                    h  rx_fifo_errors                           rx_missed_errors                         tx_aborted_errors                        tx_carrier_errors                        tx_fifo_errors                           tx_heartbeat_errors                      tx_window_errors                         tx_deferred_ok                        8  tx_timeout_count                        tx_restart_queue                        rx_long_length_errors                 x  rx_short_length_errors                p  tx_tcp_seg_good                       H  tx_tcp_seg_failed                     P  rx_flow_control_xon                     rx_flow_control_xoff                    tx_flow_control_xon                     tx_flow_control_xoff                    rx_csum_offload_good                    rx_csum_offload_errors                  tx_csum_offload_good                    tx_csum_offload_errors                                                                                                                                                                                                                                                                                                                                                                                       Y                                                     T                                                     O                                                     K                                                                                                                                                                                                                                                                         {                                                                                                          i                                                     -                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            {                                                     z                                                     u                                                     i                                                     H                                                     =                                                     !                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       v                                                      l                                                      f                                                                                                                                                                                                                                                                                                                                                                                                                                                   ixgb                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     GCC: (Debian 12.2.0-14+deb12u1) 12.2.0  GCC: (Debian 12.2.0-14+deb12u1) 12.2.0  GCC: (Debian 12.2.0-14+deb12u1) 12.2.0  GCC: (Debian 12.2.0-14+deb12u1) 12.2.0  GCC: (Debian 12.2.0-14+deb12u1) 12.2.0  GCC: (Debian 12.2.0-14+deb12u1) 12.2.0             4           A=     R=    ]=    k=    X          y=     =    =    =    =    =    =    Z          >     >    6>    \          G>     T>    e>    v>    >    >    ^          >     >    >    >    `          >      ?    ?    $?    7?    J?    b?    b          q?     ?    ?    ?    d ?      ? *       ? *       ? &   @   ? K   P   c  _ `   ?      \y c     w e     c  a @   ?     ?        FO  k   @   \ f      g    h *   `  @ *     @ Y    [   @ *     &@ *      5@ *      B@ 	  @  P@ *     \@ *     h@ *      K     w@ K     u &     q3 &       $     @ &      @ &   0  @ *   @  @ *   `  @ *     @ *     @ &     ]a i   @       @ *   @  @ *   `             +     @          h            &               
K     j @    l       
K   z    @    n       
      j  A    p 
A    p A    l 1A    p       
      j "  *   ^  *   EA    u       
      j   O-  ,  *   UA    w       
      j bA    oA *   hS *   }A    y A    l       
]   j A    | A    l       
*     j A     A      A +      ơ  +  @     +  P     $   `    $   h   e +  p   A      A +      B +  @     $   `   B $   h    +  p   B 
     'B $       -B $      3B +     9B $       ?B $   (   EB +  0   B +  @     $   `   g  $   h   a< +  p   KB <    YB -       ^B -   @   cB -      iB -      oB -      uB -   @  {B -     B -     B -      B -   @  B -     B -     B -      B -   @  B -     B -     B -      B -   @  B -     B -     B -      B -   @  B -     B -     B -      F -   @  B -     B -     B -      B -   @  B -     C -     C -      
C -   @  C -     C -     C -    	  %C -   @	  +C -   	  1C -   	  7C -    
  =C -   @
  CC -   
  HC -   
  MC -      PC -   @  WC -     ]C -     dC -      iC -   @  mC -     qC -     vC -    
  {C -   @
  C -   
  C -   
  C -      C -   @  C -     C -     C              i  W   @   {V       ơ  &      C &      C &      C   (   s  k       i  W   @                   C       C       C             D       t  I      D   @  !D *   @  +D *   `  9D *     BD &     MD &     YD Q    _     iD    @  wD      D *     D -      D -   @  D *     D *     D K     D K     W     D -   @  E -     E *     E K     B  f      %  %  Z   %    h  &  'E &   .  0   .  2E *   =  GE K   =  ]      >  PE      ]E                                             iE    R  xE    cO        
\  Z     X  E           
    %   A   a	 &   E     E           
    W  E    E     E    # E    N        
    W  F           
    %  SP    F     (F            
     %  =F    EF           
}	      %  UF     eF    }Y        
     %  sF           
    %    k   F     F     F     F           
    W  C  F     F           
   W  G     G           
    %  3G     >G     HG    R  TG            
    %      _G           
   %      qG     G           
    W  G K   G     G     G       G    p   G      z 	      G +  0    {k @   G +     G +     @ +     h +     u +     q3 +     
H +     H     'H +     3H +    DH $      MH $   (    0   +               +                   +                      
&     j VH    Ĉ lH           
      j z    H    ǈ       
+    j ,  &   H    Ɉ H    l       
&     j "  &   H    ̈       
      j "  &     &   H    Έ H    p I    l I    p       
      j   &     &   3I    ӈ          GI     TI    _I   ,   jI        c        vI       I    @             ֈ    $   I           
     %  "
 *        I    و       
     %  0  I?      I    ۈ       
    %  2"
    I    ݈       
    %    ?  I    ߈       
    %  9.  4?  I 5?   s	  I           
     %  9.  4?  I 5?   s	  J           
     %  "J ?  *J           
    %  ]a -?  *    ;J     KJ     [J           
     %    ?    k   oJ     }J           
     %    *   J           
*    %  J           
    %  T =?  J           
     %  T =?  J           
    %  : }?  J     J           
    %  : z?  	K              !K     /K    <K             ]         b         HK                    @          
          B             @                    T             VK   0   c       V     @                 b             
                          
         bK            
9                 X          
	 ixgb_mac_unknown ixgb_82597 ixgb_num_macs ixgb_mac_type ixgb_phy_type_unknown ixgb_phy_type_g6005 ixgb_phy_type_g6104 ixgb_phy_type_txn17201 ixgb_phy_type_txn17401 ixgb_phy_type_bcm ixgb_phy_type ixgb_xpak_vendor_intel ixgb_xpak_vendor_infineon ixgb_xpak_vendor ixgb_fc_none ixgb_fc_rx_pause ixgb_fc_tx_pause ixgb_fc_full ixgb_fc_default ixgb_fc_type ixgb_bus_type_unknown ixgb_bus_type_pci ixgb_bus_type_pcix ixgb_bus_type ixgb_bus_speed_unknown ixgb_bus_speed_33 ixgb_bus_speed_66 ixgb_bus_speed_100 ixgb_bus_speed_133 ixgb_bus_speed_reserved ixgb_bus_speed ixgb_bus_width_unknown ixgb_bus_width_32 ixgb_bus_width_64 ixgb_bus_width ixgb_fc high_water low_water pause_time send_xon ixgb_bus ixgb_hw hw_addr phy_addr mac_type max_frame_size mc_filter_type num_mc_addrs curr_mac_addr num_tx_desc num_rx_desc rx_buffer_size adapter_stopped subsystem_vendor_id subsystem_id bar0 bar1 bar2 bar3 pci_cmd_word io_base lastLFC lastRFC ixgb_link_reset mac_addr_valid ixgb_led_off ixgb_led_on ixgb_check_for_bad_link ixgb_check_for_link ixgb_write_vfta ixgb_rar_set mc_addr_list mc_addr_count ixgb_mc_addr_list_update ixgb_init_hw ixgb_identify_xpak_vendor ixgb_adapter_stop ixgb_mac_reset ixgb_rx_desc buff_addr ixgb_tx_desc cmd_type_len popts ixgb_context_desc ipcss ipcso ipcse tucss tucso tucse ixgb_hw_stats tprl tprh gprcl gprch bprcl bprch mprcl mprch uprcl uprch vprcl vprch jprcl jprch gorcl gorch torl torh rnbc ruc roc rlec crcerrs icbc ecbc tptl tpth gptcl gptch bptcl bptch mptcl mptch uptcl uptch vptcl vptch jptcl jptch gotcl gotch totl toth dc plt64c tsctc tsctfc ibic rfc lfc pfrc pftc mcfrc mcftc xonrxc xontxc xoffrxc xofftxc rjc ixgb_buffer next_to_watch mapped_as_page ixgb_desc_ring next_to_use next_to_clean buffer_info ixgb_adapter active_vlans bd_number rx_buffer_len part_num link_speed link_duplex tx_timeout_task restart_queue timeo_start tx_cmd_type hw_csum_tx_good hw_csum_tx_error tx_int_delay tx_timeout_count tx_int_delay_enable detect_tx_hung hw_csum_rx_error hw_csum_rx_good rx_int_delay rx_csum msg_enable alloc_rx_buff_failed have_msi ixgb_state_t __IXGB_DOWN ixgb_io_resume ixgb_io_slot_reset ixgb_io_error_detected ixgb_vlan_rx_kill_vid ixgb_vlan_rx_add_vid cleaned_count ixgb_alloc_rx_buffers ixgb_clean ixgb_intr ixgb_update_stats ixgb_change_mtu ixgb_tx_timeout_task txqueue ixgb_tx_timeout ixgb_xmit_frame ixgb_watchdog ixgb_set_multi ixgb_set_mac ixgb_clean_rx_ring ixgb_free_rx_resources ixgb_clean_tx_ring ixgb_unmap_and_free_tx_resource ixgb_free_tx_resources ixgb_setup_rx_resources ixgb_setup_tx_resources ixgb_close ixgb_open ixgb_remove ixgb_probe ixgb_set_features ixgb_fix_features ixgb_reset kill_watchdog ixgb_down ixgb_up ixgb_exit_module ixgb_init_module ixgb_ee_map_type compatibility pba_number init_ctrl_reg_1 init_ctrl_reg_2 oem_reserved swdpins_reg circuit_ctrl_reg d3_power d0_power ixgb_get_ee_device_id ixgb_get_ee_pba_number ixgb_get_ee_mac_addr ixgb_get_eeprom_word ixgb_get_eeprom_data ixgb_read_eeprom ixgb_write_eeprom ixgb_update_eeprom_checksum ixgb_validate_eeprom_checksum ixgb_standby_eeprom ixgb_shift_out_bits NETDEV_STATS IXGB_STATS ixgb_stats stat_string sizeof_stat stat_offset ixgb_set_ethtool_ops ixgb_get_strings ixgb_get_ethtool_stats ixgb_get_sset_count ixgb_set_phys_id kernel_ring ixgb_set_ringparam ixgb_get_ringparam drvinfo ixgb_get_drvinfo ixgb_set_eeprom ixgb_get_eeprom ixgb_get_eeprom_len ixgb_get_regs ixgb_get_regs_len ixgb_set_msglevel ixgb_get_msglevel ixgb_set_pauseparam ixgb_get_pauseparam ixgb_set_link_ksettings ixgb_set_speed_duplex ixgb_get_link_ksettings enable_option range_option list_option ixgb_opt_list ixgb_option ixgb_check_options ixgb.ko dG                                                                                                   	                                                                                                               "                      #                      )                      ,                      P      +            {      +       +           +       @           +       U           	       l                    y                             	                  
            $      <                                       $                                        E            `      "                  +       *             (      6            K       B    p       `       b           I       x           I           p      Q                                               `                 P      E         "                         K                         )                
   #         8       "                 2          y       S    P
            c   	         5       x                    	 5                         K          	 O                 	 ]                                 "                   	 u       H                 O      \                                      "   ,                1    /             ?    p#      *       T   	        m       d    #      Z       {    #      i           $                 $      ~           &      %         	 *                                   %                   '                &            +       ;    +              T            (       b                 t    >                  M       .           {       1                                   0                  P                             (       (       "          
       8                    =                   B    0             Q   #        8       j   #        8                           # 8       8          # p       8           p1      q           1                 2             
    @3             '   # 0	      8       @                  K    4      "      Z   # H
      8       s   # 	      8          # 	      8          # h	      8           p                # 
      8          #       8           h      
          #       8           #       8       9   # `      8       R   #       8       k   # (      8          #       8          #       8          #       8          # H      8                                            #       8          #       8       0    P             ;   #       8       T   #        8       m   #       8          #       8          #       8          #       8          #       8           X      
          #       8       	    @             	   # 8      8       4	   #       8       M	   # P      8       f	   #       8       	   # x      8       	   # @      8       	   #       8       	   # X      8       	   #       8       	   # p      8       
                   
   #       8       9
   #        8       R
   # P      8       k
   # h      8       
                 
                 
   #       8       
   # 0      8       
   #       8       
    0             
                   
    PC             	    C                #       8       5   # `      8       M   # 
      8       e   # (      8       0                 }   # 
      8          # 
      8       
                      0
                  I      Q           I                  J                  J                 0J      m      
    P                 P      *       1    P             E     Q      p       \           0      p    pQ      E           Q      J           R               	                  S                	              0                 
                     pT                U             
     V             
    V      ~       2
    PW            E
           0      V
    0[             r
   	       s       
   , (              
   , $              
   ,               
   ,                
   ,               
   ,               
   ,                  ,                  ,               &   ,               9    
      0       `      
      $                  $       @          0       F          0       v      	      $       L     	      0                  $       R    `	      0       i            $       X    	      0            `      $       ^    	      0       x           $       d     
      0       V     	      $       j    `
      0            `	      $       p    
      0            	      $       v   	 B                 @      P                 4           H      %           P       (                        
                   %    m      /       A          #       a    x       (       v    @      
           `                        6                 $                  (                                          0          8       N    Q      %       p           (                                              v      (                 !                  (                                            6          )       P          !       n          (           @                 `                  	      7           @                 @      (                                              ]      &       /          "       N    h      (       b                 z                            1                 $                 (            
                   
                        2       7    ,      $       X          (       n    @
                 `
              
     
                                       B                                                           &                 P:      )                                                ,                     4                     E    '      b       \                     h   *               v                                                                                                             H      _                                                                                         #                     7                     >                     D                     V    F      5       t     I      7                                [      *                                                                                                                            E                                                                      *                     9                     L                                          _                     p                         6                0G                                                           P      t           @I      8                                                     D      K                           *                     :                  _                     n    9                                      0C                                                           pH                                      9                                                                                                                       &                     2    (            D    @5      "      V                     `    P(      b       w                                                                                                                                                                                                 F      ?                            -                     :                     B                     Q                     W    p6      o       d                     s                                                                                                                                                       p%                                       "             !                     4    C             @                     M    Z      %       c                k                     y                                                                   E                 [                                                                                                                   
                      __UNIQUE_ID_alias197 __UNIQUE_ID_alias196 __UNIQUE_ID_alias195 __UNIQUE_ID_alias194 __UNIQUE_ID_depends193 ____versions __UNIQUE_ID_retpoline192 __UNIQUE_ID_intree191 __UNIQUE_ID_name190 __UNIQUE_ID_vermagic189 _note_10 _note_9 ixgb_fix_features ixgb_init_module ixgb_driver_string ixgb_copyright ixgb_driver ixgb_remove ixgb_unmap_and_free_tx_resource ixgb_vlan_rx_kill_vid ixgb_vlan_rx_add_vid ixgb_set_mac ixgb_exit_module ixgb_intr ixgb_clean_rx_ring ixgb_alloc_rx_buffers __already_done.37 ixgb_set_multi ixgb_clean __UNIQUE_ID_ddebug613.1 ixgb_tx_timeout __ixgb_maybe_stop_tx.constprop.0 ixgb_xmit_frame ixgb_xmit_frame.cold ixgb_clean_tx_ring ixgb_up.cold ixgb_io_resume ixgb_io_resume.cold ixgb_reset.cold ixgb_io_slot_reset __already_done.0 ixgb_io_slot_reset.cold ixgb_probe ixgb_netdev_ops cards_found.52 ixgb_watchdog ixgb_tx_timeout_task ixgb_probe.cold ixgb_io_error_detected ixgb_change_mtu ixgb_close ixgb_set_features ixgb_open ixgb_watchdog.cold __func__.54 __UNIQUE_ID___addressable_cleanup_module608 __UNIQUE_ID___addressable_init_module607 __UNIQUE_ID_debug606 __UNIQUE_ID_debugtype605 __param_debug __param_str_debug __UNIQUE_ID_license604 __UNIQUE_ID_description603 __UNIQUE_ID_author602 ixgb_pci_tbl ixgb_err_handler __UNIQUE_ID_copybreak601 __UNIQUE_ID_copybreaktype600 __param_copybreak __param_str_copybreak .LC3 .LC6 mac_addr_valid __UNIQUE_ID_ddebug471.16 __UNIQUE_ID_ddebug473.15 __func__.7 __UNIQUE_ID_ddebug477.13 __UNIQUE_ID_ddebug475.14 ixgb_link_reset ixgb_write_phy_reg.constprop.0 ixgb_read_phy_reg.constprop.0 ixgb_identify_xpak_vendor __UNIQUE_ID_ddebug395.54 __func__.9 ixgb_mac_reset __UNIQUE_ID_ddebug385.59 __UNIQUE_ID_ddebug389.57 __UNIQUE_ID_ddebug391.56 __UNIQUE_ID_ddebug393.55 __func__.12 __UNIQUE_ID_ddebug387.58 __UNIQUE_ID_ddebug455.24 __func__.2 __UNIQUE_ID_ddebug435.34 __UNIQUE_ID_ddebug437.33 __UNIQUE_ID_ddebug439.32 __UNIQUE_ID_ddebug445.29 __UNIQUE_ID_ddebug441.31 __UNIQUE_ID_ddebug443.30 __UNIQUE_ID_ddebug451.26 __UNIQUE_ID_ddebug447.28 __UNIQUE_ID_ddebug449.27 __func__.3 __func__.4 __UNIQUE_ID_ddebug453.25 __UNIQUE_ID_ddebug461.21 __func__.1 __UNIQUE_ID_ddebug463.20 __UNIQUE_ID_ddebug415.44 __UNIQUE_ID_ddebug417.43 __UNIQUE_ID_ddebug419.42 __UNIQUE_ID_ddebug397.53 __UNIQUE_ID_ddebug407.48 __UNIQUE_ID_ddebug409.47 __func__.11 __UNIQUE_ID_ddebug405.49 __func__.10 __UNIQUE_ID_ddebug413.45 __UNIQUE_ID_ddebug399.52 __UNIQUE_ID_ddebug403.50 __UNIQUE_ID_ddebug425.39 __UNIQUE_ID_ddebug429.37 __UNIQUE_ID_ddebug431.36 __UNIQUE_ID_ddebug433.35 __UNIQUE_ID_ddebug421.41 __UNIQUE_ID_ddebug401.51 __UNIQUE_ID_ddebug411.46 __func__.8 __UNIQUE_ID_ddebug427.38 __UNIQUE_ID_ddebug423.40 __UNIQUE_ID_ddebug467.18 __UNIQUE_ID_ddebug457.23 __func__.5 __func__.6 __UNIQUE_ID_ddebug469.17 __UNIQUE_ID_ddebug459.22 __UNIQUE_ID_ddebug465.19 __func__.0 .LC4 ixgb_standby_eeprom ixgb_shift_out_bits __UNIQUE_ID_ddebug315.7 __UNIQUE_ID_ddebug317.6 __UNIQUE_ID_ddebug321.4 __UNIQUE_ID_ddebug319.5 __UNIQUE_ID_ddebug323.3 __UNIQUE_ID_ddebug325.2 .LC0 ixgb_get_pauseparam ixgb_get_msglevel ixgb_set_msglevel ixgb_get_regs_len ixgb_get_regs ixgb_get_eeprom_len ixgb_get_ringparam ixgb_get_sset_count ixgb_get_ethtool_stats ixgb_gstrings_stats ixgb_set_phys_id ixgb_get_strings ixgb_set_eeprom ixgb_set_eeprom.cold ixgb_get_drvinfo ixgb_get_drvinfo.cold ixgb_get_eeprom ixgb_set_link_ksettings ixgb_set_pauseparam ixgb_get_link_ksettings ixgb_set_ringparam ixgb_ethtool_ops ixgb_validate_option.isra.0 ixgb_validate_option.isra.0.cold num_TxDescriptors num_RxDescriptors num_XsumRX num_FlowControl num_RxFCHighThresh num_RxFCLowThresh num_FCReqTimeout num_RxIntDelay num_TxIntDelay num_IntDelayEnable opt.10 opt.1 opt.2 opt.3 opt.4 opt.5 opt.6 opt.7 opt.8 opt.9 ixgb_check_options.cold fc_list.0 __UNIQUE_ID_IntDelayEnable619 __UNIQUE_ID_IntDelayEnabletype618 __param_IntDelayEnable __param_str_IntDelayEnable __param_arr_IntDelayEnable __UNIQUE_ID_FCReqTimeout617 __UNIQUE_ID_FCReqTimeouttype616 __param_FCReqTimeout __param_str_FCReqTimeout __param_arr_FCReqTimeout __UNIQUE_ID_RxFCLowThresh615 __UNIQUE_ID_RxFCLowThreshtype614 __param_RxFCLowThresh __param_str_RxFCLowThresh __param_arr_RxFCLowThresh __UNIQUE_ID_RxFCHighThresh613 __UNIQUE_ID_RxFCHighThreshtype612 __param_RxFCHighThresh __param_str_RxFCHighThresh __param_arr_RxFCHighThresh __UNIQUE_ID_RxIntDelay611 __UNIQUE_ID_RxIntDelaytype610 __param_RxIntDelay __param_str_RxIntDelay __param_arr_RxIntDelay __UNIQUE_ID_TxIntDelay609 __UNIQUE_ID_TxIntDelaytype608 __param_TxIntDelay __param_str_TxIntDelay __param_arr_TxIntDelay __UNIQUE_ID_XsumRX607 __UNIQUE_ID_XsumRXtype606 __param_XsumRX __param_str_XsumRX __param_arr_XsumRX __UNIQUE_ID_FlowControl605 __UNIQUE_ID_FlowControltype604 __param_FlowControl __param_str_FlowControl __param_arr_FlowControl __UNIQUE_ID_RxDescriptors603 __UNIQUE_ID_RxDescriptorstype602 __param_RxDescriptors __param_str_RxDescriptors __param_arr_RxDescriptors __UNIQUE_ID_TxDescriptors601 __UNIQUE_ID_TxDescriptorstype600 __param_TxDescriptors __param_str_TxDescriptors __param_arr_TxDescriptors alloc_etherdev_mqs ixgb_check_for_bad_link free_irq is_vmalloc_addr ixgb_setup_rx_resources ixgb_init_hw param_ops_uint pci_enable_device skb_put __napi_alloc_skb ixgb_free_tx_resources consume_skb __this_module netif_napi_add_weight queue_work_on unregister_netdev dma_unmap_page_attrs __pci_register_driver ixgb_get_eeprom_word iounmap cleanup_module pci_disable_msi param_array_ops pci_request_regions memcpy kfree eth_validate_addr ixgb_validate_eeprom_checksum ixgb_get_ee_pba_number timer_delete_sync ixgb_check_options pci_ioremap_bar pci_unregister_driver fortify_panic netdev_err __fentry__ pskb_expand_head dev_driver_string dev_addr_mod eth_type_trans dma_map_page_attrs napi_complete_done __stack_chk_fail __napi_schedule ixgb_mc_addr_list_update ixgb_get_eeprom_data strnlen netif_device_detach ixgb_reset ixgb_get_ee_device_id vzalloc netif_device_attach ixgb_write_eeprom page_offset_base synchronize_irq __mod_pci__ixgb_pci_tbl_device_table pci_enable_msi ixgb_check_for_link _dev_err ixgb_led_off request_threaded_irq mod_timer ixgb_get_ee_mac_addr __dev_kfree_skb_irq ixgb_write_vfta dma_alloc_attrs napi_enable netif_receive_skb strncpy free_netdev ixgb_update_stats ixgb_adapter_stop phys_base ixgb_free_rx_resources _find_next_bit ethtool_op_get_link netif_tx_wake_queue memset pci_set_master __x86_return_thunk __netdev_alloc_skb skb_trim jiffies ixgb_update_eeprom_checksum dma_set_coherent_mask vmemmap_base strscpy dma_free_attrs vfree ixgb_rar_set init_timer_key pci_release_regions __const_udelay __dev_kfree_skb_any __dynamic_pr_debug cancel_work_sync __warn_printk netif_carrier_off ixgb_setup_tx_resources netif_carrier_on ixgb_down pci_disable_device ixgb_led_on dma_set_mask ixgb_set_speed_duplex ixgb_up kmalloc_trace napi_schedule_prep napi_disable param_ops_int ixgb_read_eeprom ixgb_set_ethtool_ops msleep __kmalloc ixgb_driver_name kmalloc_caches netdev_info system_wq               5            d  !          5  9          t  A          !  M          %  U          p  ]          Z  g          z  q          5            "            r            d            5           T           d  !         5  S         T  e         d  q         5           9           n           d           d           5             
         d  $         ?  0         d  5         d  G         g  S         Q  a         5                      "           b           b  G         d  Q         5           f             3         I  T         j  Y         ;           e           	   9         d  D         	   `         8  j                    r         u           ]           5           d  G           L       V                    @           +           d           5           "  	            %	           S	         *  j	           	         :  	         W  r
         S  
         d  
            H               
                    s           S  )         g  g         g           <  ;         a  T         g              0                4           5                                  5           g  $
         d  E
         d  Q
         5           g  &           [         I  ~         j           ;           7           r           d           g           ;  r         	               -                N                              	            8                               u  F         r           ]           5  ?         "  Y         r           b           b           d           5           n  E         _  ~                           P           V           a  !         g  )         Q  8         d              1                d           L           '           5           c  &         ~  .            K       6         G  =         g  G         Q  Q         5  e         \  m           ~            Y                d           5             ;         d  C         c  K         v  Y         g  {         D           -                                                 R           9  %            q       u         	               p                                 	            u           >           5             -         d  C         |  M                   \         i  c                   k         )  }         c                                  1  M                    U           x                  }                    Y                        -                                p            z            Z            R   !         9  &!         .  <!            /      D!         o  !            p#      !         X  !         v  !                   !         0  !         D  !            !         %  "                   "         >  "            
      !"         5  B"         v  N"           "         J  "           "         g  "         D  "         '  "         /  #         5  )#         C  D#         z  R#         d  d#         y  q#         5  #         y  #         5  #         d  #         y  #         ~  $         d  $         5  ,$         y  G$         m  u$         l  $         m  $         l  $         d  $         5  4%         D  =%         d  J%         y  R%         ~  Z%         }  c%         d  j%         d  q%         5  %         F  %         U  %         d  %         m  &         5  .&         F  p&         U  &         d  &         m  &         5  &         w  &         D  &         d  &         v  &           '         ~  $'         d  ?'         m  m'         l  '         m  '         l  '         5  '         m  ,(         l  >(         d  Q(         5  n(         m  (         l  (         d  (         5  O/         d  /         5  /         M  /           0            &      0         [  T0         g  g0         Q  p0            q      ~0         g  0           0            0         5  0         d  0                  0                   0         
          0         s  "1            (      )1         
          .1         s  ?1            H      F1         
   p       K1         s  V1            h      ]1         
   8       b1         s  q1         5  1         q  1         d  1         d  1         5  /2         q  h2         q  2         d  2         5  2         q  2         q  -3         d  A3         5  3         d  3                   3                   3         
   0	      3         s  3         >  4         5  *4           F4         d  r4         d  4           )5           A5         5  5           5         d  5            p      5                   5         
   H
      5         s  6         d  	6                  6         
   h	      6         s  6                   %6         
   	      *6         s  66                  =6         
   	      B6         s  N6                  U6         
   
      Z6         s  q6         5  6         d  6            h      6                   6         
         6         s  6         5  r7         n   8         d  ,8                   38         
         88         s  Z8            H      a8         
   (      f8         s  t8                   {8         
         8         s  8                  8                   8         
         8         s  8            p      8         
         8         s  9                   9         
   `       9         s  ,9                   39         
         89         s  D9                  K9                   R9         
         W9         s  g9                  n9         
   H      }9         s  9                  9         
         9         s  9         5  9         d  9         5  9         d  :         d  :            P      :                   :         
         :         s  3:                  ::         
         ?:         s  Q:         5  :           :         A  :         d  :         E  :                   :         
          ;         s  ;                   ;         
         ;         s  $;            X      +;                   2;         
          7;         s  S;            @      Z;                   a;         
         f;         s  ;         n  -<            0      4<         
   X      9<         s  T<            (      [<         
         `<         s  l<                  s<         
   8      x<         s  <            *      <         
         <         s  <                  <         
         <         s  <            P      <         
         <         s  <            x      <         
   p      <         s  <                   <         
         <         s  
=         
         =                   =                   =         s  <=         R  @         M  @         d  @                  @         
   x      @         s  @            @      A         
   @      A         s  A                  !A         
         &A         s  A                  A                   A         
   h      A         s  A                  A                   A         
   P      A         s  A            Z      A         
          A         s  A            h      A         
         A         s  3B            x      :B         
   P      ?B         s  KB            P      RB         
         WB         s  gB                  nB         
   0      sB         s  B         5  B         d  B         d  B                  B         
         B         s  C         5  %C         d  1C         5  EC         d  QC         5  xC         q  C         q  C         q  C         q  C         5  1D         q  RD         q  pD         q  D         d  D         5  *E         q  E         q  E         q  E         d  E         5  ZF         q  F         q  F         d  F         5  F           F         d  F         5  	G           1G         5  KG           G         d  G                  G         
   `      G         s  G                  G                  G         
         G         s  G            "      G         
   (      G         s  G            :      G         
   
      G         s  H         5  H         d  FH         d  SH         A  kH         d  qH         5  H         d  H                  H                  H         
   
      H         s  H         A  H         d  H            `
      H         
   
      H         s  I         5  "I         d  'I         A  3I         d  AI         5  cI         d  hI         A  tI         d  I         5  I         d  I         d  I         d  I         d  I         5  I         d  J         5  
J         d  !J         5  +J         d  1J         5  P         d  P         5  P         d  P         5  P         d  P         5  P         d  Q         5  Q         [  !Q                  ;Q                  lQ         d  qQ         5  Q         d  Q         O  Q         d  Q         {  Q         d  Q         5  Q         d  Q                  Q                  R         d  R         5  zR           4       R           R                  R         *  R         H  
S         +  S         d  YS           zS           S         h  S         5  S                   S         B  S                  T                  T                   T         k  ;T         B  HT                  \T                  kT         k  qT         5  T           U         $  ;U         *  CU         +  XU         d  U         5  U         D  U         d  U         y  U         D  U         ~  U         x  U         a  V         d  V         d  !V         5  nV         y  vV         ~  V         x  V         a  V         d  V         D  V         d  V         d  V         5  JW         d  QW         5  WX           X         ~  X         d  X         y  Y         w  Y         ^  Z           Z         ~  Z         x  Z         a  Z         ^  Z         5  Z         x  [         a  [         5  [                   ![         d  1[         5  S[                  m[                  ~[                  [         d  [         d  [                  [                   [                  [         5  [            >      [            $       \                    \                   1\                   G\                   d\            n      j\                   \            ]      \                   \                  \                   \                   \                    ]         d  ,]            
      3]             
      V]                  ]]                  ]                  ]             	      ]             	      ]                  ]            `	      ]                   
^            	      ^            `      2^            	      9^                  S^             
      _^            	      ^            `
      ^            `	      ^            
      ^            	      ^         >  ^                            5               `                                     =                      "                     '          =  .                    5                    <                     A          #                                 2               l       (             9      A                   F          4  K             )      S                   Y          =  g             @       l          4  q             ~                                   4                                  @                4                                                  4                                  8                =                                   h                4               !                                                  !                  U                4  
            B                   l       !         4  &            !      @                   G                   U                  Z           l         x  q            0      }                                       v              0                                                                       3                             3                             3                             =              
               =              ~[                                 =  *                  0         =  8                  >         =  G            
      L         =  S                  X         =  ]            [      d            h      i         =  n            \      u            8      z         =              d\                                 =              \                  \                                 =              \      0             &      8             $      @             P
      `                   h             p      p          ,                       #                                                                                                 $                  #                                                       S                   J                   0J      8            I      @             J      P         `          `            P      h            pT      p            R                  P                  PW                  I                   V                  Q                  pQ                   Q                  P                  V                  U      H                  X                  h            2      x            M                  b                                                                              (	                  0	                  h	                  p	            	      	            !      	            ?      	            0      	            X      (
            q      0
            P      H
            @      h
            ~      p
                  
                  
                  
                  
                  (                   0                   8                  h                   p                   x                                                                     `                                                              (                   0                   8                  h                   p                   x             	                                                        `	                                                         	      (
            $       0
                   8
            	      h
            (       p
                   x
             
                                                                                   p                            (                    0             p      8                   @             `      H             P      P                   X                   `                   h                   p             P
      x                                                                       P                                                          "                   #                   p#                   #                   $                   $                   p%                   &                   &                   '                   P(                   (                  /                  0                  p1                   1      (            2      0            @3      8            4      @            @5      H            p6      P            6      X            9      `            9      h            P:      p            B      x            C                  0C                  PC                  C                  D                  E                  F                  F                  0G                  H                  pH                   I                  @I                  I                  I                   J                   J                   0J                  P                  P                  P                    Q      (            pQ      0            Q      8            R      @            S      H            pT      P            U      X             V      `            V      h            PW      p            Z      x            [                  0[                  [                                       W                   r                                      5
                                      d                   O                     6"      $             "      (             '      ,             0                                                                                        (                   0                    8                    H                     P                   X                    `          (          p                    x             @                                    (                       `                                                       (                                                                              (                                                                               (                                         @                          (         (          8            `      @                  H                   P         (          `                  h                  p                   x         (                                         
                                  (                       
                  @
                                  (                      `
                                                                               d                                                         	                   /                    4      $             F      (             8      ,                   0                   4             
      8             #
      <             D
      @                    D                   H             7      L                   P                   T             :      X             ,      \             Q#      `             #      d             $      h             $      l             <%      p             b%      t             i%      x             %      |             &                   &                   #'                   =(                   (                   N/                   0                   1                   1                   2                   ,3                   3                   E4                   q4                   5                   6                   6                   8                   9                   9                   :                   :                   @                   B                   B                   $C                   DC                   D                   E                   F                   F                   G                   H                   EH                  jH                  H                  H                  !I                  2I                  bI                  sI                   I      $            I      (            I      ,            I      0            I      4            J      8            *J      <            P      @            P      D            P      H            P      L            kQ      P            Q      T            Q      X            Q      \            Q      `            R      d            S      h            WU      l            U      p            V      t            V      x            V      |            V                  V                  IW                  X                   [                  [                  [                  ]                                                                                  &                    '                    e                    f                    k                     p       $             v       (                    ,                    0                    4                   8                   <                   @                    D             (      H             /      L             c      P             d      T             i      X             p      \                   `                   d                   h                   l                   p                   t                   x                   |                                	                                      .                   /                   9                   Y                   `                   g                   i                   m                   n                   A                   B                   D                   F                   K                   O                   P                   W                   [                   `                   b                   c                   d                   h                   .                   /                   0                   2                   4                   6                   8                   =                                                                                                                                                       $                  (                  ,                  0                  4                  8                  <                  @                  D                  H                  L                  P                  T            
      X            
      \            
      `            
      d            
      h            
      l            
      p            
      t            
      x                  |                                                                                                                                                            I
                  P
                  W
                  \
                  ^
                  `
                  a
                  b
                  f
                                                                                                                                                                                                                                                                                                                                                                                                                                                                     0      $            1      (            3      ,            5      0            7      4            <      8                  <                  @                  D                  H                  L                  P                  T                   X                  \                  `            E      d            F      h            K      l            P      p            V      t            ^      x                  |                                                                                                                                          6                  7                  8                  :                  ?                                                                                                                                                $                  '                  (                  *                  ,                  1                  "                   "                  '"                  +"                  ,"                  "                  "                  "                   "                  #                  #                  #                  #                  #                  N#                  O#                   Q#      $            V#      (            j#      ,            p#      0            v#      4            #      8            #      <            #      @            #      D            #      H            #      L            #      P            #      T            #      X            #      \            #      `            #      d            #      h             $      l            $      p            $      t            	$      x            $      |            $                  $$                  %$                  $                  $                  $                  $                  $                  %                  %                  ;%                  <%                  A%                  a%                  b%                  n%                  p%                  v%                  w%                  %                  %                  %                  &                  &                  &                  &                  &                  &                  &                  &                  &                  &                  &                   &                  &                  &                  &                  &                  &                  &                  '                   '      $            !'      (            #'      ,            ('      0            '      4            '      8            '      <            '      @            <(      D            =(      H            B(      L            P(      P            V(      T            W(      X            (      \            (      `            (      d            (      h            /      l            /      p            /      t            /      x            /      |            \0                  ]0                  _0                  k0                  0                  0                  0                  0                                      E                                                                              5                   O                   P                   X                   ]                   u                                      *                                    0                  0                  0                  0                  m1                  p1                  w1                  ~1                  1                  1                  1                   1                  1                  1                  1                  1                  1                  1                  1                   1      $            1      (            2      ,            2      0            2      4            2      8            2      <            2      @            2      D            2      H            &3      L            *3      P            ,3      T            13      X            @3      \            F3      `            J3      d            N3      h            3      l            3      p            3      t            3      x            4      |            4                  4                  4                  D4                  E4                  J4                  p4                  q4                  v4                  25                  @5                  F5                  G5                  5                  5                  5                   6                  6                  6                  b6                  p6                  w6                  {6                  ~6                  6                  6                  6                  6                  6                  6                  6                  6                  6                   6                  6                  6                  6                  8                  8                  8                  8                   8      $            8      (            8      ,            $8      0            d9      4            s9      8            t9      <            v9      @            x9      D            z9      H            |9      L            9      P            9      T            9      X            9      \            9      `            9      d            9      h            9      l            :      p            :      t            M:      x            P:      |            V:                  W:                  :                  :                  :                  @                  @                  @                  yB                  B                  B                  B                  B                  B                  B                  B                  B                  C                  C                  )C                  0C                  IC                  PC                  VC                  WC                  C                  C                  C                  C                  C                  C                  C                  C                   C                  D                  D                  D                  D                  D                  D                  D                   D      $            D      (            D      ,            E      0            E      4            E      8            E      <            E      @            E      D            E      H            E      L            E      P            E      T            F      X            F      \            F      `            F      d            F      h            F      l            F      p            F      t            F      x            F      |            F                  F                  F                  F                  F                  F                  F                  G                  %G                  'G                  /G                  0G                  7G                  8G                  <G                  G                  G                  G                  G                  	H                  H                  #H                  'H                  DH                  EH                  JH                  gH                  jH                  oH                  pH                  vH                  zH                  H                   H                  H                  H                  H                  H                  H                  H                  H                    I      $            
I      (            !I      ,            &I      0            2I      4            7I      8            @I      <            MI      @            bI      D            gI      H            sI      L            xI      P            I      T            I      X            I      \            I      `             J      d            J      h             J      l            /J      p            0J      t            P      x            P      |            P                  P                  P                  P                  P                   Q                  Q                  Q                  Q                  hQ                  iQ                  kQ                  Q                  Q                  
R                  R                  R                  R                  R                  R                  R                  R                  #R                  S                  S                  S                  S                  S                  S                  S                  #S                  S                  S       	            S      	            S      	            S      	            gT      	            hT      	            jT      	            oT      	            pT       	            wT      $	            T      (	            T      ,	            T      0	            T      4	            T      8	            T      <	            MU      @	            NU      D	            OU      H	            QU      L	            SU      P	            UU      T	            WU      X	            \U      \	            ~U      `	            U      d	            U      h	            U      l	            U      p	            U      t	            U      x	            V      |	            V      	            V      	             V      	            0V      	            8V      	            V      	            V      	            V      	            V      	            V      	            V      	            V      	            NW      	            PW      	            WW      	            YW      	            [W      	            ]W      	            ^W      	            _W      	            cW      	            X      	            X      	            X      	            X      	            X      	            X      	            X      	            X      	            Z      	            Z      	            Z      	             [       
            [      
            [      
            %[      
                  
                  
                  
            0[      
            6[       
            :[      $
            [      (
            [      ,
            [      0
            [      4
            [      8
            [      <
            [      @
            [      D
            [      H
            [      L
            [      P
            ]      T
            ]      X
            ]      \
            ]      `
            ^      d
                  h
                  l
                  p
                  t
                  x
                  |
                  
            '      
            /      
            4      
            5      
            =      
            B      
                                v                U                                        V                                        U           $                   (          V           0                   4          V           <                   @          V           H             J2      L                     T             2      X                     `             2      d                     l             3      p                     x             9      |                                  bB                                        E                                        [                                        d
                   
                
   *                    0                   0                
   
                    0      $             1      (          
          0             1      4             S1      8          
   b       @             61      D             <1      H          
          P             n3      T             3      X          
   Z	      `             J5      d             5      h          
   r
      p             ]5      t             36      x          
   
                   5                   6                
   	                   5                   6                
   	                   5                   K6                
   :
                   6                   6                
                      6                   A9                
                      7                   )9                
                      67                   9                
                      v7                   8                
                      7                  W8               
   R                  7                  $8               
                      7      $            8      (         
   :      0            7      4            o8      8         
         @            8      D            `9      H         
   r      P            9      T            9      X         
         `            9      d            :      h         
   "      p            $:      t            0:      x         
                     Z:                  !;               
   *                  _:                  	;               
                     l:                  :               
                     :                  P;               
   "	                  :                  <               
   
                  :                  <               
                     F;                  <               
   B                  s;                  i<               
   b                   |;                  Q<               
                     ;                  0B               
   z                   ;      $            =      (         
         0            ;      4            @      8         
         @            ;      D            @      H         
   j      P            ;      T            <      X         
   2      `            #<      d            *<      h         
         p            B<      t            HB      x         
                     <                  <               
                     @=                  A               
                     =                  A               
   J                  =                  A               
   z                  Z@                  A               
                     A                  A               
   B                  `B                  dB               
   Z                  B                  B               
                      <G                  G               
                     >G                  G               
                      G      $            G      (         
         0            G      4            G      8         
   R      @            }H      D            H      H         
   
      P            H      T            H      X         
   
      0                    8                    @                   H                                                                                                                        8             q      @                   H                   P             v      p             q      x                                                                      q                                                                            q                                                                           q                         (                  0                  P            q      X                  `                  h                              q                  0                                    8                  q                  P                                    h                  q                   P                                          0            q      8                  @                  H                  h            q      p                  x                                                q                  h                                                      q                                                                        q                                           (                  H            q      P                  X                  `                              q                                                                        q                                                                        q                                                             (            q      0                  8                  @            	      `            q      h                  p                  x                              q                                                                        q                                                                        q                                                              @            q      H                   P                  X            &      x            q                                                       8	                  q                                                       `	                  q                                                                           q      (            X      0                  8            :      X            q      `            X      h                  p            	                  q                  X                                    K                  q                  X                                    	                   q                  X                                          8            q      @            @      H                  P            	      p            q      x            @                                    g                  q                  @                                                      q                  @                                                      q                   @      (                  0                  P            q      X            @      `                  h            g                  q                  @                                                      q                  @                                                      q       	            @      	                  	                  0	            q      8	                   @	                  H	                  h	            q      p	            p      x	                  	                  	            q      	            p      	                  	            	      	            q      	            p      	                  	                  
            q      
            p       
                  (
            	      H
            q      P
            p      X
                  `
                  
            S      
                  
            0
      
            X      
            S      
                  
            0
      
            r      
            S      
                               0
                  v      (            S      0                  8            0
      @                  `            S      h                  p            0
      x                              S                                    0
                  r                 &                     6          8         6          P         &           .symtab .strtab .shstrtab .note.gnu.build-id .note.Linux .rela.text .rela.init.text .rela.exit.text .rela.text.unlikely .rela.rodata .rela__mcount_loc .rodata.str1.1 .rela.smp_locks .rodata.str1.8 .modinfo .rela__param .rela.return_sites .orc_unwind .rela.orc_unwind_ip __versions .rela__bug_table .rela__jump_table .rela.data .data.once .rela__dyndbg .rela.exit.data .rela.init.data .data..read_mostly .rela.gnu.linkonce.this_module .bss .comment .note.GNU-stack .BTF .gnu_debuglink                                                                                         @       $                              .                     d       <                              ?                            ^                             :      @               (B     @A      1                    J                     _      E                              E      @               h           1                    Z                     _                                    U      @               p     0       1                    j                     _                                   e      @                          1   	                 ~                     b      
                              y      @               8     p      1                                          p                                         @                          1   
                       2               r                                                       x      0                                    @               X            1                          2               x      u                                                 E      `                                                                                           @               x           1                                                                                  @                    	      1                                         $                                                              
                                   @                    ?      1                                                                                                                                          @               H           1                    0                    h      `                             +     @                    0      1                    B                          D
                              =     @                    x       1                     H                    $                                    X                    (                                   S     @                    @      1   #                 f                                                        a     @                           1   %                 v                                                         q     @                           1   '                                                                                             @                    @                    @                     0       1   *                                           ,                                   0                                                                                                                                       H$                                                                                                                %      2                   	                      '                                                        0                                  0	*H
01
0	`He0	*H
1a0]080 10UDebian Secure Boot CA2(oe:B&C0	`He0
	*H
  alk8v,NeQՍ<
3+2'|BG+/|>KFqʖOvO瘷{*4	/0Us[w[U\&!~܀=L&(S!5ON樎^D^ChWOgٱr(E3HM\PN!Gɂ H@4mrw^{OUӐϷW0Ht$l?-z         ~Module signature appended~
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     /*
 * WARNING: do not edit!
 * Generated by makefile from include/openssl/x509.h.in
 *
 * Copyright 1995-2022 The OpenSSL Project Authors. All Rights Reserved.
 * Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved
 *
 * Licensed under the Apache License 2.0 (the "License").  You may not use
 * this file except in compliance with the License.  You can obtain a copy
 * in the file LICENSE in the source distribution or at
 * https://www.openssl.org/source/license.html
 */



#ifndef OPENSSL_X509_H
# define OPENSSL_X509_H
# pragma once

# include <openssl/macros.h>
# ifndef OPENSSL_NO_DEPRECATED_3_0
#  define HEADER_X509_H
# endif

# include <openssl/e_os2.h>
# include <openssl/types.h>
# include <openssl/symhacks.h>
# include <openssl/buffer.h>
# include <openssl/evp.h>
# include <openssl/bio.h>
# include <openssl/asn1.h>
# include <openssl/safestack.h>
# include <openssl/ec.h>

# ifndef OPENSSL_NO_DEPRECATED_1_1_0
#  include <openssl/rsa.h>
#  include <openssl/dsa.h>
#  include <openssl/dh.h>
# endif

# include <openssl/sha.h>
# include <openssl/x509err.h>

#ifdef  __cplusplus
extern "C" {
#endif

/* Needed stacks for types defined in other headers */
SKM_DEFINE_STACK_OF_INTERNAL(X509_NAME, X509_NAME, X509_NAME)
#define sk_X509_NAME_num(sk) OPENSSL_sk_num(ossl_check_const_X509_NAME_sk_type(sk))
#define sk_X509_NAME_value(sk, idx) ((X509_NAME *)OPENSSL_sk_value(ossl_check_const_X509_NAME_sk_type(sk), (idx)))
#define sk_X509_NAME_new(cmp) ((STACK_OF(X509_NAME) *)OPENSSL_sk_new(ossl_check_X509_NAME_compfunc_type(cmp)))
#define sk_X509_NAME_new_null() ((STACK_OF(X509_NAME) *)OPENSSL_sk_new_null())
#define sk_X509_NAME_new_reserve(cmp, n) ((STACK_OF(X509_NAME) *)OPENSSL_sk_new_reserve(ossl_check_X509_NAME_compfunc_type(cmp), (n)))
#define sk_X509_NAME_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_X509_NAME_sk_type(sk), (n))
#define sk_X509_NAME_free(sk) OPENSSL_sk_free(ossl_check_X509_NAME_sk_type(sk))
#define sk_X509_NAME_zero(sk) OPENSSL_sk_zero(ossl_check_X509_NAME_sk_type(sk))
#define sk_X509_NAME_delete(sk, i) ((X509_NAME *)OPENSSL_sk_delete(ossl_check_X509_NAME_sk_type(sk), (i)))
#define sk_X509_NAME_delete_ptr(sk, ptr) ((X509_NAME *)OPENSSL_sk_delete_ptr(ossl_check_X509_NAME_sk_type(sk), ossl_check_X509_NAME_type(ptr)))
#define sk_X509_NAME_push(sk, ptr) OPENSSL_sk_push(ossl_check_X509_NAME_sk_type(sk), ossl_check_X509_NAME_type(ptr))
#define sk_X509_NAME_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_X509_NAME_sk_type(sk), ossl_check_X509_NAME_type(ptr))
#define sk_X509_NAME_pop(sk) ((X509_NAME *)OPENSSL_sk_pop(ossl_check_X509_NAME_sk_type(sk)))
#define sk_X509_NAME_shift(sk) ((X509_NAME *)OPENSSL_sk_shift(ossl_check_X509_NAME_sk_type(sk)))
#define sk_X509_NAME_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_X509_NAME_sk_type(sk),ossl_check_X509_NAME_freefunc_type(freefunc))
#define sk_X509_NAME_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_X509_NAME_sk_type(sk), ossl_check_X509_NAME_type(ptr), (idx))
#define sk_X509_NAME_set(sk, idx, ptr) ((X509_NAME *)OPENSSL_sk_set(ossl_check_X509_NAME_sk_type(sk), (idx), ossl_check_X509_NAME_type(ptr)))
#define sk_X509_NAME_find(sk, ptr) OPENSSL_sk_find(ossl_check_X509_NAME_sk_type(sk), ossl_check_X509_NAME_type(ptr))
#define sk_X509_NAME_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_X509_NAME_sk_type(sk), ossl_check_X509_NAME_type(ptr))
#define sk_X509_NAME_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_X509_NAME_sk_type(sk), ossl_check_X509_NAME_type(ptr), pnum)
#define sk_X509_NAME_sort(sk) OPENSSL_sk_sort(ossl_check_X509_NAME_sk_type(sk))
#define sk_X509_NAME_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_X509_NAME_sk_type(sk))
#define sk_X509_NAME_dup(sk) ((STACK_OF(X509_NAME) *)OPENSSL_sk_dup(ossl_check_const_X509_NAME_sk_type(sk)))
#define sk_X509_NAME_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(X509_NAME) *)OPENSSL_sk_deep_copy(ossl_check_const_X509_NAME_sk_type(sk), ossl_check_X509_NAME_copyfunc_type(copyfunc), ossl_check_X509_NAME_freefunc_type(freefunc)))
#define sk_X509_NAME_set_cmp_func(sk, cmp) ((sk_X509_NAME_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_X509_NAME_sk_type(sk), ossl_check_X509_NAME_compfunc_type(cmp)))
SKM_DEFINE_STACK_OF_INTERNAL(X509, X509, X509)
#define sk_X509_num(sk) OPENSSL_sk_num(ossl_check_const_X509_sk_type(sk))
#define sk_X509_value(sk, idx) ((X509 *)OPENSSL_sk_value(ossl_check_const_X509_sk_type(sk), (idx)))
#define sk_X509_new(cmp) ((STACK_OF(X509) *)OPENSSL_sk_new(ossl_check_X509_compfunc_type(cmp)))
#define sk_X509_new_null() ((STACK_OF(X509) *)OPENSSL_sk_new_null())
#define sk_X509_new_reserve(cmp, n) ((STACK_OF(X509) *)OPENSSL_sk_new_reserve(ossl_check_X509_compfunc_type(cmp), (n)))
#define sk_X509_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_X509_sk_type(sk), (n))
#define sk_X509_free(sk) OPENSSL_sk_free(ossl_check_X509_sk_type(sk))
#define sk_X509_zero(sk) OPENSSL_sk_zero(ossl_check_X509_sk_type(sk))
#define sk_X509_delete(sk, i) ((X509 *)OPENSSL_sk_delete(ossl_check_X509_sk_type(sk), (i)))
#define sk_X509_delete_ptr(sk, ptr) ((X509 *)OPENSSL_sk_delete_ptr(ossl_check_X509_sk_type(sk), ossl_check_X509_type(ptr)))
#define sk_X509_push(sk, ptr) OPENSSL_sk_push(ossl_check_X509_sk_type(sk), ossl_check_X509_type(ptr))
#define sk_X509_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_X509_sk_type(sk), ossl_check_X509_type(ptr))
#define sk_X509_pop(sk) ((X509 *)OPENSSL_sk_pop(ossl_check_X509_sk_type(sk)))
#define sk_X509_shift(sk) ((X509 *)OPENSSL_sk_shift(ossl_check_X509_sk_type(sk)))
#define sk_X509_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_X509_sk_type(sk),ossl_check_X509_freefunc_type(freefunc))
#define sk_X509_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_X509_sk_type(sk), ossl_check_X509_type(ptr), (idx))
#define sk_X509_set(sk, idx, ptr) ((X509 *)OPENSSL_sk_set(ossl_check_X509_sk_type(sk), (idx), ossl_check_X509_type(ptr)))
#define sk_X509_find(sk, ptr) OPENSSL_sk_find(ossl_check_X509_sk_type(sk), ossl_check_X509_type(ptr))
#define sk_X509_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_X509_sk_type(sk), ossl_check_X509_type(ptr))
#define sk_X509_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_X509_sk_type(sk), ossl_check_X509_type(ptr), pnum)
#define sk_X509_sort(sk) OPENSSL_sk_sort(ossl_check_X509_sk_type(sk))
#define sk_X509_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_X509_sk_type(sk))
#define sk_X509_dup(sk) ((STACK_OF(X509) *)OPENSSL_sk_dup(ossl_check_const_X509_sk_type(sk)))
#define sk_X509_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(X509) *)OPENSSL_sk_deep_copy(ossl_check_const_X509_sk_type(sk), ossl_check_X509_copyfunc_type(copyfunc), ossl_check_X509_freefunc_type(freefunc)))
#define sk_X509_set_cmp_func(sk, cmp) ((sk_X509_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_X509_sk_type(sk), ossl_check_X509_compfunc_type(cmp)))
SKM_DEFINE_STACK_OF_INTERNAL(X509_REVOKED, X509_REVOKED, X509_REVOKED)
#define sk_X509_REVOKED_num(sk) OPENSSL_sk_num(ossl_check_const_X509_REVOKED_sk_type(sk))
#define sk_X509_REVOKED_value(sk, idx) ((X509_REVOKED *)OPENSSL_sk_value(ossl_check_const_X509_REVOKED_sk_type(sk), (idx)))
#define sk_X509_REVOKED_new(cmp) ((STACK_OF(X509_REVOKED) *)OPENSSL_sk_new(ossl_check_X509_REVOKED_compfunc_type(cmp)))
#define sk_X509_REVOKED_new_null() ((STACK_OF(X509_REVOKED) *)OPENSSL_sk_new_null())
#define sk_X509_REVOKED_new_reserve(cmp, n) ((STACK_OF(X509_REVOKED) *)OPENSSL_sk_new_reserve(ossl_check_X509_REVOKED_compfunc_type(cmp), (n)))
#define sk_X509_REVOKED_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_X509_REVOKED_sk_type(sk), (n))
#define sk_X509_REVOKED_free(sk) OPENSSL_sk_free(ossl_check_X509_REVOKED_sk_type(sk))
#define sk_X509_REVOKED_zero(sk) OPENSSL_sk_zero(ossl_check_X509_REVOKED_sk_type(sk))
#define sk_X509_REVOKED_delete(sk, i) ((X509_REVOKED *)OPENSSL_sk_delete(ossl_check_X509_REVOKED_sk_type(sk), (i)))
#define sk_X509_REVOKED_delete_ptr(sk, ptr) ((X509_REVOKED *)OPENSSL_sk_delete_ptr(ossl_check_X509_REVOKED_sk_type(sk), ossl_check_X509_REVOKED_type(ptr)))
#define sk_X509_REVOKED_push(sk, ptr) OPENSSL_sk_push(ossl_check_X509_REVOKED_sk_type(sk), ossl_check_X509_REVOKED_type(ptr))
#define sk_X509_REVOKED_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_X509_REVOKED_sk_type(sk), ossl_check_X509_REVOKED_type(ptr))
#define sk_X509_REVOKED_pop(sk) ((X509_REVOKED *)OPENSSL_sk_pop(ossl_check_X509_REVOKED_sk_type(sk)))
#define sk_X509_REVOKED_shift(sk) ((X509_REVOKED *)OPENSSL_sk_shift(ossl_check_X509_REVOKED_sk_type(sk)))
#define sk_X509_REVOKED_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_X509_REVOKED_sk_type(sk),ossl_check_X509_REVOKED_freefunc_type(freefunc))
#define sk_X509_REVOKED_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_X509_REVOKED_sk_type(sk), ossl_check_X509_REVOKED_type(ptr), (idx))
#define sk_X509_REVOKED_set(sk, idx, ptr) ((X509_REVOKED *)OPENSSL_sk_set(ossl_check_X509_REVOKED_sk_type(sk), (idx), ossl_check_X509_REVOKED_type(ptr)))
#define sk_X509_REVOKED_find(sk, ptr) OPENSSL_sk_find(ossl_check_X509_REVOKED_sk_type(sk), ossl_check_X509_REVOKED_type(ptr))
#define sk_X509_REVOKED_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_X509_REVOKED_sk_type(sk), ossl_check_X509_REVOKED_type(ptr))
#define sk_X509_REVOKED_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_X509_REVOKED_sk_type(sk), ossl_check_X509_REVOKED_type(ptr), pnum)
#define sk_X509_REVOKED_sort(sk) OPENSSL_sk_sort(ossl_check_X509_REVOKED_sk_type(sk))
#define sk_X509_REVOKED_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_X509_REVOKED_sk_type(sk))
#define sk_X509_REVOKED_dup(sk) ((STACK_OF(X509_REVOKED) *)OPENSSL_sk_dup(ossl_check_const_X509_REVOKED_sk_type(sk)))
#define sk_X509_REVOKED_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(X509_REVOKED) *)OPENSSL_sk_deep_copy(ossl_check_const_X509_REVOKED_sk_type(sk), ossl_check_X509_REVOKED_copyfunc_type(copyfunc), ossl_check_X509_REVOKED_freefunc_type(freefunc)))
#define sk_X509_REVOKED_set_cmp_func(sk, cmp) ((sk_X509_REVOKED_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_X509_REVOKED_sk_type(sk), ossl_check_X509_REVOKED_compfunc_type(cmp)))
SKM_DEFINE_STACK_OF_INTERNAL(X509_CRL, X509_CRL, X509_CRL)
#define sk_X509_CRL_num(sk) OPENSSL_sk_num(ossl_check_const_X509_CRL_sk_type(sk))
#define sk_X509_CRL_value(sk, idx) ((X509_CRL *)OPENSSL_sk_value(ossl_check_const_X509_CRL_sk_type(sk), (idx)))
#define sk_X509_CRL_new(cmp) ((STACK_OF(X509_CRL) *)OPENSSL_sk_new(ossl_check_X509_CRL_compfunc_type(cmp)))
#define sk_X509_CRL_new_null() ((STACK_OF(X509_CRL) *)OPENSSL_sk_new_null())
#define sk_X509_CRL_new_reserve(cmp, n) ((STACK_OF(X509_CRL) *)OPENSSL_sk_new_reserve(ossl_check_X509_CRL_compfunc_type(cmp), (n)))
#define sk_X509_CRL_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_X509_CRL_sk_type(sk), (n))
#define sk_X509_CRL_free(sk) OPENSSL_sk_free(ossl_check_X509_CRL_sk_type(sk))
#define sk_X509_CRL_zero(sk) OPENSSL_sk_zero(ossl_check_X509_CRL_sk_type(sk))
#define sk_X509_CRL_delete(sk, i) ((X509_CRL *)OPENSSL_sk_delete(ossl_check_X509_CRL_sk_type(sk), (i)))
#define sk_X509_CRL_delete_ptr(sk, ptr) ((X509_CRL *)OPENSSL_sk_delete_ptr(ossl_check_X509_CRL_sk_type(sk), ossl_check_X509_CRL_type(ptr)))
#define sk_X509_CRL_push(sk, ptr) OPENSSL_sk_push(ossl_check_X509_CRL_sk_type(sk), ossl_check_X509_CRL_type(ptr))
#define sk_X509_CRL_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_X509_CRL_sk_type(sk), ossl_check_X509_CRL_type(ptr))
#define sk_X509_CRL_pop(sk) ((X509_CRL *)OPENSSL_sk_pop(ossl_check_X509_CRL_sk_type(sk)))
#define sk_X509_CRL_shift(sk) ((X509_CRL *)OPENSSL_sk_shift(ossl_check_X509_CRL_sk_type(sk)))
#define sk_X509_CRL_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_X509_CRL_sk_type(sk),ossl_check_X509_CRL_freefunc_type(freefunc))
#define sk_X509_CRL_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_X509_CRL_sk_type(sk), ossl_check_X509_CRL_type(ptr), (idx))
#define sk_X509_CRL_set(sk, idx, ptr) ((X509_CRL *)OPENSSL_sk_set(ossl_check_X509_CRL_sk_type(sk), (idx), ossl_check_X509_CRL_type(ptr)))
#define sk_X509_CRL_find(sk, ptr) OPENSSL_sk_find(ossl_check_X509_CRL_sk_type(sk), ossl_check_X509_CRL_type(ptr))
#define sk_X509_CRL_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_X509_CRL_sk_type(sk), ossl_check_X509_CRL_type(ptr))
#define sk_X509_CRL_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_X509_CRL_sk_type(sk), ossl_check_X509_CRL_type(ptr), pnum)
#define sk_X509_CRL_sort(sk) OPENSSL_sk_sort(ossl_check_X509_CRL_sk_type(sk))
#define sk_X509_CRL_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_X509_CRL_sk_type(sk))
#define sk_X509_CRL_dup(sk) ((STACK_OF(X509_CRL) *)OPENSSL_sk_dup(ossl_check_const_X509_CRL_sk_type(sk)))
#define sk_X509_CRL_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(X509_CRL) *)OPENSSL_sk_deep_copy(ossl_check_const_X509_CRL_sk_type(sk), ossl_check_X509_CRL_copyfunc_type(copyfunc), ossl_check_X509_CRL_freefunc_type(freefunc)))
#define sk_X509_CRL_set_cmp_func(sk, cmp) ((sk_X509_CRL_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_X509_CRL_sk_type(sk), ossl_check_X509_CRL_compfunc_type(cmp)))


/* Flags for X509_get_signature_info() */
/* Signature info is valid */
# define X509_SIG_INFO_VALID     0x1
/* Signature is suitable for TLS use */
# define X509_SIG_INFO_TLS       0x2

# define X509_FILETYPE_PEM       1
# define X509_FILETYPE_ASN1      2
# define X509_FILETYPE_DEFAULT   3

# define X509v3_KU_DIGITAL_SIGNATURE     0x0080
# define X509v3_KU_NON_REPUDIATION       0x0040
# define X509v3_KU_KEY_ENCIPHERMENT      0x0020
# define X509v3_KU_DATA_ENCIPHERMENT     0x0010
# define X509v3_KU_KEY_AGREEMENT         0x0008
# define X509v3_KU_KEY_CERT_SIGN         0x0004
# define X509v3_KU_CRL_SIGN              0x0002
# define X509v3_KU_ENCIPHER_ONLY         0x0001
# define X509v3_KU_DECIPHER_ONLY         0x8000
# define X509v3_KU_UNDEF                 0xffff

struct X509_algor_st {
    ASN1_OBJECT *algorithm;
    ASN1_TYPE *parameter;
} /* X509_ALGOR */ ;

typedef STACK_OF(X509_ALGOR) X509_ALGORS;

typedef struct X509_val_st {
    ASN1_TIME *notBefore;
    ASN1_TIME *notAfter;
} X509_VAL;

typedef struct X509_sig_st X509_SIG;

typedef struct X509_name_entry_st X509_NAME_ENTRY;

SKM_DEFINE_STACK_OF_INTERNAL(X509_NAME_ENTRY, X509_NAME_ENTRY, X509_NAME_ENTRY)
#define sk_X509_NAME_ENTRY_num(sk) OPENSSL_sk_num(ossl_check_const_X509_NAME_ENTRY_sk_type(sk))
#define sk_X509_NAME_ENTRY_value(sk, idx) ((X509_NAME_ENTRY *)OPENSSL_sk_value(ossl_check_const_X509_NAME_ENTRY_sk_type(sk), (idx)))
#define sk_X509_NAME_ENTRY_new(cmp) ((STACK_OF(X509_NAME_ENTRY) *)OPENSSL_sk_new(ossl_check_X509_NAME_ENTRY_compfunc_type(cmp)))
#define sk_X509_NAME_ENTRY_new_null() ((STACK_OF(X509_NAME_ENTRY) *)OPENSSL_sk_new_null())
#define sk_X509_NAME_ENTRY_new_reserve(cmp, n) ((STACK_OF(X509_NAME_ENTRY) *)OPENSSL_sk_new_reserve(ossl_check_X509_NAME_ENTRY_compfunc_type(cmp), (n)))
#define sk_X509_NAME_ENTRY_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_X509_NAME_ENTRY_sk_type(sk), (n))
#define sk_X509_NAME_ENTRY_free(sk) OPENSSL_sk_free(ossl_check_X509_NAME_ENTRY_sk_type(sk))
#define sk_X509_NAME_ENTRY_zero(sk) OPENSSL_sk_zero(ossl_check_X509_NAME_ENTRY_sk_type(sk))
#define sk_X509_NAME_ENTRY_delete(sk, i) ((X509_NAME_ENTRY *)OPENSSL_sk_delete(ossl_check_X509_NAME_ENTRY_sk_type(sk), (i)))
#define sk_X509_NAME_ENTRY_delete_ptr(sk, ptr) ((X509_NAME_ENTRY *)OPENSSL_sk_delete_ptr(ossl_check_X509_NAME_ENTRY_sk_type(sk), ossl_check_X509_NAME_ENTRY_type(ptr)))
#define sk_X509_NAME_ENTRY_push(sk, ptr) OPENSSL_sk_push(ossl_check_X509_NAME_ENTRY_sk_type(sk), ossl_check_X509_NAME_ENTRY_type(ptr))
#define sk_X509_NAME_ENTRY_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_X509_NAME_ENTRY_sk_type(sk), ossl_check_X509_NAME_ENTRY_type(ptr))
#define sk_X509_NAME_ENTRY_pop(sk) ((X509_NAME_ENTRY *)OPENSSL_sk_pop(ossl_check_X509_NAME_ENTRY_sk_type(sk)))
#define sk_X509_NAME_ENTRY_shift(sk) ((X509_NAME_ENTRY *)OPENSSL_sk_shift(ossl_check_X509_NAME_ENTRY_sk_type(sk)))
#define sk_X509_NAME_ENTRY_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_X509_NAME_ENTRY_sk_type(sk),ossl_check_X509_NAME_ENTRY_freefunc_type(freefunc))
#define sk_X509_NAME_ENTRY_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_X509_NAME_ENTRY_sk_type(sk), ossl_check_X509_NAME_ENTRY_type(ptr), (idx))
#define sk_X509_NAME_ENTRY_set(sk, idx, ptr) ((X509_NAME_ENTRY *)OPENSSL_sk_set(ossl_check_X509_NAME_ENTRY_sk_type(sk), (idx), ossl_check_X509_NAME_ENTRY_type(ptr)))
#define sk_X509_NAME_ENTRY_find(sk, ptr) OPENSSL_sk_find(ossl_check_X509_NAME_ENTRY_sk_type(sk), ossl_check_X509_NAME_ENTRY_type(ptr))
#define sk_X509_NAME_ENTRY_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_X509_NAME_ENTRY_sk_type(sk), ossl_check_X509_NAME_ENTRY_type(ptr))
#define sk_X509_NAME_ENTRY_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_X509_NAME_ENTRY_sk_type(sk), ossl_check_X509_NAME_ENTRY_type(ptr), pnum)
#define sk_X509_NAME_ENTRY_sort(sk) OPENSSL_sk_sort(ossl_check_X509_NAME_ENTRY_sk_type(sk))
#define sk_X509_NAME_ENTRY_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_X509_NAME_ENTRY_sk_type(sk))
#define sk_X509_NAME_ENTRY_dup(sk) ((STACK_OF(X509_NAME_ENTRY) *)OPENSSL_sk_dup(ossl_check_const_X509_NAME_ENTRY_sk_type(sk)))
#define sk_X509_NAME_ENTRY_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(X509_NAME_ENTRY) *)OPENSSL_sk_deep_copy(ossl_check_const_X509_NAME_ENTRY_sk_type(sk), ossl_check_X509_NAME_ENTRY_copyfunc_type(copyfunc), ossl_check_X509_NAME_ENTRY_freefunc_type(freefunc)))
#define sk_X509_NAME_ENTRY_set_cmp_func(sk, cmp) ((sk_X509_NAME_ENTRY_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_X509_NAME_ENTRY_sk_type(sk), ossl_check_X509_NAME_ENTRY_compfunc_type(cmp)))


# define X509_EX_V_NETSCAPE_HACK         0x8000
# define X509_EX_V_INIT                  0x0001
typedef struct X509_extension_st X509_EXTENSION;
SKM_DEFINE_STACK_OF_INTERNAL(X509_EXTENSION, X509_EXTENSION, X509_EXTENSION)
#define sk_X509_EXTENSION_num(sk) OPENSSL_sk_num(ossl_check_const_X509_EXTENSION_sk_type(sk))
#define sk_X509_EXTENSION_value(sk, idx) ((X509_EXTENSION *)OPENSSL_sk_value(ossl_check_const_X509_EXTENSION_sk_type(sk), (idx)))
#define sk_X509_EXTENSION_new(cmp) ((STACK_OF(X509_EXTENSION) *)OPENSSL_sk_new(ossl_check_X509_EXTENSION_compfunc_type(cmp)))
#define sk_X509_EXTENSION_new_null() ((STACK_OF(X509_EXTENSION) *)OPENSSL_sk_new_null())
#define sk_X509_EXTENSION_new_reserve(cmp, n) ((STACK_OF(X509_EXTENSION) *)OPENSSL_sk_new_reserve(ossl_check_X509_EXTENSION_compfunc_type(cmp), (n)))
#define sk_X509_EXTENSION_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_X509_EXTENSION_sk_type(sk), (n))
#define sk_X509_EXTENSION_free(sk) OPENSSL_sk_free(ossl_check_X509_EXTENSION_sk_type(sk))
#define sk_X509_EXTENSION_zero(sk) OPENSSL_sk_zero(ossl_check_X509_EXTENSION_sk_type(sk))
#define sk_X509_EXTENSION_delete(sk, i) ((X509_EXTENSION *)OPENSSL_sk_delete(ossl_check_X509_EXTENSION_sk_type(sk), (i)))
#define sk_X509_EXTENSION_delete_ptr(sk, ptr) ((X509_EXTENSION *)OPENSSL_sk_delete_ptr(ossl_check_X509_EXTENSION_sk_type(sk), ossl_check_X509_EXTENSION_type(ptr)))
#define sk_X509_EXTENSION_push(sk, ptr) OPENSSL_sk_push(ossl_check_X509_EXTENSION_sk_type(sk), ossl_check_X509_EXTENSION_type(ptr))
#define sk_X509_EXTENSION_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_X509_EXTENSION_sk_type(sk), ossl_check_X509_EXTENSION_type(ptr))
#define sk_X509_EXTENSION_pop(sk) ((X509_EXTENSION *)OPENSSL_sk_pop(ossl_check_X509_EXTENSION_sk_type(sk)))
#define sk_X509_EXTENSION_shift(sk) ((X509_EXTENSION *)OPENSSL_sk_shift(ossl_check_X509_EXTENSION_sk_type(sk)))
#define sk_X509_EXTENSION_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_X509_EXTENSION_sk_type(sk),ossl_check_X509_EXTENSION_freefunc_type(freefunc))
#define sk_X509_EXTENSION_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_X509_EXTENSION_sk_type(sk), ossl_check_X509_EXTENSION_type(ptr), (idx))
#define sk_X509_EXTENSION_set(sk, idx, ptr) ((X509_EXTENSION *)OPENSSL_sk_set(ossl_check_X509_EXTENSION_sk_type(sk), (idx), ossl_check_X509_EXTENSION_type(ptr)))
#define sk_X509_EXTENSION_find(sk, ptr) OPENSSL_sk_find(ossl_check_X509_EXTENSION_sk_type(sk), ossl_check_X509_EXTENSION_type(ptr))
#define sk_X509_EXTENSION_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_X509_EXTENSION_sk_type(sk), ossl_check_X509_EXTENSION_type(ptr))
#define sk_X509_EXTENSION_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_X509_EXTENSION_sk_type(sk), ossl_check_X509_EXTENSION_type(ptr), pnum)
#define sk_X509_EXTENSION_sort(sk) OPENSSL_sk_sort(ossl_check_X509_EXTENSION_sk_type(sk))
#define sk_X509_EXTENSION_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_X509_EXTENSION_sk_type(sk))
#define sk_X509_EXTENSION_dup(sk) ((STACK_OF(X509_EXTENSION) *)OPENSSL_sk_dup(ossl_check_const_X509_EXTENSION_sk_type(sk)))
#define sk_X509_EXTENSION_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(X509_EXTENSION) *)OPENSSL_sk_deep_copy(ossl_check_const_X509_EXTENSION_sk_type(sk), ossl_check_X509_EXTENSION_copyfunc_type(copyfunc), ossl_check_X509_EXTENSION_freefunc_type(freefunc)))
#define sk_X509_EXTENSION_set_cmp_func(sk, cmp) ((sk_X509_EXTENSION_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_X509_EXTENSION_sk_type(sk), ossl_check_X509_EXTENSION_compfunc_type(cmp)))

typedef STACK_OF(X509_EXTENSION) X509_EXTENSIONS;
typedef struct x509_attributes_st X509_ATTRIBUTE;
SKM_DEFINE_STACK_OF_INTERNAL(X509_ATTRIBUTE, X509_ATTRIBUTE, X509_ATTRIBUTE)
#define sk_X509_ATTRIBUTE_num(sk) OPENSSL_sk_num(ossl_check_const_X509_ATTRIBUTE_sk_type(sk))
#define sk_X509_ATTRIBUTE_value(sk, idx) ((X509_ATTRIBUTE *)OPENSSL_sk_value(ossl_check_const_X509_ATTRIBUTE_sk_type(sk), (idx)))
#define sk_X509_ATTRIBUTE_new(cmp) ((STACK_OF(X509_ATTRIBUTE) *)OPENSSL_sk_new(ossl_check_X509_ATTRIBUTE_compfunc_type(cmp)))
#define sk_X509_ATTRIBUTE_new_null() ((STACK_OF(X509_ATTRIBUTE) *)OPENSSL_sk_new_null())
#define sk_X509_ATTRIBUTE_new_reserve(cmp, n) ((STACK_OF(X509_ATTRIBUTE) *)OPENSSL_sk_new_reserve(ossl_check_X509_ATTRIBUTE_compfunc_type(cmp), (n)))
#define sk_X509_ATTRIBUTE_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_X509_ATTRIBUTE_sk_type(sk), (n))
#define sk_X509_ATTRIBUTE_free(sk) OPENSSL_sk_free(ossl_check_X509_ATTRIBUTE_sk_type(sk))
#define sk_X509_ATTRIBUTE_zero(sk) OPENSSL_sk_zero(ossl_check_X509_ATTRIBUTE_sk_type(sk))
#define sk_X509_ATTRIBUTE_delete(sk, i) ((X509_ATTRIBUTE *)OPENSSL_sk_delete(ossl_check_X509_ATTRIBUTE_sk_type(sk), (i)))
#define sk_X509_ATTRIBUTE_delete_ptr(sk, ptr) ((X509_ATTRIBUTE *)OPENSSL_sk_delete_ptr(ossl_check_X509_ATTRIBUTE_sk_type(sk), ossl_check_X509_ATTRIBUTE_type(ptr)))
#define sk_X509_ATTRIBUTE_push(sk, ptr) OPENSSL_sk_push(ossl_check_X509_ATTRIBUTE_sk_type(sk), ossl_check_X509_ATTRIBUTE_type(ptr))
#define sk_X509_ATTRIBUTE_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_X509_ATTRIBUTE_sk_type(sk), ossl_check_X509_ATTRIBUTE_type(ptr))
#define sk_X509_ATTRIBUTE_pop(sk) ((X509_ATTRIBUTE *)OPENSSL_sk_pop(ossl_check_X509_ATTRIBUTE_sk_type(sk)))
#define sk_X509_ATTRIBUTE_shift(sk) ((X509_ATTRIBUTE *)OPENSSL_sk_shift(ossl_check_X509_ATTRIBUTE_sk_type(sk)))
#define sk_X509_ATTRIBUTE_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_X509_ATTRIBUTE_sk_type(sk),ossl_check_X509_ATTRIBUTE_freefunc_type(freefunc))
#define sk_X509_ATTRIBUTE_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_X509_ATTRIBUTE_sk_type(sk), ossl_check_X509_ATTRIBUTE_type(ptr), (idx))
#define sk_X509_ATTRIBUTE_set(sk, idx, ptr) ((X509_ATTRIBUTE *)OPENSSL_sk_set(ossl_check_X509_ATTRIBUTE_sk_type(sk), (idx), ossl_check_X509_ATTRIBUTE_type(ptr)))
#define sk_X509_ATTRIBUTE_find(sk, ptr) OPENSSL_sk_find(ossl_check_X509_ATTRIBUTE_sk_type(sk), ossl_check_X509_ATTRIBUTE_type(ptr))
#define sk_X509_ATTRIBUTE_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_X509_ATTRIBUTE_sk_type(sk), ossl_check_X509_ATTRIBUTE_type(ptr))
#define sk_X509_ATTRIBUTE_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_X509_ATTRIBUTE_sk_type(sk), ossl_check_X509_ATTRIBUTE_type(ptr), pnum)
#define sk_X509_ATTRIBUTE_sort(sk) OPENSSL_sk_sort(ossl_check_X509_ATTRIBUTE_sk_type(sk))
#define sk_X509_ATTRIBUTE_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_X509_ATTRIBUTE_sk_type(sk))
#define sk_X509_ATTRIBUTE_dup(sk) ((STACK_OF(X509_ATTRIBUTE) *)OPENSSL_sk_dup(ossl_check_const_X509_ATTRIBUTE_sk_type(sk)))
#define sk_X509_ATTRIBUTE_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(X509_ATTRIBUTE) *)OPENSSL_sk_deep_copy(ossl_check_const_X509_ATTRIBUTE_sk_type(sk), ossl_check_X509_ATTRIBUTE_copyfunc_type(copyfunc), ossl_check_X509_ATTRIBUTE_freefunc_type(freefunc)))
#define sk_X509_ATTRIBUTE_set_cmp_func(sk, cmp) ((sk_X509_ATTRIBUTE_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_X509_ATTRIBUTE_sk_type(sk), ossl_check_X509_ATTRIBUTE_compfunc_type(cmp)))

typedef struct X509_req_info_st X509_REQ_INFO;
typedef struct X509_req_st X509_REQ;
typedef struct x509_cert_aux_st X509_CERT_AUX;
typedef struct x509_cinf_st X509_CINF;

/* Flags for X509_print_ex() */

# define X509_FLAG_COMPAT                0
# define X509_FLAG_NO_HEADER             1L
# define X509_FLAG_NO_VERSION            (1L << 1)
# define X509_FLAG_NO_SERIAL             (1L << 2)
# define X509_FLAG_NO_SIGNAME            (1L << 3)
# define X509_FLAG_NO_ISSUER             (1L << 4)
# define X509_FLAG_NO_VALIDITY           (1L << 5)
# define X509_FLAG_NO_SUBJECT            (1L << 6)
# define X509_FLAG_NO_PUBKEY             (1L << 7)
# define X509_FLAG_NO_EXTENSIONS         (1L << 8)
# define X509_FLAG_NO_SIGDUMP            (1L << 9)
# define X509_FLAG_NO_AUX                (1L << 10)
# define X509_FLAG_NO_ATTRIBUTES         (1L << 11)
# define X509_FLAG_NO_IDS                (1L << 12)
# define X509_FLAG_EXTENSIONS_ONLY_KID   (1L << 13)

/* Flags specific to X509_NAME_print_ex() */

/* The field separator information */

# define XN_FLAG_SEP_MASK        (0xf << 16)

# define XN_FLAG_COMPAT          0/* Traditional; use old X509_NAME_print */
# define XN_FLAG_SEP_COMMA_PLUS  (1 << 16)/* RFC2253 ,+ */
# define XN_FLAG_SEP_CPLUS_SPC   (2 << 16)/* ,+ spaced: more readable */
# define XN_FLAG_SEP_SPLUS_SPC   (3 << 16)/* ;+ spaced */
# define XN_FLAG_SEP_MULTILINE   (4 << 16)/* One line per field */

# define XN_FLAG_DN_REV          (1 << 20)/* Reverse DN order */

/* How the field name is shown */

# define XN_FLAG_FN_MASK         (0x3 << 21)

# define XN_FLAG_FN_SN           0/* Object short name */
# define XN_FLAG_FN_LN           (1 << 21)/* Object long name */
# define XN_FLAG_FN_OID          (2 << 21)/* Always use OIDs */
# define XN_FLAG_FN_NONE         (3 << 21)/* No field names */

# define XN_FLAG_SPC_EQ          (1 << 23)/* Put spaces round '=' */

/*
 * This determines if we dump fields we don't recognise: RFC2253 requires
 * this.
 */

# define XN_FLAG_DUMP_UNKNOWN_FIELDS (1 << 24)

# define XN_FLAG_FN_ALIGN        (1 << 25)/* Align field names to 20
                                           * characters */

/* Complete set of RFC2253 flags */

# define XN_FLAG_RFC2253 (ASN1_STRFLGS_RFC2253 | \
                        XN_FLAG_SEP_COMMA_PLUS | \
                        XN_FLAG_DN_REV | \
                        XN_FLAG_FN_SN | \
                        XN_FLAG_DUMP_UNKNOWN_FIELDS)

/* readable oneline form */

# define XN_FLAG_ONELINE (ASN1_STRFLGS_RFC2253 | \
                        ASN1_STRFLGS_ESC_QUOTE | \
                        XN_FLAG_SEP_CPLUS_SPC | \
                        XN_FLAG_SPC_EQ | \
                        XN_FLAG_FN_SN)

/* readable multiline form */

# define XN_FLAG_MULTILINE (ASN1_STRFLGS_ESC_CTRL | \
                        ASN1_STRFLGS_ESC_MSB | \
                        XN_FLAG_SEP_MULTILINE | \
                        XN_FLAG_SPC_EQ | \
                        XN_FLAG_FN_LN | \
                        XN_FLAG_FN_ALIGN)

typedef struct X509_crl_info_st X509_CRL_INFO;

typedef struct private_key_st {
    int version;
    /* The PKCS#8 data types */
    X509_ALGOR *enc_algor;
    ASN1_OCTET_STRING *enc_pkey; /* encrypted pub key */
    /* When decrypted, the following will not be NULL */
    EVP_PKEY *dec_pkey;
    /* used to encrypt and decrypt */
    int key_length;
    char *key_data;
    int key_free;               /* true if we should auto free key_data */
    /* expanded version of 'enc_algor' */
    EVP_CIPHER_INFO cipher;
} X509_PKEY;

typedef struct X509_info_st {
    X509 *x509;
    X509_CRL *crl;
    X509_PKEY *x_pkey;
    EVP_CIPHER_INFO enc_cipher;
    int enc_len;
    char *enc_data;
} X509_INFO;
SKM_DEFINE_STACK_OF_INTERNAL(X509_INFO, X509_INFO, X509_INFO)
#define sk_X509_INFO_num(sk) OPENSSL_sk_num(ossl_check_const_X509_INFO_sk_type(sk))
#define sk_X509_INFO_value(sk, idx) ((X509_INFO *)OPENSSL_sk_value(ossl_check_const_X509_INFO_sk_type(sk), (idx)))
#define sk_X509_INFO_new(cmp) ((STACK_OF(X509_INFO) *)OPENSSL_sk_new(ossl_check_X509_INFO_compfunc_type(cmp)))
#define sk_X509_INFO_new_null() ((STACK_OF(X509_INFO) *)OPENSSL_sk_new_null())
#define sk_X509_INFO_new_reserve(cmp, n) ((STACK_OF(X509_INFO) *)OPENSSL_sk_new_reserve(ossl_check_X509_INFO_compfunc_type(cmp), (n)))
#define sk_X509_INFO_reserve(sk, n) OPENSSL_sk_reserve(ossl_check_X509_INFO_sk_type(sk), (n))
#define sk_X509_INFO_free(sk) OPENSSL_sk_free(ossl_check_X509_INFO_sk_type(sk))
#define sk_X509_INFO_zero(sk) OPENSSL_sk_zero(ossl_check_X509_INFO_sk_type(sk))
#define sk_X509_INFO_delete(sk, i) ((X509_INFO *)OPENSSL_sk_delete(ossl_check_X509_INFO_sk_type(sk), (i)))
#define sk_X509_INFO_delete_ptr(sk, ptr) ((X509_INFO *)OPENSSL_sk_delete_ptr(ossl_check_X509_INFO_sk_type(sk), ossl_check_X509_INFO_type(ptr)))
#define sk_X509_INFO_push(sk, ptr) OPENSSL_sk_push(ossl_check_X509_INFO_sk_type(sk), ossl_check_X509_INFO_type(ptr))
#define sk_X509_INFO_unshift(sk, ptr) OPENSSL_sk_unshift(ossl_check_X509_INFO_sk_type(sk), ossl_check_X509_INFO_type(ptr))
#define sk_X509_INFO_pop(sk) ((X509_INFO *)OPENSSL_sk_pop(ossl_check_X509_INFO_sk_type(sk)))
#define sk_X509_INFO_shift(sk) ((X509_INFO *)OPENSSL_sk_shift(ossl_check_X509_INFO_sk_type(sk)))
#define sk_X509_INFO_pop_free(sk, freefunc) OPENSSL_sk_pop_free(ossl_check_X509_INFO_sk_type(sk),ossl_check_X509_INFO_freefunc_type(freefunc))
#define sk_X509_INFO_insert(sk, ptr, idx) OPENSSL_sk_insert(ossl_check_X509_INFO_sk_type(sk), ossl_check_X509_INFO_type(ptr), (idx))
#define sk_X509_INFO_set(sk, idx, ptr) ((X509_INFO *)OPENSSL_sk_set(ossl_check_X509_INFO_sk_type(sk), (idx), ossl_check_X509_INFO_type(ptr)))
#define sk_X509_INFO_find(sk, ptr) OPENSSL_sk_find(ossl_check_X509_INFO_sk_type(sk), ossl_check_X509_INFO_type(ptr))
#define sk_X509_INFO_find_ex(sk, ptr) OPENSSL_sk_find_ex(ossl_check_X509_INFO_sk_type(sk), ossl_check_X509_INFO_type(ptr))
#define sk_X509_INFO_find_all(sk, ptr, pnum) OPENSSL_sk_find_all(ossl_check_X509_INFO_sk_type(sk), ossl_check_X509_INFO_type(ptr), pnum)
#define sk_X509_INFO_sort(sk) OPENSSL_sk_sort(ossl_check_X509_INFO_sk_type(sk))
#define sk_X509_INFO_is_sorted(sk) OPENSSL_sk_is_sorted(ossl_check_const_X509_INFO_sk_type(sk))
#define sk_X509_INFO_dup(sk) ((STACK_OF(X509_INFO) *)OPENSSL_sk_dup(ossl_check_const_X509_INFO_sk_type(sk)))
#define sk_X509_INFO_deep_copy(sk, copyfunc, freefunc) ((STACK_OF(X509_INFO) *)OPENSSL_sk_deep_copy(ossl_check_const_X509_INFO_sk_type(sk), ossl_check_X509_INFO_copyfunc_type(copyfunc), ossl_check_X509_INFO_freefunc_type(freefunc)))
#define sk_X509_INFO_set_cmp_func(sk, cmp) ((sk_X509_INFO_compfunc)OPENSSL_sk_set_cmp_func(ossl_check_X509_INFO_sk_type(sk), ossl_check_X509_INFO_compfunc_type(cmp)))


/*
 * The next 2 structures and their 8 routines are used to manipulate Netscape's
 * spki structures - useful if you are writing a CA web page
 */
typedef struct Netscape_spkac_st {
    X509_PUBKEY *pubkey;
    ASN1_IA5STRING *challenge;  /* challenge sent in atlas >= PR2 */
} NETSCAPE_SPKAC;

typedef struct Netscape_spki_st {
    NETSCAPE_SPKAC *spkac;      /* signed public key and challenge */
    X509_ALGOR sig_algor;
    ASN1_BIT_STRING *signature;
} NETSCAPE_SPKI;

/* Netscape certificate sequence structure */
typedef struct Netscape_certificate_sequence {
    ASN1_OBJECT *type;
    STACK_OF(X509) *certs;
} NETSCAPE_CERT_SEQUENCE;

/*- Unused (and iv length is wrong)
typedef struct CBCParameter_st
        {
        unsigned char iv[8];
        } CBC_PARAM;
*/

/* Password based encryption structure */

typedef struct PBEPARAM_st {
    ASN1_OCTET_STRING *salt;
    ASN1_INTEGER *iter;
} PBEPARAM;

/* Password based encryption V2 structures */

typedef struct PBE2PARAM_st {
    X509_ALGOR *keyfunc;
    X509_ALGOR *encryption;
} PBE2PARAM;

typedef struct PBKDF2PARAM_st {
/* Usually OCTET STRING but could be anything */
    ASN1_TYPE *salt;
    ASN1_INTEGER *iter;
    ASN1_INTEGER *keylength;
    X509_ALGOR *prf;
} PBKDF2PARAM;

#ifndef OPENSSL_NO_SCRYPT
typedef struct SCRYPT_PARAMS_st {
    ASN1_OCTET_STRING *salt;
    ASN1_INTEGER *costParameter;
    ASN1_INTEGER *blockSize;
    ASN1_INTEGER *parallelizationParameter;
    ASN1_INTEGER *keyLength;
} SCRYPT_PARAMS;
#endif

#ifdef  __cplusplus
}
#endif

# include <openssl/x509_vfy.h>
# include <openssl/pkcs7.h>

#ifdef  __cplusplus
extern "C" {
#endif

# define X509_EXT_PACK_UNKNOWN   1
# define X509_EXT_PACK_STRING    2

# define         X509_extract_key(x)     X509_get_pubkey(x)/*****/
# define         X509_REQ_extract_key(a) X509_REQ_get_pubkey(a)
# define         X509_name_cmp(a,b)      X509_NAME_cmp((a),(b))

void X509_CRL_set_default_method(const X509_CRL_METHOD *meth);
X509_CRL_METHOD *X509_CRL_METHOD_new(int (*crl_init) (X509_CRL *crl),
                                     int (*crl_free) (X509_CRL *crl),
                                     int (*crl_lookup) (X509_CRL *crl,
                                                        X509_REVOKED **ret,
                                                        const
                                                        ASN1_INTEGER *serial,
                                                        const
                                                        X509_NAME *issuer),
                                     int (*crl_verify) (X509_CRL *crl,
                                                        EVP_PKEY *pk));
void X509_CRL_METHOD_free(X509_CRL_METHOD *m);

void X509_CRL_set_meth_data(X509_CRL *crl, void *dat);
void *X509_CRL_get_meth_data(X509_CRL *crl);

const char *X509_verify_cert_error_string(long n);

int X509_verify(X509 *a, EVP_PKEY *r);
int X509_self_signed(X509 *cert, int verify_signature);

int X509_REQ_verify_ex(X509_REQ *a, EVP_PKEY *r, OSSL_LIB_CTX *libctx,
                       const char *propq);
int X509_REQ_verify(X509_REQ *a, EVP_PKEY *r);
int X509_CRL_verify(X509_CRL *a, EVP_PKEY *r);
int NETSCAPE_SPKI_verify(NETSCAPE_SPKI *a, EVP_PKEY *r);

NETSCAPE_SPKI *NETSCAPE_SPKI_b64_decode(const char *str, int len);
char *NETSCAPE_SPKI_b64_encode(NETSCAPE_SPKI *x);
EVP_PKEY *NETSCAPE_SPKI_get_pubkey(NETSCAPE_SPKI *x);
int NETSCAPE_SPKI_set_pubkey(NETSCAPE_SPKI *x, EVP_PKEY *pkey);

int NETSCAPE_SPKI_print(BIO *out, NETSCAPE_SPKI *spki);

int X509_signature_dump(BIO *bp, const ASN1_STRING *sig, int indent);
int X509_signature_print(BIO *bp, const X509_ALGOR *alg,
                         const ASN1_STRING *sig);

int X509_sign(X509 *x, EVP_PKEY *pkey, const EVP_MD *md);
int X509_sign_ctx(X509 *x, EVP_MD_CTX *ctx);
int X509_REQ_sign(X509_REQ *x, EVP_PKEY *pkey, const EVP_MD *md);
int X509_REQ_sign_ctx(X509_REQ *x, EVP_MD_CTX *ctx);
int X509_CRL_sign(X509_CRL *x, EVP_PKEY *pkey, const EVP_MD *md);
int X509_CRL_sign_ctx(X509_CRL *x, EVP_MD_CTX *ctx);
int NETSCAPE_SPKI_sign(NETSCAPE_SPKI *x, EVP_PKEY *pkey, const EVP_MD *md);

int X509_pubkey_digest(const X509 *data, const EVP_MD *type,
                       unsigned char *md, unsigned int *len);
int X509_digest(const X509 *data, const EVP_MD *type,
                unsigned char *md, unsigned int *len);
ASN1_OCTET_STRING *X509_digest_sig(const X509 *cert,
                                   EVP_MD **md_used, int *md_is_fallback);
int X509_CRL_digest(const X509_CRL *data, const EVP_MD *type,
                    unsigned char *md, unsigned int *len);
int X509_REQ_digest(const X509_REQ *data, const EVP_MD *type,
                    unsigned char *md, unsigned int *len);
int X509_NAME_digest(const X509_NAME *data, const EVP_MD *type,
                     unsigned char *md, unsigned int *len);

X509 *X509_load_http(const char *url, BIO *bio, BIO *rbio, int timeout);
X509_CRL *X509_CRL_load_http(const char *url, BIO *bio, BIO *rbio, int timeout);
# ifndef OPENSSL_NO_DEPRECATED_3_0
#  include <openssl/http.h> /* OSSL_HTTP_REQ_CTX_nbio_d2i */
#  define X509_http_nbio(rctx, pcert) \
      OSSL_HTTP_REQ_CTX_nbio_d2i(rctx, pcert, ASN1_ITEM_rptr(X509))
#  define X509_CRL_http_nbio(rctx, pcrl) \
      OSSL_HTTP_REQ_CTX_nbio_d2i(rctx, pcrl, ASN1_ITEM_rptr(X509_CRL))
# endif

# ifndef OPENSSL_NO_STDIO
X509 *d2i_X509_fp(FILE *fp, X509 **x509);
int i2d_X509_fp(FILE *fp, const X509 *x509);
X509_CRL *d2i_X509_CRL_fp(FILE *fp, X509_CRL **crl);
int i2d_X509_CRL_fp(FILE *fp, const X509_CRL *crl);
X509_REQ *d2i_X509_REQ_fp(FILE *fp, X509_REQ **req);
int i2d_X509_REQ_fp(FILE *fp, const X509_REQ *req);
#  ifndef OPENSSL_NO_DEPRECATED_3_0
OSSL_DEPRECATEDIN_3_0 RSA *d2i_RSAPrivateKey_fp(FILE *fp, RSA **rsa);
OSSL_DEPRECATEDIN_3_0 int i2d_RSAPrivateKey_fp(FILE *fp, const RSA *rsa);
OSSL_DEPRECATEDIN_3_0 RSA *d2i_RSAPublicKey_fp(FILE *fp, RSA **rsa);
OSSL_DEPRECATEDIN_3_0 int i2d_RSAPublicKey_fp(FILE *fp, const RSA *rsa);
OSSL_DEPRECATEDIN_3_0 RSA *d2i_RSA_PUBKEY_fp(FILE *fp, RSA **rsa);
OSSL_DEPRECATEDIN_3_0 int i2d_RSA_PUBKEY_fp(FILE *fp, const RSA *rsa);
#  endif
#  ifndef OPENSSL_NO_DEPRECATED_3_0
#   ifndef OPENSSL_NO_DSA
OSSL_DEPRECATEDIN_3_0 DSA *d2i_DSA_PUBKEY_fp(FILE *fp, DSA **dsa);
OSSL_DEPRECATEDIN_3_0 int i2d_DSA_PUBKEY_fp(FILE *fp, const DSA *dsa);
OSSL_DEPRECATEDIN_3_0 DSA *d2i_DSAPrivateKey_fp(FILE *fp, DSA **dsa);
OSSL_DEPRECATEDIN_3_0 int i2d_DSAPrivateKey_fp(FILE *fp, const DSA *dsa);
#   endif
#  endif
#  ifndef OPENSSL_NO_DEPRECATED_3_0
#   ifndef OPENSSL_NO_EC
OSSL_DEPRECATEDIN_3_0 EC_KEY *d2i_EC_PUBKEY_fp(FILE *fp, EC_KEY **eckey);
OSSL_DEPRECATEDIN_3_0 int i2d_EC_PUBKEY_fp(FILE *fp, const EC_KEY *eckey);
OSSL_DEPRECATEDIN_3_0 EC_KEY *d2i_ECPrivateKey_fp(FILE *fp, EC_KEY **eckey);
OSSL_DEPRECATEDIN_3_0 int i2d_ECPrivateKey_fp(FILE *fp, const EC_KEY *eckey);
#   endif /* OPENSSL_NO_EC */
#  endif /* OPENSSL_NO_DEPRECATED_3_0 */
X509_SIG *d2i_PKCS8_fp(FILE *fp, X509_SIG **p8);
int i2d_PKCS8_fp(FILE *fp, const X509_SIG *p8);
X509_PUBKEY *d2i_X509_PUBKEY_fp(FILE *fp, X509_PUBKEY **xpk);
int i2d_X509_PUBKEY_fp(FILE *fp, const X509_PUBKEY *xpk);
PKCS8_PRIV_KEY_INFO *d2i_PKCS8_PRIV_KEY_INFO_fp(FILE *fp,
                                                PKCS8_PRIV_KEY_INFO **p8inf);
int i2d_PKCS8_PRIV_KEY_INFO_fp(FILE *fp, const PKCS8_PRIV_KEY_INFO *p8inf);
int i2d_PKCS8PrivateKeyInfo_fp(FILE *fp, const EVP_PKEY *key);
int i2d_PrivateKey_fp(FILE *fp, const EVP_PKEY *pkey);
EVP_PKEY *d2i_PrivateKey_ex_fp(FILE *fp, EVP_PKEY **a, OSSL_LIB_CTX *libctx,
                               const char *propq);
EVP_PKEY *d2i_PrivateKey_fp(FILE *fp, EVP_PKEY **a);
int i2d_PUBKEY_fp(FILE *fp, const EVP_PKEY *pkey);
EVP_PKEY *d2i_PUBKEY_fp(FILE *fp, EVP_PKEY **a);
# endif

X509 *d2i_X509_bio(BIO *bp, X509 **x509);
int i2d_X509_bio(BIO *bp, const X509 *x509);
X509_CRL *d2i_X509_CRL_bio(BIO *bp, X509_CRL **crl);
int i2d_X509_CRL_bio(BIO *bp, const X509_CRL *crl);
X509_REQ *d2i_X509_REQ_bio(BIO *bp, X509_REQ **req);
int i2d_X509_REQ_bio(BIO *bp, const X509_REQ *req);
#  ifndef OPENSSL_NO_DEPRECATED_3_0
OSSL_DEPRECATEDIN_3_0 RSA *d2i_RSAPrivateKey_bio(BIO *bp, RSA **rsa);
OSSL_DEPRECATEDIN_3_0 int i2d_RSAPrivateKey_bio(BIO *bp, const RSA *rsa);
OSSL_DEPRECATEDIN_3_0 RSA *d2i_RSAPublicKey_bio(BIO *bp, RSA **rsa);
OSSL_DEPRECATEDIN_3_0 int i2d_RSAPublicKey_bio(BIO *bp, const RSA *rsa);
OSSL_DEPRECATEDIN_3_0 RSA *d2i_RSA_PUBKEY_bio(BIO *bp, RSA **rsa);
OSSL_DEPRECATEDIN_3_0 int i2d_RSA_PUBKEY_bio(BIO *bp, const RSA *rsa);
#  endif
#  ifndef OPENSSL_NO_DEPRECATED_3_0
#   ifndef OPENSSL_NO_DSA
OSSL_DEPRECATEDIN_3_0 DSA *d2i_DSA_PUBKEY_bio(BIO *bp, DSA **dsa);
OSSL_DEPRECATEDIN_3_0 int i2d_DSA_PUBKEY_bio(BIO *bp, const DSA *dsa);
OSSL_DEPRECATEDIN_3_0 DSA *d2i_DSAPrivateKey_bio(BIO *bp, DSA **dsa);
OSSL_DEPRECATEDIN_3_0 int i2d_DSAPrivateKey_bio(BIO *bp, const DSA *dsa);
#   endif
#  endif

#  ifndef OPENSSL_NO_DEPRECATED_3_0
#   ifndef OPENSSL_NO_EC
OSSL_DEPRECATEDIN_3_0 EC_KEY *d2i_EC_PUBKEY_bio(BIO *bp, EC_KEY **eckey);
OSSL_DEPRECATEDIN_3_0 int i2d_EC_PUBKEY_bio(BIO *bp, const EC_KEY *eckey);
OSSL_DEPRECATEDIN_3_0 EC_KEY *d2i_ECPrivateKey_bio(BIO *bp, EC_KEY **eckey);
OSSL_DEPRECATEDIN_3_0 int i2d_ECPrivateKey_bio(BIO *bp, const EC_KEY *eckey);
#   endif /* OPENSSL_NO_EC */
#  endif /* OPENSSL_NO_DEPRECATED_3_0 */

X509_SIG *d2i_PKCS8_bio(BIO *bp, X509_SIG **p8);
int i2d_PKCS8_bio(BIO *bp, const X509_SIG *p8);
X509_PUBKEY *d2i_X509_PUBKEY_bio(BIO *bp, X509_PUBKEY **xpk);
int i2d_X509_PUBKEY_bio(BIO *bp, const X509_PUBKEY *xpk);
PKCS8_PRIV_KEY_INFO *d2i_PKCS8_PRIV_KEY_INFO_bio(BIO *bp,
                                                 PKCS8_PRIV_KEY_INFO **p8inf);
int i2d_PKCS8_PRIV_KEY_INFO_bio(BIO *bp, const PKCS8_PRIV_KEY_INFO *p8inf);
int i2d_PKCS8PrivateKeyInfo_bio(BIO *bp, const EVP_PKEY *key);
int i2d_PrivateKey_bio(BIO *bp, const EVP_PKEY *pkey);
EVP_PKEY *d2i_PrivateKey_ex_bio(BIO *bp, EVP_PKEY **a, OSSL_LIB_CTX *libctx,
                                const char *propq);
EVP_PKEY *d2i_PrivateKey_bio(BIO *bp, EVP_PKEY **a);
int i2d_PUBKEY_bio(BIO *bp, const EVP_PKEY *pkey);
EVP_PKEY *d2i_PUBKEY_bio(BIO *bp, EVP_PKEY **a);

DECLARE_ASN1_DUP_FUNCTION(X509)
DECLARE_ASN1_DUP_FUNCTION(X509_ALGOR)
DECLARE_ASN1_DUP_FUNCTION(X509_ATTRIBUTE)
DECLARE_ASN1_DUP_FUNCTION(X509_CRL)
DECLARE_ASN1_DUP_FUNCTION(X509_EXTENSION)
DECLARE_ASN1_DUP_FUNCTION(X509_PUBKEY)
DECLARE_ASN1_DUP_FUNCTION(X509_REQ)
DECLARE_ASN1_DUP_FUNCTION(X509_REVOKED)
int X509_ALGOR_set0(X509_ALGOR *alg, ASN1_OBJECT *aobj, int ptype,
                    void *pval);
void X509_ALGOR_get0(const ASN1_OBJECT **paobj, int *pptype,
                     const void **ppval, const X509_ALGOR *algor);
void X509_ALGOR_set_md(X509_ALGOR *alg, const EVP_MD *md);
int X509_ALGOR_cmp(const X509_ALGOR *a, const X509_ALGOR *b);
int X509_ALGOR_copy(X509_ALGOR *dest, const X509_ALGOR *src);

DECLARE_ASN1_DUP_FUNCTION(X509_NAME)
DECLARE_ASN1_DUP_FUNCTION(X509_NAME_ENTRY)

int X509_cmp_time(const ASN1_TIME *s, time_t *t);
int X509_cmp_current_time(const ASN1_TIME *s);
int X509_cmp_timeframe(const X509_VERIFY_PARAM *vpm,
                       const ASN1_TIME *start, const ASN1_TIME *end);
ASN1_TIME *X509_time_adj(ASN1_TIME *s, long adj, time_t *t);
ASN1_TIME *X509_time_adj_ex(ASN1_TIME *s,
                            int offset_day, long offset_sec, time_t *t);
ASN1_TIME *X509_gmtime_adj(ASN1_TIME *s, long adj);

const char *X509_get_default_cert_area(void);
const char *X509_get_default_cert_dir(void);
const char *X509_get_default_cert_file(void);
const char *X509_get_default_cert_dir_env(void);
const char *X509_get_default_cert_file_env(void);
const char *X509_get_default_private_dir(void);

X509_REQ *X509_to_X509_REQ(X509 *x, EVP_PKEY *pkey, const EVP_MD *md);
X509 *X509_REQ_to_X509(X509_REQ *r, int days, EVP_PKEY *pkey);

DECLARE_ASN1_FUNCTIONS(X509_ALGOR)
DECLARE_ASN1_ENCODE_FUNCTIONS(X509_ALGORS, X509_ALGORS, X509_ALGORS)
DECLARE_ASN1_FUNCTIONS(X509_VAL)

DECLARE_ASN1_FUNCTIONS(X509_PUBKEY)

X509_PUBKEY *X509_PUBKEY_new_ex(OSSL_LIB_CTX *libctx, const char *propq);
int X509_PUBKEY_set(X509_PUBKEY **x, EVP_PKEY *pkey);
EVP_PKEY *X509_PUBKEY_get0(const X509_PUBKEY *key);
EVP_PKEY *X509_PUBKEY_get(const X509_PUBKEY *key);
int X509_get_pubkey_parameters(EVP_PKEY *pkey, STACK_OF(X509) *chain);
long X509_get_pathlen(X509 *x);
DECLARE_ASN1_ENCODE_FUNCTIONS_only(EVP_PKEY, PUBKEY)
EVP_PKEY *d2i_PUBKEY_ex(EVP_PKEY **a, const unsigned char **pp, long length,
                        OSSL_LIB_CTX *libctx, const char *propq);
# ifndef OPENSSL_NO_DEPRECATED_3_0
DECLARE_ASN1_ENCODE_FUNCTIONS_only_attr(OSSL_DEPRECATEDIN_3_0,RSA, RSA_PUBKEY)
# endif
# ifndef OPENSSL_NO_DEPRECATED_3_0
#  ifndef OPENSSL_NO_DSA
DECLARE_ASN1_ENCODE_FUNCTIONS_only_attr(OSSL_DEPRECATEDIN_3_0,DSA, DSA_PUBKEY)
#  endif
# endif
# ifndef OPENSSL_NO_DEPRECATED_3_0
#  ifndef OPENSSL_NO_EC
DECLARE_ASN1_ENCODE_FUNCTIONS_only_attr(OSSL_DEPRECATEDIN_3_0, EC_KEY, EC_PUBKEY)
#  endif
# endif

DECLARE_ASN1_FUNCTIONS(X509_SIG)
void X509_SIG_get0(const X509_SIG *sig, const X509_ALGOR **palg,
                   const ASN1_OCTET_STRING **pdigest);
void X509_SIG_getm(X509_SIG *sig, X509_ALGOR **palg,
                   ASN1_OCTET_STRING **pdigest);

DECLARE_ASN1_FUNCTIONS(X509_REQ_INFO)
DECLARE_ASN1_FUNCTIONS(X509_REQ)
X509_REQ *X509_REQ_new_ex(OSSL_LIB_CTX *libctx, const char *propq);

DECLARE_ASN1_FUNCTIONS(X509_ATTRIBUTE)
X509_ATTRIBUTE *X509_ATTRIBUTE_create(int nid, int atrtype, void *value);

DECLARE_ASN1_FUNCTIONS(X509_EXTENSION)
DECLARE_ASN1_ENCODE_FUNCTIONS(X509_EXTENSIONS, X509_EXTENSIONS, X509_EXTENSIONS)

DECLARE_ASN1_FUNCTIONS(X509_NAME_ENTRY)

DECLARE_ASN1_FUNCTIONS(X509_NAME)

int X509_NAME_set(X509_NAME **xn, const X509_NAME *name);

DECLARE_ASN1_FUNCTIONS(X509_CINF)
DECLARE_ASN1_FUNCTIONS(X509)
X509 *X509_new_ex(OSSL_LIB_CTX *libctx, const char *propq);
DECLARE_ASN1_FUNCTIONS(X509_CERT_AUX)

#define X509_get_ex_new_index(l, p, newf, dupf, freef) \
    CRYPTO_get_ex_new_index(CRYPTO_EX_INDEX_X509, l, p, newf, dupf, freef)
int X509_set_ex_data(X509 *r, int idx, void *arg);
void *X509_get_ex_data(const X509 *r, int idx);
DECLARE_ASN1_ENCODE_FUNCTIONS_only(X509,X509_AUX)

int i2d_re_X509_tbs(X509 *x, unsigned char **pp);

int X509_SIG_INFO_get(const X509_SIG_INFO *siginf, int *mdnid, int *pknid,
                      int *secbits, uint32_t *flags);
void X509_SIG_INFO_set(X509_SIG_INFO *siginf, int mdnid, int pknid,
                       int secbits, uint32_t flags);

int X509_get_signature_info(X509 *x, int *mdnid, int *pknid, int *secbits,
                            uint32_t *flags);

void X509_get0_signature(const ASN1_BIT_STRING **psig,
                         const X509_ALGOR **palg, const X509 *x);
int X509_get_signature_nid(const X509 *x);

void X509_set0_distinguishing_id(X509 *x, ASN1_OCTET_STRING *d_id);
ASN1_OCTET_STRING *X509_get0_distinguishing_id(X509 *x);
void X509_REQ_set0_distinguishing_id(X509_REQ *x, ASN1_OCTET_STRING *d_id);
ASN1_OCTET_STRING *X509_REQ_get0_distinguishing_id(X509_REQ *x);

int X509_alias_set1(X509 *x, const unsigned char *name, int len);
int X509_keyid_set1(X509 *x, const unsigned char *id, int len);
unsigned char *X509_alias_get0(X509 *x, int *len);
unsigned char *X509_keyid_get0(X509 *x, int *len);

DECLARE_ASN1_FUNCTIONS(X509_REVOKED)
DECLARE_ASN1_FUNCTIONS(X509_CRL_INFO)
DECLARE_ASN1_FUNCTIONS(X509_CRL)
X509_CRL *X509_CRL_new_ex(OSSL_LIB_CTX *libctx, const char *propq);

int X509_CRL_add0_revoked(X509_CRL *crl, X509_REVOKED *rev);
int X509_CRL_get0_by_serial(X509_CRL *crl,
                            X509_REVOKED **ret, const ASN1_INTEGER *serial);
int X509_CRL_get0_by_cert(X509_CRL *crl, X509_REVOKED **ret, X509 *x);

X509_PKEY *X509_PKEY_new(void);
void X509_PKEY_free(X509_PKEY *a);

DECLARE_ASN1_FUNCTIONS(NETSCAPE_SPKI)
DECLARE_ASN1_FUNCTIONS(NETSCAPE_SPKAC)
DECLARE_ASN1_FUNCTIONS(NETSCAPE_CERT_SEQUENCE)

X509_INFO *X509_INFO_new(void);
void X509_INFO_free(X509_INFO *a);
char *X509_NAME_oneline(const X509_NAME *a, char *buf, int size);

#ifndef OPENSSL_NO_DEPRECATED_3_0
OSSL_DEPRECATEDIN_3_0
int ASN1_verify(i2d_of_void *i2d, X509_ALGOR *algor1,
                ASN1_BIT_STRING *signature, char *data, EVP_PKEY *pkey);
OSSL_DEPRECATEDIN_3_0
int ASN1_digest(i2d_of_void *i2d, const EVP_MD *type, char *data,
                unsigned char *md, unsigned int *len);
OSSL_DEPRECATEDIN_3_0
int ASN1_sign(i2d_of_void *i2d, X509_ALGOR *algor1, X509_ALGOR *algor2,
              ASN1_BIT_STRING *signature, char *data, EVP_PKEY *pkey,
              const EVP_MD *type);
#endif
int ASN1_item_digest(const ASN1_ITEM *it, const EVP_MD *type, void *data,
                     unsigned char *md, unsigned int *len);
int ASN1_item_verify(const ASN1_ITEM *it, const X509_ALGOR *alg,
                     const ASN1_BIT_STRING *signature, const void *data,
                     EVP_PKEY *pkey);
int ASN1_item_verify_ctx(const ASN1_ITEM *it, const X509_ALGOR *alg,
                         const ASN1_BIT_STRING *signature, const void *data,
                         EVP_MD_CTX *ctx);
int ASN1_item_sign(const ASN1_ITEM *it, X509_ALGOR *algor1, X509_ALGOR *algor2,
                   ASN1_BIT_STRING *signature, const void *data,
                   EVP_PKEY *pkey, const EVP_MD *md);
int ASN1_item_sign_ctx(const ASN1_ITEM *it, X509_ALGOR *algor1,
                       X509_ALGOR *algor2, ASN1_BIT_STRING *signature,
                       const void *data, EVP_MD_CTX *ctx);

#define X509_VERSION_1 0
#define X509_VERSION_2 1
#define X509_VERSION_3 2

long X509_get_version(const X509 *x);
int X509_set_version(X509 *x, long version);
int X509_set_serialNumber(X509 *x, ASN1_INTEGER *serial);
ASN1_INTEGER *X509_get_serialNumber(X509 *x);
const ASN1_INTEGER *X509_get0_serialNumber(const X509 *x);
int X509_set_issuer_name(X509 *x, const X509_NAME *name);
X509_NAME *X509_get_issuer_name(const X509 *a);
int X509_set_subject_name(X509 *x, const X509_NAME *name);
X509_NAME *X509_get_subject_name(const X509 *a);
const ASN1_TIME * X509_get0_notBefore(const X509 *x);
ASN1_TIME *X509_getm_notBefore(const X509 *x);
int X509_set1_notBefore(X509 *x, const ASN1_TIME *tm);
const ASN1_TIME *X509_get0_notAfter(const X509 *x);
ASN1_TIME *X509_getm_notAfter(const X509 *x);
int X509_set1_notAfter(X509 *x, const ASN1_TIME *tm);
int X509_set_pubkey(X509 *x, EVP_PKEY *pkey);
int X509_up_ref(X509 *x);
int X509_get_signature_type(const X509 *x);

# ifndef OPENSSL_NO_DEPRECATED_1_1_0
#  define X509_get_notBefore X509_getm_notBefore
#  define X509_get_notAfter X509_getm_notAfter
#  define X509_set_notBefore X509_set1_notBefore
#  define X509_set_notAfter X509_set1_notAfter
#endif


/*
 * This one is only used so that a binary form can output, as in
 * i2d_X509_PUBKEY(X509_get_X509_PUBKEY(x), &buf)
 */
X509_PUBKEY *X509_get_X509_PUBKEY(const X509 *x);
const STACK_OF(X509_EXTENSION) *X509_get0_extensions(const X509 *x);
void X509_get0_uids(const X509 *x, const ASN1_BIT_STRING **piuid,
                    const ASN1_BIT_STRING **psuid);
const X509_ALGOR *X509_get0_tbs_sigalg(const X509 *x);

EVP_PKEY *X509_get0_pubkey(const X509 *x);
EVP_PKEY *X509_get_pubkey(X509 *x);
ASN1_BIT_STRING *X509_get0_pubkey_bitstr(const X509 *x);

#define X509_REQ_VERSION_1 0

long X509_REQ_get_version(const X509_REQ *req);
int X509_REQ_set_version(X509_REQ *x, long version);
X509_NAME *X509_REQ_get_subject_name(const X509_REQ *req);
int X509_REQ_set_subject_name(X509_REQ *req, const X509_NAME *name);
void X509_REQ_get0_signature(const X509_REQ *req, const ASN1_BIT_STRING **psig,
                             const X509_ALGOR **palg);
void X509_REQ_set0_signature(X509_REQ *req, ASN1_BIT_STRING *psig);
int X509_REQ_set1_signature_algo(X509_REQ *req, X509_ALGOR *palg);
int X509_REQ_get_signature_nid(const X509_REQ *req);
int i2d_re_X509_REQ_tbs(X509_REQ *req, unsigned char **pp);
int X509_REQ_set_pubkey(X509_REQ *x, EVP_PKEY *pkey);
EVP_PKEY *X509_REQ_get_pubkey(X509_REQ *req);
EVP_PKEY *X509_REQ_get0_pubkey(X509_REQ *req);
X509_PUBKEY *X509_REQ_get_X509_PUBKEY(X509_REQ *req);
int X509_REQ_extension_nid(int nid);
int *X509_REQ_get_extension_nids(void);
void X509_REQ_set_extension_nids(int *nids);
STACK_OF(X509_EXTENSION) *X509_REQ_get_extensions(X509_REQ *req);
int X509_REQ_add_extensions_nid(X509_REQ *req,
                                const STACK_OF(X509_EXTENSION) *exts, int nid);
int X509_REQ_add_extensions(X509_REQ *req, const STACK_OF(X509_EXTENSION) *ext);
int X509_REQ_get_attr_count(const X509_REQ *req);
int X509_REQ_get_attr_by_NID(const X509_REQ *req, int nid, int lastpos);
int X509_REQ_get_attr_by_OBJ(const X509_REQ *req, const ASN1_OBJECT *obj,
                             int lastpos);
X509_ATTRIBUTE *X509_REQ_get_attr(const X509_REQ *req, int loc);
X509_ATTRIBUTE *X509_REQ_delete_attr(X509_REQ *req, int loc);
int X509_REQ_add1_attr(X509_REQ *req, X509_ATTRIBUTE *attr);
int X509_REQ_add1_attr_by_OBJ(X509_REQ *req,
                              const ASN1_OBJECT *obj, int type,
                              const unsigned char *bytes, int len);
int X509_REQ_add1_attr_by_NID(X509_REQ *req,
                              int nid, int type,
                              const unsigned char *bytes, int len);
int X509_REQ_add1_attr_by_txt(X509_REQ *req,
                              const char *attrname, int type,
                              const unsigned char *bytes, int len);

#define X509_CRL_VERSION_1 0
#define X509_CRL_VERSION_2 1

int X509_CRL_set_version(X509_CRL *x, long version);
int X509_CRL_set_issuer_name(X509_CRL *x, const X509_NAME *name);
int X509_CRL_set1_lastUpdate(X509_CRL *x, const ASN1_TIME *tm);
int X509_CRL_set1_nextUpdate(X509_CRL *x, const ASN1_TIME *tm);
int X509_CRL_sort(X509_CRL *crl);
int X509_CRL_up_ref(X509_CRL *crl);

# ifndef OPENSSL_NO_DEPRECATED_1_1_0
#  define X509_CRL_set_lastUpdate X509_CRL_set1_lastUpdate
#  define X509_CRL_set_nextUpdate X509_CRL_set1_nextUpdate
#endif

long X509_CRL_get_version(const X509_CRL *crl);
const ASN1_TIME *X509_CRL_get0_lastUpdate(const X509_CRL *crl);
const ASN1_TIME *X509_CRL_get0_nextUpdate(const X509_CRL *crl);
#ifndef OPENSSL_NO_DEPRECATED_1_1_0
OSSL_DEPRECATEDIN_1_1_0 ASN1_TIME *X509_CRL_get_lastUpdate(X509_CRL *crl);
OSSL_DEPRECATEDIN_1_1_0 ASN1_TIME *X509_CRL_get_nextUpdate(X509_CRL *crl);
#endif
X509_NAME *X509_CRL_get_issuer(const X509_CRL *crl);
const STACK_OF(X509_EXTENSION) *X509_CRL_get0_extensions(const X509_CRL *crl);
STACK_OF(X509_REVOKED) *X509_CRL_get_REVOKED(X509_CRL *crl);
void X509_CRL_get0_signature(const X509_CRL *crl, const ASN1_BIT_STRING **psig,
                             const X509_ALGOR **palg);
int X509_CRL_get_signature_nid(const X509_CRL *crl);
int i2d_re_X509_CRL_tbs(X509_CRL *req, unsigned char **pp);

const ASN1_INTEGER *X509_REVOKED_get0_serialNumber(const X509_REVOKED *x);
int X509_REVOKED_set_serialNumber(X509_REVOKED *x, ASN1_INTEGER *serial);
const ASN1_TIME *X509_REVOKED_get0_revocationDate(const X509_REVOKED *x);
int X509_REVOKED_set_revocationDate(X509_REVOKED *r, ASN1_TIME *tm);
const STACK_OF(X509_EXTENSION) *
X509_REVOKED_get0_extensions(const X509_REVOKED *r);

X509_CRL *X509_CRL_diff(X509_CRL *base, X509_CRL *newer,
                        EVP_PKEY *skey, const EVP_MD *md, unsigned int flags);

int X509_REQ_check_private_key(X509_REQ *x509, EVP_PKEY *pkey);

int X509_check_private_key(const X509 *x509, const EVP_PKEY *pkey);
int X509_chain_check_suiteb(int *perror_depth,
                            X509 *x, STACK_OF(X509) *chain,
                            unsigned long flags);
int X509_CRL_check_suiteb(X509_CRL *crl, EVP_PKEY *pk, unsigned long flags);
STACK_OF(X509) *X509_chain_up_ref(STACK_OF(X509) *chain);

int X509_issuer_and_serial_cmp(const X509 *a, const X509 *b);
unsigned long X509_issuer_and_serial_hash(X509 *a);

int X509_issuer_name_cmp(const X509 *a, const X509 *b);
unsigned long X509_issuer_name_hash(X509 *a);

int X509_subject_name_cmp(const X509 *a, const X509 *b);
unsigned long X509_subject_name_hash(X509 *x);

# ifndef OPENSSL_NO_MD5
unsigned long X509_issuer_name_hash_old(X509 *a);
unsigned long X509_subject_name_hash_old(X509 *x);
# endif

# define X509_ADD_FLAG_DEFAULT  0
# define X509_ADD_FLAG_UP_REF   0x1
# define X509_ADD_FLAG_PREPEND  0x2
# define X509_ADD_FLAG_NO_DUP   0x4
# define X509_ADD_FLAG_NO_SS    0x8
int X509_add_cert(STACK_OF(X509) *sk, X509 *cert, int flags);
int X509_add_certs(STACK_OF(X509) *sk, STACK_OF(X509) *certs, int flags);

int X509_cmp(const X509 *a, const X509 *b);
int X509_NAME_cmp(const X509_NAME *a, const X509_NAME *b);
#ifndef OPENSSL_NO_DEPRECATED_3_0
# define X509_NAME_hash(x) X509_NAME_hash_ex(x, NULL, NULL, NULL)
OSSL_DEPRECATEDIN_3_0 int X509_certificate_type(const X509 *x,
                                                const EVP_PKEY *pubkey);
#endif
unsigned long X509_NAME_hash_ex(const X509_NAME *x, OSSL_LIB_CTX *libctx,
                                const char *propq, int *ok);
unsigned long X509_NAME_hash_old(const X509_NAME *x);

int X509_CRL_cmp(const X509_CRL *a, const X509_CRL *b);
int X509_CRL_match(const X509_CRL *a, const X509_CRL *b);
int X509_aux_print(BIO *out, X509 *x, int indent);
# ifndef OPENSSL_NO_STDIO
int X509_print_ex_fp(FILE *bp, X509 *x, unsigned long nmflag,
                     unsigned long cflag);
int X509_print_fp(FILE *bp, X509 *x);
int X509_CRL_print_fp(FILE *bp, X509_CRL *x);
int X509_REQ_print_fp(FILE *bp, X509_REQ *req);
int X509_NAME_print_ex_fp(FILE *fp, const X509_NAME *nm, int indent,
                          unsigned long flags);
# endif

int X509_NAME_print(BIO *bp, const X509_NAME *name, int obase);
int X509_NAME_print_ex(BIO *out, const X509_NAME *nm, int indent,
                       unsigned long flags);
int X509_print_ex(BIO *bp, X509 *x, unsigned long nmflag,
                  unsigned long cflag);
int X509_print(BIO *bp, X509 *x);
int X509_ocspid_print(BIO *bp, X509 *x);
int X509_CRL_print_ex(BIO *out, X509_CRL *x, unsigned long nmflag);
int X509_CRL_print(BIO *bp, X509_CRL *x);
int X509_REQ_print_ex(BIO *bp, X509_REQ *x, unsigned long nmflag,
                      unsigned long cflag);
int X509_REQ_print(BIO *bp, X509_REQ *req);

int X509_NAME_entry_count(const X509_NAME *name);
int X509_NAME_get_text_by_NID(const X509_NAME *name, int nid,
                              char *buf, int len);
int X509_NAME_get_text_by_OBJ(const X509_NAME *name, const ASN1_OBJECT *obj,
                              char *buf, int len);

/*
 * NOTE: you should be passing -1, not 0 as lastpos. The functions that use
 * lastpos, search after that position on.
 */
int X509_NAME_get_index_by_NID(const X509_NAME *name, int nid, int lastpos);
int X509_NAME_get_index_by_OBJ(const X509_NAME *name, const ASN1_OBJECT *obj,
                               int lastpos);
X509_NAME_ENTRY *X509_NAME_get_entry(const X509_NAME *name, int loc);
X509_NAME_ENTRY *X509_NAME_delete_entry(X509_NAME *name, int loc);
int X509_NAME_add_entry(X509_NAME *name, const X509_NAME_ENTRY *ne,
                        int loc, int set);
int X509_NAME_add_entry_by_OBJ(X509_NAME *name, const ASN1_OBJECT *obj, int type,
                               const unsigned char *bytes, int len, int loc,
                               int set);
int X509_NAME_add_entry_by_NID(X509_NAME *name, int nid, int type,
                               const unsigned char *bytes, int len, int loc,
                               int set);
X509_NAME_ENTRY *X509_NAME_ENTRY_create_by_txt(X509_NAME_ENTRY **ne,
                                               const char *field, int type,
                                               const unsigned char *bytes,
                                               int len);
X509_NAME_ENTRY *X509_NAME_ENTRY_create_by_NID(X509_NAME_ENTRY **ne, int nid,
                                               int type,
                                               const unsigned char *bytes,
                                               int len);
int X509_NAME_add_entry_by_txt(X509_NAME *name, const char *field, int type,
                               const unsigned char *bytes, int len, int loc,
                               int set);
X509_NAME_ENTRY *X509_NAME_ENTRY_create_by_OBJ(X509_NAME_ENTRY **ne,
                                               const ASN1_OBJECT *obj, int type,
                                               const unsigned char *bytes,
                                               int len);
int X509_NAME_ENTRY_set_object(X509_NAME_ENTRY *ne, const ASN1_OBJECT *obj);
int X509_NAME_ENTRY_set_data(X509_NAME_ENTRY *ne, int type,
                             const unsigned char *bytes, int len);
ASN1_OBJECT *X509_NAME_ENTRY_get_object(const X509_NAME_ENTRY *ne);
ASN1_STRING * X509_NAME_ENTRY_get_data(const X509_NAME_ENTRY *ne);
int X509_NAME_ENTRY_set(const X509_NAME_ENTRY *ne);

int X509_NAME_get0_der(const X509_NAME *nm, const unsigned char **pder,
                       size_t *pderlen);

int X509v3_get_ext_count(const STACK_OF(X509_EXTENSION) *x);
int X509v3_get_ext_by_NID(const STACK_OF(X509_EXTENSION) *x,
                          int nid, int lastpos);
int X509v3_get_ext_by_OBJ(const STACK_OF(X509_EXTENSION) *x,
                          const ASN1_OBJECT *obj, int lastpos);
int X509v3_get_ext_by_critical(const STACK_OF(X509_EXTENSION) *x,
                               int crit, int lastpos);
X509_EXTENSION *X509v3_get_ext(const STACK_OF(X509_EXTENSION) *x, int loc);
X509_EXTENSION *X509v3_delete_ext(STACK_OF(X509_EXTENSION) *x, int loc);
STACK_OF(X509_EXTENSION) *X509v3_add_ext(STACK_OF(X509_EXTENSION) **x,
                                         X509_EXTENSION *ex, int loc);

int X509_get_ext_count(const X509 *x);
int X509_get_ext_by_NID(const X509 *x, int nid, int lastpos);
int X509_get_ext_by_OBJ(const X509 *x, const ASN1_OBJECT *obj, int lastpos);
int X509_get_ext_by_critical(const X509 *x, int crit, int lastpos);
X509_EXTENSION *X509_get_ext(const X509 *x, int loc);
X509_EXTENSION *X509_delete_ext(X509 *x, int loc);
int X509_add_ext(X509 *x, X509_EXTENSION *ex, int loc);
void *X509_get_ext_d2i(const X509 *x, int nid, int *crit, int *idx);
int X509_add1_ext_i2d(X509 *x, int nid, void *value, int crit,
                      unsigned long flags);

int X509_CRL_get_ext_count(const X509_CRL *x);
int X509_CRL_get_ext_by_NID(const X509_CRL *x, int nid, int lastpos);
int X509_CRL_get_ext_by_OBJ(const X509_CRL *x, const ASN1_OBJECT *obj,
                            int lastpos);
int X509_CRL_get_ext_by_critical(const X509_CRL *x, int crit, int lastpos);
X509_EXTENSION *X509_CRL_get_ext(const X509_CRL *x, int loc);
X509_EXTENSION *X509_CRL_delete_ext(X509_CRL *x, int loc);
int X509_CRL_add_ext(X509_CRL *x, X509_EXTENSION *ex, int loc);
void *X509_CRL_get_ext_d2i(const X509_CRL *x, int nid, int *crit, int *idx);
int X509_CRL_add1_ext_i2d(X509_CRL *x, int nid, void *value, int crit,
                          unsigned long flags);

int X509_REVOKED_get_ext_count(const X509_REVOKED *x);
int X509_REVOKED_get_ext_by_NID(const X509_REVOKED *x, int nid, int lastpos);
int X509_REVOKED_get_ext_by_OBJ(const X509_REVOKED *x, const ASN1_OBJECT *obj,
                                int lastpos);
int X509_REVOKED_get_ext_by_critical(const X509_REVOKED *x, int crit,
                                     int lastpos);
X509_EXTENSION *X509_REVOKED_get_ext(const X509_REVOKED *x, int loc);
X509_EXTENSION *X509_REVOKED_delete_ext(X509_REVOKED *x, int loc);
int X509_REVOKED_add_ext(X509_REVOKED *x, X509_EXTENSION *ex, int loc);
void *X509_REVOKED_get_ext_d2i(const X509_REVOKED *x, int nid, int *crit,
                               int *idx);
int X509_REVOKED_add1_ext_i2d(X509_REVOKED *x, int nid, void *value, int crit,
                              unsigned long flags);

X509_EXTENSION *X509_EXTENSION_create_by_NID(X509_EXTENSION **ex,
                                             int nid, int crit,
                                             ASN1_OCTET_STRING *data);
X509_EXTENSION *X509_EXTENSION_create_by_OBJ(X509_EXTENSION **ex,
                                             const ASN1_OBJECT *obj, int crit,
                                             ASN1_OCTET_STRING *data);
int X509_EXTENSION_set_object(X509_EXTENSION *ex, const ASN1_OBJECT *obj);
int X509_EXTENSION_set_critical(X509_EXTENSION *ex, int crit);
int X509_EXTENSION_set_data(X509_EXTENSION *ex, ASN1_OCTET_STRING *data);
ASN1_OBJECT *X509_EXTENSION_get_object(X509_EXTENSION *ex);
ASN1_OCTET_STRING *X509_EXTENSION_get_data(X509_EXTENSION *ne);
int X509_EXTENSION_get_critical(const X509_EXTENSION *ex);

int X509at_get_attr_count(const STACK_OF(X509_ATTRIBUTE) *x);
int X509at_get_attr_by_NID(const STACK_OF(X509_ATTRIBUTE) *x, int nid,
                           int lastpos);
int X509at_get_attr_by_OBJ(const STACK_OF(X509_ATTRIBUTE) *sk,
                           const ASN1_OBJECT *obj, int lastpos);
X509_ATTRIBUTE *X509at_get_attr(const STACK_OF(X509_ATTRIBUTE) *x, int loc);
X509_ATTRIBUTE *X509at_delete_attr(STACK_OF(X509_ATTRIBUTE) *x, int loc);
STACK_OF(X509_ATTRIBUTE) *X509at_add1_attr(STACK_OF(X509_ATTRIBUTE) **x,
                                           X509_ATTRIBUTE *attr);
STACK_OF(X509_ATTRIBUTE) *X509at_add1_attr_by_OBJ(STACK_OF(X509_ATTRIBUTE)
                                                  **x, const ASN1_OBJECT *obj,
                                                  int type,
                                                  const unsigned char *bytes,
                                                  int len);
STACK_OF(X509_ATTRIBUTE) *X509at_add1_attr_by_NID(STACK_OF(X509_ATTRIBUTE)
                                                  **x, int nid, int type,
                                                  const unsigned char *bytes,
                                                  int len);
STACK_OF(X509_ATTRIBUTE) *X509at_add1_attr_by_txt(STACK_OF(X509_ATTRIBUTE)
                                                  **x, const char *attrname,
                                                  int type,
                                                  const unsigned char *bytes,
                                                  int len);
void *X509at_get0_data_by_OBJ(const STACK_OF(X509_ATTRIBUTE) *x,
                              const ASN1_OBJECT *obj, int lastpos, int type);
X509_ATTRIBUTE *X509_ATTRIBUTE_create_by_NID(X509_ATTRIBUTE **attr, int nid,
                                             int atrtype, const void *data,
                                             int len);
X509_ATTRIBUTE *X509_ATTRIBUTE_create_by_OBJ(X509_ATTRIBUTE **attr,
                                             const ASN1_OBJECT *obj,
                                             int atrtype, const void *data,
                                             int len);
X509_ATTRIBUTE *X509_ATTRIBUTE_create_by_txt(X509_ATTRIBUTE **attr,
                                             const char *atrname, int type,
                                             const unsigned char *bytes,
                                             int len);
int X509_ATTRIBUTE_set1_object(X509_ATTRIBUTE *attr, const ASN1_OBJECT *obj);
int X509_ATTRIBUTE_set1_data(X509_ATTRIBUTE *attr, int attrtype,
                             const void *data, int len);
void *X509_ATTRIBUTE_get0_data(X509_ATTRIBUTE *attr, int idx, int atrtype,
                               void *data);
int X509_ATTRIBUTE_count(const X509_ATTRIBUTE *attr);
ASN1_OBJECT *X509_ATTRIBUTE_get0_object(X509_ATTRIBUTE *attr);
ASN1_TYPE *X509_ATTRIBUTE_get0_type(X509_ATTRIBUTE *attr, int idx);

int EVP_PKEY_get_attr_count(const EVP_PKEY *key);
int EVP_PKEY_get_attr_by_NID(const EVP_PKEY *key, int nid, int lastpos);
int EVP_PKEY_get_attr_by_OBJ(const EVP_PKEY *key, const ASN1_OBJECT *obj,
                             int lastpos);
X509_ATTRIBUTE *EVP_PKEY_get_attr(const EVP_PKEY *key, int loc);
X509_ATTRIBUTE *EVP_PKEY_delete_attr(EVP_PKEY *key, int loc);
int EVP_PKEY_add1_attr(EVP_PKEY *key, X509_ATTRIBUTE *attr);
int EVP_PKEY_add1_attr_by_OBJ(EVP_PKEY *key,
                              const ASN1_OBJECT *obj, int type,
                              const unsigned char *bytes, int len);
int EVP_PKEY_add1_attr_by_NID(EVP_PKEY *key,
                              int nid, int type,
                              const unsigned char *bytes, int len);
int EVP_PKEY_add1_attr_by_txt(EVP_PKEY *key,
                              const char *attrname, int type,
                              const unsigned char *bytes, int len);

/* lookup a cert from a X509 STACK */
X509 *X509_find_by_issuer_and_serial(STACK_OF(X509) *sk, const X509_NAME *name,
                                     const ASN1_INTEGER *serial);
X509 *X509_find_by_subject(STACK_OF(X509) *sk, const X509_NAME *name);

DECLARE_ASN1_FUNCTIONS(PBEPARAM)
DECLARE_ASN1_FUNCTIONS(PBE2PARAM)
DECLARE_ASN1_FUNCTIONS(PBKDF2PARAM)
#ifndef OPENSSL_NO_SCRYPT
DECLARE_ASN1_FUNCTIONS(SCRYPT_PARAMS)
#endif

int PKCS5_pbe_set0_algor(X509_ALGOR *algor, int alg, int iter,
                         const unsigned char *salt, int saltlen);
int PKCS5_pbe_set0_algor_ex(X509_ALGOR *algor, int alg, int iter,
                            const unsigned char *salt, int saltlen,
                            OSSL_LIB_CTX *libctx);

X509_ALGOR *PKCS5_pbe_set(int alg, int iter,
                          const unsigned char *salt, int saltlen);
X509_ALGOR *PKCS5_pbe_set_ex(int alg, int iter,
                             const unsigned char *salt, int saltlen,
                             OSSL_LIB_CTX *libctx);

X509_ALGOR *PKCS5_pbe2_set(const EVP_CIPHER *cipher, int iter,
                           unsigned char *salt, int saltlen);
X509_ALGOR *PKCS5_pbe2_set_iv(const EVP_CIPHER *cipher, int iter,
                              unsigned char *salt, int saltlen,
                              unsigned char *aiv, int prf_nid);
X509_ALGOR *PKCS5_pbe2_set_iv_ex(const EVP_CIPHER *cipher, int iter,
                                 unsigned char *salt, int saltlen,
                                 unsigned char *aiv, int prf_nid,
                                 OSSL_LIB_CTX *libctx);

#ifndef OPENSSL_NO_SCRYPT
X509_ALGOR *PKCS5_pbe2_set_scrypt(const EVP_CIPHER *cipher,
                                  const unsigned char *salt, int saltlen,
                                  unsigned char *aiv, uint64_t N, uint64_t r,
                                  uint64_t p);
#endif

X509_ALGOR *PKCS5_pbkdf2_set(int iter, unsigned char *salt, int saltlen,
                             int prf_nid, int keylen);
X509_ALGOR *PKCS5_pbkdf2_set_ex(int iter, unsigned char *salt, int saltlen,
                                int prf_nid, int keylen,
                                OSSL_LIB_CTX *libctx);

/* PKCS#8 utilities */

DECLARE_ASN1_FUNCTIONS(PKCS8_PRIV_KEY_INFO)

EVP_PKEY *EVP_PKCS82PKEY(const PKCS8_PRIV_KEY_INFO *p8);
EVP_PKEY *EVP_PKCS82PKEY_ex(const PKCS8_PRIV_KEY_INFO *p8, OSSL_LIB_CTX *libctx,
                            const char *propq);
PKCS8_PRIV_KEY_INFO *EVP_PKEY2PKCS8(const EVP_PKEY *pkey);

int PKCS8_pkey_set0(PKCS8_PRIV_KEY_INFO *priv, ASN1_OBJECT *aobj,
                    int version, int ptype, void *pval,
                    unsigned char *penc, int penclen);
int PKCS8_pkey_get0(const ASN1_OBJECT **ppkalg,
                    const unsigned char **pk, int *ppklen,
                    const X509_ALGOR **pa, const PKCS8_PRIV_KEY_INFO *p8);

const STACK_OF(X509_ATTRIBUTE) *
PKCS8_pkey_get0_attrs(const PKCS8_PRIV_KEY_INFO *p8);
int PKCS8_pkey_add1_attr(PKCS8_PRIV_KEY_INFO *p8, X509_ATTRIBUTE *attr);
int PKCS8_pkey_add1_attr_by_NID(PKCS8_PRIV_KEY_INFO *p8, int nid, int type,
                                const unsigned char *bytes, int len);
int PKCS8_pkey_add1_attr_by_OBJ(PKCS8_PRIV_KEY_INFO *p8, const ASN1_OBJECT *obj,
                                int type, const unsigned char *bytes, int len);


int X509_PUBKEY_set0_param(X509_PUBKEY *pub, ASN1_OBJECT *aobj,
                           int ptype, void *pval,
                           unsigned char *penc, int penclen);
int X509_PUBKEY_get0_param(ASN1_OBJECT **ppkalg,
                           const unsigned char **pk, int *ppklen,
                           X509_ALGOR **pa, const X509_PUBKEY *pub);
int X509_PUBKEY_eq(const X509_PUBKEY *a, const X509_PUBKEY *b);

# ifdef  __cplusplus
}
# endif
#endif
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       #      8         F  "9            "      '9         F  ,9            4      >9            `#      `9         F  ~9            #      9           9                  9            #      9           9           9                  9                  9           9           :            x$      :           &:                  0:            $      5:           L:            8$      X:           a:                  f:           r:                  w:           :                  :           :            $      :           :            :      :           :           :            	      :                  ;           ;            j      ;            n      +;           :;           ?;            ]      M;            S      ^;           c;            ]      q;                  ;           ;           ;            ]      ;            $      ;         F  ;                  ;                  ;           ;            M                  	             r                    {                                       %                    *            1          .          8          
          =            D          
          P                    U            \          
   h                    o                    v          	         {                      
                         
                                
                    &            N            	                               
                    &            
                '          
          ,                                                                                  A                            p                            	   @      8         	                                                                                                                                                        @                                                                  (                   0                   8                    @                   H             @      P             @      X             	      `             	      h             
      p                    x             P                    
                   `
                                      0                                                                                                                                                                                                                     `                   `                   `                                                                                 (            P$      0            $      8             %      @            0&      H            @'      P            P(      X            (      `            0)      h            )      p             ,      x            ,                  `-                   .                  .                  /                  0                  p2                  5                  9                  p:                  ;                  0;                  ;                  <                  ?                  @                  P@                   @                  @                   B                  B                   E      (            F      0             G      8            PG      @            pG      H             H      P            0H      X            `H      `            H      h            `I      p            I      x            J                  0K                  K                  P                  S                  V                  W                  Z                  [                  \                  `]                  `                  e                   k                  l                  l                   n                   n                  o                  q                  ,                         (                  0            *      8            r      @            m      H            N      P            s      X            @t      `                  h            t      p            t      x            pw                  w                  y                  z                                                      w                  `                  0                                                                                                            0                                    Љ                                                       Њ                                     P      (                  0                  8            `      @                  H                  P                  X                  `                   h            `      p                  x                                                                   p                                                      P                                                      p                                                                        0                  @                  @                  p                                     `                                     @                         (                  0                  8                  @                  H                   P                   X                  `            4      h            м      p            @      x            P                                    @                                                                         @                                    p                  @                                                                                                                                0                                     0                                    P                         (            0      0                  8                  @                  H                  P                  X                  `            p      h            p      p                   x            P                                                                        0                                                                                            @                  @                                     P                  p                                                      @                                                                         `                   p      (            @      0            P      8            0      @            P      H                   P            0      X                  `                  h            P      p            p      x                              p                                       i                   a                                                         	                   8
                   \                    E      $             
      (             G
      ,             L
      0             Q
      4             ]      8                    <                   @                   D                   H                   L             R      P                   T                   X                   \             "      `                    d             $      h             $      l             $      p             $      t             1(      x             )      |             )                   +                   ,                   
-                   S-                   .                   ^.                   .                   4/                   /                   <0                   P0                   1                   :2                   L2                   ^2                   j5                   9                   ?:                   N:                   V:                   :                   ;                   ";                   j;                   ~;                   ;                   <                   ?                   ?                   
@                   .@                   H@                   n@                  ~@                  @                  @                  ;A                  A                  B                  C                   	F      $            F      (            F      ,            F      0            "G      4            `G      8            G      <            H      @            OH      D            H      H            HI      L            I      P            J      T            uJ      X            J      \            J      `            K      d            "K      h            K      l            K      p            L      t            M      x            O      |            ^P                  ~T                  T                  U                  V                  V                  W                  X                  Z                  [                  ^[                  n[                  [                  [                  [                  /\                  \                  \                  1]                  A]                  Z`                  oa                  d                  f                  ck                  k                  l                  l                  m                  n                  n                  o                  q                   r                  ls                  s                  t                  t                  t                  w                  Uw                   w      $            ;x      (            Lx      ,            ny      0            z      4            Fz      8            {      <            ~      @                  D                  H            5      L            C      P            M      T            A      X            p      \            Ԇ      `                  d                  h            b      l                  p                  t                  x                  |                                                C                                    |                  Z                  ԍ                  n                                                      4                  ד                                    _                                    *                  z                  Ο                  ӟ                                                      ۣ                                    =                  F                  }                                                                                          |                                    %                   h                  I                                    >                  H                                                                         ب      $                  (                  ,            *      0            *      4            _      8                  <            >      @            M      D            *      H            ү      L                  P            ذ      T            `      X                  \            S      `            8      d                  h                  l                  p            I      t                  x            %      |            1                                                                        .                                                      g                                                      6                  e                  j                                                                                                                                                                  !                                    *                                    5                                    "                                                      6                                                       z                  ,                  a                                                      J                                                       6      $                  (            "      ,                  0            m      4                  8                  <                  @            N      D            k      H            x      L                  P                  T            
      X                  \                  `                  d                  h                  l            b      p                  t                  x            h      |                              j                  o                                    |                                    y                                                                                                            z                                    "                                                      +                  W                                                                                 4                    5                    :                    @                    F                     G       $             |       (             }       ,                    0                    4                    8                    <                    @                    D                    H                    L                   P                   T                   X             	      \             (      `             )      d             +      h             0      l             Q      p             R      t             T      x             Y      |             n                   o                   q                   v                                                                                                                                                                                                                                                                                                                                                                                             e                   f                   g                   i                   n                                                                                                                  _                  `                  a                  f                                                                                                 $                  (                  ,                  0                  4                  8                  <            %      @                  D                  H                  L                  P                  T                  X                  \                  `                   d                  h                  l                  p                  t                  x                  |                                                                                                                                          "                  8                  9                  >                  @                  G                  L                  R                  S                  Z                  !                  %                  '                  )                  +                  0                  9                  @                  G                  I                  K                  L                  M                  	                  	                  	                   	                  	                  	                   	                  	                  	                  	                  	                   	      $            	      (            	      ,            	      0            	      4            	      8            	      <            	      @            4
      D            5
      H            6
      L            8
      P            =
      T            
      X            
      \            
      `            
      d            
      h            
      l            X      p            Y      t            Z      x            \      |            a                                                       &                  E                  J                  P                  
                   
                  V
                  `
                  g
                  q
                  r
                  y
                  V                  Z                  [                  ]                  b                                                        6                                                                                                                                                                                                                                                                                                                                                                     $                  (                  ,                  0                  4                  8            -      <            0      @            D      D            F      H            H      L            J      P            K      T            O      X            S      \            l      `            y      d                  h                  l                  p                  t            |      x            }      |            ~                                                                                                                                                                                                                                                                               &                                                                                                                                                                                                                                          `                  m                                                                                                                                                                                                                                $                  (                  ,                  0                  4                  8                  <            H      @            I      D            J      H            L      L            N      P            P      T            R      X            W      \            [      `            \      d            ]      h            _      l            a      p            c      t            e      x            j      |            {                                                                                                                                                                                                                                                                               '                  )                  *                  2                  q                  r                  t                  v                  {                                                                                                                              W                  [                  ]                   b                  n                  o                  q                  v                                                                               $            7      (            ;      ,            =      0            B      4            N      8            O      <            Q      @            V      D            `      H            g      L            i      P            s      T            t      X            u      \            2      `            6      d            8      h            :      l            <      p            A      t            M      x            N      |            P                  R                  T                  Y                  `                  g                  i                  s                  t                  u                  2                  6                  8                  :                  <                  A                  M                  N                  P                  R                  T                  Y                  `                  g                  i                  k                  m                  n                  r                  v                  '                  +                  ,                   .                  0                  2                  4                  9                                                                          	      $                  (                  ,            
      0                  4                  8                  <                  @                  D                  H                  L                   P                  T                  X                  \                  `                  d                  h                  l                  p            !      t                  x                  |                                                                                                                                                                                                                                                                         '                  )                  +                  -                  .                  /                  3                  "                  "                  "                  "                  "                  "                  "                  #                  N$                                    Z                                     -                  <                  =                  ?                  K                  Z                  [                  ]                   i      $            x      (            y      ,            {      0                  4                  8                  <                  @                  D                  H                  L                  P                  T                  X                  \                  `                  d                  h                  l                  p                  t            )      x                    |                                                                                         0                   P$                  $                  $                  $                   %                  %                  	%                  
%                  %                  %                  &                  &                  &                  &                  &                  $&                  )&                  0&                  7&                  9&                  :&                  >&                  1'                  2'                  4'                  6'                  ;'                  @'                   G'                  I'                  S'                  U'                  V'                  Z'                  ^'                  '                   '      $            '      (            '      ,            $(      0            ((      4            )(      8            +(      <            -(      @            /(      D            1(      H            6(      L            G(      P            P(      T            W(      X            \(      \            ](      `            `(      d            k(      h            u(      l            w(      p            y(      t            ~(      x            (      |            (                  (                  (                  (                  (                  )                  )                  )                  )                  ()                  0)                  7)                  =)                  >)                  )                  )                  )                  )                  )                  )                  )                  )                  )                  )                  )                  )                  )                  +                  +                  +                  +                  +                  +       	            +      	            +      	             ,      	            ',      	            2,      	            6,      	            ,      	            ,       	            ,      $	            ,      (	            ,      ,	            ,      0	            ,      4	            ,      8	            ,      <	            ,      @	             -      D	            -      H	            -      L	            -      P	            
-      T	            -      X	            L-      \	            M-      `	            O-      d	            Q-      h	            S-      l	            X-      p	            Z-      t	            `-      x	            g-      |	            i-      	            j-      	            n-      	            -      	            -      	            .      	            .      	            .      	            .      	            .      	            .      	            .      	            .      	             .      	            '.      	            ).      	            +.      	            ,.      	            -.      	            W.      	            X.      	            Z.      	            \.      	            ^.      	            c.      	            .      	            .      	            .      	            .      	            .      	            .      	            .      	            .       
            .      
            .      
            %/      
            &/      
            +/      
            3/      
            4/      
            9/       
            r/      $
            /      (
            /      ,
            /      0
            /      4
            /      8
            /      <
            /      @
            /      D
            /      H
            /      L
            /      P
            /      T
            50      X
            60      \
            80      `
            :0      d
            <0      h
            A0      l
            I0      p
            J0      t
            L0      x
            N0      |
            P0      
            U0      
            0      
            0      
            0      
            0      
            0      
            0      
            1      
            1      
            1      
            1      
            1      
            52      
            62      
            82      
            :2      
            ?2      
            G2      
            H2      
            J2      
            L2      
            Q2      
            Y2      
            Z2      
            \2      
            ^2      
            c2      
            p2      
            w2      
            ~2      
            2      
            2                   2                  2                  2                  `5                  a5                  b5                  d5                  f5                   h5      $            j5      (            o5      ,            5      0            5      4            5      8            5      <            5      @            5      D            5      H            5      L            9      P            9      T            9      X            9      \            9      `            9      d            9      h            9      l            9      p            9      t            d:      x            p:      |            :                  :                  :                  :                  ;                  ;                  ';                  0;                  ;                  ;                  ;                  ;                  ;                  ;                  ;                  <                  <                  <                  <                  <                  <                  <                  <                  <                  <                  <                  <                  <                  =                  	=                  >                  >                  >                   >                  >                  >                  >                   >                  !>                  >                  >                   >      $            >      (            >      ,            >      0            >      4            ?      8            ?      <            ?      @            ?      D            ?      H            ?      L            ?      P            ?      T            ?      X            ?      \            ?      `            ?      d            
@      h            @      l            @      p            @      t            .@      x            3@      |            H@                  M@                  P@                  V@                  n@                  s@                  ~@                  @                  @                  @                  @                  @                  @                  @                  A                  6A                  7A                  9A                  ;A                  @A                  A                  A                  A                  A                  A                  A                   B                  B                  	B                  
B                  B                  {B                  |B       
            ~B      
            B      
            B      
            B      
            B      
            B      
            B      
            B       
            B      $
            B      (
            B      ,
            C      0
            C      4
            C      8
            C      <
            C      @
            C      D
            C      H
            E      L
            E      P
            E      T
            E      X
            !E      \
            %E      `
            F      d
            F      h
            F      l
            	F      p
            F      t
            F      x
            )      |
            _      
            c      
            d      
            f      
            h      
            m      
            r      
                  
                  
                  
                  
                  
            4      
                  
                  
            /      
            e      
            }      
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
            A      
            E      
            F      
            H      
            J                   L                  N                  S                                                                                                                   $                  (                  ,            	      0            ;
      4            F      8            F      <             G      @            BG      D            PG      H            eG      L            pG      P            vG      T            wG      X            ~G      \            G      `            G      d            G      h            G      l            G      p             H      t            $H      x            0H      |            TH                  `H                  gH                  iH                  kH                  lH                  mH                  H                  H                  H                  H                  H                  H                  H                  H                  H                  H                  H                  EI                  FI                  HI                  MI                  VI                  `I                  gI                  lI                  tI                  uI                  I                  I                  I                  I                  I                   I                  I                  J                  J                  J                  J                  J                  rJ                   sJ      $            uJ      (            zJ      ,            J      0            J      4            J      8            J      <            J      @            J      D            J      H            J      L            J      P            J      T            	K      X            K      \             K      `            'K      d            0K      h            6K      l            K      p            K      t            K      x            K      |            K                  K                  K                  K                  K                  K                  K                  	L                  
L                  L                  L                  L                  L                  L                  L                  L                  L                  L                  L                  L                  M                  M                  M                  M                  M                  N                   N                  "N                  $N                  &N                  (N                  )N                  *N                   .N                  xO                  |O                  }O                  O                  O                  O                  O                   O      $            P      (            P      ,            P      0            P      4            P      8            P      <             P      @            WP      D            XP      H            ZP      L            \P      P            ^P      T            cP      X            GQ      \            HQ      `            JQ      d            LQ      h            NQ      l            SQ      p            S      t            S      x            S      |            S                  S                  S                  S                  S                  uT                  vT                  xT                  zT                  |T                  ~T                  T                  T                  T                  T                  T                  T                  T                  T                  T                  U                  U                  U                  U                  U                  V                  V                  V                  V                  V                  V                  V                  W                   W                  W                  W                  W                  !W                  "W                  #W                  W                   W      $            W      (            W      ,            W      0            W      4            W      8            X      <            X      @            X      D            X      H            X      L            X      P            X      T            X      X            X      \            X      `            X      d            X      h            X      l            Z      p            Z      t            Z      x            	Z      |            Z                  Z                  Z                  Z                  Z                  [                  [                  [                  ][                  ^[                  c[                  m[                  n[                  s[                  [                  [                  [                  [                  [                  [                  [                  [                  [                  [                  [                   \                  .\                  /\                  4\                  y\                  \                  \                  \                   \                  \                  \                  \                  \                  \                  0]                  1]                   6]      $            @]      (            A]      ,            F]      0            W]      4            `]      8            g]      <            i]      @            k]      D            m]      H            n]      L            o]      P            s]      T            P`      X            Q`      \            R`      `            T`      d            V`      h            X`      l            Z`      p            _`      t            `      x            `      |            `                  `                  `                  `                  `                  `                  `                  ea                  fa                  ga                  ia                  ka                  ma                  oa                  ta                  c                  c                  c                  c                  c                  c                  d                  d                  d                  d                  d                  e                  e                  e                  e                  e                  e                  e                   e                  e                  f                  f                  f                  f                  f                  f                   f      $            f      (            k      ,             k  <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xkbConfigRegistry SYSTEM "xkb.dtd">
<xkbConfigRegistry version="1.1">
  <modelList>
    <model>
      <configItem>
        <name>pc86</name>
        <description>Generic 86-key PC</description>
        <vendor>Generic</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>pc101</name>
        <description>Generic 101-key PC</description>
        <vendor>Generic</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>pc102</name>
        <description>Generic 102-key PC</description>
        <vendor>Generic</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>pc104</name>
        <description>Generic 104-key PC</description>
        <vendor>Generic</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>pc104alt</name>
        <description>Generic 104-key PC with L-shaped Enter key</description>
        <vendor>Generic</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>pc105</name>
        <description>Generic 105-key PC</description>
        <vendor>Generic</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>dell101</name>
        <description>Dell 101-key PC</description>
        <vendor>Dell</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>latitude</name>
        <description>Dell Latitude laptop</description>
        <vendor>Dell</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>dellm65</name>
        <description>Dell Precision M65 laptop</description>
        <vendor>Dell</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>everex</name>
        <description>Everex STEPnote</description>
        <vendor>Everex</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>flexpro</name>
        <description>Keytronic FlexPro</description>
        <vendor>Keytronic</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>microsoft</name>
        <description>Microsoft Natural</description>
        <vendor>Microsoft</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>omnikey101</name>
        <description>Northgate OmniKey 101</description>
        <vendor>Northgate</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>winbook</name>
        <description>Winbook Model XP5</description>
        <vendor>Generic</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>pc98</name>
        <description>PC-98</description>
        <vendor>Generic</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>a4techKB21</name>
        <description>A4Tech KB-21</description>
        <vendor>A4Tech</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>a4techKBS8</name>
        <description>A4Tech KBS-8</description>
        <vendor>A4Tech</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>a4_rfkb23</name>
        <description>A4Tech Wireless Desktop RFKB-23</description>
        <vendor>A4Tech</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>airkey</name>
        <description>Acer AirKey V</description>
        <vendor>Acer</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>azonaRF2300</name>
        <description>Azona RF2300 Wireless Internet</description>
        <vendor>Azona</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>scorpius</name>
        <description>Advance Scorpius KI</description>
        <vendor>Scorpius</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>brother</name>
        <description>Brother Internet</description>
        <vendor>Brother</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>btc5113rf</name>
        <description>BTC 5113RF Multimedia</description>
        <vendor>BTC</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>btc5126t</name>
        <description>BTC 5126T</description>
        <vendor>BTC</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>btc6301urf</name>
        <description>BTC 6301URF</description>
        <vendor>BTC</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>btc9000</name>
        <description>BTC 9000</description>
        <vendor>BTC</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>btc9000a</name>
        <description>BTC 9000A</description>
        <vendor>BTC</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>btc9001ah</name>
        <description>BTC 9001AH</description>
        <vendor>BTC</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>btc5090</name>
        <description>BTC 5090</description>
        <vendor>BTC</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>btc9019u</name>
        <description>BTC 9019U</description>
        <vendor>BTC</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>btc9116u</name>
        <description>BTC 9116U Mini Wireless Internet and Gaming</description>
        <vendor>BTC</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>cherryblue</name>
        <description>Cherry Blue Line CyBo@rd</description>
        <vendor>Cherry</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>cherryblueb</name>
        <description>Cherry CyMotion Master XPress</description>
        <vendor>Cherry</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>cherrybluea</name>
        <description>Cherry Blue Line CyBo@rd (alt.)</description>
        <vendor>Cherry</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>cherrycyboard</name>
        <description>Cherry CyBo@rd USB-Hub</description>
        <vendor>Cherry</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>cherrycmexpert</name>
        <description>Cherry CyMotion Expert</description>
        <vendor>Cherry</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>cherrybunlim</name>
        <description>Cherry B.UNLIMITED</description>
        <vendor>Cherry</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>chicony</name>
        <description>Chicony Internet</description>
        <vendor>Chicony</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>chicony0108</name>
        <description>Chicony KU-0108</description>
        <vendor>Chicony</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>chicony0420</name>
        <description>Chicony KU-0420</description>
        <vendor>Chicony</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>chicony9885</name>
        <description>Chicony KB-9885</description>
        <vendor>Chicony</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>compaqeak8</name>
        <description>Compaq Easy Access</description>
        <vendor>Compaq</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>compaqik7</name>
        <description>Compaq Internet (7 keys)</description>
        <vendor>Compaq</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>compaqik13</name>
        <description>Compaq Internet (13 keys)</description>
        <vendor>Compaq</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>compaqik18</name>
        <description>Compaq Internet (18 keys)</description>
        <vendor>Compaq</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>cymotionlinux</name>
        <description>Cherry CyMotion Master Linux</description>
        <vendor>Cherry</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>armada</name>
        <description>Compaq Armada laptop</description>
        <vendor>Compaq</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>presario</name>
        <description>Compaq Presario laptop</description>
        <vendor>Compaq</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>ipaq</name>
        <description>Compaq iPaq</description>
        <vendor>Compaq</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>dell</name>
        <description>Dell</description>
        <vendor>Dell</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>dellsk8125</name>
        <description>Dell SK-8125</description>
        <vendor>Dell</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>dellsk8135</name>
        <description>Dell SK-8135</description>
        <vendor>Dell</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>dellusbmm</name>
        <description>Dell USB Multimedia</description>
        <vendor>Dell</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>inspiron</name>
        <description>Dell Inspiron 6000/8000 laptop</description>
        <vendor>Dell</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>precision_m</name>
        <description>Dell Precision M laptop</description>
        <vendor>Dell</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>dexxa</name>
        <description>Dexxa Wireless Desktop</description>
        <vendor>Dexxa</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>diamond</name>
        <description>Diamond 9801/9802</description>
        <vendor>Diamond</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>dtk2000</name>
        <description>DTK2000</description>
        <vendor>DTK</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>ennyah_dkb1008</name>
        <description>Ennyah DKB-1008</description>
        <vendor>Ennyah</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>fscaa1667g</name>
        <description>Fujitsu-Siemens Amilo laptop</description>
        <vendor>Fujitsu-Siemens</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>genius</name>
        <description>Genius Comfy KB-16M/Multimedia KWD-910</description>
        <vendor>Genius</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>geniuscomfy</name>
        <description>Genius Comfy KB-12e</description>
        <vendor>Genius</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>geniuscomfy2</name>
        <description>Genius Comfy KB-21e-Scroll</description>
        <vendor>Genius</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>geniuskb19e</name>
        <description>Genius KB-19e NB</description>
        <vendor>Genius</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>geniuskkb2050hs</name>
        <description>Genius KKB-2050HS</description>
        <vendor>Genius</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>gyration</name>
        <description>Gyration</description>
        <vendor>Gyration</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>kinesis</name>
        <description>Kinesis</description>
        <vendor>Kinesis</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>logitech_base</name>
        <description>Logitech</description>
        <vendor>Logitech</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>logitech_g15</name>
        <description>Logitech G15 extra keys via G15daemon</description>
        <vendor>Logitech</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>hpi6</name>
        <description>Hewlett-Packard Internet</description>
        <vendor>Hewlett-Packard</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>hp250x</name>
        <description>Hewlett-Packard NEC SK-2500 Multimedia</description>
        <vendor>Hewlett-Packard</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>hpxe3gc</name>
        <description>Hewlett-Packard Omnibook XE3 GC</description>
        <vendor>Hewlett-Packard</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>hpxe3gf</name>
        <description>Hewlett-Packard Omnibook XE3 GF</description>
        <vendor>Hewlett-Packard</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>hpxt1000</name>
        <description>Hewlett-Packard Omnibook XT1000</description>
        <vendor>Hewlett-Packard</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>hpdv5</name>
        <description>Hewlett-Packard Pavilion dv5</description>
        <vendor>Hewlett-Packard</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>hpzt11xx</name>
        <description>Hewlett-Packard Pavilion ZT1100</description>
        <vendor>Hewlett-Packard</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>hp500fa</name>
        <description>Hewlett-Packard Omnibook 500 FA</description>
        <vendor>Hewlett-Packard</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>hp5xx</name>
        <description>Hewlett-Packard Omnibook 500</description>
        <vendor>Hewlett-Packard</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>hpnx9020</name>
        <description>Hewlett-Packard nx9020</description>
        <vendor>Hewlett-Packard</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>hp6000</name>
        <description>Hewlett-Packard Omnibook 6000/6100</description>
        <vendor>Hewlett-Packard</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>honeywell_euroboard</name>
        <description>Honeywell Euroboard</description>
        <vendor>Hewlett-Packard</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>hpmini110</name>
        <description>Hewlett-Packard Mini 110 laptop</description>
        <vendor>Hewlett-Packard</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>rapidaccess</name>
        <description>IBM Rapid Access</description>
        <vendor>Lenovo (previously IBM)</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>rapidaccess2</name>
        <description>IBM Rapid Access II</description>
        <vendor>Lenovo (previously IBM)</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>thinkpad</name>
        <description>IBM ThinkPad 560Z/600/600E/A22E</description>
        <vendor>Lenovo (previously IBM)</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>thinkpad60</name>
        <description>IBM ThinkPad R60/T60/R61/T61</description>
        <vendor>Lenovo (previously IBM)</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>thinkpadz60</name>
        <description>IBM ThinkPad Z60m/Z60t/Z61m/Z61t</description>
        <vendor>Lenovo (previously IBM)</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>ibm_spacesaver</name>
        <description>IBM Space Saver</description>
        <vendor>Lenovo (previously IBM)</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>logiaccess</name>
        <description>Logitech Access</description>
        <vendor>Logitech</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>logiclx300</name>
        <description>Logitech Cordless Desktop LX-300</description>
        <vendor>Logitech</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>logii350</name>
        <description>Logitech Internet 350</description>
        <vendor>Logitech</vendor>
        <hwList> <hwId>046d:c313</hwId></hwList>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>logimel</name>
        <description>Logitech Internet 350</description>
        <vendor>Logitech</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>logicd</name>
        <description>Logitech Cordless Desktop</description>
        <vendor>Logitech</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>logicd_it</name>
        <description>Logitech Cordless Desktop iTouch</description>
        <vendor>Logitech</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>logicd_nav</name>
        <description>Logitech Cordless Desktop Navigator</description>
        <vendor>Logitech</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>logicd_opt</name>
        <description>Logitech Cordless Desktop Optical</description>
        <vendor>Logitech</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>logicda</name>
        <description>Logitech Cordless Desktop (alt.)</description>
        <vendor>Logitech</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>logicdpa2</name>
        <description>Logitech Cordless Desktop Pro (2nd alt.)</description>
        <vendor>Logitech</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>logicfn</name>
        <description>Logitech Cordless Freedom/Desktop Navigator</description>
        <vendor>Logitech</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>logicdn</name>
        <description>Logitech Cordless Desktop Navigator</description>
        <vendor>Logitech</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>logiitc</name>
        <description>Logitech iTouch Cordless Y-RB6</description>
        <vendor>Logitech</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>logiik</name>
        <description>Logitech Internet</description>
        <vendor>Logitech</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>itouch</name>
        <description>Logitech iTouch</description>
        <vendor>Logitech</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>logicink</name>
        <description>Logitech Internet Navigator</description>
        <vendor>Logitech</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>logiex110</name>
        <description>Logitech Cordless Desktop EX110</description>
        <vendor>Logitech</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>logiinkse</name>
        <description>Logitech iTouch Internet Navigator SE</description>
        <vendor>Logitech</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>logiinkseusb</name>
        <description>Logitech iTouch Internet Navigator SE USB</description>
        <vendor>Logitech</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>logiultrax</name>
        <description>Logitech Ultra-X</description>
        <vendor>Logitech</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>logiultraxc</name>
        <description>Logitech Ultra-X Cordless Media Desktop</description>
        <vendor>Logitech</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>logidinovo</name>
        <description>Logitech diNovo</description>
        <vendor>Logitech</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>logidinovoedge</name>
        <description>Logitech diNovo Edge</description>
        <vendor>Logitech</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>mx1998</name>
        <description>Memorex MX1998</description>
        <vendor>Memorex</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>mx2500</name>
        <description>Memorex MX2500 EZ-Access</description>
        <vendor>Memorex</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>mx2750</name>
        <description>Memorex MX2750</description>
        <vendor>Memorex</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>microsoft4000</name>
        <description>Microsoft Natural Ergonomic 4000</description>
        <vendor>Microsoft</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>microsoft7000</name>
        <description>Microsoft Natural Wireless Ergonomic 7000</description>
        <vendor>Microsoft</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>microsoftinet</name>
        <description>Microsoft Internet</description>
        <vendor>Microsoft</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>microsoftpro</name>
        <description>Microsoft Natural Pro/Internet Pro</description>
        <vendor>Microsoft</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>microsoftprousb</name>
        <description>Microsoft Natural Pro USB/Internet Pro</description>
        <vendor>Microsoft</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>microsoftprooem</name>
        <description>Microsoft Natural Pro OEM</description>
        <vendor>Microsoft</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>vsonku306</name>
        <description>ViewSonic KU-306 Internet</description>
        <vendor>ViewSonic</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>microsoftprose</name>
        <description>Microsoft Internet Pro (Swedish)</description>
        <vendor>Microsoft</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>microsoftoffice</name>
        <description>Microsoft Office Keyboard</description>
        <vendor>Microsoft</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>microsoftmult</name>
        <description>Microsoft Wireless Multimedia 1.0A</description>
        <vendor>Microsoft</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>microsoftsurface</name>
        <description>Microsoft Surface</description>
        <vendor>Microsoft</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>microsoftelite</name>
        <description>Microsoft Natural Elite</description>
        <vendor>Microsoft</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>microsoftccurve2k</name>
        <description>Microsoft Comfort Curve 2000</description>
        <vendor>Microsoft</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>oretec</name>
        <description>Ortek Multimedia/Internet MCK-800</description>
        <vendor>Ortek</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>propeller</name>
        <description>Propeller Voyager KTEZ-1000</description>
        <vendor>KeyTronic</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>qtronix</name>
        <description>QTronix Scorpius 98N+</description>
        <vendor>QTronix</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>samsung4500</name>
        <description>Samsung SDM 4500P</description>
        <vendor>Samsung</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>samsung4510</name>
        <description>Samsung SDM 4510P</description>
        <vendor>Samsung</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>sanwaskbkg3</name>
        <description>Sanwa Supply SKB-KG3</description>
        <vendor>Sanwa Supply Inc.</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>sk1300</name>
        <description>NEC SK-1300</description>
        <vendor>NEC</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>sk2500</name>
        <description>NEC SK-2500</description>
        <vendor>NEC</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>sk6200</name>
        <description>NEC SK-6200</description>
        <vendor>NEC</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>sk7100</name>
        <description>NEC SK-7100</description>
        <vendor>NEC</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>sp_inet</name>
        <description>Super Power Multimedia</description>
        <vendor>Generic</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>sven</name>
        <description>SVEN Ergonomic 2500</description>
        <vendor>SVEN</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>sven303</name>
        <description>SVEN Slim 303</description>
        <vendor>SVEN</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>symplon</name>
        <description>Symplon PaceBook tablet</description>
        <vendor>Symplon</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>toshiba_s3000</name>
        <description>Toshiba Satellite S3000</description>
        <vendor>Toshiba</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>trust</name>
        <description>Trust Wireless Classic</description>
        <vendor>Trust</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>trustda</name>
        <description>Trust Direct Access</description>
        <vendor>Trust</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>trust_slimline</name>
        <description>Trust Slimline</description>
        <vendor>Trust</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>tm2020</name>
        <description>TypeMatrix EZ-Reach 2020</description>
        <vendor>TypeMatrix</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>tm2030PS2</name>
        <description>TypeMatrix EZ-Reach 2030 PS2</description>
        <vendor>TypeMatrix</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>tm2030USB</name>
        <description>TypeMatrix EZ-Reach 2030 USB</description>
        <vendor>TypeMatrix</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>tm2030USB-102</name>
        <description>TypeMatrix EZ-Reach 2030 USB (102/105:EU mode)</description>
        <vendor>TypeMatrix</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>tm2030USB-106</name>
        <description>TypeMatrix EZ-Reach 2030 USB (106:JP mode)</description>
        <vendor>TypeMatrix</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>yahoo</name>
        <description>Yahoo! Internet</description>
        <vendor>Yahoo!</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>macbook78</name>
        <description>MacBook/MacBook Pro</description>
        <vendor>Apple</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>macbook79</name>
        <description>MacBook/MacBook Pro (intl.)</description>
        <vendor>Apple</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>macintosh</name>
        <description>Macintosh</description>
        <vendor>Apple</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>macintosh_old</name>
        <description>Macintosh Old</description>
        <vendor>Apple</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>macintosh_hhk</name>
        <description>Happy Hacking for Mac</description>
        <vendor>Fujitsu</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>acer_c300</name>
        <description>Acer C300</description>
        <vendor>Acer</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>acer_ferrari4k</name>
        <description>Acer Ferrari 4000</description>
        <vendor>Acer</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>acer_laptop</name>
        <description>Acer laptop</description>
        <vendor>Acer</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>asus_laptop</name>
        <description>Asus laptop</description>
        <vendor>Asus</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>apple</name>
        <description>Apple</description>
        <vendor>Apple</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>apple_laptop</name>
        <description>Apple laptop</description>
        <vendor>Apple</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>applealu_ansi</name>
        <description>Apple Aluminium (ANSI)</description>
        <vendor>Apple</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>applealu_iso</name>
        <description>Apple Aluminium (ISO)</description>
        <vendor>Apple</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>applealu_jis</name>
        <description>Apple Aluminium (JIS)</description>
        <vendor>Apple</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>silvercrest</name>
        <description>Silvercrest Multimedia Wireless</description>
        <vendor>Silvercrest</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>emachines</name>
        <description>eMachines m6800 laptop</description>
        <vendor>eMachines</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>benqx</name>
        <description>BenQ X-Touch</description>
        <vendor>BenQ</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>benqx730</name>
        <description>BenQ X-Touch 730</description>
        <vendor>BenQ</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>benqx800</name>
        <description>BenQ X-Touch 800</description>
        <vendor>BenQ</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>hhk</name>
        <description>Happy Hacking</description>
        <vendor>Fujitsu</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>classmate</name>
        <description>Classmate PC</description>
        <vendor>Intel</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>olpc</name>
        <description>OLPC</description>
        <vendor>OLPC</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>sun_type7_usb</name>
        <description>Sun Type 7 USB</description>
        <vendor>Sun Microsystems</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>sun_type7_euro_usb</name>
        <description>Sun Type 7 USB (European)</description>
        <vendor>Sun Microsystems</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>sun_type7_unix_usb</name>
        <description>Sun Type 7 USB (Unix)</description>
        <vendor>Sun Microsystems</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>sun_type7_jp_usb</name>
        <description>Sun Type 7 USB (Japanese)/Japanese 106-key</description>
        <vendor>Sun Microsystems</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>sun_type6_usb</name>
        <description>Sun Type 6/7 USB</description>
        <vendor>Sun Microsystems</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>sun_type6_euro_usb</name>
        <description>Sun Type 6/7 USB (European)</description>
        <vendor>Sun Microsystems</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>sun_type6_unix_usb</name>
        <description>Sun Type 6 USB (Unix)</description>
        <vendor>Sun Microsystems</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>sun_type6_jp_usb</name>
        <description>Sun Type 6 USB (Japanese)</description>
        <vendor>Sun Microsystems</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>sun_type6_jp</name>
        <description>Sun Type 6 (Japanese)</description>
        <vendor>Sun Microsystems</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>targa_v811</name>
        <description>Targa Visionary 811</description>
        <vendor>Targa</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>unitekkb1925</name>
        <description>Unitek KB-1925</description>
        <vendor>Unitek Group</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>compalfl90</name>
        <description>FL90</description>
        <vendor>Compal Electronics</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
        <name>creativedw7000</name>
        <description>Creative Desktop Wireless 7000</description>
        <vendor>Creative</vendor>
      </configItem>
    </model>
    <model>
      <configItem>
       <name>teck227</name>
       <description>Truly Ergonomic 227</description>
       <vendor>Truly Ergonomic</vendor>
     </configItem>
    </model>
    <model>
      <configItem>
       <name>teck229</name>
       <description>Truly Ergonomic 229</description>
       <vendor>Truly Ergonomic</vendor>
     </configItem>
    </model>
    <model>
      <configItem>
       <name>apex300</name>
       <description>SteelSeries Apex 300 (Apex RAW)</description>
       <vendor>SteelSeries</vendor>
     </configItem>
    </model>
    <model>
      <configItem>
       <name>chromebook</name>
       <description>Chromebook</description>
       <vendor>Google</vendor>
     </configItem>
    </model>
  </modelList>
  <layoutList>
    <layout>
      <configItem>
        <name>us</name>
        <!-- Keyboard indicator for English layouts -->
        <shortDescription>en</shortDescription>
        <description>English (US)</description>
        <countryList>
          <iso3166Id>US</iso3166Id>
        </countryList>
        <languageList>
          <iso639Id>eng</iso639Id>
        </languageList>
      </configItem>
      <variantList>
        <variant>
          <configItem>
            <name>chr</name>
            <!-- Keyboard indicator for Cherokee layouts -->
            <shortDescription>chr</shortDescription>
            <description>Cherokee</description>
            <languageList>
              <iso639Id>chr</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>haw</name>
            <shortDescription>haw</shortDescription>
            <description>Hawaiian</description>
            <languageList>
              <iso639Id>haw</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>euro</name>
            <description>English (US, euro on 5)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>intl</name>
            <description>English (US, intl., with dead keys)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>alt-intl</name>
            <description>English (US, alt. intl.)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>colemak</name>
            <description>English (Colemak)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>colemak_dh</name>
            <description>English (Colemak-DH)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>colemak_dh_iso</name>
            <description>English (Colemak-DH ISO)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>dvorak</name>
            <description>English (Dvorak)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>dvorak-intl</name>
            <description>English (Dvorak, intl., with dead keys)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>dvorak-alt-intl</name>
            <description>English (Dvorak, alt. intl.)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>dvorak-l</name>
            <description>English (Dvorak, left-handed)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>dvorak-r</name>
            <description>English (Dvorak, right-handed)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>dvorak-classic</name>
            <description>English (classic Dvorak)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>dvp</name>
            <description>English (programmer Dvorak)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>dvorak-mac</name>
            <description>English (Dvorak, Macintosh)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>symbolic</name>
            <description>English (US, Symbolic)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>rus</name>
            <!-- Keyboard indicator for Russian layouts -->
            <shortDescription>ru</shortDescription>
            <description>Russian (US, phonetic)</description>
            <languageList>
              <iso639Id>rus</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>mac</name>
            <description>English (Macintosh)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>altgr-intl</name>
            <description>English (intl., with AltGr dead keys)</description>
            <languageList>
              <iso639Id>eng</iso639Id>
              <iso639Id>fra</iso639Id>
              <iso639Id>deu</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>olpc2</name>
            <description>English (the divide/multiply toggle the layout)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>hbs</name>
            <description>Serbo-Croatian (US)</description>
            <languageList>
              <iso639Id>eng</iso639Id>
              <iso639Id>bos</iso639Id>
              <iso639Id>hbs</iso639Id>
              <iso639Id>hrv</iso639Id>
              <iso639Id>srp</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>norman</name>
            <description>English (Norman)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>workman</name>
            <description>English (Workman)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>workman-intl</name>
            <description>English (Workman, intl., with dead keys)</description>
           </configItem>
         </variant>
      </variantList>
    </layout>
    <layout>
      <configItem>
        <name>af</name>
        <!-- Keyboard indicator for Persian layouts -->
        <shortDescription>fa</shortDescription>
        <description>Dari</description>
        <countryList>
          <iso3166Id>AF</iso3166Id>
        </countryList>
        <languageList>
          <iso639Id>drs</iso639Id>
        </languageList>
      </configItem>
      <variantList>
        <variant>
          <configItem>
            <name>ps</name>
            <!-- Keyboard indicator for Pashto layouts -->
            <shortDescription>ps</shortDescription>
            <description>Pashto</description>
            <languageList>
              <iso639Id>pus</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>uz</name>
            <!-- Keyboard indicator for Uzbek layouts -->
            <shortDescription>uz</shortDescription>
            <description>Uzbek (Afghanistan)</description>
            <languageList>
              <iso639Id>uzb</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>ps-olpc</name>
            <!-- Keyboard indicator for Pashto layouts -->
            <shortDescription>ps</shortDescription>
            <description>Pashto (Afghanistan, OLPC)</description>
            <languageList>
              <iso639Id>pus</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>fa-olpc</name>
            <!-- Keyboard indicator for Persian layouts -->
            <shortDescription>fa</shortDescription>
            <description>Dari (Afghanistan, OLPC)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>uz-olpc</name>
            <!-- Keyboard indicator for Uzbek layouts -->
            <shortDescription>uz</shortDescription>
            <description>Uzbek (Afghanistan, OLPC)</description>
            <languageList>
              <iso639Id>uzb</iso639Id>
            </languageList>
          </configItem>
        </variant>
      </variantList>
    </layout>
    <layout>
      <configItem>
        <name>ara</name>
        <!-- Keyboard indicator for Arabic layouts -->
        <shortDescription>ar</shortDescription>
        <description>Arabic</description>
        <countryList>
          <iso3166Id>AE</iso3166Id>
          <iso3166Id>BH</iso3166Id>
          <iso3166Id>DZ</iso3166Id>
          <iso3166Id>EG</iso3166Id>
          <iso3166Id>EH</iso3166Id>
          <iso3166Id>JO</iso3166Id>
          <iso3166Id>KW</iso3166Id>
          <iso3166Id>LB</iso3166Id>
          <iso3166Id>LY</iso3166Id>
          <iso3166Id>MA</iso3166Id>
          <iso3166Id>MR</iso3166Id>
          <iso3166Id>OM</iso3166Id>
          <iso3166Id>PS</iso3166Id>
          <iso3166Id>QA</iso3166Id>
          <iso3166Id>SA</iso3166Id>
          <iso3166Id>SD</iso3166Id>
          <iso3166Id>SY</iso3166Id>
          <iso3166Id>TN</iso3166Id>
          <iso3166Id>YE</iso3166Id>
        </countryList>
        <languageList>
          <iso639Id>ara</iso639Id>
        </languageList>
      </configItem>
      <variantList>
        <variant>
          <configItem>
            <name>azerty</name>
            <description>Arabic (AZERTY)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>azerty_digits</name>
            <description>Arabic (AZERTY, Eastern Arabic numerals)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>digits</name>
            <description>Arabic (Eastern Arabic numerals)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>qwerty</name>
            <description>Arabic (QWERTY)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>qwerty_digits</name>
            <description>Arabic (QWERTY, Eastern Arabic numerals)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>buckwalter</name>
            <description>Arabic (Buckwalter)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>olpc</name>
            <description>Arabic (OLPC)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>mac</name>
            <description>Arabic (Macintosh)</description>
          </configItem>
        </variant>
      </variantList>
    </layout>
    <layout>
      <configItem>
        <name>al</name>
        <!-- Keyboard indicator for Albanian layouts -->
        <shortDescription>sq</shortDescription>
        <description>Albanian</description>
        <countryList>
          <iso3166Id>AL</iso3166Id>
        </countryList>
        <languageList>
          <iso639Id>sqi</iso639Id>
        </languageList>
      </configItem>
      <variantList>
        <variant>
          <configItem>
            <name>plisi</name>
            <description>Albanian (Plisi)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>veqilharxhi</name>
            <description>Albanian (Veqilharxhi)</description>
          </configItem>
        </variant>
      </variantList>
    </layout>
    <layout>
      <configItem>
        <name>am</name>
        <!-- Keyboard indicator for Armenian layouts -->
        <shortDescription>hy</shortDescription>
        <description>Armenian</description>
        <countryList>
          <iso3166Id>AL</iso3166Id>
        </countryList>
        <languageList>
          <iso639Id>hye</iso639Id>
        </languageList>
      </configItem>
      <variantList>
        <variant>
          <configItem>
            <name>phonetic</name>
            <description>Armenian (phonetic)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>phonetic-alt</name>
            <description>Armenian (alt. phonetic)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>eastern</name>
            <description>Armenian (eastern)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>western</name>
            <description>Armenian (western)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>eastern-alt</name>
            <description>Armenian (alt. eastern)</description>
          </configItem>
        </variant>
      </variantList>
    </layout>
    <layout>
      <configItem>
        <name>at</name>
        <!-- Keyboard indicator for German layouts -->
        <shortDescription>de</shortDescription>
        <description>German (Austria)</description>
        <countryList>
          <iso3166Id>AT</iso3166Id>
        </countryList>
        <languageList>
          <iso639Id>deu</iso639Id>
        </languageList>
      </configItem>
      <variantList>
        <variant>
          <configItem>
            <name>nodeadkeys</name>
            <description>German (Austria, no dead keys)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>mac</name>
            <description>German (Austria, Macintosh)</description>
          </configItem>
        </variant>
      </variantList>
    </layout>
    <layout>
      <configItem>
        <name>au</name>
        <!-- Keyboard indicator for Australian layouts -->
        <shortDescription>en</shortDescription>
        <description>English (Australian)</description>
        <countryList>
          <iso3166Id>AU</iso3166Id>
        </countryList>
        <languageList>
          <iso639Id>eng</iso639Id>
        </languageList>
      </configItem>
    </layout>
    <layout>
      <configItem>
        <name>az</name>
        <!-- Keyboard indicator for Azerbaijani layouts -->
        <shortDescription>az</shortDescription>
        <description>Azerbaijani</description>
        <countryList>
          <iso3166Id>AZ</iso3166Id>
        </countryList>
        <languageList>
          <iso639Id>aze</iso639Id>
        </languageList>
      </configItem>
      <variantList>
        <variant>
          <configItem>
            <name>cyrillic</name>
            <description>Azerbaijani (Cyrillic)</description>
          </configItem>
        </variant>
      </variantList>
    </layout>
    <layout>
      <configItem>
        <name>by</name>
        <!-- Keyboard indicator for Belarusian layouts -->
        <shortDescription>by</shortDescription>
        <description>Belarusian</description>
        <countryList>
          <iso3166Id>BY</iso3166Id>
        </countryList>
        <languageList>
          <iso639Id>bel</iso639Id>
        </languageList>
      </configItem>
      <variantList>
        <variant>
          <configItem>
            <name>legacy</name>
            <description>Belarusian (legacy)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>latin</name>
            <description>Belarusian (Latin)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>ru</name>
            <description>Russian (Belarus)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>intl</name>
            <description>Belarusian (intl.)</description>
          </configItem>
        </variant>
      </variantList>
    </layout>
    <layout>
      <configItem>
        <name>be</name>
        <!-- Keyboard indicator for Belgian layouts -->
        <shortDescription>be</shortDescription>
        <description>Belgian</description>
        <countryList>
          <iso3166Id>BE</iso3166Id>
        </countryList>
        <languageList>
          <iso639Id>deu</iso639Id>
          <iso639Id>nld</iso639Id>
          <iso639Id>fra</iso639Id>
        </languageList>
      </configItem>
      <variantList>
        <variant>
          <configItem>
            <name>oss</name>
            <description>Belgian (alt.)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>oss_latin9</name>
            <description>Belgian (Latin-9 only, alt.)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>iso-alternate</name>
            <description>Belgian (ISO, alt.)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>nodeadkeys</name>
            <description>Belgian (no dead keys)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>wang</name>
            <description>Belgian (Wang 724 AZERTY)</description>
          </configItem>
        </variant>
      </variantList>
    </layout>
    <layout>
      <configItem>
        <name>bd</name>
        <!-- Keyboard indicator for Bangla layouts -->
        <shortDescription>bn</shortDescription>
        <description>Bangla</description>
        <countryList>
          <iso3166Id>BD</iso3166Id>
        </countryList>
        <languageList>
          <iso639Id>ben</iso639Id>
          <!-- sat-Beng: http://www.ethnologue.com/language/sat -->
          <iso639Id>sat</iso639Id>
        </languageList>
      </configItem>
      <variantList>
        <variant>
          <configItem>
            <name>probhat</name>
            <description>Bangla (Probhat)</description>
          </configItem>
        </variant>
      </variantList>
    </layout>
    <layout>
      <configItem>
        <name>in</name>
        <!-- Keyboard indicator for Indian layouts -->
        <shortDescription>in</shortDescription>
        <description>Indian</description>
        <countryList>
          <iso3166Id>IN</iso3166Id>
        </countryList>
        <!-- from https://github.com/unicode-org/cldr/blob/main/common/supplemental/supplementalData.xml scripts="Deva" -->
        <languageList>
          <iso639Id>hin</iso639Id>
          <iso639Id>anp</iso639Id>
          <iso639Id>awa</iso639Id>
          <iso639Id>bap</iso639Id>
          <iso639Id>bfy</iso639Id>
          <iso639Id>bgc</iso639Id>
          <iso639Id>bhb</iso639Id>
          <iso639Id>bhi</iso639Id>
          <iso639Id>bho</iso639Id>
          <iso639Id>bjj</iso639Id>
          <iso639Id>bra</iso639Id>
          <iso639Id>brx</iso639Id>
          <iso639Id>btv</iso639Id>
          <iso639Id>doi</iso639Id>
          <iso639Id>dty</iso639Id>
          <iso639Id>gbm</iso639Id>
          <iso639Id>gom</iso639Id>
          <iso639Id>gvr</iso639Id>
          <iso639Id>hne</iso639Id>
          <iso639Id>hoc</iso639Id>
          <iso639Id>hoj</iso639Id>
          <iso639Id>jml</iso639Id>
          <iso639Id>kfr</iso639Id>
          <iso639Id>kfy</iso639Id>
          <iso639Id>khn</iso639Id>
          <iso639Id>kok</iso639Id>
          <iso639Id>kru</iso639Id>
          <iso639Id>mag</iso639Id>
          <iso639Id>mai</iso639Id>
          <iso639Id>mar</iso639Id>
          <iso639Id>mgp</iso639Id>
          <iso639Id>mrd</iso639Id>
          <iso639Id>mtr</iso639Id>
          <iso639Id>mwr</iso639Id>
          <iso639Id>nep</iso639Id>
          <iso639Id>new</iso639Id>
          <iso639Id>noe</iso639Id>
          <iso639Id>raj</iso639Id>
          <iso639Id>rjs</iso639Id>
          <iso639Id>sck</iso639Id>
          <iso639Id>srx</iso639Id>
          <iso639Id>swv</iso639Id>
          <iso639Id>taj</iso639Id>
          <iso639Id>tdg</iso639Id>
          <iso639Id>tdh</iso639Id>
          <iso639Id>thl</iso639Id>
          <iso639Id>thq</iso639Id>
          <iso639Id>thr</iso639Id>
          <iso639Id>tkt</iso639Id>
          <iso639Id>wbr</iso639Id>
          <iso639Id>wtm</iso639Id>
          <iso639Id>xnr</iso639Id>
          <iso639Id>xsr</iso639Id>
        </languageList>
      </configItem>
      <variantList>
        <variant>
          <configItem>
            <name>ben</name>
            <!-- Keyboard indicator for Bangla layouts -->
            <shortDescription>bn</shortDescription>
            <description>Bangla (India)</description>
            <languageList>
              <iso639Id>ben</iso639Id>
              <!-- sat-Beng: http://www.ethnologue.com/language/sat -->
              <iso639Id>sat</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>ben_probhat</name>
            <!-- Keyboard indicator for Bangla layouts -->
            <shortDescription>bn</shortDescription>
            <description>Bangla (India, Probhat)</description>
            <languageList>
              <iso639Id>ben</iso639Id>
              <!-- sat-Beng: http://www.ethnologue.com/language/sat -->
              <iso639Id>sat</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>ben_baishakhi</name>
            <description>Bangla (India, Baishakhi)</description>
            <languageList>
              <iso639Id>ben</iso639Id>
              <!-- sat-Beng: http://www.ethnologue.com/language/sat -->
              <iso639Id>sat</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>ben_bornona</name>
            <description>Bangla (India, Bornona)</description>
            <languageList>
              <iso639Id>ben</iso639Id>
              <!-- sat-Beng: http://www.ethnologue.com/language/sat -->
              <iso639Id>sat</iso639Id>
            </languageList>
          </configItem>
        </variant>
         <variant>
          <configItem>
            <name>ben_gitanjali</name>
            <description>Bangla (India, Gitanjali)</description>
            <languageList>
              <iso639Id>ben</iso639Id>
              <!-- sat-Beng: http://www.ethnologue.com/language/sat -->
              <iso639Id>sat</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>ben_inscript</name>
            <description>Bangla (India, Baishakhi InScript)</description>
            <languageList>
              <iso639Id>ben</iso639Id>
              <!-- sat-Beng: http://www.ethnologue.com/language/sat -->
              <iso639Id>sat</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>eeyek</name>
            <description>Manipuri (Eeyek)</description>
            <languageList>
              <iso639Id>mni</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>guj</name>
            <!-- Keyboard indicator for Gujarati layouts -->
            <shortDescription>gu</shortDescription>
            <description>Gujarati</description>
            <languageList>
              <iso639Id>guj</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>guru</name>
            <!-- Keyboard indicator for Punjabi layouts -->
            <shortDescription>pa</shortDescription>
            <description>Punjabi (Gurmukhi)</description>
            <languageList>
              <iso639Id>pan</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>jhelum</name>
            <!-- Keyboard indicator for Punjabi layouts -->
            <shortDescription>pa</shortDescription>
            <description>Punjabi (Gurmukhi Jhelum)</description>
            <languageList>
              <iso639Id>pan</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>kan</name>
            <!-- Keyboard indicator for Kannada layouts -->
            <shortDescription>kn</shortDescription>
            <description>Kannada</description>
            <languageList>
              <iso639Id>kan</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>kan-kagapa</name>
            <!-- Keyboard indicator for Kannada layouts -->
            <shortDescription>kn</shortDescription>
            <description>Kannada (KaGaPa, phonetic)</description>
            <languageList>
              <iso639Id>kan</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>mal</name>
            <!-- Keyboard indicator for Malayalam layouts -->
            <shortDescription>ml</shortDescription>
            <description>Malayalam</description>
            <languageList>
              <iso639Id>mal</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>mal_lalitha</name>
            <!-- Keyboard indicator for Malayalam layouts -->
            <shortDescription>ml</shortDescription>
            <description>Malayalam (Lalitha)</description>
            <languageList>
              <iso639Id>mal</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>mal_enhanced</name>
            <!-- Keyboard indicator for Malayalam layouts -->
            <shortDescription>ml</shortDescription>
            <description>Malayalam (enhanced InScript, with rupee)</description>
            <languageList>
              <iso639Id>mal</iso639Id>
            </languageList>
          </configItem>
         </variant>
         <variant>
           <configItem>
            <name>ori</name>
            <!-- Keyboard indicator for Oriya layouts -->
            <shortDescription>or</shortDescription>
            <description>Oriya</description>
            <languageList>
              <iso639Id>ori</iso639Id>
              <!-- sat-Orya: http://www.ethnologue.com/language/sat -->
              <iso639Id>sat</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
           <configItem>
            <name>ori-bolnagri</name>
            <!-- Keyboard indicator for Oriya layouts -->
            <shortDescription>or</shortDescription>
            <description>Oriya (Bolnagri)</description>
            <languageList>
              <iso639Id>ori</iso639Id>
              <!-- sat-Orya: http://www.ethnologue.com/language/sat -->
              <iso639Id>sat</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>ori-wx</name>
            <!-- Keyboard indicator for Oriya layouts -->
            <shortDescription>or</shortDescription>
            <description>Oriya (Wx)</description>
            <languageList>
              <iso639Id>ori</iso639Id>
              <!-- sat-Orya: http://www.ethnologue.com/language/sat -->
              <iso639Id>sat</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
           <configItem>
            <name>olck</name>
            <!-- Keyboard indicator for Ol Chiki layouts -->
            <shortDescription>sat</shortDescription>
            <description>Ol Chiki</description>
            <languageList>
              <!-- sat-Olck: http://www.ethnologue.com/language/sat -->
              <iso639Id>sat</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>tam_tamilnet</name>
            <!-- Keyboard indicator for Tamil layouts -->
            <shortDescription>ta</shortDescription>
            <description>Tamil (TamilNet '99)</description>
            <languageList>
              <iso639Id>tam</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>tam_tamilnet_with_tam_nums</name>
            <!-- Keyboard indicator for Tamil layouts -->
            <shortDescription>ta</shortDescription>
            <description>Tamil (TamilNet '99 with Tamil numerals)</description>
            <languageList>
              <iso639Id>tam</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>tam_tamilnet_TAB</name>
            <!-- Keyboard indicator for Tamil layouts -->
            <shortDescription>ta</shortDescription>
            <description>Tamil (TamilNet '99, TAB encoding)</description>
            <languageList>
              <iso639Id>tam</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>tam_tamilnet_TSCII</name>
            <!-- Keyboard indicator for Tamil layouts -->
            <shortDescription>ta</shortDescription>
            <description>Tamil (TamilNet '99, TSCII encoding)</description>
            <languageList>
              <iso639Id>tam</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>tam</name>
            <!-- Keyboard indicator for Tamil layouts -->
            <shortDescription>ta</shortDescription>
            <description>Tamil (InScript)</description>
            <languageList>
              <iso639Id>tam</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>tel</name>
            <!-- Keyboard indicator for Telugu layouts -->
            <shortDescription>te</shortDescription>
            <description>Telugu</description>
            <languageList>
              <iso639Id>tel</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>tel-kagapa</name>
            <!-- Keyboard indicator for Telugu layouts -->
            <shortDescription>te</shortDescription>
            <description>Telugu (KaGaPa, phonetic)</description>
            <languageList>
              <iso639Id>tel</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>tel-sarala</name>
            <!-- Keyboard indicator for Telugu layouts -->
            <shortDescription>te</shortDescription>
            <description>Telugu (Sarala)</description>
            <languageList>
              <iso639Id>tel</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>urd-phonetic</name>
            <!-- Keyboard indicator for Urdu layouts -->
            <shortDescription>ur</shortDescription>
            <description>Urdu (phonetic)</description>
            <languageList>
              <iso639Id>urd</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>urd-phonetic3</name>
            <!-- Keyboard indicator for Urdu layouts -->
            <shortDescription>ur</shortDescription>
            <description>Urdu (alt. phonetic)</description>
            <languageList>
              <iso639Id>urd</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>urd-winkeys</name>
            <!-- Keyboard indicator for Urdu layouts -->
            <shortDescription>ur</shortDescription>
            <description>Urdu (Windows)</description>
            <languageList>
              <iso639Id>urd</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>bolnagri</name>
            <!-- Keyboard indicator for Hindi layouts -->
            <shortDescription>hi</shortDescription>
            <description>Hindi (Bolnagri)</description>
            <languageList>
              <iso639Id>hin</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>hin-wx</name>
            <!-- Keyboard indicator for Hindi layouts -->
            <shortDescription>hi</shortDescription>
            <description>Hindi (Wx)</description>
            <languageList>
              <iso639Id>hin</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>hin-kagapa</name>
            <!-- Keyboard indicator for Hindi layouts -->
            <shortDescription>hi</shortDescription>
            <description>Hindi (KaGaPa, phonetic)</description>
            <languageList>
              <iso639Id>hin</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>san-kagapa</name>
            <!-- Keyboard indicator for Sanskrit layouts -->
            <shortDescription>sa</shortDescription>
            <description>Sanskrit (KaGaPa, phonetic)</description>
            <languageList>
              <iso639Id>san</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>mar-kagapa</name>
            <!-- Keyboard indicator for Marathi layouts -->
            <shortDescription>mr</shortDescription>
            <description>Marathi (KaGaPa, phonetic)</description>
            <languageList>
              <iso639Id>mar</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>eng</name>
            <!-- Keyboard indicator for English layouts -->
            <shortDescription>en</shortDescription>
            <description>English (India, with rupee)</description>
            <languageList>
              <iso639Id>eng</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>iipa</name>
            <description>Indic IPA</description>
            <languageList>
              <iso639Id>eng</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>marathi</name>
            <description>Marathi (enhanced InScript)</description>
            <languageList>
              <iso639Id>mar</iso639Id>
            </languageList>
          </configItem>
        </variant>
      </variantList>
    </layout>
    <layout>
      <configItem>
        <name>ba</name>
        <!-- Keyboard indicator for Bosnian layouts -->
        <shortDescription>bs</shortDescription>
        <description>Bosnian</description>
        <countryList>
          <iso3166Id>BA</iso3166Id>
        </countryList>
        <languageList>
          <iso639Id>bos</iso639Id>
        </languageList>
      </configItem>
      <variantList>
        <variant>
          <configItem>
            <name>alternatequotes</name>
            <description>Bosnian (with guillemets)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>unicode</name>
            <description>Bosnian (with Bosnian digraphs)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>unicodeus</name>
            <description>Bosnian (US, with Bosnian digraphs)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>us</name>
            <description>Bosnian (US)</description>
          </configItem>
        </variant>
      </variantList>
    </layout>
    <layout>
      <configItem>
        <name>br</name>
        <!-- Keyboard indicator for Portuguese layouts -->
        <shortDescription>pt</shortDescription>
        <description>Portuguese (Brazil)</description>
        <countryList>
          <iso3166Id>BR</iso3166Id>
        </countryList>
        <languageList>
          <iso639Id>por</iso639Id>
        </languageList>
      </configItem>
      <variantList>
        <variant>
          <configItem>
            <name>nodeadkeys</name>
            <description>Portuguese (Brazil, no dead keys)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>dvorak</name>
            <description>Portuguese (Brazil, Dvorak)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>nativo</name>
            <description>Portuguese (Brazil, Nativo)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>nativo-us</name>
            <description>Portuguese (Brazil, Nativo for US keyboards)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>nativo-epo</name>
            <description>Esperanto (Brazil, Nativo)</description>
            <languageList>
              <iso639Id>epo</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>thinkpad</name>
            <description>Portuguese (Brazil, IBM/Lenovo ThinkPad)</description>
          </configItem>
        </variant>
      </variantList>
    </layout>
    <layout>
      <configItem>
        <name>bg</name>
        <!-- Keyboard indicator for Bulgarian layouts -->
        <shortDescription>bg</shortDescription>
        <description>Bulgarian</description>
        <countryList>
          <iso3166Id>BG</iso3166Id>
        </countryList>
        <languageList>
          <iso639Id>bul</iso639Id>
        </languageList>
      </configItem>
      <variantList>
        <variant>
          <configItem>
            <name>phonetic</name>
            <description>Bulgarian (traditional phonetic)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>bas_phonetic</name>
            <description>Bulgarian (new phonetic)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>bekl</name>
            <description>Bulgarian (enhanced)</description>
          </configItem>
        </variant>
      </variantList>
    </layout>
    <layout>
      <configItem>
        <name>dz</name>
        <shortDescription>kab</shortDescription>
        <description>Berber (Algeria, Latin)</description>
        <countryList>
          <iso3166Id>DZ</iso3166Id>
        </countryList>
        <languageList>
          <iso639Id>tzm</iso639Id>
          <iso639Id>fra</iso639Id>
        </languageList>
      </configItem>
      <variantList>
        <variant>
          <configItem>
            <name>azerty-deadkeys</name>
            <shortDescription>kab</shortDescription>
            <description>Kabyle (AZERTY, with dead keys)</description>
            <languageList>
              <iso639Id>kab</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>qwerty-gb-deadkeys</name>
            <shortDescription>kab</shortDescription>
            <description>Kabyle (QWERTY, UK, with dead keys)</description>
            <languageList>
              <iso639Id>kab</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>qwerty-us-deadkeys</name>
            <shortDescription>kab</shortDescription>
            <description>Kabyle (QWERTY, US, with dead keys)</description>
            <languageList>
              <iso639Id>kab</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>ber</name>
            <shortDescription>kab</shortDescription>
            <description>Berber (Algeria, Tifinagh)</description>
            <languageList>
              <iso639Id>kab</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>ar</name>
            <shortDescription>ar</shortDescription>
            <description>Arabic (Algeria)</description>
            <languageList>
              <iso639Id>ara</iso639Id>
            </languageList>
          </configItem>
        </variant>
      </variantList>
    </layout>
    <layout>
      <configItem>
        <name>ma</name>
        <!-- Keyboard indicator for Arabic layouts -->
        <shortDescription>ar</shortDescription>
        <description>Arabic (Morocco)</description>
        <countryList>
          <iso3166Id>MA</iso3166Id>
        </countryList>
        <languageList>
          <iso639Id>ary</iso639Id>
        </languageList>
      </configItem>
      <variantList>
        <variant>
          <configItem>
            <name>french</name>
            <!-- Keyboard indicator for French layouts -->
            <shortDescription>fr</shortDescription>
            <description>French (Morocco)</description>
            <languageList>
              <iso639Id>fra</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>tifinagh</name>
            <!-- Keyboard indicator for Berber layouts -->
            <shortDescription>ber</shortDescription>
            <description>Berber (Morocco, Tifinagh)</description>
            <languageList>
              <iso639Id>ber</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>tifinagh-alt</name>
            <!-- Keyboard indicator for Berber layouts -->
            <shortDescription>ber</shortDescription>
            <description>Berber (Morocco, Tifinagh alt.)</description>
            <languageList>
              <iso639Id>ber</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>tifinagh-alt-phonetic</name>
            <!-- Keyboard indicator for Berber layouts -->
            <shortDescription>ber</shortDescription>
            <description>Berber (Morocco, Tifinagh phonetic, alt.)</description>
            <languageList>
              <iso639Id>ber</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>tifinagh-extended</name>
            <!-- Keyboard indicator for Berber layouts -->
            <shortDescription>ber</shortDescription>
            <description>Berber (Morocco, Tifinagh extended)</description>
            <languageList>
              <iso639Id>ber</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>tifinagh-phonetic</name>
            <!-- Keyboard indicator for Berber layouts -->
            <shortDescription>ber</shortDescription>
            <description>Berber (Morocco, Tifinagh phonetic)</description>
            <languageList>
              <iso639Id>ber</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>tifinagh-extended-phonetic</name>
            <!-- Keyboard indicator for Berber layouts -->
            <shortDescription>ber</shortDescription>
            <description>Berber (Morocco, Tifinagh extended phonetic)</description>
            <languageList>
              <iso639Id>ber</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>rif</name>
            <!-- Keyboard indicator for Tarifit layouts -->
            <shortDescription>rif</shortDescription>
            <description>Tarifit</description>
            <languageList>
              <iso639Id>rif</iso639Id>
            </languageList>
          </configItem>
        </variant>
      </variantList>
    </layout>
    <layout>
      <configItem>
        <name>cm</name>
        <!-- Keyboard indicator for Cameroon layouts -->
        <shortDescription>cm</shortDescription>
        <description>English (Cameroon)</description>
        <countryList>
          <iso3166Id>CM</iso3166Id>
        </countryList>
        <languageList>
          <iso639Id>eng</iso639Id>
        </languageList>
      </configItem>
      <variantList>
        <variant>
          <configItem>
            <name>french</name>
            <description>French (Cameroon)</description>
            <languageList>
              <iso639Id>fra</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>qwerty</name>
            <description>Cameroon Multilingual (QWERTY, intl.)</description>
            <languageList>
              <iso639Id>eng</iso639Id>
              <iso639Id>bas</iso639Id>
              <iso639Id>nmg</iso639Id>
              <iso639Id>fub</iso639Id>
              <iso639Id>ewo</iso639Id>
              <iso639Id>xmd</iso639Id>
              <iso639Id>mfh</iso639Id>
              <iso639Id>bkm</iso639Id>
              <iso639Id>ozm</iso639Id>
              <iso639Id>lns</iso639Id>
              <iso639Id>sox</iso639Id>
              <iso639Id>pny</iso639Id>
              <iso639Id>wes</iso639Id>
              <iso639Id>lem</iso639Id>
              <iso639Id>nyj</iso639Id>
              <iso639Id>mfk</iso639Id>
              <iso639Id>mcp</iso639Id>
              <iso639Id>ass</iso639Id>
              <iso639Id>xed</iso639Id>
              <iso639Id>dua</iso639Id>
              <iso639Id>anv</iso639Id>
              <iso639Id>bum</iso639Id>
              <iso639Id>btb</iso639Id>
              <iso639Id>bfd</iso639Id>
              <iso639Id>azo</iso639Id>
              <iso639Id>ken</iso639Id>
              <iso639Id>yam</iso639Id>
              <iso639Id>yat</iso639Id>
              <iso639Id>yas</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>azerty</name>
            <description>Cameroon (AZERTY, intl.)</description>
            <languageList>
              <iso639Id>fra</iso639Id>
              <iso639Id>bas</iso639Id>
              <iso639Id>nmg</iso639Id>
              <iso639Id>fub</iso639Id>
              <iso639Id>ewo</iso639Id>
              <iso639Id>xmd</iso639Id>
              <iso639Id>mfh</iso639Id>
              <iso639Id>bkm</iso639Id>
              <iso639Id>ozm</iso639Id>
              <iso639Id>lns</iso639Id>
              <iso639Id>sox</iso639Id>
              <iso639Id>pny</iso639Id>
              <iso639Id>wes</iso639Id>
              <iso639Id>lem</iso639Id>
              <iso639Id>nyj</iso639Id>
              <iso639Id>mfk</iso639Id>
              <iso639Id>mcp</iso639Id>
              <iso639Id>ass</iso639Id>
              <iso639Id>xed</iso639Id>
              <iso639Id>dua</iso639Id>
              <iso639Id>anv</iso639Id>
              <iso639Id>bum</iso639Id>
              <iso639Id>btb</iso639Id>
              <iso639Id>bfd</iso639Id>
              <iso639Id>azo</iso639Id>
              <iso639Id>ken</iso639Id>
              <iso639Id>yam</iso639Id>
              <iso639Id>yat</iso639Id>
              <iso639Id>yas</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>dvorak</name>
            <description>Cameroon (Dvorak, intl.)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>mmuock</name>
            <description>Mmuock</description>
          </configItem>
        </variant>
      </variantList>
    </layout>
    <layout>
      <configItem>
        <name>mm</name>
        <!-- Keyboard indicator for Burmese layouts -->
        <shortDescription>my</shortDescription>
        <description>Burmese</description>
        <countryList>
          <iso3166Id>MM</iso3166Id>
        </countryList>
        <languageList>
          <iso639Id>mya</iso639Id>
        </languageList>
      </configItem>
      <variantList>
        <variant>
          <configItem>
            <name>zawgyi</name>
            <shortDescription>zg</shortDescription>
            <description>Burmese Zawgyi</description>
            <languageList>
              <iso639Id>mya</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <!-- Keyboard Layout for Shan -->
        <variant>
          <configItem>
            <name>shn</name>
            <shortDescription>shn</shortDescription>
            <description>Shan</description>
            <languageList>
              <iso639Id>shn</iso639Id>
              <iso639Id>eng</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>zgt</name>
            <shortDescription>zgt</shortDescription>
            <description>Shan (Zawgyi Tai)</description>
            <languageList>
              <iso639Id>shn</iso639Id>
              <iso639Id>eng</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <!-- Keyboard Layout for Mon -->
        <variant>
          <configItem>
            <name>mnw</name>
            <shortDescription>mon</shortDescription>
            <description>Mon</description>
            <languageList>
              <iso639Id>mnw</iso639Id>
              <iso639Id>eng</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>mnw-a1</name>
            <shortDescription>mon-a1</shortDescription>
            <description>Mon (A1)</description>
            <languageList>
              <iso639Id>mnw</iso639Id>
              <iso639Id>eng</iso639Id>
            </languageList>
          </configItem>
        </variant>
      </variantList>
    </layout>
    <layout>
      <configItem>
        <name>ca</name>
        <!-- Keyboard indicator for French layouts -->
        <shortDescription>fr</shortDescription>
        <description>French (Canada)</description>
        <countryList>
          <iso3166Id>CA</iso3166Id>
        </countryList>
        <languageList>
          <iso639Id>fra</iso639Id>
        </languageList>
      </configItem>
      <variantList>
        <variant>
          <configItem>
            <name>fr-dvorak</name>
            <!-- Keyboard indicator for French layouts -->
            <shortDescription>fr</shortDescription>
            <description>French (Canada, Dvorak)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>fr-legacy</name>
            <!-- Keyboard indicator for French layouts -->
            <shortDescription>fr</shortDescription>
            <description>French (Canada, legacy)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>multix</name>
            <description>Canadian (intl.)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>multi</name>
            <description>Canadian (intl., 1st part)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>multi-2gr</name>
            <description>Canadian (intl., 2nd part)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>ike</name>
            <!-- Keyboard indicator for Inuktikut layouts -->
            <shortDescription>ike</shortDescription>
            <description>Inuktitut</description>
            <languageList>
              <iso639Id>iku</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>eng</name>
            <!-- Keyboard indicator for English layouts -->
            <shortDescription>en</shortDescription>
            <description>English (Canada)</description>
            <languageList>
              <iso639Id>eng</iso639Id>
            </languageList>
          </configItem>
        </variant>
      </variantList>
    </layout>
    <layout>
      <configItem>
        <name>cd</name>
        <!-- Keyboard indicator for French layouts -->
        <shortDescription>fr</shortDescription>
        <description>French (Democratic Republic of the Congo)</description>
        <countryList>
          <iso3166Id>CD</iso3166Id>
        </countryList>
        <languageList>
          <iso639Id>fra</iso639Id>
        </languageList>
      </configItem>
      <variantList/>
    </layout>
    <layout>
      <configItem>
        <name>cn</name>
        <!-- Keyboard indicator for Chinese layouts -->
        <shortDescription>zh</shortDescription>
        <description>Chinese</description>
        <countryList>
          <iso3166Id>CN</iso3166Id>
        </countryList>
        <languageList>
          <iso639Id>zho</iso639Id>
        </languageList>
      </configItem>
      <variantList>

        <variant>
          <configItem>
            <name>mon_trad</name>
            <description>Mongolian (Bichig)</description>
            <languageList>
              <iso639Id>mvf</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>mon_trad_todo</name>
            <description>Mongolian (Todo)</description>
            <languageList>
              <iso639Id>mvf</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>mon_trad_xibe</name>
            <description>Mongolian (Xibe)</description>
            <languageList>
              <iso639Id>sjo</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>mon_trad_manchu</name>
            <description>Mongolian (Manchu)</description>
            <languageList>
              <iso639Id>mnc</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>mon_trad_galik</name>
            <description>Mongolian (Galik)</description>
            <languageList>
              <iso639Id>mvf</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>mon_todo_galik</name>
            <description>Mongolian (Todo Galik)</description>
            <languageList>
              <iso639Id>mvf</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>mon_manchu_galik</name>
            <description>Mongolian (Manchu Galik)</description>
            <languageList>
              <iso639Id>mnc</iso639Id>
            </languageList>
          </configItem>
        </variant>

        <variant>
          <configItem>
            <name>tib</name>
            <description>Tibetan</description>
            <languageList>
              <iso639Id>bod</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>tib_asciinum</name>
            <description>Tibetan (with ASCII numerals)</description>
            <languageList>
              <iso639Id>bod</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>ug</name>
            <shortDescription>ug</shortDescription>
            <description>Uyghur</description>
            <languageList>
              <iso639Id>uig</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>altgr-pinyin</name>
            <description>Hanyu Pinyin Letters (with AltGr dead keys)</description>
            <languageList>
              <iso639Id>zho</iso639Id>
            </languageList>
          </configItem>
        </variant>
      </variantList>
    </layout>
    <layout>
      <configItem>
        <name>hr</name>
        <!-- Keyboard indicator for Croatian layouts -->
        <shortDescription>hr</shortDescription>
        <description>Croatian</description>
        <countryList>
          <iso3166Id>HR</iso3166Id>
        </countryList>
        <languageList>
          <iso639Id>hrv</iso639Id>
        </languageList>
      </configItem>
      <variantList>
        <variant>
          <configItem>
            <name>alternatequotes</name>
            <description>Croatian (with guillemets)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>unicode</name>
            <description>Croatian (with Croatian digraphs)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>unicodeus</name>
            <description>Croatian (US, with Croatian digraphs)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>us</name>
            <description>Croatian (US)</description>
          </configItem>
        </variant>
      </variantList>
    </layout>
    <layout>
      <configItem>
        <name>cz</name>
        <!-- Keyboard indicator for Chech layouts -->
        <shortDescription>cs</shortDescription>
        <description>Czech</description>
        <countryList>
          <iso3166Id>CZ</iso3166Id>
        </countryList>
        <languageList>
          <iso639Id>ces</iso639Id>
        </languageList>
      </configItem>
      <variantList>
        <variant>
          <configItem>
            <name>bksl</name>
            <description>Czech (with &lt;\|&gt; key)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>qwerty</name>
            <description>Czech (QWERTY)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>qwerty_bksl</name>
            <description>Czech (QWERTY, extended backslash)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>qwerty-mac</name>
            <description>Czech (QWERTY, Macintosh)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>ucw</name>
            <description>Czech (UCW, only accented letters)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>dvorak-ucw</name>
            <description>Czech (US, Dvorak, UCW support)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>rus</name>
            <!-- Keyboard indicator for Russian layouts -->
            <shortDescription>ru</shortDescription>
            <description>Russian (Czech, phonetic)</description>
            <languageList>
              <iso639Id>rus</iso639Id>
            </languageList>
          </configItem>
        </variant>
      </variantList>
    </layout>
    <layout>
      <configItem>
        <name>dk</name>
        <!-- Keyboard indicator for Danish layouts -->
        <shortDescription>da</shortDescription>
        <description>Danish</description>
        <countryList>
          <iso3166Id>DK</iso3166Id>
        </countryList>
        <languageList>
          <iso639Id>dan</iso639Id>
        </languageList>
      </configItem>
      <variantList>
        <variant>
          <configItem>
            <name>nodeadkeys</name>
            <description>Danish (no dead keys)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>winkeys</name>
            <description>Danish (Windows)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>mac</name>
            <description>Danish (Macintosh)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>mac_nodeadkeys</name>
            <description>Danish (Macintosh, no dead keys)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>dvorak</name>
            <description>Danish (Dvorak)</description>
          </configItem>
        </variant>
      </variantList>
    </layout>
    <layout>
      <configItem>
        <name>nl</name>
        <!-- Keyboard indicator for Dutch layouts -->
        <shortDescription>nl</shortDescription>
        <description>Dutch</description>
        <countryList>
          <iso3166Id>NL</iso3166Id>
        </countryList>
        <languageList>
          <iso639Id>nld</iso639Id>
        </languageList>
      </configItem>
      <variantList>
        <variant>
          <configItem>
            <name>us</name>
            <description>Dutch (US)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>mac</name>
            <description>Dutch (Macintosh)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>std</name>
            <description>Dutch (standard)</description>
          </configItem>
        </variant>
      </variantList>
    </layout>
    <layout>
      <configItem>
        <name>bt</name>
        <!-- Keyboard indicator for Dzongkha layouts -->
        <shortDescription>dz</shortDescription>
        <description>Dzongkha</description>
        <countryList>
          <iso3166Id>BT</iso3166Id>
        </countryList>
        <languageList>
          <iso639Id>dzo</iso639Id>
        </languageList>
      </configItem>
    </layout>
    <layout>
      <configItem>
        <name>ee</name>
        <!-- Keyboard indicator for Estonian layouts -->
        <shortDescription>et</shortDescription>
        <description>Estonian</description>
        <countryList>
          <iso3166Id>EE</iso3166Id>
        </countryList>
        <languageList>
          <iso639Id>est</iso639Id>
        </languageList>
      </configItem>
      <variantList>
        <variant>
          <configItem>
            <name>nodeadkeys</name>
            <description>Estonian (no dead keys)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>dvorak</name>
            <description>Estonian (Dvorak)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>us</name>
            <description>Estonian (US)</description>
          </configItem>
        </variant>
      </variantList>
    </layout>
    <layout>
      <configItem>
        <name>ir</name>
        <!-- Keyboard indicator for Persian layouts -->
        <shortDescription>fa</shortDescription>
        <description>Persian</description>
        <countryList>
          <iso3166Id>IR</iso3166Id>
        </countryList>
        <languageList>
          <iso639Id>fas</iso639Id>
        </languageList>
      </configItem>
      <variantList>
        <variant>
          <configItem>
            <name>pes_keypad</name>
            <description>Persian (with Persian keypad)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>ku</name>
            <!-- Keyboard indicator for Kurdish layouts -->
            <shortDescription>ku</shortDescription>
            <description>Kurdish (Iran, Latin Q)</description>
            <languageList>
              <iso639Id>kur</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>ku_f</name>
            <!-- Keyboard indicator for Kurdish layouts -->
            <shortDescription>ku</shortDescription>
            <description>Kurdish (Iran, F)</description>
            <languageList>
              <iso639Id>kur</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>ku_alt</name>
            <!-- Keyboard indicator for Kurdish layouts -->
            <shortDescription>ku</shortDescription>
            <description>Kurdish (Iran, Latin Alt-Q)</description>
            <languageList>
              <iso639Id>kur</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>ku_ara</name>
            <!-- Keyboard indicator for Kurdish layouts -->
            <shortDescription>ku</shortDescription>
            <description>Kurdish (Iran, Arabic-Latin)</description>
            <languageList>
              <iso639Id>kur</iso639Id>
            </languageList>
          </configItem>
        </variant>
      </variantList>
    </layout>
    <layout>
      <configItem>
        <name>iq</name>
        <!-- Keyboard indicator for Iraqi layouts -->
        <shortDescription>ar</shortDescription>
        <description>Iraqi</description>
        <countryList>
          <iso3166Id>IQ</iso3166Id>
        </countryList>
        <languageList>
          <iso639Id>ara</iso639Id>
          <iso639Id>kur</iso639Id>
        </languageList>
      </configItem>
      <variantList>
        <variant>
          <configItem>
            <name>ku</name>
            <!-- Keyboard indicator for Kurdish layouts -->
            <shortDescription>ku</shortDescription>
            <description>Kurdish (Iraq, Latin Q)</description>
            <languageList>
              <iso639Id>kur</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>ku_f</name>
            <!-- Keyboard indicator for Kurdish layouts -->
            <shortDescription>ku</shortDescription>
            <description>Kurdish (Iraq, F)</description>
            <languageList>
              <iso639Id>kur</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>ku_alt</name>
            <!-- Keyboard indicator for Kurdish layouts -->
            <shortDescription>ku</shortDescription>
            <description>Kurdish (Iraq, Latin Alt-Q)</description>
            <languageList>
              <iso639Id>kur</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>ku_ara</name>
            <!-- Keyboard indicator for Kurdish layouts -->
            <shortDescription>ku</shortDescription>
            <description>Kurdish (Iraq, Arabic-Latin)</description>
            <languageList>
              <iso639Id>kur</iso639Id>
            </languageList>
          </configItem>
        </variant>
      </variantList>
    </layout>
    <layout>
      <configItem>
        <name>fo</name>
        <!-- Keyboard indicator for Faroese layouts -->
        <shortDescription>fo</shortDescription>
        <description>Faroese</description>
        <countryList>
          <iso3166Id>FO</iso3166Id>
        </countryList>
        <languageList>
          <iso639Id>fao</iso639Id>
        </languageList>
      </configItem>
      <variantList>
        <variant>
          <configItem>
            <name>nodeadkeys</name>
            <description>Faroese (no dead keys)</description>
          </configItem>
        </variant>
      </variantList>
    </layout>
    <layout>
      <configItem>
        <name>fi</name>
        <!-- Keyboard indicator for Finnish layouts -->
        <shortDescription>fi</shortDescription>
        <description>Finnish</description>
        <countryList>
          <iso3166Id>FI</iso3166Id>
        </countryList>
        <languageList>
          <iso639Id>fin</iso639Id>
        </languageList>
      </configItem>
      <variantList>
        <variant>
          <configItem>
            <name>winkeys</name>
            <description>Finnish (Windows)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>classic</name>
            <description>Finnish (classic)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>nodeadkeys</name>
            <description>Finnish (classic, no dead keys)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>smi</name>
            <description>Northern Saami (Finland)</description>
            <languageList>
              <iso639Id>sme</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>mac</name>
            <description>Finnish (Macintosh)</description>
          </configItem>
        </variant>
      </variantList>
    </layout>
    <layout>
      <configItem>
        <name>fr</name>
        <!-- Keyboard indicator for French layouts -->
        <shortDescription>fr</shortDescription>
        <description>French</description>
        <countryList>
          <iso3166Id>FR</iso3166Id>
        </countryList>
        <languageList>
          <iso639Id>fra</iso639Id>
        </languageList>
      </configItem>
      <variantList>
        <variant>
          <configItem>
            <name>nodeadkeys</name>
            <description>French (no dead keys)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>oss</name>
            <description>French (alt.)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>oss_latin9</name>
            <description>French (alt., Latin-9 only)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>oss_nodeadkeys</name>
            <description>French (alt., no dead keys)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>latin9</name>
            <description>French (legacy, alt.)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>latin9_nodeadkeys</name>
            <description>French (legacy, alt., no dead keys)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>bepo</name>
            <description>French (BEPO)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>bepo_latin9</name>
            <description>French (BEPO, Latin-9 only)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>bepo_afnor</name>
            <description>French (BEPO, AFNOR)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>dvorak</name>
            <description>French (Dvorak)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>mac</name>
            <description>French (Macintosh)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>azerty</name>
            <description>French (AZERTY)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>afnor</name>
            <description>French (AZERTY, AFNOR)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>bre</name>
            <description>French (Breton)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>oci</name>
            <description>Occitan</description>
            <languageList>
              <iso639Id>oci</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>geo</name>
            <description>Georgian (France, AZERTY Tskapo)</description>
            <languageList>
              <iso639Id>kat</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>us</name>
            <description>French (US)</description>
          </configItem>
        </variant>
      </variantList>
    </layout>
    <layout>
      <configItem>
        <name>gh</name>
        <!-- Keyboard indicator for English layouts -->
        <shortDescription>en</shortDescription>
        <description>English (Ghana)</description>
        <countryList>
          <iso3166Id>GH</iso3166Id>
        </countryList>
        <languageList>
          <iso639Id>eng</iso639Id>
        </languageList>
      </configItem>
      <variantList>
        <variant>
          <configItem>
            <name>generic</name>
            <description>English (Ghana, multilingual)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>akan</name>
            <!-- Keyboard indicator for Akan layouts -->
            <shortDescription>ak</shortDescription>
            <description>Akan</description>
            <languageList>
              <iso639Id>aka</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>ewe</name>
            <!-- Keyboard indicator for Ewe layouts -->
            <shortDescription>ee</shortDescription>
            <description>Ewe</description>
            <languageList>
              <iso639Id>ewe</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>fula</name>
            <!-- Keyboard indicator for Fula layouts -->
            <shortDescription>ff</shortDescription>
            <description>Fula</description>
            <languageList>
              <iso639Id>ful</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>ga</name>
            <!-- Keyboard indicator for Ga layouts -->
            <shortDescription>gaa</shortDescription>
            <description>Ga</description>
            <languageList>
              <iso639Id>gaa</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>hausa</name>
            <!-- Keyboard indicator for Hausa layouts -->
            <shortDescription>ha</shortDescription>
            <description>Hausa (Ghana)</description>
            <languageList>
              <iso639Id>hau</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>avn</name>
            <!-- Keyboard indicator for Avatime layouts -->
            <shortDescription>avn</shortDescription>
            <description>Avatime</description>
            <languageList>
              <iso639Id>avn</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>gillbt</name>
            <description>English (Ghana, GILLBT)</description>
          </configItem>
        </variant>
      </variantList>
    </layout>
    <layout>
      <configItem>
        <name>gn</name>
        <shortDescription>nqo</shortDescription>
        <description>N'Ko (AZERTY)</description>
        <countryList>
          <iso3166Id>GN</iso3166Id>
        </countryList>
        <languageList>
          <iso639Id>nqo</iso639Id>
        </languageList>
      </configItem>
      <variantList/>
    </layout>
    <layout>
      <configItem>
        <name>ge</name>
        <!-- Keyboard indicator for Georgian layouts -->
        <shortDescription>ka</shortDescription>
        <description>Georgian</description>
        <countryList>
          <iso3166Id>GE</iso3166Id>
        </countryList>
        <languageList>
          <iso639Id>kat</iso639Id>
        </languageList>
      </configItem>
      <variantList>
        <variant>
          <configItem>
            <name>ergonomic</name>
            <description>Georgian (ergonomic)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>mess</name>
            <description>Georgian (MESS)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>ru</name>
            <!-- Keyboard indicator for Russian layouts -->
            <shortDescription>ru</shortDescription>
            <description>Russian (Georgia)</description>
            <languageList>
              <iso639Id>rus</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>os</name>
            <description>Ossetian (Georgia)</description>
            <languageList>
              <iso639Id>oss</iso639Id>
            </languageList>
          </configItem>
        </variant>
      </variantList>
    </layout>
    <layout>
      <configItem>
        <name>de</name>
        <!-- Keyboard indicator for German layouts -->
        <shortDescription>de</shortDescription>
        <description>German</description>
        <countryList>
          <iso3166Id>DE</iso3166Id>
        </countryList>
        <languageList>
          <iso639Id>deu</iso639Id>
        </languageList>
      </configItem>
      <variantList>
        <variant>
          <configItem>
            <name>deadacute</name>
            <description>German (dead acute)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>deadgraveacute</name>
            <description>German (dead grave acute)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>nodeadkeys</name>
            <description>German (no dead keys)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>e1</name>
            <description>German (E1)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>e2</name>
            <description>German (E2)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>T3</name>
            <description>German (T3)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>us</name>
            <description>German (US)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>ro</name>
            <description>Romanian (Germany)</description>
            <languageList>
              <iso639Id>ron</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>ro_nodeadkeys</name>
            <description>Romanian (Germany, no dead keys)</description>
            <languageList>
              <iso639Id>ron</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>dvorak</name>
            <description>German (Dvorak)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>neo</name>
            <description>German (Neo 2)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>mac</name>
            <description>German (Macintosh)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>mac_nodeadkeys</name>
            <description>German (Macintosh, no dead keys)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>dsb</name>
            <description>Lower Sorbian</description>
            <languageList>
              <iso639Id>dsb</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>dsb_qwertz</name>
            <description>Lower Sorbian (QWERTZ)</description>
            <languageList>
              <iso639Id>dsb</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>qwerty</name>
            <description>German (QWERTY)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>tr</name>
            <description>Turkish (Germany)</description>
            <languageList>
              <iso639Id>tur</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>ru</name>
            <!-- Keyboard indicator for Russian layouts -->
            <shortDescription>ru</shortDescription>
            <description>Russian (Germany, phonetic)</description>
            <languageList>
              <iso639Id>rus</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>deadtilde</name>
            <description>German (dead tilde)</description>
          </configItem>
        </variant>
      </variantList>
    </layout>
    <layout>
      <configItem>
        <name>gr</name>
        <!-- Keyboard indicator for Greek layouts -->
        <shortDescription>gr</shortDescription>
        <description>Greek</description>
        <countryList>
          <iso3166Id>GR</iso3166Id>
        </countryList>
        <languageList>
          <iso639Id>ell</iso639Id>
        </languageList>
      </configItem>
      <variantList>
        <variant>
          <configItem>
            <name>simple</name>
            <description>Greek (simple)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>extended</name>
            <description>Greek (extended)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>nodeadkeys</name>
            <description>Greek (no dead keys)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>polytonic</name>
            <description>Greek (polytonic)</description>
          </configItem>
        </variant>
      </variantList>
    </layout>
    <layout>
      <configItem>
        <name>hu</name>
        <!-- Keyboard indicator for Hungarian layouts -->
        <shortDescription>hu</shortDescription>
        <description>Hungarian</description>
        <countryList>
          <iso3166Id>HU</iso3166Id>
        </countryList>
        <languageList>
          <iso639Id>hun</iso639Id>
        </languageList>
      </configItem>
      <variantList>
        <variant>
          <configItem>
            <name>standard</name>
            <description>Hungarian (standard)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>nodeadkeys</name>
            <description>Hungarian (no dead keys)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>qwerty</name>
            <description>Hungarian (QWERTY)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>101_qwertz_comma_dead</name>
            <description>Hungarian (QWERTZ, 101-key, comma, dead keys)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>101_qwertz_comma_nodead</name>
            <description>Hungarian (QWERTZ, 101-key, comma, no dead keys)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>101_qwertz_dot_dead</name>
            <description>Hungarian (QWERTZ, 101-key, dot, dead keys)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>101_qwertz_dot_nodead</name>
            <description>Hungarian (QWERTZ, 101-key, dot, no dead keys)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>101_qwerty_comma_dead</name>
            <description>Hungarian (QWERTY, 101-key, comma, dead keys)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>101_qwerty_comma_nodead</name>
            <description>Hungarian (QWERTY, 101-key, comma, no dead keys)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>101_qwerty_dot_dead</name>
            <description>Hungarian (QWERTY, 101-key, dot, dead keys)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>101_qwerty_dot_nodead</name>
            <description>Hungarian (QWERTY, 101-key, dot, no dead keys)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>102_qwertz_comma_dead</name>
            <description>Hungarian (QWERTZ, 102-key, comma, dead keys)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>102_qwertz_comma_nodead</name>
            <description>Hungarian (QWERTZ, 102-key, comma, no dead keys)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>102_qwertz_dot_dead</name>
            <description>Hungarian (QWERTZ, 102-key, dot, dead keys)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>102_qwertz_dot_nodead</name>
            <description>Hungarian (QWERTZ, 102-key, dot, no dead keys)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>102_qwerty_comma_dead</name>
            <description>Hungarian (QWERTY, 102-key, comma, dead keys)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>102_qwerty_comma_nodead</name>
            <description>Hungarian (QWERTY, 102-key, comma, no dead keys)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>102_qwerty_dot_dead</name>
            <description>Hungarian (QWERTY, 102-key, dot, dead keys)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>102_qwerty_dot_nodead</name>
            <description>Hungarian (QWERTY, 102-key, dot, no dead keys)</description>
          </configItem>
        </variant>
      </variantList>
    </layout>
    <layout>
      <configItem>
        <name>is</name>
        <!-- Keyboard indicator for Icelandic layouts -->
        <shortDescription>is</shortDescription>
        <description>Icelandic</description>
        <countryList>
          <iso3166Id>IS</iso3166Id>
        </countryList>
        <languageList>
          <iso639Id>isl</iso639Id>
        </languageList>
      </configItem>
      <variantList>
        <variant>
          <configItem>
            <name>mac_legacy</name>
            <description>Icelandic (Macintosh, legacy)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>mac</name>
            <description>Icelandic (Macintosh)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>dvorak</name>
            <description>Icelandic (Dvorak)</description>
          </configItem>
        </variant>
      </variantList>
    </layout>
    <layout>
      <configItem>
        <name>il</name>
        <!-- Keyboard indicator for Hebrew layouts -->
        <shortDescription>he</shortDescription>
        <description>Hebrew</description>
        <countryList>
          <iso3166Id>IL</iso3166Id>
        </countryList>
        <languageList>
          <iso639Id>heb</iso639Id>
        </languageList>
      </configItem>
      <variantList>
        <variant>
          <configItem>
            <name>lyx</name>
            <description>Hebrew (lyx)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>phonetic</name>
            <description>Hebrew (phonetic)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>biblical</name>
            <description>Hebrew (Biblical, Tiro)</description>
          </configItem>
        </variant>
      </variantList>
    </layout>
    <layout>
      <configItem>
        <name>it</name>
        <!-- Keyboard indicator for Italian layouts -->
        <shortDescription>it</shortDescription>
        <description>Italian</description>
        <countryList>
          <iso3166Id>IT</iso3166Id>
        </countryList>
        <languageList>
          <iso639Id>ita</iso639Id>
        </languageList>
      </configItem>
      <variantList>
        <variant>
          <configItem>
            <name>nodeadkeys</name>
            <description>Italian (no dead keys)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>winkeys</name>
            <description>Italian (Windows)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>mac</name>
            <description>Italian (Macintosh)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>us</name>
            <description>Italian (US)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>geo</name>
            <description>Georgian (Italy)</description>
            <languageList>
              <iso639Id>kat</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>ibm</name>
            <description>Italian (IBM 142)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>intl</name>
            <description>Italian (intl., with dead keys)</description>
            <languageList>
              <iso639Id>deu</iso639Id>
              <iso639Id>fra</iso639Id>
              <iso639Id>ita</iso639Id>
              <iso639Id>slk</iso639Id>
              <iso639Id>srd</iso639Id>
              <iso639Id>nap</iso639Id>
              <iso639Id>scn</iso639Id>
              <iso639Id>fur</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>scn</name>
            <description>Sicilian</description>
            <languageList>
              <iso639Id>ita</iso639Id>
              <iso639Id>scn</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>fur</name>
            <description>Friulian (Italy)</description>
            <languageList>
              <iso639Id>fur</iso639Id>
            </languageList>
          </configItem>
        </variant>
      </variantList>
    </layout>
    <layout>
      <configItem>
        <name>jp</name>
        <!-- Keyboard indicator for Japaneses -->
        <shortDescription>ja</shortDescription>
        <description>Japanese</description>
        <countryList>
          <iso3166Id>JP</iso3166Id>
        </countryList>
        <languageList>
          <iso639Id>jpn</iso639Id>
        </languageList>
      </configItem>
      <variantList>
        <variant>
          <configItem>
            <name>kana</name>
            <description>Japanese (Kana)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>kana86</name>
            <description>Japanese (Kana 86)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>OADG109A</name>
            <description>Japanese (OADG 109A)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>mac</name>
            <description>Japanese (Macintosh)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>dvorak</name>
            <description>Japanese (Dvorak)</description>
          </configItem>
        </variant>
      </variantList>
    </layout>
    <layout>
      <configItem>
        <name>kg</name>
        <!-- Keyboard indicator for Kyrgyz layouts -->
        <shortDescription>ki</shortDescription>
        <description>Kyrgyz</description>
        <countryList>
          <iso3166Id>KG</iso3166Id>
        </countryList>
        <languageList>
          <iso639Id>kir</iso639Id>
        </languageList>
      </configItem>
      <variantList>
        <variant>
          <configItem>
            <name>phonetic</name>
            <description>Kyrgyz (phonetic)</description>
          </configItem>
        </variant>
      </variantList>
    </layout>
    <layout>
      <configItem>
        <name>kh</name>
        <!-- Keyboard indicator for Khmer layouts -->
        <shortDescription>km</shortDescription>
        <description>Khmer (Cambodia)</description>
        <countryList>
          <iso3166Id>KH</iso3166Id>
        </countryList>
        <languageList>
          <iso639Id>khm</iso639Id>
        </languageList>
      </configItem>
      <variantList/>
    </layout>
    <layout>
      <configItem>
        <name>kz</name>
        <!-- Keyboard indicator for Kazakh layouts -->
        <shortDescription>kk</shortDescription>
        <description>Kazakh</description>
        <countryList>
          <iso3166Id>KZ</iso3166Id>
        </countryList>
        <languageList>
          <iso639Id>kaz</iso639Id>
        </languageList>
      </configItem>
      <variantList>
        <variant>
          <configItem>
            <name>ruskaz</name>
            <!-- Keyboard indicator for Russian layouts -->
            <shortDescription>ru</shortDescription>
            <description>Russian (Kazakhstan, with Kazakh)</description>
            <languageList>
              <iso639Id>kaz</iso639Id>
              <iso639Id>rus</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>kazrus</name>
            <description>Kazakh (with Russian)</description>
            <languageList>
              <iso639Id>kaz</iso639Id>
              <iso639Id>rus</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>ext</name>
            <description>Kazakh (extended)</description>
            <languageList>
              <iso639Id>kaz</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>latin</name>
            <description>Kazakh (Latin)</description>
            <languageList>
              <iso639Id>kaz</iso639Id>
            </languageList>
          </configItem>
        </variant>
      </variantList>
    </layout>
    <layout>
      <configItem>
        <name>la</name>
        <!-- Keyboard indicator for Lao layouts -->
        <shortDescription>lo</shortDescription>
        <description>Lao</description>
        <countryList>
          <iso3166Id>LA</iso3166Id>
        </countryList>
        <languageList>
          <iso639Id>lao</iso639Id>
        </languageList>
      </configItem>
      <variantList>
        <variant>
          <configItem>
            <name>stea</name>
            <description>Lao (STEA)</description>
            <languageList>
              <iso639Id>lao</iso639Id>
            </languageList>
          </configItem>
        </variant>
      </variantList>
    </layout>
    <layout>
      <configItem>
        <name>latam</name>
        <!-- Keyboard indicator for Spanish layouts -->
        <shortDescription>es</shortDescription>
        <description>Spanish (Latin American)</description>
        <countryList>
          <iso3166Id>AR</iso3166Id>
          <iso3166Id>BO</iso3166Id>
          <iso3166Id>CL</iso3166Id>
          <iso3166Id>CO</iso3166Id>
          <iso3166Id>CR</iso3166Id>
          <iso3166Id>CU</iso3166Id>
          <iso3166Id>DO</iso3166Id>
          <iso3166Id>EC</iso3166Id>
          <iso3166Id>GT</iso3166Id>
          <iso3166Id>HN</iso3166Id>
          <iso3166Id>HT</iso3166Id>
          <iso3166Id>MX</iso3166Id>
          <iso3166Id>NI</iso3166Id>
          <iso3166Id>PA</iso3166Id>
          <iso3166Id>PE</iso3166Id>
          <iso3166Id>PR</iso3166Id>
          <iso3166Id>PY</iso3166Id>
          <iso3166Id>SV</iso3166Id>
          <iso3166Id>US</iso3166Id>
          <iso3166Id>UY</iso3166Id>
          <iso3166Id>VE</iso3166Id>
        </countryList>
        <languageList>
          <iso639Id>spa</iso639Id>
        </languageList>
      </configItem>
      <variantList>
        <variant>
          <configItem>
            <name>nodeadkeys</name>
            <description>Spanish (Latin American, no dead keys)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>deadtilde</name>
            <description>Spanish (Latin American, dead tilde)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>dvorak</name>
            <description>Spanish (Latin American, Dvorak)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>colemak</name>
            <description>Spanish (Latin American, Colemak)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>colemak-gaming</name>
            <description>Spanish (Latin American, Colemak for gaming)</description>
          </configItem>
        </variant>
      </variantList>
    </layout>
    <layout>
      <configItem>
        <name>lt</name>
        <!-- Keyboard indicator for Lithuanian layouts -->
        <shortDescription>lt</shortDescription>
        <description>Lithuanian</description>
        <countryList>
          <iso3166Id>LT</iso3166Id>
        </countryList>
        <languageList>
          <iso639Id>lit</iso639Id>
        </languageList>
      </configItem>
      <variantList>
        <variant>
          <configItem>
            <name>std</name>
            <description>Lithuanian (standard)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>us</name>
            <description>Lithuanian (US)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>ibm</name>
            <description>Lithuanian (IBM LST 1205-92)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>lekp</name>
            <description>Lithuanian (LEKP)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>lekpa</name>
            <description>Lithuanian (LEKPa)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>sgs</name>
            <description>Samogitian</description>
            <languageList>
              <iso639Id>sgs</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>ratise</name>
            <description>Lithuanian (Ratise)</description>
          </configItem>
        </variant>
      </variantList>
    </layout>
    <layout>
      <configItem>
        <name>lv</name>
        <!-- Keyboard indicator for Latvian layouts -->
        <shortDescription>lv</shortDescription>
        <description>Latvian</description>
        <countryList>
          <iso3166Id>LV</iso3166Id>
        </countryList>
        <languageList>
          <iso639Id>lav</iso639Id>
        </languageList>
      </configItem>
      <variantList>
        <variant>
          <configItem>
            <name>apostrophe</name>
            <description>Latvian (apostrophe)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>tilde</name>
            <description>Latvian (tilde)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>fkey</name>
            <description>Latvian (F)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>modern</name>
            <description>Latvian (modern)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>ergonomic</name>
            <description>Latvian (ergonomic, ŪGJRMV)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>adapted</name>
            <description>Latvian (adapted)</description>
          </configItem>
        </variant>
      </variantList>
    </layout>
    <layout>
      <configItem>
        <name>mao</name>
        <!-- Keyboard indicator for Maori layouts -->
        <shortDescription>mi</shortDescription>
        <description>Maori</description>
        <countryList>
          <iso3166Id>NZ</iso3166Id>
        </countryList>
        <languageList>
          <iso639Id>mri</iso639Id>
        </languageList>
      </configItem>
      <variantList/>
    </layout>
    <layout>
      <configItem>
        <name>me</name>
        <!-- Keyboard indicator for Montenegrin layouts -->
        <shortDescription>sr</shortDescription>
        <description>Montenegrin</description>
        <countryList>
          <iso3166Id>ME</iso3166Id>
        </countryList>
        <languageList>
          <iso639Id>srp</iso639Id>
        </languageList>
      </configItem>
      <variantList>
        <variant>
          <configItem>
            <name>cyrillic</name>
            <description>Montenegrin (Cyrillic)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>cyrillicyz</name>
            <description>Montenegrin (Cyrillic, ZE and ZHE swapped)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>latinunicode</name>
            <description>Montenegrin (Latin, Unicode)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>latinyz</name>
            <description>Montenegrin (Latin, QWERTY)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>latinunicodeyz</name>
            <description>Montenegrin (Latin, Unicode, QWERTY)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>cyrillicalternatequotes</name>
            <description>Montenegrin (Cyrillic, with guillemets)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>latinalternatequotes</name>
            <description>Montenegrin (Latin, with guillemets)</description>
          </configItem>
        </variant>
      </variantList>
    </layout>
    <layout>
      <configItem>
        <name>mk</name>
        <!-- Keyboard indicator for Macedonian layouts -->
        <shortDescription>mk</shortDescription>
        <description>Macedonian</description>
        <countryList>
          <iso3166Id>MK</iso3166Id>
        </countryList>
        <languageList>
          <iso639Id>mkd</iso639Id>
        </languageList>
      </configItem>
      <variantList>
        <variant>
          <configItem>
            <name>nodeadkeys</name>
            <description>Macedonian (no dead keys)</description>
          </configItem>
        </variant>
      </variantList>
    </layout>
    <layout>
      <configItem>
        <name>mt</name>
        <!-- Keyboard indicator for Maltese layouts -->
        <shortDescription>mt</shortDescription>
        <description>Maltese</description>
        <countryList>
          <iso3166Id>MT</iso3166Id>
        </countryList>
        <languageList>
          <iso639Id>mlt</iso639Id>
        </languageList>
      </configItem>
      <variantList>
        <variant>
          <configItem>
            <name>us</name>
            <description>Maltese (US)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>alt-us</name>
            <description>Maltese (US, with AltGr overrides)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>alt-gb</name>
            <description>Maltese (UK, with AltGr overrides)</description>
          </configItem>
        </variant>
      </variantList>
    </layout>
    <layout>
      <configItem>
        <name>mn</name>
        <!-- Keyboard indicator for Mongolian layouts -->
        <shortDescription>mn</shortDescription>
        <description>Mongolian</description>
        <countryList>
          <iso3166Id>MN</iso3166Id>
        </countryList>
        <languageList>
          <iso639Id>mon</iso639Id>
        </languageList>
      </configItem>
      <variantList/>
    </layout>
    <layout>
      <configItem>
        <name>no</name>
        <!-- Keyboard indicator for Norwegian layouts -->
        <shortDescription>no</shortDescription>
        <description>Norwegian</description>
        <countryList>
          <iso3166Id>NO</iso3166Id>
        </countryList>
        <languageList>
          <iso639Id>nor</iso639Id>
          <iso639Id>nob</iso639Id>
          <iso639Id>nno</iso639Id>
        </languageList>
      </configItem>
      <variantList>
        <variant>
          <configItem>
            <name>nodeadkeys</name>
            <description>Norwegian (no dead keys)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>winkeys</name>
            <description>Norwegian (Windows)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>dvorak</name>
            <description>Norwegian (Dvorak)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>smi</name>
            <description>Northern Saami (Norway)</description>
            <languageList>
              <iso639Id>sme</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>smi_nodeadkeys</name>
            <description>Northern Saami (Norway, no dead keys)</description>
            <languageList>
              <iso639Id>sme</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>mac</name>
            <description>Norwegian (Macintosh)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>mac_nodeadkeys</name>
            <description>Norwegian (Macintosh, no dead keys)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>colemak</name>
            <description>Norwegian (Colemak)</description>
          </configItem>
        </variant>
      </variantList>
    </layout>
    <layout>
      <configItem>
        <name>pl</name>
        <!-- Keyboard indicator for Polish layouts -->
        <shortDescription>pl</shortDescription>
        <description>Polish</description>
        <countryList>
          <iso3166Id>PL</iso3166Id>
        </countryList>
        <languageList>
          <iso639Id>pol</iso639Id>
        </languageList>
      </configItem>
      <variantList>
        <variant>
          <configItem>
            <name>legacy</name>
            <description>Polish (legacy)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>qwertz</name>
            <description>Polish (QWERTZ)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>dvorak</name>
            <description>Polish (Dvorak)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>dvorak_quotes</name>
            <description>Polish (Dvorak, with Polish quotes on quotemark key)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>dvorak_altquotes</name>
            <description>Polish (Dvorak, with Polish quotes on key 1)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>csb</name>
            <description>Kashubian</description>
            <languageList>
              <iso639Id>csb</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>szl</name>
            <description>Silesian</description>
            <languageList>
              <iso639Id>szl</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>ru_phonetic_dvorak</name>
            <!-- Keyboard indicator for Russian layouts -->
            <shortDescription>ru</shortDescription>
            <description>Russian (Poland, phonetic Dvorak)</description>
            <languageList>
              <iso639Id>rus</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>dvp</name>
            <description>Polish (programmer Dvorak)</description>
          </configItem>
        </variant>
      </variantList>
    </layout>
    <layout>
      <configItem>
        <name>pt</name>
        <!-- Keyboard indicator for Portuguese layouts -->
        <shortDescription>pt</shortDescription>
        <description>Portuguese</description>
        <countryList>
          <iso3166Id>PT</iso3166Id>
        </countryList>
        <languageList>
          <iso639Id>por</iso639Id>
        </languageList>
      </configItem>
      <variantList>
        <variant>
          <configItem>
            <name>nodeadkeys</name>
            <description>Portuguese (no dead keys)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>mac</name>
            <description>Portuguese (Macintosh)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>mac_nodeadkeys</name>
            <description>Portuguese (Macintosh, no dead keys)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>nativo</name>
            <description>Portuguese (Nativo)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>nativo-us</name>
            <description>Portuguese (Nativo for US keyboards)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>nativo-epo</name>
            <description>Esperanto (Portugal, Nativo)</description>
            <languageList>
              <iso639Id>epo</iso639Id>
            </languageList>
          </configItem>
        </variant>
      </variantList>
    </layout>
    <layout>
      <configItem>
        <name>ro</name>
        <!-- Keyboard indicator for Romanian layouts -->
        <shortDescription>ro</shortDescription>
        <description>Romanian</description>
        <countryList>
          <iso3166Id>RO</iso3166Id>
        </countryList>
        <languageList>
          <iso639Id>ron</iso639Id>
        </languageList>
      </configItem>
      <variantList>
        <variant>
          <configItem>
            <name>std</name>
            <description>Romanian (standard)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>winkeys</name>
            <description>Romanian (Windows)</description>
          </configItem>
        </variant>
      </variantList>
    </layout>
    <layout>
      <configItem>
        <name>ru</name>
        <!-- Keyboard indicator for Russian layouts -->
        <shortDescription>ru</shortDescription>
        <description>Russian</description>
        <countryList>
          <iso3166Id>RU</iso3166Id>
        </countryList>
        <languageList>
          <iso639Id>rus</iso639Id>
        </languageList>
      </configItem>
      <variantList>
        <variant>
          <configItem>
            <name>phonetic</name>
            <description>Russian (phonetic)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>phonetic_winkeys</name>
            <description>Russian (phonetic, Windows)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>phonetic_YAZHERTY</name>
            <description>Russian (phonetic, YAZHERTY)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>typewriter</name>
            <description>Russian (typewriter)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>legacy</name>
            <description>Russian (legacy)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>typewriter-legacy</name>
            <description>Russian (typewriter, legacy)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>tt</name>
            <description>Tatar</description>
            <languageList>
              <iso639Id>tat</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>os_legacy</name>
            <description>Ossetian (legacy)</description>
            <languageList>
              <iso639Id>oss</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>os_winkeys</name>
            <description>Ossetian (Windows)</description>
            <languageList>
              <iso639Id>oss</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>cv</name>
            <description>Chuvash</description>
            <languageList>
              <iso639Id>chv</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>cv_latin</name>
            <description>Chuvash (Latin)</description>
            <languageList>
              <iso639Id>chv</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>udm</name>
            <description>Udmurt</description>
            <languageList>
              <iso639Id>udm</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>kom</name>
            <description>Komi</description>
            <languageList>
              <iso639Id>kom</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>sah</name>
            <description>Yakut</description>
            <languageList>
              <iso639Id>sah</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>xal</name>
            <description>Kalmyk</description>
            <languageList>
              <iso639Id>xal</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>dos</name>
            <description>Russian (DOS)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>mac</name>
            <description>Russian (Macintosh)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>srp</name>
            <description>Serbian (Russia)</description>
            <languageList>
              <iso639Id>rus</iso639Id>
              <iso639Id>srp</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>bak</name>
            <description>Bashkirian</description>
            <languageList>
              <iso639Id>bak</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>chm</name>
            <description>Mari</description>
            <languageList>
              <iso639Id>chm</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>phonetic_azerty</name>
            <description>Russian (phonetic, AZERTY)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>phonetic_dvorak</name>
            <description>Russian (phonetic, Dvorak)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>phonetic_fr</name>
            <description>Russian (phonetic, French)</description>
          </configItem>
        </variant>
      </variantList>
    </layout>
    <layout>
      <configItem>
        <name>rs</name>
        <!-- Keyboard indicator for Serbian layouts -->
        <shortDescription>sr</shortDescription>
        <description>Serbian</description>
        <countryList>
          <iso3166Id>RS</iso3166Id>
        </countryList>
        <languageList>
          <iso639Id>srp</iso639Id>
        </languageList>
      </configItem>
      <variantList>
        <variant>
          <configItem>
            <name>yz</name>
            <description>Serbian (Cyrillic, ZE and ZHE swapped)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>latin</name>
            <description>Serbian (Latin)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>latinunicode</name>
            <description>Serbian (Latin, Unicode)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>latinyz</name>
            <description>Serbian (Latin, QWERTY)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>latinunicodeyz</name>
            <description>Serbian (Latin, Unicode, QWERTY)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>alternatequotes</name>
            <description>Serbian (Cyrillic, with guillemets)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>latinalternatequotes</name>
            <description>Serbian (Latin, with guillemets)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>rue</name>
            <description>Pannonian Rusyn</description>
            <languageList>
              <iso639Id>rue</iso639Id>
            </languageList>
          </configItem>
        </variant>
      </variantList>
    </layout>
    <layout>
      <configItem>
        <name>si</name>
        <!-- Keyboard indicator for Slovenian layouts -->
        <shortDescription>sl</shortDescription>
        <description>Slovenian</description>
        <countryList>
          <iso3166Id>SI</iso3166Id>
        </countryList>
        <languageList>
          <iso639Id>slv</iso639Id>
        </languageList>
      </configItem>
      <variantList>
        <variant>
          <configItem>
            <name>alternatequotes</name>
            <description>Slovenian (with guillemets)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>us</name>
            <description>Slovenian (US)</description>
          </configItem>
        </variant>
      </variantList>
    </layout>
    <layout>
      <configItem>
        <name>sk</name>
        <!-- Keyboard indicator for Slovak layouts -->
        <shortDescription>sk</shortDescription>
        <description>Slovak</description>
        <countryList>
          <iso3166Id>SK</iso3166Id>
        </countryList>
        <languageList>
          <iso639Id>slk</iso639Id>
        </languageList>
      </configItem>
      <variantList>
        <variant>
          <configItem>
            <name>bksl</name>
            <description>Slovak (extended backslash)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>qwerty</name>
            <description>Slovak (QWERTY)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>qwerty_bksl</name>
            <description>Slovak (QWERTY, extended backslash)</description>
          </configItem>
        </variant>
      </variantList>
    </layout>
    <layout>
      <configItem>
        <name>es</name>
        <!-- Keyboard indicator for Spanish layouts -->
        <shortDescription>es</shortDescription>
        <description>Spanish</description>
        <countryList>
          <iso3166Id>ES</iso3166Id>
        </countryList>
        <languageList>
          <iso639Id>spa</iso639Id>
        </languageList>
      </configItem>
      <variantList>
        <variant>
          <configItem>
            <name>nodeadkeys</name>
            <description>Spanish (no dead keys)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>winkeys</name>
            <description>Spanish (Windows)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>deadtilde</name>
            <description>Spanish (dead tilde)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>dvorak</name>
            <description>Spanish (Dvorak)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>ast</name>
            <shortDescription>ast</shortDescription>
            <description>Asturian (Spain, with bottom-dot H and L)</description>
            <languageList>
              <iso639Id>ast</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>cat</name>
            <shortDescription>ca</shortDescription>
            <description>Catalan (Spain, with middle-dot L)</description>
            <languageList>
              <iso639Id>cat</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>mac</name>
            <description>Spanish (Macintosh)</description>
          </configItem>
        </variant>
      </variantList>
    </layout>
    <layout>
      <configItem>
        <name>se</name>
        <!-- Keyboard indicator for Swedish layouts -->
        <shortDescription>sv</shortDescription>
        <description>Swedish</description>
        <countryList>
          <iso3166Id>SE</iso3166Id>
        </countryList>
        <languageList>
          <iso639Id>swe</iso639Id>
        </languageList>
      </configItem>
      <variantList>
        <variant>
          <configItem>
            <name>nodeadkeys</name>
            <description>Swedish (no dead keys)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>dvorak</name>
            <description>Swedish (Dvorak)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>rus</name>
            <!-- Keyboard indicator for Russian layouts -->
            <shortDescription>ru</shortDescription>
            <description>Russian (Sweden, phonetic)</description>
            <languageList>
              <iso639Id>rus</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>rus_nodeadkeys</name>
            <!-- Keyboard indicator for Russian layouts -->
            <shortDescription>ru</shortDescription>
            <description>Russian (Sweden, phonetic, no dead keys)</description>
            <languageList>
              <iso639Id>rus</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>smi</name>
            <description>Northern Saami (Sweden)</description>
            <languageList>
              <iso639Id>sme</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>mac</name>
            <description>Swedish (Macintosh)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>svdvorak</name>
            <description>Swedish (Svdvorak)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>us_dvorak</name>
            <description>Swedish (Dvorak, intl.)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>us</name>
            <description>Swedish (US)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>swl</name>
            <description>Swedish Sign Language</description>
            <languageList>
              <iso639Id>swl</iso639Id>
            </languageList>
          </configItem>
        </variant>
      </variantList>
    </layout>
    <layout>
      <configItem>
        <name>ch</name>
        <!-- Keyboard indicator for German layouts -->
        <shortDescription>de</shortDescription>
        <description>German (Switzerland)</description>
        <countryList>
          <iso3166Id>CH</iso3166Id>
        </countryList>
        <languageList>
          <iso639Id>deu</iso639Id>
          <iso639Id>gsw</iso639Id>
        </languageList>
      </configItem>
      <variantList>
        <variant>
          <configItem>
            <name>legacy</name>
            <description>German (Switzerland, legacy)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>de_nodeadkeys</name>
            <!-- Keyboard indicator for German layouts -->
            <shortDescription>de</shortDescription>
            <description>German (Switzerland, no dead keys)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>fr</name>
            <!-- Keyboard indicator for French layouts -->
            <shortDescription>fr</shortDescription>
            <description>French (Switzerland)</description>
            <languageList>
              <iso639Id>fra</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>fr_nodeadkeys</name>
            <!-- Keyboard indicator for French layouts -->
            <shortDescription>fr</shortDescription>
            <description>French (Switzerland, no dead keys)</description>
            <languageList>
              <iso639Id>fra</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>fr_mac</name>
            <!-- Keyboard indicator for French layouts -->
            <shortDescription>fr</shortDescription>
            <description>French (Switzerland, Macintosh)</description>
            <languageList>
              <iso639Id>fra</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>de_mac</name>
            <!-- Keyboard indicator for German layouts -->
            <shortDescription>de</shortDescription>
            <description>German (Switzerland, Macintosh)</description>
          </configItem>
        </variant>
      </variantList>
    </layout>
    <layout>
      <configItem>
        <name>sy</name>
        <!-- Keyboard indicator for Arabic layouts -->
        <shortDescription>ar</shortDescription>
        <description>Arabic (Syria)</description>
        <countryList>
          <iso3166Id>SY</iso3166Id>
        </countryList>
        <languageList>
          <iso639Id>syr</iso639Id>
        </languageList>
      </configItem>
      <variantList>
        <variant>
          <configItem>
            <name>syc</name>
            <!-- Keyboard indicator for Syriac layouts -->
            <shortDescription>syc</shortDescription>
            <description>Syriac</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>syc_phonetic</name>
            <!-- Keyboard indicator for Syriac layouts -->
            <shortDescription>syc</shortDescription>
            <description>Syriac (phonetic)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>ku</name>
            <!-- Keyboard indicator for Kurdish layouts -->
            <shortDescription>ku</shortDescription>
            <description>Kurdish (Syria, Latin Q)</description>
            <languageList>
              <iso639Id>kur</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>ku_f</name>
            <!-- Keyboard indicator for Kurdish layouts -->
            <shortDescription>ku</shortDescription>
            <description>Kurdish (Syria, F)</description>
            <languageList>
              <iso639Id>kur</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>ku_alt</name>
            <!-- Keyboard indicator for Kurdish layouts -->
            <shortDescription>ku</shortDescription>
            <description>Kurdish (Syria, Latin Alt-Q)</description>
            <languageList>
              <iso639Id>kur</iso639Id>
            </languageList>
          </configItem>
        </variant>
      </variantList>
    </layout>
    <layout>
      <configItem>
        <name>tj</name>
        <!-- Keyboard indicator for Tajik layouts -->
        <shortDescription>tg</shortDescription>
        <description>Tajik</description>
        <countryList>
          <iso3166Id>TJ</iso3166Id>
        </countryList>
        <languageList>
          <iso639Id>tgk</iso639Id>
        </languageList>
      </configItem>
      <variantList>
        <variant>
          <configItem>
            <name>legacy</name>
            <description>Tajik (legacy)</description>
          </configItem>
        </variant>
      </variantList>
    </layout>
    <layout>
      <configItem>
        <name>lk</name>
        <!-- Keyboard indicator for Sinhala layouts -->
        <shortDescription>si</shortDescription>
        <description>Sinhala (phonetic)</description>
        <countryList>
          <iso3166Id>LK</iso3166Id>
        </countryList>
        <languageList>
          <iso639Id>sin</iso639Id>
        </languageList>
      </configItem>
      <variantList>
        <variant>
          <configItem>
            <name>tam_unicode</name>
            <!-- Keyboard indicator for Tamil layouts -->
            <shortDescription>ta</shortDescription>
            <description>Tamil (Sri Lanka, TamilNet '99)</description>
            <languageList>
              <iso639Id>tam</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>tam_TAB</name>
            <description>Tamil (Sri Lanka, TamilNet '99, TAB encoding)</description>
            <languageList>
              <iso639Id>tam</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>us</name>
            <!-- Keyboard indicator for US layouts -->
            <shortDescription>us</shortDescription>
            <description>Sinhala (US)</description>
          </configItem>
        </variant>
      </variantList>
    </layout>
    <layout>
      <configItem>
        <name>th</name>
        <!-- Keyboard indicator for Thai layouts -->
        <shortDescription>th</shortDescription>
        <description>Thai</description>
        <countryList>
          <iso3166Id>TH</iso3166Id>
        </countryList>
        <languageList>
          <iso639Id>tha</iso639Id>
        </languageList>
      </configItem>
      <variantList>
        <variant>
          <configItem>
            <name>tis</name>
            <description>Thai (TIS-820.2538)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>pat</name>
            <description>Thai (Pattachote)</description>
          </configItem>
        </variant>
      </variantList>
    </layout>
    <layout>
      <configItem>
        <name>tr</name>
        <!-- Keyboard indicator for Turkish layouts -->
        <shortDescription>tr</shortDescription>
        <description>Turkish</description>
        <countryList>
          <iso3166Id>TR</iso3166Id>
        </countryList>
        <languageList>
          <iso639Id>tur</iso639Id>
        </languageList>
      </configItem>
      <variantList>
        <variant>
          <configItem>
            <name>f</name>
            <description>Turkish (F)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>alt</name>
            <description>Turkish (Alt-Q)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>ku</name>
            <!-- Keyboard indicator for Kurdish layouts -->
            <shortDescription>ku</shortDescription>
            <description>Kurdish (Turkey, Latin Q)</description>
            <languageList>
              <iso639Id>kur</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>ku_f</name>
            <!-- Keyboard indicator for Kurdish layouts -->
            <shortDescription>ku</shortDescription>
            <description>Kurdish (Turkey, F)</description>
            <languageList>
              <iso639Id>kur</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>ku_alt</name>
            <!-- Keyboard indicator for Kurdish layouts -->
            <shortDescription>ku</shortDescription>
            <description>Kurdish (Turkey, Latin Alt-Q)</description>
            <languageList>
              <iso639Id>kur</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>intl</name>
            <description>Turkish (intl., with dead keys)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>ot</name>
            <description>Ottoman (Q)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>otf</name>
            <description>Ottoman (F)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>otk</name>
            <description>Old Turkic</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>otkf</name>
            <description>Old Turkic (F)</description>
          </configItem>
        </variant>
      </variantList>
    </layout>
    <layout>
      <configItem>
        <name>tw</name>
        <!-- Keyboard indicator for Taiwanese layouts -->
        <shortDescription>zh</shortDescription>
        <description>Taiwanese</description>
        <countryList>
          <iso3166Id>TW</iso3166Id>
        </countryList>
        <languageList>
          <iso639Id>fox</iso639Id>
        </languageList>
      </configItem>
      <variantList>
        <variant>
          <configItem>
            <name>indigenous</name>
            <description>Taiwanese (indigenous)</description>
            <languageList>
              <iso639Id>ami</iso639Id>
              <iso639Id>tay</iso639Id>
              <iso639Id>bnn</iso639Id>
              <iso639Id>ckv</iso639Id>
              <iso639Id>pwn</iso639Id>
              <iso639Id>pyu</iso639Id>
              <iso639Id>dru</iso639Id>
              <iso639Id>ais</iso639Id>
              <iso639Id>ssf</iso639Id>
              <iso639Id>tao</iso639Id>
              <iso639Id>tsu</iso639Id>
              <iso639Id>trv</iso639Id>
              <iso639Id>xnb</iso639Id>
              <iso639Id>sxr</iso639Id>
              <iso639Id>uun</iso639Id>
              <iso639Id>fos</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>saisiyat</name>
            <!-- Keyboard indicator for Saisiyat layouts -->
            <shortDescription>xsy</shortDescription>
            <description>Saisiyat (Taiwan)</description>
            <languageList>
              <iso639Id>xsy</iso639Id>
            </languageList>
          </configItem>
        </variant>
      </variantList>
    </layout>
    <layout>
      <configItem>
        <name>ua</name>
        <!-- Keyboard indicator for Ukranian layouts -->
        <shortDescription>uk</shortDescription>
        <description>Ukrainian</description>
        <countryList>
          <iso3166Id>UA</iso3166Id>
        </countryList>
        <languageList>
          <iso639Id>ukr</iso639Id>
        </languageList>
      </configItem>
      <variantList>
        <variant>
          <configItem>
            <name>phonetic</name>
            <description>Ukrainian (phonetic)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>typewriter</name>
            <description>Ukrainian (typewriter)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>winkeys</name>
            <description>Ukrainian (Windows)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>macOS</name>
            <description>Ukrainian (macOS)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>legacy</name>
            <description>Ukrainian (legacy)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>rstu</name>
            <description>Ukrainian (standard RSTU)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>rstu_ru</name>
            <description>Russian (Ukraine, standard RSTU)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>homophonic</name>
            <description>Ukrainian (homophonic)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>crh</name>
            <!-- Keyboard indicator for Crimean Tatar layouts -->
            <shortDescription>crh</shortDescription>
            <description>Crimean Tatar (Turkish Q)</description>
            <languageList>
              <iso639Id>crh</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>crh_f</name>
            <!-- Keyboard indicator for Crimean Tatar layouts -->
            <shortDescription>crh</shortDescription>
            <description>Crimean Tatar (Turkish F)</description>
            <languageList>
              <iso639Id>crh</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>crh_alt</name>
            <!-- Keyboard indicator for Crimean Tatar layouts -->
            <shortDescription>crh</shortDescription>
            <description>Crimean Tatar (Turkish Alt-Q)</description>
            <languageList>
              <iso639Id>crh</iso639Id>
            </languageList>
          </configItem>
        </variant>
      </variantList>
    </layout>
    <layout>
      <configItem>
        <name>gb</name>
        <!-- Keyboard indicator for English layouts -->
        <shortDescription>en</shortDescription>
        <description>English (UK)</description>
        <countryList>
          <iso3166Id>GB</iso3166Id>
        </countryList>
        <languageList>
          <iso639Id>eng</iso639Id>
        </languageList>
      </configItem>
      <variantList>
        <variant>
          <configItem>
            <name>extd</name>
            <description>English (UK, extended, Windows)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>intl</name>
            <description>English (UK, intl., with dead keys)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>dvorak</name>
            <description>English (UK, Dvorak)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>dvorakukp</name>
            <description>English (UK, Dvorak, with UK punctuation)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>mac</name>
            <description>English (UK, Macintosh)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>mac_intl</name>
            <description>English (UK, Macintosh, intl.)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>colemak</name>
            <description>English (UK, Colemak)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>colemak_dh</name>
            <description>English (UK, Colemak-DH)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>pl</name>
            <!-- Keyboard indicator for Polish layouts -->
            <shortDescription>pl</shortDescription>
            <description>Polish (British keyboard)</description>
            <languageList>
              <iso639Id>pol</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>gla</name>
            <shortDescription>gd</shortDescription>
            <description>Scottish Gaelic</description>
            <countryList>
              <iso3166Id>GB</iso3166Id>
              <iso3166Id>CA</iso3166Id>
            </countryList>
            <languageList>
              <iso639Id>eng</iso639Id>
              <iso639Id>gla</iso639Id>
            </languageList>
          </configItem>
        </variant>
      </variantList>
    </layout>
    <layout>
      <configItem>
        <name>uz</name>
        <!-- Keyboard indicator for Uzbek layouts -->
        <shortDescription>uz</shortDescription>
        <description>Uzbek</description>
        <countryList>
          <iso3166Id>UZ</iso3166Id>
        </countryList>
        <languageList>
          <iso639Id>uzb</iso639Id>
        </languageList>
      </configItem>
      <variantList>
        <variant>
          <configItem>
            <name>latin</name>
            <description>Uzbek (Latin)</description>
          </configItem>
        </variant>
      </variantList>
    </layout>
    <layout>
      <configItem>
        <name>vn</name>
        <!-- Keyboard indicator for Vietnamese layouts -->
        <shortDescription>vi</shortDescription>
        <description>Vietnamese</description>
        <countryList>
          <iso3166Id>VN</iso3166Id>
        </countryList>
        <languageList>
          <iso639Id>vie</iso639Id>
        </languageList>
      </configItem>
      <variantList>
        <variant>
          <configItem>
            <name>us</name>
            <description>Vietnamese (US)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>fr</name>
            <description>Vietnamese (French)</description>
          </configItem>
        </variant>
      </variantList>
    </layout>
    <layout>
      <configItem>
        <name>kr</name>
        <!-- Keyboard indicator for Korean layouts -->
        <shortDescription>ko</shortDescription>
        <description>Korean</description>
        <countryList>
          <iso3166Id>KR</iso3166Id>
        </countryList>
        <languageList>
          <iso639Id>kor</iso639Id>
        </languageList>
      </configItem>
      <variantList>
        <variant>
          <configItem>
            <name>kr104</name>
            <description>Korean (101/104-key compatible)</description>
          </configItem>
        </variant>
      </variantList>
    </layout>
    <layout>
      <configItem>
        <name>ie</name>
        <!-- Keyboard indicator for Irish layouts -->
        <shortDescription>ie</shortDescription>
        <description>Irish</description>
        <countryList>
          <iso3166Id>IE</iso3166Id>
        </countryList>
        <languageList>
          <iso639Id>eng</iso639Id>
        </languageList>
      </configItem>
      <variantList>
        <variant>
          <configItem>
            <name>CloGaelach</name>
            <description>CloGaelach</description>
            <languageList>
              <iso639Id>gle</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>UnicodeExpert</name>
            <description>Irish (UnicodeExpert)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>ogam</name>
            <description>Ogham</description>
            <languageList>
              <iso639Id>sga</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>ogam_is434</name>
            <description>Ogham (IS434)</description>
            <languageList>
              <iso639Id>sga</iso639Id>
            </languageList>
          </configItem>
        </variant>
      </variantList>
    </layout>
    <layout>
      <configItem>
        <name>pk</name>
        <!-- Keyboard indicator for Urdu layouts -->
        <shortDescription>ur</shortDescription>
        <description>Urdu (Pakistan)</description>
        <countryList>
          <iso3166Id>PK</iso3166Id>
        </countryList>
        <languageList>
          <iso639Id>urd</iso639Id>
        </languageList>
      </configItem>
      <variantList>
        <variant>
          <configItem>
            <name>urd-crulp</name>
            <description>Urdu (Pakistan, CRULP)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>urd-nla</name>
            <description>Urdu (Pakistan, NLA)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>ara</name>
            <shortDescription>ar</shortDescription>
            <description>Arabic (Pakistan)</description>
            <languageList>
              <iso639Id>ara</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>snd</name>
            <!-- Keyboard indicator for Sindhi layouts -->
            <shortDescription>sd</shortDescription>
            <description>Sindhi</description>
            <languageList>
              <iso639Id>snd</iso639Id>
            </languageList>
          </configItem>
        </variant>
      </variantList>
    </layout>
    <layout>
      <configItem>
        <name>mv</name>
        <!-- Keyboard indicator for Dhivehi layouts -->
        <shortDescription>dv</shortDescription>
        <description>Dhivehi</description>
        <countryList>
          <iso3166Id>MV</iso3166Id>
        </countryList>
        <languageList>
          <iso639Id>div</iso639Id>
        </languageList>
      </configItem>
      <variantList/>
    </layout>
    <layout>
      <configItem>
        <name>za</name>
        <!-- Keyboard indicator for English layouts -->
        <shortDescription>en</shortDescription>
        <description>English (South Africa)</description>
        <countryList>
          <iso3166Id>ZA</iso3166Id>
        </countryList>
        <languageList>
          <iso639Id>eng</iso639Id>
        </languageList>
      </configItem>
    </layout>
    <layout>
      <configItem>
        <name>epo</name>
        <!-- Keyboard indicator for Esperanto layouts -->
        <shortDescription>eo</shortDescription>
        <description>Esperanto</description>
        <languageList>
          <iso639Id>epo</iso639Id>
        </languageList>
      </configItem>
      <variantList>
        <variant>
          <configItem>
            <name>legacy</name>
            <description>Esperanto (legacy)</description>
          </configItem>
        </variant>
      </variantList>
    </layout>
    <layout>
      <configItem>
        <name>np</name>
        <!-- Keyboard indicator for Nepali layouts -->
        <shortDescription>ne</shortDescription>
        <description>Nepali</description>
        <countryList>
          <iso3166Id>NP</iso3166Id>
        </countryList>
        <languageList>
          <iso639Id>nep</iso639Id>
          <!-- sat-Deva used in Nepal: http://www.ethnologue.com/language/sat -->
          <iso639Id>sat</iso639Id>
        </languageList>
      </configItem>
    </layout>
    <layout>
      <configItem>
        <name>ng</name>
        <!-- Keyboard indicator for English layouts -->
        <shortDescription>en</shortDescription>
        <description>English (Nigeria)</description>
        <countryList>
          <iso3166Id>NG</iso3166Id>
        </countryList>
        <languageList>
          <iso639Id>eng</iso639Id>
        </languageList>
      </configItem>
      <variantList>
        <variant>
          <configItem>
            <name>igbo</name>
            <!-- Keyboard indicator for Igbo layouts -->
            <shortDescription>ig</shortDescription>
            <description>Igbo</description>
            <languageList>
              <iso639Id>ibo</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>yoruba</name>
            <!-- Keyboard indicator for Yoruba layouts -->
            <shortDescription>yo</shortDescription>
            <description>Yoruba</description>
            <languageList>
              <iso639Id>yor</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>hausa</name>
            <!-- Keyboard indicator for Hausa layouts -->
            <shortDescription>ha</shortDescription>
            <description>Hausa (Nigeria)</description>
            <languageList>
              <iso639Id>hau</iso639Id>
            </languageList>
          </configItem>
        </variant>
      </variantList>
    </layout>
    <layout>
      <configItem>
        <name>et</name>
        <!-- Keyboard indicator for Amharic layouts -->
        <shortDescription>am</shortDescription>
        <description>Amharic</description>
        <countryList>
          <iso3166Id>ET</iso3166Id>
        </countryList>
        <languageList>
          <iso639Id>amh</iso639Id>
        </languageList>
      </configItem>
      <variantList/>
    </layout>
    <layout>
      <configItem>
        <name>sn</name>
        <!-- Keyboard indicator for Wolof layouts -->
        <shortDescription>wo</shortDescription>
        <description>Wolof</description>
        <countryList>
          <iso3166Id>SN</iso3166Id>
        </countryList>
        <languageList>
          <iso639Id>wol</iso639Id>
        </languageList>
      </configItem>
      <variantList/>
    </layout>
    <layout>
      <configItem>
        <name>brai</name>
        <!-- Keyboard indicator for Braille layouts -->
        <shortDescription>brl</shortDescription>
        <description>Braille</description>
      </configItem>
      <variantList>
        <variant>
          <configItem>
            <name>left_hand</name>
            <description>Braille (left-handed)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>left_hand_invert</name>
            <description>Braille (left-handed inverted thumb)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>right_hand</name>
            <description>Braille (right-handed)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>right_hand_invert</name>
            <description>Braille (right-handed inverted thumb)</description>
          </configItem>
        </variant>
      </variantList>
    </layout>
    <layout>
      <configItem>
        <name>tm</name>
        <!-- Keyboard indicator for Turkmen layouts -->
        <shortDescription>tk</shortDescription>
        <description>Turkmen</description>
        <countryList>
          <iso3166Id>TM</iso3166Id>
        </countryList>
        <languageList>
          <iso639Id>tuk</iso639Id>
        </languageList>
      </configItem>
      <variantList>
        <variant>
          <configItem>
            <name>alt</name>
            <description>Turkmen (Alt-Q)</description>
          </configItem>
        </variant>
      </variantList>
    </layout>
    <layout>
      <configItem>
        <name>ml</name>
        <!-- Keyboard indicator for Bambara layouts -->
        <shortDescription>bm</shortDescription>
        <description>Bambara</description>
        <countryList>
          <iso3166Id>ML</iso3166Id>
        </countryList>
        <languageList>
          <iso639Id>bam</iso639Id>
        </languageList>
      </configItem>
      <variantList>
        <variant>
          <configItem>
            <name>fr-oss</name>
            <!-- Keyboard indicator for French layouts -->
            <shortDescription>fr</shortDescription>
            <description>French (Mali, alt.)</description>
            <languageList>
              <iso639Id>fra</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>us-mac</name>
            <!-- Keyboard indicator for English layouts -->
            <shortDescription>en</shortDescription>
            <description>English (Mali, US, Macintosh)</description>
            <languageList>
              <iso639Id>eng</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>us-intl</name>
            <!-- Keyboard indicator for English layouts -->
            <shortDescription>en</shortDescription>
            <description>English (Mali, US, intl.)</description>
            <languageList>
              <iso639Id>eng</iso639Id>
            </languageList>
          </configItem>
        </variant>
      </variantList>
    </layout>
    <layout>
      <configItem>
        <name>tz</name>
        <!-- Keyboard indicator for Swahili layouts -->
        <shortDescription>sw</shortDescription>
        <description>Swahili (Tanzania)</description>
        <countryList>
          <iso3166Id>TZ</iso3166Id>
        </countryList>
        <languageList>
          <iso639Id>swa</iso639Id>
        </languageList>
      </configItem>
    </layout>
    <layout>
      <configItem>
        <name>tg</name>
        <shortDescription>fr-tg</shortDescription>
        <description>French (Togo)</description>
        <countryList>
          <iso3166Id>TG</iso3166Id>
        </countryList>
        <languageList>
          <iso639Id>fra</iso639Id>
          <iso639Id>ajg</iso639Id>
          <iso639Id>blo</iso639Id>
          <iso639Id>kpo</iso639Id>
          <iso639Id>ewe</iso639Id>
          <iso639Id>fon</iso639Id>
          <iso639Id>fue</iso639Id>
          <iso639Id>gej</iso639Id>
          <iso639Id>ife</iso639Id>
          <iso639Id>kbp</iso639Id>
          <iso639Id>las</iso639Id>
          <iso639Id>dop</iso639Id>
          <iso639Id>mfg</iso639Id>
          <iso639Id>nmz</iso639Id>
          <iso639Id>bud</iso639Id>
          <iso639Id>gng</iso639Id>
          <iso639Id>kdh</iso639Id>
          <iso639Id>soy</iso639Id>
        </languageList>
      </configItem>
    </layout>
    <layout>
      <configItem>
        <name>ke</name>
        <!-- Keyboard indicator for Swahili layouts -->
        <shortDescription>sw</shortDescription>
        <description>Swahili (Kenya)</description>
        <countryList>
          <iso3166Id>KE</iso3166Id>
        </countryList>
        <languageList>
          <iso639Id>swa</iso639Id>
        </languageList>
      </configItem>
      <variantList>
        <variant>
          <configItem>
            <name>kik</name>
            <!-- Keyboard indicator for Kikuyu layouts -->
            <shortDescription>ki</shortDescription>
            <description>Kikuyu</description>
            <languageList>
              <iso639Id>kik</iso639Id>
            </languageList>
          </configItem>
        </variant>
      </variantList>
    </layout>
    <layout>
      <configItem>
        <name>bw</name>
        <!-- Keyboard indicator for Tswana layouts -->
        <shortDescription>tn</shortDescription>
        <description>Tswana</description>
        <countryList>
          <iso3166Id>BW</iso3166Id>
        </countryList>
        <languageList>
          <iso639Id>tsn</iso639Id>
        </languageList>
      </configItem>
    </layout>
    <layout>
      <configItem>
        <name>ph</name>
        <!-- Keyboard indicator for Filipino layouts -->
        <shortDescription>ph</shortDescription>
        <description>Filipino</description>
        <countryList>
          <iso3166Id>PH</iso3166Id>
        </countryList>
        <languageList>
          <iso639Id>eng</iso639Id>
          <iso639Id>bik</iso639Id>
          <iso639Id>ceb</iso639Id>
          <iso639Id>fil</iso639Id>
          <iso639Id>hil</iso639Id>
          <iso639Id>ilo</iso639Id>
          <iso639Id>pam</iso639Id>
          <iso639Id>pag</iso639Id>
          <iso639Id>phi</iso639Id>
          <iso639Id>tgl</iso639Id>
          <iso639Id>war</iso639Id>
        </languageList>
      </configItem>
      <variantList>
        <variant>
          <configItem>
            <name>qwerty-bay</name>
            <description>Filipino (QWERTY, Baybayin)</description>
            <languageList>
              <iso639Id>bik</iso639Id>
              <iso639Id>ceb</iso639Id>
              <iso639Id>fil</iso639Id>
              <iso639Id>hil</iso639Id>
              <iso639Id>ilo</iso639Id>
              <iso639Id>pam</iso639Id>
              <iso639Id>pag</iso639Id>
              <iso639Id>phi</iso639Id>
              <iso639Id>tgl</iso639Id>
              <iso639Id>war</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>capewell-dvorak</name>
            <description>Filipino (Capewell-Dvorak, Latin)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>capewell-dvorak-bay</name>
            <description>Filipino (Capewell-Dvorak, Baybayin)</description>
            <languageList>
              <iso639Id>bik</iso639Id>
              <iso639Id>ceb</iso639Id>
              <iso639Id>fil</iso639Id>
              <iso639Id>hil</iso639Id>
              <iso639Id>ilo</iso639Id>
              <iso639Id>pam</iso639Id>
              <iso639Id>pag</iso639Id>
              <iso639Id>phi</iso639Id>
              <iso639Id>tgl</iso639Id>
              <iso639Id>war</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>capewell-qwerf2k6</name>
            <description>Filipino (Capewell-QWERF 2006, Latin)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>capewell-qwerf2k6-bay</name>
            <description>Filipino (Capewell-QWERF 2006, Baybayin)</description>
            <languageList>
              <iso639Id>bik</iso639Id>
              <iso639Id>ceb</iso639Id>
              <iso639Id>fil</iso639Id>
              <iso639Id>hil</iso639Id>
              <iso639Id>ilo</iso639Id>
              <iso639Id>pam</iso639Id>
              <iso639Id>pag</iso639Id>
              <iso639Id>phi</iso639Id>
              <iso639Id>tgl</iso639Id>
              <iso639Id>war</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>colemak</name>
            <description>Filipino (Colemak, Latin)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>colemak-bay</name>
            <description>Filipino (Colemak, Baybayin)</description>
            <languageList>
              <iso639Id>bik</iso639Id>
              <iso639Id>ceb</iso639Id>
              <iso639Id>fil</iso639Id>
              <iso639Id>hil</iso639Id>
              <iso639Id>ilo</iso639Id>
              <iso639Id>pam</iso639Id>
              <iso639Id>pag</iso639Id>
              <iso639Id>phi</iso639Id>
              <iso639Id>tgl</iso639Id>
              <iso639Id>war</iso639Id>
            </languageList>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>dvorak</name>
            <description>Filipino (Dvorak, Latin)</description>
          </configItem>
        </variant>
        <variant>
          <configItem>
            <name>dvorak-bay</name>
            <description>Filipino (Dvorak, Baybayin)</description>
            <languageList>
              <iso639Id>bik</iso639Id>
              <iso639Id>ceb</iso639Id>
              <iso639Id>fil</iso639Id>
              <iso639Id>hil</iso639Id>
              <iso639Id>ilo</iso639Id>
              <iso639Id>pam</iso639Id>
              <iso639Id>pag</iso639Id>
              <iso639Id>phi</iso639Id>
              <iso639Id>tgl</iso639Id>
              <iso639Id>war</iso639Id>
            </languageList>
          </configItem>
        </variant>
      </variantList>
    </layout>
    <layout>
      <configItem>
        <name>md</name>
        <shortDescription>md</shortDescription>
        <description>Moldavian</description>
        <countryList>
          <iso3166Id>MD</iso3166Id>
        </countryList>
        <languageList>
          <iso639Id>ron</iso639Id>
        </languageList>
      </configItem>
      <variantList>
        <variant>
          <configItem>
            <name>gag</name>
            <shortDescription>gag</shortDescription>
            <description>Moldavian (Gagauz)</description>
            <languageList>
              <iso639Id>gag</iso639Id>
            </languageList>
          </configItem>
        </variant>
      </variantList>
    </layout>
    <layout>
      <configItem>
        <name>id</name>
        <shortDescription>id</shortDescription>
        <description>Indonesian (Latin)</description>
        <countryList>
          <iso3166Id>ID</iso3166Id>
        </countryList>
        <languageList>
          <iso639Id>ind</iso639Id>
          <iso639Id>msa</iso639Id>
          <iso639Id>min</iso639Id>
          <iso639Id>ace</iso639Id>
          <iso639Id>bjn</iso639Id>
          <iso639Id>tsg</iso639Id>
          <iso639Id>mfa</iso639Id>
        </languageList>
      </configItem>
      <variantList>
       <variant>
         <configItem>
          <name>phonetic</name>
            <description>Indonesian (Arab Pegon, phonetic)</description>
         </configItem>
       </variant>
       <variant>
         <configItem>
          <name>phoneticx</name>
            <description>Indonesian (Arab Pegon, extended phonetic)</description>
         </configItem>
       </variant>
      </variantList>
    </layout>
    <layout>
      <configItem>
        <name>jv</name>
        <shortDescription>jv</shortDescription>
        <description>Indonesian (Javanese)</description>
        <countryList>
          <iso3166Id>ID</iso3166Id>
        </countryList>
        <languageList>
          <iso639Id>jav</iso639Id>
        </languageList>
      </configItem>
      <variantList/>
    </layout>
    <layout>
      <configItem>
        <name>my</name>
        <shortDescription>ms</shortDescription>
        <description>Malay (Jawi, Arabic Keyboard)</description>
        <countryList>
          <iso3166Id>MY</iso3166Id>
        </countryList>
        <languageList>
          <iso639Id>ind</iso639Id>
          <iso639Id>msa</iso639Id>
          <iso639Id>min</iso639Id>
          <iso639Id>ace</iso639Id>
          <iso639Id>bjn</iso639Id>
          <iso639Id>tsg</iso639Id>
          <iso639Id>mfa</iso639Id>
        </languageList>
      </configItem>
      <variantList>
       <variant>
         <configItem>
          <name>phonetic</name>
            <description>Malay (Jawi, phonetic)</description>
         </configItem>
       </variant>
      </variantList>
    </layout>
    <layout>
      <configItem>
	<name>custom</name>
        <shortDescription>custom</shortDescription>
        <description>A user-defined custom Layout</description>
      </configItem>
      <variantList/>
    </layout>
  </layoutList>
  <optionList>
    <group allowMultipleSelection="true">
      <!-- The key combination used to switch between groups -->
      <configItem>
        <name>grp</name>
        <description>Switching to another layout</description>
      </configItem>
      <option>
        <configItem>
          <name>grp:switch</name>
          <description>Right Alt (while pressed)</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>grp:lswitch</name>
          <description>Left Alt (while pressed)</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>grp:lwin_switch</name>
          <description>Left Win (while pressed)</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>grp:rwin_switch</name>
          <description>Right Win (while pressed)</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>grp:win_switch</name>
          <description>Any Win (while pressed)</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>grp:menu_switch</name>
          <description>Menu (while pressed), Shift+Menu for Menu</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>grp:caps_switch</name>
          <description>Caps Lock (while pressed), Alt+Caps Lock for the original Caps Lock action</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>grp:rctrl_switch</name>
          <description>Right Ctrl (while pressed)</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>grp:toggle</name>
          <description>Right Alt</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>grp:lalt_toggle</name>
          <description>Left Alt</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>grp:caps_toggle</name>
          <description>Caps Lock</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>grp:shift_caps_toggle</name>
          <description>Shift+Caps Lock</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>grp:shift_caps_switch</name>
          <description>Caps Lock to first layout; Shift+Caps Lock to last layout</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>grp:win_menu_switch</name>
          <description>Left Win to first layout; Right Win/Menu to last layout</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>grp:lctrl_rctrl_switch</name>
          <description>Left Ctrl to first layout; Right Ctrl to last layout</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>grp:alt_caps_toggle</name>
          <description>Alt+Caps Lock</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>grp:shifts_toggle</name>
          <description>Both Shift together</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>grp:alts_toggle</name>
          <description>Both Alt together</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>grp:ctrls_toggle</name>
          <description>Both Ctrl together</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>grp:ctrl_shift_toggle</name>
          <description>Ctrl+Shift</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>grp:lctrl_lshift_toggle</name>
          <description>Left Ctrl+Left Shift</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>grp:rctrl_rshift_toggle</name>
          <description>Right Ctrl+Right Shift</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>grp:ctrl_alt_toggle</name>
          <description>Alt+Ctrl</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>grp:alt_shift_toggle</name>
          <description>Alt+Shift</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>grp:lalt_lshift_toggle</name>
          <description>Left Alt+Left Shift</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>grp:alt_space_toggle</name>
          <description>Alt+Space</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>grp:menu_toggle</name>
          <description>Menu</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>grp:lwin_toggle</name>
          <description>Left Win</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>grp:win_space_toggle</name>
          <description>Win+Space</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>grp:rwin_toggle</name>
          <description>Right Win</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>grp:lshift_toggle</name>
          <description>Left Shift</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>grp:rshift_toggle</name>
          <description>Right Shift</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>grp:lctrl_toggle</name>
          <description>Left Ctrl</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>grp:rctrl_toggle</name>
          <description>Right Ctrl</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>grp:sclk_toggle</name>
          <description>Scroll Lock</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>grp:lctrl_lwin_rctrl_menu</name>
          <description>Left Ctrl+Left Win to first layout; Right Ctrl+Menu to second layout</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>grp:lctrl_lwin_toggle</name>
          <description>Left Ctrl+Left Win</description>
        </configItem>
      </option>
    </group>
    <group allowMultipleSelection="true">
      <!-- The key combination used to choose the 2nd level of symbols -->
      <configItem>
        <name>lv2</name>
        <description>Key to choose the 2nd level</description>
      </configItem>
      <option>
        <configItem>
          <name>lv2:lsgt_switch</name>
          <description>The "&lt; &gt;" key</description>
        </configItem>
      </option>
    </group>
    <group allowMultipleSelection="true">
      <!-- The key combination used to choose the 3rd (and 4th, together with Shift)
           level of symbols -->
      <configItem>
        <name>lv3</name>
        <description>Key to choose the 3rd level</description>
      </configItem>
      <option>
        <configItem>
          <name>lv3:switch</name>
          <description>Right Ctrl</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>lv3:menu_switch</name>
          <description>Menu</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>lv3:win_switch</name>
          <description>Any Win</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>lv3:lwin_switch</name>
          <description>Left Win</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>lv3:rwin_switch</name>
          <description>Right Win</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>lv3:alt_switch</name>
          <description>Any Alt</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>lv3:lalt_switch</name>
          <description>Left Alt</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>lv3:ralt_switch</name>
          <description>Right Alt</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>lv3:ralt_switch_multikey</name>
          <description>Right Alt; Shift+Right Alt as Compose</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>lv3:ralt_alt</name>
          <description>Right Alt never chooses 3rd level</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>lv3:enter_switch</name>
          <description>Enter on keypad</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>lv3:caps_switch</name>
          <description>Caps Lock</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>lv3:bksl_switch</name>
          <description>Backslash</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>lv3:lsgt_switch</name>
          <description>The "&lt; &gt;" key</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>lv3:caps_switch_latch</name>
          <description>Caps Lock; acts as onetime lock when pressed together with another 3rd-level chooser</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>lv3:bksl_switch_latch</name>
          <description>Backslash; acts as onetime lock when pressed together with another 3rd level chooser</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>lv3:lsgt_switch_latch</name>
          <description>The "&lt; &gt;" key; acts as onetime lock when pressed together with another 3rd level chooser</description>
        </configItem>
      </option>
    </group>
    <group allowMultipleSelection="true">
      <!-- Tweaking the position of the "Ctrl" key -->
      <configItem>
        <name>ctrl</name>
        <description>Ctrl position</description>
      </configItem>
      <option>
        <configItem>
          <name>ctrl:nocaps</name>
          <description>Caps Lock as Ctrl</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>ctrl:lctrl_meta</name>
          <description>Left Ctrl as Meta</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>ctrl:swapcaps</name>
          <description>Swap Ctrl and Caps Lock</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>ctrl:swapcaps_hyper</name>
          <description>Caps Lock as Ctrl, Ctrl as Hyper</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>ctrl:ac_ctrl</name>
          <description>To the left of "A"</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>ctrl:aa_ctrl</name>
          <description>At the bottom left</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>ctrl:rctrl_ralt</name>
          <description>Right Ctrl as Right Alt</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>ctrl:menu_rctrl</name>
          <description>Menu as Right Ctrl</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>ctrl:swap_lalt_lctl</name>
          <description>Swap Left Alt with Left Ctrl</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>ctrl:swap_lwin_lctl</name>
          <description>Swap Left Win with Left Ctrl</description>
        </configItem>
      </option><option>
        <configItem>
          <name>ctrl:swap_rwin_rctl</name>
          <description>Swap Right Win with Right Ctrl</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>ctrl:swap_lalt_lctl_lwin</name>
          <description>Left Alt as Ctrl, Left Ctrl as Win, Left Win as Left Alt</description>
        </configItem>
      </option>
    </group>
    <group allowMultipleSelection="true">
      <!-- Using startard LEDs to indicate the alternative (not first) group(s) -->
      <configItem>
        <name>grp_led</name>
        <description>Use keyboard LED to show alternative layout</description>
      </configItem>
      <option>
        <configItem>
          <name>grp_led:num</name>
          <description>Num Lock</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>grp_led:caps</name>
          <description>Caps Lock</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>grp_led:scroll</name>
          <description>Scroll Lock</description>
        </configItem>
      </option>
    </group>
    <group allowMultipleSelection="true">
      <!-- Using LEDs to indicate modifiers -->
      <configItem>
        <name>mod_led</name>
        <description>Use keyboard LED to indicate modifiers</description>
      </configItem>
      <option>
        <configItem>
          <name>mod_led:compose</name>
          <description>Compose</description>
        </configItem>
      </option>
    </group>
    <group allowMultipleSelection="false">
      <!-- Select a keypad type -->
      <configItem>
        <name>keypad</name>
        <description>Layout of numeric keypad</description>
      </configItem>
      <option>
        <configItem>
          <name>keypad:legacy</name>
          <description>Legacy</description>
       </configItem>
      </option>
      <option>
        <configItem>
          <name>keypad:oss</name>
          <description>Unicode arrows and math operators</description>
       </configItem>
      </option>
      <option>
        <configItem>
          <name>keypad:future</name>
          <description>Unicode arrows and math operators on default level</description>
       </configItem>
      </option>
      <option>
        <configItem>
          <name>keypad:legacy_wang</name>
          <description>Legacy Wang 724</description>
       </configItem>
      </option>
      <option>
        <configItem>
          <name>keypad:oss_wang</name>
          <description>Wang 724 keypad with Unicode arrows and math operators</description>
       </configItem>
      </option>
      <option>
        <configItem>
          <name>keypad:future_wang</name>
          <description>Wang 724 keypad with Unicode arrows and math operators on default level</description>
       </configItem>
      </option>
      <option>
        <configItem>
          <name>keypad:hex</name>
          <description>Hexadecimal</description>
       </configItem>
      </option>
      <option>
        <configItem>
          <name>keypad:atm</name>
          <description>Phone and ATM style</description>
       </configItem>
      </option>
    </group>
    <!-- This option should override the KPDL key defined in keypad; I hope it's declared in the right place -->
    <group allowMultipleSelection="false">
      <!-- Select a keypad KPDL variant -->
      <configItem>
        <name>kpdl</name>
        <description>Numeric keypad Delete behavior</description>
      </configItem>
      <option>
        <configItem>
          <!-- Actually, with KP_DECIMAL, as the old keypad(dot) -->
          <name>kpdl:dot</name>
          <description>Legacy key with dot</description>
       </configItem>
      </option>
      <option>
        <configItem>
          <name>kpdl:comma</name>
          <!-- Actually, with KP_SEPARATOR, as the old keypad(comma) -->
          <description>Legacy key with comma</description>
       </configItem>
      </option>
      <option>
        <configItem>
          <name>kpdl:dotoss</name>
          <description>Four-level key with dot</description>
       </configItem>
      </option>
      <option>
        <configItem>
          <name>kpdl:dotoss_latin9</name>
          <description>Four-level key with dot, Latin-9 only</description>
       </configItem>
      </option>
      <option>
        <configItem>
          <name>kpdl:commaoss</name>
          <description>Four-level key with comma</description>
       </configItem>
      </option>
      <option>
        <configItem>
          <name>kpdl:momayyezoss</name>
          <description>Four-level key with momayyez</description>
       </configItem>
      </option>
      <option>
        <configItem>
          <name>kpdl:kposs</name>
          <!-- This assumes the KP_ abstract symbols are actually useful for some apps
               The description needs to be rewritten -->
          <description>Four-level key with abstract separators</description>
       </configItem>
      </option>
      <option>
        <configItem>
          <name>kpdl:semi</name>
          <description>Semicolon on third level</description>
       </configItem>
      </option>
    </group>
    <group allowMultipleSelection="false">
      <!-- Caps Lock tweaks.
           "Internal" capitalization means capitalization using some internal tables.
           Otherwise "as Shift" - means using next group. -->
      <configItem>
        <name>caps</name>
        <description>Caps Lock behavior</description>
      </configItem>
      <option>
        <configItem>
          <name>caps:internal</name>
          <description>Caps Lock uses internal capitalization; Shift "pauses" Caps Lock</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>caps:internal_nocancel</name>
          <description>Caps Lock uses internal capitalization; Shift does not affect Caps Lock</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>caps:shift</name>
          <description>Caps Lock acts as Shift with locking; Shift "pauses" Caps Lock</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>caps:shift_nocancel</name>
          <description>Caps Lock acts as Shift with locking; Shift does not affect Caps Lock</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>caps:capslock</name>
          <description>Caps Lock toggles normal capitalization of alphabetic characters</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>caps:shiftlock</name>
          <description>Caps Lock toggles Shift Lock (affects all keys)</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>caps:swapescape</name>
          <description>Swap Esc and Caps Lock</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>caps:escape</name>
          <description>Make Caps Lock an additional Esc</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>caps:escape_shifted_capslock</name>
          <description>Make Caps Lock an additional Esc, but Shift + Caps Lock is the regular Caps Lock</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>caps:backspace</name>
          <description>Make Caps Lock an additional Backspace</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>caps:super</name>
          <description>Make Caps Lock an additional Super</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>caps:hyper</name>
          <description>Make Caps Lock an additional Hyper</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>caps:menu</name>
          <description>Make Caps Lock an additional Menu key</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>caps:numlock</name>
          <description>Make Caps Lock an additional Num Lock</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>caps:ctrl_modifier</name>
          <description>Make Caps Lock an additional Ctrl</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>caps:none</name>
          <description>Caps Lock is disabled</description>
        </configItem>
      </option>
    </group>
    <group allowMultipleSelection="false">
      <!-- Using special PC keys (Win, Menu) to work as standard X keys (Super, Hyper, etc.) -->
      <configItem>
        <name>altwin</name>
        <description>Alt and Win behavior</description>
      </configItem>
      <option>
        <configItem>
          <name>altwin:menu</name>
          <description>Add the standard behavior to Menu key</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>altwin:menu_win</name>
          <description>Menu is mapped to Win</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>altwin:meta_alt</name>
          <description>Alt and Meta are on Alt</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>altwin:alt_win</name>
          <description>Alt is mapped to Win and the usual Alt</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>altwin:ctrl_win</name>
          <description>Ctrl is mapped to Win and the usual Ctrl</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>altwin:ctrl_rwin</name>
          <description>Ctrl is mapped to Right Win and the usual Ctrl</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>altwin:ctrl_alt_win</name>
          <description>Ctrl is mapped to Alt, Alt to Win</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>altwin:meta_win</name>
          <description>Meta is mapped to Win</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>altwin:left_meta_win</name>
          <description>Meta is mapped to Left Win</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>altwin:hyper_win</name>
          <description>Hyper is mapped to Win</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>altwin:alt_super_win</name>
          <description>Alt is mapped to Right Win, Super to Menu</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>altwin:swap_lalt_lwin</name>
          <description>Left Alt is swapped with Left Win</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>altwin:swap_alt_win</name>
          <description>Alt is swapped with Win</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>altwin:prtsc_rwin</name>
          <description>Win is mapped to PrtSc and the usual Win</description>
        </configItem>
      </option>
    </group>
    <group allowMultipleSelection="true">
      <!-- Tweaking the position of the "Compose" key: mapping to existing PC keys -->
      <configItem>
        <name>Compose key</name>
        <description>Position of Compose key</description>
      </configItem>
      <option>
        <configItem>
          <name>compose:ralt</name>
          <description>Right Alt</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>compose:lwin</name>
          <description>Left Win</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>compose:lwin-altgr</name>
          <description>3rd level of Left Win</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>compose:rwin</name>
          <description>Right Win</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>compose:rwin-altgr</name>
          <description>3rd level of Right Win</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>compose:menu</name>
          <description>Menu</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>compose:menu-altgr</name>
          <description>3rd level of Menu</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>compose:lctrl</name>
          <description>Left Ctrl</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>compose:lctrl-altgr</name>
          <description>3rd level of Left Ctrl</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>compose:rctrl</name>
          <description>Right Ctrl</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>compose:rctrl-altgr</name>
          <description>3rd level of Right Ctrl</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>compose:caps</name>
          <description>Caps Lock</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>compose:caps-altgr</name>
          <description>3rd level of Caps Lock</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>compose:102</name>
          <description>The "&lt; &gt;" key</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>compose:102-altgr</name>
          <description>3rd level of the "&lt; &gt;" key</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>compose:paus</name>
          <description>Pause</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>compose:prsc</name>
          <description>PrtSc</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>compose:sclk</name>
          <description>Scroll Lock</description>
        </configItem>
      </option>
    </group>
    <group allowMultipleSelection="true">
      <configItem>
        <name>compat</name>
        <description>Compatibility options</description>
      </configItem>
      <option>
        <configItem>
          <name>numpad:pc</name>
          <description>Default numeric keypad keys</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>numpad:mac</name>
          <description>Numeric keypad always enters digits (as in macOS)</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>numpad:microsoft</name>
          <description>Num Lock on: digits; Shift for arrows. Num Lock off: arrows (as in Windows)</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>numpad:shift3</name>
          <description>Shift does not cancel Num Lock, chooses 3rd level instead</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>srvrkeys:none</name>
          <description>Special keys (Ctrl+Alt+&lt;key&gt;) handled in a server</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>apple:alupckeys</name>
          <description>Apple Aluminium emulates Pause, PrtSc, Scroll Lock</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>shift:breaks_caps</name>
          <description>Shift cancels Caps Lock</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>misc:typo</name>
          <description>Enable extra typographic characters</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>misc:apl</name>
          <description>Enable APL overlay characters</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>shift:both_capslock</name>
          <description>Both Shift together enable Caps Lock</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>shift:both_capslock_cancel</name>
          <description>Both Shift together enable Caps Lock; one Shift key disables it</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>shift:both_shiftlock</name>
          <description>Both Shift together enable Shift Lock</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>keypad:pointerkeys</name>
          <description>Shift + Num Lock enables PointerKeys</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>grab:break_actions</name>
          <description>Allow breaking grabs with keyboard actions (warning: security risk)</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>grab:debug</name>
          <description>Allow grab and window tree logging</description>
        </configItem>
      </option>
    </group>
    <group allowMultipleSelection="true">
      <!-- Special shortcuts for the Euro character -->
      <configItem>
        <name>currencysign</name>
        <description>Currency signs</description>
      </configItem>
      <option>
        <configItem>
          <name>eurosign:e</name>
          <description>Euro on E</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>eurosign:2</name>
          <description>Euro on 2</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>eurosign:4</name>
          <description>Euro on 4</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>eurosign:5</name>
          <description>Euro on 5</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>rupeesign:4</name>
          <description>Rupee on 4</description>
        </configItem>
      </option>
    </group>
    <group allowMultipleSelection="true">
      <configItem>
        <name>lv5</name>
        <description>Key to choose 5th level</description>
      </configItem>
      <option>
        <configItem>
          <name>lv5:lsgt_switch</name>
          <description>The "&lt; &gt;" key chooses 5th level</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>lv5:ralt_switch</name>
          <description>Right Alt chooses 5th level</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>lv5:menu_switch</name>
          <description>Menu chooses 5th level</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>lv5:lsgt_switch_lock</name>
          <description>The "&lt; &gt;" key chooses 5th level and acts as a one-time lock if pressed with another 5th level chooser</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>lv5:ralt_switch_lock</name>
          <description>Right Alt chooses 5th level and acts as a one-time lock if pressed with another 5th level chooser</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>lv5:lwin_switch_lock</name>
          <description>Left Win chooses 5th level and acts as a one-time lock if pressed with another 5th level chooser</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>lv5:rwin_switch_lock</name>
          <description>Right Win chooses 5th level and acts as a one-time lock if pressed with another 5th level chooser</description>
        </configItem>
      </option>
<!--
      <option>
        <configItem>
          <name>lv5:lsgt_switch_lock_cancel</name>
          <description>The "&lt; &gt;" key chooses 5th level and acts as a one-time lock if pressed with another 5th level chooser</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>lv5:ralt_switch_lock_cancel</name>
          <description>Right Alt chooses 5th level and acts as a one-time lock if pressed with another 5th level chooser</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>lv5:lwin_switch_lock_cancel</name>
          <description>Left Win chooses 5th level and acts as a one-time lock if pressed with another 5th level chooser</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>lv5:rwin_switch_lock_cancel</name>
          <description>Right Win chooses 5th level and acts as a one-time lock if pressed with another 5th level chooser</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>lv5:lsgt_switch_lock_cancel</name>
          <description>The "&lt; &gt;" key chooses 5th level; acts as onetime lock lock when pressed together with another 5th level chooser</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>lv5:ralt_switch_lock_cancel</name>
          <description>Right Alt chooses 5th level and acts as a one-time lock if pressed with another 5th level chooser</description>
        </configItem>
      </option>
-->
    </group>
    <group allowMultipleSelection="false">
      <!-- Let space output NBSP, NNBSP, ZWNJ, and ZWJ for the desired level -->
      <configItem>
        <name>nbsp</name>
        <description>Non-breaking space input</description>
      </configItem>
      <option>
        <configItem>
          <name>nbsp:none</name>
          <description>Usual space at any level</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>nbsp:level2</name>
          <description>Non-breaking space at the 2nd level</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>nbsp:level3</name>
          <description>Non-breaking space at the 3rd level</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>nbsp:level3s</name>
          <description>Non-breaking space at the 3rd level, nothing at the 4th level</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>nbsp:level3n</name>
          <description>Non-breaking space at the 3rd level, thin non-breaking space at the 4th level</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>nbsp:level4</name>
          <description>Non-breaking space at the 4th level</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>nbsp:level4n</name>
          <description>Non-breaking space at the 4th level, thin non-breaking space at the 6th level</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>nbsp:level4nl</name>
          <description>Non-breaking space at the 4th level, thin non-breaking space at the 6th level (via Ctrl+Shift)</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>nbsp:zwnj2</name>
          <description>Zero-width non-joiner at the 2nd level</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>nbsp:zwnj2zwj3</name>
          <description>Zero-width non-joiner at the 2nd level, zero-width joiner at the 3rd level</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>nbsp:zwnj2zwj3nb4</name>
          <description>Zero-width non-joiner at the 2nd level, zero-width joiner at the 3rd level, non-breaking space at the 4th level</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>nbsp:zwnj2nb3</name>
          <description>Zero-width non-joiner at the 2nd level, non-breaking space at the 3rd level</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>nbsp:zwnj2nb3s</name>
          <description>Zero-width non-joiner at the 2nd level, non-breaking space at the 3rd level, nothing at the 4th level</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>nbsp:zwnj2nb3zwj4</name>
          <description>Zero-width non-joiner at the 2nd level, non-breaking space at the 3rd level, zero-width joiner at the 4th level</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>nbsp:zwnj2nb3nnb4</name>
          <description>Zero-width non-joiner at the 2nd level, non-breaking space at the 3rd level, thin non-breaking space at the 4th level</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>nbsp:zwnj3zwj4</name>
          <description>Zero-width non-joiner at the 3rd level, zero-width joiner at the 4th level</description>
        </configItem>
      </option>
    </group>
    <group allowMultipleSelection="true">
      <configItem>
        <name>japan</name>
        <description>Japanese keyboard options</description>
      </configItem>
      <option>
        <configItem>
          <name>japan:kana_lock</name>
          <description>Kana Lock key is locking</description>
       </configItem>
      </option>
      <option>
        <configItem>
          <name>japan:nicola_f_bs</name>
          <description>NICOLA-F style Backspace</description>
       </configItem>
      </option>
      <option>
        <configItem>
          <name>japan:hztg_escape</name>
          <description>Make Zenkaku Hankaku an additional Esc</description>
       </configItem>
      </option>
    </group>
    <group allowMultipleSelection="true">
      <configItem>
        <name>korean</name>
        <description>Korean Hangul/Hanja keys</description>
      </configItem>
      <option>
        <configItem>
          <name>korean:ralt_hangul</name>
          <description>Make right Alt a Hangul key</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>korean:rctrl_hangul</name>
          <description>Make right Ctrl a Hangul key</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>korean:ralt_hanja</name>
          <description>Make right Alt a Hanja key</description>
        </configItem>
      </option>
      <option>
        <configItem>
          <name>korean:rctrl_hanja</name>
          <description>Make right Ctrl a Hanja key</description>
        </configItem>
      </option>
    </group>
    <group allowMultipleSelection="false">
      <configItem>
        <name>esperanto</name>
        <description>Esperanto letters with superscripts</description>
      </configItem>
      <option>
        <configItem>
          <name>esperanto:qwerty</name>
          <description>At the corresponding key in a QWERTY layout</description>
       </configItem>
      </option>
      <option>
        <configItem>
          <name>esperanto:dvorak</name>
          <description>At the corresponding key in a Dvorak layout</description>
       </configItem>
      </option>
      <option>
        <configItem>
          <name>esperanto:colemak</name>
          <description>At the corresponding key in a Colemak layout</description>
       </configItem>
      </option>
    </group>
    <group allowMultipleSelection="true">
      <configItem>
        <name>solaris</name>
        <description>Old Solaris keycodes compatibility</description>
      </configItem>
      <option>
        <configItem>
          <name>solaris:sun_compat</name>
          <description>Sun key compatibility</description>
        </configItem>
      </option>
    </group>
    <group allowMultipleSelection="true">
      <configItem>
        <name>terminate</name>
        <description>Key sequence to kill the X server</description>
      </configItem>
      <option>
        <configItem>
          <name>terminate:ctrl_alt_bksp</name>
          <description>Ctrl+Alt+Backspace</description>
        </configItem>
      </option>
    </group>
  </optionList>
</xkbConfigRegistry>
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         ى            ؉                   ͐    ې            	                 M  ^      ( c               S  ^      / c      6 3           VW    @   A    `                   F       N       DO       l       V    @  ^    `  f      uR      o      [      {        $          (      0  Y k   @            Ƒ      0P   @  PP     Б     '  *     
  0     W     @  ݑ    `      މ       ߉ `  #    @          @   I       F  @	  |    @
   ,  `
  | k   
  	M *      LN *      WN *   @  _N *   `  N *     ER *      *      *     # K      / *      =    @  I %  (    `       P  `              J  !  @  + k     V    [ F     [    @  [    H  ;          h ͉         @  a      f      v       *                       @      `      ǒ    ג           @          +     I  @  Z    n           @          :j k    	          ȓ 	     ړ                     %    7    H    Y    f 	     w                 Ȕ                    #      3        ;        B       @~ k       v k   @   R      Z &      h $      q 
                      Ε    ە                ! 	   3 
   E    V                    ɂ      c   0                    %:     @  p   (   w %      +`	 %  @   z @           B      uR                      @             @   '  *  `                                                      
                       
             ډ               
                         ։               
                                 
                                           
                                    
                       
                             
*            *                 
                             
                 
       $       [  $      Ȗ $      ̖ $      P *       P *   @   &  *   `   Ԗ *      Q *      #Q *          
               
                          	              r        Չ        ׉        F                                                                                                                                                               
                   G        $                                و                ׈                                }        ~                z        {        |                
    x        w        
   @~ k   W   8    9       
   @~ k    c  L Ĉ P    ;       
k   b  g    =       
    ג    ?       
   r  VW    v    {        A       
   r  VW            C       
     r        E       
   r      G       
    r  З    I     G       
              L     L     L     L       
    r     P *   .    Q D    L U    L e    L p    L     L     L     L     L       ژ    L       
   r          ]       
    @~ k      	    _ !    G       
*   r  Q *   2    b B    I Q    _ c    I       
    r      G r    g     g scsi_lun scsi_host_template queuecommand init_cmd_priv exit_cmd_priv eh_abort_handler eh_device_reset_handler eh_target_reset_handler eh_bus_reset_handler eh_host_reset_handler slave_alloc slave_configure slave_destroy target_alloc target_destroy scan_finished change_queue_depth mq_poll dma_need_drain bios_param show_info eh_timed_out eh_should_retry_cmd host_reset proc_name can_queue sg_prot_tablesize dma_boundary cmd_per_lun tag_alloc_policy track_queue_depth supported_mode emulated skip_settle_delay no_write_same host_tagset max_host_blocked shost_groups sdev_groups rpm_autosuspend_delay Scsi_Host __devices __targets starved_list default_lock host_lock scan_mutex eh_abort_list eh_cmd_q ehandler eh_action host_wait hostt transportt tagset_refcnt tagset_freed host_blocked host_failed host_eh_scheduled host_no eh_deadline last_reset max_channel max_id max_lun max_cmd_len opt_sectors active_mode host_self_blocked reverse_ordering tmf_in_progress async_scan eh_noresume short_inquiry no_scsi2_lun_in_cdb work_q_name work_q tmf_work_q prot_capabilities prot_guard_type n_io_port dma_channel shost_state shost_gendev shost_dev shost_data scsi_cmnd eh_entry abort_work eh_eflags budget_token jiffies_at_alloc prot_op prot_type prot_flags submitter cmd_len sc_data_direction cmnd sdb prot_sdb underflow transfersize resid_len sense_len sense_buffer extra_len host_scribble scsi_device same_target_siblings budget_map device_blocked restarts starved_entry max_queue_depth last_queue_full_depth last_queue_full_count last_queue_full_time queue_ramp_up_period last_queue_ramp_up scsi_level inq_periph_qual inquiry_mutex inquiry_len inquiry vpd_pg0 vpd_pg83 vpd_pg80 vpd_pg89 vpd_pgb0 vpd_pgb1 vpd_pgb2 sdev_target sdev_bflags eh_timeout manage_system_start_stop manage_runtime_start_stop manage_shutdown force_runtime_start_on_system_start lockable borken sdtr wdtr tagged_supported simple_tags was_reset expecting_cc_ua use_10_for_rw use_10_for_ms set_dbd_for_ms read_before_ms no_report_opcodes use_16_for_rw skip_ms_page_8 skip_ms_page_3f skip_vpd_pages try_vpd_pages use_192_bytes_for_3f no_start_on_add allow_restart no_start_on_resume start_stop_pwr_cond no_uld_attach select_no_atn fix_capacity guess_capacity retry_hwerror last_sector_bug no_read_disc_info no_read_capacity_16 try_rc_10_first security_supported wce_default_on no_dif broken_fua lun_in_cdb unmap_limit_for_ws rpm_autosuspend ignore_media_change silence_suspend no_vpd_size queue_stopped offline_already disk_events_disable_depth supported_events max_device_blocked iorequest_cnt iodone_cnt ioerr_cnt iotmo_cnt sdev_gendev sdev_dev dma_drain_len dma_drain_buf sg_timeout sg_reserved_size bsg_dev access_state state_mutex sdev_state quiesced_by sdev_data scsi_target starget_sdev_user reap_ref single_lun pdt_1f_for_no_lun no_report_luns expecting_lun_change target_busy target_blocked max_target_blocked starget_data scsi_host_state SHOST_CREATED SHOST_RUNNING SHOST_CANCEL SHOST_DEL SHOST_RECOVERY SHOST_CANCEL_RECOVERY SHOST_DEL_RECOVERY scsi_transport_template CPL_PASS_OPEN_REQ CPL_PASS_ACCEPT_RPL CPL_ACT_OPEN_REQ CPL_SET_TCB_FIELD CPL_GET_TCB CPL_CLOSE_CON_REQ CPL_CLOSE_LISTSRV_REQ CPL_ABORT_REQ CPL_ABORT_RPL CPL_TX_DATA CPL_RX_DATA_ACK CPL_TX_PKT CPL_L2T_WRITE_REQ CPL_SMT_WRITE_REQ CPL_TID_RELEASE CPL_SRQ_TABLE_REQ CPL_TX_DATA_ISO CPL_CLOSE_LISTSRV_RPL CPL_GET_TCB_RPL CPL_L2T_WRITE_RPL CPL_PASS_OPEN_RPL CPL_ACT_OPEN_RPL CPL_PEER_CLOSE CPL_ABORT_REQ_RSS CPL_ABORT_RPL_RSS CPL_SMT_WRITE_RPL CPL_RX_PHYS_ADDR CPL_CLOSE_CON_RPL CPL_ISCSI_HDR CPL_RDMA_CQE CPL_RDMA_CQE_READ_RSP CPL_RDMA_CQE_ERR CPL_RX_DATA CPL_SET_TCB_RPL CPL_RX_PKT CPL_RX_DDP_COMPLETE CPL_ACT_ESTABLISH CPL_PASS_ESTABLISH CPL_RX_DATA_DDP CPL_PASS_ACCEPT_REQ CPL_RX_ISCSI_CMP CPL_TRACE_PKT_T5 CPL_RX_ISCSI_DDP CPL_RX_TLS_CMP CPL_RDMA_READ_REQ CPL_PASS_OPEN_REQ6 CPL_ACT_OPEN_REQ6 CPL_TX_TLS_PDU CPL_TX_TLS_SFO CPL_TX_SEC_PDU CPL_TX_TLS_ACK CPL_RDMA_TERMINATE CPL_RDMA_WRITE CPL_SGE_EGR_UPDATE CPL_RX_MPS_PKT CPL_TRACE_PKT CPL_TLS_DATA CPL_ISCSI_DATA CPL_FW4_MSG CPL_FW4_PLD CPL_FW4_ACK CPL_SRQ_TABLE_RPL CPL_RX_PHYS_DSGL CPL_FW6_MSG CPL_FW6_PLD CPL_TX_TNL_LSO CPL_TX_PKT_LSO CPL_TX_PKT_XT NUM_CPL_CMDS CPL_error CPL_ERR_NONE CPL_ERR_TCAM_PARITY CPL_ERR_TCAM_MISS CPL_ERR_TCAM_FULL CPL_ERR_BAD_LENGTH CPL_ERR_BAD_ROUTE CPL_ERR_CONN_RESET CPL_ERR_CONN_EXIST_SYNRECV CPL_ERR_CONN_EXIST CPL_ERR_ARP_MISS CPL_ERR_BAD_SYN CPL_ERR_CONN_TIMEDOUT CPL_ERR_XMIT_TIMEDOUT CPL_ERR_PERSIST_TIMEDOUT CPL_ERR_FINWAIT2_TIMEDOUT CPL_ERR_KEEPALIVE_TIMEDOUT CPL_ERR_RTX_NEG_ADVICE CPL_ERR_PERSIST_NEG_ADVICE CPL_ERR_KEEPALV_NEG_ADVICE CPL_ERR_ABORT_FAILED CPL_ERR_IWARP_FLM CPL_CONTAINS_READ_RPL CPL_CONTAINS_WRITE_RPL ULP_MODE_NONE ULP_MODE_ISCSI ULP_MODE_RDMA ULP_MODE_TCPDDP ULP_MODE_FCOE ULP_MODE_TLS ULP_CRC_HEADER ULP_CRC_DATA CPL_ABORT_SEND_RST CPL_ABORT_NO_RST opcode_tid work_request_hdr wr_hi wr_mid wr_lo cpl_act_open_req ot peer_port peer_ip opt0 opt2 cpl_t5_act_open_req cpl_t6_act_open_req opt3 cpl_act_open_req6 local_ip_hi local_ip_lo peer_ip_hi peer_ip_lo cpl_t5_act_open_req6 cpl_t6_act_open_req6 cpl_act_open_rpl atid_status cpl_act_establish tos_atid mac_idx cpl_set_tcb_field reply_ctrl word_cookie cpl_set_tcb_rpl cpl_close_con_req cpl_close_con_rpl cpl_abort_req_rss cpl_abort_req cpl_abort_rpl_rss cpl_abort_rpl cpl_peer_close cpl_iscsi_hdr pdu_len_ddp nxt_seq ddp_report cpl_rx_data_ddp ulp_crc ddpvld cpl_rx_iscsi_cmp cpl_tx_data_iso op_to_scsi ahs_len mpdu burst_size reserved2_seglen_offset datasn_offset buffer_offset cpl_rx_data dack_mode heartbeat ddp_off cpl_rx_data_ack credit_dack FW_TYPE_CMD_RPL FW_TYPE_WR_RPL FW_TYPE_CQE FW_TYPE_OFLD_CONNECTION_WR_RPL FW_TYPE_RSSCPL cpl_fw4_ack credits seq_vld ULP_TX_MEM_READ ULP_TX_MEM_WRITE ULP_TX_PKT ULP_TX_SC_NOOP ULP_TX_SC_IMM ULP_TX_SC_DSGL ULP_TX_SC_ISGL ULP_TX_SC_MEMRD ulptx_idata cmd_more ulp_mem_io len16 NCHAN MAX_MTU EEPROMSIZE EEPROMVSIZE EEPROMPFSIZE RSS_NENTRIES T6_RSS_NENTRIES TCB_SIZE NMTUS NCCTRL_WIN NTX_SCHED PM_NSTATS T6_PM_NSTATS MBOX_LEN TRACE_LEN FILTER_OPT_LEN SF_PAGE_SIZE SF_SEC_SIZE SGE_MAX_WR_LEN SGE_CTXT_SIZE SGE_NTIMERS SGE_NCOUNTERS SGE_NDBQTIMERS SGE_MAX_IQ_SIZE SGE_TIMER_RSTRT_CNTR SGE_TIMER_UPD_CIDX SGE_EQ_IDXSIZE SGE_INTRDST_PCI SGE_INTRDST_IQ SGE_UPDATEDEL_NONE SGE_UPDATEDEL_INTR SGE_UPDATEDEL_STPG SGE_UPDATEDEL_BOTH SGE_HOSTFCMODE_NONE SGE_HOSTFCMODE_IQ SGE_HOSTFCMODE_STPG SGE_HOSTFCMODE_BOTH SGE_FETCHBURSTMIN_16B SGE_FETCHBURSTMIN_32B SGE_FETCHBURSTMIN_64B SGE_FETCHBURSTMIN_128B SGE_FETCHBURSTMAX_64B SGE_FETCHBURSTMAX_128B SGE_FETCHBURSTMAX_256B SGE_FETCHBURSTMAX_512B SGE_CIDXFLUSHTHRESH_1 SGE_CIDXFLUSHTHRESH_2 SGE_CIDXFLUSHTHRESH_4 SGE_CIDXFLUSHTHRESH_8 SGE_CIDXFLUSHTHRESH_16 SGE_CIDXFLUSHTHRESH_32 SGE_CIDXFLUSHTHRESH_64 SGE_CIDXFLUSHTHRESH_128 SGE_INGPADBOUNDARY_SHIFT pcie_memwin MEMWIN_NIC MEMWIN_RSVD1 MEMWIN_RSVD2 MEMWIN_RDMA MEMWIN_RSVD4 MEMWIN_FOISCSI MEMWIN_CSIOSTOR MEMWIN_RSVD7 sge_qstat cidx vmcoredd_data dump_name vmcoredd_callback chip_type T4_A1 T4_A2 T4_FIRST_REV T4_LAST_REV T5_A0 T5_A1 T5_FIRST_REV T5_LAST_REV T6_A0 T6_FIRST_REV T6_LAST_REV CPL_PRIORITY_DATA CPL_PRIORITY_SETUP CPL_PRIORITY_TEARDOWN CPL_PRIORITY_LISTEN CPL_PRIORITY_ACK CPL_PRIORITY_CONTROL serv_entry aopen_entry eotid_entry tid_info tid_tab tid_base ntids stid_tab stid_bmap nstids stid_base nhash hash_base atid_tab natids atid_base hpftid_tab hpftid_bmap nhpftids hpftid_base ftid_tab ftid_bmap nftids ftid_base aftid_base aftid_end sftid_base nsftids atid_lock afree atids_in_use stid_lock stids_in_use v6_stids_in_use sftids_in_use eotid_tab eotid_bmap eotid_base neotids tids_in_use hash_tids_in_use conns_in_use eotids_in_use ftid_lock tc_hash_tids_max_prio filter_entry l2t smt filter_ctx closure chcr_ktls ktls_refcount cxgb4_uld CXGB4_ULD_INIT CXGB4_ULD_RDMA CXGB4_ULD_ISCSI CXGB4_ULD_ISCSIT CXGB4_ULD_CRYPTO CXGB4_ULD_IPSEC CXGB4_ULD_TLS CXGB4_ULD_KTLS CXGB4_ULD_MAX cxgb4_state CXGB4_STATE_UP CXGB4_STATE_START_RECOVERY CXGB4_STATE_DOWN CXGB4_STATE_DETACH CXGB4_STATE_FATAL_ERROR cxgb4_control CXGB4_CONTROL_DB_FULL CXGB4_CONTROL_DB_EMPTY CXGB4_CONTROL_DB_DROP cxgb4_range cxgb4_virt_res ddp iscsi stag pbl ocq ncrypto_fc ppod_edram chcr_stats_debug cipher_rqst digest_rqst aead_rqst tls_pdu_tx tls_pdu_rx tls_key cxgb4_lld_info tids vr mtus rxq_ids ciq_ids nrxq ntxq nciq nchan default partial alphanumeric_keys
xkb_symbols "basic" {

    include "latin"

    name[Group1]="French";

    key <AE01>	{ [ ampersand,          1,  onesuperior,   exclamdown ]	};
    key <AE02>	{ [    eacute,          2,   asciitilde,    oneeighth ]	};
    key <AE03>	{ [  quotedbl,          3,   numbersign,     sterling ]	};
    key <AE04>	{ [apostrophe,          4,    braceleft,       dollar ]	};
    key <AE05>	{ [ parenleft,          5,  bracketleft, threeeighths ]	};
    key <AE06>	{ [     minus,          6,          bar,  fiveeighths ]	};
    key <AE07>	{ [    egrave,          7,        grave, seveneighths ]	};
    key <AE08>	{ [underscore,          8,    backslash,    trademark ]	};
    key <AE09>	{ [  ccedilla,          9,  asciicircum,    plusminus ]	};
    key <AE10>	{ [    agrave,          0,           at,       degree ]	};
    key <AE11>	{ [parenright,     degree, bracketright, questiondown ]	};
    key <AE12>	{ [     equal,       plus,   braceright,  dead_ogonek ]	};

    key <AD01>	{ [         a,          A,           ae,           AE ]	};
    key <AD02>	{ [         z,          Z, guillemotleft,        less ]	};
    key <AD03>	{ [         e,          E,     EuroSign,         cent ]	};
    key <AD11>	{ [dead_circumflex, dead_diaeresis, dead_diaeresis, dead_abovering ] };
    key <AD12>	{ [    dollar,   sterling,     currency,  dead_macron ]	};

    key <AC01>	{ [         q,          Q,           at,  Greek_OMEGA ]	};
    key <AC10>	{ [         m,          M,           mu,    masculine ]	};
    key <AC11>	{ [    ugrave,    percent, dead_circumflex, dead_caron]	};
    key <TLDE>	{ [twosuperior, asciitilde,     notsign,      notsign ]	};

    key <BKSL>	{ [  asterisk,         mu,   dead_grave,   dead_breve ]	};
    key <AB01>	{ [         w,          W,      lstroke,      Lstroke ]	};
    key <AB07>	{ [     comma,   question,   dead_acute, dead_doubleacute ] };
    key <AB08>	{ [ semicolon,     period,        U2022,     multiply ]	}; // bullet
    key <AB09>	{ [     colon,      slash, periodcentered,   division ]	};
    key <AB10>	{ [    exclam,    section, dead_belowdot, dead_abovedot ] };

    include "level3(ralt_switch)"
};

partial alphanumeric_keys
xkb_symbols "olpc" {

    // #HW-SPECIFIC

    // Contact: Sayamindu Dasgupta <sayamindu@laptop.org>
    include "fr(basic)"

    name[Group1]="French";

    key <I219>	{ [ less, greater ]	};
    key <AD11>	{ [ dead_circumflex, dead_diaeresis, notsign, dead_abovering ]	};
    key <AB08>	{ [ semicolon, period, underscore, multiply ]	};
    key <TLDE>	{ [ twosuperior, asciitilde, VoidSymbol, VoidSymbol ]	};

    // Some keys only have the Shift+AltGr character printed on them (alongside
    // the unmodified one). Make such keys shift-invariant so that the printed
    // value is achieved by pressing AltGr or Shift+AltGr.
    key <AB02>	{ [ x,  X,  guillemotright, guillemotright ]	};
    key <AC02>	{ [ s,  S,  ssharp, U1E9E ]	};
    key <AD02>	{ [ z,  Z,  guillemotleft, guillemotleft ]	};
};

partial alphanumeric_keys
xkb_symbols "nodeadkeys" {

    // Modifies the basic French layout to eliminate all dead keys

    include "fr(basic)"

    name[Group1]="French (no dead keys)";

    key <AE12>	{ [     equal,       plus,   braceright,       ogonek ]	};
    key <AD11>	{ [asciicircum,  diaeresis ]	};
    key <AD12>	{ [    dollar,   sterling,     currency,       macron ]	};
    key <AC11>	{ [    ugrave,    percent,  asciicircum,        caron ]	};
    key <BKSL>	{ [  asterisk,         mu,        grave,        breve ]	};
    key <AB07>	{ [     comma,   question,        acute,  doubleacute ]	};
    key <AB10>	{ [    exclam,    section, dead_belowdot,    abovedot ]	};
};


// Unicode French derivative
// Loose refactoring of the historic Linux French keyboard layout
//
// Copyright © 2006-2008 Nicolas Mailhot <nicolas.mailhot @ laposte.net>
//
// Credits (fr-latin1, fr-latin0, fr-latin9)
//   © 199x-1996 René Cougnenc ✝
//   © 1997-2002 Guylhem Aznar <clavier @ externe.net>
//   © 2003-2006 Nicolas Mailhot <nicolas.mailhot @ laposte.net>
//
// ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┲━━━━━━━━━┓
// │ ³ ¸ │ 1 ̨  │ 2 É │ 3 ˘ │ 4 — │ 5 – │ 6 ‑ │ 7 È │ 8 ™ │ 9 Ç │ 0 À │ ° ≠ │ + ± ┃ ⌫ Retour┃
// │ ² ¹ │ & ˇ │ é ~ │ " # │ ' { │ ( [ │ - | │ è ` │ _ \ │ ç ^ │ à @ │ ) ] │ = } ┃  arrière┃
// ┢━━━━━┷━┱───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┺━┳━━━━━━━┫
// ┃       ┃ A Æ │ Z Â │ E ¢ │ R Ê │ T Þ │ Y Ÿ │ U Û │ I Î │ O Œ │ P Ô │ ¨ ˚ │ £ Ø ┃Entrée ┃
// ┃Tab ↹  ┃ a æ │ z â │ e € │ r ê │ t þ │ y ÿ │ u û │ i î │ o œ │ p ô │ ^ ~ │ $ ø ┃   ⏎   ┃
// ┣━━━━━━━┻┱────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┺┓      ┃
// ┃        ┃ Q Ä │ S „ │ D Ë │ F ‚ │ G ¥ │ H Ð │ J Ü │ K Ï │ L Ŀ │ M Ö │ % Ù │ µ ̄  ┃      ┃
// ┃Maj ⇬   ┃ q ä │ s ß │ d ë │ f ‘ │ g ’ │ h ð │ j ü │ k ï │ l ŀ │ m ö │ ù ' │ * ` ┃      ┃
// ┣━━━━━━━┳┹────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┲┷━━━━━┻━━━━━━┫
// ┃       ┃ > ≥ │ W “ │ X ” │ C ® │ V ← │ B ↑ │ N → │ ? … │ . . │ / ∕ │ § − ┃             ┃
// ┃Shift ⇧┃ < ≤ │ w « │ x » │ c © │ v ⍽ │ b ↓ │ n ¬ │ , ¿ │ ; × │ : ÷ │ ! ¡ ┃Shift ⇧      ┃
// ┣━━━━━━━╋━━━━━┷━┳━━━┷━━━┱─┴─────┴─────┴─────┴─────┴─────┴───┲━┷━━━━━╈━━━━━┻━┳━━━━━━━┳━━━┛
// ┃       ┃       ┃       ┃ ␣         Espace fine insécable ⍽ ┃       ┃       ┃       ┃
// ┃Ctrl   ┃Meta   ┃Alt    ┃ ␣ Espace       Espace insécable ⍽ ┃AltGr ⇮┃Menu   ┃Ctrl   ┃
// ┗━━━━━━━┻━━━━━━━┻━━━━━━━┹───────────────────────────────────┺━━━━━━━┻━━━━━━━┻━━━━━━━┛
partial alphanumeric_keys
xkb_symbols "oss" {

    include "latin"
    include "level3(ralt_switch)"
    include "nbsp(level4n)"
    include "keypad(oss)"

    name[Group1]="French (alt.)";

    // First row
    key <TLDE>	{ [      twosuperior,    threesuperior,          onesuperior,          dead_cedilla ] }; // ² ³ ¹ ¸
    key <AE01>	{ [        ampersand,                1,           dead_caron,           dead_ogonek ] }; // & 1 ˇ ̨
    key <AE02>	{ [           eacute,                2,           asciitilde,                Eacute ] }; // é 2 ~ É
    key <AE03>	{ [         quotedbl,                3,           numbersign,            dead_breve ] }; // " 3 # ˘
    key <AE04>	{ [       apostrophe,                4,            braceleft,             0x1002014 ] }; // ' 4 { — (tiret cadratin)
    key <AE05>	{ [        parenleft,                5,          bracketleft,             0x1002013 ] }; // ( 5 [ – (tiret demi-cadratin)
    key <AE06>	{ [            minus,                6,                  bar,             0x1002011 ] }; // - 6 | ‑ (tiret insécable)
    key <AE07>	{ [           egrave,                7,                grave,                Egrave ] }; // è 7 ` È
    key <AE08>	{ [       underscore,                8,            backslash,             trademark ] }; // _ 8 \ ™
    key <AE09>	{ [         ccedilla,                9,          asciicircum,              Ccedilla ] }; // ç 9 ^ Ç
    key <AE10>	{ [           agrave,                0,                   at,                Agrave ] }; // à 0 @ À
    key <AE11>	{ [       parenright,           degree,         bracketright,              notequal ] }; // ) ° ] ≠
    key <AE12>	{ [            equal,             plus,           braceright,             plusminus ] }; // = + } ±

    // Second row
    key <AD01>	{ [                a,                A,                   ae,                    AE ] }; // a A æ Æ
    key <AD02>	{ [                z,                Z,          acircumflex,           Acircumflex ] }; // z Z â Â
    key <AD03>	{ [                e,                E,             EuroSign,                  cent ] }; // e E € ¢
    key <AD04>	{ [                r,                R,          ecircumflex,           Ecircumflex ] }; // r R ê Ê
    key <AD05>	{ [                t,                T,                thorn,                 THORN ] }; // t T þ Þ
    key <AD06>	{ [                y,                Y,           ydiaeresis,            Ydiaeresis ] }; // y Y ÿ Ÿ
    key <AD07>	{ [                u,                U,          ucircumflex,           Ucircumflex ] }; // u U û Û
    key <AD08>	{ [                i,                I,          icircumflex,           Icircumflex ] }; // i I î Î
    key <AD09>	{ [                o,                O,                   oe,                    OE ] }; // o O œ Œ
    key <AD10>	{ [                p,                P,          ocircumflex,           Ocircumflex ] }; // p P ô Ô
    key <AD11>	{ [  dead_circumflex,   dead_diaeresis,           dead_tilde,        dead_abovering ] }; // ^ ̈ ̃ ˚
    key <AD12>	{ [           dollar,         sterling,               oslash,              Ooblique ] }; // $ £ ø Ø

    // Third row
    key <AC01>	{ [                q,                Q,           adiaeresis,            Adiaeresis ] }; // q Q ä Ä
    key <AC02>	{ [                s,                S,               ssharp,    doublelowquotemark ] }; // s S ß „
    key <AC03>	{ [                d,                D,           ediaeresis,            Ediaeresis ] }; // d D ë Ë
    key <AC04>	{ [                f,                F,  leftsinglequotemark,    singlelowquotemark ] }; // f F ‘ ‚
    key <AC05>	{ [                g,                G, rightsinglequotemark,                   yen ] }; // g G ’ ¥
    key <AC06>	{ [                h,                H,                  eth,                   ETH ] }; // h H ð Ð
    key <AC07>	{ [                j,                J,           udiaeresis,            Udiaeresis ] }; // j J ü Ü
    key <AC08>	{ [                k,                K,           idiaeresis,            Idiaeresis ] }; // k K ï Ï
    key <AC09>	{ [                l,                L,            0x1000140,             0x100013F ] }; // l L ŀ Ŀ
    key <AC10>	{ [                m,                M,           odiaeresis,            Odiaeresis ] }; // m M ö Ö
    key <AC11>	{ [           ugrave,          percent,           dead_acute,                Ugrave ] }; // ù % ' Ù
    key <BKSL>	{ [         asterisk,               mu,           dead_grave,           dead_macron ] }; // * µ ` ̄

    // Fourth row
    key <LSGT>  { [             less,          greater,        lessthanequal,      greaterthanequal ] }; // < > ≤ ≥
    key <AB01>  { [                w,                W,        guillemotleft,   leftdoublequotemark ] }; // w W « “
    key <AB02>  { [                x,                X,       guillemotright,  rightdoublequotemark ] }; // x X » ”
    key <AB03>  { [                c,                C,            copyright,            registered ] }; // c C © ®
    key <AB04>  { [                v,                V,            0x100202F,             leftarrow ] }; // v V ⍽ ← (espace fine insécable)
    key <AB05>  { [                b,                B,            downarrow,               uparrow ] }; // b B ↓ ↑
    key <AB06>  { [                n,                N,              notsign,            rightarrow ] }; // n N ¬ →
    key <AB07>  { [            comma,         question,         questiondown,             0x1002026 ] }; // , ? ¿ …
    key <AB08>  { [        semicolon,           period,             multiply,             0x10022C5 ] }; // ; . × ⋅
    key <AB09>  { [            colon,            slash,             division,             0x1002215 ] }; // : / ÷ ∕
    key <AB10>  { [           exclam,          section,           exclamdown,             0x1002212 ] }; // ! § ¡ −
};

partial alphanumeric_keys
xkb_symbols "oss_latin9" {

    // Restricts the fr(oss) layout to latin9 symbols

    include "fr(oss)"
    include "keypad(oss_latin9)"

    name[Group1]="French (alt., Latin-9 only)";

    // First row
    key <AE01>	{ [        ampersand,                1,           dead_caron,          dead_cedilla ] }; // & 1 ˇ ¸
    key <AE03>	{ [         quotedbl,                3,           numbersign,            dead_tilde ] }; // " 3 # ~
    key <AE04>	{ [       apostrophe,                4,            braceleft,            underscore ] }; // ' 4 { _
    key <AE05>	{ [        parenleft,                5,          bracketleft,                 minus ] }; // ( 5 [ -
    key <AE06>	{ [            minus,                6,                  bar,                 minus ] }; // - 6 | -
    key <AE08>	{ [       underscore,                8,            backslash,             backslash ] }; // _ 8 \ \
    key <AE11>	{ [       parenright,           degree,         bracketright,                 equal ] }; // ) ° ] =

    // Third row
    key <AC02>	{ [                s,                S,               ssharp,         guillemotleft ] }; // s S ß «
    key <AC04>	{ [                f,                F,           apostrophe,            apostrophe ] }; // f F ' '
    key <AC05>	{ [                g,                G,           apostrophe,                   yen ] }; // g G ' ¥
    key <AC09>	{ [                l,                L,       periodcentered,        periodcentered ] }; // l L · ·
    key <BKSL>	{ [         asterisk,               mu,           dead_grave,       dead_circumflex ] }; // * µ ` ^

    // Fourth row
    key <LSGT>  { [             less,          greater,                 less,               greater ] }; // < > < >
    key <AB01>  { [                w,                W,        guillemotleft,         guillemotleft ] }; // w W « «
    key <AB02>  { [                x,                X,       guillemotright,        guillemotright ] }; // x X » »
    key <AB04>  { [                v,                V,         nobreakspace,                  less ] }; // v V ⍽ < (espace insécable)
    key <AB05>  { [                b,                B,                minus,           asciicircum ] }; // b B - ^
    key <AB06>  { [                n,                N,              notsign,               greater ] }; // n N ¬ >
    key <AB07>  { [            comma,         question,         questiondown,                period ] }; // , ? ¿ .
    key <AB08>  { [        semicolon,           period,             multiply,        periodcentered ] }; // ; . × ·
    key <AB09>  { [            colon,            slash,             division,                 slash ] }; // : / ÷ /
    key <AB10>  { [           exclam,          section,           exclamdown,                 minus ] }; // ! § ¡ -
};

partial alphanumeric_keys
xkb_symbols "oss_nodeadkeys" {

    // Modifies the basic fr(oss) layout to eliminate all dead keys

    include "fr(oss)"

    name[Group1]="French (alt., no dead keys)";

    key <TLDE>	{ [      twosuperior,    threesuperior,          onesuperior,               cedilla ] }; // ² ³ ¹ ¸
    key <AE01>	{ [        ampersand,                1,                caron,                ogonek ] }; // & 1 ˇ ̨
    key <AE03>	{ [         quotedbl,                3,           numbersign,                 breve ] }; // " 3 # ˘

    key <AD11>	{ [      asciicircum,        diaeresis,           asciitilde,                 Aring ] }; // ^ ̈ ̃ Å
    key <AC11>	{ [           ugrave,          percent,                acute,                Ugrave ] }; // ù % ' Ù
    key <BKSL>	{ [         asterisk,               mu,                grave,                macron ] }; // * µ ` ̄
};


// Historic Linux French keyboard layout (fr-latin9)
// Copyright (c) 199x, 2002 Rene Cougnenc (original work)
//                          Guylhem Aznar <clavier @ externe.net> (maintainer)
//                          Nicolas Mailhot <Nicolas.Mailhot @ laposte.net>
//                              (XFree86 submission)
//
// This layout has long been distributed and refined outside official channels.
// To this day it remains more feature-rich and popular than the 'fr' layout.
//
// This layout is derived from an original version by Guylhem Aznar.
// The original version is always available from:
// http://en.tldp.org/HOWTO/Francophones-HOWTO.html
// and is distributed under a GPL license.
//
// The author has given permission for this derived version to be distributed
// under the standard XFree86 license. He would like all changes to this
// version to be sent to him at <clavier @ externe.net>, so he can sync
// the identically named linux console map (kbd, linux-console) and his
// out-of-tree GPL version.
//
// Now follows the keyboard design description in French.
// (If you can't read it you probably have no business changing this file anyway:)
//
// Les accents circonflexes des principales voyelles sont obtenus avec
// la touche Alt_Gr, les trémas sont obtenus par Alt_Gr + Shift.
//
//  ____                                     _________ _____________ _______
// | S A| S = Shift,  A = AltGr + Shift     | Imprime | Arrêt défil | Pause |
// | s a| s = normal, a = AltGr             |  Exec   |             | Halte |
//  ¯¯¯¯                                     ¯¯¯¯¯¯¯¯¯ ¯¯¯¯¯¯¯¯¯¯¯¯¯ ¯¯¯¯¯¯¯
//  ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ _______
// | œ "| 1 ·| 2 É| 3 ,| 4 '| 5 "| 6 || 7 È| 8 ¯| 9 Ç| 0 À| ° ÿ| + °| <--   |
// | Œ "| & '| é ~| " #| ' {| ( [| - || è `| _ \| ç ^| à @| ) ]| = }|       |
//  ========================================================================
// | |<-  | A ä| Z Å| E ¢| R Ç| T Þ| Y Ý| U ü| I ï| O ö| P '| " `| $ ë|   , |
// |  ->| | a â| z å| e €| r ç| t þ| y ý| u û| i î| o ô| p ¶| ^ ~| £ ê| <-' |
//  ===================================================================¬    |
// |       | Q Ä| S Ø| D Ë| F ª| G Æ| H Ð| J Ü| K Ï| L Ö| M º| % Ù| µ ¥|    |
// | MAJ   | q Â| s ø| d Ê| f ±| g æ| h ð| j Û| k Î| l Ô| m ¹| ù ²| * ³|    |
//  ========================================================================
// | ^   | >  | W  | X  | C  | V  | B  | N  | ?  | .  | /  | §  |     ^     |
// | |   | < || w «| x »| c ©| v ®| b ß| n ¬| , ¿| ; ×| : ÷| ! ¡|     |     |
//  ========================================================================
// |      |      |      |                       |       |      |     |      |
// | Ctrl | Super| Alt  | Space    Nobreakspace | AltGr | Super|Menu | Ctrl |
//  ¯¯¯¯¯¯ ¯¯¯¯¯¯ ¯¯¯¯¯¯ ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ ¯¯¯¯¯¯¯ ¯¯¯¯¯¯ ¯¯¯¯¯ ¯¯¯¯¯¯
//
//
//		Si les touches mortes fonctionnent, utiliser les accents dits
//		« morts », i.e. fonctionnant comme l'accent circonflexe & le
//		tréma des machines à écrire ; sont disponibles :
//
// (^) : accent circonflexe,
// Shift+(^) : tréma,
// Shift+AltGr+(^) : tilde,
// AltGr+(1) : accent aigu,
// AltGr+(7) : accent grave
//
// Pour s'en servir, procéder comme avec l'accent circonflexe & le tréma
// sur les vielles machines à écrire :
//
// AltGr+(1) puis e : é
// AltGr+(1) puis E : É
//
partial alphanumeric_keys

xkb_symbols "latin9" {

    include "latin"
    include "nbsp(level3)"

    name[Group1]="French (legacy, alt.)";

    key <TLDE>	{ [              oe,              OE, leftdoublequotemark, rightdoublequotemark ] };
    key <AE01>	{ [       ampersand,               1,          dead_acute,       periodcentered ] };
    key <AE02>	{ [          eacute,               2,          asciitilde,               Eacute ] };
    key <AE03>	{ [        quotedbl,               3,          numbersign,              cedilla ] };
    key <AE04>	{ [      apostrophe,               4,           braceleft,                acute ] };
    key <AE05>	{ [       parenleft,               5,         bracketleft,            diaeresis ] };
    key <AE06>	{ [           minus,               6,                 bar,            brokenbar ] };
    key <AE07>	{ [          egrave,               7,          dead_grave,               Egrave ] };
    key <AE08>	{ [      underscore,               8,           backslash,               macron ] };
    key <AE09>	{ [        ccedilla,               9,         asciicircum,             Ccedilla ] };
    key <AE10>	{ [          agrave,               0,                  at,               Agrave ] };
    key <AE11>	{ [      parenright,          degree,        bracketright,           ydiaeresis ] };
    key <AE12>	{ [           equal,            plus,          braceright,       dead_abovering ] };

    key <AD01>	{ [               a,               A,         acircumflex,           adiaeresis ] };
    key <AD02>	{ [               z,               Z,               aring,                Aring ] };
    key <AD03>	{ [               e,               E,            EuroSign,                 cent ] };
    key <AD04>	{ [               r,               R,            ccedilla,             Ccedilla ] };
    key <AD05>	{ [               t,               T,               thorn,                THORN ] };
    key <AD06>	{ [               y,               Y,              yacute,               Yacute ] };
    key <AD07>	{ [               u,               U,         ucircumflex,           udiaeresis ] };
    key <AD08>	{ [               i,               I,         icircumflex,           idiaeresis ] };
    key <AD09>	{ [               o,               O,         ocircumflex,           odiaeresis ] };
    key <AD10>	{ [               p,               P,           paragraph,                grave ] };
    key <AD11>	{ [ dead_circumflex,  dead_diaeresis,          dead_tilde,           apostrophe ] };
    key <AD12>	{ [          dollar,	    sterling,         ecircumflex,           ediaeresis ] };

    key <AC01>	{ [               q,               Q,         Acircumflex,           Adiaeresis ] };
    key <AC02>	{ [               s,               S,              oslash,             Ooblique ] };
    key <AC03>	{ [               d,               D,         Ecircumflex,           Ediaeresis ] };
    key <AC04>	{ [               f,               F,           plusminus,          ordfeminine ] };
    key <AC05>	{ [               g,               G,                  ae,                   AE ] };
    key <AC06>	{ [               h,               H,                 eth,                  ETH ] };
    key <AC07>	{ [               j,               J,         Ucircumflex,           Udiaeresis ] };
    key <AC08>	{ [               k,               K,         Icircumflex,           Idiaeresis ] };
    key <AC09>	{ [               l,               L,         Ocircumflex,           Odiaeresis ] };
    key <AC10>	{ [               m,               M,         onesuperior,            masculine ] };
    key <AC11>	{ [          ugrave,         percent,         twosuperior,               Ugrave ] };
    key <BKSL>  { [        asterisk,              mu,       threesuperior,                  yen ] };

    key <LSGT>	{ [            less,         greater,                 bar                       ] };
    key <AB01>	{ [               w,               W,       guillemotleft	        	] };
    key <AB02>	{ [               x,               X,      guillemotright                       ] };
    key <AB03>	{ [               c,               C,           copyright                       ] };
    key <AB04>	{ [               v,               V,          registered		        ] };
    key <AB05>	{ [               b,               B,              ssharp,                U1E9E ] };
    key <AB06>	{ [               n,               N,             notsign                       ] };
    key <AB07>	{ [           comma,        question,        questiondown                       ] };
    key <AB08>	{ [       semicolon,          period,            multiply		        ] };
    key <AB09>	{ [           colon,           slash,            division                       ] };
    key <AB10>	{ [          exclam,         section,          exclamdown                       ] };

    // French uses a comma as decimal separator, but keyboards are labeled with a period
    // Will take effect when KP_Decimal is mapped to the locale decimal separator
    key <KPDL>  { [       KP_Delete,      KP_Decimal,           KP_Delete,           KP_Decimal ] };

    include "level3(ralt_switch)"
};

partial alphanumeric_keys
xkb_symbols "latin9_nodeadkeys" {

    // Modifies the basic fr-latin9 layout to eliminate all dead keys

    include "fr(latin9)"

    name[Group1]="French (legacy, alt., no dead keys)";

    key <AE01>	{ [       ampersand,               1,          apostrophe,       periodcentered ] };
    key <AE07>	{ [          egrave,               7,               grave,               Egrave ] };
    key <AE12>	{ [           equal,            plus,          braceright         	        ] };
    key <AD11>	{ [	asciicircum,  	   diaeresis,          asciitilde,           apostrophe ] };
};

// Bépo : Improved ergonomic french keymap using Dvorak method.
// Built by community on 'Dvorak Fr / Bépo' :
// see http://www.clavier-dvorak.org/wiki/ to join and help.
// XOrg integration (1.0rc2 version) in 2008
// by Frédéric Boiteux <fboiteux at free dot fr>
//
// Bépo layout (1.0rc2 version) for a pc105 keyboard (french) :
// ┌─────┐
// │ S A │   S = Shift,  A = AltGr + Shift
// │ s a │   s = normal, a = AltGr
// └─────┘
//
// ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┲━━━━━━━━━┓
// │ # ¶ │ 1 „ │ 2 “ │ 3 ” │ 4 ≤ │ 5 ≥ │ 6   │ 7 ¬ │ 8 ¼ │ 9 ½ │ 0 ¾ │ ° ′ │ ` ″ ┃ ⌫ Retour┃
// │ $ – │ " — │ « < │ » > │ ( [ │ ) ] │ @ ^ │ + ± │ - − │ / ÷ │ * × │ = ≠ │ % ‰ ┃  arrière┃
// ┢━━━━━┷━┱───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┺━┳━━━━━━━┫
// ┃       ┃ B ¦ │ É ˝ │ P § │ O Œ │ È ` │ !   │ V   │ D Ð │ L   │ J Ĳ │ Z Ə │ W   ┃Entrée ┃
// ┃Tab ↹  ┃ b | │ é ˊ │ p & │ o œ │ è ` │ ˆ ¡ │ v ˇ │ d ð │ l / │ j ĳ │ z ə │ w ̆  ┃   ⏎   ┃
// ┣━━━━━━━┻┱────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┺┓      ┃
// ┃        ┃ A Æ │ U Ù │ I ˙ │ E ¤ │ ; ̛  │ C ſ │ T Þ │ S ẞ │ R ™ │ N   │ M º │ Ç , ┃      ┃
// ┃Maj ⇬   ┃ a æ │ u ù │ i ̈  │ e € │ , ’ │ c © │ t þ │ s ß │ r ® │ n ˜ │ m ¯ │ ç ¸ ┃      ┃
// ┣━━━━━━━┳┹────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┲┷━━━━━┻━━━━━━┫
// ┃       ┃ Ê   │ À   │ Y ‘ │ X ’ │ : · │ K   │ ? ̉  │ Q ̣  │ G   │ H ‡ │ F ª ┃             ┃
// ┃Shift ⇧┃ ê / │ à \ │ y { │ x } │ . … │ k ~ │ ' ¿ │ q ˚ │ g µ │ h † │ f ˛ ┃Shift ⇧      ┃
// ┣━━━━━━━╋━━━━━┷━┳━━━┷━━━┱─┴─────┴─────┴─────┴─────┴─────┴───┲━┷━━━━━╈━━━━━┻━┳━━━━━━━┳━━━┛
// ┃       ┃       ┃       ┃ Espace inséc.   Espace inséc. fin ┃       ┃       ┃       ┃
// ┃Ctrl   ┃Meta   ┃Alt    ┃ ␣ (Espace)      _               ␣ ┃AltGr ⇮┃Menu   ┃Ctrl   ┃
// ┗━━━━━━━┻━━━━━━━┻━━━━━━━┹───────────────────────────────────┺━━━━━━━┻━━━━━━━┻━━━━━━━┛
partial alphanumeric_keys
xkb_symbols "bepo" {

    include "level3(ralt_switch)"
    include "keypad(oss)"

    name[Group1]= "French (BEPO)";

    // First row
    key <TLDE> { [          dollar,   numbersign,        endash,       paragraph ] }; // $ # – ¶
    key <AE01> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC", [        quotedbl,            1,         emdash, doublelowquotemark ] }; // " 1 — „
    key <AE02> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC", [   guillemotleft,            2,           less,  leftdoublequotemark ] }; // « 2 < “
    key <AE03> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC", [  guillemotright,            3,        greater, rightdoublequotemark ] }; // » 3 > ”
    key <AE04> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC", [       parenleft,            4,    bracketleft,      lessthanequal ] }; // ( 4 [ ≤
    key <AE05> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC", [      parenright,            5,   bracketright,   greaterthanequal ] }; // ) 5 ] ≥
    key <AE06> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC", [              at,            6,    asciicircum                 ] }; // @ 6 ^
    key <AE07> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC", [            plus,            7,      plusminus,        notsign ] }; // + 7 ± ¬
    key <AE08> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC", [           minus,            8,          U2212,     onequarter ] }; // - 8 − ¼
    key <AE09> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC", [           slash,            9,       division,        onehalf ] }; // / 9 ÷ ½
    key <AE10> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC", [        asterisk,            0,       multiply,  threequarters ] }; // * 0 × ¾
    key <AE11> { [           equal,       degree,       notequal,        minutes ] }; // = ° ≠ ′
    key <AE12> { [         percent,        grave,       permille,        seconds ] }; // % ` ‰ ″

    // Second row
    key <AD01> { [               b,            B,            bar,      brokenbar ] }; // b B | ¦
    key <AD02> { [          eacute,       Eacute,     dead_acute, dead_doubleacute ] }; // é É ˊ ˝
    key <AD03> { [               p,            P,      ampersand,        section ] }; // p P & §
    key <AD04> { [               o,            O,             oe,             OE ] }; // o O œ Œ
    key <AD05> { [          egrave,       Egrave,     dead_grave,          grave ] }; // è È ` `
    key <AD06> { [ dead_circumflex,       exclam,     exclamdown                 ] }; // ^ ! ¡
    key <AD07> { [               v,            V,     dead_caron                 ] }; // v V ˇ
    key <AD08> { [               d,            D,            eth,            ETH ] }; // d D ð Ð
    key <AD09> { [               l,            L,    dead_stroke                 ] }; // l L /
    key <AD10> { [               j,            J,          U0133,          U0132 ] }; // j J ĳ Ĳ
    key <AD11> { [               z,            Z,          schwa,          SCHWA ] }; // z Z ə Ə
    key <AD12> { [               w,            W,     dead_breve                 ] }; // w W ̆

    // Third row
    key <AC01> { [               a,            A,             ae,             AE ] }; // a A æ Æ
    key <AC02> { [               u,            U,         ugrave,         Ugrave ] }; // u U ù Ù
    key <AC03> { [               i,            I, dead_diaeresis,  dead_abovedot ] }; // i I ̈ ˙
    key <AC04> { [               e,            E,       EuroSign,  dead_currency ] }; // e E € ¤
    key <AC05> { [           comma,    semicolon, rightsinglequotemark, dead_horn ] }; // , ; ’ ̛
    key <AC06> { [               c,            C,      copyright,          U017F ] }; // c C © ſ
    key <AC07> { [               t,            T,          thorn,          THORN ] }; // t T þ Þ
    key <AC08> { [               s,            S,         ssharp,          U1E9E ] }; // s S ß ẞ
    key <AC09> { [               r,            R,     registered,      trademark ] }; // r R ® ™
    key <AC10> { [               n,            N,     dead_tilde                 ] }; // n N ~
    key <AC11> { [               m,            M,    dead_macron,      masculine ] }; // m M ̄ º
    key <BKSL> { [        ccedilla,     Ccedilla,   dead_cedilla, dead_belowcomma ] }; // ç Ç ¸ ,

    // Fourth row
    key <LSGT> { [     ecircumflex,  Ecircumflex,          slash                 ] }; // ê Ê /
    key <AB01> { [          agrave,       Agrave,      backslash                 ] }; // à À \
    key <AB02> { [               y,            Y,      braceleft, leftsinglequotemark  ] }; // y Y { ‘
    key <AB03> { [               x,            X,     braceright, rightsinglequotemark ] }; // x X } ’
    key <AB04> { [          period,        colon,       ellipsis, periodcentered ] }; // . : … ·
    key <AB05> { [               k,            K,     asciitilde                 ] }; // k K ~
    key <AB06> { [      apostrophe,     question,   questiondown,      dead_hook ] }; // ' ? ¿ ̉
    key <AB07> { [               q,            Q, dead_abovering,  dead_belowdot ] }; // q Q ˚ ̣
    key <AB08> { [               g,            G,     dead_greek                 ] }; // g G µ
    key <AB09> { [               h,            H,         dagger,   doubledagger ] }; // h H † ‡
    key <AB10> { [               f,            F,    dead_ogonek,    ordfeminine ] }; // f F ̨ ª

    key <SPCE> { [           space, nobreakspace,     underscore,          U202F ] }; // ␣ (espace insécable) _ (espace insécable fin)
};

partial alphanumeric_keys
xkb_symbols "bepo_latin9" {

    // Restricts the fr(bepo) layout to latin9 symbols

    include "fr(bepo)"
    include "keypad(oss_latin9)"

    name[Group1]="French (BEPO, Latin-9 only)";

    key <TLDE> { [          dollar,   numbersign,        dollar,       paragraph ] }; // $ # $ ¶

    key <AE01> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC", [        quotedbl,            1                                 ] }; // " 1
    key <AE02> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC", [   guillemotleft,            2,           less                 ] }; // « 2 <
    key <AE03> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC", [  guillemotright,            3,        greater                 ] }; // » 3 >
    key <AE04> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC", [       parenleft,            4,    bracketleft                 ] }; // ( 4 [
    key <AE05> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC", [      parenright,            5,   bracketright                 ] }; // ) 5 ]
    key <AE08> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC", [           minus,            8,          minus,     onequarter ] }; // - 8 - ¼
    key <AE11> { [           equal,       degree                                 ] }; // = °
    key <AE12> { [         percent,        grave                                 ] }; // % `

    key <AD01> { [               b,            B,            bar                 ] }; // b B |
    key <AD02> { [          eacute,       Eacute,     dead_acute                 ] }; // é É ˊ
    key <AD10> { [               j,            J                                 ] }; // j J
    key <AD11> { [               z,            Z                                 ] }; // z Z
    key <AD12> { [               w,            W                                 ] }; // w W

    key <AC03> { [               i,            I, dead_diaeresis                 ] }; // i I ̈
    key <AC05> { [           comma,    semicolon,          comma,      dead_horn ] }; // , ; , ̛
    key <AC06> { [               c,            C,      copyright                 ] }; // c C ©
    key <AC08> { [               s,            S,         ssharp,          U1E9E ] }; // s S ß ẞ
    key <AC09> { [               r,            R,     registered                 ] }; // r R ®
    key <AC11> { [               m,            M,         macron,      masculine ] }; // m M ̄ º

    key <AB02> { [               y,            Y,      braceleft                 ] }; // y Y {
    key <AB03> { [               x,            X,     braceright                 ] }; // x X }
    key <AB04> { [          period,        colon                                 ] }; // . :
    key <AB09> { [               h,            H                                 ] }; // h H
    key <AB10> { [               f,            F,              f,    ordfeminine ] }; // f F   ª

    // Note : on a besoin de redéfinir les niveaux 3 et 4,
    // donc nbsp(level2) ne suffit pas !
    key <SPCE> { [           space,  nobreakspace,    underscore,   nobreakspace ] }; // ␣ (espace insécable) _ (espace insécable)
};

// Version 1.1rc2 of the Bépo keyboard layout, 
// normalized by the AFNOR NF Z71‐300 norm.
// 
// Layout: https://bepo.fr/wiki/Version_1.1rc2
// Normalization: https://normalisation.afnor.org/actualites/faq-clavier-francais/
// 
// ┌────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────╔═════════╗
// │ # ¶│ 1 „│ 2 “│ 3 ”│ 4 ⩽│ 5 ⩾║ 6  │ 7 ¬│ 8 ¼│ 9 ½│ 0 ¾│ ° ′│ ` ″║         ║
// │ $ –│ " —│ « <│ » >│ ( [│ ) ]║ @ ^│ + ±│ - −│ / ÷│ * ×│ = ≠│ % ‰║ <--     ║
// ╔════╧══╗─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─┴──┬─╚══╦══════╣
// ║  |<-  ║ B _│ É  │ P §│ O Œ│ È `║ !  │ V  │ D  │ L £│ J  │ Z  │ W  ║   |  ║
// ║  ->|  ║ b |│ é ´│ p &│ o œ│ è `║ ˆ ¡│ v ˇ│ d ∞│ l /│ j  │ z ―│ w  ║ <-'  ║
// ╠═══════╩╗───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───┴┬───╚╗     ║
// ║        ║ A Æ│ U Ù│ I ˙│ E ¤│ ; ,║ C ©│ T ™│ S ſ│ R ®│ N  │ M  │ Ç ©║     ║
// ║  CAPS  ║ a æ│ u ù│ i ¨│ e €│ , '║ c ¸│ t ᵉ│ s ß│ r ˘│ n ~│ m ¯│ ç  ║     ║
// ╠══════╦═╝──┬─┴──┬─┴──┬─┴─══─┴──┬─┴──┬─┴─══─┴──┬─┴──┬─┴──┬─┴──╔═╧════╩═════╣
// ║   ^  ║ Ê ^│ À ‚│ Y ‘│ X ’│ : ·│ K ‑║ ? ̉ │ Q ̛│ G †│ H ‡│ F  ║     ^      ║
// ║   |  ║ ê /│ à \│ y {│ x }│ . …│ k ~║ ’ ¿│ q °│ g µ│ h ̣ │ f ˛║     |      ║
// ╠══════╩╦═══╧══╦═╧═══╦╧════╧════╧════╧════╧════╧═╦══╧══╦═╧════╬═════╦══════╣
// ║       ║      ║     ║ Fine insécable  Insécable ║     ║      ║     ║      ║
// ║ Ctrl  ║ WinG ║ Alt ║ Espace                  _ ║AltGr║ WinD ║WinM ║ Ctrl ║
// ╚═══════╩══════╩═════╩═══════════════════════════╩═════╩══════╩═════╩══════╝
partial alphanumeric_keys
xkb_symbols "bepo_afnor" {

	name[Group1]= "French (BEPO, AFNOR)";

	include "pc(pc105)"

	key <TLDE> { type[group1] = "FOUR_LEVEL", [ dollar, numbersign, endash, paragraph ] }; // $ # – ¶
	key <AE01> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC", [ quotedbl, 1, emdash, doublelowquotemark ] }; // " 1 — „
	key <AE02> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC", [ guillemotleft, 2, less, leftdoublequotemark ] }; // « 2 < “
	key <AE03> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC", [ guillemotright, 3, greater, rightdoublequotemark ] }; // » 3 > ”
	key <AE04> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC", [ parenleft, 4, bracketleft, U2A7D ] }; // ( 4 [ ⩽
	key <AE05> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC", [ parenright, 5, bracketright, U2A7E ] }; // ) 5 ] ⩾
	key <AE06> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC", [ at, 6, asciicircum, U262D ] }; // @ 6 ^ ☭
	key <AE07> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC", [ plus, 7, plusminus, notsign ] }; // + 7 ± ¬
	key <AE08> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC", [ minus, 8, U2212, onequarter ] }; // - 8 − ¼
	key <AE09> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC", [ slash, 9, division, onehalf ] }; // / 9 ÷ ½
	key <AE10> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC", [ asterisk, 0, multiply, threequarters ] }; // * 0 × ¾
	key <AE11> { type[group1] = "FOUR_LEVEL", [ equal, degree, notequal, minutes ] }; // = ° ≠ ′
	key <AE12> { type[group1] = "FOUR_LEVEL", [ percent, grave, U2030, seconds ] }; // % ` ‰ ″

	key <AD01> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC", [ b, B, bar, underscore ] }; // b B | _
	key <AD02> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC", [ eacute, Eacute, dead_acute, heart ] }; // é É ´ ♥
	key <AD03> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC", [ p, P, ampersand, section ] }; // p P & §
	key <AD04> { type[group1] = "FOUR_LEVEL_ALPHABETIC", [ o, O, oe, OE ] }; // o O œ Œ
	key <AD05> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC", [ egrave, Egrave, dead_grave, grave ] }; // è È ` `
	key <AD06> { type[group1] = "FOUR_LEVEL", [ dead_circumflex, exclam, exclamdown, U2620 ] }; // ^ ! ¡ ☠
	key <AD07> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC", [ v, V, dead_caron, U2622 ] }; // v V ˇ ☢
	key <AD08> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC", [ d, D, UFDD7, U2623 ] }; // d D ∞ ☣
	key <AD09> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC", [ l, L, dead_stroke, sterling ] }; // l L / £
	key <AD10> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC", [ j, J, U262E, U262F ] }; // j J ☮ ☯
	key <AD11> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC", [ z, Z, UFDD8, U2619 ] }; // z Z ― ☙
	key <AD12> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC", [ w, W, U269C, U267F ] }; // w W ⚜ ♿

	key <AC01> { type[group1] = "FOUR_LEVEL_ALPHABETIC", [ a, A, ae, AE ] }; // a A æ Æ
	key <AC02> { type[group1] = "FOUR_LEVEL_ALPHABETIC", [ u, U, ugrave, Ugrave ] }; // u U ù Ù
	key <AC03> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC", [ i, I, dead_diaeresis, dead_abovedot ] }; // i I ¨ ˙
	key <AC04> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC", [ e, E, EuroSign, dead_currency ] }; // e E € ¤
	key <AC05> { type[group1] = "FOUR_LEVEL", [ comma, semicolon, apostrophe, dead_belowcomma ] }; // , ; ' ,
	key <AC06> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC", [ c, C, dead_cedilla, copyright ] }; // c C ¸ ©
	key <AC07> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC", [ t, T, UFDD5, trademark ] }; // t T ᵉ ™
	key <AC08> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC", [ s, S, UFDD4, U017F ] }; // s S ß ſ
	key <AC09> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC", [ r, R, dead_breve, registered ] }; // r R ˘ ®
	key <AC10> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC", [ n, N, dead_tilde, U2693 ] }; // n N ~ ⚓
	key <AC11> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC", [ m, M, dead_macron, U26FD ] }; // m M ¯ ⛽
	key <BKSL> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC", [ ccedilla, Ccedilla, U2708, U1F12F ] }; // ç Ç ✈ 🄯

	key <LSGT> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC", [ ecircumflex, Ecircumflex, slash, asciicircum ] }; // ê Ê / ^
	key <AB01> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC", [ agrave, Agrave, backslash, singlelowquotemark ] }; // à À \ ‚
	key <AB02> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC", [ y, Y, braceleft, leftsinglequotemark ] }; // y Y { ‘
	key <AB03> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC", [ x, X, braceright, rightsinglequotemark ] }; // x X } ’
	key <AB04> { type[group1] = "FOUR_LEVEL", [ period, colon, ellipsis, periodcentered ] }; // . : … ·
	key <AB05> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC", [ k, K, asciitilde, U2011 ] }; // k K ~ ‑
	key <AB06> { type[group1] = "FOUR_LEVEL", [ rightsinglequotemark, question, questiondown, dead_hook ] }; // ’ ? ¿ ̉
	key <AB07> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC", [ q, Q, dead_abovering, dead_horn ] }; // q Q ˚ ̛
	key <AB08> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC", [ g, G, dead_greek, dagger ] }; // g G µ †
	key <AB09> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC", [ h, H, dead_belowdot, doubledagger ] }; // h H ̣ ‡
	key <AB10> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC", [ f, F, dead_ogonek, U26C4 ] }; // f F ˛ ⛄
	key <SPCE> { type[group1] = "FOUR_LEVEL", [ space, U202F, underscore, nobreakspace ] }; //     _  


	include "level3(ralt_switch)"
};

// Author   : Francis Leboutte, http://www.algo.be/ergo/dvorak-fr.html
//            thanks to Fabien Cazenave for his help
// Licence  : X11
// Version  : 0.3

// Base layer + dead AltGr key (`):
// ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┲━━━━━━━━━━┓
// │ *   │ 1   │ 2   │ 3   │ 4   │ 5   │ 6   │ 7   │ 8   │ 9   │ 0   │ +   │ %   ┃          ┃
// │ _   │ =   │ / ± │ - ¼ │ è ½ │ \ ¾ │ ^   │ (   │ ` ` │ )   │ "   │ [   │ ]   ┃ ⌫        ┃
// ┢━━━━━┷━━┱──┴──┬──┴──┬──┴──┬──┴──┬──┴──┬──┴──┬──┴──┬──┴──┬──┴──┬──┴──┬──┴──┬──┺━━┳━━━━━━━┫
// ┃        ┃ ? Æ │ <   │ >   │ G   │ !   │ H   │ V   │ C Ç │ M   │ K   │ Z   │ &   ┃       ┃
// ┃ ↹      ┃ : æ │ ' $ │ é É │ g € │ . ° │ h   │ v   │ c ç │ m µ │ k   │ z   │ ¨   ┃       ┃
// ┣━━━━━━━━┻┱────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┺┓  ⏎   ┃
// ┃         ┃ O Ò │ A À │ U Ù │ E È │ B   │ F   │ S   │ T   │ N   │ D   │ W   │ #   ┃      ┃
// ┃ ⇬       ┃ o ò │ a à │ u ù │ e è │ b   │ f   │ s « │ t   │ n » │ d   │ w   │ ~   ┃      ┃
// ┣━━━━━━┳━━┹──┬──┴──┬──┴──┬──┴──┬──┴──┬──┴──┬──┴──┬──┴──┬──┴──┬──┴──┬──┴──┲━━┷━━━━━┻━━━━━━┫
// ┃      ┃ ç Ç │ | Œ │ Q   │ @   │ I Ì │ Y   │ X   │ R   │ L   │ P   │ J   ┃               ┃
// ┃ ⇧    ┃ à À │ ; œ │ q { │ , } │ i ì │ y £ │ x   │ r º │ l   │ p § │ j   ┃ ⇧             ┃
// ┣━━━━━━┻┳━━━━┷━━┳━━┷━━━━┱┴─────┴─────┴─────┴─────┴─────┴─┲━━━┷━━━┳━┷━━━━━╋━━━━━━━┳━━━━━━━┫
// ┃       ┃       ┃       ┃ ␣                            ⍽ ┃       ┃       ┃       ┃       ┃
// ┃ ctrl  ┃ super ┃ alt   ┃ ␣ Espace    Espace insécable ⍽ ┃ alt   ┃ super ┃ menu  ┃ ctrl  ┃
// ┗━━━━━━━┻━━━━━━━┻━━━━━━━┹────────────────────────────────┺━━━━━━━┻━━━━━━━┻━━━━━━━┻━━━━━━━┛

// Notice the specific Caps_Lock layer:
// ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┲━━━━━━━━━━┓
// │ *   │ 1   │ 2   │ 3   │ 4   │ 5   │ 6   │ 7   │ 8   │ 9   │ 0   │ +   │ %   ┃          ┃
// │     │     │     │     │     │     │     │     │     │     │     │     │     ┃ ⌫        ┃
// ┢━━━━━┷━━┱──┴──┬──┴──┬──┴──┬──┴──┬──┴──┬──┴──┬──┴──┬──┴──┬──┴──┬──┴──┬──┴──┬──┺━━┳━━━━━━━┫
// ┃        ┃     │ <   │ >   │     │     │     │     │     │     │     │     │     ┃       ┃
// ┃ ↹      ┃     │     │     │     │     │     │     │     │     │     │     │     ┃       ┃
// ┣━━━━━━━━┻┱────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┺┓  ⏎   ┃
// ┃         ┃     │     │     │     │     │     │     │     │     │     │     │     ┃      ┃
// ┃ ⇬       ┃     │     │     │     │     │     │     │     │     │     │     │     ┃      ┃
// ┣━━━━━━┳━━┹──┬──┴──┬──┴──┬──┴──┬──┴──┬──┴──┬──┴──┬──┴──┬──┴──┬──┴──┬──┴──┲━━┷━━━━━┻━━━━━━┫
// ┃      ┃ /   │ -   │     │     │     │     │     │     │     │     │     ┃               ┃
// ┃ ⇧    ┃     │     │     │     │     │     │     │     │     │     │     ┃ ⇧             ┃
// ┣━━━━━━┻┳━━━━┷━━┳━━┷━━━━┱┴─────┴─────┴─────┴─────┴─────┴─┲━━━┷━━━┳━┷━━━━━╋━━━━━━━┳━━━━━━━┫
// ┃       ┃       ┃       ┃ ␣                            ⍽ ┃       ┃       ┃       ┃       ┃
// ┃ ctrl  ┃ super ┃ alt   ┃ ␣ Espace    Espace insécable ⍽ ┃ alt   ┃ super ┃ menu  ┃ ctrl  ┃
// ┗━━━━━━━┻━━━━━━━┻━━━━━━━┹────────────────────────────────┺━━━━━━━┻━━━━━━━┻━━━━━━━┻━━━━━━━┛

partial alphanumeric_keys modifier_keys
xkb_symbols "dvorak" {
  name[Group1]="French (Dvorak)";

  // First row
  key <TLDE> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC", [       underscore,   asterisk                  ] };
  key <AE01> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC", [            equal,          1                  ] };
  key <AE02> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC", [            slash,          2,       plusminus ] };
  key <AE03> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC", [            minus,          3,      onequarter ] };
  key <AE04> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC", [           egrave,          4,         onehalf ] };
  key <AE05> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC", [        backslash,          5,   threequarters ] };
  key <AE06> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC", [  dead_circumflex,          6                  ] };
  key <AE07> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC", [        parenleft,          7                  ] };
  key <AE08> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC", [ ISO_Level3_Latch,          8,           grave ] };
  key <AE09> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC", [       parenright,          9                  ] };
  key <AE10> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC", [         quotedbl,          0                  ] };
  key <AE11> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC", [      bracketleft,       plus                  ] };
  key <AE12> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC", [     bracketright,    percent                  ] };

  // Second row
  key <AD01> { [            colon,         question,              ae,               AE ] };
  key <AD02> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC", [       apostrophe,       less,          dollar ] };
  key <AD03> { type[group1] = "FOUR_LEVEL_SEMIALPHABETIC", [           eacute,    greater,          Eacute ] };
  key <AD04> { [                g,                G,        EuroSign                   ] };
  key <AD05> { [           period,           exclam,          degree                   ] };
  key <AD06> { [                h,                H                                    ] };
  key <AD07> { [                v,                V                                    ] };
  key <AD08> { [                c,                C,        ccedilla,         Ccedilla ] };
  key <AD09> { [                m,                M,              mu                   ] };
  key <AD10> { [                k,                K                                    ] };
  key <AD11> { [                z,                Z                                    ] };
  key <AD12> { [   dead_diaeresis,        ampersand                                    ] };

  // Third row
  key <AC01> { [                o,                O,          ograve,           Ograve ] };
  key <AC02> { [                a,                A,          agrave,           Agrave ] };
  key <AC03> { [                u,                U,          ugrave,           Ugrave ] };
  key <AC04> { [                e,                E,          egrave,           Egrave ] };
  key <AC05> { [                b,                B                                    ] };
  key <AC06> { [                f,                F                                    ] };
  key <AC07> { [                s,                S,   guillemotleft                   ] };
  key <AC08> { [                t,                T                                    ] };
  key <AC09> { [                n,                N,  guillemotright                   ] };
  key <AC10> { [                d,                D                                    ] };
  key <AC11> { [                w,                W                                    ] };
  key <BKSL> { [       asciitilde,       numbersign                                    ] };

  // Fourth row
  key <LSGT> { type[group1] = "FOUR_LEVEL_PLUS_LOCK", [       agrave, ccedilla,  Agrave, Ccedilla,   slash ] };
  key <AB01> { type[group1] = "FOUR_LEVEL_PLUS_LOCK", [    semicolon,      bar,      oe,       OE,   minus ] };
  key <AB02> { [                q,                Q,       braceleft                   ] };
  key <AB03> { [            comma,               at,      braceright                   ] };
  key <AB04> { [                i,                I,          igrave,           Igrave ] };
  key <AB05> { [                y,                Y,        sterling                   ] };
  key <AB06> { [                x,                X                                    ] };
  key <AB07> { [                r,                R,       masculine                   ] };
  key <AB08> { [                l,                L                                    ] };
  key <AB09> { [                p,                P,         section                   ] };
  key <AB10> { [                j,                J                                    ] };

  key <SPCE> { [            space,            space,    nobreakspace,     nobreakspace ] };
};

// C'WHERTY: Breton keyboard. Ar c'hlavier brezhoneg.
// Copyright © 2009 Dominique Pellé <dominique.pelle@gmail.com>
// Version: 0.1
//
// ┌─────┐
// │ S A │   S = Reol = Shift,  A = ArErl + Pennlizherenn = AltGr + Shift
// │ s a │   s = normal,        a = ArErl = AltGr
// └─────┘
//
// ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┲━━━━━━━━━┓
// │ $ Γ │ 1 Δ │ 2 Θ │ 3 Λ │ 4 Ξ │ 5 Π │ 6 Σ │ 7 Φ │ 8 Ψ │ 9 Ç │ 0 Ω │ ° ß │ + ¬ ┃ ⌫ Souzañ┃
// │ ² ˙ │ & ¯ │ é ´ │ " # │ ' { │ ( [ │ - | │ è ` │ - \ │ ç ± │ à @ │ ) ] │ = } ┃         ┃
// ┢━━━━━┷━┱───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┺━┳━━━━━━━┫
// ┃Toalenn┃ C'h │ W ω │ E ε │ R ρ │ T τ │ Y ψ │ U υ │ I ι │ O OE│ P π │ ¨ ¥ │ * £ ┃Enankañ┃
// ┃     ↹ ┃ c'h │ w   │ e € │ r   │ t   │ y   │ u   │ i ı │ o oe│ p   │ ^ « │ / » ┃   ⏎   ┃
// ┣━━━━━━━┻┱────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┺┓      ┃
// ┃Prenn   ┃ A Æ │ S σ │ D δ │ F φ │ G γ │ H η │ J ς │ K κ │ L λ │ M μ │ Ù ® │ ! ¡ ┃      ┃
// ┃Pennli ⇬┃ a æ │ s   │ d $ │ f   │ g   │ h   │ j   │ k   │ l   │ m   │ ù ŭ │ ? ¿ ┃      ┃
// ┣━━━━━━━┳┹────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┲┷━━━━━┻━━━━━━┫
// ┃       ┃ Q θ │ Z ζ │ X ξ │ C χ │ V   │ B β │ N ν │ CH  │ Ñ   │ : © │ ;   ┃             ┃
// ┃Shift ⇧┃ q < │ z > │ x   │ c ¢ │ v   │ b   │ n   │ ch  │ ñ   │ .   │ ,   ┃Shift ⇧      ┃
// ┣━━━━━━━╋━━━━━┷━┳━━━┷━━━┱─┴─────┴─────┴─────┴─────┴─────┴───┲━┷━━━━━╈━━━━━┻━┳━━━━━━━┳━━━┛
// ┃       ┃       ┃       ┃ ⍽ Espace insécable              ␣ ┃       ┃       ┃       ┃
// ┃Reol   ┃Meta   ┃Erl    ┃ ␣ Espace                        ␣ ┃ArErl ⇮┃Menu   ┃Reol   ┃
// ┗━━━━━━━┻━━━━━━━┻━━━━━━━┹───────────────────────────────────┺━━━━━━━┻━━━━━━━┻━━━━━━━┛
partial alphanumeric_keys
xkb_symbols "bre" {

    include "keypad(oss)"

    name[Group1]= "French (Breton)";

    // First row
    key <TLDE> { [     twosuperior,     dead_tilde,   dead_abovedot,    Greek_GAMMA ] };
    key <AE01> { [       ampersand,              1,     dead_macron,    Greek_DELTA ] };
    key <AE02> { [          eacute,              2,      dead_acute,    Greek_THETA ] };
    key <AE03> { [        quotedbl,              3,      numbersign,    Greek_LAMDA ] };
    key <AE04> { [      apostrophe,              4,       braceleft,       Greek_XI ] };
    key <AE05> { [       parenleft,              5,     bracketleft,       Greek_PI ] };
    key <AE06> { [           minus,              6,             bar,    Greek_SIGMA ] };
    key <AE07> { [          egrave,              7,      dead_grave,      Greek_PHI ] };
    key <AE08> { [      underscore,              8,       backslash,      Greek_PSI ] };
    key <AE09> { [        ccedilla,              9,       plusminus,       Ccedilla ] };
    key <AE10> { [          agrave,              0,              at,    Greek_OMEGA ] };
    key <AE11> { [      parenright, dead_abovering,    bracketright,         ssharp ] };
    key <AE12> { [           equal,           plus,      braceright,        notsign ] };

    // Second row
    // Handling the C'H key correctly requires an inputmethod (XIM)
    // See https://bugs.freedesktop.org/show_bug.cgi?id=19506
 // key <AD01> { [    trigraph_c_h,   trigraph_C_h,    trigraph_C_H,    Greek_alpha ] };
    key <AD01> { [           UF8FD,          UF8FE,           UF8FF,    Greek_alpha ] };
    key <AD02> { [               w,              W,     Greek_omega,    Greek_omega ] };
    key <AD03> { [               e,              E,        EuroSign,  Greek_epsilon ] };
    key <AD04> { [               r,              R,       Greek_rho,      Greek_rho ] };
    key <AD05> { [               t,              T,       Greek_tau,      Greek_tau ] };
    key <AD06> { [               y,              Y,       Greek_psi,      Greek_psi ] };
    key <AD07> { [               u,              U,   Greek_upsilon,  Greek_upsilon ] };
    key <AD08> { [               i,              I,        idotless,     Greek_iota ] };
    key <AD09> { [               o,              O,              oe,             OE ] };
    key <AD10> { [               p,              P,        Greek_pi,       Greek_pi ] };
    key <AD11> { [ dead_circumflex, dead_diaeresis,   guillemotleft,            yen ] };
    key <AD12> { [           slash,       asterisk,  guillemotright,       sterling ] };

    // Third row
    key <AC01> { [               a,              A,              ae,             AE ] };
    key <AC02> { [               s,              S,     Greek_sigma,    Greek_sigma ] };
    key <AC03> { [               d,              D,          dollar,    Greek_delta ] };
    key <AC04> { [               f,              F,       Greek_phi,      Greek_phi ] };
    key <AC05> { [               g,              G,     Greek_gamma,    Greek_gamma ] };
    key <AC06> { [               h,              H,       Greek_eta,      Greek_eta ] };
    key <AC07> { [               j,              J, Greek_finalsmallsigma, Greek_finalsmallsigma ] };
    key <AC08> { [               k,              K,       Greek_kappa,  Greek_kappa ] };
    key <AC09> { [               l,              L,       Greek_lamda, Greek_lambda ] };
    key <AC10> { [               m,              M,          Greek_mu,     Greek_mu ] };
    key <AC11> { [          ugrave,         Ugrave,            ubreve,   registered ] };
    key <BKSL> { [        question,         exclam,      questiondown,   exclamdown ] };

    // Fourth row
    key <LSGT> { [               q,              Q,            less,    Greek_theta ] };
    key <AB01> { [               z,              Z,         greater,     Greek_zeta ] };
    key <AB02> { [               x,              X,        Greek_xi,       Greek_xi ] };
    key <AB03> { [               c,              C,            cent,      Greek_chi ] };
    key <AB04> { [               v,              V                                  ] };
    key <AB05> { [               b,              B,      Greek_beta,     Greek_beta ] };
    key <AB06> { [               n,              N,        Greek_nu,       Greek_nu ] };
    // Handling the CH key correctly requires an inputmethod (XIM)
    // See https://bugs.freedesktop.org/show_bug.cgi?id=19506
 // key <AB07> { [      digraph_ch,     digraph_Ch,      digraph_CH,  Greek_omicron ] };
    key <AB07> { [           UF8FA,          UF8FB,           UF8FC,  Greek_omicron ] };
    key <AB08> { [          ntilde,         Ntilde                                  ] };
    key <AB09> { [          period,          colon,         section,      copyright ] };
    key <AB10> { [           comma,      semicolon,         percent                 ] };

    key <SPCE> { [           space,   nobreakspace,           space,   nobreakspace ] };

    include "level3(ralt_switch)"
};

// Occitan layout
// Author : 2009 Thomas Metz <tmetz @ free.fr>
// Derived from the layout defined at http://www.panoccitan.org
// Version: 0.1
// Differences from OSS French keyboard :
// - add á, í, ò, ó et ú, Á, Í, Ò, Ó, Ú, ñ, Ñ
// - change position of æ, ü, î, û, œ, ô, ö, ï, â, ë
//
// ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┲━━━━━━━━━┓
// │ ³ ¸ │ 1 ̨  │ 2 É │ 3 ˘ │ 4 — │ 5 – │ 6 ‑ │ 7 È │ 8 ™ │ 9 Ç │ 0 À │ ° ≠ │ + ± ┃ ⌫ Retour┃
// │ ² ¹ │ & ˇ │ é ~ │ " # │ ' { │ ( [ │ - | │ è ` │ _ \ │ ç ^ │ à @ │ ) ] │ = } ┃  arrière┃
// ┢━━━━━┷━┱───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┺━┳━━━━━━━┫
// ┃       ┃ A Á │ Z Æ │ E ¢ │ R Ê │ T Ë │ Y Û │ U Ú │ I Í │ O Ó │ P Ò │ ¨ Œ │ £ Ø ┃Entrée ┃
// ┃Tab ↹  ┃ a á │ z æ │ e € │ r ê │ t ë │ y û │ u ú │ i í │ o ó │ p ò │ ^ œ │ $ ø ┃   ⏎   ┃
// ┣━━━━━━━┻┱────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┺┓      ┃
// ┃        ┃ Q Ä │ S „ │ D Â │ F ‚ │ G ¥ │ H Ü │ J Î │ K Ï │ L Ô │ M Ö │ % Ù │ µ ̄  ┃      ┃
// ┃Maj ⇬   ┃ q ä │ s ß │ d â │ f ‘ │ g ’ │ h ü │ j î │ k ï │ l ô │ m ö │ ù ' │ * ` ┃      ┃
// ┣━━━━━━━┳┹────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┲┷━━━━━┻━━━━━━┫
// ┃       ┃ > ≥ │ W “ │ X ” │ C ® │ V ← │ B ↑ │ N Ñ │ ? … │ . . │ / ∕ │ § − ┃             ┃
// ┃Shift ⇧┃ < ≤ │ w « │ x » │ c © │ v → │ b ↓ │ n ñ │ , ¿ │ ; × │ : ÷ │ ! ¡ ┃Shift ⇧      ┃
// ┣━━━━━━━╋━━━━━┷━┳━━━┷━━━┱─┴─────┴─────┴─────┴─────┴─────┴───┲━┷━━━━━╈━━━━━┻━┳━━━━━━━┳━━━┛
// ┃       ┃       ┃       ┃ ␣         Espace fine insécable ⍽ ┃       ┃       ┃       ┃
// ┃Ctrl   ┃Meta   ┃Alt    ┃ ␣ Espace       Espace insécable ⍽ ┃AltGr ⇮┃Menu   ┃Ctrl   ┃
// ┗━━━━━━━┻━━━━━━━┻━━━━━━━┹───────────────────────────────────┺━━━━━━━┻━━━━━━━┻━━━━━━━┛
partial alphanumeric_keys
xkb_symbols "oci" {

    include "fr(oss)"

    name[Group1]= "Occitan";

    key <AD01>	{ [                a,                A,               aacute,                Aacute ] }; // a A á Á
    key <AD02>	{ [                z,                Z,                   ae,                    AE ] }; // z Z æ Æ
    key <AD05>	{ [                t,                T,           ediaeresis,            Ediaeresis ] }; // t T ë Ë
    key <AD06>	{ [                y,                Y,          ucircumflex,           Ucircumflex ] }; // y Y û Û
    key <AD07>	{ [                u,                U,               uacute,                Uacute ] }; // u U ú Ú
    key <AD08>	{ [                i,                I,               iacute,                Iacute ] }; // i I í Í
    key <AD09>	{ [                o,                O,               oacute,                Oacute ] }; // o O ó Ó
    key <AD10>	{ [                p,                P,               ograve,                Ograve ] }; // p P ò Ò
    key <AD11>	{ [  dead_circumflex,   dead_diaeresis,                   oe,                    OE ] }; // ^ ̈ ̃ œ Œ

    key <AC03>	{ [                d,                D,          acircumflex,           Acircumflex ] }; // d D â Â
    key <AC06>	{ [                h,                H,           udiaeresis,            Udiaeresis ] }; // h H ü Ü
    key <AC07>	{ [                j,                J,          icircumflex,           Icircumflex ] }; // j J î Î
    key <AC08>	{ [                k,                K,           idiaeresis,            Idiaeresis ] }; // k K ï Ï
    key <AC09>	{ [                l,                L,          ocircumflex,           Ocircumflex ] }; // l L ô Ô

    key <AB04>  { [                v,                V,           rightarrow,             leftarrow ] }; // v V → ←
    key <AB06>  { [                n,                N,               ntilde,                Ntilde ] }; // n N ñ Ñ
};

// Marc.Shapiro@inria.fr 19-sep-1998
// modifications : Etienne Herlent <eherlent@linux-france.org> june 2000
// adapted to the new input layer :
//        Martin Costabel <costabel@wanadoo.fr> 3-jan-2001
// adapted for Latin9 alphabet (ISO-8859-15):
//        Etienne Herlent <eherlent@linux-france.org> march 2005

// This map is an almost-complete mapping of the standard French
// MacIntosh keyboard under Xwindows.  I tried to remain as faithful
// as possible to the Mac meaning of each key.	I did this entirely by
// hand and by intuition, relying on the Clavier (Keyboard?) Desktop
// Accessory for the Mac meaning of keys, and on reading keysymdef.h
// to intuit the corresponding X names.	 Lacking proper documentation,
// I may have made some mistakes.

// Entries marked CHECK are particularly uncertain

// Entries marked MISSING mark Mac characters for which I was unable
// to find a corresponding keysym.  (Some for sure don't: e.g. the
// Apple mark and the oe/OE character; others I may have simply not
// found.)

// Copied from macintosh_vndr/fr
partial alphanumeric_keys
xkb_symbols "mac" {

    name[Group1]= "French (Macintosh)";

    key <TLDE> {	[          at, numbersign, periodcentered,  Ydiaeresis	]	}; // MISSING: Ydiaeresis; eherlent : ok in Latin9
    key <AE01> {	[   ampersand,    1,   VoidSymbol,    dead_acute	]	}; // MISSING: Apple
    key <AE02> {	[      eacute,    2,   ediaeresis,        Eacute	]	};
    key <AE03> {	[    quotedbl,    3,   VoidSymbol,    VoidSymbol	] 	}; // CHECK all quotemarks
    key <AE04> {	[  apostrophe,    4,   VoidSymbol,    VoidSymbol	] 	};
    key <AE05> {	[   parenleft,    5,    braceleft,   bracketleft	]	};
 // CHECK section
    key <AE06> {	[     section,    6,    paragraph,         aring	]	};
    key <AE07> {	[      egrave,    7, guillemotleft, guillemotright	]	};
    key <AE08> {	[      exclam,    8,   exclamdown,   Ucircumflex	]	};
    key <AE09> {	[    ccedilla,    9,     Ccedilla,        Aacute	]	};
    key <AE10> {	[      agrave,    0,       oslash,    VoidSymbol	]	}; // MISSING: Oslash
    key <AE11> {	[  parenright, degree, braceright,  bracketright	]	};
    key <AE12> {	[       minus, underscore, emdash,        endash	]	}; // CHECK dashes

    key <AD01> {	[           a,  A,           ae,          AE	]	};
    key <AD02> {	[           z,  Z,  Acircumflex,       Aring	]	};
    key <AD03> {	[           e,  E,  ecircumflex, Ecircumflex	]	};
    key <AD04> {	[           r,  R,   registered,    currency	]	};
    key <AD05> {	[           t,  T,   VoidSymbol,  VoidSymbol	]	};
    key <AD06> {	[           y,  Y,       Uacute,  Ydiaeresis	]	}; // MISSING: Ydiaeresis; eherlent : ok in Latin9
    key <AD07> {	[           u,  U,   VoidSymbol, ordfeminine	]	}; // MISSING: ordmasculine?
    key <AD08> {	[           i,  I,  icircumflex,  idiaeresis	]	};
    key <AD09> {	[           o,  O,           oe,          OE	]	}; // MISSING: oe, OE lacking in Latin1; eherlent ok in Latin9
    key <AD10> {	[           p,  P,   VoidSymbol,  VoidSymbol	]	};
    key <AD11> {	[dead_circumflex,dead_diaeresis, ocircumflex, Ocircumflex	]	};
    key <AD12> {	[      dollar, asterisk,   EuroSign, yen	]	}; // eherlent : EuroSign in Latin9

    key <AC01> {	[         q, Q, acircumflex,         Agrave	]	};
    key <AC02> {	[         s, S,      Ograve,     VoidSymbol	]	};
    key <AC03> {	[         d, D,  VoidSymbol,     VoidSymbol	]	};
    key <AC04> {	[         f, F,  VoidSymbol, periodcentered	]	}; // MISSING: oblong script f??
    key <AC05> {	[         g, G,  VoidSymbol,     VoidSymbol	]	}; // MISSING: kerned fi, fl
    key <AC06> {	[         h, H,      Igrave,    Icircumflex	]	};
    key <AC07> {	[         j, J,  Idiaeresis,         Iacute	]	};
    key <AC08> {	[         k, K,      Egrave,     Ediaeresis	]	};
    key <AC09> {	[         l, L,     notsign,            bar	]	};
    key <AC10> {	[         m, M,          mu,         Oacute	]	};
    key <AC11> {	[    ugrave,percent, Ugrave,    ucircumflex	]	}; // MISSING: per-mille
    key <BKSL> {	[ dead_grave, sterling,  at,     numbersign	]	};

    key <LSGT> {	[      less, greater, VoidSymbol, VoidSymbol	]	};
    key <AB01> {	[         w, W, VoidSymbol,   VoidSymbol	]	}; // MISSING: half-guillemot (single angle bracket)
    key <AB02> {	[         x, X, VoidSymbol,   VoidSymbol	]	}; // CHECK similarequal; MISSING: extra-slanted slash
    key <AB03> {	[         c, C,  copyright,         cent	]	};
    key <AB04> {	[         v, V,    diamond,  leftradical	]	}; // CHECK diamond, leftradical
    key <AB05> {	[         b, B,     ssharp,        U1E9E	]	}; // CHECK: Greek_beta or ssharp?; MISSING: oblong script s
    key <AB06> {	[         n, N,  dead_tilde,  asciitilde	]	};
    key <AB07> {	[     comma,  question, VoidSymbol,  questiondown	]	};
    key <AB08> {	[ semicolon,  period, VoidSymbol,  periodcentered	]	};
    key <AB09> {	[     colon,  slash,   division,        backslash	]	};
    key <AB10> {	[     equal,   plus, VoidSymbol,        plusminus	]	};

    key <SPCE> {	[     space,  space, nobreakspace,   nobreakspace	]	};

    key <KPDL> {	[  comma,KP_Decimal	]	};

    include "level3(ralt_switch)"
};

partial alphanumeric_keys
xkb_symbols "geo" {
    include "ge(basic)"

    name[Group1]= "Georgian (France, AZERTY Tskapo)";

    key <TLDE> { [ exclam, noSymbol ] };
    key <AE01> { [ 0x0100201e, 1 ] };
    key <AE02> { [ 0x01002116, 2 ] };
    key <AE03> { [ percent, 3    ] };
    key <AE04> { [ parenleft, 4  ] };
    key <AE05> { [ colon, 5      ] };
    key <AE06> { [ semicolon, 6  ] };
    key <AE07> { [ question, 7   ] };
    key <AE08> { [ 0x01002116, 8 ] };
    key <AE09> { [ degree, 9     ] };
    key <AE10> { [ parenright, 0 ] };
    key <AE11> { [ minus, underscore, 0x01002014 ] };
    key <AE12> { [ less, greater ] };

    key <AD01> { [ Georgian_an,    0x010010fa     ] };
    key <AD02> { [ Georgian_zen,   Z              ] };
    key <AD03> { [ Georgian_en,    E, Georgian_he ] };
    key <AD04> { [ Georgian_rae,   0x010000ae     ] };
    key <AD05> { [ Georgian_tar,   T              ] };
    key <AD06> { [ Georgian_qar,   0x010010f8     ] };
    key <AD07> { [ Georgian_un,    U              ] };
    key <AD08> { [ Georgian_in,    Georgian_hie   ] };
    key <AD09> { [ Georgian_on,    O              ] };
    key <AD10> { [ Georgian_par,   P              ] };
    key <AD11> { [ Georgian_tan,   T              ] };
    key <AD12> { [ Georgian_jil,   Z              ] };

    key <AC01> { [ Georgian_khar,  Q              ] };
    key <AC02> { [ Georgian_san,   S              ] };
    key <AC03> { [ Georgian_don,   D              ] };
    key <AC04> { [ Georgian_phar,  Georgian_fi    ] };
    key <AC05> { [ Georgian_gan,   0x010010f9     ] };
    key <AC06> { [ Georgian_hae,   Georgian_hoe   ] };
    key <AC07> { [ Georgian_jhan,  0x010010f7     ] };
    key <AC08> { [ Georgian_kan,   K              ] };
    key <AC09> { [ Georgian_las,   L              ] };
    key <AC10> { [ Georgian_man,   M              ] };
    key <AC11> { [ Georgian_zhar,  J              ] };
    key <BKSL> { [ Georgian_chin,  0x010000a9     ] };

    key <LSGT> { [ guillemotleft,  guillemotright ] };
    key <AB01> { [ Georgian_cil,   W              ] };
    key <AB02> { [ Georgian_xan,   Georgian_har   ] };
    key <AB03> { [ Georgian_can,   0x010000a9     ] };
    key <AB04> { [ Georgian_vin,   Georgian_we    ] };
    key <AB05> { [ Georgian_ban,   B              ] };
    key <AB06> { [ Georgian_nar,   0x010010fc     ] };
    key <AB07> { [ comma,          0x01002014     ] };
    key <AB08> { [ Georgian_shin,  S              ] };
    key <AB09> { [ Georgian_ghan,  noSymbol       ] };
    key <AB10> { [ Georgian_char,  noSymbol       ] };
};

// US keyboard made French
//
// Copyright (C) 2018, Florent Gallaire <f@gallai.re>
partial alphanumeric_keys
xkb_symbols "us" {

    include "us(basic)"
    name[Group1]= "French (US)";


    key <TLDE> { [     grave, asciitilde,    dead_grave                   ] };
    key <AE06> { [         6,asciicircum,dead_circumflex                  ] };

    key <AB01> { [	   z,          Z,   acircumflex,      Acircumflex ] }; // â Â
    key <AB03> { [	   c,          C,      ccedilla,         Ccedilla ] }; // ç Ç

    key <AC01> { [	   a,          A,        agrave,           Agrave ] }; // à À
    key <AC02> { [	   s,          S,            ae,               AE ] }; // æ Æ
    key <AC03> { [	   d,          D,   ecircumflex,      Ecircumflex ] }; // ê Ê
    key <AC04> { [	   f,          F,    ediaeresis,       Ediaeresis ] }; // ë Ë
    key <AC06> { [	   h,          H,    udiaeresis,       Udiaeresis ] }; // ü Ü
    key <AC07> { [	   j,          J,   ucircumflex,      Ucircumflex ] }; // û Û
    key <AC08> { [	   k,          K,   icircumflex,      Icircumflex ] }; // î Î
    key <AC11> { [apostrophe,   quotedbl,dead_diaeresis,           degree ] };

    key <AD03> { [	   e,          E,        eacute,           Eacute ] }; // é É
    key <AD04> { [	   r,          R,        egrave,           Egrave ] }; // è È
    key <AD06> { [	   y,          Y,    ydiaeresis,       Ydiaeresis ] }; // ÿ Ÿ
    key <AD07> { [	   u,          U,        ugrave,           Ugrave ] }; // ù Ù
    key <AD08> { [	   i,          I,    idiaeresis,       Idiaeresis ] }; // ï Ï
    key <AD09> { [	   o,          O,   ocircumflex,      Ocircumflex ] }; // ô Ô
    key <AD10> { [	   p,          P,            oe,               OE ] }; // œ Œ
    key <AD11> { [ bracketleft,  braceleft,  guillemotleft,  leftdoublequotemark ] }; // « “
    key <AD12> { [bracketright, braceright, guillemotright, rightdoublequotemark ] }; // » ”

    key <AE04> { [        4,     dollar,      EuroSign,         currency ] }; // € ¤

    include "level3(ralt_switch)"
    include "eurosign(5)"
};

// EXTRAS:

partial alphanumeric_keys
	xkb_symbols "sun_type6" {
	include "sun_vndr/fr(sun_type6)"
};


partial alphanumeric_keys
xkb_symbols "azerty" {
    name[Group1]="French (AZERTY)";

    include "level3(ralt_switch)"

// French AZERTY-Keyboard layout
// Author : 2015, Mats Blakstad <mats @ globalbility.org>
// Based on the layout at https://en.wikipedia.org/wiki/File:KB_France.svg

// LAYOUT OVERVIEW                              
//  ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ ____ _______
// |    | 1  | 2  | 3  | 4  | 5  | 6  | 7  | 8  | 9  | 0  | °  | +  | <--   |
// | ²  | &  | é ~| " #| ' {| ( [| - || è `| _ \| ç ^| à @| ) ]| = }|       |
//  ========================================================================
// | |<-  | A  | Z  | E  | R  | T  | Y  | U  | I  | O  | P  | ¨  | $  |   , |
// |  ->| | a  | z  | e €| r  | t  | y  | u  | i  | o  | p  | ^  | £ ¤| <-' |
//  ===================================================================¬    |
// |       | Q  | S  | D  | F  | G  | H  | J  | K  | L  | M  | %  | µ  |    |
// | MAJ   | q  | s  | d  | f  | g  | h  | j  | k  | l  | m  | ù  | *  |    |
//  ========================================================================
// | ^   | >  | W  | X  | C  | V  | B  | N  | ?  | .  | /  | §  |     ^     |
// | |   | <  | w  | x  | c  | v  | b  | n  | ,  | ;  | :  | !  |     |     |
//  ========================================================================
// |      |      |      |                       |       |      |     |      |
// | Ctrl | Super| Alt  | Space    Nobreakspace | AltGr | Super|Menu | Ctrl |
//  ¯¯¯¯¯¯ ¯¯¯¯¯¯ ¯¯¯¯¯¯ ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ ¯¯¯¯¯¯¯ ¯¯¯¯¯¯ ¯¯¯¯¯ ¯¯¯¯¯¯

    // First row
    key <TLDE>	{ [	twosuperior 						] };
    key <AE01>	{ [	ampersand,	1 					] };
    key <AE02> { [	eacute,		2,		asciitilde	 	] };
    key <AE03>	{ [	quotedbl,	3,		numbersign		] };
    key <AE04>	{ [	apostrophe,	4,		braceleft		] };
    key <AE05>	{ [	parenleft,	5,		bracketleft		] };
    key <AE06>	{ [	minus,		6,		bar			] };
    key <AE07>	{ [	egrave,		7,		grave			] };
    key <AE08>	{ [	underscore, 	8,		backslash		] };
    key <AE09>	{ [	ccedilla, 	9,		asciicircum		] };
    key <AE10>	{ [	agrave,		0,		at			] };
    key <AE11>	{ [	parenright,	degree,		bracketright		] };
    key <AE12>	{ [	equal,		plus,		braceright		] };

    // Second row
    key <AD01>	{ [	a,		A					] };
    key <AD02>	{ [	z,		Z				 	] };
    key <AD03>	{ [	e,		E,		EuroSign		] };	
    key <AD04>	{ [	r,		R				 	] };
    key <AD05>	{ [	t,		T					] };
    key <AD06>	{ [	y,		Y					] };	
    key <AD07>	{ [	u,		U					] };	
    key <AD08>	{ [	i,		I					] };	
    key <AD09>	{ [	o,		O					] };	
    key <AD10>	{ [	p,		P					] };
    key <AD11>	{ [	dead_circumflex,dead_diaeresis				] };
    key <AD12>	{ [	dollar,		sterling,	currency		] };	

    // Third row
    key <AC01>	{ [	q,		Q					] };
    key <AC02>	{ [	s,		S				 	] };
    key <AC03>	{ [	d,		D					] };	
    key <AC04>	{ [	f,		F					] };
    key <AC05>	{ [	g,		G					] };	
    key <AC06>	{ [	h,		H				 	] };
    key <AC07>	{ [	j,		J					] };
    key <AC08>	{ [	k,		K					] };
    key <AC09>	{ [	l,		L					] };
    key <AC10>	{ [	m,		M					] };	
    key <AC11>	{ [	ugrave,		percent					] };
    key <BKSL>  { [	asterisk,	mu					] };

    // Fourth row
    key <LSGT>	{ [	less,		greater					] };
    key <AB01>	{ [	w,		W					] };
    key <AB02>	{ [	x,		X					] };
    key <AB03>	{ [	c,		C					] };
    key <AB04>	{ [	v,		V					] };	
    key <AB05>  { [	b,		B				 	] };
    key <AB06>	{ [	n,		N				 	] };
    key <AB07>	{ [	comma,		question				] };
    key <AB08>	{ [ 	semicolon,	period					] };
    key <AB09>	{ [ 	colon,		slash					] };
    key <AB10>	{ [	exclam,		section					] };
};

// US keyboard made French (with dead keys, alternative)
//
// Copyright (C) 2018, Florent Gallaire <f@gallai.re>

partial alphanumeric_keys
xkb_symbols "us-alt" {

    include "us(basic)"
    name[Group1]= "French (US with dead keys, alt.)";

    key <AB03> { [         c,          C,      ccedilla,         Ccedilla ] }; // ç Ç

    key <AC01> { [         a,          A,            ae,               AE ] }; // æ Æ
    key <AC11> { [dead_diaeresis, quotedbl,  apostrophe ] };

    key <AD03> { [         e,          E,        eacute,           Eacute ] }; // é É
    key <AD09> { [         o,          O,            oe,               OE ] }; // œ Œ
    key <AD11> { [ bracketleft,  braceleft,  guillemotleft,  leftdoublequotemark ] }; // « “
    key <AD12> { [bracketright, braceright, guillemotright, rightdoublequotemark ] }; // » ”

    key <TLDE> { [dead_grave, asciitilde,         grave ] };
    key <AE06> { [dead_circumflex, asciicircum,       6 ] };
    key <AE04> { [         4,     dollar,      EuroSign,         currency ] }; // € ¤

    include "level3(ralt_switch)"
    include "eurosign(5)"
};

// For physically modified US keyboard (Q <-> A, W <-> Z and ; <-> M)
//
// Copyright (C) 2018, Florent Gallaire <f@gallai.re>

partial alphanumeric_keys
xkb_symbols "us-azerty" {

    include "us"
    name[Group1]= "French (US, AZERTY)";

    key <AB01> { [         w,          W, guillemotleft, leftdoublequotemark ] }; // « “
    key <AB02> { [         x,          X,guillemotright,rightdoublequotemark ] }; // » ”
    key <AB07> { [ semicolon,      colon                                  ] };

    key <AC01> { [         q,          Q                                  ] };
    key <AC10> { [         m,          M                                  ] };
    key <AC11> { [apostrophe,   quotedbl,        ugrave,           Ugrave ] }; // ù Ù

    key <AD01> { [         a,          A,            ae,               AE ] }; // æ Æ
    key <AD02> { [         z,          Z                                  ] };
    key <AD09> { [         o,          O,            oe,               OE ] }; // œ Œ
    key <AD11> { [bracketleft, braceleft,dead_circumflex,  dead_diaeresis ] };

    key <TLDE> { [     grave, asciitilde,    dead_grave                   ] };
    key <AE02> { [         2,         at,        eacute,           Eacute ] }; // é É
    key <AE04> { [         4,     dollar,      currency                   ] }; // ¤
    key <AE06> { [         6,asciicircum,dead_circumflex                  ] };
    key <AE07> { [         7,  ampersand,        egrave,           Egrave ] }; // è È
    key <AE09> { [         9,  parenleft,      ccedilla,         Ccedilla ] }; // ç Ç
    key <AE10> { [         0, parenright,        agrave,           Agrave ] }; // à À

    include "eurosign(e)"
    include "level3(ralt_switch)"
};

// Unicode French standardized new azerty
// Defined by the French national organization for standardization (AFNOR) in norm NF Z71-300 (http://norme-azerty.fr/)
//
// Credits
//   © 2019 Cimbali <me @ cimba.li>
//
// ┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┲━━━━━━━━━┓
// │ # ̑  │ 1 À │ 2 É │ 3 È │ 4 Ê │ 5 ̋  │ 6 ̏  │ 7   │ 8 — │ 9 ‹ │ 0 › │ " ˚ │ ¨   ┃ ⌫ Retour┃
// │ @ ̆̆̆  ̆│ à § │ é  ́ │ è  ̀ │ ê & │ ( [ │ ) ] │ ‘ ̄̄  │ ’ _ │ « “ │ » ” │ ' ° │ ̂  ̌̌̌  ┃  arrière┃
// ┢━━━━━┷━┱───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┴─┬───┺━┳━━━━━━━┫
// ┃       ┃ A Æ │ Z   │ E   │ R   │ T ™ │ Y   │ U Ù │ I  ̣ │ O Œ │ P ‰ │ – ‑ │ ± ‡ ┃Entrée ┃
// ┃Tab ↹  ┃ a æ │ z £ │ e € │ r ® │ t { │ y } │ u ù │ i ̇  │ o œ │ p % │ - − │ + † ┃   ⏎   ┃
// ┣━━━━━━━┻┱────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┴┬────┺┓      ┃
// ┃        ┃ Q   │ S ẞ │ D   │ F   │ G   │ H ̱  │ J   │ K   │ L   │ M   │ \ √ │ ½ ¼ ┃      ┃
// ┃Maj ⇬   ┃ q θ │ s ß │ d $ │ f ¤ │ g µ │ h   │ j   │ k ̷  │ l | │ m ∞ │ / ÷ │ * × ┃      ┃
// ┣━━━━━━━┳┹────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┬┴────┲┷━━━━━┻━━━━━━┫
// ┃       ┃ > ≥ │ W Ʒ │ X   │ C Ç │ V ˛ │ B   │ N   │ ?   │ !  ̦ │ …   │ = ≠ ┃             ┃
// ┃Shift ⇧┃ < ≤ │ w ʒ │ x © │ c ç │ v ¸ │ b  ̵ │ n ~ │ . ¿ │ , ¡ │ : · │ ; ≃ ┃Shift ⇧      ┃
// ┣━━━━━━━╋━━━━━┷━┳━━━┷━━━┱─┴─────┴─────┴─────┴─────┴─────┴───┲━┷━━━━━╈━━━━━┻━┳━━━━━━━┳━━━┛
// ┃       ┃       ┃       ┃ ␣         Espace fine insécable ⍽ ┃       ┃       ┃       ┃
// ┃Ctrl   ┃Meta   ┃Alt    ┃ ␣ Espace       Espace insécable ⍽ ┃AltGr ⇮┃Menu   ┃Ctrl   ┃
// ┗━━━━━━━┻━━━━━━━┻━━━━━━━┹───────────────────────────────────┺━━━━━━━┻━━━━━━━┻━━━━━━━┛
partial alphanumeric_keys
xkb_symbols "afnor" {

    include "latin"
    include "level3(ralt_switch)"
    include "nbsp(level3n)"
    include "keypad(oss)"

    name[Group1]="French (AZERTY, AFNOR)";

     // First row
     key <TLDE> { [                  at,      numbersign,               dead_breve,   dead_invertedbreve ] }; // @ # ̑  ̆̆̆  //
     key <AE01> { [              agrave,               1,                  section,               Agrave ] }; // à 1 § À
     key <AE02> { [              eacute,               2,               dead_acute,               Eacute ] }; // é 2  ́ É
     key <AE03> { [              egrave,               3,               dead_grave,               Egrave ] }; // è 3  ̀ È
     key <AE04> { [         ecircumflex,               4,                ampersand,          Ecircumflex ] }; // ê 4 & Ê
     key <AE05> { [           parenleft,               5,              bracketleft,     dead_doubleacute ] }; // ( 5 [
     key <AE06> { [          parenright,               6,             bracketright,     dead_doublegrave ] }; // ) 6 ]
     key <AE07> { [ leftsinglequotemark,               7,              dead_macron,           VoidSymbol ] }; // ‘ 7
     key <AE08> { [rightsinglequotemark,               8,               underscore,               emdash ] }; // ’ 8 _ —
     key <AE09> { [       guillemotleft,               9,      leftdoublequotemark,           VoidSymbol ] }; // « 9 “ ‹
     key <AE10> { [      guillemotright,               0,     rightdoublequotemark,           VoidSymbol ] }; // » 0 ” ›
     key <AE11> { [          apostrophe,        quotedbl,                   degree,       dead_abovering ] }; // ' " °
     key <AE12> { [     dead_circumflex,  dead_diaeresis,               dead_caron,           VoidSymbol ] }; // ̂  ¨ ̌̌̌    //

     // Second row
     key <AD01> { [                   a,               A,                       ae,                   AE ] }; // a A æ Æ
     key <AD02> { [                   z,               Z,                 sterling,           VoidSymbol ] }; // z Z £
     key <AD03> { [                   e,               E,                 EuroSign,           VoidSymbol ] }; // e E €
     key <AD04> { [                   r,               R,               registered,           VoidSymbol ] }; // r R ®
     key <AD05> { [                   t,               T,                braceleft,            trademark ] }; // t T { ™
     key <AD06> { [                   y,               Y,               braceright,           VoidSymbol ] }; // y Y }
     key <AD07> { [                   u,               U,                   ugrave,               Ugrave ] }; // u U ù Ù
     key <AD08> { [                   i,               I,            dead_abovedot,        dead_belowdot ] }; // i I ̇   ̣ //
     key <AD09> { [                   o,               O,                       oe,                   OE ] }; // o O œ Œ
     key <AD10> { [                   p,               P,                  percent,             permille ] }; // p P % ‰
     key <AD11> { [               minus,          endash,                0x1002212,            0x1002011 ] }; // - – − ‑ // signe moins (minus sign), trait d'union insécable (non-breaking hyphen)
     key <AD12> { [                plus,       plusminus,                   dagger,         doubledagger ] }; // + ± † ‡

     // Third row
     key <AC01> { [                   q,               Q,              Greek_theta,           VoidSymbol ] }; // q Q θ
     key <AC02> { [                   s,               S,                   ssharp,            0x1001E9E ] }; // s S ß ẞ // lettre majuscule latine S dur (latin capital letter sharp s)
     key <AC03> { [                   d,               D,                   dollar,           VoidSymbol ] }; // d D $
     key <AC04> { [                   f,               F,            dead_currency,           VoidSymbol ] }; // f F ¤
     key <AC05> { [                   g,               G,               dead_greek,           VoidSymbol ] }; // g G µ
     key <AC06> { [                   h,               H,               VoidSymbol,     dead_belowmacron ] }; // h H   ̱  // Missing dead key for other european keys (ªəƏþÞıİºſðÐƞȠĳĲ)
     key <AC07> { [                   j,               J,               VoidSymbol,           VoidSymbol ] }; // j J
     key <AC08> { [                   k,               K,  dead_longsolidusoverlay,           VoidSymbol ] }; // k K ̷    //
     key <AC09> { [                   l,               L,                      bar,           VoidSymbol ] }; // l L |
     key <AC10> { [                   m,               M,                 infinity,           VoidSymbol ] }; // m M ∞
     key <AC11> { [               slash,       backslash,                 division,              radical ] }; // / \ ÷ √
     key <BKSL> { [            asterisk,         onehalf,                 multiply,           onequarter ] }; // * ½ × ¼

     // Fourth row
     key <LSGT> { [                less,         greater,            lessthanequal,    greaterthanequal ] }; // < > ≤ ≥
     key <AB01> { [                   w,               W,                      ezh,                 EZH ] }; // w W ʒ Ʒ
     key <AB02> { [                   x,               X,                copyright,          VoidSymbol ] }; // x X ©
     key <AB03> { [                   c,               C,                 ccedilla,            Ccedilla ] }; // c C ç Ç
     key <AB04> { [                   v,               V,             dead_cedilla,         dead_ogonek ] }; // v V ̧  ̨  //
     key <AB05> { [                   b,               B,              dead_stroke,          VoidSymbol ] }; // b B ̵    //
     key <AB06> { [                   n,               N,               dead_tilde,          VoidSymbol ] }; // n N ~
     key <AB07> { [              period,        question,             questiondown,          VoidSymbol ] }; // . ? ¿
     key <AB08> { [               comma,          exclam,               exclamdown,     dead_belowcomma ] }; // , ! ¡ ̦  //
     key <AB09> { [               colon,        ellipsis,           periodcentered,          VoidSymbol ] }; // : … ·
     key <AB10> { [           semicolon,           equal,             similarequal,            notequal ] }; // ; = ≃ ≠
};
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          OPHH    H        X    HHH    H            HHH    H            HHH    H            OIHH    H            OIH4$HH    H    LD$    L$LD$    AHE(L$HH    H    N8    H}P    H    H        HE(L$MHH    H    N8        HE(L$HH    H    AN    럹   QEH    PLH        XZ        Ћ̸ ŋKpHH    H            E1HMPSMHH    H        H[]A\A]A^A_    DGI$x  HH    H            EHLH    H    H$    L$    IAHH    H            HH    H            QMIRH    H    P    H    HHH    H            H    H            HH    H            I$x  HL$H    H        D$    I$x  H    H            HP  H    H            RHx  HASH    H        XZ    Hx  LH    H            Hx  AHH    H            HP  H    H            LLH    H            HOHH    H            HH    H               LGHAH    H        HH    H               LX  HH    LGH            HSHH    H            HSHH    H            DD$D\$H    H        L$DT$    uwH[]A\A]A^A_    SD$H    EHH    PA    ^_    \$\$   H    H        L$DT$)AADDH    H    PDD$E      AXYH    H            DHH    H            HH    H            HH    H            DKtDCpHH    AWAUH        X    E1IOPRMLH    H    A    [    LH    H            IOPELH    H            HH    H            DMLEHH    H        H<$        LH    H            DMLEP   HH    H        H|$    A[    jHH    H        H|$    AZ!H    HH        H<$    A    DKtDCpAUHLH    H        Y    DMLEV   RH    HH    P    H|$    H    H    IV%   Ep  H    H    ADBPLA    X    H    뿋$AALH    H        A    $ALH    H    DL$    DL$    H        H3H    H    H    A    $ALH    H    DL$    DL$    MD$HLHH    H          H    A    LJHDBpHH    HH            AVLL$IHHT$H    H        X       LGHA   H    H              H    H        1       E1E1HH    H        1           HHH    H            HH    H        H    넋KpLH    H            KpLH    H            A$   PLH    AUEL$H    MD$    ZY    A$   PLH    AD$@H    PAD$<PUEL$MD$    )   H     AD$@A$   LH    H    PAD$<PUEL$MD$    H       AVRG@HPG<PVDOH    LGH        H(    s4IU(A   L@LH    D/H                D   HH    H    H               LCHH    H               LCHH    H               H       DOHH    LGH            D   HH    H    H               LCE1HH    H            s4IU(E1H    L@LH            LHH    H            D   HH    H    H               H       LCHH    H            KIHH    H            GIt%HW(LHH    H            I        UL   HS   HV   H    PH   P   PLGH        H     t&   LCA   HH    H        ǃ      H߉H  []       LCHH    H               DKHH    LCH                D   HH    H    H            D   HH    H    H            H        1H%    D   HH    H    H               LCA   HH    H               DKHH    LCH               LCHH    H            D   HH    H    H            LCA      HH    H               DOHH    LGH                D   HH    H    H            D   HH    H    H               LCHH    H            DKLCHH    H            LCA      HH    H               DOHH    LGH                D   HH    H    H            LCA      HH    H            D   HH    H    H            DKLCHH    H               LCHH    H            LCA      HH    H            s   HIMLH    H    P    XZ    D   HH    H    H            DKLCHH    H               LCHH    H            LCA      HH    H               H?    DD$8DL$`DL\$@H    H    DT$8H    DT$8L\$@    E؉AH    H    D\$0    D\$0    A`   1HH    H            HH$HH    Lx  H    @DIxL$PA  PAU    H    DH    H                  E  EDH    H    D\$0    D\$0    QEHH    RHD$ LH      PDK        H    L\$PH    DH    PDL$hHDD$@DT$P    XDT$HL\$P    HD$(E  HH    E  H    DT$H HP    DT$    H|$ tDHD$H,DL$`DD$8H    H    HT$L\$@DT$0    DT$0L\$@       LD$(HHD$H    H        D$    $   H    HHH    PAULD$8DL$@    _AXDL$0    L$`H    L\$0H    DT$    DT$L\$0    HT$@H    L\$0H    DT$    DT$L\$0    E   LH    H    H            LLH    H            A   MGLH    H            E   LH    H    H               H  LH    H    L`AX    L`A       AMARH    LDtH    L`f    L`_    AMLH    H    f    IǛ    H    H    Iǟ        E   LH    H    H    Lh    Lh    Aw4IL$(LhH    A$   A$   L@H    PF*L        LhZ    A   MGA   LH    H    Lh    Lh    IT$(AH    H    LL        fH    H    IĞ        HH    H    I        A2MMHH    H        X    H    H    I        LH    H        I    AMARMH    DxLH    L`f    L`^    AMLH    H    f    HIǛE1    LH    H    Iǜ    HE1    AMLH    H    f    L    XE   LH    H    H            LH    H    L`X    LcXL`L    LPMLH    H    A      AMLMH    H    f        AMAUH    H    IǛf        HhIHH    H        Lh    A   MGLH    H            LLH    H        4LH    H    Iǜ            H    H            HI$   MPD	GL$A?QVH    RHH    PHL$     H     E1t$HL$IHH    H        AAX    AB  H    H    DM
PABLT$PT$DD$    XZD$LT$    LKPHMPPIHH    H    D$D$$Pt$     DT$H       L    H    H    HH      H    A    LJHDBpHH    HH            HHH    H          H    AE11HH    H            E11HH    H    A        H    A    Hu H    H    H        AE11HH    H            HKHHH    H               DLH    H            A|  A   H    H    RStRAh  RLPEOMG    H     EALLH    H        L  H[]A\A]A^A_    LKHDCpPHLH    H        AY    HLH    H        M       I$            M$   ED$pHLLH    [H    ]A\A]A^A_    ACpLKHHLDCpH    H    PASC,L\$P    H|$    H        H    C,LKHHLDCpH    H    P    H        ^             A   A   0C,LKHHLDCpH    H    P    H        Y    C,DCpHLLKHH    H    P    H        AX    C,LKHHLDCpH    H    P    H        _    E            H    H    H        1
      HH        S       H    HCuf  uHsHCHtHXfK4u)H[    HH3u   H    t[                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         f4z40x F)H#\d|/7[6gAQ0u!}-
J4|FH#R	u4ju(Q`(<zߝHY
F֢B7"TQ֮Lq5Ë>-p5ڎ7@|,OmX4*dB	Զ`-EStr-}b;rZcxgbi_device_portmap_create  cxgbi_device_portmap_cleanup  cxgbi_device_register  cxgbi_device_unregister  cxgbi_device_unregister_all  cxgbi_device_find_by_lldev  cxgbi_device_find_by_netdev  cxgbi_device_find_by_netdev_rcu  cxgbi_hbas_remove  cxgbi_hbas_add  cxgbi_sock_free_cpl_skbs  cxgbi_sock_established  cxgbi_sock_closed  cxgbi_sock_fail_act_open  cxgbi_sock_act_open_req_arp_failure  cxgbi_sock_rcv_abort_rpl  cxgbi_sock_rcv_peer_close  cxgbi_sock_rcv_close_conn_rpl  cxgbi_sock_rcv_wr_ack  cxgbi_sock_select_mss  cxgbi_sock_skb_entail  cxgbi_sock_purge_wr_queue  cxgbi_sock_check_wr_invariants  cxgbi_ddp_set_one_ppod  cxgbi_ddp_ppm_setup  cxgbi_parse_pdu_itt  cxgbi_conn_tx_open  cxgbi_conn_pdu_ready  cxgbi_conn_alloc_pdu  cxgbi_conn_init_pdu  cxgbi_conn_xmit_pdu  cxgbi_cleanup_task  cxgbi_get_conn_stats  cxgbi_set_conn_param  cxgbi_get_ep_param  cxgbi_create_conn  cxgbi_bind_conn  cxgbi_create_session  cxgbi_destroy_session  cxgbi_set_host_param  cxgbi_get_host_param  cxgbi_ep_connect  cxgbi_ep_poll  cxgbi_ep_disconnect  cxgbi_iscsi_init  cxgbi_iscsi_cleanup  cxgbi_attr_is_visible                                                                                                                                                                                                                                                                                                                                                                                                                                                                        3libcxgbi:%s: MaxRecvDataSegmentLength %u > %u.
       3libcxgbi:%s: csk 0x%p, tid %u, credit %u + %u != %u.
 6libcxgbi:%s: vlan dev %s -> %s.
      6libcxgbi:%s: ndev 0x%p, %s, NO match found.
  6libcxgbi:%s: cdev 0x%p, p#%u.
        6libcxgbi:%s: 0x%p, p%d, %s, host alloc failed.
       6libcxgbi:%s: cdev 0x%p, p#%d %s: chba 0x%p.
  6libcxgbi:%s: cdev 0x%p, p#%d %s, host add failed.
    6libcxgbi:%s: cdev 0x%p, tag 0x%x/0x%x, -> 0x%x(0x%x,0x%x).
   6libcxgbi:%s: csk 0x%p, cid %d.
       6libcxgbi:%s: task 0x%p,0x%p, tcp_task 0x%p, tdata 0x%p/0x%p.
 6libcxgbi:%s: task 0x%p, skb 0x%p, itt 0x%x.
  6libcxgbi:%s: cdev 0x%p, task 0x%p, release tag 0x%x.
 6libcxgbi:%s: cls_conn 0x%p, param %d, buf(%d) %s.
    6libcxgbi:%s: cls_conn 0x%p, param %d.
        6libcxgbi:%s: cid %u(0x%x), cls 0x%p,0x%p, conn 0x%p,0x%p,0x%p.
       3libcxgbi:%s: missing endpoint.
       6libcxgbi:%s: ep 0x%p, cls sess 0x%p.
 6libcxgbi:%s: cls sess 0x%p.
  Could not get host param. netdev for host not set.
     6libcxgbi:%s: shost 0x%p, hba 0x%p,%s, param %d, buf(%d) %s.
  6libcxgbi:%s: hba %s, req. ipv4 %pI4.
 6libcxgbi:%s: set iscsi ipv4 NOT supported, using %s ipv4.
    6libcxgbi:%s: shost 0x%p, hba 0x%p,%s, param %d.
      6libcxgbi:%s: hba %s, addr %s.
        6libcxgbi:%s: ndev 0x%p, %s, NO match mac found.
      6libcxgbi:%s: de-register transport 0x%p, %s, stt 0x%p.
       4libcxgbi:%s: cdev 0x%p, portmap OOM %u.
      6libcxgbi:%s: csk 0x%p,%u,0x%lx, bit %d.
      6libcxgbi:%s: lldev 0x%p, NO match found.
     6libcxgbi:%s: csk 0x%p, state %u, flags 0x%lx, conn 0x%p.
     3libcxgbi:%s: unable to register %s transport 0x%p.
   6libcxgbi:%s: %s, registered iscsi transport 0x%p.
    4libcxgbi:%s: tpdu max, sgl %u, bad offset %u/%u.
     4libcxgbi:%s: sg %d NULL, len %u/%u.
  4libcxgbi:%s: too many pages %u, dlen %u.
     6libcxgbi:%s: sgl max limit, sgl %u, offset %u, %u/%u, dlimit %u.
     6libcxgbi:%s: %s: offset %u, count %u,
err %u, total_count %u, total_offset %u
        4libcxgbi:%s: nport %d, OOM.
  6libcxgbi:%s: cdev 0x%p, p# %u.
       3libcxgbi:%s: task 0x%p,0x%p, tcp_task 0x%p, tdata 0x%p/0x%p.
 6libcxgbi:%s: task 0x%p, skb NULL.
    6libcxgbi:%s: task 0x%p, csk gone.
    3libcxgbi:%s: task 0x%p, ppod writing using ofldq failed.
     6libcxgbi:%s: csk 0x%p,%u,0x%lx,%u, EAGAIN.
   6libcxgbi:%s: csk 0x%p,%u,0x%lx,%u, EPIPE %d.
 6libcxgbi:%s: csk 0x%p,%u,0x%lx,%u, FULL %u-%u >= %u.
 3libcxgbi:%s: csk 0x%p, skb head %u < %u.
     3libcxgbi:%s: csk 0x%p, frags %u, %u,%u >%lu.
 6libcxgbi:%s: task 0x%p,0x%p, rv %d.
  6libcxgbi:%s: enable iso: csk 0x%p
    6libcxgbi:%s: task 0x%p, skb 0x%p, len %u/%u, %d EAGAIN.
      6libcxgbi:%s: disable iso:csk 0x%p, ts:%lu
    6libcxgbi:%s: itt 0x%x, skb 0x%p, len %u/%u, xmit err %d.
     6libcxgbi:%s: conn 0x%p, skb 0x%p, len %u, flag 0x%lx.
        6libcxgbi:%s: conn 0x%p, skb 0x%p, dcrc 0x%lx.
        6libcxgbi:%s: skb 0x%p, op 0x%x, itt 0x%x, %u %s ddp'ed.
      6libcxgbi:%s: skb 0x%p, off %u, %d, TCP_ERR.
  6libcxgbi:%s: skb 0x%p, off %u, %d, TCP_SUSPEND, rc %d.
       6libcxgbi:%s: skb 0x%p, off %u, %d, TCP_SKB_DONE.
     6libcxgbi:%s: skb 0x%p, off %u, %d, TCP_SEG_DONE, rc %d.
      6libcxgbi:%s: skb 0x%p, off %u, %d, invalid status %d.
        6libcxgbi:%s: cls 0x%p,0x%p, ep 0x%p, cconn 0x%p, csk 0x%p.
   6libcxgbi:%s: csk 0x%p,%u,0x%lx, state -> %u.
 6libcxgbi:%s: alloc csk %zu failed.
   6libcxgbi:%s: csk 0x%p, alloc cpls failed.
    6libcxgbi:%s: cdev 0x%p, new csk 0x%p.
        6libcxgbi:%s: csk 0x%p,%u,0x%lx,%u, cr %u,%u+%u, snd_una %u,%d.
       3libcxgbi:%s: csk 0x%p,%u,0x%lx,%u, cr %u,%u+%u, empty.
       4libcxgbi:%s: csk 0x%p,%u,0x%lx,%u, cr %u,%u+%u, < %u.
        4libcxgbi:%s: csk 0x%p,%u,0x%lx,%u, snd_una %u/%u.     6libcxgbi:%s: csk 0x%p,%u,0x%lx,%u.
   3libcxgbi:%s: cdev 0x%p, p#%u %s, port %u OOR.
        6libcxgbi:%s: cdev 0x%p, p#%u %s, release %u.
 6libcxgbi:%s: %s, put csk 0x%p, ref %u-1.
     6libcxgbi:%s: free csk 0x%p, state %u, flags 0x%lx
    6libcxgbi:%s: csk 0x%p, cdev 0x%p, offload down.
      6libcxgbi:%s: cdev 0x%p, p# %u,%s.
    6libcxgbi:%s: csk 0x%p,%u,%lx, %pI4:%u-%pI4:%u, err %d.
       6libcxgbi:%s: %s, get csk 0x%p, ref %u+1.
     3libcxgbi:%s: csk 0x%p,%u,0x%lx,%u,ABT_RPL_RSS.
       3libcxgbi:%s: csk 0x%p,%u,0x%lx,%u, bad state.
        6libcxgbi:%s: ep 0x%p, cep 0x%p, cconn 0x%p, csk 0x%p,%u,0x%lx.
       3libcxgbi:%s: task 0x%p, tcp_task 0x%p, tdata 0x%p.
   3libcxgbi:%s: task 0x%p, csk gone.
    6libcxgbi:%s: tdata->dlen %u, remaining to send %u conn->max_xmit_dlength %u, tdata->max_xmit_dlength %u
      6libcxgbi:%s: max_pdu_size %u, max_num_pdu %u, max_txdata %u, num_pdu %u
      6libcxgbi:%s: task 0x%p, tcp_task 0x%p, tdata 0x%p, sgl err %d, count %u, dlimit %u
   3libcxgbi:%s: task 0x%p, tcp_task 0x%p, tdata 0x%p, sgl err %d
        6libcxgbi:%s: cdev 0x%p DDP off.
      6libcxgbi:%s: ppm 0x%p, pgidx %u, xfer %u, sgcnt %u, NO ddp.
  6libcxgbi:%s: sg %u/%u, %u,%u, not aligned.
   6libcxgbi:%s: %s: 0x%x, xfer %u, sgl %u dma mapping err.
      6libcxgbi:%s: %s: sw tag 0x%x, xfer %u, sgl %u, dma count %d.
 6libcxgbi:%s: csk 0x%p, R task 0x%p, %u,%u, no ddp.
   6libcxgbi:%s: sw_tag 0x%x NOT usable.
 6libcxgbi:%s: cdev 0x%p, task 0x%p, 0x%x(0x%x,0x%x)->0x%x/0x%x.
       6libcxgbi:%s: task 0x%p, op 0x%x, skb 0x%p,%u+%u/%u, itt 0x%x.
        6libcxgbi:%s: shost 0x%p, non_blocking %d, dst_addr 0x%p.
     6libcxgbi:%s: shost 0x%p, priv NULL.
  6libcxgbi:%s: no route to ipv4 0x%x, port %u.
 6libcxgbi:%s: multi-cast route %pI4, port %u, dev %s.
 6libcxgbi:%s: rt dev %s, loopback -> %s, mtu %u.
      6libcxgbi:%s: %s interface not up.
    6libcxgbi:%s: dst %pI4, %s, NOT cxgbi device.
 6libcxgbi:%s: route to %pI4 :%u, ndev p#%d,%s, cdev 0x%p.
     6libcxgbi:%s: no route to ipv6 %pI6 port %u
   6libcxgbi:%s: %pI6, port %u, dst no neighbour.
        6libcxgbi:%s: multi-cast route %pI6 port %u, dev %s.
  6libcxgbi:%s: dst %pI6 %s, NOT cxgbi device.
  6libcxgbi:%s: route to %pI6 :%u, ndev p#%d,%s, cdev 0x%p.
     6libcxgbi:%s: failed to get source address to reach %pI6
      6libcxgbi:%s: address family 0x%x NOT supported.
      6libcxgbi:%s: Could not connect through requested host %uhba 0x%p != 0x%p (%u).
       3libcxgbi:%s: cdev 0x%p, p#%u %s, NO port map.
        3libcxgbi:%s: source port NON-ZERO %u.
        6libcxgbi:%s: cdev 0x%p, p#%u %s, ALL ports used.
     6libcxgbi:%s: cdev 0x%p, p#%u %s, p %u, %u.
   4libcxgbi:%s: cdev 0x%p, p#%u %s, next %u?
    6libcxgbi:%s: csk 0x%p is closing.
    6libcxgbi:%s: iscsi alloc ep, OOM.
    6libcxgbi:%s: ep 0x%p, cep 0x%p, csk 0x%p, hba 0x%p,%s.
       6libcxgbi:%s: task 0x%p,0x%p, skb 0x%p, 0x%x,0x%x,0x%x, %u+%u.
        6libcxgbi:%s: data->total_count %u, tdata->total_offset %u
    3libcxgbi:%s: task 0x%p,0x%p, tcp_task 0x%p, tdata 0x%p/0x%p dlimit %u, sgl err %d.
   6libcxgbi:%s: count %u, tdata->count %u, num_pdu %u,task->hdr_len %u, r2t->data_length %u, r2t->sent %u
       6libcxgbi:%s: conn 0x%p, skb 0x%p, not hdr.
   6libcxgbi:%s: conn 0x%p, skb 0x%p, hcrc.
      6libcxgbi:%s: csk 0x%p, conn 0x%p.
    6libcxgbi:%s: csk 0x%p, conn 0x%p, id %d, conn flags 0x%lx!
   6libcxgbi:%s: skb 0x%p, NOT ready 0x%lx.
      6libcxgbi:%s: csk 0x%p, skb 0x%p,%u,f 0x%lx, pdu len %u.
      3libcxgbi:%s: coalesced bhs, csk 0x%p, skb 0x%p,%u, f 0x%lx, plen %u.
 3libcxgbi:%s: coalesced data, csk 0x%p, skb 0x%p,%u, f 0x%lx, plen %u.
        3libcxgbi:%s: bhs, csk 0x%p, skb 0x%p,%u, f 0x%lx, plen %u.
   3libcxgbi:%s: csk 0x%p, skb 0x%p,%u, f 0x%lx, plen %u, NO data.
       3libcxgbi:%s: data, csk 0x%p, skb 0x%p,%u, f 0x%lx, plen %u, dskb 0x%p,%u.
    6libcxgbi:%s: csk 0x%p, read %u.
      6libcxgbi:%s: csk 0x%p,%u,0x%lx,%u, seq %u, wup %u, thre %u, %u.
      6libcxgbi:%s: csk 0x%p, 0x%p, rx failed %d, read %u.
 drivers/scsi/cxgbi/libcxgbi.c 3 %s
 %pIS 6libcxgbi:%s: %s xmit err %d.
 is not Invalid pdu or skb. &x->wait                                                                                                                            libcxgbi_init_module            cxgbi_iscsi_cleanup             cxgbi_iscsi_init                need_active_close               cxgbi_ep_disconnect     sock_get_port           cxgbi_check_route6              cxgbi_sock_create               cxgbi_device_find_by_mac        cxgbi_check_route               cxgbi_ep_connect                cxgbi_get_host_param            cxgbi_set_iscsi_ipv4            cxgbi_set_host_param            cxgbi_destroy_session           cxgbi_create_session            cxgbi_bind_conn cxgbi_create_conn               cxgbi_get_ep_param              cxgbi_conn_max_recv_dlength     cxgbi_set_conn_param            task_release_itt                cxgbi_cleanup_task              cxgbi_sock_tx_queue_up          cxgbi_conn_xmit_pdu             cxgbi_prep_iso_info             cxgbi_conn_init_pdu             cxgbi_ppm_make_non_ddp_tag      cxgbi_ddp_sgl_check             cxgbi_ddp_reserve               task_reserve_itt                sgl_read_to_frags               cxgbi_task_data_sgl_read        cxgbi_conn_alloc_pdu            csk_return_rx_credits           skb_read_pdu_data       read_pdu_skb            skb_read_pdu_bhs                cxgbi_conn_pdu_ready            cxgbi_conn_tx_open              cxgbi_parse_pdu_itt             cxgbi_sock_check_wr_invariants  cxgbi_sock_rcv_wr_ack           cxgbi_sock_rcv_close_conn_rpl   cxgbi_sock_rcv_peer_close       cxgbi_sock_clear_flag           cxgbi_sock_rcv_abort_rpl        __cxgbi_sock_get                                cxgbi_sock_act_open_req_arp_failure             cxgbi_sock_fail_act_open                        cxgbi_inform_iscsi_conn_closing sock_put_port   cxgbi_sock_closed               cxgbi_sock_set_state    cxgbi_hbas_add          cxgbi_hbas_remove               cxgbi_device_find_by_netdev_rcu cxgbi_device_find_by_netdev     cxgbi_device_find_by_lldev      cxgbi_device_destroy            cxgbi_device_unregister         cxgbi_device_register           cxgbi_sock_free __cxgbi_sock_put                cxgbi_sock_set_flag             cxgbi_device_portmap_cleanup    cxgbi_device_portmap_create     dbg_level                    parm=dbg_level:libiscsi debug level (default=0) parmtype=dbg_level:uint license=GPL version=0.9.1-ko description=Chelsio iSCSI driver library author=Chelsio Communications, Inc. srcversion=200D7146B0D40229A0B526F depends=libiscsi,scsi_mod,libcxgb,libiscsi_tcp,scsi_transport_iscsi retpoline=Y intree=Y name=libcxgbi vermagic=6.1.0-35-amd64 SMP preempt mod_unload modversions                                                                                                                                                                                                                                                                                                                                                                                                                                                                      (  0  (                   0  (                                          (  0  (                   0  (                   0                                            (    0  8  X  8  0  (                                                                      (    0  8  @  8  0  (                     @                   (  0  8  @                                       (                 (                 (                                                   (    0  8  @  8  0  (                     @                         (    0  8  0  (                     8  0  (                     8  0  (                     8  0  (                     8  0  (                                                                                                                                                                         (  8  (                 8  (                 8                         (    0  8  0  (                     8  0  (                     8  0  (                     8  0  (                     8                         (  0  (                   0  (                   0                                                                                                                                   h        h                           (    0  8  H                                             (                                        (    0  8  X  8  0  (                     X                         (    0  8  P  8  0  (                     P                         (    0  8  X  8  0  (                     X                                                         (    0  8  0  (                     8                         (  0  (                   0  (                   0  (                   0                         (  0  (                   0      0                                                                                (  0  (                   0                       (                 (                 (                 (                       (                 (                 (                 (                                                                                   (  0  (                   0  (                   0  (                   0                         (    0  8    8  0  (                                          F   H     F            H                        (    0  8  `  8  0  (                     `                       (  8  (                 8                         (    0  8  H  8  0  (                     H  8  0  (                     H                    0     X  (  0  8  0  (      @  H  8  0  (                     @  8     (  0  8           8  @  H  @  8  8  0             H  8  0  (                     H  P  X  P  H  P  H  (  X  `  X  `  X  `  X  `  X  `  X  `  h  p  X  P  X  P  X  `  X        8  @  H  @  8  @  H  P  X  8  @  H  P  8  @  H  P  X  `  8  0                 (  0  8          0  (     0  8  @  8  0                                  H `  h  p  x    `  h  `  h  p  h  `  h  p  x  `  8  H  P  X  `  h  H  8  0  (                     H  P  H  8  0  (                     H  P  X  `  H  P  H  P  H  P  H  P  H                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      m    __fentry__                                              9[    __x86_return_thunk                                      ~    _printk                                                 KM    mutex_lock                                              82    mutex_unlock                                            ȸ    vlan_dev_real_dev                                       'R    __rcu_read_lock                                         i$    __rcu_read_unlock                                       Er    iscsi_host_remove                                       `    pci_dev_put                                             J    iscsi_host_free                                         cuJ    iscsi_host_alloc                                        4Q    pci_dev_get                                             ϛ5    iscsi_host_add                                          rP    scsi_host_put                                           	n    kfree_skb_reason                                        y    sg_next                                                 *    cxgbi_ppm_init                                          pHe    __x86_indirect_thunk_rax                                )0    iscsi_conn_queue_xmit                                   E0    __kfree_skb                                             
    iscsi_tcp_cleanup_task                                  Ȩ{7    cxgbi_ppm_ppod_release                                  2"    dma_unmap_sg_attrs                                      z    kfree                                                       iscsi_tcp_set_max_r2t                                   p    iscsi_set_param                                         ˹    iscsi_conn_get_addr_param                               U    iscsi_tcp_conn_setup                                    v#    iscsi_session_setup                                     B    iscsi_tcp_r2tpool_alloc                                 	D    iscsi_session_teardown                                  }X.    iscsi_tcp_r2tpool_free                                  N}    iscsi_host_set_param                                    c    in_a// This layout includes all Indian layouts, including:
//     - Hindi
//     - Marathi
//     - Sanskrit
//     - Bangla
//     - Gujarati
//     - Kannada
//     - Malayalam
//     - Ol Chiki
//     - Oriya
//     - Tamil
//     - Telugu
//     - Urdu

// Links:
// - Indic INSCRIPT keyboard layout diagrams:
//     http://java.sun.com/products/jfc/tsc/articles/InputMethod/indiclayout.html
// - Bangla Baishakhi (Bangla layouts):
// - Bangla Baishakhi InScript (Bangla layouts):
// - Bangla Bornona (Bangla layouts):
// - Uni Gitanjali (Bangla layouts):
//     http://nltr.org
// - Ekusheyr Shadhinota (Bangla layouts):
//     http://ekushey.org/projects/shadhinota/index.html
// - Microsoft Windows XP SP2: Indic Language Standards - an Introduction:
//     http://www.bhashaindia.com/MSProducts/XpSp2/Articles/IndicLanguageStandards.aspx
// - Ol Chiki:
//    http://www.unicode.org/L2/L2005/05243r-n2984-ol-chiki.pdf (fig. 9)

// Devangari is the default. Kill me if I am wrong:)
default partial alphanumeric_keys
xkb_symbols "deva" {
	// March 2004 -- David Holl <smyrph+dev_xkb@ece.wpi.edu>
	name[Group1]="Indian";

	key.type[group1]="FOUR_LEVEL";

	key <TLDE> { [ U094a, U0912,   grave, asciitilde  ] };
	key <AE01> { [ U0967, U090d,       1, exclam      ] };
	key <AE02> { [ U0968, U0945,       2, at          ] };
	// Shift+AE0[3-8] really need to return a macro of keys defined by
	// INSCRIPT in place of the symbols that are here for now.  But this
	// requires XKB to map 1 key into two to three other key presses.
	key <AE03> { [ U0969, numbersign,  3, numbersign  ] };
	key <AE04> { [ U096a, dollar,      4, U20b9       ] }; // Rupee
	key <AE05> { [ U096b, percent,     5, percent     ] };
	key <AE06> { [ U096c, asciicircum, 6, asciicircum ] };
	key <AE07> { [ U096d, ampersand,   7, ampersand   ] };
	key <AE08> { [ U096e, asterisk,    8, asterisk    ] };
	key <AE09> { [ U096f, parenleft,   9, parenleft   ] };
	key <AE10> { [ U0966, parenright,  0, parenright  ] };
	key <AE11> { [ minus, U0903, minus, underscore    ] };
	key <AE12> { [ U0943, U090b, U0944, U0960 ] };

	key <AD01> { [ U094c, U0914 ] };
	key <AD02> { [ U0948, U0910 ] };
	key <AD03> { [ U093e, U0906 ] };
	key <AD04> { [ U0940, U0908, U0963, U0961 ] };
	key <AD05> { [ U0942, U090a ] };
	key <AD06> { [ U092c, U092d ] };
	key <AD07> { [ U0939, U0919 ] };
	key <AD08> { [ U0917, U0918, U095a ] };
	key <AD09> { [ U0926, U0927 ] };
	key <AD10> { [ U091c, U091d, U095b ] };
	key <AD11> { [ U0921, U0922, U095c, U095d ] };
	key <AD12> { [ U093c, U091e ] };
	// I added \ / ? | for shell-convenience (file names and piping)
	key <BKSL> { [ U0949, U0911, U005C, U007C ] };

	key <AC01> { [ U094b, U0913 ] };
	key <AC02> { [ U0947, U090f ] };
	key <AC03> { [ U094d, U0905 ] };
	key <AC04> { [ U093f, U0907, U0962, U090c ] };
	key <AC05> { [ U0941, U0909 ] };
	key <AC06> { [ U092a, U092b, NoSymbol, U095e ] };
	key <AC07> { [ U0930, U0931 ] };
	key <AC08> { [ U0915, U0916, U0958, U0959 ] };
	key <AC09> { [ U0924, U0925 ] };
	key <AC10> { [ U091a, U091b, U0952 ] };
	key <AC11> { [ U091f, U0920, NoSymbol, U0951 ] };

	key <AB01> { [ U0946, U090e, U0953 ] };
	key <AB02> { [ U0902, U0901, NoSymbol, U0950 ] };
	key <AB03> { [ U092e, U0923, U0954 ] };
	key <AB04> { [ U0928, U0929 ] };
	key <AB05> { [ U0935, U0934 ] };
	key <AB06> { [ U0932, U0933 ] };
	key <AB07> { [ U0938, U0936 ] };
	key <AB08> { [ comma, U0937, U0970 ] };
	key <AB09> { [ period, U0964, U0965, U093d ] };
	// I added \ / ? | for shell-convenience (file names and piping)
	key <AB10> { [ U092f, U095f, slash, question ] };

	// space, space, Zero-Width-Non-Joiner (ZWNJ), Zero-Width-Joiner (ZWJ):
	include "nbsp(zwnj3zwj4)"
        include "level3(ralt_switch)"
};

//Name		:	Bolnagri (Combined)
//Description	:	A phonetic keyboard layout for Devnagari(Hindi)
//			http://www.indlinux.org/wiki/index.php/BolNagri
//NOTE		: 	This is a combined map of bolnagri_matras and bolnagri_vowels.
//Inspired by "devrom" keymap by Steve Smith for the windows tool "keyman"
//Original Author :	Noah Levitt<nlevitt at columbia.edu>
//Past Authors  : Pramod.R <pramodr at gmail.com> and Ravikant <ravikant at sarai.net>
//Current Main. : G Karunakar <karunakar@indlinux.org>

partial alphanumeric_keys
xkb_symbols "bolnagri" {
     name[Group1] = "Hindi (Bolnagri)";
     key.type[group1]="FOUR_LEVEL";

    // Roman digits
    key <TLDE>  { [   U0902,	U0901,		grave, 	asciitilde ] }; // grave: anusvara, candrabindu
    key <AE01>  { [   1,	exclam,		U0967,		exclam	   ] };
    key <AE02>  { [   2,	at,		U0968,		at	   ] };
    key <AE03>  { [   3,    	numbersign, 	U0969,		numbersign ] };
    key <AE04>  { [   4,	dollar,		U096A,		U20B9      ] }; // Rupee
    key <AE05>  { [   5,	percent,	U096B,		percent    ] };
    key <AE06>  { [   6,	asciicircum,	U096C,		asciicircum ] };
    key <AE07>  { [   7,	ampersand,	U096D,		ampersand  ] };
    key <AE08>  { [   8,	asterisk,	U096E,		asterisk   ] };
    key <AE09>  { [   9,	parenleft,	U096F,		parenleft  ] };
    key <AE10>  { [   0,	parenright,	U0966,		parenright ] };
    key <AE11>	{ [   minus,	underscore	     ] };
    key <AE12>	{ [   equal,	plus		     ] };
    key <BKSL>  { [   U0964,	U0965,		U007C,		U005C   ] }; //pipe : danda, double danda

    //Q Row	
    key <AD01>   { [   U200C, 	U200D   ] };  // Q: ZWNJ, ZWJ
    key <AD02>   { [   U0935,  	U950	] };  // W: wa, OM
    key <AD03>   { [   U0947,   U0948,	U090F,	U0910   ] };  // E: e, ai matras
    key <AD04>   { [   U0930,	U0943,	U0931,  U090B  	] };  // R: ra, vocalic Ri
    key <AD05>   { [   U0924,   U0925   ] };  // T: ta, tha
    key <AD06>   { [   U092f,	U091E   ] };  // Y: ya, nya
    key <AD07>   { [   U0941,   U0942,	U0909,	U090A   ] };  // U: u, uu matras
    key <AD08>   { [   U093F,   U0940,	U0907,	U0908   ] };  // I: i, ii matras
    key <AD09>   { [   U094B,   U094C,	U0913,	U0914   ] };  // O: o, au matras
    key <AD10>   { [   U092A,   U092B   ] };  // P: pa, pha
    key <AD11>   { [   bracketleft,   braceleft   ] };
    key <AD12>	 { [   bracketright, braceright   ] };

    //A Row
    key <AC01>   { [   U093E,	 U0906,	U0905,	U0906  ] };   // A: aa, full A, AA
    key <AC02>   { [   U0938,    U0937   ] };  // S: sa, ssa
    key <AC03>   { [   U0926,    U0927   ] };  // D: da, dha
    key <AC04>   { [   U091F,    U0920   ] };  // F: TA, THA
    key <AC05>   { [   U0917,    U0918   ] };  // G: ga, gha
    key <AC06>   { [   U0939,    U0903   ] };  // H: ha, visarg 
    key <AC07>   { [   U091C,    U091D   ] };  // J: ja, jha
    key <AC08>   { [   U0915,    U0916   ] };  // K: ka, kha
    key <AC09>   { [   U0932,	 U0933,	U0962,   U090C   ] };  // L: la, vocalic L or lru matra
    key <AC10>   { [   semicolon, colon  ] };
    key <AC11>   { [apostrophe, quotedbl ] };

    //Z Row
    key <AB01>   { [   U0936,	 U0945, U0936, U090D 	 ] };  // Z: sha, akaar candra
    key <AB02>   { [   U094D,    U0949, U094D, U0911	 ] };  // X: halant, aakaar candra, chandra A
    key <AB03>   { [   U091A,    U091B   ] };  // C: ca, cha
    key <AB04>   { [   U0921,    U0922   ] };  // V: da, dha
    key <AB05>   { [   U092C,    U092D   ] };  // B: ba, bha
    key <AB06>   { [   U0928,    U0923   ] };  // N: na, nna
    key <AB07>   { [   U092E,    U0919,	U092E,	U093D   ] };  // M: ma, nga, avagraha
    key <AB08>   { [   comma,    U0970	 ] };// comma: comma, dev abbreviation sign
    key <AB09>   { [   period,   U093C 	 ] };  // period: period, nukta
    key <AB10>	 { [   slash,   question ] };

//    modifier_map Shift  { Shift_L };
//    modifier_map Lock   { Caps_Lock };
//    modifier_map Control{ Control_L };
//    modifier_map Mod3   { Mode_switch };

    include "level3(ralt_switch)"
};

partial alphanumeric_keys
xkb_symbols "ben" {
    name[Group1]= "Bangla (India)";

      // Mainly numbers.
      key <AE01> { [      U09E7 		]	};
      key <AE02> { [      U09E8 		]	};
      key <AE03> { [      U09E9 		]	};
      key <AE04> { [      U09EA 		]	};
      key <AE05> { [      U09EB		]	};
      key <AE06> { [      U09EC 		]	};
      key <AE07> { [      U09ED	        ]	};
      key <AE08> { [      U09EE 		]	};
      key <AE09> { [      U09EF, parenleft	]	};
      key <AE10> { [      U09E6, parenright	]	};
      key <AE11> { [      minus, U0983 	]	};
      key <AE12> { [      U098B, U09C3	]	};

// Mainly long vowels

      key <AD01> { [      U09CC,  U0994	]	};
      key <AD02> { [      U09C8,  U0990	]	};
      key <AD03> { [      U09BE,  U0986	]	};
      key <AD04> { [      U09C0,  U0988	]	};
      key <AD05> { [      U09C2,  U098A	]	};

// Mainly voiced consonants

      key <AD06> { [      U09AC,  U09AD	]	};
      key <AD07> { [      U09B9,  U0999 ]	};
      key <AD08> { [      U0997,  U0998 ]	};
      key <AD09> { [      U09A6,  U09A7 ]	};
      key <AD10> { [      U099C,  U099D ]	};
      key <AD11> { [      U09A1, U09A2 	]	};
      key <AD12> { [      U09BC, U099E 	]	};

// Mainly short vowels
      key <AC01> { [      U09CB,  U0993 ]	};
      key <AC02> { [      U09C7,  U098F ]	};
      key <AC03> { [      U09CD,  U0985 ]	};
      key <AC04> { [      U09BF,  U0987 ]	};
      key <AC05> { [      U09C1,  U0989 ]	};


// Mainly unvoiced consonants

      key <AC06> { [      U09AA,  U09AB ]	};
      key <AC07> { [      U09B0,  U09DD ]	};
      key <AC08> { [      U0995,  U0996 ]	};
      key <AC09> { [      U09A4,  U09A5 ]	};
      key <AC10> { [      U099A,  U099B ]	};
      key <AC11> { [      U099F, U09A0 	]	};
      key <BKSL> { [      U005C, U007C 	]	};

      key <AB01> { [      z, Z  		]       };
      key <AB02> { [      U0982,  U0981 ]       };
      key <AB03> { [      U09AE,  U09A3 ]       };
      key <AB04> { [      U09A8,  U09A8 ]       };
      key <AB05> { [      U09AC,  U09AC ]       };
      key <AB06> { [      U09B2,  U09B2 ]       };
      key <AB07> { [      U09B8,  U09B6 ]       };
      key <AB08> { [      comma,      U09B7 ]       };
      key <AB09> { [      period,     U0964 ]       };
      key <AB10> { [      U09DF,  U09AF	]       };

    include "level3(ralt_switch)"
    include "rupeesign(4)"
};

xkb_symbols "ben_probhat" {
 name[Group1]= "Bangla (India, Probhat)";
   key.type[group1]="FOUR_LEVEL";

   key <ESC>  { [ Escape ] };

// numbers
   key <TLDE> { [ U200D, asciitilde   ] };
   key <AE01> { [ U09E7, exclam, U09F4 ] };
   key <AE02> { [ U09E8, at, U09F5 ] };
   key <AE03> { [ U09E9, numbersign, U09F6 ] };
   key <AE04> { [ U09EA, U09F3, U09F7, U09F2 ] };
   key <AE05> { [ U09EB, percent      ] };
   key <AE06> { [ U09EC, asciicircum  ] };
   key <AE07> { [ U09ED, U099E, U09FA ] };
   key <AE08> { [ U09EE, U09CE    ] };
   key <AE09> { [ U09EF, parenleft    ] };
   key <AE10> { [ U09E6, parenright, U09F8, U09F9 ] };
   key <AE11> { [ minus,     underscore   ] };
   key <AE12> { [ equal,     plus         ] };
   key <BKSP> { [ BackSpace               ] };

// tab, q to ] 
   key <TAB>  { [   Tab,  ISO_Left_Tab     ] };
   key <AD01> { [   U09A6,  U09A7  ] };
   key <AD02> { [   U09C2,  U098A  ] };
   key <AD03> { [   U09C0,  U0988  ] };
   key <AD04> { [   U09B0,  U09DC  ] };
   key <AD05> { [   U099F,  U09A0  ] };
   key <AD06> { [   U098F,  U0990  ] };
   key <AD07> { [   U09C1,  U0989  ] };
   key <AD08> { [   U09BF,  U0987  ] };
   key <AD09> { [   U0993,  U0994  ] };
   key <AD10> { [   U09AA,  U09AB  ] };
   key <AD11> { [   U09C7,  U09C8  ] };
   key <AD12> { [   U09CB,  U09CC, U09D7 ] };
   key <RTRN> { [   Return                 ] };

// caps, a to ' 
//   key <CAPS> { [   Caps_Lock              ] };
   key <AC01> { [   U09BE,  U0985, U098C, U09E0 ] };
   key <AC02> { [   U09B8,  U09B7, U09E1, U09E3 ] };
   key <AC03> { [   U09A1,  U09A2, U09C4, U09E2 ] };
   key <AC04> { [   U09A4,  U09A5  ] };
   key <AC05> { [   U0997,  U0998  ] };
   key <AC06> { [   U09B9,  U0983, U09BD ] };
   key <AC07> { [   U099C,  U099D  ] };
   key <AC08> { [   U0995,  U0996  ] };
   key <AC09> { [   U09B2,  U0982  ] };
   key <AC10> { [   semicolon,  colon      ] };
   key <AC11> { [   apostrophe, quotedbl   ] };

// shift, z to /
//   key <LFSH> { [   Shift_L                ] };
   key <AB01> { [   U09DF,  U09AF  ] };
   key <AB02> { [   U09B6,  U09DD  ] };
   key <AB03> { [   U099A,  U099B  ] };
   key <AB04> { [   U0986,  U098B  ] };
   key <AB05> { [   U09AC,  U09AD  ] };
   key <AB06> { [   U09A8,  U09A3  ] };
   key <AB07> { [   U09AE,  U0999  ] };
   key <AB08> { [   comma,      U09C3  ] };
   key <AB09> { [   U0964,  U0981, U09BC ] };
   key <AB10> { [   U09CD,  question   ] };
   key <BKSL> { [   U200C,  U0965  ] };

//   key <LCTL> { [   Control_L              ] };
//   key <SPCE> { [   space                  ] };

//   modifier_map Shift  { Shift_L };
//   modifier_map Lock   { Caps_Lock };
//   modifier_map Control{ Control_L };

    include "level3(ralt_switch)"
    include "rupeesign(4)"
};

// Bangla Baishakhi, Bangla Baishakhi InScript, Bangla Bornona, Uni Gitanjali Layouts are added by Promathesh Mandal <promathesh812004@gmail.com>

xkb_symbols "ben_baishakhi" {
 name[Group1]= "Bangla (India, Baishakhi)";
   key <ESC>   { [ Escape 					] };

// numbers
   key <TLDE> { [ 0x100200D, 0x100200C	] };
   key <AE01> { [ 0x10009E7, exclam		] };
   key <AE02> { [ 0x10009E8, at		] };
   key <AE03> { [ 0x10009E9, numbersign	] };
   key <AE04> { [ 0x10009EA, dollar, 0x10009F2	] };
   key <AE05> { [ 0x10009EB, percent		] };
   key <AE06> { [ 0x10009EC, asciicircum, 0x10009D7    ] };
   key <AE07> { [ 0x10009ED, ampersand ] };
   key <AE08> { [ 0x10009EE,   asterisk,0x10009FA       		] };
   key <AE09> { [ 0x10009EF, parenleft    	] };
   key <AE10> { [ 0x10009E6, parenright   	] };
   key <AE11> { [ minus, underscore   	] };
   key <AE12> { [ equal,     plus 	] };
   key <BKSP> { [ BackSpace               		] };

// tab, q to ] 
   key <TAB>   { [   Tab,  ISO_Left_Tab		] };
   key <AD01> { [   0x10009A1,  0x10009A2  ] };
   key <AD02> { [  0x10009C0 ,  0x10009C2  ] };
   key <AD03> { [   0x10009C7,  0x100098F, 0x1000990 ] };
   key <AD04> { [   0x10009B0 , 0x10009C3, 0x100098B             		] };
   key <AD05> { [   0x100099F,  0x10009A0	] };
   key <AD06> { [   0x10009AF,  0x10009DF	] };
   key <AD07> { [   0x10009C1,  0x1000989, 0x100098A  ] };
   key <AD08> { [   0x10009BF,  0x1000987, 0x1000988  ] };
   key <AD09> { [   0x10009CB,  0x1000993, 0x1000994	] };
   key <AD10> { [   0x10009AA,  0x10009AB	] };
   key <AD11> { [   bracketleft,  braceleft] };
   key <AD12> { [   bracketright,	braceright	] };
   key <RTRN> { [   Return                 		] };

// caps, a to ' 
// key <CAPS> { [   Caps_Lock            		] };
   key <AC01> { [   0x10009BE,  0x1000985, 0x1000986  ] };
   key <AC02> { [   0x10009B8,  0x10009B6,  0x10009B7  ] };
   key <AC03> { [   0x10009A6,  0x10009A7  ] };
   key <AC04> { [   0x10009A4,   0x10009A5, 0x10009CE  ] };
   key <AC05> { [   0x1000997,  0x1000998	] };
   key <AC06> { [   0x10009CD,  0x10009B9, 0x1000983  ] };
   key <AC07> { [   0x100099C,  0x100099D	] };
   key <AC08> { [   0x1000995,  0x1000996  	] };
  key <AC09> { [   0x10009B2,  0x1000964, 0x100098C  ] };
   key <AC10> { [   semicolon,  colon  	] };
   key <AC11> { [   apostrophe, quotedbl   	] };

// shift, z to /
// key <LFSH> { [   Shift_L              			] };
   key <AB01> { [   0x10009C8, 0x10009CC              		] };
   key <AB02> { [   0x10009DC, 0x10009DD              		] };
   key <AB03> { [   0x100099A,  0x100099B  ] };
   key <AB04> { [   0x10009F1,  0x10009F0	] };
   key <AB05> { [   0x10009AC,  0x10009AD  ] };
   key <AB06> { [   0x10009A8,  0x10009A3, 0x100099E  ] };
   key <AB07> { [   0x10009AE,  0x1000999, 0x1000981  ] };
   key <AB08> { [   comma,      less	] };
   key <AB09> { [    period,	greater,0x10009BC 		] };
   key <AB10> { [   slash,  question, 0x1000982   	] };
   key <BKSL> { [   backslash,        bar	] };

// third level with right-alt
    include "level3(ralt_switch)"

//   key <LCTL> { [   Control_L              ] };
//   key <SPCE> { [   space                  ] };

//   modifier_map Shift  { Shift_L };
//   modifier_map Lock   { Caps_Lock };
//   modifier_map Control{ Control_L };
};

xkb_symbols "ben_inscript" {
    name[Group1]= "Bangla (India, Baishakhi InScript)";

      // Mainly numbers.
      key <TLDE> { [      0x100200D, 0x100200C	] 	};
      key <AE01> { [      0x10009E7  		]	};
      key <AE02> { [      0x10009E8 		]	};
      key <AE03> { [      0x10009E9 		]	};
      key <AE04> { [      0x10009EA 		]	};
      key <AE05> { [      0x10009EB		]	};
      key <AE06> { [      0x10009EC 		]	};
      key <AE07> { [      0x10009ED	        ]	};
      key <AE08> { [      0x10009EE 		]	};
      key <AE09> { [      0x10009EF, parenleft	]	};
      key <AE10> { [      0x10009E6, parenright	]	};
      key <AE11> { [      minus, 0x1000983 	]	};
      key <AE12> { [      0x10009C3, 0x100098B 	]	};

// Mainly long vowels

      key <AD01> { [      0x10009CC,  0x1000994	]	};
      key <AD02> { [      0x10009C8,  0x1000990	]	};
      key <AD03> { [      0x10009BE,  0x1000986	]	};
      key <AD04> { [      0x10009C0,  0x1000988	]	};
      key <AD05> { [      0x10009C2,  0x100098A	]	};

// Mainly voiced consonants

      key <AD06> { [      0x10009AC,  0x10009AD	]	};
      key <AD07> { [      0x10009B9,  0x1000999 ]	};
      key <AD08> { [      0x1000997,  0x1000998 ]	};
      key <AD09> { [      0x10009A6,  0x10009A7 ]	};
      key <AD10> { [      0x100099C,  0x100099D ]	};
      key <AD11> { [      0x10009A1,  0x10009A2 ]	};
      key <AD12> { [      0x10009BC,  0x100099E ]	};

// Mainly short vowels
      key <AC01> { [      0x10009CB,  0x1000993 ]	};
      key <AC02> { [      0x10009C7,  0x100098F ]	};
      key <AC03> { [      0x10009CD,  0x1000985 ]	};
      key <AC04> { [      0x10009BF,  0x1000987 ]	};
      key <AC05> { [      0x10009C1,  0x1000989 ]	};


// Mainly unvoiced consonants

      key <AC06> { [      0x10009AA,  0x10009AB ]	};
      key <AC07> { [      0x10009B0,  0x10009DD ]	};
      key <AC08> { [      0x1000995,  0x1000996 ]	};
      key <AC09> { [      0x10009A4,  0x10009A5 ]	};
      key <AC10> { [      0x100099A,  0x100099B ]	};
      key <AC11> { [      0x100099F, 0x10009A0 	]	};
      key <BKSL> { [      backslash, bar 	]	};

      key <AB01> { [      0x10009CE  		]       };
      key <AB02> { [      0x1000982,  0x1000981 ]       };
      key <AB03> { [      0x10009AE,  0x10009A3 ]       };
      key <AB04> { [      0x10009A8,  0x10009A8 ]       };
      key <AB05> { [      0x10009AC,  0x10009AC ]       };
      key <AB06> { [      0x10009B2,  0x10009B2 ]       };
      key <AB07> { [      0x10009B8,  0x10009B6 ]       };
      key <AB08> { [      comma,      0x10009B7 ]       };
      key <AB09> { [      period,     0x1000964 ]       };
      key <AB10> { [      0x10009DF,  0x10009AF	]       };
};

xkb_symbols "ben_gitanjali" {
 name[Group1]= "Bangla (India, Gitanjali)";
   key <ESC>   { [ Escape			] };

// numbers
   key <TLDE> { [ colon, question	] };
   key <AE01> { [ 0x10009E7, 0x10009CE	] };
   key <AE02> { [ 0x10009E8, apostrophe	] };
   key <AE03> { [ 0x10009E9, numbersign	] };
   key <AE04> { [ 0x10009EA, 0x10009F3	] };
   key <AE05> { [ 0x10009EB, slash	] };
   key <AE06> { [ 0x10009EC, period	] };
   key <AE07> { [ 0x10009ED, ampersand 	] };
   key <AE08> { [ 0x10009EE, asterisk 	] };
   key <AE09> { [ 0x10009EF, parenleft  ] };
   key <AE10> { [ 0x10009E6, parenright	] };
   key <AE11> { [ minus, 0x1000983   	] };
   key <AE12> { [ 0x10009C3, 0x100098B 	] };
   key <BKSP> { [ BackSpace		] };

// tab, q to ] 
   key <TAB>   { [   Tab,  ISO_Left_Tab	] };
   key <AD01> { [   0x10009D7,  0x1000994 ] };
   key <AD02> { [   0x10009C8,  0x1000990 ] };
   key <AD03> { [   0x10009BE,  0x1000985 ] };
   key <AD04> { [   0x10009C0,  0x1000988 ] };
   key <AD05> { [   0x10009C2,  0x100098A ] };
   key <AD06> { [   0x10009AC,  0x10009AD ] };
   key <AD07> { [   0x10009B9,  0x1000999 ] };
   key <AD08> { [   0x1000997,  0x1000998 ] };
   key <AD09> { [   0x10009A6,  0x10009A7 ] };
   key <AD10> { [   0x100099C,  0x100099D ] };
   key <AD11> { [   0x10009A1,  0x10009A2 ] };
   key <AD12> { [   0x100200C,  0x100099E ] };
   key <RTRN> { [   Return		  ] };

// caps, a to ' 
// key <CAPS> { [   Caps_Lock            		] };
   key <AC01> { [   0x100200D,  0x1000993 ] };
   key <AC02> { [   0x10009C7,  0x100098F ] };
   key <AC03> { [   0x10009CD		  ] };
   key <AC04> { [   0x10009BF,  0x1000987 ] };
   key <AC05> { [   0x10009C1,  0x1000989 ] };
   key <AC06> { [   0x10009AA,  0x10009AB ] };
   key <AC07> { [   0x10009B0,  0x10009F0 ] };
   key <AC08> { [   0x1000995,  0x1000996 ] };
   key <AC09> { [   0x10009A4,  0x10009A5 ] };
   key <AC10> { [   0x100099A,  0x100099B ] };
   key <AC11> { [   0x100099F,  0x10009A0 ] };

// shift, z to /
// key <LFSH> { [   Shift_L              			] };
   key <AB01> { [   0x10009C7, 0x100098F ] };
   key <AB02> { [   0x1000982, 0x1000981 ] };
   key <AB03> { [   0x10009AE, 0x10009A3 ] };
   key <AB04> { [   0x10009A8, 0x10009DC ] };
   key <AB05> { [   0x10009F1, 0x10009DD ] };
   key <AB06> { [   0x10009B2		 ] };
   key <AB07> { [   0x10009B8, 0x10009B6 ] };
   key <AB08> { [   comma,     0x10009B7 ] };
   key <AB09> { [   0x1000964, 0x10009FA ] };
   key <AB10> { [   0x10009AF, 0x10009DF ] };
   key <BKSL> { [   backslash, bar	 ] };

// third level with right-win
//    include "level3(lwin_switch)"

//   key <LCTL> { [   Control_L              ] };
//   key <SPCE> { [   space                  ] };

//   modifier_map Shift  { Shift_L };
//   modifier_map Lock   { Caps_Lock };
//   modifier_map Control{ Control_L };
};


xkb_symbols "ben_bornona" {
 name[Group1]= "Bangla (India, Bornona)";
   key <ESC>  { [ Escape 					] };

// numbers
   key <TLDE> { [ 0x100200D, 0x100200C   	] };
   key <AE01> { [ 0x10009E7, exclam         	] };
   key <AE02> { [ 0x10009E8, 0x1000981 	] };
   key <AE03> { [ 0x10009E9, numbersign   	] };
   key <AE04> { [ 0x10009EA, 0x10009F3    	] };
   key <AE05> { [ 0x10009EB, percent      	] };
   key <AE06> { [ 0x10009EC, 0x1000983    	] };
   key <AE07> { [ 0x10009ED, 0x10009CE	] };
   key <AE08> { [ 0x10009EE, asterisk		] };
   key <AE09> { [ 0x10009EF, parenleft    	] };
   key <AE10> { [ 0x10009E6, parenright	] };
   key <AE11> { [ minus,	   underscore	] };
   key <AE12> { [ equal,          plus			] };
   key <BKSP> { [ BackSpace               		] };

// tab, q to ] 
   key <TAB>   { [   Tab,  	ISO_Left_Tab	] };
   key <AD01> { [   0x1000982,  0x1000999, 0x10009D7	] };
   key <AD02> { [   0x10009A2,  0x10009A0, 0x100098A ] };
   key <AD03> { [   0x10009C7,  0x10009C8, 0x1000988	] };
   key <AD04> { [   0x10009B0,  0x10009C3, 0x100098B	] };
   key <AD05> { [   0x10009A4,  0x100099F	] };
   key <AD06> { [   0x10009A7,  0x10009A5, 0x100098F  ] };
   key <AD07> { [   0x10009C1,  0x10009C2, 0x1000989	] };
   key <AD08> { [   0x10009BF,  0x10009C0, 0x1000987	] };
   key <AD09> { [   0x10009CB,  0x10009CC, 0x1000993	] };
   key <AD10> { [   0x10009AA, 0x1000990, 0x1000994		] };
   key <AD11> { [   0x100005B,  0x100007B, 0x10009DC  ] };
   key <AD12> { [   0x100005D,  0x100007D  ] };
   key <RTRN> { [   Return					] };

// caps, a to ' 
// key <CAPS> { [   Caps_Lock            		] };
   key <AC01> { [   0x10009BE,  0x1000985, 0x10009F4  ] };
   key <AC02> { [   0x10009B8,  0x10009B6, 0x10009F5  ] };
   key <AC03> { [   0x10009A6,  0x10009A1, 0x10009F8  ] };
   key <AC04> { [   0x10009AB				] };
   key <AC05> { [   0x1000997,  0x1000998	] };
   key <AC06> { [   0x10009CD, 0x10009B9	] };
   key <AC07> { [   0x100099C,  0x100099D	] };
   key <AC08> { [   0x1000995,  0x1000996	] };
   key <AC09> { [   0x10009B2,  0x1000964  ] };
   key <AC10> { [   semicolon,  0x100003A	] };
   key <AC11> { [   apostrophe, quotedbl   	] };

// shift, z to /
// key <LFSH> { [   Shift_L              			] };
   key <AB01> { [   0x10009AF, 0x10009DC	] };
   key <AB02> { [   0x10009B7, 0x10009DD, 0x10009FA	] };
   key <AB03> { [   0x100099A,  0x100099B  ] };
   key <AB04> { [   0x10009AD				] };
   key <AB05> { [   0x10009AC,  0x10009DF	] };
   key <AB06> { [   0x10009A8,  0x10009A3	] };
   key <AB07> { [   0x10009AE,  0x100099E	] };
   key <AB08> { [   comma,      0x100003C	] };
   key <AB09> { [   0x100002E,  0x100003E  ] };
   key <AB10> { [   0x100002F,  question   	] };
   key <BKSL> { [   0x10009F1,  0x10009F0	] };

//   key <LCTL> { [   Control_L              ] };
//   key <SPCE> { [   space                  ] };

//   modifier_map Shift  { Shift_L };
//   modifier_map Lock   { Caps_Lock };
//   modifier_map Control{ Control_L };
// third level with right-alt
    include "level3(ralt_switch)"
};

partial alphanumeric_keys
xkb_symbols "guj" {
      name[Group1]= "Gujarati";

      // Mainly numbers.
      key <AE01> { [      U0AE7, U0A8D 	]	};
      key <AE02> { [      U0AE8, U0AC5 	]	};
      key <AE03> { [      U0AE9 	 	]	};
      key <AE04> { [      U0AEA  	 	]	};
      key <AE05> { [      U0AEB  	 	]	};
      key <AE06> { [      U0AEC  	 	]	};
      key <AE07> { [      U0AED 		]	};
      key <AE08> { [      U0AEE  	 	]	};
      key <AE09> { [      U0AEF, parenleft 	]	};
      key <AE10> { [      U0AE6, parenright ]	};
      key <AE11> { [      minus,     U0A83  ]	};
      key <AE12> { [      U0A8B, U0AC3 	]	};

// Mainly long vowels

      key <AD01> { [      U0ACC, U0A94  ]	};
      key <AD02> { [      U0AC8, U0A90  ]	};
      key <AD03> { [      U0ABE, U0A86  ]	};
      key <AD04> { [      U0AC0, U0A88  ]	};
      key <AD05> { [      U0AC2, U0A8A  ]	};

// Mainly voiced consonants

      key <AD06> { [      U0AAC, U0AAD 	]	};
      key <AD07> { [      U0AB9, U0A99 	]	};
      key <AD08> { [      U0A97, U0A98 	]	};
      key <AD09> { [      U0AA6, U0AA7 	]	};
      key <AD10> { [      U0A9C, U0A9D 	]	};
      key <AD11> { [      U0AA1, U0AA2 	]	};
      key <AD12> { [      U0ABC, U0A9E 	]	};

// Mainly short vowels
      key <AC01> { [      U0ACB, U0A93	]	};
      key <AC02> { [      U0AC7, U0A8F	]	};
      key <AC03> { [      U0ACD, U0A85  ]	};
      key <AC04> { [      U0ABF, U0A87  ]	};
      key <AC05> { [      U0AC1, U0A89  ]	};

// Mainly unvoiced consonants

      key <AC06> { [      U0AAA, U0AAB 	]	};
      key <AC07> { [      U0AB0, U0AB0 	]	};
      key <AC08> { [      U0A95, U0A96 	]	};
      key <AC09> { [      U0AA4, U0AA5 	]	};
      key <AC10> { [      U0A9A, U0A9B 	]	};
      key <AC11> { [      U0A9F, U0AA0 	]	};
      key <BKSL> { [      U0AC9, U0A91 	]	};

      key <AB01> { [      z        , Z		]       };
      key <AB02> { [      U0A82, U0A81	]       };
      key <AB03> { [      U0AAE, U0AA3  ]       };
      key <AB04> { [      U0AA8, U0AA8   ]       };
      key <AB05> { [      U0AB5, U0AB5   ]       };
      key <AB06> { [      U0AB2, U0AB3  ]       };
      key <AB07> { [      U0AB8, U0AB6  ]       };
      key <AB08> { [      comma,     U0AB7  ]       };
      key <AB09> { [      period,    U0964  ]       };
      key <AB10> { [      U0AAF, question   ]       };
      include "rupeesign(4)"
      include "level3(ralt_switch)"
};

partial alphanumeric_keys
xkb_symbols "kan" {

    // InScript layout for Kannada  
    // Author : G Karunakar <karunakar@freedomink.org>
    // Date   : Wed Nov 13 17:22:58 IST 2002
    // Kannada digits mapped in basic only

    name[Group1]= "Kannada";

    key <TLDE> { [  U0cca, U0c92	] };
    key <AE01> { [  U0ce7			] };
    key <AE02> { [  U0ce8			] };
    key <AE03> { [  U0ce9			] };
    key <AE04> { [  U0cea			] };
    key <AE05> { [  U0ceb			] };
    key <AE06> { [  U0cec			] };
    key <AE07> { [  U0ced			] };
    key <AE08> { [  U0cee			] };
    key <AE09> { [  U0cef			] };
    key <AE10> { [  U0ce6			] };
    key <AE11> { [  U0c83			] };
    key <AE12> { [  U0cc3, U0c8b	] };

    key <AD01> { [  U0ccc, U0c94	] };
    key <AD02> { [  U0cc8, U0c90	] };
    key <AD03> { [  U0cbe, U0c86	] };
    key <AD04> { [  U0cc0, U0c88	] };
    key <AD05> { [  U0cc2, U0c8a	] };
    key <AD06> { [  U0cac, U0cad	] };
    key <AD07> { [  U0cb9, U0c99	] };
    key <AD08> { [  U0c97, U0c98	] };
    key <AD09> { [  U0ca6, U0ca7	] };
    key <AD10> { [  U0c9c, U0c9d	] };
    key <AD11> { [  U0ca1, U0ca2	] };
    key <AD12> { [  U0cbc, U0c9e	] };

    key <AC01> { [  U0ccb, U0c93	] };
    key <AC02> { [  U0cc7, U0c8f	] };
    key <AC03> { [  U0ccd, U0c85	] };
    key <AC04> { [  U0cbf, U0c87	] };
    key <AC05> { [  U0cc1, U0c89	] };
    key <AC06> { [  U0caa, U0cab	] };
    key <AC07> { [  U0cb0, U0cb1	] };
    key <AC08> { [  U0c95, U0c96	] };
    key <AC09> { [  U0ca4, U0ca5	] };
    key <AC10> { [  U0c9a, U0c9b	] };
    key <AC11> { [  U0c9f, U0ca0	] };

    key <AB01> { [  U0cc6, U0c8e	] };
    key <AB02> { [  U0c82			] };
    key <AB03> { [  U0cae, U0ca3	] };
    key <AB04> { [  U0ca8			] };
    key <AB05> { [  U0cb5, U0cb4	] };
    key <AB06> { [  U0cb2, U0cb3	] };
    key <AB07> { [  U0cb8, U0cb6	] };
    key <AB08> { [  comma     , U0cb7	] };
    key <AB09> { [  period    				] };
    key <AB10> { [  U0caf, U0040	] };

    key <RALT> {
	symbols[Group1] = [ Mode_switch, Multi_key ],
	virtualMods = AltGr
    };
    include "rupeesign(4)"
    include "level3(ralt_switch)"
};

// Description : A keymap for Malayalam
// Encoding    : Unicode (http://www.unicode.org)
// Author      : Baiju M <baiju@freeshell.org>
// Date        : Sat Aug  17 21:10:48 IST 2002
// Mapping:

partial alphanumeric_keys
xkb_symbols "mal" {

    name[Group1] = "Malayalam";

    //From grave to backslash (\)

    key <TLDE> { [ U0d4a , U0d12           ] };

// svu: 
// These lines were in former "mal" variant - 
// but the digits are replaced with the ones from 'mal_plusnum' -
// for the integrity of all Indian layouts
//
//    key <AE01> { [1           ,     exclam           ] };
//    key <AE02> { [2           ,         at           ] };
//    key <AE03> { [3           , numbersign           ] };
//    key <AE04> { [4           ,     dollar           ] };
//    key <AE05> { [5           ,    percent           ] };
//    key <AE06> { [6           ,asciicircum           ] };
//    key <AE07> { [7           ,  ampersand           ] };
//    key <AE08> { [8           , asterisk           ] };
//    key <AE09> { [9           ,  parenleft           ] };
//    key <AE10> { [0           , parenright           ] };

      key <AE01> { [ U0d67 ,      exclam ] };
      key <AE02> { [ U0d68 ,          at ] };
      key <AE03> { [ U0d69 ,  numbersign ] };
      key <AE04> { [ U0d6a ,      dollar ] };
      key <AE05> { [ U0d6b ,     percent ] };
      key <AE06> { [ U0d6c , asciicircum ] };
      key <AE07> { [ U0d6d ,   ampersand ] };
      key <AE08> { [ U0d6e ,  asterisk ] };
      key <AE09> { [ U0d6f ,   parenleft ] };
      key <AE10> { [ U0d66 ,  parenright ] };

    key <AE11> { [ minus      , U0d03           ] };
    key <AE12> { [ U0d43 , U0d0b           ] };
    key <BKSL>  { [U0200c, U05C ]};//bksl: ZWNJ 


    // From 'q' to right bracket (])

    key <AD01> { [ U0d4c , U0d14 ] };
    key <AD02> { [ U0d48 , U0d10 ] };
    key <AD03> { [ U0d3e , U0d06 ] };
    key <AD04> { [ U0d40 , U0d08 ] };
    key <AD05> { [ U0d42 , U0d0a ] };
    key <AD06> { [ U0d2c , U0d2d ] };
    key <AD07> { [ U0d39 , U0d19 ] };
    key <AD08> { [ U0d17 , U0d18 ] };
    key <AD09> { [ U0d26 , U0d27 ] };
    key <AD10> { [ U0d1c , U0d1d ] };
    key <AD11> { [ U0d21 , U0d22 ] };
    key <AD12> { [ U0200d , U0d1e ] };

    // From 'a' to apostrophe (')

    key <AC01> { [ U0d4b , U0d13 ] };
    key <AC02> { [ U0d47 , U0d0f ] };
    key <AC03> { [ U0d4d , U0d05 ] };
    key <AC04> { [ U0d3f , U0d07 ] };
    key <AC05> { [ U0d41 , U0d09 ] };
    key <AC06> { [ U0d2a , U0d2b ] };
    key <AC07> { [ U0d30 , U0d31 ] };
    key <AC08> { [ U0d15 , U0d16 ] };
    key <AC09> { [ U0d24 , U0d25 ] };
    key <AC10> { [ U0d1a , U0d1b ] };
    key <AC11> { [ U0d1f , U0d20 ] };

    // From 'z' to slash (/)

    key <AB01> { [ U0d46 , U0d0e ] };
    key <AB02> { [ U0d02 , U200b ] };//X:ZWSP
    key <AB03> { [ U0d2e , U0d23 ] };
    key <AB04> { [ U0d28 ] };
    key <AB05> { [ U0d35 , U0d34 ] };
    key <AB06> { [ U0d32 , U0d33 ] };
    key <AB07> { [ U0d38 , U0d36 ] };
    key <AB08> { [ comma      , U0d37 ] };
    key <AB09> { [ period     , U0200d ] };
    key <AB10> { [ U0d2f , question   ] };

    include "rupeesign(4)"
    include "level3(ralt_switch)"
};

//Name		:	Lalitha
//Description	:	A transliteration keyboard layout for Malayalam
//Original Author :	Noah Levitt<nlevitt at columbia.edu>
//Current Main  : 	Jinesh K.J<jinesh.k@gmail.com>, Swathantra Malayalam Computing (SMC)<smc-discuss@googlegroups.com>

partial alphanumeric_keys
xkb_symbols "mal_lalitha" {
     name[Group1] = "Malayalam (Lalitha)";
     key.type[group1]="FOUR_LEVEL";

    // Roman digits
    key <TLDE>  { [   U0D4D,	U0D02,		grave, 	asciitilde ] }; // grave: virama(chandrakala),anusvara
    key <AE01>  { [   1,	exclam,	U0D67,		exclam	   ] };
    key <AE02>  { [   2,	at,		U0D68,		at	   ] };
    key <AE03>  { [   3,    	numbersign, 	U0D69,		numbersign ] };
    key <AE04>  { [   4,	dollar,		U0D6A,		U20B9      ] }; // Rupee
    key <AE05>  { [   5,	percent,	U0D6B,		percent    ] };
    key <AE06>  { [   6,	asciicircum,	U0D6C,		asciicircum ] };
    key <AE07>  { [   7,	ampersand,	U0D6D,		ampersand  ] };
    key <AE08>  { [   8,	asterisk,	U0D6E,		asterisk   ] };
    key <AE09>  { [   9,	parenleft,	U0D6F,		parenleft  ] };
    key <AE10>  { [   0,	parenright,	U0D66,		parenright ] };
    key <AE11>	{ [   minus,	underscore	     ] };
    key <AE12>	{ [   equal,	plus		     ] };
    key <BKSL>  { [   U005C,	U007C,		U200C	] };//backslash:pipe,backslash,ZWNJ 

    //Q Row	
    key <AD01>   { [   U0D48,	U0D4C,	U0D10,	U0D14  ] }; // Q: ai and au matras 
    key <AD02>   { [   U0D35	] };  // W: wa, OM
    key <AD03>   { [   U0D46,   U0D47,	U0D0E,	U0D0F   ] };  // E: e,ee matras
    key <AD04>   { [   U0D30,	U0D31,	U0D43,	U0D0B  	] };  // R: ra,rra, vocalic Ri
    key <AD05>   { [   U0D24,   U0D25,	U0D1F,	U0D20   ] };  // T: tha, ttha,ta,tta
    key <AD06>   { [   U0D2f    ] };  // Y: ya
    key <AD07>   { [   U0D41,   U0D42,	U0D09,	U0D0A   ] };  // U: u, uu matras
    key <AD08>   { [   U0D3F,   U0D40,	U0D07,	U0D08   ] };  // I: i, ii matras
    key <AD09>   { [   U0D4A,   U0D4B,	U0D12,	U0D13   ] };  // O: o, oo matras
    key <AD10>   { [   U0D2A   ] };  // P: pa
    key <AD11>   { [   bracketleft,   braceleft   ] };//braceleft:   
    key <AD12>	 { [   bracketright, braceright   ] };//braceright:

    //A Row
    key <AC01>   { [   U0D3E,	 U0D05,	U0D06,	U0D05  ] };   // A: a,aa
    key <AC02>   { [   U0D38,    U0D37   ] };  // S: sa, ssa
    key <AC03>   { [   U0D26,    U0D27,	U0D21,	U0D22   ] };  // D: soft da,soft dda,hard da,hard dda,
    key <AC04>   { [   U0D2B     ] };  // F: pha
    key <AC05>   { [   U0D17,    U0D18   ] };  // G: ga, gha
    key <AC06>   { [   U0D39,    U0D03   ] };  // H: ha, visarg 
    key <AC07>   { [   U0D1C,    U0D1D   ] };  // J: ja, jha
    key <AC08>   { [   U0D15,    U0D16   ] };  // K: ka, kha
    key <AC09>   { [   U0D32,	 U0D33   ] };  // L: la, vocalic L or lru matra`
    key <AC10>   { [   semicolon, colon  ] };
    key <AC11>   { [apostrophe, quotedbl ] };

    //Z Row
    key <AB01>   { [   U0D34,	 U0D36 	 ] };  // Z: sha,zha
    key <AB02>   { [   U0D4D,	 U200B  ] };  // X: chandrakala,ZWSP
    key <AB03>   { [   U0D1A,    U0D1B   ] };  // C: ca, cha
    key <AB04>   { [   U0D35,	 U200D  ] };  // V: va,ZWJ
    key <AB05>   { [   U0D2C,    U0D2D   ] };  // B: ba, bha
    key <AB06>   { [   U0D28,    U0D23,	U0D19,	U0D1E   ] };  // N: na, hard na,nga,nha
    key <AB07>   { [   U0D2E,	 U0D02  ] };  // M: ma
    key <AB08>   { [   comma,    U003C ] };// comma: comma
    key <AB09>   { [   period, 	 U003E ] };  // period: period
    key <AB10>	 { [   slash,   question ] };

//    modifier_map Shift  { Shift_L };
//    modifier_map Lock   { Caps_Lock };
//    modifier_map Control{ Control_L };
//    modifier_map Mod3   { Mode_switch };
    include "level3(ralt_switch)"
};


partial alphanumeric_keys
xkb_symbols "olck" {

    // Layout for the Ol Chiki script.
    // http://www.unicode.org/L2/L2005/05243r-n2984-ol-chiki.pdf (figure 9)

    name[Group1]= "Ol Chiki";

    key <TLDE> { [  grave, U1C7B		] };

    key <AE01> { [  U1C51, exclam		] };
    key <AE02> { [  U1C52, at			] };
    key <AE03> { [  U1C53, numbersign		] };
    key <AE04> { [  U1C54, dollar, U20B9	] };
    key <AE05> { [  U1C55, percent		] };
    key <AE06> { [  U1C56, asciicircum		] };
    key <AE07> { [  U1C57, ampersand		] };
    key <AE08> { [  U1C58, asterisk		] };
    key <AE09> { [  U1C59, parenleft		] };
    key <AE10> { [  U1C50, parenright		] };
    key <AE11> { [  minus, U1C7C		] };
    key <AE12> { [  equal, plus			] };

    key <AD01> { [  U1C67			] };
    key <AD02> { [  U1C63			] };
    key <AD03> { [  U1C6E			] };
    key <AD04> { [  U1C68			] };
    key <AD05> { [  U1C74, U1C5B		] };
    key <AD06> { [  U1C6D  			] };
    key <AD07> { [  U1C69			] };
    key <AD08> { [  U1C64			] };
    key <AD09> { [  U1C5A, U1C73		] };
    key <AD10> { [  U1C6F  			] };
    key <AD11> { [  bracketleft, braceleft	] };
    key <AD12> { [  bracketright, braceright 	] };
    key <BKSL> { [  U1C7F, U1C7E		] };

    key <AC01> { [  U1C5F  			] };
    key <AC02> { [  U1C65			] };
    key <AC03> { [  U1C70, U1C6B		] };
    key <AC04> { [  U1C5D  			] };
    key <AC05> { [  U1C5C			] };
    key <AC06> { [  U1C66, U1C77		] };
    key <AC07> { [  U1C61  			] };
    key <AC08> { [  U1C60			] };
    key <AC09> { [  U1C5E			] };
    key <AC10> { [  semicolon, U1C7A		] };
    key <AC11> { [  apostrophe, quotedbl	] };

    key <AB01> { [  U1C72			] };
    key <AB02> { [  U1C7D			] };
    key <AB03> { [  U1C6A			] };
    key <AB04> { [  U1C76			] };
    key <AB05> { [  U1C75			] };
    key <AB06> { [  U1C71, U1C78		] };
    key <AB07> { [  U1C62, U1C6C		] };
    key <AB08> { [  comma, less			] };
    key <AB09> { [  U1C79, greater		] };
    key <AB10> { [  slash, question		] };

    key <RALT> {
	symbols[Group1] = [ Mode_switch, Multi_key ],
	virtualMods = AltGr
    };

    include "level3(ralt_switch)"
};


partial alphanumeric_keys
xkb_symbols "ori" {
    // InScript layout for Oriya  
    // Author: G Karunakar <karunakar@freedomink.org>
    // Date: Wed Nov 13 18:16:19 IST 2002

    name[Group1]= "Oriya";

    key <AE01> { [  U0b67			] };
    key <AE02> { [  U0b68			] };
    key <AE03> { [  U0b69			] };
    key <AE04> { [  U0b6a			] };
    key <AE05> { [  U0b6b			] };
    key <AE06> { [  U0b6c			] };
    key <AE07> { [  U0b6d			] };
    key <AE08> { [  U0b6e			] };
    key <AE09> { [  U0b6f			] };
    key <AE10> { [  U0b66			] };
    key <AE11> { [  U0b03			] };
    key <AE12> { [  U0b43, U0b0b	] };

    key <AD01> { [  U0b4c, U0b14	] };
    key <AD02> { [  U0b48, U0b10	] };
    key <AD03> { [  U0b3e, U0b06	] };
    key <AD04> { [  U0b40, U0b08	] };
    key <AD05> { [  U0b42, U0b0a	] };
    key <AD06> { [  U0b2c, U0b2d	] };
    key <AD07> { [  U0b39, U0b19	] };
    key <AD08> { [  U0b17, U0b18	] };
    key <AD09> { [  U0b26, U0b27	] };
    key <AD10> { [  U0b1c, U0b1d	] };
    key <AD11> { [  U0b21, U0b22	] };
    key <AD12> { [  U0b3c, U0b1e	] };

    key <AC01> { [  U0b4b, U0b13	] };
    key <AC02> { [  U0b47, U0b0f	] };
    key <AC03> { [  U0b4d, U0b05	] };
    key <AC04> { [  U0b3f, U0b07	] };
    key <AC05> { [  U0b41, U0b09	] };
    key <AC06> { [  U0b2a, U0b2b	] };
    key <AC07> { [  U0b30			] };
    key <AC08> { [  U0b15, U0b16	] };
    key <AC09> { [  U0b24, U0b25	] };
    key <AC10> { [  U0b1a, U0b1b	] };
    key <AC11> { [  U0b1f, U0b20	] };

    key <AB02> { [  U0b02, U0b01	] };
    key <AB03> { [  U0b2e, U0b23	] };
    key <AB04> { [  U0b28			] };
    key <AB05> { [  U0b35			] };
    key <AB06> { [  U0b32, U0b33	] };
    key <AB07> { [  U0b38, U0b36	] };
    key <AB08> { [  comma     , U0b37	] };
    key <AB09> { [  period    				] };
    key <AB10> { [  U0b2f, U0040	] };

    key <RALT> {
	symbols[Group1] = [ Mode_switch, Multi_key ],
	virtualMods = AltGr
    };
    include "rupeesign(4)"
    include "level3(ralt_switch)"
};

// Phonetic layout for Oriya like Hindi Bolnagiri
// Author: Lalit Mishra
// Date: 3rd March, 2021.
partial alphanumeric_keys
xkb_symbols "ori-bolnagri" {
     name[Group1] = "Oriya (Bolnagri)";
     key.type[group1]="FOUR_LEVEL";
    // Roman digits
    key <TLDE>  { [   U0B02,     U0B01,       grave,    asciitilde ] }; // grave: anusvara, candrabindu
    key <AE01>  { [   U0B67,     exclam,      1         ] };
    key <AE02>  { [   U0B68,     at,          2,        U20AC      ] };
    key <AE03>  { [   U0B69,     numbersign,  3,        U00A3      ] };
    key <AE04>  { [   U0B6A,     dollar,      4,        U20B9      ] }; // Rupee symbol on Shift+AltGr+4
    key <AE05>  { [   U0B6B,     percent,     5         ] };
    key <AE06>  { [   U0B6C,     asciicircum, 6         ] };
    key <AE07>  { [   U0B6D,     ampersand,   7         ] };
    key <AE08>  { [   U0B6E,     asterisk,    8         ] };
    key <AE09>  { [   U0B6F,     parenleft,   9         ] };
    key <AE10>  { [   U0B66,     parenright,  0         ] };
    key <AE11>  { [   minus,     underscore             ] };
    key <AE12>  { [   equal,     plus                   ] };
    key <BKSL>  { [   U0964,     U0965,       U007C,    U005C      ] }; //pipe : danda, double danda
    //Q Row
    key <AD01>  { [   U200C,     U200D        ] };                      // Q: ZWNJ, ZWJ
    key <AD02>  { [   U0B71,     U0B35        ] };                      // W: wa
    key <AD03>  { [   U0B47,     U0B48,       U0B0F,    U0B10      ] }; // E: e, ai matras
    key <AD04>  { [   U0B30,     U0B43,       U0B0B,    U0B60      ] }; // R: ra, vocalic Ri
    key <AD05>  { [   U0B24,     U0B25        ] };                      // T: ta, tha
    key <AD06>  { [   U0B2f,     U0B5F,       U0B1E     ] };            // Y: ya, nya
    key <AD07>  { [   U0B41,     U0B42,       U0B09,    U0B0A      ] }; // U: u, uu matras
    key <AD08>  { [   U0B3F,     U0B40,       U0B07,    U0B08      ] }; // I: i, ii matras
    key <AD09>  { [   U0B4B,     U0B4C,       U0B13,    U0B14      ] }; // O: o, au matras
    key <AD10>  { [   U0B2A,     U0B2B        ] };                      // P: pa, pha
    key <AD11>  { [   bracketleft,  braceleft ] };
    key <AD12>  { [   bracketright, braceright] };
    //A Row
    key <AC01>  { [   U0B3E,      U0B06,      U0B05,    U0B06      ] }; // A: aa, full A, AA
    key <AC02>  { [   U0B38,      U0B37       ] };                      // S: sa, ssa
    key <AC03>  { [   U0B26,      U0B27       ] };                      // D: da, dha
    key <AC04>  { [   U0B1F,      U0B20       ] };                      // F: TA, THA
    key <AC05>  { [   U0B17,      U0B18       ] };                      // G: ga, gha
    key <AC06>  { [   U0B39,      U0B03       ] };                      // H: ha, visarg
    key <AC07>  { [   U0B1C,      U0B1D       ] };                      // J: ja, jha
    key <AC08>  { [   U0B15,      U0B16       ] };                      // K: ka, kha
    key <AC09>  { [   U0B32,      U0B33,      U0B62,    U0B0C      ] }; // L: la, vocalic L or lru matra
    key <AC10>  { [   semicolon,  colon       ] };
    key <AC11>  { [   apostrophe, quotedbl    ] };
    //Z Row
    key <AB01>  { [   U0B36       ] };                                  // Z: sha, akaar candra
    key <AB02>  { [   U0B4D       ] };                                  // X: halant, aakaar candra, chandra A
    key <AB03>  { [   U0B1A,      U0B1B       ] };                      // C: ca, cha
    key <AB04>  { [   U0B21,      U0B22       ] };                      // V: da, dha
    key <AB05>  { [   U0B2C,      U0B2D       ] };                      // B: ba, bha
    key <AB06>  { [   U0B28,      U0B23       ] };                      // N: na, nna
    key <AB07>  { [   U0B2E,      U0B19,      U0B3D     ] };            // M: ma, nga, avagraha
    key <AB08>  { [   comma,      U0B70,      U0B44,    U0B61    ] };   // comma: comma, dev abbreviation sign
    key <AB09>  { [   period,     U0B3C,      U0B55     ] };            // period: period, nukta
    key <AB10>  { [   slash,      question    ] };

//    modifier_map Shift  { Shift_L };
//    modifier_map Lock   { Caps_Lock };
//    modifier_map Control{ Control_L };
//    modifier_map Mod3   { Mode_switch };

  include "level3(ralt_switch)"
};

// Phonetic layout for Oriya like Hindi Wx
// Author: Lalit Mishra
// Date: 3rd March, 2021.
partial alphanumeric_keys
xkb_symbols "ori-wx" {
    name[Group1]= "Oriya (Wx)";
      key <TLDE> {   [      grave,        asciitilde,  0x100200C, 0x100200D ] };
      key <AE01> {   [      0x1000B67,    exclam,      1 ] };
      key <AE02> {   [      0x1000B68,    at,          2,         0x10020AC  ] };
      key <AE03> {   [      0x1000B69,    numbersign,  3,         0x10000A3  ] };
      key <AE04> {   [      0x1000B6A,    dollar,      4,         0x10020B9  ] };
      key <AE05> {   [      0x1000B6B,    percent,     5 ] };
      key <AE06> {   [      0x1000B6C,    asciicircum, 6 ] };
      key <AE07> {   [      0x1000B6D,    ampersand,   7 ] };
      key <AE08> {   [      0x1000B6e,    asterisk,    8 ] };
      key <AE09> {   [      0x1000B6F,    parenleft,   9 ] };
      key <AE10> {   [      0x1000B66,    parenright,  0 ] };
      key <AE11> {   [      minus,        underscore   ] };
      key <AE12> {   [      equal,        plus         ] };
      key <AD01> {   [      0x1000B43,    0x1000B44,   0x1000B0B, 0x1000B60 ] };
      key <AD02> {   [      0x1000B24,    0x1000B25    ] };
      key <AD03> {   [      0x1000B47,    0x1000B48,   0x1000B0F, 0x1000B10 ] };
      key <AD04> {   [      0x1000B30,    0x1000B37    ] };
      key <AD05> {   [      0x1000B1F,    0x1000B20    ] };
      key <AD06> {   [      0x1000B2F,    0x1000B5F    ] };
      key <AD07> {   [      0x1000B41,    0x1000B42,   0x1000B09, 0x1000B0A ] };
      key <AD08> {   [      0x1000B3F,    0x1000B40,   0x1000B07, 0x1000B08 ] };
      key <AD09> {   [      0x1000B4B,    0x1000B4C,   0x1000B13, 0x1000B14 ] };
      key <AD10> {   [      0x1000B2A,    0x1000B2B    ] };
      key <AD11> {   [      bracketleft,  braceleft    ] };
      key <AD12> {   [      bracketright, braceright   ] };
      key <BKSL> {   [      0x1000964,    0x1000965,   backslash, bar       ] };
      key <AC01> {   [      0x1000B4D,    0x1000B3E,   0x1000B05, 0x1000B06 ] };
      key <AC02> {   [      0x1000B38,    0x1000B36    ] };
      key <AC03> {   [      0x1000B21,    0x1000B22    ] };
      key <AC04> {   [      0x1000B19,    0x1000B1E    ] };
      key <AC05> {   [      0x1000B17,    0x1000B18    ] };
      key <AC06> {   [      0x1000B39,    0x1000B03    ] };
      key <AC07> {   [      0x1000B1C,    0x1000B1D    ] };
      key <AC08> {   [      0x1000B15,    0x1000B16    ] };
      key <AC09> {   [      0x1000B32,    0x1000B62,   0x1000B33, 0x1000B0C ] };
      key <AC10> {   [      semicolon,    colon        ] };
      key <AC11> {   [      apostrophe,   quotedbl     ] };
      key <AB01> {   [      0x1000B01,    0x1000B3C,   0x1000B3D  ] };
      key <AB02> {   [      0x1000B26,    0x1000B27    ] };
      key <AB03> {   [      0x1000B1A,    0x1000B1B    ] };
      key <AB04> {   [      0x1000B71,    0x1000B35    ] };
      key <AB05> {   [      0x1000B2C,    0x1000B2D    ] };
      key <AB06> {   [      0x1000B28,    0x1000B23    ] };
      key <AB07> {   [      0x1000B2E,    0x1000B02    ] };
      key <AB08> {   [      comma,        less         ] };
      key <AB09> {   [      period,       greater      ] };
      key <AB10> {   [      slash,        question     ] };

  include "level3(ralt_switch)"
};

partial alphanumeric_keys
xkb_symbols "tam" {
      name[Group1]= "Tamil (InScript)";

      key <TLDE> { [      U0BCA, U0B92	]	};

      // Mainly numbers.
      key <AE01> { [      U0BE7 		]	};
      key <AE02> { [      U0BE8 		]	};
      key <AE03> { [      U0BE9 		]	};
      key <AE04> { [      U0BEA 		]	};
      key <AE05> { [      U0BEB 		]	};
      key <AE06> { [      U0BEC 		]	};
      key <AE07> { [      U0BED        	]	};
      key <AE08> { [      U0BEE 		]	};
      key <AE09> { [      U0BEF, parenleft	]	};
      key <AE10> { [      U0BF0, parenright	]	};
      key <AE11> { [      U0BF1, U0B83  ]	};
      key <AE12> { [      U0BF2, plus	] 	};

// Mainly long vowels

      key <AD01> { [      U0BCC,  U0B94 ]	};
      key <AD02> { [      U0BC8,  U0B90 ]	};
      key <AD03> { [      U0BBE,  U0B86 ]	};
      key <AD04> { [      U0BC0,  U0B88 ]	};
      key <AD05> { [      U0BC2,  U0B8A ]	};

// Mainly voiced consonants

      key <AD07> { [      U0BB9, U0B99	]	};
      key <AD10> { [      U0B9c 	]	};
      key <AD12> { [      U0B9E				]	};

// Mainly short vowels
      key <AC01> { [      U0BCB,  U0B93 ]	};
      key <AC02> { [      U0BC7,  U0B8F ]	};
      key <AC03> { [      U0BCD,  U0B85 ]	};
      key <AC04> { [      U0BBF,  U0B87 ]	};
      key <AC05> { [      U0BC1,  U0B89 ]	};

// Mainly unvoiced consonants

      key <AC06> { [      U0BAA 		]	};
      key <AC07> { [      U0BB0,  U0BB1 ]	};
      key <AC08> { [      U0B95 		]	};
      key <AC09> { [      U0BA4 		]	};
      key <AC10> { [      U0B9A 		]	};
      key <AC11> { [      U0B9F 		]	};
      key <BKSL> { [      U005C, U007C	]	};//backslash-bar  - Changed to Unicode

      key <AB01> { [      U0BC6,  U0B8E	]	};
      key <AB02> { [      U0B82   		]       };
      key <AB03> { [      U0BAE,  U0BA3 ]       };
      key <AB04> { [      U0BA8,  U0BA9 ]       };
      key <AB05> { [      U0BB5,  U0BB4 ]       };
      key <AB06> { [      U0BB2,  U0BB3 ]       };
      key <AB07> { [      U0BB8,  U0BB6	]       };
      key <AB08> { [      comma,      U0BB7 ]       };
      key <AB09> { [      period,     U0964 ]       };
      key <AB10> { [      U0BAF,  question  ]       };

      include "level3(ralt_switch)"
      include "rupeesign(4)"
};

partial alphanumeric_keys
xkb_symbols "tam_tamilnet" {

// Description: A keymap based on the TamilNet'99 typewriter keyboard 
// Encoding: Unicode (http://www.unicode.org)
// Author: Thuraiappah Vaseeharan <vasee@ieee.org>
// Modifed by: Malathi S <malathiramya@gmail.com>
// Secondary contact: Sri Ramadoss M <amachu@au-kbc.org>
// Date  : Fri Sep 4 11:32:00 CST 2009
// Mapping:

    name[Group1]= "Tamil (TamilNet '99)";

    // granthas
    key <TLDE> {  [ apostrophe, asciitilde ] };
    key <AE01> {  [ U0031, exclam ] } ;
    key <AE02> {  [ U0032, at ] } ;
    key <AE03> {  [ U0033, numbersign ] } ;
    key <AE04> {  [ U0034, U0BF9 ] } ;
    key <AE05> {  [ U0035, percent ] } ;
    key <AE06> {  [ U0036, asciicircum ] } ;
    key <AE07> {  [ U0037, ampersand ] } ;
    key <AE08> {  [ U0038, asterisk ] } ;
    key <AE09> {  [ U0039, parenleft ] } ;
    key <AE10> {  [ U0030, parenright ] } ;
    key <AE11> {  [ minus, underscore ] };
    key <AE12> {  [ equal, plus	] };


    // Qrow
    key <AD01> {  [ U0B9E, U0BB6 ] };
    key <AD02> {  [ U0BB1, U0BB7 ] };
    key <AD03> {  [ U0BA8, U0BB8 ] };
    key <AD04> {  [ U0B9A, U0BB9 ] };
    key <AD05> {  [ U0BB5, U0B9C ] };
    key <AD06> {  [ U0BB2 ] };
    key <AD07> {  [ U0BB0 ] };
    key <AD08> {  [ U0BC8, U0B90 ] };
    key <AD09> {  [ U0BCA, U0BCB ] };
    key <AD10> {  [ U0BBF, U0BC0 ] };
    key <AD11> {  [ U0BC1, U0BC2 ] };

    // Arow
    key <AC01> { [ U0BAF ] };
    key <AC02> { [ U0BB3 ] };
    key <AC03> { [ U0BA9 ] };
    key <AC04> { [ U0B95 ] };
    key <AC05> { [ U0BAA ] };
    key <AC06> { [ U0BBE, U0BB4 ] };
    key <AC07> { [ U0BA4 ] };
    key <AC08> { [ U0BAE ] };
    key <AC09> { [ U0B9F ] };
    key <AC10> { [ U0BCD, U0B83 ] };
    key <AC11> { [ U0B99 ] };

    // Zrow
    key <AB01> { [ U0BA3 ]  };
    key <AB02> { [ U0B92, U0B93 ]  };
    key <AB03> { [ U0B89, U0B8A ]  };
    key <AB04> { [ U0B8E, U0B8F ]  };
    key <AB05> { [ U0BC6, U0BC7 ]  };
    key <AB06> { [ U0B94, U0BCC ]  };
    key <AB07> { [ U0B85, U0B86 ]  };
    key <AB08> { [ U0B87, U0B88 ]  };
};

partial alphanumeric_keys
xkb_symbols "tam_tamilnet_with_tam_nums" {

// Description: A keymap based on the TamilNet'99 typewriter keyboard 
// Encoding: Unicode (http://www.unicode.org)
// Author: Malathi S <malathiramya@gmail.com>
// Secondary contact: Sri Ramadoss M <amachu@au-kbc.org>
// Date  : Fri Sep 4 11:33:00 CST 2009
// Mapping:

      name[Group1]= "Tamil (TamilNet '99 with Tamil numerals)";

      // Mainly numbers.
      key <TLDE> { [ apostrophe, asciitilde ] };
      key <AE01> { [ U0BE7, exclam ] };
      key <AE02> { [ U0BE8, at ] };
      key <AE03> { [ U0BE9, numbersign ] };
      key <AE04> { [ U0BEA, U0BF9 ] };
      key <AE05> { [ U0BEB, percent ] };
      key <AE06> { [ U0BEC, asciicircum ] };
      key <AE07> { [ U0BED, ampersand ] };
      key <AE08> { [ U0BEE, asterisk ] };
      key <AE09> { [ U0BEF, parenleft ] };
      key <AE10> { [ U0BE6, parenright ] };
      key <AE11> { [ minus, underscore ] };
      key <AE12> { [ equal, plus ] };


    // Qrow
    key <AD01> {  [ U0B9E, U0BB6 ] };
    key <AD02> {  [ U0BB1, U0BB7 ] };
    key <AD03> {  [ U0BA8, U0BB8 ] };
    key <AD04> {  [ U0B9a, U0BB9 ] };
    key <AD05> {  [ U0BB5, U0B9c ] };
    key <AD06> {  [ U0BB2 ] };
    key <AD07> {  [ U0BB0 ] };
    key <AD08> {  [ U0BC8, U0B90 ] };
    key <AD09> {  [ U0BCA, U0BCB ] };
    key <AD10> {  [ U0BBF, U0BC0 ] };
    key <AD11> {  [ U0BC1, U0BC2 ] };

    // Arow
    key <AC01> { [ U0BAF ] };
    key <AC02> { [ U0BB3 ] };
    key <AC03> { [ U0BA9 ] };
    key <AC04> { [ U0B95 ] };
    key <AC05> { [ U0BAA ] };
    key <AC06> { [ U0BBE, U0BB4 ] };
    key <AC07> { [ U0BA4 ] };
    key <AC08> { [ U0BAE ] };
    key <AC09> { [ U0B9F ] };
    key <AC10> { [ U0BCD, U0B83 ] };
    key <AC11> { [ U0B99 ] };

    // Zrow
    key <AB01> { [ U0BA3 ]  };
    key <AB02> { [ U0B92, U0B93 ]  };
    key <AB03> { [ U0B89, U0B8A ]  };
    key <AB04> { [ U0B8E, U0B8F ]  };
    key <AB05> { [ U0BC6, U0BC7 ]  };
    key <AB06> { [ U0B94, U0BCC ]  };
    key <AB07> { [ U0B85, U0B86 ]  };
    key <AB08> { [ U0B87, U0B88 ]  };
};

partial alphanumeric_keys
xkb_symbols "tam_tamilnet_TSCII" {

// Description	: A Tamil typewrite-style keymap 
//		  loosely based on TamilNet'99 reommendations 
// Encoding	: TSCII (http://www.tscii.org)
// Author	: Thuraiappah Vaseeharan <vasee@ieee.org>
// Last Modified: Sat Jan  5 17:11:26 CST 2002

    name[Group1]= "Tamil (TamilNet '99, TSCII encoding)";

    key <AE01> {  [ 0x10000b7, 0x10000a4 ] }; // aytham
    key <AE02> {  [ 0x1000082, 0x10000a5 ] }; // shri
    key <AE03> {  [ 0x1000083, 0x1000088 ] }; // ja
    key <AE04> {  [ 0x1000084, 0x1000089 ] }; // sha
    key <AE05> {  [ 0x1000085, 0x100008a ] }; // sa
    key <AE06> {  [ 0x1000086, 0x100008b ] }; // ha
    key <AE07> {  [ 0x1000087, 0x100008c ] }; // ksha

    // Qrow
    key <AD01> {  [ 0x10000bb, 0x100009a ] }; // nja
    key <AD02> {  [ 0x10000c8, 0x10000da ] }; // Ra
    key <AD03> {  [ 0x10000bf, 0x10000d1 ] }; // NNa
    key <AD04> {  [ 0x10000ba, 0x10000cd ] }; // ca
    key <AD05> {  [ 0x10000c5, 0x10000d7 ] }; // va
    key <AD06> {  [ 0x10000c4, 0x10000d6 ] }; // la
    key <AD07> {  [ 0x10000c3, 0x10000d5 ] }; // ra
    key <AD08> {  [ 0x10000a8, 0x10000b3 ] }; // sangili, ai
    key <AD09> {  [ 0x10000ca, 0x10000cb ] }; // di, dI
    key <AD10> {  [ 0x10000a2, 0x10000a3 ] }; // visiri
    key <AD11> {  [ dead_acute, 0x10000a3 ] }; // Ukaaram

    // Arow
    key <AC01> { [ 0x10000c2, 0x10000d4 ] }; // ya
    key <AC02> { [ 0x10000c7, 0x10000d9 ] }; // La
    key <AC03> { [ 0x10000c9, 0x10000db ] }; // na
    key <AC04> { [ 0x10000b8, 0x10000cc ] }; // ka
    key <AC05> { [ 0x10000c0, 0x10000d2 ] }; // pa
    key <AC06> { [ dead_grave,0x10000a1 ] }; // pulli,aravu
    key <AC07> { [ 0x10000be, 0x10000d0 ] }; // tha
    key <AC08> { [ 0x10000c1, 0x10000d3 ] }; // ma
    key <AC09> { [ 0x10000bc, 0x10000ce ] }; // da
    key <AC10> { [ 0x10000c6, 0x10000d8 ] }; // zha
    key <AC11> { [ 0x10000b9, 0x1000099 ] }; // nga

    // Zrow
    key <AB01> { [ 0x10000bd, 0x10000cf ] }; // Na
    key <AB02> { [ 0x10000b4, 0x10000b5 ] }; // o, O
    key <AB03> { [ 0x10000af, 0x10000b0 ] }; // u, U
    key <AB04> { [ 0x10000b1, 0x10000b2 ] }; // e, E
    key <AB05> { [ 0x10000a6, 0x10000a7 ] }; // kombus
    key <AB06> { [ 0x10000b6, 0x10000aa ] }; // au
    key <AB07> { [ 0x10000ab, 0x10000ac ] }; // a, A
    key <AB08> { [ 0x10000fe, 0x10000ae ] }; // i, I
};

partial alphanumeric_keys
xkb_symbols "tam_tamilnet_TAB" {

// Description: A keymap based on the TamilNet'99 typewriter keyboard 
// Encoding: TAB (http://www.tamilnet99.org)
// Author: Thuraiappah Vaseeharan <t_vasee@yahoo.com>
// Date  : Sun Aug 12 02:23:00 CDT 2001

    name[Group1]= "Tamil (TamilNet '99, TAB encoding)";

    // numeral row
    key <AE01> {  [ 0x10000e7, 0x10000a7 ] } ;
    key <AE02> {  [ 0x10000fa, 0x10000a8 ] } ;
    key <AE03> {  [ 0x10000fb ] } ;
    key <AE04> {  [ 0x10000fc ] } ;
    key <AE05> {  [ 0x10000fd ] } ;
    key <AE06> {  [ 0x10000fe ] } ;
    key <AE07> {  [ 0x10000ff ] } ;

    // q-row
    key <AD01> {  [ 0x10000eb, 0x10000b3 ] };
    key <AD02> {  [ 0x10000f8, 0x10000c1 ] };
    key <AD03> {  [ 0x10000ef, 0x10000b8 ] };
    key <AD04> {  [ 0x10000ea, 0x10000b2 ] };
    key <AD05> {  [ 0x10000f5, 0x10000be ] };
    key <AD06> {  [ 0x10000f4, 0x10000bd ] };
    key <AD07> {  [ 0x10000f3, 0x10000bc ] };
    key <AD08> {  [ 0x10000ac, 0x10000e4 ] };
    key <AD09> {  [ 0x10000ae, 0x10000af ] };
    key <AD10> {  [ 0x10000a4, 0x10000a6 ] };
    key <AD11> {  [ dead_circumflex, 0x10000a6 ] }; // Ukaaram

    // a-row
    key <AC01> {  [ 0x10000f2, 0x10000bb ] };
    key <AC02> {  [ 0x10000f7, 0x10000c0 ] };
    key <AC03> {  [ 0x10000f9, 0x10000c2 ] };
    key <AC04> {  [ 0x10000e8, 0x10000b0 ] };
    key <AC05> {  [ 0x10000f0, 0x10000b9 ] };
    key <AC06> {  [ 0x10000a2, 0x10000a3 ] };
    key <AC07> {  [ 0x10000ee, 0x10000b6 ] };
    key <AC08> {  [ 0x10000f1, 0x10000ba ] };
    key <AC09> {  [ 0x10000ec, 0x10000b4 ] };
    key <AC10> {  [ 0x10000f6, 0x10000bf ] };
    key <AC11> {  [ 0x10000e9, 0x10000b1 ] };

    // z-row
    key <AB01> {  [ 0x10000ed, 0x10000b5 ] };
    key <AB02> {  [ 0x10000e5, 0x10000e6 ] };
    key <AB03> {  [ 0x10000e0, 0x10000e1 ] };
    key <AB04> {  [ 0x10000e2, 0x10000e3 ] };
    key <AB05> {  [ 0x10000aa, 0x10000ab ] };
    key <AB06> {  [ 0x10000ac, 0x10000a3 ] };
    key <AB07> {  [ 0x10000dc, 0x10000dd ] };
    key <AB08> {  [ 0x10000de, 0x10000df ] };
};

partial alphanumeric_keys
xkb_symbols "tel" {

    // InScript layout for Telugu using Unicode 
    // Author: G Karunakar <karunakar@freedomink.org>
    // Date:
    // See layout at http://www.indlinux.org/keymap/telugu.php

    name[Group1]= "Telugu";

    key <TLDE> { [  U0c4a, U0c12	] };
    key <AE01> { [  U0c67			] };
    key <AE02> { [  U0c68			] };
    key <AE03> { [  U0c69, numbersign	] };
    key <AE04> { [  U0c6a, dollar		] };
    key <AE05> { [  U0c6b, percent		] };
    key <AE06> { [  U0c6c, asciicircum	] };
    key <AE07> { [  U0c6d, ampersand	] };
    key <AE08> { [  U0c6e, asterisk	] };
    key <AE09> { [  U0c6f, parenleft	] };
    key <AE10> { [  U0c66, parenright	] };
    key <AE11> { [  U0c03, underscore	] };
    key <AE12> { [  U0c43, U0c0b	] };
    key <BKSP> { [  BackSpace			] };

    key <AD01> { [  U0c4c, U0c14	] };
    key <AD02> { [  U0c48, U0c10	] };
    key <AD03> { [  U0c3e, U0c06	] };
    key <AD04> { [  U0c40, U0c08	] };
    key <AD05> { [  U0c42, U0c0a	] };
    key <AD06> { [  U0c2c, U0c2d	] };
    key <AD07> { [  U0c39, U0c19	] };
    key <AD08> { [  U0c17, U0c18	] };
    key <AD09> { [  U0c26, U0c27	] };
    key <AD10> { [  U0c1c, U0c1d	] };
    key <AD11> { [  U0c21, U0c22	] };
    key <AD12> { [  U0c1e			] };

    key <AC01> { [  U0c4b, U0c13	] };
    key <AC02> { [  U0c47, U0c0f	] };
    key <AC03> { [  U0c4d, U0c05	] };
    key <AC04> { [  U0c3f, U0c07	] };
    key <AC05> { [  U0c41, U0c09	] };
    key <AC06> { [  U0c2a, U0c2b	] };
    key <AC07> { [  U0c30, U0c31	] };
    key <AC08> { [  U0c15, U0c16	] };
    key <AC09> { [  U0c24, U0c25	] };
    key <AC10> { [  U0c1a, U0c1b	] };
    key <AC11> { [  U0c1f, U0c20	] };

    key <AB01> { [  U0c46, U0c0e	] };
    key <AB02> { [  U0c02, U0c01	] };
    key <AB03> { [  U0c2e, U0c23	] };
    key <AB04> { [  U0c28			] };
    key <AB05> { [  U0c35			] };
    key <AB06> { [  U0c32, U0c33	] };
    key <AB07> { [  U0c38, U0c36	] };
    key <AB08> { [  comma     , U0c37	] };
    key <AB09> { [  period    				] };
    key <AB10> { [  U0c2f, U0040	] };

    key <RALT> {        
        symbols[Group1] = [ Mode_switch, Multi_key ],
        virtualMods = AltGr
    };
    include "rupeesign(4)"
    include "level3(ralt_switch)"
};

//Name                  :       Sarala
//Description           :       This is an adaptation of the Sarala keyboard (http://www.medhajananam.org/sarala/) developed 
//                              by Krishna Dhullipalla. Because of the way keyboard shortcuts are laid out in KDE, the keyboard
//                              modifiers had to be changed. The layout does not take any part of the original Sarala keyboard 
//                              code however. It has been developed from scratch, so the experience may differ.
//			        
//                              There is a ibus-m17n version of Sarala layout developed by Satya Pothamsetti <potham@gmail.com> on 
//                              http://www.medhajananam.org/.
//Standard		:	Supports Unicode 9.0.	 
//Help			:	This layout differs slightly from the layout on Medhajenanam. The layout has been depicted in the 
//				pdf file attached to this post on Sarala google group.
//				(https://groups.google.com/forum/#!topic/sarala-keyboard/-gsa90dUFcs).
//
//Layout Developed by   :       Krishna Dhullipalla <krishnadvr@yahoo.com> (http://www.medhajananam.org/)
//Author                :       Venkat R Akkineni <venkatram.akkineni@india.com>
//Date			:	Apr 28 2017
partial alphanumeric_keys
xkb_symbols "tel-sarala"
{
    name[Group1] = "Telugu (Sarala)";
    key.type[group1]="FOUR_LEVEL";
    // sequence 									  base, shift, alt, alt + shift
    key <AB01> { [          U0C4A,          U0C12                                 ] }; // ొ ఒ
    key <AB02> { [          U0C42,          U0C0A                                 ] }; // ూ ఊ
    key <AB03> { [          U0C21,          U0C22                                 ] }; // డ ఢ
    key <AB04> { [          U0C35,          U0C39                                 ] }; // వ హ
    key <AB05> { [          U0C2C,          U0C2D                                 ] }; // బ భ
    key <AB06> { [          U0C28,          U0C23                                 ] }; // న ణ
    key <AB07> { [          U0C2E,          U0C01                                 ] }; // మ ఁ
    key <AB08> { [         U002C,          U0C1E,      leftcaret 	    	  ] }; // , ఞ <
    key <AB09> { [         U002E,          U0C19,     rightcaret              	  ] }; // . ఙ >
    key <AB10> { [          U0C36,       question,      KP_Divide                 ] }; // శ ? /
    key <AC01> { [          U0C2F,          U0C3D           			  ] }; // య ఽ
    key <AC02> { [          U0C02,          U0C03                                 ] }; // ం ః
    key <AC03> { [          U0C26,          U0C27                                 ] }; // ద ధ
    key <AC04> { [          U0C4D,          U0C05                                 ] }; // ్ అ
    key <AC05> { [          U0C17,          U0C18                                 ] }; // గ ఘ
    key <AC06> { [          U0C1A,          U0C1B,          U0C58,          U0C59 ] }; // చ ఛ ౘ ౙ
    key <AC07> { [          U0C3E,          U0C06                                 ] }; // ా ఆ
    key <AC08> { [          U0C15,          U0C16,          U0C62,          U0C63 ] }; // క ఖ ౢ ౣ
    key <AC09> { [          U0C32,          U0C33,          U0C0C,          U0C61 ] }; // ల ళ ఌ ౡ
    key <AC10> { [          U0C1F,          U0C20,      semicolon,          colon ] }; // ట ఠ ; :
    key <AC11> { [     quoteright,       quotedbl	    	    		  ] }; // ' " 
    key <AD01> { [          U0C46,          U0C0E,          U0C44,          U0C34 ] }; // ె ఎ ౄ ఴ
    key <AD02> { [          U0C38,          U0C37,          U0C44                 ] }; // స ష ౄ
    key <AD03> { [          U0C47,          U0C0F,          U0C44                 ] }; // ే ఏ ౄ
    key <AD04> { [          U0C30,          U0C31,          U0C44,          U0C60 ] }; // ర ఱ ౄ ౠ
    key <AD05> { [          U0C24,          U0C25                                 ] }; // త థ
    key <AD06> { [          U0C40,          U0C08                                 ] }; // ీ ఈ
    key <AD07> { [          U0C41,          U0C09                                 ] }; // ు ఉ
    key <AD08> { [          U0C3F,          U0C07                                 ] }; // ి ఇ
    key <AD09> { [          U0C4B,          U0C13                                 ] }; // ో ఓ
    key <AD10> { [          U0C2A,          U0C2B                                 ] }; // ప ఫ
    key <AD11> { [          U0C1C,          U0C1D,    bracketleft,      braceleft ] }; // జ ఝ [ {
    key <AD12> { [          U0C48,          U0C10,   bracketright,     braceright ] }; // ై ఐ ] }
    key <AE01> { [           KP_1,         exclam,          U0C67,          U0C78 ] }; // 1 ! ౦ ౸
    key <AE02> { [           KP_2,             at,          U0C68,          U0C79 ] }; // 2 @ ౨ ౹
    key <AE03> { [           KP_3,     numbersign,          U0C69,          U0C7A ] }; // 3 # ౩ ౺
    key <AE04> { [           KP_4,         dollar,          U0C6A,          U0C7B ] }; // 4 $ ౪ ౻
    key <AE05> { [           KP_5,        percent,          U0C6B,          U0C7C ] }; // 5 % ౫ ౼
    key <AE06> { [           KP_6,    asciicircum,          U0C6C,          U0C7D ] }; // 6 ^ ౬ ౽
    key <AE07> { [           KP_7,      ampersand,          U0C6D,          U0C7E ] }; // 7 & ౭ ౾
    key <AE08> { [           KP_8,    KP_Multiply,          U0C6E,          U0C7F ] }; // 8 * ౮ ౿
    key <AE09> { [           KP_9,         U0028,           U0C6F,          U20B9 ] }; // 9 ( ౯ ₹
    key <AE10> { [           KP_0,         U0029,           U0C66,          U0C55 ] }; // 0 ) ౦ ౕ
    key <AE11> { [    KP_Subtract,       underbar,       NoSymbol,          U0C56 ] }; // - _  ౖ
    key <AE12> { [       KP_Equal,         KP_Add                                 ] }; // = +
    key <BKSL> { [          U0C4C,          U0C14,          U0964,          U0965 ] }; // ౌ ఔ । ॥
    key <TLDE> { [          U0C43,          U0C0B,      quoteleft,     asciitilde ] }; // ృ ఋ ` ~
    
    include "level3(ralt_switch)" 
};

partial alphanumeric_keys 
xkb_symbols "urd-phonetic" {
    include "pk(urd-phonetic)"
    name[Group1]= "Urdu (phonetic)";
};

partial alphanumeric_keys
xkb_symbols "urd-phonetic3" {
    include "pk(urd-crulp)"
    name[Group1]= "Urdu (alt. phonetic)";
};

partial alphanumeric_keys
xkb_symbols "urd-winkeys" {
    include "pk(urd-nla)"
    name[Group1]= "Urdu (Windows)";
};

partial alphanumeric_keys
xkb_symbols "guru" {
      name[Group1]= "Punjabi (Gurmukhi)";

      // Mainly numbers.
      key <AE01> { [      U0A67 		]	};
      key <AE02> { [      U0A68		]	};
      key <AE03> { [      U0A69, U0A71	]	};
      key <AE04> { [      U0A6A, U0A74	 	]	};
      key <AE05> { [      U0A6B, U262C		]	};
      key <AE06> { [      U0A6C  	 	]	};
      key <AE07> { [      U0A6D 		]	};
      key <AE08> { [      U0A6e  	 	]	};
      key <AE09> { [      U0A6F, parenleft 	]	};
      key <AE10> { [      U0A66, parenright ]	};
      key <AE11> { [      U0A03 	 	]	};
      key <AE12> { [      equal,	plus 	]	};

// Mainly long vowels

      key <AD01> { [      U0A4C, U0A14  ]	};
      key <AD02> { [      U0A48, U0A10  ]	};
      key <AD03> { [      U0A3E, U0A06  ]	};
      key <AD04> { [      U0A40, U0A08  ]	};
      key <AD05> { [      U0A42, U0A0A  ]	};

// Mainly voiced consonants

      key <AD06> { [      U0A2C, U0A2D 	]	};
      key <AD07> { [      U0A39, U0A19 	]	};
      key <AD08> { [      U0A17, U0A18 	]	};
      key <AD09> { [      U0A26, U0A27 	]	};
      key <AD10> { [      U0A1C, U0A1D 	]	};
      key <AD11> { [      U0A21, U0A22 	]	};
      key <AD12> { [      U0A3C, U0A1E 	]	};

// Mainly short vowels
      key <AC01> { [      U0A4B, U0A13  ]	};
      key <AC02> { [      U0A47, U0A0F  ]	};
      key <AC03> { [      U0A4D, U0A05  ]	};
      key <AC04> { [      U0A3F, U0A07  ]	};
      key <AC05> { [      U0A41, U0A09  ]	};

// Mainly unvoiced consonants

      key <AC06> { [      U0A2A, U0A2B 	]	};
      key <AC07> { [      U0A30, U0A5C 	]	};
      key <AC08> { [      U0A15, U0A16 	]	};
      key <AC09> { [      U0A24, U0A25 	]	};
      key <AC10> { [      U0A1A, U0A1B 	]	};
      key <AC11> { [      U0A1F, U0A20 	]	};
      key <BKSL> { [      U005C, U007C	]	};

      key <AB01> { [      z, 	 U0A01	]       };
      key <AB02> { [      U0A02, U0A70, U0A71  ]       };
      key <AB03> { [      U0A2E, U0A23  ]       };
      key <AB04> { [      U0A28, U0A28  ]       };
      key <AB05> { [      U0A35, U0A35  ]       };
      key <AB06> { [      U0A32, U0A33  ]       };
      key <AB07> { [      U0A38, U0A36  ]       };
      key <AB08> { [      comma,     less       ]       };
      key <AB09> { [      period,    U0964  ]       };
      key <AB10> { [      U0A2F, question   ]       };

    include "rupeesign(4)"
    include "level3(ralt_switch)"
};

//Name		:	Jhelum (Refind InScript)
//Description	:	A Jhelum keyboard layout for Gurmukhi (Punjabi)
//			http://www.satluj.org/Jhelum.html
//Modified for InScript to make
//Original Author :	Amanpreet Singh Alam <apreet.alam@gmail.com

partial alphanumeric_keys
xkb_symbols "jhelum" {
      name[Group1] = "Punjabi (Gurmukhi Jhelum)";
          key.type[group1]="FOUR_LEVEL";

     // Roman digits
     key <TLDE>  { [  grave, asciitilde, U0A02,U0A01 ] }; // grave: anusvara, candrabindu
     key <AE01>  { [   1,exclam,	U0A67,	exclam	   ] };
     key <AE02>  { [   2,at,	U0A68,	at	   ] };
     key <AE03>  { [   3,numbersign, U0A69,	numbersign ] };
     key <AE04>  { [   4,dollar,	U0A6A		 ] };
     key <AE05>  { [   5,percent,U0A6B,	percent    ] };
     key <AE06>  { [   6,U0A73, U0A6C,asciicircum ] };
     key <AE07>  { [   7,U0A72,U0A6D,ampersand  ] };
     key <AE08>  { [   8,asterisk,U0A6E,	asterisk   ] };
     key <AE09>  { [   9,parenleft,U0A6F,parenleft  ] };
     key <AE10>  { [   0,parenright,U0A66,parenright ] };
     key <AE11>	{ [   minus,underscore] };
     key <AE12>	{ [   equal,plus] };
     key <BKSL>  { [   U0964,U0965,U007C,U005C] }; //pipe : danda, double danda

     //Q Row	
     key <AD01>   { [   U0A4C, 	U0A14   ] };  // Q: oo, ooh
     key <AD02>   { [   U0A48,  	U0A10	] };  // W: ee, ae
     key <AD03>   { [   U0A3E,   U0A06  ] };  // E: a, aa
     key <AD04>   { [   U0A40,	U0A08, U20B9  	] };  // R: ee, ai, rupeesign
     key <AD05>   { [   U0A42,   U0A0A   ] };  // T: u, uu
     key <AD06>   { [   U0A30,	U0A5C   ] };  // Y: ra, raa
     key <AD07>   { [   U0A26,   U0A27   ] };  // U: tha, thha
     key <AD08>   { [   U0A17,   U0A18, U0A5A   ] };  // I:ga, gha
     key <AD09>   { [   U0A24,   U0A1F   ] };  // O: ta, tha
     key <AD10>   { [   U0A2A,   U0A5E, VoidSymbol,U0A5E  ] };  // P: pa, pha
     key <AD11>   { [   U0A21,   U0A22,   bracketleft,   braceleft   ] };
     key <AD12>	 { [   U0A19,   U0A1E,   bracketright, braceright   ] };

     //A Row
     key <AC01>   { [   U0A4B,	 U0A13  ] };   // A: o, oo
     key <AC02>   { [   U0A47,    U0A0F   ] };  // S: e, ee
     key <AC03>   { [   U0A4D,    U0A05   ] };  // D: halant, aa
     key <AC04>   { [   U0A3F,    U0A07   ] };  // F: i, aa
     key <AC05>   { [   U0A41,    U0A09   ] };  // G: u, uh
     key <AC06>   { [   U0A39,    U0A20   ] };  // H: ha, thha
     key <AC07>   { [   U0A1C,    U0A1D, U0A5B   ] };  // J: ja, jha
     key <AC08>   { [   U0A15,    U0A16,VoidSymbol ,U0A59   ] };  // K: ka, kha
     key <AC09>   { [   U0A32,	 U0A25, U0A33   ] };  // L: la, tha
     key <AC10>   { [   U0A38,   colon, U0A36  ] }; //; sa
     key <AC11>   { [apostrophe, quotedbl ] };

     //Z Row
     key <AB01>   { [   U0A71,	 U0A3C 	 ] };  // Z: addak, par bindi
     key <AB02>   { [   U0A02,    U0A70	 ] };  // X: bindi, tippi
     key <AB03>   { [   U0A1A,    U0A1B   ] };  // C: ca, cha
     key <AB04>   { [   U0A35,    U0A2F   ] };  // V: va, ya
     key <AB05>   { [   U0A2C,    U0A2D   ] };  // B: ba, bha
     key <AB06>   { [   U0A28,    U0A23   ] };  // N: na, nha
     key <AB07>   { [   U0A2E, U0A2E       ] };  // M: ma
     key <AB08>   { [   comma,    U262C	 ] };// comma: comma, dev abbreviation sign
     key <AB09>   { [   period,   U0A74 	 ] };  // period: period, nukta
     key <AB10>   { [   slash,   question ] };

//    modifier_map Shift  { Shift_L };
//    modifier_map Lock   { Caps_Lock };
//    modifier_map Control{ Control_L };
//    modifier_map Mod3   { Mode_switch };
    include "level3(ralt_switch)"
};

partial alphanumeric_keys
xkb_symbols "olpc" {

// Contact: Walter Bender <walter@laptop.org>

  include "in(deva)"

  key <TLDE> { [	U094A,	U0912 ] }; // DEVANAGARI VOWEL SIGN SHORT O; DEVANAGARI LETTER SHORT O
  key <AE01> { [	U0967,	U090D ] }; // DEVANAGARI DIGIT ONE; DEVANAGARI LETTER CANDRA E
  key <AE02> { [	U0968,	U0945 ] }; // DEVANAGARI DIGIT TWO; DEVANAGARI VOWEL SIGN CANDRA E
  key <AE03> { [	U0969	 ] }; // DEVANAGARI DIGIT THREE;
  key <AE04> { [	U096A	 ] }; // DEVANAGARI DIGIT FOUR;
  key <AE05> { [	U096B	 ] }; // DEVANAGARI DIGIT FIVE;
  key <AE06> { [	U096C	 ] }; // DEVANAGARI DIGIT SIX;
  key <AE07> { [	U096D	 ] }; // DEVANAGARI DIGIT SEVEN;
  key <AE08> { [	U096E	 ] }; // DEVANAGARI DIGIT EIGHT;
  key <AE09> { [	U096F,	parenleft ] }; // DEVANAGARI DIGIT NINE;
  key <AE10> { [	U0966,	parenright ] }; // DEVANAGARI DIGIT ZERO;
  key <AE11> { [	minus,		U0903 ] }; // DEVANAGARI SIGN VISARGA;
  key <AE12> { [	U0943,	U090B ] }; // DEVANAGARI VOWEL SIGN VOCALIC R; DEVANAGARI LETTER VOCALIC R

  key <AD01> { [	U094C,	U0914 ] }; // DEVANAGARI VOWEL SIGN AU; DEVANAGARI LETTER AU
  key <AD02> { [	U0948,	U0910 ] }; // DEVANAGARI VOWEL SIGN AI; DEVANAGARI LETTER AI
  key <AD03> { [	U093E,	U0906 ] }; // DEVANAGARI VOWEL SIGN AA; DEVANAGARI LETTER AA
  key <AD04> { [	U0940,	U0908 ] }; // DEVANAGARI VOWEL SIGN II; DEVANAGARI LETTER II
  key <AD05> { [	U0942,	U090A ] }; // DEVANAGARI VOWEL SIGN UU; DEVANAGARI LETTER UU
  key <AD06> { [	U092C,	U092D ] }; // DEVANAGARI LETTER BA; DEVANAGARI LETTER BHA
  key <AD07> { [	U0939,	U0919 ] }; // DEVANAGARI LETTER HA; DEVANAGARI LETTER NGA
  key <AD08> { [	U0917,	U0918 ] }; // DEVANAGARI LETTER GA; DEVANAGARI LETTER GHA
  key <AD09> { [	U0926,	U0927 ] }; // DEVANAGARI LETTER DA; DEVANAGARI LETTER DHA
  key <AD10> { [	U091C,	U091D ] }; // DEVANAGARI LETTER JA; DEVANAGARI LETTER JHA
  key <AD11> { [	U0921,	U0922 ] }; // DEVANAGARI LETTER DDA; DEVANAGARI LETTER DDHA
  key <AD12> { [	U093C,	U091E ] }; // DEVANAGARI SIGN NUKTA; DEVANAGARI LETTER NYA

  key <BKSL> { [	U0949,	U0911 ] }; // DEVANAGARI VOWEL SIGN CANDRA O; DEVANAGARI LETTER CANDRA O

  key <AC01> { [	U094B,	U0913 ] }; // DEVANAGARI VOWEL SIGN O; DEVANAGARI LETTER O
  key <AC02> { [	U0947,	U090F ] }; // DEVANAGARI VOWEL SIGN E; DEVANAGARI LETTER E
  key <AC03> { [	U094D,	U0905 ] }; // DEVANAGARI SIGN VIRAMA; DEVANAGARI LETTER A
  key <AC04> { [	U093F,	U0907 ] }; // DEVANAGARI VOWEL SIGN I; DEVANAGARI LETTER I
  key <AC05> { [	U0941,	U0909 ] }; // DEVANAGARI VOWEL SIGN U; DEVANAGARI LETTER U
  key <AC06> { [	U092A,	U092B ] }; // DEVANAGARI LETTER PA; DEVANAGARI LETTER PHA
  key <AC07> { [	U0930,	U0931 ] }; // DEVANAGARI LETTER RA; DEVANAGARI LETTER RRA
  key <AC08> { [	U0915,	U0916 ] }; // DEVANAGARI LETTER KA; DEVANAGARI LETTER KHA
  key <AC09> { [	U0924,	U0925 ] }; // DEVANAGARI LETTER TA; DEVANAGARI LETTER THA
  key <AC10> { [	U091A,	U091B ] }; // DEVANAGARI LETTER CA; DEVANAGARI LETTER CHA
  key <AC11> { [	U091F,	U0920 ] }; // DEVANAGARI LETTER TTA; DEVANAGARI LETTER TTHA

  key <AB01> { [	U0946,	U090E ] }; // DEVANAGARI VOWEL SIGN SHORT E; DEVANAGARI LETTER SHORT E
  key <AB02> { [	U0902,	U0901 ] }; // DEVANAGARI SIGN ANUSVARA; DEVANAGARI SIGN CANDRABINDU
  key <AB03> { [	U092E,	U0923 ] }; // DEVANAGARI LETTER MA; DEVANAGARI LETTER NNA
  key <AB04> { [	U0928,	U0929 ] }; // DEVANAGARI LETTER NA; DEVANAGARI LETTER NNNA
  key <AB05> { [	U0935,	U0934 ] }; // DEVANAGARI LETTER VA; DEVANAGARI LETTER LLLA
  key <AB06> { [	U0932,	U0933 ] }; // DEVANAGARI LETTER LA; DEVANAGARI LETTER LLA
  key <AB07> { [	U0938,	U0936 ] }; // DEVANAGARI LETTER SA; DEVANAGARI LETTER SHA
  key <AB08> { [	comma,		U0937 ] }; // DEVANAGARI LETTER SSA
  key <AB09> { [	period,		U0964 ] }; // DEVANAGARI DANDA
  key <AB10> { [	U092F,	U095F ] }; // DEVANAGARI LETTER YA; DEVANAGARI LETTER YYA

  // space, space, Zero-Width-Non-Joiner (ZWNJ), Zero-Width-Joiner (ZWJ):
  include "nbsp(zwnj3zwj4)"

  include "group(olpc)"
};

partial alphanumeric_keys
xkb_symbols "hin-wx" {

    name[Group1]= "Hindi (Wx)";

      key <TLDE> {	 [     grave, asciitilde, 2, 3    ]	};

      key <AE01> {	 [      0x1000967, exclam 		]	};
      key <AE02> {	 [      0x1000968, at 		]	};
      key <AE03> {	 [      0x1000969 , numbersign	 		]	};
      key <AE04> {	 [      0x100096A , dollar		]	};
      key <AE05> {	 [      0x100096B , percent 	 		]	};
      key <AE06> {	 [      0x100096C , asciicircum	 		]	};
      key <AE07> {	 [      0x100096D , ampersand                       ]	};
      key <AE08> {	 [      0x100096e , asterisk 	 		]	};
      key <AE09> {	 [      0x100096F, parenleft 		]	};
      key <AE10> {	 [      0x1000966, parenright 		]	};
      key <AE11> {	 [      minus, underscore 	 		]	};
      key <AE12> {	 [      equal, plus 		]	};


      key <AD01> {	 [      0x1000943,  0x1000944, 0x100090B, 0x1000960]	};
      key <AD02> {	 [      0x1000924,  0x1000925       	]	};
      key <AD03> {	 [      0x1000947,  0x1000948, 0x100090F, 0x1000910]	};
      key <AD04> {	 [      0x1000930,  0x1000937       	]	};
      key <AD05> {	 [      0x100091F,  0x1000920       	]	};


      key <AD06> {	 [      0x100092F 		]	};
      key <AD07> {	 [      0x1000941,  0x1000942, 0x1000909, 0x100090A ]	};
      key <AD08> {	 [      0x100093F,  0x1000940, 0x1000907, 0x1000908 ]	};
      key <AD09> {	 [      0x100094B,  0x100094C, 0x1000913, 0x1000914]	};
      key <AD10> {	 [      0x100092A,  0x100092B 		]	};
      key <AD11> {	 [      bracketleft, braceleft  		]	};
      key <AD12> {	 [      bracketright, braceright  		]	};
      key <BKSL> {       [      backslash, bar, 0x1000964, 0x1000965 ] };

      key <AC01> {	 [      0x100094D,  0x100093E, 0x1000905,0x1000906 ] 	};
      key <AC02> {	 [      0x1000938,  0x1000936       	]	};
      key <AC03> {	 [      0x1000921,  0x1000922       	]	};
      key <AC04> {	 [      0x1000919,  0x100091E       	]	};
      key <AC05> {	 [      0x1000917,  0x1000918       	]	};


      key <AC06> {	 [      0x1000939,  0x1000903 		]	};
      key <AC07> {	 [      0x100091C,  0x100091D 		]	};
      key <AC08> {	 [      0x1000915,  0x1000916 		]	};
      key <AC09> {	 [      0x1000932,  0x1000962, 0x1000933, 0x100090C]	};
      key <AC10> {	 [      semicolon, colon  		]	};
      key <AC11> {	 [      apostrophe, quotedbl 		]	};

      key <AB01> {	 [      0x1000901,   0x100093C, 0x100093D, 0x1000950]   };
      key <AB02> {       [      0x1000926,   0x1000927      ]       };
      key <AB03> {       [      0x100091A,   0x100091B         ]       };
      key <AB04> {       [      0x1000935                      ]       };
      key <AB05> {       [      0x100092C,   0x100092D        ]       };
      key <AB06> {       [      0x1000928,   0x1000923         ]       };
      key <AB07> {       [      0x100092E,   0x1000902         ]       };
      key <AB08> {       [      comma,       less         ]       };
      key <AB09> {       [      period,      greater       ]       };
      key <AB10> {       [      slash,      question        ]       };

    include "level3(ralt_switch)"
    include "rupeesign(4)"
};

partial alphanumeric_keys
xkb_symbols "eng" {

    include "us(basic)"
    name[Group1]= "English (India, with rupee)";

    include "rupeesign(4)"
    include "level3(ralt_switch)"
};


// Description : Enhanced INSCRIPT keymap for Malayalam
// Encoding    : Unicode (http://www.unicode.org)
// Author      : Mahesh T Pai <paivakil@gmail.com>
// Date        : March, 2011
// Source      : http://www.nongnu.org/smc/docs/images/ml_inscript_layout.jpg
// Comment     : Based on the InScript Keyboard created by M Baiju
// Mapping:

partial alphanumeric_keys
xkb_symbols "mal_enhanced" {

    name[Group1] = "Malayalam (enhanced InScript, with rupee)";

   //From grave to backslash (\)

      key <TLDE> { [ U0d4a ,       U0d12 ] };
      key <AE01> { [ U0d67 ,      exclam ] };
      key <AE02> { [ U0d68 ,          at ] };
      key <AE03> { [ U0d69 ,  numbersign ] };
      key <AE04> { [ U0d6a ,      dollar ] };
      key <AE05> { [ U0d6b ,     percent ] };
      key <AE06> { [ U0d6c , asciicircum ] };
      key <AE07> { [ U0d6d ,   ampersand ] };
      key <AE08> { [ U0d6e ,       U0d7e ] };
      key <AE09> { [ U0d6f ,   parenleft ] };
      key <AE10> { [ U0d66 ,  parenright ] };

      key <AE11> { [ minus , U0d03       ] };
      key <AE12> { [ U0d43 , U0d0b       ] };
      key <BKSL> { [ U0d7c , U05C        ] }; //bksl: chillu RR 


  // From 'q' to right bracket (])

    key <AD01> { [ U0d57 , U0d14 ] };
    key <AD02> { [ U0d48 , U0d10 ] };
    key <AD03> { [ U0d3e , U0d06 ] };
    key <AD04> { [ U0d40 , U0d08 ] };
    key <AD05> { [ U0d42 , U0d0a ] };
    key <AD06> { [ U0d2c , U0d2d ] };
    key <AD07> { [ U0d39 , U0d19 ] };
    key <AD08> { [ U0d17 , U0d18 ] };
    key <AD09> { [ U0d26 , U0d27 ] };
    key <AD10> { [ U0d1c , U0d1d ] };
    key <AD11> { [ U0d21 , U0d22 ] };
    key <AD12> { [ U0200d , U0d1e ] };

    // From 'a' to apostrophe (')

    key <AC01> { [ U0d4b , U0d13 ] };
    key <AC02> { [ U0d47 , U0d0f ] };
    key <AC03> { [ U0d4d , U0d05 ] };
    key <AC04> { [ U0d3f , U0d07 ] };
    key <AC05> { [ U0d41 , U0d09 ] };
    key <AC06> { [ U0d2a , U0d2b ] };
    key <AC07> { [ U0d30 , U0d31 ] };
    key <AC08> { [ U0d15 , U0d16 ] };
    key <AC09> { [ U0d24 , U0d25 ] };
    key <AC10> { [ U0d1a , U0d1b ] };
    key <AC11> { [ U0d1f , U0d20 ] };

    // From 'z' to slash (/)

    key <AB01> { [ U0d46 , U0d0e ] };
    key <AB02> { [ U0d02 , U0d7a ] };
    key <AB03> { [ U0d2e , U0d23 ] };
    key <AB04> { [ U0d28 , U0d7b ] };
    key <AB05> { [ U0d35 , U0d34 ] };
    key <AB06> { [ U0d32 , U0d33 ] };
    key <AB07> { [ U0d38 , U0d36 ] };
    key <AB08> { [ comma , U0d37 ] };
    key <AB09> { [ period , U0d7d ] }; //chillu l
    key <AB10> { [ U0d2f , question ] };

    include "rupeesign(4)"
    include "level3(ralt_switch)"
};


// ---- BEGIN Hindi KaGaPa phonetic ----
// Name:        KaGaPa phonetic
// Brief:       Devanagari layout (Hindi, Sanskrit, Nepali, Marathi, etc.)
// Diagram:     (Original)[http://baraha.com/help/Keyboards/dev_brhkbd.htm]
//              (This layout)[http://bdsatish.in/lang/dev-kagapa.png]
//
// Description: Based on KaGaPa layout (also called Baraha layout or Nudi layout)
//              which is a modified layout of the specification by Dr. K. P. Rao.
//              This is a phonetic layout with the following features:
//              [1] All letters are mapped to phonetically-similar English keys
//                  as much as possible.
//              [2] The independent vowel (svara) and its dependent vowel (maatra)
//                  use the same key (depending upon SHIFT, ALTGR or ALTGR + SHIFT).
//              [3] Consonant conjuncts are produced by explicitly invoking the
//                  'viraama' (key f). The 'short a' maatra is implicit in all
//                  consonants.
//              [4] Zero width non-joiner and joiner are on keys 6 and 7
//                  respectively. These are absolutely essential for alternative
//                  glyph renderings of consonant half-forms.
//              [5] Rigvedic accent marks, visarga variants.
//
// Author:      Satish BD <bdsatish@gmail.com>
//
partial alphanumeric_keys
xkb_symbols "hin-kagapa" {
     name[Group1] = "Hindi (KaGaPa, phonetic)";
     key.type[group1]="FOUR_LEVEL";

    // Roman digits
    key <TLDE>  { [   grave,   asciitilde,   U201C          ] };  // U201C: left double quotation mark
    key <AE01>  { [   1,            exclam,       U0967          ] };
    key <AE02>  { [   2,            at,           U0968,  U20A8  ] };  // U20A8: generic rupee sign (Rs)
    key <AE03>  { [   3,            numbersign,   U0969          ] };
    key <AE04>  { [   4,            dollar,       U096A,  U20B9  ] };  // U20B9: new Indian rupee sign
    key <AE05>  { [   5,            percent,      U096B          ] };
    key <AE06>  { [   6,            asciicircum,  U096C,  U200C  ] };  // ZWNJ
    key <AE07>  { [   7,            ampersand,    U096D,  U200D  ] };  // ZWJ
    key <AE08>  { [   8,            asterisk,     U096E,  U0901  ] };  // U0901: Devanagari candrabindu
    key <AE09>  { [   9,            parenleft,    U096F          ] };
    key <AE10>  { [   0,            parenright,   U0966,  U0970  ] };  // U0970: Devanagari abbreviation sign
    key <AE11>  { [   minus,        underscore,   U0952          ] };  // U0952: Devanagari stress sign anudatta
    key <AE12>  { [   equal,        plus                         ] };
    key <BKSL>  { [   U005C,        U007C,        U0964,  U0965  ] };  // backslash, pipe, danda, double danda

    //Q Row
    key <AD01>  { [   U091F,         U0920                       ] };  // Q: retroflex Ta, Tha
    key <AD02>  { [   U0921,         U0922,      U095C,  U095D   ] };  // W: retroflex Da, Dha, Da-nukta, Dha-nukta
    key <AD03>  { [   U0946,         U0947,      U090E,  U090F   ] };  // E: matras, short E, long E
    key <AD04>  { [   U0930,         U0943,      U090B,  U0931   ] };  // R: ra, vocalic R matra, vocalic R, ra-nukta
    key <AD05>  { [   U0924,         U0925                       ] };  // T: dental ta, tha
    key <AD06>  { [   U092F,         U0948,      U0910,  U095F   ] };  // Y: ya, ai matra, ai, ya-nukta
    key <AD07>  { [   U0941,         U0942,      U0909,  U090A   ] };  // U: matras, u, uu
    key <AD08>  { [   U093F,         U0940,      U0907,  U0908   ] };  // I: matras, i, ii
    key <AD09>  { [   U094A,         U094B,      U0912,  U0913   ] };  // O: matras, short o, long o
    key <AD10>  { [   U092A,         U092B,      U095E           ] };  // P: pa, pha, pha-nukta
    key <AD11>  { [   bracketleft,   braceleft                   ] };
    key <AD12>  { [   bracketright,  braceright                  ] };

    //A Row
    key <AC01>  { [   U093E,        U0906,     U0905,    U0972   ] };  // A: aa matra, aa, short a, candra a
    key <AC02>  { [   U0938,        U0936                        ] };  // S: sa, sha
    key <AC03>  { [   U0926,        U0927                        ] };  // D: dental da, dha
    key <AC04>  { [   U094D,        U0944,     U0960             ] };  // F: virama, vocalic RR matra, vocalic RR
    key <AC05>  { [   U0917,        U0918,     U095A             ] };  // G: ga, gha, ga-nukta
    key <AC06>  { [   U0939,        U0903,     U1CF5,    U1CF6   ] };  // H: ha, visarga, jihvamuliya, upadhmaniya
    key <AC07>  { [   U091C,        U091D,     U095B             ] };  // J: ja, jha, ja-nukta
    key <AC08>  { [   U0915,        U0916,     U0958,    U0959   ] };  // K: ka, kha, ka-nukta, kha-nukta
    key <AC09>  { [   U0932,        U0933,     U0962,    U090C   ] };  // L: la, lla, vocalic L matra, vocalic L
    key <AC10>  { [   semicolon,    colon,     U1CF2,    U1CF3   ] };  // U1CF2/3: ardhavisarga/rotated ardhavisarga
    key <AC11>  { [   apostrophe,   quotedbl,  U0951,    U201D   ] };  // U0951: Devanagari stress sign udatta
                                                                       // U201D: Right double quotation mark
    //Z Row
    key <AB01>  { [   U091E,   U0919                   ] };  // Z: nya, nga
    key <AB02>  { [   U0937,   U093C,  U0934           ] };  // X: ssa, nukta below, lla-nukta
    key <AB03>  { [   U091A,   U091B                   ] };  // C: ca, cha
    key <AB04>  { [   U0935,   U094C,  U0914           ] };  // V: va, matra au, au
    key <AB05>  { [   U092C,   U092D                   ] };  // B: ba, bha
    key <AB06>  { [   U0928,   U0923,  U0929           ] };  // N: na, nna, nnna
    key <AB07>  { [   U092E,   U0902,  U093D,  U0950   ] };  // M: ma, anusvara, avagraha, Devanagari OM
    key <AB08>  { [   comma,   U003C,  U0945,  U090D   ] };  // comma: comma, less than, matra, candra e
    key <AB09>  { [   period,  U003E,  U0949,  U0911   ] };  // period: period, greater than, matra, candra o
    key <AB10>  { [   slash,   question                ] };

    include "level3(ralt_switch)"
};
// ---- END Hindi KaGaPa ----

// Sanskrit uses Devanagari layout of Hindi
partial alphanumeric_keys
xkb_symbols "san-kagapa" {
  include "in(hin-kagapa)"
  name[Group1] = "Sanskrit (KaGaPa, phonetic)";
};

// Marathi uses Devanagari layout of Hindi
partial alphanumeric_keys
xkb_symbols "mar-kagapa" {
  include "in(hin-kagapa)"
  name[Group1] = "Marathi (KaGaPa, phonetic)";
};


// ---- BEGIN Kannada KaGaPa phonetic ----
// Name:        Kannada KaGaPa phonetic
// Diagram:     (Original)[http://www.baraha.com/help/Keyboards/kan_brhkbd.htm]
//              (This layout)[http://bdsatish.in/lang/kan-kagapa.png]
//
// Description: Based on KaGaPa layout (also called Baraha layout or Nudi layout).
//              See the description to "hin-kagapa" above.
//              Certain punctuation characters from Devanagari block are
//              retained for compatibility.
//
// Author:      Satish BD <bdsatish@gmail.com>
//
partial alphanumeric_keys
xkb_symbols "kan-kagapa" {
    name[Group1] = "Kannada (KaGaPa, phonetic)";
    key.type[group1]="FOUR_LEVEL";

    // Roman digits
    key <TLDE>  { [   grave,   asciitilde,   U201C          ] };  // U201C: left double quotation mark
    key <AE01>  { [   1,            exclam,       U0CE7          ] };
    key <AE02>  { [   2,            at,           U0CE8,  U20A8  ] };  // U20A8: generic rupee sign (Rs)
    key <AE03>  { [   3,            numbersign,   U0CE9          ] };
    key <AE04>  { [   4,            dollar,       U0CEA,  U20B9  ] };  // U20B9: new Indian rupee sign
    key <AE05>  { [   5,            percent,      U0CEB          ] };
    key <AE06>  { [   6,            asciicircum,  U0CEC,  U200C  ] };  // ZWNJ
    key <AE07>  { [   7,            ampersand,    U0CED,  U200D  ] };  // ZWJ
    key <AE08>  { [   8,            asterisk,     U0CEE,  U0901  ] };  // U0901: Devanagari candrabindu
    key <AE09>  { [   9,            parenleft,    U0CEF          ] };
    key <AE10>  { [   0,            parenright,   U0CE6          ] };
    key <AE11>  { [   minus,        underscore,   U0952          ] };  // U0952: Devanagari stress sign anudatta
    key <AE12>  { [   equal,        plus                         ] };
    key <BKSL>  { [   U005C,        U007C,        U0964,  U0965  ] };  // backslash, pipe, danda, double danda

    //Q Row
    key <AD01>  { [   U0C9F,         U0CA0                       ] };  // Q: retroflex Ta, Tha
    key <AD02>  { [   U0CA1,         U0CA2                       ] };  // W: retroflex Da, Dha
    key <AD03>  { [   U0CC6,         U0CC7,      U0C8E,  U0C8F   ] };  // E: matras, short E, long E
    key <AD04>  { [   U0CB0,         U0CC3,      U0C8B,  U0CB1   ] };  // R: ra, vocalic R matra, vocalic R, RRA
    key <AD05>  { [   U0CA4,         U0CA5                       ] };  // T: dental ta, tha
    key <AD06>  { [   U0CAF,         U0CC8,      U0C90           ] };  // Y: ya, ai matra, ai
    key <AD07>  { [   U0CC1,         U0CC2,      U0C89,  U0C8A   ] };  // U: matras, u, uu
    key <AD08>  { [   U0CBF,         U0CC0,      U0C87,  U0C88   ] };  // I: matras, i, ii
    key <AD09>  { [   U0CCA,         U0CCB,      U0C92,  U0C93   ] };  // O: matras, short o, long o
    key <AD10>  { [   U0CAA,         U0CAB                       ] };  // P: pa, pha
    key <AD11>  { [   bracketleft,   braceleft                   ] };
    key <AD12>  { [   bracketright,  braceright                  ] };

    //A Row
    key <AC01>  { [   U0CBE,        U0C86,     U0C85             ] };  // A: aa matra, aa, short a
    key <AC02>  { [   U0CB8,        U0CB6                        ] };  // S: sa, sha
    key <AC03>  { [   U0CA6,        U0CA7                        ] };  // D: dental da, dha
    key <AC04>  { [   U0CCD,        U0CC4,     U0CE0             ] };  // F: virama, vocalic RR matra, vocalic RR
    key <AC05>  { [   U0C97,        U0C98                        ] };  // G: ga, gha
    key <AC06>  { [   U0CB9,        U0C83,     U0CF1,    U0CF2   ] };  // H: ha, visarga, jihvanuliya, upadhmaniya
    key <AC07>  { [   U0C9C,        U0C9D                        ] };  // J: ja, jha
    key <AC08>  { [   U0C95,        U0C96                        ] };  // K: ka, kha
    key <AC09>  { [   U0CB2,        U0CB3,     U0CE2,    U0C8C   ] };  // L: la, lla, vocalic L matra, vocalic L
    key <AC10>  { [   semicolon,    colon                        ] };
    key <AC11>  { [   apostrophe,   quotedbl,  U0951,    U201D   ] };  // U0951: Devanagari stress sign udatta
                                                                       // U201D: Right double quotation mark
    //Z Row
    key <AB01>  { [   U0C9E,   U0C99                   ] };  // Z: nya, nga
    key <AB02>  { [   U0CB7,   U0CBC,  U0CDE           ] };  // X: ssa, nukta below, LLLA
    key <AB03>  { [   U0C9A,   U0C9B                   ] };  // C: ca, cha
    key <AB04>  { [   U0CB5,   U0CCC,  U0C94           ] };  // V: va, matra au, au
    key <AB05>  { [   U0CAC,   U0CAD                   ] };  // B: ba, bha
    key <AB06>  { [   U0CA8,   U0CA3                   ] };  // N: na, nna
    key <AB07>  { [   U0CAE,   U0C82,  U0CBD,  U0950   ] };  // M: ma, anusvara, avagraha, Devanagari OM
    key <AB08>  { [   comma,   U003C,  U0CB1           ] };  // comma: comma, less than, RRA
    key <AB09>  { [   period,  U003E,  U0CDE           ] };  // period: period, greater than, LLLA
    key <AB10>  { [   slash,   question                ] };

    include "level3(ralt_switch)"
};
// ---- END Kannada KaGaPa ----


// ---- BEGIN Telugu KaGaPa phonetic ----
// Name:        Telugu KaGaPa phonetic
// Diagram:     (Original)[http://www.baraha.com/help/Keyboards/tel_brhkbd.htm]
//              (This layout)[http://bdsatish.in/lang/tel-kagapa.png]
//
// Description: Based on KaGaPa layout (also called Baraha layout or Nudi layout).
//              See the description to "hin-kagapa" above.
//              Certain punctuation characters from Devanagari block are
//              retained for compatibility.
//
// Author:      Satish BD <bdsatish@gmail.com>
//
partial alphanumeric_keys
xkb_symbols "tel-kagapa" {
    name[Group1] = "Telugu (KaGaPa, phonetic)";
    key.type[group1]="FOUR_LEVEL";

    // Roman digits
    key <TLDE>  { [   grave,   asciitilde,   U201C          ] };  // U201C: left double quotation mark
    key <AE01>  { [   1,            exclam,       U0C67          ] };
    key <AE02>  { [   2,            at,           U0C68,  U20A8  ] };  // U20A8: generic rupee sign (Rs)
    key <AE03>  { [   3,            numbersign,   U0C69          ] };
    key <AE04>  { [   4,            dollar,       U0C6A,  U20B9  ] };  // U20B9: new Indian rupee sign
    key <AE05>  { [   5,            percent,      U0C6B          ] };
    key <AE06>  { [   6,            asciicircum,  U0C6C,  U200C  ] };  // ZWNJ
    key <AE07>  { [   7,            ampersand,    U0C6D,  U200D  ] };  // ZWJ
    key <AE08>  { [   8,            asterisk,     U0C6E,  U0C01  ] };  // U0C01: Telugu arasunna
    key <AE09>  { [   9,            parenleft,    U0C6F          ] };
    key <AE10>  { [   0,            parenright,   U0C66          ] };
    key <AE11>  { [   minus,        underscore,   U0952          ] };  // U0952: Devanagari stress sign anudatta
    key <AE12>  { [   equal,        plus                         ] };
    key <BKSL>  { [   U005C,        U007C,        U0964,  U0965  ] };  // backslash, pipe, danda, double danda

    //Q Row
    key <AD01>  { [   U0C1F,         U0C20                       ] };  // Q: retroflex Ta, Tha
    key <AD02>  { [   U0C21,         U0C22                       ] };  // W: retroflex Da, Dha
    key <AD03>  { [   U0C46,         U0C47,      U0C0E,  U0C0F   ] };  // E: matras, short E, long E
    key <AD04>  { [   U0C30,         U0C43,      U0C0B,  U0C31   ] };  // R: ra, vocalic R matra, vocalic R, RRA
    key <AD05>  { [   U0C24,         U0C25                       ] };  // T: dental ta, tha
    key <AD06>  { [   U0C2F,         U0C48,      U0C10           ] };  // Y: ya, ai matra, ai
    key <AD07>  { [   U0C41,         U0C42,      U0C09,  U0C0A   ] };  // U: matras, u, uu
    key <AD08>  { [   U0C3F,         U0C40,      U0C07,  U0C08   ] };  // I: matras, i, ii
    key <AD09>  { [   U0C4A,         U0C4B,      U0C12,  U0C13   ] };  // O: matras, short o, long o
    key <AD10>  { [   U0C2A,         U0C2B                       ] };  // P: pa, pha
    key <AD11>  { [   bracketleft,   braceleft                   ] };
    key <AD12>  { [   bracketright,  braceright                  ] };

    //A Row
    key <AC01>  { [   U0C3E,        U0C06,     U0C05             ] };  // A: aa matra, aa, short a
    key <AC02>  { [   U0C38,        U0C36                        ] };  // S: sa, sha
    key <AC03>  { [   U0C26,        U0C27                        ] };  // D: dental da, dha
    key <AC04>  { [   U0C4D,        U0C44,     U0C60             ] };  // F: virama, vocalic RR matra, vocalic RR
    key <AC05>  { [   U0C17,        U0C18                        ] };  // G: ga, gha
    key <AC06>  { [   U0C39,        U0C03                        ] };  // H: ha, visarga
    key <AC07>  { [   U0C1C,        U0C1D                        ] };  // J: ja, jha
    key <AC08>  { [   U0C15,        U0C16                        ] };  // K: ka, kha
    key <AC09>  { [   U0C32,        U0C33,     U0C62,    U0C0C   ] };  // L: la, lla, vocalic L matra, vocalic L
    key <AC10>  { [   semicolon,    colon                        ] };
    key <AC11>  { [   apostrophe,   quotedbl,  U0951,    U201D   ] };  // U0951: Devanagari stress sign udatta
                                                                       // U201D: Right double quotation mark
    //Z Row
    key <AB01>  { [   U0C1E,   U0C19                   ] };  // Z: nya, nga
    key <AB02>  { [   U0C37                            ] };  // X: ssa
    key <AB03>  { [   U0C1A,   U0C1B                   ] };  // C: ca, cha
    key <AB04>  { [   U0C35,   U0C4C,  U0C14           ] };  // V: va, matra au, au
    key <AB05>  { [   U0C2C,   U0C2D                   ] };  // B: ba, bha
    key <AB06>  { [   U0C28,   U0C23                   ] };  // N: na, nna
    key <AB07>  { [   U0C2E,   U0C02,  U0C3D,  U0950   ] };  // M: ma, anusvara, avagraha, Devanagari OM
    key <AB08>  { [   comma,   U003C,  U0C58           ] };  // comma: comma, less than, TSA
    key <AB09>  { [   period,  U003E,  U0C59           ] };  // period: period, greater than, DZA
    key <AB10>  { [   slash,   question                ] };

    include "level3(ralt_switch)"
};

// Description 	: Keymap for Manipuri language (Meetei mayek script)
// Encoding    	: Unicode (http://www.unicode.org)
// Author      	: Santosh Heigrujam <santosh.tomba@gmail.com>
// Date        	: December, 2013
// Source	: 
// Comment	:
	
partial alphanumeric_keys modifier_keys
xkb_symbols "eeyek" {

    name[Group1]= "Manipuri (Eeyek)";

    key <TLDE> {	[     grave,	asciitilde	]	};
    key <AE01> {	[	  Uabf1,	exclam 		]	};
    key <AE02> {	[	  Uabf2,	at		]	};
    key <AE03> {	[	  Uabf3,	numbersign	]	};
    key <AE04> {	[	  Uabf4,	dollar		]	};
    key <AE05> {	[	  Uabf5,	percent		]	};
    key <AE06> {	[	  Uabf6,	asciicircum	]	};
    key <AE07> {	[	  Uabf7,	ampersand	]	};
    key <AE08> {	[	  Uabf8,	asterisk	]	};
    key <AE09> {	[	  Uabf9,	parenleft	]	};
    key <AE10> {	[	  Uabf0,	parenright	]	};
    key <AE11> {	[     minus,	underscore	]	};
    key <AE12> {	[     equal,	plus		]	};

    key <AD01> {	[	  Uabc8,	Uabd8 		]	};
    key <AD02> {	[	  Uabcb,	Uabcb		]	};
    key <AD03> {	[	  Uabcf,	Uabe2		]	};
    key <AD04> {	[	  Uabd4,	Uabd4		]	};
    key <AD05> {	[	  Uabc7,	Uabe0		]	};
    key <AD06> {	[	  Uabcc,	Uabe6		]	};
    key <AD07> {	[	  Uabce,	Uabe8		]	};
    key <AD08> {	[	  Uabe4,	Uabe9		]	};
    key <AD09> {	[	  Uabe3,	Uabe7		]	};
    key <AD10> {	[	  Uabc4,	Uabde		]	};
    key <AD11> {	[ bracketleft,	braceleft	]	};
    key <AD12> {	[ bracketright,	braceright	]	};

    key <AC01> {	[	  Uabd1,	Uabe5 		]	};
    key <AC02> {	[	  Uabc1,	Uabd3		]	};
    key <AC03> {	[	  Uabd7,	Uabd9		]	};
    key <AC04> {	[	  Uabd0,	Uabda		]	};
    key <AC05> {	[	  Uabd2,	Uabd8		]	};
    key <AC06> {	[	  Uabcd,	Uabea		]	};
    key <AC07> {	[	  Uabd6,	Uabd3		]	};
    key <AC08> {	[	  Uabc0,	Uabdb		]	};
    key <AC09> {	[	  Uabc2,	Uabdc		]	};
    key <AC10> {	[ semicolon,	colon		]	};
    key <AC11> {	[ apostrophe,	quotedbl	]	};

    key <AB01> {	[	  Uabc9,	Uabe1 		]	};
    key <AB02> {	[	  Uabca,	Uabd9		]	};
    key <AB03> {	[	  Uabc6,	Uabeb		]	};
    key <AB04> {	[	  Uabda,	Uabed		]	};
    key <AB05> {	[	  Uabd5,	Uabec		]	};
    key <AB06> {	[	  Uabc5,	Uabdf		]	};
    key <AB07> {	[	  Uabc3,	Uabdd		]	};
    key <AB08> {	[     comma,	less		]	};
    key <AB09> {	[    period,	greater		]	};
    key <AB10> {	[     slash,	question	]	};

    key <BKSL> {	[ backslash,         bar	]	};
    
    include "level3(ralt_switch)"
};

// This layout is developed by Niranjan Tambe in July 2019
// for typing Indic languages in International Phonetic Alphabet (IPA).
// Contact - niranjanvikastambe@gmail.com

partial alphanumeric_keys modifier_keys
xkb_symbols "iipa" {

    name[Group1]= "Indic IPA";
    key <AE01>	{ [	1,		exclam]	};
    key <AE02>	{ [	2,		at]	};
    key <AE03>	{ [	3,		numbersign]	};
    key <AE04>	{ [	4,		U20B9]	};
    key <AE05>	{ [	5,		percent]	};
    key <AE06>	{ [	6,		asciicircum] };
    key <AE07>	{ [	7,		ampersand]	};
    key <AE08>	{ [	8,		asterisk]	};
    key <AE09>	{ [	9,		parenleft]	};
    key <AE10>	{ [	0,		parenright]	};
    key <AE11>	{ [	minus,	underscore]	};
    key <AE12>	{ [	equal,       plus]	};

    key <AD01>	{ [	U02B0,		U02B1]	}; // [ʰ], [ʱ]
    key <AD02>	{ [	U00E6,		q]	}; // [æ], [q] found in Urdu
    key <AD03>	{ [	a,			U028B]	}; // [a], [ʋ]
    key <AD04>	{ [	i,			U026A]	}; // [i] [ɪ]
    key <AD05>	{ [	u,			U026F]	}; // [u] [ɯ] found in Tamil
    key <AD06>	{ [	b,			Y]	}; // [b]
    key <AD07>	{ [	h,			U014B]	}; // [h], [ŋ]
    key <AD08>	{ [	g,			U0263]	}; // [g], [ɣ] found in Urdu
    key <AD09>	{ [	d,			U00F0]	}; // [d], [ð] found in Malayalam
    key <AD10>	{ [	U02A4,		U02A3]	}; // [ʤ], [ʣ] found in Marathi
    key <AD11>	{ [	U0256,		U027D]	}; // [ɖ], [ɽ]
    key <AD12>	{ [	bracketleft,	bracketright]	}; // "[", "]" needed for denoting phonetic symbols

    key <AC01>	{ [	o,		U0254]	}; // [o], [ɔ] found in Bangla
    key <AC02>	{ [	e,		U025B]	}; // [e], [ɛ]
    key <AC03>	{ [	U0259,	U0361]	}; // [ə], [   ͡  ]
    key <AC04>	{ [	i,		U026A]	}; // [i], [ɪ]
    key <AC05>	{ [	u,		U026F]	}; // [u], [ɯ]
    key <AC06>	{ [	p,		f]	}; // [p], [f]
    key <AC07>	{ [	U027E,	r]	}; // [ɾ], [r]
    key <AC08>	{ [	k,		x]	}; // [k], [x] found in Urdu
    key <AC09>	{ [	t,		U03B8]	}; // [t], [θ]
    key <AC10>	{ [	U02A7,	U02A6]	}; // [ʧ], [ʦ] found in Marathi
    key <AC11>	{ [	U0288,	quotedbl]	}; // [ʈ]
    key <TLDE>	{ [	grave, 	asciitilde]	};

    key <BKSL>	{ [	backslash,	bar]	};
    key <AB01>	{ [	U032A,		U0303]	}; // [ ̪], [ ̃] Dental mark, nasalisation mark
    key <AB02>	{ [	U0306,		X]	}; // [  ̆] Short sound
    key <AB03>	{ [	m,			U0273]	}; // [m], [ɳ]
    key <AB04>	{ [	n,			v]	}; // [n], [v]
    key <AB05>	{ [	w,			z] }; // [w], [z]
    key <AB06>	{ [	l,			U026D]	}; // [l], [ɭ]
    key <AB07>	{ [	s,			U0283]	}; // [s], [ʃ]
    key <AB08>	{ [	comma,		U0282]	}; // [ʂ]
    key <AB09>	{ [	period,		U02D0]	}; // [ː] Long sound
    key <AB10>	{ [	j,			slash] }; // [j]
};

// This layout is developed by Niranjan Tambe in July 2019
// for typing Marathi language with some necessary symbols.
// Contact - niranjanvikastambe@gmail.com

xkb_symbols "marathi" {
	name[Group1]="Marathi (enhanced InScript)";
	key <TLDE> { [ U0962, U090C,   grave, asciitilde  ] }; // Added  ॢ & ऌ
	key <AE01> { [ U0967, exclam,       1, exclam      ] }; // Added exclamation mark
	key <AE02> { [ U0968, U0945,       2, at          ] }; // Added ॅ
	key <AE03> { [ U0969, U093D,  3, numbersign  ] }; // Added ऽ
	key <AE04> { [ U096a, U20B9,      4		  ] }; // Added ₹
	key <AE05> { [ U096b, percent,     5, percent     ] }; 
	key <AE06> { [ U096c, asciicircum, 6, asciicircum ] }; 
	key <AE07> { [ U096d, U0970,   7, ampersand   ] }; // Added ॰
	key <AE08> { [ U096e, U0950,    8, asterisk    ] };
	key <AE09> { [ U096f, parenleft,   9, parenleft   ] };
	key <AE10> { [ U0966, parenright,  0, parenright  ] };
	key <AE11> { [ minus, U0903, minus, underscore    ] };
	key <AE12> { [ U0943, U090b, U0944, U0960 ] };

	key <AD01> { [ U094c, U0914 ] };
	key <AD02> { [ U0948, U0910 ] };
	key <AD03> { [ U093e, U0906 ] };
	key <AD04> { [ U0940, U0908, U0963, U0961 ] };
	key <AD05> { [ U0942, U090a ] };
	key <AD06> { [ U092c, U092d ] };
	key <AD07> { [ U0939, U0919 ] };
	key <AD08> { [ U0917, U0918, U095a ] };
	key <AD09> { [ U0926, U0927 ] };
	key <AD10> { [ U091c, U091d, U095b ] };
	key <AD11> { [ U0921, U0922, U095c, U095d ] };
	key <AD12> { [ U093c, U091e ] };
	key <BKSL> { [ U0949, U0911, U005C, U007C ] };

	key <AC01> { [ U094b, U0913 ] };
	key <AC02> { [ U0947, U090f ] };
	key <AC03> { [ U094d, U0905 ] };
	key <AC04> { [ U093f, U0907, U0962, U090c ] };
	key <AC05> { [ U0941, U0909 ] };
	key <AC06> { [ U092a, U092b, NoSymbol, U095e ] };
	key <AC07> { [ U0930, U0931 ] };
	key <AC08> { [ U0915, U0916, U0958, U0959 ] };
	key <AC09> { [ U0924, U0925 ] };
	key <AC10> { [ U091a, U091b, U0952 ] };
	key <AC11> { [ U091f, U0920, NoSymbol, U0951 ] };

	key <AB01> { [ apostrophe, U0972, U0953 ] }; // Added apostrophe & ॲ
	key <AB02> { [ U0902, U0901, NoSymbol, U0950 ] }; 
	key <AB03> { [ U092e, U0923, U0954 ] };
	key <AB04> { [ U0928, quotedbl ] }; // Added "
	key <AB05> { [ U0935, UA8FB ] }; // Added headstroke
	key <AB06> { [ U0932, U0933 ] };
	key <AB07> { [ U0938, U0936 ] };
	key <AB08> { [ comma, U0937, U0970 ] };
	key <AB09> { [ period, U0964, U0965, U093d ] };
	key <AB10> { [ U092f, question, slash, question ] };
};
// EXTRAS:
// Vedic and Miscellaneous symbols
// This layout covers 'Extended Devanagari' and 'Vedic Extensions' Unicode blocks.
// This is helpful for including all the required symbols when typing complex texts such as those from Samaveda and Yajurveda.
// This layout only includes signs and symbols. Text needs to be typed seperately.
// Created by : Abhishek Deshpande     <abhishekdeshpande128@gmail.com>
// Date : 27th October, 2020
partial alphanumeric_keys
xkb_symbols "san-misc" {
     name[Group1] = "Sanskrit symbols";
     key.type[group1]="FOUR_LEVEL";

    // Roman digits
    key <TLDE>  { [   U1CD0,  UA8FA  ] };
    key <AE01>  { [   UA8E1,  U1CD1  ] };
    key <AE02>  { [   UA8E2,  UA8F2  ] };
    key <AE03>  { [   UA8E3,  UA8F3  ] };
    key <AE04>  { [   UA8E4,  UA8F4  ] };
    key <AE05>  { [   UA8E5,  UA8F5  ] };
    key <AE06>  { [   UA8E6,  UA8F6  ] };
    key <AE07>  { [   UA8E7,  UA8F7  ] };
    key <AE08>  { [   UA8E8,  UA8F8  ] };
    key <AE09>  { [   UA8E9,  UA8F9  ] };
    key <AE10>  { [   UA8E0,  UA8FC  ] };
    key <AE11>  { [   UA8FB,  U1CD2  ] };
    key <AE12>  { [   U1CF2,  U1CF3   ] };
    key <BKSL>  { [   U1CF8,  U1CF9   ] };

    //Q Row
    key <AD01>  { [   U1CD4,  U1CD5  ] };
    key <AD02>  { [   U1CD6,  U1CD7  ] };
    key <AD03>  { [   U1CD8,  U1CD9  ] };
    key <AD04>  { [   UA8EF  ] };
    key <AD05>  { [   U1CDA,  U1CDB  ] };
    key <AD06>  { [   UA8FE,   UA8FF  ] };
    key <AD07>  { [   UA8EB  ] };
    key <AD08>  { [   U1CDC,  U1CDD ] };
    key <AD09>  { [   U1CDE,  U1CDF  ] };
    key <AD10>  { [   UA8EE  ] };
    key <AD11>  { [   U1CE0  ] };
    key <AD12>  { [   U1CE1  ] };

    //A Row
    key <AC01>  { [   UA8EA  ] };
    key <AC02>  { [   UA8F1  ] };
    key <AC03>  { [   U1CE2  ] };
    key <AC04>  { [   U1CE3,  U1CE4  ] };
    key <AC05>  { [   U1CE5,  U1CE6  ] };
    key <AC06>  { [   U1CE7,  U1CE8  ] };
    key <AC07>  { [   U1CE9,  U1CEA  ] };
    key <AC08>  { [   UA8EC  ] };
    key <AC09>  { [   U1CEB,  U1CEC  ] };
    key <AC10>  { [   U1CEE,  U1CEF  ] };
    key <AC11>  { [   U1CF0,  U1CF1  ] };
    
    //Z Row
    key <AB01>  { [   U1CED  ] };
    key <AB02>  { [   U1CF4  ] };
    key <AB03>  { [   U1CF5  ] };
    key <AB04>  { [   UA8F0  ] };
    key <AB05>  { [   U1CF6  ] }; 
    key <AB06>  { [   UA8ED  ] };
    key <AB07>  { [   U0950,  UA8FD  ] };
    key <AB08>  { [   U1CF7,  U093D  ] };
    key <AB09>  { [   U1CFA,  U2638  ] };
    key <AB10>  { [   U0FD5,  U2740  ] };

    include "rupeesign(4)"
    include "level3(ralt_switch)"
};
//           Modi is an ancient Indian script that is used to write texts in Marathi, Hindi and Sanskrit. It is most commonly used to write Marathi language in Maharashtra.
//           This keyboard layout is Based on Marathi KaGaPa phonetic layout. Just the characters which are not applicable in Modi, are ommited.
//
//           Created by : Abhishek Deshpande     <abhishekdeshpande128@gmail.com>
//           Date : 9th February, 2020
// 
partial alphanumeric_keys
xkb_symbols "modi-kagapa" {
     name[Group1] = "Modi (KaGaPa phonetic)";
     key.type[group1]="FOUR_LEVEL";

 // Roman digits
    key <TLDE>  { [   grave,   asciitilde,   U201C           ] };  // U201C: left double quotation mark
    key <AE01>  { [   1,            exclam,       U11651          ] };
    key <AE02>  { [   2,            at,           U11652,  U20A8  ] };  // U20A8: generic rupee sign (Rs)
    key <AE03>  { [   3,            numbersign,   U11653          ] };
    key <AE04>  { [   4,            dollar,       U11654,  U20B9  ] };  // U20B9: new Indian rupee sign
    key <AE05>  { [   5,            percent,      U11655          ] };
    key <AE06>  { [   6,            asciicircum,  U11656,  U200C  ] };  // ZWNJ
    key <AE07>  { [   7,            ampersand,    U11657,  U200D  ] };  // ZWJ
    key <AE08>  { [   8,            asterisk,     U11658          ] };  
    key <AE09>  { [   9,            parenleft,    U11659          ] };
    key <AE10>  { [   0,            parenright,   U11650,  U11643 ] };  // U11643: Modi abbreviation sign
    key <AE11>  { [   minus,        underscore                    ] };  
    key <AE12>  { [   equal,        plus                          ] };
    key <BKSL>  { [   U005C,        U007C,        U11641,  U11642 ] };  // backslash, pipe, Modi danda, Modi double danda

    //Q Row
    key <AD01>  { [   U11618,         U11619                      ] };  // Q: retroflex Modi letter Ta, Tha
    key <AD02>  { [   U1161A,         U1161B                      ] };  // W: retroflex Modi letter Da, Dha 
    key <AD03>  { [   U11639,         U1160A,    U1160B           ] };  // E: Modi vovel sign E, Modi letter E, letter ai
    key <AD04>  { [   U11628,         U11635,    U11606           ] };  // R: Modi ra, Modi vowel sign vocalic R, vocalic letter R 
    key <AD05>  { [   U1161D,         U1161E                      ] };  // T: dental Modi letter ta, tha
    key <AD06>  { [   U11627,         U1163A                      ] };  // Y: Modi letter ya, Modi vowel sign ai
    key <AD07>  { [   U11633,         U11634,    U11604,  U11605  ] };  // U: Modi vowel sign u, uu, Modi letter u, uu
    key <AD08>  { [   U11631,         U11632,    U11602,  U11603  ] };  // I: Modi vowel sign i, ii, Modi letter i, ii
    key <AD09>  { [   U1163B,         U1160C                      ] };  // O: Modi vowel sign o, Modi letter o
    key <AD10>  { [   U11622,         U11623                      ] };  // P: Modi letter pa, pha 
    key <AD11>  { [   bracketleft,   braceleft                    ] };
    key <AD12>  { [   bracketright,  braceright                   ] };

    //A Row
    key <AC01>  { [   U11630,       U11601,     U11600           ] };  // A: Modi vowel sign aa, Modi letter aa, Modi letter a
    key <AC02>  { [   U1162D,       U1162B                       ] };  // S: Modi letter sa, sha
    key <AC03>  { [   U1161F,       U11620                       ] };  // D: dental Modi letter da, dha
    key <AC04>  { [   U1163F,       U11636,     U11607           ] };  // F: Modi sign virama, Modi vowel sign vocalic RR, letter vocalic RR
    key <AC05>  { [   U11610,       U11611                       ] };  // G: Modi letter ga, gha
    key <AC06>  { [   U1162E,       U1163E                       ] };  // H: Modi letter ha, Modi visarga
    key <AC07>  { [   U11615,       U11616                       ] };  // J: Modi letter ja, jha
    key <AC08>  { [   U1160E,       U1160F                       ] };  // K: Modi letter ka, kha
    key <AC09>  { [   U11629,       U1162F,     U11637,  U11608  ] };  // L: Modi letter la, lla, Modi vowel sign vocalic L, letter vocalic L
    key <AC10>  { [   semicolon,    colon                        ] };
    key <AC11>  { [   apostrophe,   quotedbl                     ] }; 
                                                                       
    //Z Row
    key <AB01>  { [   U11617,    U11612                     ] };  // Z: Modi letter nya, nga
    key <AB02>  { [   U1162C,    U11609,   U11638           ] };  // X: Modi letter ssa, Modi letter vocalic ll, Modi vowel sign vocalic ll 
    key <AB03>  { [   U11613,    U11614                     ] };  // C: Modi letter ca, cha
    key <AB04>  { [   U1162A,    U1163C,   U1160D           ] };  // V: Modi letter va, Modi vowel sign au, Modi letter au
    key <AB05>  { [   U11624,    U11625                     ] };  // B: Modi letter ba, bha
    key <AB06>  { [   U11621,    U1161C                     ] };  // N: Modi letter na, nna
    key <AB07>  { [   U11626,    U1163D,   U093D,    U0950  ] };  // M: Modi ma, Modi anusvara, avagraha, Devanagari OM (Avagraha & OM commonly occur in Marathi texts, so they are mapped here for convenience.)
    key <AB08>  { [   comma,     U003C,    U11640,   U11644 ] };  // comma: comma, less than, Modi chandrabindu, Modi sign huva
    key <AB09>  { [   period,    U003E                      ] };  // period: period, greater than
    key <AB10>  { [   slash,     question                   ] };

    include "level3(ralt_switch)"
};

// Navees, a phonetic keyboard layout for Urdu
// https://saadatm.github.io/navees
partial alphanumeric_keys
xkb_symbols "urd-navees" {
    include "pk(urd-navees)"
    name[Group1]= "Urdu (Navees)";
};
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         &                  &                  &                  &                  &                  &                  &                  &                  &                  &                  >'                  ?'                  A'                  C'                  E'                  J'                  '                  '                  '                  '                  '                   '                  A(                  B(                  D(                  F(                  K(                  (                  (                   (      $            (      (            (      ,            (      0            (      4            (      8            (      <            (      @            (      D            (      H            (      L            (      P            (      T            (      X            )      \            )      `            )      d            )      h            )      l            )      p            )      t            )      x            )      |            )                  )                  )                  )                  )                  )                  *                  *                  *                  *                  *                  *                  *                  *                  *                  +                  +                  +                  +                  I+                  M+                  T+                  Y+                  u+                  +                  +                  +                  +                  +                  +                  ,                  ,                  ,       	            ,      	            ,      	            ,      	            ,      	            ,      	            ,      	            ,      	            ,       	            -      $	            s-      (	            y-      ,	            {-      0	            }-      4	            -      8	            -      <	            -      @	            -      D	            -      H	            -      L	            -      P	            -      T	            -      X	            -      \	            -      `	            /      d	            "/      h	            #/      l	            %/      p	            '/      t	            )/      x	            +/      |	            0/      	            z7      	            7      	            7      	            7      	            7      	            l;      	            u;      	            y;      	            ~;      	            -B      	            0B      	            7B      	            9B      	            ;B      	            =B      	            >B      	            BB      	            FB      	            7C      	            ;C      	            <C      	            >C      	            @C      	            BC      	            DC      	            IC      	            ]J      	            `J      	            gJ      	            lJ      	            mJ      	            qJ       
            xJ      
            5K      
            9K      
            :K      
            <K      
            >K      
            CK      
            K       
             L      $
            L      (
            L      ,
            L      0
            L      4
            L      8
            L      <
            L      @
            NM      D
            OM      H
            PM      L
            RM      P
            TM      T
            VM      X
            XM      \
            ]M      `
            N      d
            N      h
            N      l
            N      p
            N      t
            N      x
            N      |
            N      
            N      
                    
            !       
            8       
            =       
                   
                   
            ~      
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
                  
            	      
                  
                  
            `      
                  
                  
                  
                  
                  
                  
                  
                                                                                                                                           9                  X                   z      $                  (            '      ,            c      0            d      4            e      8            g      <            i      @            k      D            m      H            r      L            s      P                  T                  X                  \                  `                  d                  h            9      l                  p                  t                  x                  |            p                                                                                                                               &                  8                  K                  P                  ~                                    	                  	                  	                  	                  	                  
                  
                  
                  
                  
                                                      #                  $                  =                  a                  g                  h                  {                                                                                                                                                 
                  
                   
      $                  (                  ,            $      0            ,      4            4      8            H      <                  @                  D                  H            K      L                  P            9      T            f      X                  \                  `                  d            @      h                  l                  p                  t                  x            h      |            v                                                                                                                                                                  :                                                                                                                                                9                  \                  f                  u                  v                                                                                                                              R                  V                  ^                  b                  s       
                  
                  
                  
                  
                  
                  
                  
                   
                  $
                  (
            2      ,
            @      0
            H      4
            J      8
            L      <
            N      @
            P      D
            U      H
            v      L
            x      P
                  T
                  X
                  \
                  `
            #       d
            7       h
            \       l
            q       p
                   t
                   x
                   |
                    
            @       
                    
                   
            G       
            L       
            m       
            r                                     [                                                                                   ;                    L                 ^                       {2      $             2      (                   0             E      4             G      8                   @             6F      D             G      H                   P             F      T             BI      X                   `             G      d             I      h                   p             H      t             I      x                                H                   I                                      H                   I                                                                    0             0       8             0       @             @       H             @                  r                                             G                j          8                   P         r           .symtab .strtab .shstrtab .note.gnu.build-id .note.Linux .rela.text .rela.text.unlikely .rela.init.text .rela.exit.text .rela__ksymtab_gpl __kcrctab_gpl __ksymtab_strings .rela__mcount_loc .rodata.str1.8 .rodata.str1.1 .rela.smp_locks .rodata .modinfo .rela__param .rela.retpoline_sites .rela.return_sites .orc_unwind .rela.orc_unwind_ip __versions .rela__bug_table .rela__jump_table .rela.data .rela.exit.data .rela.init.data .rela.static_call_sites .rela.gnu.linkonce.this_module .bss .comment .note.GNU-stack .BTF .gnu_debuglink                                                                                         @       $                              .                     d       <                              ?                            N                             :      @               8     I      4                    J                     |O                                    E      @                    HK      4                    ^                     9p      @                              Y      @                S            4                    n                     yp      r                              i      @               S     x       4   	                 ~                     p      4                             y      @               8T     8
      4                                          s                                          2               s      N                                                 *x                                         @               pa     @      4                          2               y                                        2                     o                                                  (      `                                    @               f     @      4                                               P                                                         x                                                 h      (                                    @               h     `       4         