18a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod/*
22409d5f8d7dd8b535ce5ea29e933f7db27d33793Behdad Esfahbod * Copyright © 2009  Red Hat, Inc.
32409d5f8d7dd8b535ce5ea29e933f7db27d33793Behdad Esfahbod * Copyright © 2011  Google, Inc.
48a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod *
5c755cb3e3ac55156d0d2ec05adea7a650b97cc41Behdad Esfahbod *  This is part of HarfBuzz, a text shaping library.
68a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod *
78a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod * Permission is hereby granted, without written agreement and without
88a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod * license or royalty fees, to use, copy, modify, and distribute this
98a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod * software and its documentation for any purpose, provided that the
108a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod * above copyright notice and the following two paragraphs appear in
118a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod * all copies of this software.
128a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod *
138a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
148a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
158a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
168a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
178a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod * DAMAGE.
188a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod *
198a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
208a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
218a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
228a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
238a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
248a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod *
258a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod * Red Hat Author(s): Behdad Esfahbod
26ba2d543004573e8e4e56df70b7fe2a66a42bc83fBehdad Esfahbod * Google Author(s): Behdad Esfahbod, Roozbeh Pournader
278a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod */
288a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod
29c57d454accff66e5f2c58006e8fb40bc020b6182Behdad Esfahbod#include "hb-private.hh"
308a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod
318a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod#include <string.h>
328a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod
33acdba3f90b232fc12fcb200dca2584481b339118Behdad Esfahbod
348a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod
3562879eebd9965179af8602ba29ac0a64a739b757Behdad Esfahbod/* hb_script_t */
3662879eebd9965179af8602ba29ac0a64a739b757Behdad Esfahbod
3762879eebd9965179af8602ba29ac0a64a739b757Behdad Esfahbodstatic hb_tag_t
3862879eebd9965179af8602ba29ac0a64a739b757Behdad Esfahbodhb_ot_old_tag_from_script (hb_script_t script)
3962879eebd9965179af8602ba29ac0a64a739b757Behdad Esfahbod{
4010a33296e674ee84b9ed2df25cf373de7d020b8dBehdad Esfahbod  /* This seems to be accurate as of end of 2012. */
4110a33296e674ee84b9ed2df25cf373de7d020b8dBehdad Esfahbod
4262879eebd9965179af8602ba29ac0a64a739b757Behdad Esfahbod  switch ((hb_tag_t) script) {
4340b5c2e86c633441040196d158e965ad95d6ad37Behdad Esfahbod    case HB_SCRIPT_INVALID:		return HB_OT_TAG_DEFAULT_SCRIPT;
4440b5c2e86c633441040196d158e965ad95d6ad37Behdad Esfahbod
4540b5c2e86c633441040196d158e965ad95d6ad37Behdad Esfahbod    /* KATAKANA and HIRAGANA both map to 'kana' */
4662879eebd9965179af8602ba29ac0a64a739b757Behdad Esfahbod    case HB_SCRIPT_HIRAGANA:		return HB_TAG('k','a','n','a');
4740b5c2e86c633441040196d158e965ad95d6ad37Behdad Esfahbod
4840b5c2e86c633441040196d158e965ad95d6ad37Behdad Esfahbod    /* Spaces at the end are preserved, unlike ISO 15924 */
4962879eebd9965179af8602ba29ac0a64a739b757Behdad Esfahbod    case HB_SCRIPT_LAO:			return HB_TAG('l','a','o',' ');
5062879eebd9965179af8602ba29ac0a64a739b757Behdad Esfahbod    case HB_SCRIPT_YI:			return HB_TAG('y','i',' ',' ');
5162879eebd9965179af8602ba29ac0a64a739b757Behdad Esfahbod    /* Unicode-5.0 additions */
5262879eebd9965179af8602ba29ac0a64a739b757Behdad Esfahbod    case HB_SCRIPT_NKO:			return HB_TAG('n','k','o',' ');
5362879eebd9965179af8602ba29ac0a64a739b757Behdad Esfahbod    /* Unicode-5.1 additions */
5462879eebd9965179af8602ba29ac0a64a739b757Behdad Esfahbod    case HB_SCRIPT_VAI:			return HB_TAG('v','a','i',' ');
5562879eebd9965179af8602ba29ac0a64a739b757Behdad Esfahbod    /* Unicode-5.2 additions */
5662879eebd9965179af8602ba29ac0a64a739b757Behdad Esfahbod    /* Unicode-6.0 additions */
5762879eebd9965179af8602ba29ac0a64a739b757Behdad Esfahbod  }
5862879eebd9965179af8602ba29ac0a64a739b757Behdad Esfahbod
5962879eebd9965179af8602ba29ac0a64a739b757Behdad Esfahbod  /* Else, just change first char to lowercase and return */
607627100f428ac0ec8509d961d368d2d25d8f0b6eBehdad Esfahbod  return ((hb_tag_t) script) | 0x20000000u;
6162879eebd9965179af8602ba29ac0a64a739b757Behdad Esfahbod}
6262879eebd9965179af8602ba29ac0a64a739b757Behdad Esfahbod
6362879eebd9965179af8602ba29ac0a64a739b757Behdad Esfahbodstatic hb_script_t
6462879eebd9965179af8602ba29ac0a64a739b757Behdad Esfahbodhb_ot_old_tag_to_script (hb_tag_t tag)
6562879eebd9965179af8602ba29ac0a64a739b757Behdad Esfahbod{
6640b5c2e86c633441040196d158e965ad95d6ad37Behdad Esfahbod  if (unlikely (tag == HB_OT_TAG_DEFAULT_SCRIPT))
6740b5c2e86c633441040196d158e965ad95d6ad37Behdad Esfahbod    return HB_SCRIPT_INVALID;
6840b5c2e86c633441040196d158e965ad95d6ad37Behdad Esfahbod
6940b5c2e86c633441040196d158e965ad95d6ad37Behdad Esfahbod  /* This side of the conversion is fully algorithmic. */
7040b5c2e86c633441040196d158e965ad95d6ad37Behdad Esfahbod
7140b5c2e86c633441040196d158e965ad95d6ad37Behdad Esfahbod  /* Any spaces at the end of the tag are replaced by repeating the last
7240b5c2e86c633441040196d158e965ad95d6ad37Behdad Esfahbod   * letter.  Eg 'nko ' -> 'Nkoo' */
737627100f428ac0ec8509d961d368d2d25d8f0b6eBehdad Esfahbod  if (unlikely ((tag & 0x0000FF00u) == 0x00002000u))
747627100f428ac0ec8509d961d368d2d25d8f0b6eBehdad Esfahbod    tag |= (tag >> 8) & 0x0000FF00u; /* Copy second letter to third */
757627100f428ac0ec8509d961d368d2d25d8f0b6eBehdad Esfahbod  if (unlikely ((tag & 0x000000FFu) == 0x00000020u))
767627100f428ac0ec8509d961d368d2d25d8f0b6eBehdad Esfahbod    tag |= (tag >> 8) & 0x000000FFu; /* Copy third letter to fourth */
7762879eebd9965179af8602ba29ac0a64a739b757Behdad Esfahbod
7840b5c2e86c633441040196d158e965ad95d6ad37Behdad Esfahbod  /* Change first char to uppercase and return */
797627100f428ac0ec8509d961d368d2d25d8f0b6eBehdad Esfahbod  return (hb_script_t) (tag & ~0x20000000u);
8062879eebd9965179af8602ba29ac0a64a739b757Behdad Esfahbod}
8162879eebd9965179af8602ba29ac0a64a739b757Behdad Esfahbod
8262879eebd9965179af8602ba29ac0a64a739b757Behdad Esfahbodstatic hb_tag_t
8362879eebd9965179af8602ba29ac0a64a739b757Behdad Esfahbodhb_ot_new_tag_from_script (hb_script_t script)
8462879eebd9965179af8602ba29ac0a64a739b757Behdad Esfahbod{
8562879eebd9965179af8602ba29ac0a64a739b757Behdad Esfahbod  switch ((hb_tag_t) script) {
8662879eebd9965179af8602ba29ac0a64a739b757Behdad Esfahbod    case HB_SCRIPT_BENGALI:		return HB_TAG('b','n','g','2');
8762879eebd9965179af8602ba29ac0a64a739b757Behdad Esfahbod    case HB_SCRIPT_DEVANAGARI:		return HB_TAG('d','e','v','2');
8862879eebd9965179af8602ba29ac0a64a739b757Behdad Esfahbod    case HB_SCRIPT_GUJARATI:		return HB_TAG('g','j','r','2');
8962879eebd9965179af8602ba29ac0a64a739b757Behdad Esfahbod    case HB_SCRIPT_GURMUKHI:		return HB_TAG('g','u','r','2');
9062879eebd9965179af8602ba29ac0a64a739b757Behdad Esfahbod    case HB_SCRIPT_KANNADA:		return HB_TAG('k','n','d','2');
9162879eebd9965179af8602ba29ac0a64a739b757Behdad Esfahbod    case HB_SCRIPT_MALAYALAM:		return HB_TAG('m','l','m','2');
9262879eebd9965179af8602ba29ac0a64a739b757Behdad Esfahbod    case HB_SCRIPT_ORIYA:		return HB_TAG('o','r','y','2');
9362879eebd9965179af8602ba29ac0a64a739b757Behdad Esfahbod    case HB_SCRIPT_TAMIL:		return HB_TAG('t','m','l','2');
9462879eebd9965179af8602ba29ac0a64a739b757Behdad Esfahbod    case HB_SCRIPT_TELUGU:		return HB_TAG('t','e','l','2');
95de796a6fb98f4deda276caa82266b7c830978e0bBehdad Esfahbod    case HB_SCRIPT_MYANMAR:		return HB_TAG('m','y','m','2');
9662879eebd9965179af8602ba29ac0a64a739b757Behdad Esfahbod  }
9762879eebd9965179af8602ba29ac0a64a739b757Behdad Esfahbod
9840b5c2e86c633441040196d158e965ad95d6ad37Behdad Esfahbod  return HB_OT_TAG_DEFAULT_SCRIPT;
9962879eebd9965179af8602ba29ac0a64a739b757Behdad Esfahbod}
10062879eebd9965179af8602ba29ac0a64a739b757Behdad Esfahbod
10162879eebd9965179af8602ba29ac0a64a739b757Behdad Esfahbodstatic hb_script_t
10262879eebd9965179af8602ba29ac0a64a739b757Behdad Esfahbodhb_ot_new_tag_to_script (hb_tag_t tag)
10362879eebd9965179af8602ba29ac0a64a739b757Behdad Esfahbod{
10462879eebd9965179af8602ba29ac0a64a739b757Behdad Esfahbod  switch (tag) {
10562879eebd9965179af8602ba29ac0a64a739b757Behdad Esfahbod    case HB_TAG('b','n','g','2'):	return HB_SCRIPT_BENGALI;
10662879eebd9965179af8602ba29ac0a64a739b757Behdad Esfahbod    case HB_TAG('d','e','v','2'):	return HB_SCRIPT_DEVANAGARI;
10762879eebd9965179af8602ba29ac0a64a739b757Behdad Esfahbod    case HB_TAG('g','j','r','2'):	return HB_SCRIPT_GUJARATI;
10862879eebd9965179af8602ba29ac0a64a739b757Behdad Esfahbod    case HB_TAG('g','u','r','2'):	return HB_SCRIPT_GURMUKHI;
10962879eebd9965179af8602ba29ac0a64a739b757Behdad Esfahbod    case HB_TAG('k','n','d','2'):	return HB_SCRIPT_KANNADA;
11062879eebd9965179af8602ba29ac0a64a739b757Behdad Esfahbod    case HB_TAG('m','l','m','2'):	return HB_SCRIPT_MALAYALAM;
11162879eebd9965179af8602ba29ac0a64a739b757Behdad Esfahbod    case HB_TAG('o','r','y','2'):	return HB_SCRIPT_ORIYA;
11262879eebd9965179af8602ba29ac0a64a739b757Behdad Esfahbod    case HB_TAG('t','m','l','2'):	return HB_SCRIPT_TAMIL;
11362879eebd9965179af8602ba29ac0a64a739b757Behdad Esfahbod    case HB_TAG('t','e','l','2'):	return HB_SCRIPT_TELUGU;
114de796a6fb98f4deda276caa82266b7c830978e0bBehdad Esfahbod    case HB_TAG('m','y','m','2'):	return HB_SCRIPT_MYANMAR;
11562879eebd9965179af8602ba29ac0a64a739b757Behdad Esfahbod  }
11662879eebd9965179af8602ba29ac0a64a739b757Behdad Esfahbod
11762879eebd9965179af8602ba29ac0a64a739b757Behdad Esfahbod  return HB_SCRIPT_UNKNOWN;
11862879eebd9965179af8602ba29ac0a64a739b757Behdad Esfahbod}
11962879eebd9965179af8602ba29ac0a64a739b757Behdad Esfahbod
1208a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod/*
1218a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod * Complete list at:
12240b5c2e86c633441040196d158e965ad95d6ad37Behdad Esfahbod * https://www.microsoft.com/typography/otspec/scripttags.htm
12340b5c2e86c633441040196d158e965ad95d6ad37Behdad Esfahbod * https://www.microsoft.com/typography/otspec160/scripttagsProposed.htm
12462879eebd9965179af8602ba29ac0a64a739b757Behdad Esfahbod *
12562879eebd9965179af8602ba29ac0a64a739b757Behdad Esfahbod * Most of the script tags are the same as the ISO 15924 tag but lowercased.
12662879eebd9965179af8602ba29ac0a64a739b757Behdad Esfahbod * So we just do that, and handle the exceptional cases in a switch.
1278a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod */
1288a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod
12962879eebd9965179af8602ba29ac0a64a739b757Behdad Esfahbodvoid
13062879eebd9965179af8602ba29ac0a64a739b757Behdad Esfahbodhb_ot_tags_from_script (hb_script_t  script,
13162879eebd9965179af8602ba29ac0a64a739b757Behdad Esfahbod			hb_tag_t    *script_tag_1,
13262879eebd9965179af8602ba29ac0a64a739b757Behdad Esfahbod			hb_tag_t    *script_tag_2)
13362879eebd9965179af8602ba29ac0a64a739b757Behdad Esfahbod{
13462879eebd9965179af8602ba29ac0a64a739b757Behdad Esfahbod  hb_tag_t new_tag;
1355d91c3d547f78163b36aa7436d4388a836cca94aBehdad Esfahbod
13640b5c2e86c633441040196d158e965ad95d6ad37Behdad Esfahbod  *script_tag_2 = HB_OT_TAG_DEFAULT_SCRIPT;
13762879eebd9965179af8602ba29ac0a64a739b757Behdad Esfahbod  *script_tag_1 = hb_ot_old_tag_from_script (script);
1388a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod
13962879eebd9965179af8602ba29ac0a64a739b757Behdad Esfahbod  new_tag = hb_ot_new_tag_from_script (script);
14040b5c2e86c633441040196d158e965ad95d6ad37Behdad Esfahbod  if (unlikely (new_tag != HB_OT_TAG_DEFAULT_SCRIPT)) {
14162879eebd9965179af8602ba29ac0a64a739b757Behdad Esfahbod    *script_tag_2 = *script_tag_1;
14262879eebd9965179af8602ba29ac0a64a739b757Behdad Esfahbod    *script_tag_1 = new_tag;
14362879eebd9965179af8602ba29ac0a64a739b757Behdad Esfahbod  }
1448a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod}
1458a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod
146b490fa343322f1b5abaf880abc073287c1f34132Behdad Esfahbodhb_script_t
147b490fa343322f1b5abaf880abc073287c1f34132Behdad Esfahbodhb_ot_tag_to_script (hb_tag_t tag)
148b490fa343322f1b5abaf880abc073287c1f34132Behdad Esfahbod{
1497627100f428ac0ec8509d961d368d2d25d8f0b6eBehdad Esfahbod  if (unlikely ((tag & 0x000000FFu) == '2'))
15062879eebd9965179af8602ba29ac0a64a739b757Behdad Esfahbod    return hb_ot_new_tag_to_script (tag);
151b490fa343322f1b5abaf880abc073287c1f34132Behdad Esfahbod
15262879eebd9965179af8602ba29ac0a64a739b757Behdad Esfahbod  return hb_ot_old_tag_to_script (tag);
15362879eebd9965179af8602ba29ac0a64a739b757Behdad Esfahbod}
154b490fa343322f1b5abaf880abc073287c1f34132Behdad Esfahbod
1555d91c3d547f78163b36aa7436d4388a836cca94aBehdad Esfahbod
15662879eebd9965179af8602ba29ac0a64a739b757Behdad Esfahbod/* hb_language_t */
1578a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod
1588a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbodtypedef struct {
159ee5350d667f3a9644667202597694581f2cf657dBehdad Esfahbod  char language[4];
1608a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  hb_tag_t tag;
1618a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod} LangTag;
1628a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod
1638a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod/*
1648a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod * Complete list at:
1658a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod * http://www.microsoft.com/typography/otspec/languagetags.htm
1668a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod *
1678a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod * Generated by intersecting the OpenType language tag list from
1688a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod * Draft OpenType 1.5 spec, with with the ISO 639-3 codes from
16908c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader * 2008-08-04, matching on name, and finally adjusted manually.
1708a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod *
17108c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader * Updated on 2012-12-07 with more research into remaining codes.
17208c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader *
17308c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader * Updated on 2013-11-23 based on usage in SIL and Microsoft fonts,
17408c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader * the new proposal from Microsoft, and latest ISO 639-3 names.
175ba2d543004573e8e4e56df70b7fe2a66a42bc83fBehdad Esfahbod *
176ba2d543004573e8e4e56df70b7fe2a66a42bc83fBehdad Esfahbod * Some items still missing.  Those are commented out at the end.
1778a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod * Keep sorted for bsearch.
1788a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod */
17940b5c2e86c633441040196d158e965ad95d6ad37Behdad Esfahbod
1808a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbodstatic const LangTag ot_languages[] = {
1818a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"aa",	HB_TAG('A','F','R',' ')},	/* Afar */
1828a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"ab",	HB_TAG('A','B','K',' ')},	/* Abkhazian */
1838a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"abq",	HB_TAG('A','B','A',' ')},	/* Abaza */
18408c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"ach",	HB_TAG('A','C','H',' ')},	/* Acoli */
185ba2d543004573e8e4e56df70b7fe2a66a42bc83fBehdad Esfahbod  {"ada",	HB_TAG('D','N','G',' ')},	/* Dangme */
1868a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"ady",	HB_TAG('A','D','Y',' ')},	/* Adyghe */
1878a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"af",	HB_TAG('A','F','K',' ')},	/* Afrikaans */
188ba2d543004573e8e4e56df70b7fe2a66a42bc83fBehdad Esfahbod  {"aii",	HB_TAG('S','W','A',' ')},	/* Swadaya Aramaic */
18908c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"aio",	HB_TAG('A','I','O',' ')},	/* Aiton */
1908a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"aiw",	HB_TAG('A','R','I',' ')},	/* Aari */
19108c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"ak",	HB_TAG('T','W','I',' ')},	/* Akan [macrolanguage] */
192ba2d543004573e8e4e56df70b7fe2a66a42bc83fBehdad Esfahbod  {"alt",	HB_TAG('A','L','T',' ')},	/* [Southern] Altai */
1938a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"am",	HB_TAG('A','M','H',' ')},	/* Amharic */
194ba2d543004573e8e4e56df70b7fe2a66a42bc83fBehdad Esfahbod  {"amf",	HB_TAG('H','B','N',' ')},	/* Hammer-Banna */
19508c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"an",	HB_TAG('A','R','G',' ')},	/* Aragonese */
19608c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"ang",	HB_TAG('A','N','G',' ')},	/* Old English (ca. 450-1100) */
19708c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"ar",	HB_TAG('A','R','A',' ')},	/* Arabic [macrolanguage] */
19808c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"arb",	HB_TAG('A','R','A',' ')},	/* Standard Arabic */
1998a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"arn",	HB_TAG('M','A','P',' ')},	/* Mapudungun */
20008c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"ary",	HB_TAG('M','O','R',' ')},	/* Moroccan Arabic */
2018a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"as",	HB_TAG('A','S','M',' ')},	/* Assamese */
20208c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"ast",	HB_TAG('A','S','T',' ')},	/* Asturian/Asturleonese/Bable/Leonese */
203ba2d543004573e8e4e56df70b7fe2a66a42bc83fBehdad Esfahbod  {"ath",	HB_TAG('A','T','H',' ')},	/* Athapaskan [family] */
204ba2d543004573e8e4e56df70b7fe2a66a42bc83fBehdad Esfahbod  {"atv",	HB_TAG('A','L','T',' ')},	/* [Northern] Altai */
2058a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"av",	HB_TAG('A','V','R',' ')},	/* Avaric */
2068a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"awa",	HB_TAG('A','W','A',' ')},	/* Awadhi */
20708c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"ay",	HB_TAG('A','Y','M',' ')},	/* Aymara [macrolanguage] */
20808c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"az",	HB_TAG('A','Z','E',' ')},	/* Azerbaijani [macrolanguage] */
20908c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"azb",	HB_TAG('A','Z','B',' ')},	/* South Azerbaijani */
21008c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"azj",	HB_TAG('A','Z','E',' ')},	/* North Azerbaijani */
2118a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"ba",	HB_TAG('B','S','H',' ')},	/* Bashkir */
212ba2d543004573e8e4e56df70b7fe2a66a42bc83fBehdad Esfahbod  {"bai",	HB_TAG('B','M','L',' ')},	/* Bamileke [family] */
21308c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"bal",	HB_TAG('B','L','I',' ')},	/* Baluchi [macrolangauge] */
21408c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"ban",	HB_TAG('B','A','N',' ')},	/* Balinese */
21508c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"bar",	HB_TAG('B','A','R',' ')},	/* Bavarian */
21608c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"bbc",	HB_TAG('B','B','C',' ')},	/* Batak Toba */
21708c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"bci",	HB_TAG('B','A','U',' ')},	/* Baoulé */
21808c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"bcl",	HB_TAG('B','I','K',' ')},	/* Central Bikol */
2198a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"bcq",	HB_TAG('B','C','H',' ')},	/* Bench */
22008c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"be",	HB_TAG('B','E','L',' ')},  	/* Belarusian */
2218a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"bem",	HB_TAG('B','E','M',' ')},	/* Bemba (Zambia) */
222ba2d543004573e8e4e56df70b7fe2a66a42bc83fBehdad Esfahbod  {"ber",	HB_TAG('B','E','R',' ')},  	/* Berber [family] */
2238a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"bfq",	HB_TAG('B','A','D',' ')},	/* Badaga */
2248a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"bft",	HB_TAG('B','L','T',' ')},	/* Balti */
225ba2d543004573e8e4e56df70b7fe2a66a42bc83fBehdad Esfahbod  {"bfy",	HB_TAG('B','A','G',' ')},	/* Baghelkhandi */
2268a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"bg",	HB_TAG('B','G','R',' ')},	/* Bulgarian */
22708c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"bgc",	HB_TAG('B','G','C',' ')},	/* Haryanvi */
22808c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"bgq",	HB_TAG('B','G','Q',' ')},	/* Bagri */
2298a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"bhb",	HB_TAG('B','H','I',' ')},	/* Bhili */
23008c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"bhk",	HB_TAG('B','I','K',' ')},	/* Albay Bicolano (retired code) */
2318a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"bho",	HB_TAG('B','H','O',' ')},	/* Bhojpuri */
23208c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"bi",	HB_TAG('B','I','S',' ')},	/* Bislama */
23308c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"bik",	HB_TAG('B','I','K',' ')},	/* Bikol [macrolanguage] */
2348a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"bin",	HB_TAG('E','D','O',' ')},	/* Bini */
23508c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"bjj",	HB_TAG('B','J','J',' ')},	/* Kanauji */
236ba2d543004573e8e4e56df70b7fe2a66a42bc83fBehdad Esfahbod  {"bjt",	HB_TAG('B','L','N',' ')},	/* Balanta-Ganja */
237ba2d543004573e8e4e56df70b7fe2a66a42bc83fBehdad Esfahbod  {"bla",	HB_TAG('B','K','F',' ')},	/* Blackfoot */
238ba2d543004573e8e4e56df70b7fe2a66a42bc83fBehdad Esfahbod  {"ble",	HB_TAG('B','L','N',' ')},	/* Balanta-Kentohe */
23908c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"blk",	HB_TAG('B','L','K',' ')},	/* Pa'O/Pa'o Karen */
24008c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"bln",	HB_TAG('B','I','K',' ')},	/* Southern Catanduanes Bikol */
2418a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"bm",	HB_TAG('B','M','B',' ')},	/* Bambara */
2428a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"bn",	HB_TAG('B','E','N',' ')},	/* Bengali */
2438a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"bo",	HB_TAG('T','I','B',' ')},	/* Tibetan */
24408c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"bpy",	HB_TAG('B','P','Y',' ')},	/* Bishnupriya */
24508c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"bqi",	HB_TAG('L','R','C',' ')},	/* Bakhtiari */
2468a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"br",	HB_TAG('B','R','E',' ')},	/* Breton */
247ba2d543004573e8e4e56df70b7fe2a66a42bc83fBehdad Esfahbod  {"bra",	HB_TAG('B','R','I',' ')},	/* Braj Bhasha */
2488a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"brh",	HB_TAG('B','R','H',' ')},	/* Brahui */
24908c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"brx",	HB_TAG('B','R','X',' ')},	/* Bodo (India) */
2508a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"bs",	HB_TAG('B','O','S',' ')},	/* Bosnian */
2518a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"btb",	HB_TAG('B','T','I',' ')},	/* Beti (Cameroon) */
25208c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"bto",	HB_TAG('B','I','K',' ')},	/* Rinconada Bikol */
25308c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"bts",	HB_TAG('B','T','S',' ')},	/* Batak Simalungun */
25408c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"bug",	HB_TAG('B','U','G',' ')},	/* Buginese */
255ba2d543004573e8e4e56df70b7fe2a66a42bc83fBehdad Esfahbod  {"bxr",	HB_TAG('R','B','U',' ')},	/* Russian Buriat */
256ba2d543004573e8e4e56df70b7fe2a66a42bc83fBehdad Esfahbod  {"byn",	HB_TAG('B','I','L',' ')},	/* Bilen */
2578a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"ca",	HB_TAG('C','A','T',' ')},	/* Catalan */
25808c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"cbk",	HB_TAG('C','B','K',' ')},	/* Chavacano */
2598a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"ce",	HB_TAG('C','H','E',' ')},	/* Chechen */
2608a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"ceb",	HB_TAG('C','E','B',' ')},	/* Cebuano */
26108c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"cgg",	HB_TAG('C','G','G',' ')},	/* Chiga */
26208c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"ch",	HB_TAG('C','H','A',' ')},	/* Chamorro */
26308c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"cho",	HB_TAG('C','H','O',' ')},	/* Choctaw */
2648a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"chp",	HB_TAG('C','H','P',' ')},	/* Chipewyan */
2658a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"chr",	HB_TAG('C','H','R',' ')},	/* Cherokee */
26608c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"chy",	HB_TAG('C','H','Y',' ')},	/* Cheyenne */
26708c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"ckb",	HB_TAG('K','U','R',' ')},	/* Central Kurdish (Sorani) */
268ba2d543004573e8e4e56df70b7fe2a66a42bc83fBehdad Esfahbod  {"ckt",	HB_TAG('C','H','K',' ')},	/* Chukchi */
2698a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"cop",	HB_TAG('C','O','P',' ')},	/* Coptic */
2708a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"cr",	HB_TAG('C','R','E',' ')},	/* Cree */
2718a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"crh",	HB_TAG('C','R','T',' ')},	/* Crimean Tatar */
272ba2d543004573e8e4e56df70b7fe2a66a42bc83fBehdad Esfahbod  {"crj",	HB_TAG('E','C','R',' ')},	/* [Southern] East Cree */
273ba2d543004573e8e4e56df70b7fe2a66a42bc83fBehdad Esfahbod  {"crl",	HB_TAG('E','C','R',' ')},	/* [Northern] East Cree */
2748a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"crm",	HB_TAG('M','C','R',' ')},	/* Moose Cree */
2758a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"crx",	HB_TAG('C','R','R',' ')},	/* Carrier */
2768a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"cs",	HB_TAG('C','S','Y',' ')},	/* Czech */
27708c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"csb",	HB_TAG('C','S','B',' ')},	/* Kashubian */
27808c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"ctg",	HB_TAG('C','T','G',' ')},	/* Chittagonian */
27908c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"cts",	HB_TAG('B','I','K',' ')},	/* Northern Catanduanes Bikol */
2808a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"cu",	HB_TAG('C','S','L',' ')},	/* Church Slavic */
2818a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"cv",	HB_TAG('C','H','U',' ')},	/* Chuvash */
2828a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"cwd",	HB_TAG('D','C','R',' ')},	/* Woods Cree */
2838a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"cy",	HB_TAG('W','E','L',' ')},	/* Welsh */
2848a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"da",	HB_TAG('D','A','N',' ')},	/* Danish */
2858a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"dap",	HB_TAG('N','I','S',' ')},	/* Nisi (India) */
2868a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"dar",	HB_TAG('D','A','R',' ')},	/* Dargwa */
2878a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"de",	HB_TAG('D','E','U',' ')},	/* German */
28808c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"dgo",	HB_TAG('D','G','O',' ')},	/* Dogri */
28908c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"dhd",	HB_TAG('M','A','W',' ')},	/* Dhundari */
29008c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"din",	HB_TAG('D','N','K',' ')},	/* Dinka [macrolanguage] */
29108c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"diq",	HB_TAG('D','I','Q',' ')},	/* Dimli */
29208c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"dje",	HB_TAG('D','J','R',' ')},	/* Zarma */
2938a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"dng",	HB_TAG('D','U','N',' ')},	/* Dungan */
29408c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"doi",	HB_TAG('D','G','R',' ')},	/* Dogri [macrolanguage] */
2958a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"dsb",	HB_TAG('L','S','B',' ')},	/* Lower Sorbian */
29608c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"dv",	HB_TAG('D','I','V',' ')},	/* Dhivehi/Divehi/Maldivian */
297ba2d543004573e8e4e56df70b7fe2a66a42bc83fBehdad Esfahbod  {"dyu",	HB_TAG('J','U','L',' ')},	/* Jula */
2988a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"dz",	HB_TAG('D','Z','N',' ')},	/* Dzongkha */
2998a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"ee",	HB_TAG('E','W','E',' ')},	/* Ewe */
3008a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"efi",	HB_TAG('E','F','I',' ')},	/* Efik */
30108c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"ekk",	HB_TAG('E','T','I',' ')},	/* Standard Estonian */
3028a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"el",	HB_TAG('E','L','L',' ')},	/* Modern Greek (1453-) */
30308c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"emk",	HB_TAG('M','N','K',' ')},	/* Eastern Maninkakan */
3048a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"en",	HB_TAG('E','N','G',' ')},	/* English */
3058a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"eo",	HB_TAG('N','T','O',' ')},	/* Esperanto */
3068a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"eot",	HB_TAG('B','T','I',' ')},	/* Beti (Côte d'Ivoire) */
3078a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"es",	HB_TAG('E','S','P',' ')},	/* Spanish */
30808c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"et",	HB_TAG('E','T','I',' ')},	/* Estonian [macrolanguage] */
3098a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"eu",	HB_TAG('E','U','Q',' ')},	/* Basque */
3108a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"eve",	HB_TAG('E','V','N',' ')},	/* Even */
3118a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"evn",	HB_TAG('E','V','K',' ')},	/* Evenki */
31208c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"fa",	HB_TAG('F','A','R',' ')},	/* Persian [macrolanguage] */
31308c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"ff",	HB_TAG('F','U','L',' ')},	/* Fulah [macrolanguage] */
3148a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"fi",	HB_TAG('F','I','N',' ')},	/* Finnish */
3158a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"fil",	HB_TAG('P','I','L',' ')},	/* Filipino */
3168a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"fj",	HB_TAG('F','J','I',' ')},	/* Fijian */
3178a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"fo",	HB_TAG('F','O','S',' ')},	/* Faroese */
3188a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"fon",	HB_TAG('F','O','N',' ')},	/* Fon */
3198a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"fr",	HB_TAG('F','R','A',' ')},	/* French */
32008c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"frc",	HB_TAG('F','R','C',' ')},	/* Cajun French */
32108c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"frp",	HB_TAG('F','R','P',' ')},	/* Arpitan/Francoprovençal */
3228a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"fur",	HB_TAG('F','R','L',' ')},	/* Friulian */
32308c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"fuv",	HB_TAG('F','U','V',' ')},	/* Nigerian Fulfulde */
3248a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"fy",	HB_TAG('F','R','I',' ')},	/* Western Frisian */
3258a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"ga",	HB_TAG('I','R','I',' ')},	/* Irish */
3268a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"gaa",	HB_TAG('G','A','D',' ')},	/* Ga */
3278a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"gag",	HB_TAG('G','A','G',' ')},	/* Gagauz */
3288a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"gbm",	HB_TAG('G','A','W',' ')},	/* Garhwali */
3298a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"gd",	HB_TAG('G','A','E',' ')},	/* Scottish Gaelic */
330ba2d543004573e8e4e56df70b7fe2a66a42bc83fBehdad Esfahbod  {"gez",	HB_TAG('G','E','Z',' ')},	/* Ge'ez */
33108c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"ggo",	HB_TAG('G','O','N',' ')},	/* Southern Gondi */
3328a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"gl",	HB_TAG('G','A','L',' ')},	/* Galician */
3338a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"gld",	HB_TAG('N','A','N',' ')},	/* Nanai */
33408c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"glk",	HB_TAG('G','L','K',' ')},	/* Gilaki */
33508c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"gn",	HB_TAG('G','U','A',' ')},	/* Guarani [macrolanguage] */
33608c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"gno",	HB_TAG('G','O','N',' ')},	/* Northern Gondi */
33708c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"gog",	HB_TAG('G','O','G',' ')},	/* Gogo */
33808c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"gon",	HB_TAG('G','O','N',' ')},	/* Gondi [macrolanguage] */
3398a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"grt",	HB_TAG('G','R','O',' ')},	/* Garo */
340ba2d543004573e8e4e56df70b7fe2a66a42bc83fBehdad Esfahbod  {"gru",	HB_TAG('S','O','G',' ')},	/* Sodo Gurage */
3418a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"gu",	HB_TAG('G','U','J',' ')},	/* Gujarati */
34208c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"guc",	HB_TAG('G','U','C',' ')},	/* Wayuu */
3438a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"guk",	HB_TAG('G','M','Z',' ')},	/* Gumuz */
34408c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader/*{"guk",	HB_TAG('G','U','K',' ')},*/	/* Gumuz (in SIL fonts) */
34508c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"guz",	HB_TAG('G','U','Z',' ')},	/* Ekegusii/Gusii */
34608c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"gv",	HB_TAG('M','N','X',' ')},	/* Manx */
3478a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"ha",	HB_TAG('H','A','U',' ')},	/* Hausa */
3488a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"har",	HB_TAG('H','R','I',' ')},	/* Harari */
34908c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"haw",	HB_TAG('H','A','W',' ')},  	/* Hawaiian */
35008c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"hay",	HB_TAG('H','A','Y',' ')},  	/* Haya */
35108c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"haz",	HB_TAG('H','A','Z',' ')},  	/* Hazaragi */
3528a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"he",	HB_TAG('I','W','R',' ')},	/* Hebrew */
35308c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"hz",	HB_TAG('H','E','R',' ')},	/* Herero */
3548a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"hi",	HB_TAG('H','I','N',' ')},	/* Hindi */
3558a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"hil",	HB_TAG('H','I','L',' ')},	/* Hiligaynon */
356ba2d543004573e8e4e56df70b7fe2a66a42bc83fBehdad Esfahbod  {"hnd",	HB_TAG('H','N','D',' ')},	/* [Southern] Hindko */
357ba2d543004573e8e4e56df70b7fe2a66a42bc83fBehdad Esfahbod  {"hne",	HB_TAG('C','H','H',' ')},	/* Chattisgarhi */
358ba2d543004573e8e4e56df70b7fe2a66a42bc83fBehdad Esfahbod  {"hno",	HB_TAG('H','N','D',' ')},	/* [Northern] Hindko */
35908c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"ho",	HB_TAG('H','M','O',' ')},	/* Hiri Motu */
3608a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"hoc",	HB_TAG('H','O',' ',' ')},	/* Ho */
361ba2d543004573e8e4e56df70b7fe2a66a42bc83fBehdad Esfahbod  {"hoj",	HB_TAG('H','A','R',' ')},	/* Harauti */
3628a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"hr",	HB_TAG('H','R','V',' ')},	/* Croatian */
3638a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"hsb",	HB_TAG('U','S','B',' ')},	/* Upper Sorbian */
36408c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"ht",	HB_TAG('H','A','I',' ')},	/* Haitian/Haitian Creole */
3658a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"hu",	HB_TAG('H','U','N',' ')},	/* Hungarian */
3668a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"hy",	HB_TAG('H','Y','E',' ')},	/* Armenian */
36708c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"hz",	HB_TAG('H','E','R',' ')},	/* Herero */
36808c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"ia",	HB_TAG('I','N','A',' ')},	/* Interlingua (International Auxiliary Language Association) */
36908c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"ibb",	HB_TAG('I','B','B',' ')},	/* Ibibio */
3708a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"id",	HB_TAG('I','N','D',' ')},	/* Indonesian */
37108c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"ie",	HB_TAG('I','L','E',' ')},	/* Interlingue/Occidental */
3728a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"ig",	HB_TAG('I','B','O',' ')},	/* Igbo */
3738a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"igb",	HB_TAG('E','B','I',' ')},	/* Ebira */
37408c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"ijc",	HB_TAG('I','J','O',' ')},	/* Izon */
375ba2d543004573e8e4e56df70b7fe2a66a42bc83fBehdad Esfahbod  {"ijo",	HB_TAG('I','J','O',' ')},	/* Ijo [family] */
37608c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"ik",	HB_TAG('I','P','K',' ')},	/* Inupiaq [macrolanguage] */
377ba2d543004573e8e4e56df70b7fe2a66a42bc83fBehdad Esfahbod  {"ilo",	HB_TAG('I','L','O',' ')},	/* Ilokano */
3788a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"inh",	HB_TAG('I','N','G',' ')},	/* Ingush */
37908c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"io",	HB_TAG('I','D','O',' ')},	/* Ido */
3808a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"is",	HB_TAG('I','S','L',' ')},	/* Icelandic */
3818a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"it",	HB_TAG('I','T','A',' ')},	/* Italian */
38208c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"iu",	HB_TAG('I','N','U',' ')},	/* Inuktitut [macrolanguage] */
3838a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"ja",	HB_TAG('J','A','N',' ')},	/* Japanese */
38408c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"jam",	HB_TAG('J','A','M',' ')},	/* Jamaican Creole English */
38508c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"jbo",	HB_TAG('J','B','O',' ')},	/* Lojban */
3868a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"jv",	HB_TAG('J','A','V',' ')},	/* Javanese */
3878a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"ka",	HB_TAG('K','A','T',' ')},	/* Georgian */
388ba2d543004573e8e4e56df70b7fe2a66a42bc83fBehdad Esfahbod  {"kaa",	HB_TAG('K','R','K',' ')},	/* Karakalpak */
38908c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"kab",	HB_TAG('K','A','B',' ')},	/* Kabyle */
3908a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"kam",	HB_TAG('K','M','B',' ')},	/* Kamba (Kenya) */
391ba2d543004573e8e4e56df70b7fe2a66a42bc83fBehdad Esfahbod  {"kar",	HB_TAG('K','R','N',' ')},	/* Karen [family] */
3928a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"kbd",	HB_TAG('K','A','B',' ')},	/* Kabardian */
39308c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"kde",	HB_TAG('K','D','E',' ')},	/* Makonde */
3948a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"kdr",	HB_TAG('K','R','M',' ')},	/* Karaim */
3958a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"kdt",	HB_TAG('K','U','Y',' ')},	/* Kuy */
396ba2d543004573e8e4e56df70b7fe2a66a42bc83fBehdad Esfahbod  {"kex",	HB_TAG('K','K','N',' ')},	/* Kokni */
3978a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"kfr",	HB_TAG('K','A','C',' ')},	/* Kachchi */
3988a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"kfy",	HB_TAG('K','M','N',' ')},	/* Kumaoni */
39908c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"kg",	HB_TAG('K','O','N',' ')},	/* Kongo [macrolanguage] */
4008a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"kha",	HB_TAG('K','S','I',' ')},	/* Khasi */
40108c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"khb",	HB_TAG('X','B','D',' ')},	/* Lü */
40208c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"kht",	HB_TAG('K','H','N',' ')},	/* Khamti (Microsoft fonts) */
40308c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader/*{"kht",	HB_TAG('K','H','T',' ')},*/	/* Khamti (OpenType spec and SIL fonts) */
4048a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"khw",	HB_TAG('K','H','W',' ')},	/* Khowar */
40508c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"ki",	HB_TAG('K','I','K',' ')},	/* Gikuyu/Kikuyu */
40608c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"kj",	HB_TAG('K','U','A',' ')},	/* Kuanyama/Kwanyama */
407ba2d543004573e8e4e56df70b7fe2a66a42bc83fBehdad Esfahbod  {"kjh",	HB_TAG('K','H','A',' ')},	/* Khakass */
40808c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"kjp",	HB_TAG('K','J','P',' ')},	/* Pwo Eastern Karen */
4098a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"kk",	HB_TAG('K','A','Z',' ')},	/* Kazakh */
4108a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"kl",	HB_TAG('G','R','N',' ')},	/* Kalaallisut */
4118a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"kln",	HB_TAG('K','A','L',' ')},	/* Kalenjin */
4128a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"km",	HB_TAG('K','H','M',' ')},	/* Central Khmer */
41308c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"kmb",	HB_TAG('M','B','N',' ')},	/* Kimbundu */
4148a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"kmw",	HB_TAG('K','M','O',' ')},	/* Komo (Democratic Republic of Congo) */
4158a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"kn",	HB_TAG('K','A','N',' ')},	/* Kannada */
41608c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"knn",	HB_TAG('K','O','K',' ')},	/* Konkani */
4178a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"ko",	HB_TAG('K','O','R',' ')},	/* Korean */
4188a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"koi",	HB_TAG('K','O','P',' ')},	/* Komi-Permyak */
41908c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"kok",	HB_TAG('K','O','K',' ')},	/* Konkani [macrolanguage] */
42008c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"kpe",	HB_TAG('K','P','L',' ')},	/* Kpelle [macrolanguage] */
4218a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"kpv",	HB_TAG('K','O','Z',' ')},	/* Komi-Zyrian */
4228a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"kpy",	HB_TAG('K','Y','K',' ')},	/* Koryak */
4238a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"kqy",	HB_TAG('K','R','T',' ')},	/* Koorete */
42408c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"kr",	HB_TAG('K','N','R',' ')},	/* Kanuri [macrolanguage] */
4258a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"kri",	HB_TAG('K','R','I',' ')},	/* Krio */
4268a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"krl",	HB_TAG('K','R','L',' ')},	/* Karelian */
4278a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"kru",	HB_TAG('K','U','U',' ')},	/* Kurukh */
4288a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"ks",	HB_TAG('K','S','H',' ')},	/* Kashmiri */
42908c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"ksh",	HB_TAG('K','S','H',' ')},	/* Kölsch */
430205bf834d80f81471f0c3da4f400e60ce3a533dcBehdad Esfahbod/*{"ksw",	HB_TAG('K','R','N',' ')},*/	/* S'gaw Karen (Microsoft fonts?) */
431205bf834d80f81471f0c3da4f400e60ce3a533dcBehdad Esfahbod  {"ksw",	HB_TAG('K','S','W',' ')},	/* S'gaw Karen (OpenType spec and SIL fonts) */
43208c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"ku",	HB_TAG('K','U','R',' ')},	/* Kurdish [macrolanguage] */
4338a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"kum",	HB_TAG('K','U','M',' ')},	/* Kumyk */
43408c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"kv",	HB_TAG('K','O','M',' ')},	/* Komi [macrolanguage] */
4358a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"kvd",	HB_TAG('K','U','I',' ')},	/* Kui (Indonesia) */
43608c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"kw",	HB_TAG('C','O','R',' ')},	/* Cornish */
437ba2d543004573e8e4e56df70b7fe2a66a42bc83fBehdad Esfahbod  {"kxc",	HB_TAG('K','M','S',' ')},	/* Komso */
4388a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"kxu",	HB_TAG('K','U','I',' ')},	/* Kui (India) */
43908c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"ky",	HB_TAG('K','I','R',' ')},	/* Kirghiz/Kyrgyz */
44008c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"kyu",	HB_TAG('K','Y','U',' ')},	/* Western Kayah */
4418a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"la",	HB_TAG('L','A','T',' ')},	/* Latin */
4428a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"lad",	HB_TAG('J','U','D',' ')},	/* Ladino */
4438a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"lb",	HB_TAG('L','T','Z',' ')},	/* Luxembourgish */
4448a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"lbe",	HB_TAG('L','A','K',' ')},	/* Lak */
4458a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"lbj",	HB_TAG('L','D','K',' ')},	/* Ladakhi */
446ba2d543004573e8e4e56df70b7fe2a66a42bc83fBehdad Esfahbod  {"lez",	HB_TAG('L','E','Z',' ')},	/* Lezgi */
44708c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"lg",	HB_TAG('L','U','G',' ')},	/* Ganda */
44808c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"li",	HB_TAG('L','I','M',' ')},	/* Limburgan/Limburger/Limburgish */
4498a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"lif",	HB_TAG('L','M','B',' ')},	/* Limbu */
45008c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"lij",	HB_TAG('L','I','J',' ')},	/* Ligurian */
45108c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"lis",	HB_TAG('L','I','S',' ')},	/* Lisu */
45208c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"ljp",	HB_TAG('L','J','P',' ')},	/* Lampung Api */
45308c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"lki",	HB_TAG('L','K','I',' ')},	/* Laki */
4548a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"lld",	HB_TAG('L','A','D',' ')},	/* Ladin */
455ba2d543004573e8e4e56df70b7fe2a66a42bc83fBehdad Esfahbod  {"lmn",	HB_TAG('L','A','M',' ')},	/* Lambani */
45608c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"lmo",	HB_TAG('L','M','O',' ')},	/* Lombard */
4578a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"ln",	HB_TAG('L','I','N',' ')},	/* Lingala */
4588a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"lo",	HB_TAG('L','A','O',' ')},	/* Lao */
45908c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"lrc",	HB_TAG('L','R','C',' ')},	/* Northern Luri */
4608a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"lt",	HB_TAG('L','T','H',' ')},	/* Lithuanian */
461ba2d543004573e8e4e56df70b7fe2a66a42bc83fBehdad Esfahbod  {"lu",	HB_TAG('L','U','B',' ')},	/* Luba-Katanga */
462ba2d543004573e8e4e56df70b7fe2a66a42bc83fBehdad Esfahbod  {"lua",	HB_TAG('L','U','B',' ')},	/* Luba-Kasai */
4638a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"luo",	HB_TAG('L','U','O',' ')},	/* Luo (Kenya and Tanzania) */
464ba2d543004573e8e4e56df70b7fe2a66a42bc83fBehdad Esfahbod  {"lus",	HB_TAG('M','I','Z',' ')},	/* Mizo */
46508c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"luy",	HB_TAG('L','U','H',' ')},	/* Luyia/Oluluyia [macrolanguage] */
46608c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"luz",	HB_TAG('L','R','C',' ')},	/* Southern Luri */
4678a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"lv",	HB_TAG('L','V','I',' ')},	/* Latvian */
4688a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"lzz",	HB_TAG('L','A','Z',' ')},	/* Laz */
46908c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"mad",	HB_TAG('M','A','D',' ')},	/* Madurese */
47008c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"mag",	HB_TAG('M','A','G',' ')},	/* Magahi */
4718a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"mai",	HB_TAG('M','T','H',' ')},	/* Maithili */
47208c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"mak",	HB_TAG('M','K','R',' ')},	/* Makasar */
47308c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"man",	HB_TAG('M','N','K',' ')},	/* Manding/Mandingo [macrolanguage] */
4748a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"mdc",	HB_TAG('M','L','E',' ')},	/* Male (Papua New Guinea) */
4758a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"mdf",	HB_TAG('M','O','K',' ')},	/* Moksha */
47608c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"mdr",	HB_TAG('M','D','R',' ')},	/* Mandar */
4778a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"mdy",	HB_TAG('M','L','E',' ')},	/* Male (Ethiopia) */
4788a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"men",	HB_TAG('M','D','E',' ')},	/* Mende (Sierra Leone) */
47908c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"mer",	HB_TAG('M','E','R',' ')},	/* Meru */
48008c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"mfe",	HB_TAG('M','F','E',' ')},	/* Morisyen */
48108c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"mg",	HB_TAG('M','L','G',' ')},	/* Malagasy [macrolanguage] */
48208c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"mh",	HB_TAG('M','A','H',' ')},	/* Marshallese */
483ba2d543004573e8e4e56df70b7fe2a66a42bc83fBehdad Esfahbod  {"mhr",	HB_TAG('L','M','A',' ')},	/* Low Mari */
4848a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"mi",	HB_TAG('M','R','I',' ')},	/* Maori */
48508c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"min",	HB_TAG('M','I','N',' ')},	/* Minangkabau */
4868a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"mk",	HB_TAG('M','K','D',' ')},	/* Macedonian */
48708c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"mku",	HB_TAG('M','N','K',' ')},	/* Konyanka Maninka */
48808c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"mkw",	HB_TAG('M','K','W',' ')},	/* Kituba (Congo) */
4898a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"ml",	HB_TAG('M','L','R',' ')},	/* Malayalam */
49008c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"mlq",	HB_TAG('M','N','K',' ')},	/* Western Maninkakan */
49108c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"mn",	HB_TAG('M','N','G',' ')},	/* Mongolian [macrolanguage] */
4928a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"mnc",	HB_TAG('M','C','H',' ')},	/* Manchu */
4938a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"mni",	HB_TAG('M','N','I',' ')},	/* Manipuri */
4948a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"mnk",	HB_TAG('M','N','D',' ')},	/* Mandinka */
4958a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"mns",	HB_TAG('M','A','N',' ')},	/* Mansi */
4968a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"mnw",	HB_TAG('M','O','N',' ')},	/* Mon */
4978a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"mo",	HB_TAG('M','O','L',' ')},	/* Moldavian */
4988a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"moh",	HB_TAG('M','O','H',' ')},	/* Mohawk */
49908c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"mos",	HB_TAG('M','O','S',' ')},	/* Mossi */
5008a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"mpe",	HB_TAG('M','A','J',' ')},	/* Majang */
5018a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"mr",	HB_TAG('M','A','R',' ')},	/* Marathi */
502ba2d543004573e8e4e56df70b7fe2a66a42bc83fBehdad Esfahbod  {"mrj",	HB_TAG('H','M','A',' ')},	/* High Mari */
50308c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"ms",	HB_TAG('M','L','Y',' ')},	/* Malay [macrolanguage] */
50408c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"msc",	HB_TAG('M','N','K',' ')},	/* Sankaran Maninka */
5058a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"mt",	HB_TAG('M','T','S',' ')},	/* Maltese */
50608c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"mtr",	HB_TAG('M','A','W',' ')},	/* Mewari */
50708c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"mus",	HB_TAG('M','U','S',' ')},	/* Creek */
50808c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"mve",	HB_TAG('M','A','W',' ')},	/* Marwari (Pakistan) */
50908c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"mwk",	HB_TAG('M','N','K',' ')},	/* Kita Maninkakan */
51008c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"mwl",	HB_TAG('M','W','L',' ')},	/* Mirandese */
51108c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"mwr",	HB_TAG('M','A','W',' ')},	/* Marwari [macrolanguage] */
51208c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"mww",	HB_TAG('M','W','W',' ')},	/* Hmong Daw */
5138a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"my",	HB_TAG('B','R','M',' ')},	/* Burmese */
5148a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"mym",	HB_TAG('M','E','N',' ')},	/* Me'en */
51508c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"myq",	HB_TAG('M','N','K',' ')},	/* Forest Maninka (retired code) */
5168a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"myv",	HB_TAG('E','R','Z',' ')},	/* Erzya */
51708c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"mzn",	HB_TAG('M','Z','N',' ')},	/* Mazanderani */
51808c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"na",	HB_TAG('N','A','U',' ')},	/* Nauru */
519ba2d543004573e8e4e56df70b7fe2a66a42bc83fBehdad Esfahbod  {"nag",	HB_TAG('N','A','G',' ')},	/* Naga-Assamese */
52008c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"nah",	HB_TAG('N','A','H',' ')},	/* Nahuatl [family] */
52108c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"nap",	HB_TAG('N','A','P',' ')},	/* Neapolitan */
5228a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"nb",	HB_TAG('N','O','R',' ')},	/* Norwegian Bokmål */
5238a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"nco",	HB_TAG('S','I','B',' ')},	/* Sibe */
524ba2d543004573e8e4e56df70b7fe2a66a42bc83fBehdad Esfahbod  {"nd",	HB_TAG('N','D','B',' ')},	/* [North] Ndebele */
52508c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"ndc",	HB_TAG('N','D','C',' ')},	/* Ndau */
52608c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"nds",	HB_TAG('N','D','S',' ')},	/* Low German/Low Saxon */
5278a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"ne",	HB_TAG('N','E','P',' ')},	/* Nepali */
5288a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"new",	HB_TAG('N','E','W',' ')},	/* Newari */
5298a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"ng",	HB_TAG('N','D','G',' ')},	/* Ndonga */
53008c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"nga",	HB_TAG('N','G','A',' ')},	/* Ngabaka */
5318a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"ngl",	HB_TAG('L','M','W',' ')},	/* Lomwe */
5328a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"niu",	HB_TAG('N','I','U',' ')},	/* Niuean */
5338a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"niv",	HB_TAG('G','I','L',' ')},	/* Gilyak */
5348a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"nl",	HB_TAG('N','L','D',' ')},	/* Dutch */
5358a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"nn",	HB_TAG('N','Y','N',' ')},	/* Norwegian Nynorsk */
53608c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"no",	HB_TAG('N','O','R',' ')},	/* Norwegian [macrolanguage] */
53708c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"nod",	HB_TAG('N','T','A',' ')},	/* Northern Thai */
53808c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"noe",	HB_TAG('N','O','E',' ')},	/* Nimadi */
5398a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"nog",	HB_TAG('N','O','G',' ')},	/* Nogai */
54008c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"nov",	HB_TAG('N','O','V',' ')},	/* Novial */
5418a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"nqo",	HB_TAG('N','K','O',' ')},	/* N'Ko */
542ba2d543004573e8e4e56df70b7fe2a66a42bc83fBehdad Esfahbod  {"nr",	HB_TAG('N','D','B',' ')},	/* [South] Ndebele */
5438a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"nsk",	HB_TAG('N','A','S',' ')},	/* Naskapi */
544ba2d543004573e8e4e56df70b7fe2a66a42bc83fBehdad Esfahbod  {"nso",	HB_TAG('S','O','T',' ')},	/* [Northern] Sotho */
54508c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"ny",	HB_TAG('C','H','I',' ')},	/* Chewa/Chichwa/Nyanja */
54608c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"nym",	HB_TAG('N','Y','M',' ')},	/* Nyamwezi */
54708c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"nyn",	HB_TAG('N','K','L',' ')},	/* Nyankole */
5488a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"oc",	HB_TAG('O','C','I',' ')},	/* Occitan (post 1500) */
54908c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"oj",	HB_TAG('O','J','B',' ')},	/* Ojibwa [macrolanguage] */
550ba2d543004573e8e4e56df70b7fe2a66a42bc83fBehdad Esfahbod  {"ojs",	HB_TAG('O','C','R',' ')},	/* Oji-Cree */
55108c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"om",	HB_TAG('O','R','O',' ')},	/* Oromo [macrolanguage] */
5528a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"or",	HB_TAG('O','R','I',' ')},	/* Oriya */
5538a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"os",	HB_TAG('O','S','S',' ')},	/* Ossetian */
5548a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"pa",	HB_TAG('P','A','N',' ')},	/* Panjabi */
55508c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"pag",	HB_TAG('P','A','G',' ')},	/* Pangasinan */
55608c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"pam",	HB_TAG('P','A','M',' ')},	/* Kapampangan/Pampanga */
55708c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"pap",	HB_TAG('P','A','P',' ')},	/* Papiamento */
55808c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"pcc",	HB_TAG('P','C','C',' ')},	/* Bouyei */
55908c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"pcd",	HB_TAG('P','C','D',' ')},	/* Picard */
560ba2d543004573e8e4e56df70b7fe2a66a42bc83fBehdad Esfahbod  {"pce",	HB_TAG('P','L','G',' ')},	/* [Ruching] Palaung */
56108c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"pdc",	HB_TAG('P','D','C',' ')},	/* Pennsylvania German */
56208c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"pes",	HB_TAG('F','A','R',' ')},	/* Iranian Persian */
56308c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"phk",	HB_TAG('P','H','K',' ')},	/* Phake */
5648a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"pi",	HB_TAG('P','A','L',' ')},	/* Pali */
56508c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"pih",	HB_TAG('P','I','H',' ')},	/* Pitcairn-Norfolk */
5668a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"pl",	HB_TAG('P','L','K',' ')},	/* Polish */
567ba2d543004573e8e4e56df70b7fe2a66a42bc83fBehdad Esfahbod  {"pll",	HB_TAG('P','L','G',' ')},	/* [Shwe] Palaung */
5688a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"plp",	HB_TAG('P','A','P',' ')},	/* Palpa */
56908c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"pms",	HB_TAG('P','M','S',' ')},	/* Piemontese */
57008c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"pnb",	HB_TAG('P','N','B',' ')},	/* Western Panjabi */
57108c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"prs",	HB_TAG('D','R','I',' ')},	/* Afghan Persian/Dari */
57208c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"ps",	HB_TAG('P','A','S',' ')},	/* Pashto/Pushto [macrolanguage] */
5738a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"pt",	HB_TAG('P','T','G',' ')},	/* Portuguese */
57408c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"pwo",	HB_TAG('P','W','O',' ')},	/* Pwo Western Karen */
57508c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"qu",	HB_TAG('Q','U','Z',' ')},	/* Quechua [macrolanguage] */
57608c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"quc",	HB_TAG('Q','U','C',' ')},	/* K'iche'/Quiché */
57708c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"quz",	HB_TAG('Q','U','Z',' ')},	/* Cusco Quechua */
57808c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"raj",	HB_TAG('R','A','J',' ')},	/* Rajasthani [macrolanguage] */
57908c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"rbb",	HB_TAG('P','L','G',' ')},	/* Rumai Palaung */
58008c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"rej",	HB_TAG('R','E','J',' ')},	/* Rejang */
5818a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"ria",	HB_TAG('R','I','A',' ')},	/* Riang (India) */
5828a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"ril",	HB_TAG('R','I','A',' ')},	/* Riang (Myanmar) */
58308c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"rki",	HB_TAG('A','R','K',' ')},	/* Rakhine */
58408c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"rm",	HB_TAG('R','M','S',' ')},	/* Romansh */
58508c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"rmy",	HB_TAG('R','M','Y',' ')},	/* Vlax Romani */
58608c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"rn",	HB_TAG('R','U','N',' ')},	/* Rundi */
5878a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"ro",	HB_TAG('R','O','M',' ')},	/* Romanian */
58808c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"rom",	HB_TAG('R','O','Y',' ')},	/* Romany [macrolanguage] */
5898a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"ru",	HB_TAG('R','U','S',' ')},	/* Russian */
5908a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"rue",	HB_TAG('R','S','Y',' ')},	/* Rusyn */
59108c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"rup",	HB_TAG('R','U','P',' ')},	/* Aromanian/Arumanian/Macedo-Romanian */
59208c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"rw",	HB_TAG('R','U','A',' ')},	/* Kinyarwanda */
59308c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"rwr",	HB_TAG('M','A','W',' ')},	/* Marwari (India) */
5948a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"sa",	HB_TAG('S','A','N',' ')},	/* Sanskrit */
5958a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"sah",	HB_TAG('Y','A','K',' ')},	/* Yakut */
59608c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"sas",	HB_TAG('S','A','S',' ')},	/* Sasak */
5978a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"sat",	HB_TAG('S','A','T',' ')},	/* Santali */
5988a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"sck",	HB_TAG('S','A','D',' ')},	/* Sadri */
59908c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"sc",	HB_TAG('S','R','D',' ')},	/* Sardinian [macrolanguage] */
60008c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"scn",	HB_TAG('S','C','N',' ')},	/* Sicilian */
60108c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"sco",	HB_TAG('S','C','O',' ')},	/* Scots */
602ba2d543004573e8e4e56df70b7fe2a66a42bc83fBehdad Esfahbod  {"scs",	HB_TAG('S','L','A',' ')},	/* [North] Slavey */
6038a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"sd",	HB_TAG('S','N','D',' ')},	/* Sindhi */
6048a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"se",	HB_TAG('N','S','M',' ')},	/* Northern Sami */
6058a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"seh",	HB_TAG('S','N','A',' ')},	/* Sena */
6068a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"sel",	HB_TAG('S','E','L',' ')},	/* Selkup */
6078a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"sg",	HB_TAG('S','G','O',' ')},	/* Sango */
60808c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"sga",	HB_TAG('S','G','A',' ')},	/* Old Irish (to 900) */
60908c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"sgs",	HB_TAG('S','G','S',' ')},	/* Samogitian */
61008c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"sgw",	HB_TAG('C','H','G',' ')},	/* Sebat Bet Gurage */
61108c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader/*{"sgw",	HB_TAG('S','G','W',' ')},*/	/* Sebat Bet Gurage (in SIL fonts) */
6128a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"shn",	HB_TAG('S','H','N',' ')},	/* Shan */
6138a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"si",	HB_TAG('S','N','H',' ')},	/* Sinhala */
6148a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"sid",	HB_TAG('S','I','D',' ')},	/* Sidamo */
6158a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"sjd",	HB_TAG('K','S','M',' ')},	/* Kildin Sami */
6168a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"sk",	HB_TAG('S','K','Y',' ')},	/* Slovak */
6178a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"skr",	HB_TAG('S','R','K',' ')},	/* Seraiki */
6188a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"sl",	HB_TAG('S','L','V',' ')},	/* Slovenian */
6198a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"sm",	HB_TAG('S','M','O',' ')},	/* Samoan */
6208a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"sma",	HB_TAG('S','S','M',' ')},	/* Southern Sami */
6218a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"smj",	HB_TAG('L','S','M',' ')},	/* Lule Sami */
6228a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"smn",	HB_TAG('I','S','M',' ')},	/* Inari Sami */
6238a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"sms",	HB_TAG('S','K','S',' ')},	/* Skolt Sami */
62408c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"sn",	HB_TAG('S','N','A',' ')},	/* Shona */
6258a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"snk",	HB_TAG('S','N','K',' ')},	/* Soninke */
6268a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"so",	HB_TAG('S','M','L',' ')},	/* Somali */
62708c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"sop",	HB_TAG('S','O','P',' ')},	/* Songe */
62808c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"sq",	HB_TAG('S','Q','I',' ')},	/* Albanian [macrolanguage] */
6298a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"sr",	HB_TAG('S','R','B',' ')},	/* Serbian */
6308a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"srr",	HB_TAG('S','R','R',' ')},	/* Serer */
63108c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"ss",	HB_TAG('S','W','Z',' ')},	/* Swati */
632ba2d543004573e8e4e56df70b7fe2a66a42bc83fBehdad Esfahbod  {"st",	HB_TAG('S','O','T',' ')},	/* [Southern] Sotho */
63308c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"stq",	HB_TAG('S','T','Q',' ')},	/* Saterfriesisch */
63408c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"stv",	HB_TAG('S','I','G',' ')},	/* Silt'e */
63508c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"su",	HB_TAG('S','U','N',' ')},	/* Sundanese */
63608c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"suk",	HB_TAG('S','U','K',' ')},	/* Sukama */
6378a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"suq",	HB_TAG('S','U','R',' ')},	/* Suri */
6388a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"sv",	HB_TAG('S','V','E',' ')},	/* Swedish */
6398a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"sva",	HB_TAG('S','V','A',' ')},	/* Svan */
64008c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"sw",	HB_TAG('S','W','K',' ')},	/* Swahili [macrolanguage] */
6418a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"swb",	HB_TAG('C','M','R',' ')},	/* Comorian */
64208c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"swh",	HB_TAG('S','W','K',' ')},	/* Kiswahili/Swahili */
64308c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"swv",	HB_TAG('M','A','W',' ')},	/* Shekhawati */
64408c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"sxu",	HB_TAG('S','X','U',' ')},	/* Upper Saxon */
64508c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"syl",	HB_TAG('S','Y','L',' ')},	/* Sylheti */
64608c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"syr",	HB_TAG('S','Y','R',' ')},	/* Syriac [macrolanguage] */
64708c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"szl",	HB_TAG('S','Z','L',' ')},	/* Silesian */
6488a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"ta",	HB_TAG('T','A','M',' ')},	/* Tamil */
649ba2d543004573e8e4e56df70b7fe2a66a42bc83fBehdad Esfahbod  {"tab",	HB_TAG('T','A','B',' ')},	/* Tabasaran */
6508a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"tcy",	HB_TAG('T','U','L',' ')},	/* Tulu */
65108c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"tdd",	HB_TAG('T','D','D',' ')},	/* Tai Nüa */
6528a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"te",	HB_TAG('T','E','L',' ')},	/* Telugu */
653ba2d543004573e8e4e56df70b7fe2a66a42bc83fBehdad Esfahbod  {"tem",	HB_TAG('T','M','N',' ')},	/* Temne */
65408c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"tet",	HB_TAG('T','E','T',' ')},	/* Tetum */
6558a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"tg",	HB_TAG('T','A','J',' ')},	/* Tajik */
6568a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"th",	HB_TAG('T','H','A',' ')},	/* Thai */
6578a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"ti",	HB_TAG('T','G','Y',' ')},	/* Tigrinya */
6588a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"tig",	HB_TAG('T','G','R',' ')},	/* Tigre */
65908c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"tiv",	HB_TAG('T','I','V',' ')},	/* Tiv */
6608a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"tk",	HB_TAG('T','K','M',' ')},	/* Turkmen */
66108c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"tl",	HB_TAG('T','G','L',' ')},	/* Tagalog */
66208c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"tmh",	HB_TAG('t','m','h',' ')},	/* Tamashek [macrolanguage] */
6638a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"tn",	HB_TAG('T','N','A',' ')},	/* Tswana */
664ba2d543004573e8e4e56df70b7fe2a66a42bc83fBehdad Esfahbod  {"to",	HB_TAG('T','G','N',' ')},	/* Tonga (Tonga Islands) */
66508c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"tpi",	HB_TAG('T','P','I',' ')},	/* Tok Pisin */
6668a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"tr",	HB_TAG('T','R','K',' ')},	/* Turkish */
667ba2d543004573e8e4e56df70b7fe2a66a42bc83fBehdad Esfahbod  {"tru",	HB_TAG('T','U','A',' ')},	/* Turoyo Aramaic */
6688a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"ts",	HB_TAG('T','S','G',' ')},	/* Tsonga */
6698a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"tt",	HB_TAG('T','A','T',' ')},	/* Tatar */
67008c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"tum",	HB_TAG('T','U','M',' ')},	/* Tumbuka */
6718a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"tw",	HB_TAG('T','W','I',' ')},	/* Twi */
6728a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"ty",	HB_TAG('T','H','T',' ')},	/* Tahitian */
673ba2d543004573e8e4e56df70b7fe2a66a42bc83fBehdad Esfahbod  {"tyv",	HB_TAG('T','U','V',' ')},	/* Tuvin */
67408c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"tyz",	HB_TAG('T','Y','Z',' ')},	/* Tày */
67508c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"tzm",	HB_TAG('T','Z','M',' ')},	/* Central Atlas Tamazight */
6768a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"udm",	HB_TAG('U','D','M',' ')},	/* Udmurt */
6778a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"ug",	HB_TAG('U','Y','G',' ')},	/* Uighur */
6788a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"uk",	HB_TAG('U','K','R',' ')},	/* Ukrainian */
67908c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"umb",	HB_TAG('U','M','B',' ')},	/* Umbundu */
6808a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"unr",	HB_TAG('M','U','N',' ')},	/* Mundari */
6818a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"ur",	HB_TAG('U','R','D',' ')},	/* Urdu */
68208c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"uz",	HB_TAG('U','Z','B',' ')},	/* Uzbek [macrolanguage] */
68308c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"uzn",	HB_TAG('U','Z','B',' ')},	/* Northern Uzbek */
68408c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"uzs",	HB_TAG('U','Z','B',' ')},	/* Southern Uzbek */
6858a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"ve",	HB_TAG('V','E','N',' ')},	/* Venda */
68608c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"vec",	HB_TAG('V','E','C',' ')},	/* Venetian */
68708c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"vls",	HB_TAG('F','L','E',' ')},	/* Vlaams */
6888a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"vi",	HB_TAG('V','I','T',' ')},	/* Vietnamese */
68908c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"vmw",	HB_TAG('M','A','K',' ')},	/* Makhuwa */
69008c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"vo",	HB_TAG('V','O','L',' ')},	/* Volapük */
69108c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"vro",	HB_TAG('V','R','O',' ')},	/* Võro */
69208c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"wa",	HB_TAG('W','L','N',' ')},	/* Walloon */
69308c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"war",	HB_TAG('W','A','R',' ')},	/* Waray (Philippines) */
6948a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"wbm",	HB_TAG('W','A',' ',' ')},	/* Wa */
6958a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"wbr",	HB_TAG('W','A','G',' ')},	/* Wagdi */
69608c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"wle",	HB_TAG('S','I','G',' ')},	/* Wolane */
69708c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"wry",	HB_TAG('M','A','W',' ')},	/* Merwari */
69808c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"wtm",	HB_TAG('W','T','M',' ')},	/* Mewati */
6998a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"wo",	HB_TAG('W','L','F',' ')},	/* Wolof */
7008a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"xal",	HB_TAG('K','L','M',' ')},	/* Kalmyk */
7018a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"xh",	HB_TAG('X','H','S',' ')},	/* Xhosa */
70208c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"xog",	HB_TAG('X','O','G',' ')},	/* Soga */
7038a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"xom",	HB_TAG('K','M','O',' ')},	/* Komo (Sudan) */
7048a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"xsl",	HB_TAG('S','S','L',' ')},	/* South Slavey */
70508c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"xst",	HB_TAG('S','I','G',' ')},	/* Silt'e (retired code) */
70608c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"xwo",	HB_TAG('T','O','D',' ')},	/* Written Oirat (Todo) */
70708c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"yao",	HB_TAG('Y','A','O',' ')},	/* Yao */
70808c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"yi",	HB_TAG('J','I','I',' ')},	/* Yiddish [macrolanguage] */
7098a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"yo",	HB_TAG('Y','B','A',' ')},	/* Yoruba */
7108a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"yso",	HB_TAG('N','I','S',' ')},	/* Nisi (China) */
71108c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"za",	HB_TAG('Z','H','A',' ')},	/* Chuang/Zhuang [macrolanguage] */
71208c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"zea",	HB_TAG('Z','E','A',' ')},	/* Zeeuws */
7138a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  {"zne",	HB_TAG('Z','N','D',' ')},	/* Zande */
71408c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"zu",	HB_TAG('Z','U','L',' ')}, 	/* Zulu */
71508c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader  {"zum",	HB_TAG('L','R','C',' ')}	/* Kumzari */
7168a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod
717ba2d543004573e8e4e56df70b7fe2a66a42bc83fBehdad Esfahbod  /* The corresponding languages IDs for the following IDs are unclear,
718ba2d543004573e8e4e56df70b7fe2a66a42bc83fBehdad Esfahbod   * overlap, or are architecturally weird. Needs more research. */
719ba2d543004573e8e4e56df70b7fe2a66a42bc83fBehdad Esfahbod
720ba2d543004573e8e4e56df70b7fe2a66a42bc83fBehdad Esfahbod/*{"ahg/awn/xan?",	HB_TAG('A','G','W',' ')},*/	/* Agaw */
721ba2d543004573e8e4e56df70b7fe2a66a42bc83fBehdad Esfahbod/*{"gsw?/gsw-FR?",	HB_TAG('A','L','S',' ')},*/	/* Alsatian */
722ba2d543004573e8e4e56df70b7fe2a66a42bc83fBehdad Esfahbod/*{"krc",	HB_TAG('B','A','L',' ')},*/	/* Balkar */
7238a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod/*{"??",	HB_TAG('B','C','R',' ')},*/	/* Bible Cree */
72408c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader/*{"zh?",	HB_TAG('C','H','N',' ')},*/	/* Chinese (seen in Microsoft fonts) */
725ba2d543004573e8e4e56df70b7fe2a66a42bc83fBehdad Esfahbod/*{"acf/gcf?",	HB_TAG('F','A','N',' ')},*/	/* French Antillean */
726ba2d543004573e8e4e56df70b7fe2a66a42bc83fBehdad Esfahbod/*{"enf?/yrk?",	HB_TAG('F','N','E',' ')},*/	/* Forest Nenets */
727ba2d543004573e8e4e56df70b7fe2a66a42bc83fBehdad Esfahbod/*{"fuf?",	HB_TAG('F','T','A',' ')},*/	/* Futa */
728ba2d543004573e8e4e56df70b7fe2a66a42bc83fBehdad Esfahbod/*{"ar-Syrc?",	HB_TAG('G','A','R',' ')},*/	/* Garshuni */
729ba2d543004573e8e4e56df70b7fe2a66a42bc83fBehdad Esfahbod/*{"cfm/rnl?",	HB_TAG('H','A','L',' ')},*/	/* Halam */
73008c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader/*{"fonipa",	HB_TAG('I','P','P','H')},*/	/* Phonetic transcription—IPA conventions */
731ba2d543004573e8e4e56df70b7fe2a66a42bc83fBehdad Esfahbod/*{"ga-Latg?/Latg?",	HB_TAG('I','R','T',' ')},*/	/* Irish Traditional */
732ba2d543004573e8e4e56df70b7fe2a66a42bc83fBehdad Esfahbod/*{"krc",	HB_TAG('K','A','R',' ')},*/	/* Karachay */
733ba2d543004573e8e4e56df70b7fe2a66a42bc83fBehdad Esfahbod/*{"alw?/ktb?",	HB_TAG('K','E','B',' ')},*/	/* Kebena */
734ba2d543004573e8e4e56df70b7fe2a66a42bc83fBehdad Esfahbod/*{"Geok",	HB_TAG('K','G','E',' ')},*/	/* Khutsuri Georgian */
735ba2d543004573e8e4e56df70b7fe2a66a42bc83fBehdad Esfahbod/*{"kca",	HB_TAG('K','H','K',' ')},*/	/* Khanty-Kazim */
736ba2d543004573e8e4e56df70b7fe2a66a42bc83fBehdad Esfahbod/*{"kca",	HB_TAG('K','H','S',' ')},*/	/* Khanty-Shurishkar */
737ba2d543004573e8e4e56df70b7fe2a66a42bc83fBehdad Esfahbod/*{"kca",	HB_TAG('K','H','V',' ')},*/	/* Khanty-Vakhi */
738ba2d543004573e8e4e56df70b7fe2a66a42bc83fBehdad Esfahbod/*{"guz?/kqs?/kss?",	HB_TAG('K','I','S',' ')},*/	/* Kisii */
739ba2d543004573e8e4e56df70b7fe2a66a42bc83fBehdad Esfahbod/*{"kfa/kfi?/kpb?/xua?/xuj?",	HB_TAG('K','O','D',' ')},*/	/* Kodagu */
740ba2d543004573e8e4e56df70b7fe2a66a42bc83fBehdad Esfahbod/*{"okm?/oko?",	HB_TAG('K','O','H',' ')},*/	/* Korean Old Hangul */
741ba2d543004573e8e4e56df70b7fe2a66a42bc83fBehdad Esfahbod/*{"kon?/ktu?/...",	HB_TAG('K','O','N',' ')},*/	/* Kikongo */
742ba2d543004573e8e4e56df70b7fe2a66a42bc83fBehdad Esfahbod/*{"kfx?",	HB_TAG('K','U','L',' ')},*/	/* Kulvi */
7438a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod/*{"??",	HB_TAG('L','A','H',' ')},*/	/* Lahuli */
7448a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod/*{"??",	HB_TAG('L','C','R',' ')},*/	/* L-Cree */
7458a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod/*{"??",	HB_TAG('M','A','L',' ')},*/	/* Malayalam Traditional */
746ba2d543004573e8e4e56df70b7fe2a66a42bc83fBehdad Esfahbod/*{"mnk?/mlq?/...",	HB_TAG('M','L','N',' ')},*/	/* Malinke */
7478a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod/*{"??",	HB_TAG('N','C','R',' ')},*/	/* N-Cree */
7488a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod/*{"??",	HB_TAG('N','H','C',' ')},*/	/* Norway House Cree */
749ba2d543004573e8e4e56df70b7fe2a66a42bc83fBehdad Esfahbod/*{"jpa?/sam?",	HB_TAG('P','A','A',' ')},*/	/* Palestinian Aramaic */
750ba2d543004573e8e4e56df70b7fe2a66a42bc83fBehdad Esfahbod/*{"polyton",	HB_TAG('P','G','R',' ')},*/	/* Polytonic Greek */
751aba38173c6b464c2884b73ef6cd4577d4efcebbcBehdad Esfahbod/*{"??",	HB_TAG('Q','I','N',' ')},*/	/* Asho Chin */
7528a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod/*{"??",	HB_TAG('R','C','R',' ')},*/	/* R-Cree */
753ba2d543004573e8e4e56df70b7fe2a66a42bc83fBehdad Esfahbod/*{"chp?",	HB_TAG('S','A','Y',' ')},*/	/* Sayisi */
754ba2d543004573e8e4e56df70b7fe2a66a42bc83fBehdad Esfahbod/*{"xan?",	HB_TAG('S','E','K',' ')},*/	/* Sekota */
755ba2d543004573e8e4e56df70b7fe2a66a42bc83fBehdad Esfahbod/*{"ngo?",	HB_TAG('S','X','T',' ')},*/	/* Sutu */
7568a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod/*{"??",	HB_TAG('T','C','R',' ')},*/	/* TH-Cree */
757ba2d543004573e8e4e56df70b7fe2a66a42bc83fBehdad Esfahbod/*{"tnz?/tog?/toi?",	HB_TAG('T','N','G',' ')},*/	/* Tonga */
758ba2d543004573e8e4e56df70b7fe2a66a42bc83fBehdad Esfahbod/*{"enh?/yrk?",	HB_TAG('T','N','E',' ')},*/	/* Tundra Nenets */
7598a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod/*{"??",	HB_TAG('W','C','R',' ')},*/	/* West-Cree */
76008c2d27d35093e07142168665139274ac99395e8Roozbeh Pournader/*{"cre?",	HB_TAG('Y','C','R',' ')},*/	/* Y-Cree */
7618a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod/*{"??",	HB_TAG('Y','I','C',' ')},*/	/* Yi Classic */
762ba2d543004573e8e4e56df70b7fe2a66a42bc83fBehdad Esfahbod/*{"ii?/Yiii?",	HB_TAG('Y','I','M',' ')},*/	/* Yi Modern */
7638a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod/*{"??",	HB_TAG('Z','H','P',' ')},*/	/* Chinese Phonetic */
7648a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod};
7658a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod
766ee5350d667f3a9644667202597694581f2cf657dBehdad Esfahbodtypedef struct {
767ee5350d667f3a9644667202597694581f2cf657dBehdad Esfahbod  char language[8];
768ee5350d667f3a9644667202597694581f2cf657dBehdad Esfahbod  hb_tag_t tag;
769ee5350d667f3a9644667202597694581f2cf657dBehdad Esfahbod} LangTagLong;
770ee5350d667f3a9644667202597694581f2cf657dBehdad Esfahbodstatic const LangTagLong ot_languages_zh[] = {
77140b5c2e86c633441040196d158e965ad95d6ad37Behdad Esfahbod  {"zh-cn",	HB_TAG('Z','H','S',' ')},	/* Chinese (China) */
77240b5c2e86c633441040196d158e965ad95d6ad37Behdad Esfahbod  {"zh-hk",	HB_TAG('Z','H','H',' ')},	/* Chinese (Hong Kong) */
77340b5c2e86c633441040196d158e965ad95d6ad37Behdad Esfahbod  {"zh-mo",	HB_TAG('Z','H','T',' ')},	/* Chinese (Macao) */
77440b5c2e86c633441040196d158e965ad95d6ad37Behdad Esfahbod  {"zh-sg",	HB_TAG('Z','H','S',' ')},	/* Chinese (Singapore) */
775ee5350d667f3a9644667202597694581f2cf657dBehdad Esfahbod  {"zh-tw",	HB_TAG('Z','H','T',' ')},	/* Chinese (Taiwan) */
776ee5350d667f3a9644667202597694581f2cf657dBehdad Esfahbod  {"zh-hans",	HB_TAG('Z','H','S',' ')},	/* Chinese (Simplified) */
777ee5350d667f3a9644667202597694581f2cf657dBehdad Esfahbod  {"zh-hant",	HB_TAG('Z','H','T',' ')},	/* Chinese (Traditional) */
77840b5c2e86c633441040196d158e965ad95d6ad37Behdad Esfahbod};
77940b5c2e86c633441040196d158e965ad95d6ad37Behdad Esfahbod
7808a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbodstatic int
7818f08c3275040870a645ef034a38d30c05c619f21Behdad Esfahbodlang_compare_first_component (const char *a,
7828f08c3275040870a645ef034a38d30c05c619f21Behdad Esfahbod			      const char *b)
7838a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod{
7848a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  unsigned int da, db;
7858a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  const char *p;
7868a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod
787e3693b72f0651985d4f619cde668611639dca885Behdad Esfahbod  p = strchr (a, '-');
7888a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  da = p ? (unsigned int) (p - a) : strlen (a);
7898a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod
790e3693b72f0651985d4f619cde668611639dca885Behdad Esfahbod  p = strchr (b, '-');
7918a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  db = p ? (unsigned int) (p - b) : strlen (b);
7928a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod
7938a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  return strncmp (a, b, MAX (da, db));
7948a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod}
7958a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod
7968a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbodstatic hb_bool_t
7978a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbodlang_matches (const char *lang_str, const char *spec)
7988a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod{
7998a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  unsigned int len = strlen (spec);
8008a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod
80140b5c2e86c633441040196d158e965ad95d6ad37Behdad Esfahbod  return strncmp (lang_str, spec, len) == 0 &&
8028a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod	 (lang_str[len] == '\0' || lang_str[len] == '-');
8038a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod}
8048a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod
8058a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbodhb_tag_t
8068a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbodhb_ot_tag_from_language (hb_language_t language)
8078a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod{
80840b5c2e86c633441040196d158e965ad95d6ad37Behdad Esfahbod  const char *lang_str, *s;
8098a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod
8101a64f6e19a4b483e278c85e4941107be2f71b0a4Behdad Esfahbod  if (language == HB_LANGUAGE_INVALID)
8118a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod    return HB_OT_TAG_DEFAULT_LANGUAGE;
8128a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod
8138a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  lang_str = hb_language_to_string (language);
8148a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod
81540b5c2e86c633441040196d158e965ad95d6ad37Behdad Esfahbod  s = strstr (lang_str, "x-hbot");
81640b5c2e86c633441040196d158e965ad95d6ad37Behdad Esfahbod  if (s) {
8178a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod    char tag[4];
8188a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod    int i;
81940b5c2e86c633441040196d158e965ad95d6ad37Behdad Esfahbod    s += 6;
82040b5c2e86c633441040196d158e965ad95d6ad37Behdad Esfahbod    for (i = 0; i < 4 && ISALPHA (s[i]); i++)
82140b5c2e86c633441040196d158e965ad95d6ad37Behdad Esfahbod      tag[i] = TOUPPER (s[i]);
82240b5c2e86c633441040196d158e965ad95d6ad37Behdad Esfahbod    if (i) {
82340b5c2e86c633441040196d158e965ad95d6ad37Behdad Esfahbod      for (; i < 4; i++)
82440b5c2e86c633441040196d158e965ad95d6ad37Behdad Esfahbod	tag[i] = ' ';
82540b5c2e86c633441040196d158e965ad95d6ad37Behdad Esfahbod      return HB_TAG_CHAR4 (tag);
82640b5c2e86c633441040196d158e965ad95d6ad37Behdad Esfahbod    }
8278a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  }
8288a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod
82940b5c2e86c633441040196d158e965ad95d6ad37Behdad Esfahbod  /* Find a language matching in the first component */
830ee5350d667f3a9644667202597694581f2cf657dBehdad Esfahbod  {
831ee5350d667f3a9644667202597694581f2cf657dBehdad Esfahbod    const LangTag *lang_tag;
832ee5350d667f3a9644667202597694581f2cf657dBehdad Esfahbod    lang_tag = (LangTag *) bsearch (lang_str, ot_languages,
833ee5350d667f3a9644667202597694581f2cf657dBehdad Esfahbod				    ARRAY_LENGTH (ot_languages), sizeof (LangTag),
834ee5350d667f3a9644667202597694581f2cf657dBehdad Esfahbod				    (hb_compare_func_t) lang_compare_first_component);
835ee5350d667f3a9644667202597694581f2cf657dBehdad Esfahbod    if (lang_tag)
836ee5350d667f3a9644667202597694581f2cf657dBehdad Esfahbod      return lang_tag->tag;
837ee5350d667f3a9644667202597694581f2cf657dBehdad Esfahbod  }
8388a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod
83940b5c2e86c633441040196d158e965ad95d6ad37Behdad Esfahbod  /* Otherwise, check the Chinese ones */
84040b5c2e86c633441040196d158e965ad95d6ad37Behdad Esfahbod  if (0 == lang_compare_first_component (lang_str, "zh"))
84140b5c2e86c633441040196d158e965ad95d6ad37Behdad Esfahbod  {
84240b5c2e86c633441040196d158e965ad95d6ad37Behdad Esfahbod    unsigned int i;
8438a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod
84440b5c2e86c633441040196d158e965ad95d6ad37Behdad Esfahbod    for (i = 0; i < ARRAY_LENGTH (ot_languages_zh); i++)
8458a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod    {
846ee5350d667f3a9644667202597694581f2cf657dBehdad Esfahbod      const LangTagLong *lang_tag;
84740b5c2e86c633441040196d158e965ad95d6ad37Behdad Esfahbod      lang_tag = &ot_languages_zh[i];
848f381e320df795a9d73ac81499f8ed8c311bcb2f0Behdad Esfahbod      if (lang_matches (lang_str, lang_tag->language))
84940b5c2e86c633441040196d158e965ad95d6ad37Behdad Esfahbod	return lang_tag->tag;
8508a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod    }
8518a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod
85240b5c2e86c633441040196d158e965ad95d6ad37Behdad Esfahbod    /* Otherwise just return 'ZHS ' */
85340b5c2e86c633441040196d158e965ad95d6ad37Behdad Esfahbod    return HB_TAG('Z','H','S',' ');
8548a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  }
8558a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod
856738d096a06822e63b3894bd817ecb90e5fb94f73Behdad Esfahbod  s = strchr (lang_str, '-');
857738d096a06822e63b3894bd817ecb90e5fb94f73Behdad Esfahbod  if (!s)
858738d096a06822e63b3894bd817ecb90e5fb94f73Behdad Esfahbod    s = lang_str + strlen (lang_str);
859738d096a06822e63b3894bd817ecb90e5fb94f73Behdad Esfahbod  if (s - lang_str == 3) {
860738d096a06822e63b3894bd817ecb90e5fb94f73Behdad Esfahbod    /* Assume it's ISO-639-3 and upper-case and use it. */
8617627100f428ac0ec8509d961d368d2d25d8f0b6eBehdad Esfahbod    return hb_tag_from_string (lang_str, s - lang_str) & ~0x20202000u;
862738d096a06822e63b3894bd817ecb90e5fb94f73Behdad Esfahbod  }
863738d096a06822e63b3894bd817ecb90e5fb94f73Behdad Esfahbod
8648a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  return HB_OT_TAG_DEFAULT_LANGUAGE;
8658a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod}
8668a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod
8678a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbodhb_language_t
8688a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbodhb_ot_tag_to_language (hb_tag_t tag)
8698a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod{
8708a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  unsigned int i;
87140b5c2e86c633441040196d158e965ad95d6ad37Behdad Esfahbod
87240b5c2e86c633441040196d158e965ad95d6ad37Behdad Esfahbod  if (tag == HB_OT_TAG_DEFAULT_LANGUAGE)
87340b5c2e86c633441040196d158e965ad95d6ad37Behdad Esfahbod    return NULL;
8748a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod
8758a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod  for (i = 0; i < ARRAY_LENGTH (ot_languages); i++)
8768a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod    if (ot_languages[i].tag == tag)
8774c9fe88d30036340fe592bcbc375049b84602b8bBehdad Esfahbod      return hb_language_from_string (ot_languages[i].language, -1);
8788a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod
87940b5c2e86c633441040196d158e965ad95d6ad37Behdad Esfahbod  /* If tag starts with ZH, it's Chinese */
8807627100f428ac0ec8509d961d368d2d25d8f0b6eBehdad Esfahbod  if ((tag & 0xFFFF0000u)  == 0x5A480000u) {
88140b5c2e86c633441040196d158e965ad95d6ad37Behdad Esfahbod    switch (tag) {
8824c9fe88d30036340fe592bcbc375049b84602b8bBehdad Esfahbod      case HB_TAG('Z','H','H',' '): return hb_language_from_string ("zh-hk", -1); /* Hong Kong */
8836334495ac1ee0a86228e67794b7a41ee91146f3bBehdad Esfahbod      case HB_TAG('Z','H','S',' '): return hb_language_from_string ("zh-Hans", -1); /* Simplified */
8846334495ac1ee0a86228e67794b7a41ee91146f3bBehdad Esfahbod      case HB_TAG('Z','H','T',' '): return hb_language_from_string ("zh-Hant", -1); /* Traditional */
8856334495ac1ee0a86228e67794b7a41ee91146f3bBehdad Esfahbod      default: break; /* Fall through */
88640b5c2e86c633441040196d158e965ad95d6ad37Behdad Esfahbod    }
88740b5c2e86c633441040196d158e965ad95d6ad37Behdad Esfahbod  }
88840b5c2e86c633441040196d158e965ad95d6ad37Behdad Esfahbod
889744970af4d884cc87ffa645804578fec8df674a9Behdad Esfahbod  /* Else return a custom language in the form of "x-hbotABCD" */
89040b5c2e86c633441040196d158e965ad95d6ad37Behdad Esfahbod  {
89140b5c2e86c633441040196d158e965ad95d6ad37Behdad Esfahbod    unsigned char buf[11] = "x-hbot";
89240b5c2e86c633441040196d158e965ad95d6ad37Behdad Esfahbod    buf[6] = tag >> 24;
89340b5c2e86c633441040196d158e965ad95d6ad37Behdad Esfahbod    buf[7] = (tag >> 16) & 0xFF;
89440b5c2e86c633441040196d158e965ad95d6ad37Behdad Esfahbod    buf[8] = (tag >> 8) & 0xFF;
89540b5c2e86c633441040196d158e965ad95d6ad37Behdad Esfahbod    buf[9] = tag & 0xFF;
89640b5c2e86c633441040196d158e965ad95d6ad37Behdad Esfahbod    if (buf[9] == 0x20)
89740b5c2e86c633441040196d158e965ad95d6ad37Behdad Esfahbod      buf[9] = '\0';
89840b5c2e86c633441040196d158e965ad95d6ad37Behdad Esfahbod    buf[10] = '\0';
8994c9fe88d30036340fe592bcbc375049b84602b8bBehdad Esfahbod    return hb_language_from_string ((char *) buf, -1);
90040b5c2e86c633441040196d158e965ad95d6ad37Behdad Esfahbod  }
9018a3511ac6c795226699c2b36e03401ecdf88f5f8Behdad Esfahbod}
902acdba3f90b232fc12fcb200dca2584481b339118Behdad Esfahbod
903acdba3f90b232fc12fcb200dca2584481b339118Behdad Esfahbod
904