+my %xkb = (
+ '@' => "\N{COMBINING DOUBLE ACUTE ACCENT}",
+ '#' => "\N{COMBINING MACRON}",
+ '%' => "\N{COMBINING CEDILLA}",
+ '&' => "\N{COMBINING HORN}",
+ '*' => "\N{COMBINING OGONEK}",
+ '(' => "\N{COMBINING BREVE}",
+ ')' => "\N{COMBINING RING ABOVE}",
+ '_' => "\N{COMBINING DOT BELOW}",
+ '>' => "\N{COMBINING CARON}",
+ '.' => "\N{COMBINING DOT ABOVE}",
+ '?' => "\N{COMBINING HOOK ABOVE}",
+);
+
+my %rows = (
+ '~' => "\N{COMBINING TILDE}",
+ '`' => "\N{COMBINING GRAVE ACCENT}",
+ '!' => '¹',
+ '1' => '¡',
+ '2' => '²',
+ '3' => '³',
+ '$' => '£',
+ '4' => '¤',
+ '5' => '€',
+ '^' => "\N{COMBINING CIRCUMFLEX ACCENT}",
+ '6' => '¼',
+ '7' => '½',
+ '8' => '¾',
+ '9' => '‘',
+ '0' => '’',
+ '-' => '¥',
+ '+' => '÷',
+ '=' => '×',
+ '{' => '“',
+ '}' => '”',
+ '[' => '«',
+ ']' => '»',
+ ':' => '°',
+ ';' => '¶',
+ "'" => "\N{COMBINING ACUTE ACCENT}",
+ '"' => "\N{COMBINING DIAERESIS}",
+ '<' => 'Ç',
+ ',' => 'ç',
+ '/' => '¿',
+ '|' => '¦',
+ '\\'=> '¬',
+ %xkb,
+ map {
+ ($az[$_] eq $letters[$_]) ? () :
+ ($az[$_] => $letters[$_])
+ } 0 .. $#az
+);
+
+my $groups = kbchars(\%rows);
+$groups->{def}{''}{$_} .= ' ext' for keys %xkb;
+$groups->{flag}{ext} = ['xkb', 'unofficial extensions added in Linux (Gnome, KDE)'];