github.com/saferwall/pe@v1.5.2/resource.go (about)

     1  // Copyright 2018 Saferwall. All rights reserved.
     2  // Use of this source code is governed by Apache v2 license
     3  // license that can be found in the LICENSE file.
     4  
     5  package pe
     6  
     7  import (
     8  	"encoding/binary"
     9  )
    10  
    11  // ResourceType represents a resource type.
    12  type ResourceType int
    13  
    14  // ResourceLang represents a resource language.
    15  type ResourceLang uint32
    16  
    17  // ResourceSubLang represents a resource sub language.
    18  type ResourceSubLang uint32
    19  
    20  // https://learn.microsoft.com/en-us/openspecs/windows_protocols/ms-lcid/70feba9f-294e-491e-b6eb-56532684c37f
    21  
    22  // Special resource (sub)language identifiers.
    23  const (
    24  	LangNeutral       ResourceLang = 0x00 // Default custom (MUI) locale language
    25  	LangUserDefault   ResourceLang = 0x01 // User default locale language
    26  	LangSystemDefault ResourceLang = 0x02 // System default locale language
    27  	LangInvariant     ResourceLang = 0x7F // Invariant locale language
    28  
    29  	SubLangNeutral           ResourceSubLang = 0x00 // Neutral sub-language
    30  	SubLangInvariant         ResourceSubLang = 0x00 // Invariant sub-language
    31  	SubLangDefault           ResourceSubLang = 0x01 // User default sub-language
    32  	SubLangSysDefault        ResourceSubLang = 0x02 // System default sub-language
    33  	SubLangCustomDefault     ResourceSubLang = 0x03 // Default custom sub-language
    34  	SubLangCustomUnspecified ResourceSubLang = 0x04 // Unspecified custom sub-language
    35  	SubLangMUICustomDefault  ResourceSubLang = 0x05 // Default custom MUI sub-language
    36  )
    37  
    38  // All resource language identifiers.
    39  const (
    40  	// Afrikaans (af)
    41  	LangAfrikaans ResourceLang = 0x0036
    42  	// Albanian (sq)
    43  	LangAlbanian ResourceLang = 0x001C
    44  	// Alsatian (gsw)
    45  	LangAlsatian ResourceLang = 0x0084
    46  	// Amharic (am)
    47  	LangAmharic ResourceLang = 0x005E
    48  	// Arabic (ar)
    49  	LangArabic ResourceLang = 0x0001
    50  	// Armenian (hy)
    51  	LangArmenian ResourceLang = 0x002B
    52  	// Assamese (as)
    53  	LangAssamese ResourceLang = 0x004D
    54  	// Azerbaijani (Latin) (az)
    55  	LangAzerbaijaniLatin ResourceLang = 0x002C
    56  	// Bangla (bn)
    57  	LangBangla ResourceLang = 0x0045
    58  	// Bashkir (ba)
    59  	LangBashkir ResourceLang = 0x006D
    60  	// Basque (eu)
    61  	LangBasque ResourceLang = 0x002D
    62  	// Belarusian (be)
    63  	LangBelarusian ResourceLang = 0x0023
    64  	// Bosnian (Latin) (bs)
    65  	LangBosnianLatin ResourceLang = 0x781A
    66  	// Breton (br)
    67  	LangBreton ResourceLang = 0x007E
    68  	// Bulgarian (bg)
    69  	LangBulgarian ResourceLang = 0x0002
    70  	// Burmese (my)
    71  	LangBurmese ResourceLang = 0x0055
    72  	// Catalan (ca)
    73  	LangCatalan ResourceLang = 0x0003
    74  	// Central Kurdish (ku)
    75  	LangCentralKurdish ResourceLang = 0x0092
    76  	// Cherokee (chr)
    77  	LangCherokee ResourceLang = 0x005C
    78  	// Chinese (Simplified) (zh)
    79  	LangChineseSimplified ResourceLang = 0x7804
    80  	// Corsican (co)
    81  	LangCorsican ResourceLang = 0x0083
    82  	// Croatian (hr)
    83  	LangCroatian ResourceLang = 0x001A
    84  	// Czech (cs)
    85  	LangCzech ResourceLang = 0x0005
    86  	// Danish (da)
    87  	LangDanish ResourceLang = 0x0006
    88  	// Dari (prs)
    89  	LangDari ResourceLang = 0x008C
    90  	// Divehi (dv)
    91  	LangDivehi ResourceLang = 0x0065
    92  	// Dutch (nl)
    93  	LangDutch ResourceLang = 0x0013
    94  	// English (en)
    95  	LangEnglish ResourceLang = 0x0009
    96  	// Estonian (et)
    97  	LangEstonian ResourceLang = 0x0025
    98  	// Faroese (fo)
    99  	LangFaroese ResourceLang = 0x0038
   100  	// Filipino (fil)
   101  	LangFilipino ResourceLang = 0x0064
   102  	// Finnish (fi)
   103  	LangFinnish ResourceLang = 0x000B
   104  	// French (fr)
   105  	LangFrench ResourceLang = 0x000C
   106  	// Frisian (fy)
   107  	LangFrisian ResourceLang = 0x0062
   108  	// Fulah (ff)
   109  	LangFulah ResourceLang = 0x0067
   110  	// Fulah (Latin) (ff-Latn)
   111  	LangFulahLatin ResourceLang = 0x7C67
   112  	// Galician (gl)
   113  	LangGalician ResourceLang = 0x0056
   114  	// Georgian (ka)
   115  	LangGeorgian ResourceLang = 0x0037
   116  	// German (de)
   117  	LangGerman ResourceLang = 0x0007
   118  	// Greek (el)
   119  	LangGreek ResourceLang = 0x0008
   120  	// Greenlandic (kl)
   121  	LangGreenlandic ResourceLang = 0x006F
   122  	// Guarani (gn)
   123  	LangGuarani ResourceLang = 0x0074
   124  	// Gujarati (gu)
   125  	LangGujarati ResourceLang = 0x0047
   126  	// Hausa (Latin) (ha)
   127  	LangHausaLatin ResourceLang = 0x0068
   128  	// Hawaiian (haw)
   129  	LangHawaiian ResourceLang = 0x0075
   130  	// Hebrew (he)
   131  	LangHebrew ResourceLang = 0x000D
   132  	// Hindi (hi)
   133  	LangHindi ResourceLang = 0x0039
   134  	// Hungarian (hu)
   135  	LangHungarian ResourceLang = 0x000E
   136  	// Icelandic (is)
   137  	LangIcelandic ResourceLang = 0x000F
   138  	// Igbo (ig)
   139  	LangIgbo ResourceLang = 0x0070
   140  	// Indonesian (id)
   141  	LangIndonesian ResourceLang = 0x0021
   142  	// Inuktitut (Latin) (iu)
   143  	LangInuktitutLatin ResourceLang = 0x005D
   144  	// Irish (ga)
   145  	LangIrish ResourceLang = 0x003C
   146  	// Italian (it)
   147  	LangItalian ResourceLang = 0x0010
   148  	// Japanese (ja)
   149  	LangJapanese ResourceLang = 0x0011
   150  	// Kannada (kn)
   151  	LangKannada ResourceLang = 0x004B
   152  	// Kashmiri (ks)
   153  	LangKashmiri ResourceLang = 0x0060
   154  	// Kazakh (kk)
   155  	LangKazakh ResourceLang = 0x003F
   156  	// Khmer (km)
   157  	LangKhmer ResourceLang = 0x0053
   158  	// K'iche (quc)
   159  	LangKiche ResourceLang = 0x0086
   160  	// Kinyarwanda (rw)
   161  	LangKinyarwanda ResourceLang = 0x0087
   162  	// Kiswahili (sw)
   163  	LangKiswahili ResourceLang = 0x0041
   164  	// Konkani (kok)
   165  	LangKonkani ResourceLang = 0x0057
   166  	// Korean (ko)
   167  	LangKorean ResourceLang = 0x0012
   168  	// Kyrgyz (ky)
   169  	LangKyrgyz ResourceLang = 0x0040
   170  	// Lao (lo)
   171  	LangLao ResourceLang = 0x0054
   172  	// Latvian (lv)
   173  	LangLatvian ResourceLang = 0x0026
   174  	// Lithuanian (lt)
   175  	LangLithuanian ResourceLang = 0x0027
   176  	// Lower Sorbian (dsb)
   177  	LangLowerSorbian ResourceLang = 0x7C2E
   178  	// Luxembourgish (lb)
   179  	LangLuxembourgish ResourceLang = 0x006E
   180  	// Macedonian (mk)
   181  	LangMacedonian ResourceLang = 0x002F
   182  	// Malay (ms)
   183  	LangMalay ResourceLang = 0x003E
   184  	// Malayalam (ml)
   185  	LangMalayalam ResourceLang = 0x004C
   186  	// Maltese (mt)
   187  	LangMaltese ResourceLang = 0x003A
   188  	// Maori (mi)
   189  	LangMaori ResourceLang = 0x0081
   190  	// Mapudungun (arn)
   191  	LangMapudungun ResourceLang = 0x007A
   192  	// Marathi (mr)
   193  	LangMarathi ResourceLang = 0x004E
   194  	// Mohawk (moh)
   195  	LangMohawk ResourceLang = 0x007C
   196  	// Mongolian (Cyrillic) (mn)
   197  	LangMongolianCyrillic ResourceLang = 0x0050
   198  	// Nepali (ne)
   199  	LangNepali ResourceLang = 0x0061
   200  	// Norwegian (Bokmal) (no)
   201  	LangNorwegianBokmalNo ResourceLang = 0x0014
   202  	// Norwegian (Bokmal) (nb)
   203  	LangNorwegianBokmal ResourceLang = 0x7C14
   204  	// Norwegian (Nynorsk) (nn)
   205  	LangNorwegianNynorsk ResourceLang = 0x7814
   206  	// Occitan (oc)
   207  	LangOccitan ResourceLang = 0x0082
   208  	// Odia (or)
   209  	LangOdia ResourceLang = 0x0048
   210  	// Oromo (om)
   211  	LangOromo ResourceLang = 0x0072
   212  	// Pashto (ps)
   213  	LangPashto ResourceLang = 0x0063
   214  	// Persian (fa)
   215  	LangPersian ResourceLang = 0x0029
   216  	// Polish (pl)
   217  	LangPolish ResourceLang = 0x0015
   218  	// Portuguese (pt)
   219  	LangPortuguese ResourceLang = 0x0016
   220  	// Punjabi (pa)
   221  	LangPunjabi ResourceLang = 0x0046
   222  	// Quechua (quz)
   223  	LangQuechua ResourceLang = 0x006B
   224  	// Romanian (ro)
   225  	LangRomanian ResourceLang = 0x0018
   226  	// Romansh (rm)
   227  	LangRomansh ResourceLang = 0x0017
   228  	// Russian (ru)
   229  	LangRussian ResourceLang = 0x0019
   230  	// Sakha (sah)
   231  	LangSakha ResourceLang = 0x0085
   232  	// Sami (Inari) (smn)
   233  	LangSamiInari ResourceLang = 0x703B
   234  	// Sami (Lule) (smj)
   235  	LangSamiLule ResourceLang = 0x7C3B
   236  	// Sami (Northern) (se)
   237  	LangSamiNorthern ResourceLang = 0x003B
   238  	// Sami (Skolt) (sms)
   239  	LangSamiSkolt ResourceLang = 0x743B
   240  	// Sami (Southern) (sma)
   241  	LangSamiSouthern ResourceLang = 0x783B
   242  	// Sanskrit (sa)
   243  	LangSanskrit ResourceLang = 0x004F
   244  	// Scottish Gaelic (gd)
   245  	LangScottishGaelic ResourceLang = 0x0091
   246  	// Serbian (Latin) (sr)
   247  	LangSerbianLatin ResourceLang = 0x7C1A
   248  	// Sesotho Sa Leboa (nso)
   249  	LangSesothoSaLeboa ResourceLang = 0x006C
   250  	// Setswana (tn)
   251  	LangSetswana ResourceLang = 0x0032
   252  	// Sindhi (sd)
   253  	LangSindhi ResourceLang = 0x0059
   254  	// Sinhala (si)
   255  	LangSinhala ResourceLang = 0x005B
   256  	// Slovak (sk)
   257  	LangSlovak ResourceLang = 0x001B
   258  	// Slovenian (sl)
   259  	LangSlovenian ResourceLang = 0x0024
   260  	// Somali (so)
   261  	LangSomali ResourceLang = 0x0077
   262  	// Sotho (st)
   263  	LangSotho ResourceLang = 0x0030
   264  	// Spanish (es)
   265  	LangSpanish ResourceLang = 0x000A
   266  	// Swedish (sv)
   267  	LangSwedish ResourceLang = 0x001D
   268  	// Syriac (syr)
   269  	LangSyriac ResourceLang = 0x005A
   270  	// Tajik (Cyrillic) (tg)
   271  	LangTajikCyrillic ResourceLang = 0x0028
   272  	// Tamazight (Latin) (tzm)
   273  	LangTamazightLatin ResourceLang = 0x005F
   274  	// Tamil (ta)
   275  	LangTamil ResourceLang = 0x0049
   276  	// Tatar (tt)
   277  	LangTatar ResourceLang = 0x0044
   278  	// Telugu (te)
   279  	LangTelugu ResourceLang = 0x004A
   280  	// Thai (th)
   281  	LangThai ResourceLang = 0x001E
   282  	// Tibetan (bo)
   283  	LangTibetan ResourceLang = 0x0051
   284  	// Tigrinya (ti)
   285  	LangTigrinya ResourceLang = 0x0073
   286  	// Tsonga (ts)
   287  	LangTsonga ResourceLang = 0x0031
   288  	// Turkish (tr)
   289  	LangTurkish ResourceLang = 0x001F
   290  	// Turkmen (tk)
   291  	LangTurkmen ResourceLang = 0x0042
   292  	// Ukrainian (uk)
   293  	LangUkrainian ResourceLang = 0x0022
   294  	// Upper Sorbian (hsb)
   295  	LangUpperSorbian ResourceLang = 0x002E
   296  	// Urdu (ur)
   297  	LangUrdu ResourceLang = 0x0020
   298  	// Uyghur (ug)
   299  	LangUyghur ResourceLang = 0x0080
   300  	// Uzbek (Latin) (uz)
   301  	LangUzbekLatin ResourceLang = 0x0043
   302  	// Venda (ve)
   303  	LangVenda ResourceLang = 0x0033
   304  	// Vietnamese (vi)
   305  	LangVietnamese ResourceLang = 0x002A
   306  	// Welsh (cy)
   307  	LangWelsh ResourceLang = 0x0052
   308  	// Wolof (wo)
   309  	LangWolof ResourceLang = 0x0088
   310  	// Xhosa (xh)
   311  	LangXhosa ResourceLang = 0x0034
   312  	// Yi (ii)
   313  	LangYi ResourceLang = 0x0078
   314  	// Yoruba (yo)
   315  	LangYoruba ResourceLang = 0x006A
   316  	// Zulu (zu)
   317  	LangZulu ResourceLang = 0x0035
   318  )
   319  
   320  // All resource sub-language identifiers.
   321  const (
   322  	// Afrikaans South Africa (af-ZA)
   323  	SubLangAfrikaansSouthAfrica ResourceSubLang = iota
   324  	// Albanian Albania (sq-AL)
   325  	SubLangAlbanianAlbania
   326  	// Alsatian France (gsw-FR)
   327  	SubLangAlsatianFrance
   328  	// Amharic Ethiopia (am-ET)
   329  	SubLangAmharicEthiopia
   330  	// Arabic Algeria (ar-DZ)
   331  	SubLangArabicAlgeria
   332  	// Arabic Bahrain (ar-BH)
   333  	SubLangArabicBahrain
   334  	// Arabic Egypt (ar-EG)
   335  	SubLangArabicEgypt
   336  	// Arabic Iraq (ar-IQ)
   337  	SubLangArabicIraq
   338  	// Arabic Jordan (ar-JO)
   339  	SubLangArabicJordan
   340  	// Arabic Kuwait (ar-KW)
   341  	SubLangArabicKuwait
   342  	// Arabic Lebanon (ar-LB)
   343  	SubLangArabicLebanon
   344  	// Arabic Libya (ar-LY)
   345  	SubLangArabicLibya
   346  	// Arabic Morocco (ar-MA)
   347  	SubLangArabicMorocco
   348  	// Arabic Oman (ar-OM)
   349  	SubLangArabicOman
   350  	// Arabic Qatar (ar-QA)
   351  	SubLangArabicQatar
   352  	// Arabic Saudi Arabia (ar-SA)
   353  	SubLangArabicSaudiArabia
   354  	// Arabic Syria (ar-SY)
   355  	SubLangArabicSyria
   356  	// Arabic Tunisia (ar-TN)
   357  	SubLangArabicTunisia
   358  	// Arabic U.a.e. (ar-AE)
   359  	SubLangArabicUae
   360  	// Arabic Yemen (ar-YE)
   361  	SubLangArabicYemen
   362  	// Armenian Armenia (hy-AM)
   363  	SubLangArmenianArmenia
   364  	// Assamese India (as-IN)
   365  	SubLangAssameseIndia
   366  	// Azerbaijani (Cyrillic) (az-Cyrl)
   367  	SubLangAzerbaijaniCyrillic
   368  	// Azerbaijani (Cyrillic) Azerbaijan (az-Cyrl-AZ)
   369  	SubLangAzerbaijaniCyrillicAzerbaijan
   370  	// Azerbaijani (Latin) (az-Latn)
   371  	SubLangAzerbaijaniLatin
   372  	// Azerbaijani (Latin) Azerbaijan (az-Latn-AZ)
   373  	SubLangAzerbaijaniLatinAzerbaijan
   374  	// Bangla Bangladesh (bn-BD)
   375  	SubLangBanglaBangladesh
   376  	// Bangla India (bn-IN)
   377  	SubLangBanglaIndia
   378  	// Bashkir Russia (ba-RU)
   379  	SubLangBashkirRussia
   380  	// Basque Spain (eu-ES)
   381  	SubLangBasqueSpain
   382  	// Belarusian Belarus (be-BY)
   383  	SubLangBelarusianBelarus
   384  	// Bosnian (Cyrillic) (bs-Cyrl)
   385  	SubLangBosnianCyrillic
   386  	// Bosnian (Cyrillic) Bosnia And Herzegovina (bs-Cyrl-BA)
   387  	SubLangBosnianCyrillicBosniaAndHerzegovina
   388  	// Bosnian (Latin) (bs-Latn)
   389  	SubLangBosnianLatin
   390  	// Bosnian (Latin) Bosnia And Herzegovina (bs-Latn-BA)
   391  	SubLangBosnianLatinBosniaAndHerzegovina
   392  	// Breton France (br-FR)
   393  	SubLangBretonFrance
   394  	// Bulgarian Bulgaria (bg-BG)
   395  	SubLangBulgarianBulgaria
   396  	// Burmese Myanmar (my-MM)
   397  	SubLangBurmeseMyanmar
   398  	// Catalan Spain (ca-ES)
   399  	SubLangCatalanSpain
   400  	// Central Atlas Tamazight (Arabic) Morocco (tzm-ArabMA)
   401  	SubLangCentralAtlasTamazightArabicMorocco
   402  	// Central Kurdish (ku-Arab)
   403  	SubLangCentralKurdish
   404  	// Central Kurdish Iraq (ku-Arab-IQ)
   405  	SubLangCentralKurdishIraq
   406  	// Cherokee (chr-Cher)
   407  	SubLangCherokee
   408  	// Cherokee United States (chr-Cher-US)
   409  	SubLangCherokeeUnitedStates
   410  	// Chinese (Simplified) (zh-Hans)
   411  	SubLangChineseSimplified
   412  	// Chinese (Simplified) People's Republic Of China (zh-CN)
   413  	SubLangChineseSimplifiedPeoplesRepublicOfChina
   414  	// Chinese (Simplified) Singapore (zh-SG)
   415  	SubLangChineseSimplifiedSingapore
   416  	// Chinese (Traditional) (zh-Hant)
   417  	SubLangChineseTraditional
   418  	// Chinese (Traditional) Hong Kong S.a.r. (zh-HK)
   419  	SubLangChineseTraditionalHongKongSar
   420  	// Chinese (Traditional) Macao S.a.r. (zh-MO)
   421  	SubLangChineseTraditionalMacaoSar
   422  	// Chinese (Traditional) Taiwan (zh-TW)
   423  	SubLangChineseTraditionalTaiwan
   424  	// Corsican France (co-FR)
   425  	SubLangCorsicanFrance
   426  	// Croatian Croatia (hr-HR)
   427  	SubLangCroatianCroatia
   428  	// Croatian (Latin) Bosnia And Herzegovina (hr-BA)
   429  	SubLangCroatianLatinBosniaAndHerzegovina
   430  	// Czech Czech Republic (cs-CZ)
   431  	SubLangCzechCzechRepublic
   432  	// Danish Denmark (da-DK)
   433  	SubLangDanishDenmark
   434  	// Dari Afghanistan (prs-AF)
   435  	SubLangDariAfghanistan
   436  	// Divehi Maldives (dv-MV)
   437  	SubLangDivehiMaldives
   438  	// Dutch Belgium (nl-BE)
   439  	SubLangDutchBelgium
   440  	// Dutch Netherlands (nl-NL)
   441  	SubLangDutchNetherlands
   442  	// Dzongkha Bhutan (dz-BT)
   443  	SubLangDzongkhaBhutan
   444  	// English Australia (en-AU)
   445  	SubLangEnglishAustralia
   446  	// English Belize (en-BZ)
   447  	SubLangEnglishBelize
   448  	// English Canada (en-CA)
   449  	SubLangEnglishCanada
   450  	// English Caribbean (en-029)
   451  	SubLangEnglishCaribbean
   452  	// English Hong Kong (en-HK)
   453  	SubLangEnglishHongKong
   454  	// English India (en-IN)
   455  	SubLangEnglishIndia
   456  	// English Ireland (en-IE)
   457  	SubLangEnglishIreland
   458  	// English Jamaica (en-JM)
   459  	SubLangEnglishJamaica
   460  	// English Malaysia (en-MY)
   461  	SubLangEnglishMalaysia
   462  	// English New Zealand (en-NZ)
   463  	SubLangEnglishNewZealand
   464  	// English Republic Of The Philippines (en-PH)
   465  	SubLangEnglishRepublicOfThePhilippines
   466  	// English Singapore (en-SG)
   467  	SubLangEnglishSingapore
   468  	// English South Africa (en-ZA)
   469  	SubLangEnglishSouthAfrica
   470  	// English Trinidad And Tobago (en-TT)
   471  	SubLangEnglishTrinidadAndTobago
   472  	// English United Arab Emirates (en-AE)
   473  	SubLangEnglishUnitedArabEmirates
   474  	// English United Kingdom (en-GB)
   475  	SubLangEnglishUnitedKingdom
   476  	// English United States (en-US)
   477  	SubLangEnglishUnitedStates
   478  	// English Zimbabwe (en-ZW)
   479  	SubLangEnglishZimbabwe
   480  	// Estonian Estonia (et-EE)
   481  	SubLangEstonianEstonia
   482  	// Faroese Faroe Islands (fo-FO)
   483  	SubLangFaroeseFaroeIslands
   484  	// Filipino Philippines (fil-PH)
   485  	SubLangFilipinoPhilippines
   486  	// Finnish Finland (fi-FI)
   487  	SubLangFinnishFinland
   488  	// French Belgium (fr-BE)
   489  	SubLangFrenchBelgium
   490  	// French Cameroon (fr-CM)
   491  	SubLangFrenchCameroon
   492  	// French Canada (fr-CA)
   493  	SubLangFrenchCanada
   494  	// French Caribbean (fr-029)
   495  	SubLangFrenchCaribbean
   496  	// French Congo, Drc (fr-CD)
   497  	SubLangFrenchCongoDrc
   498  	// French Côte D'ivoire (fr-CI)
   499  	SubLangFrenchCôteDivoire
   500  	// French France (fr-FR)
   501  	SubLangFrenchFrance
   502  	// French Haiti (fr-HT)
   503  	SubLangFrenchHaiti
   504  	// French Luxembourg (fr-LU)
   505  	SubLangFrenchLuxembourg
   506  	// French Mali (fr-ML)
   507  	SubLangFrenchMali
   508  	// French Morocco (fr-MA)
   509  	SubLangFrenchMorocco
   510  	// French Principality Of Monaco (fr-MC)
   511  	SubLangFrenchPrincipalityOfMonaco
   512  	// French Reunion (fr-RE)
   513  	SubLangFrenchReunion
   514  	// French Senegal (fr-SN)
   515  	SubLangFrenchSenegal
   516  	// French Switzerland (fr-CH)
   517  	SubLangFrenchSwitzerland
   518  	// Frisian Netherlands (fy-NL)
   519  	SubLangFrisianNetherlands
   520  	// Fulah Nigeria (ff-NG)
   521  	SubLangFulahNigeria
   522  	// Fulah (Latin) Nigeria (ff-Latn-NG)
   523  	SubLangFulahLatinNigeria
   524  	// Fulah Senegal (ff-Latn-SN)
   525  	SubLangFulahSenegal
   526  	// Galician Spain (gl-ES)
   527  	SubLangGalicianSpain
   528  	// Georgian Georgia (ka-GE)
   529  	SubLangGeorgianGeorgia
   530  	// German Austria (de-AT)
   531  	SubLangGermanAustria
   532  	// German Germany (de-DE)
   533  	SubLangGermanGermany
   534  	// German Liechtenstein (de-LI)
   535  	SubLangGermanLiechtenstein
   536  	// German Luxembourg (de-LU)
   537  	SubLangGermanLuxembourg
   538  	// German Switzerland (de-CH)
   539  	SubLangGermanSwitzerland
   540  	// Greek Greece (el-GR)
   541  	SubLangGreekGreece
   542  	// Greenlandic Greenland (kl-GL)
   543  	SubLangGreenlandicGreenland
   544  	// Guarani Paraguay (gn-PY)
   545  	SubLangGuaraniParaguay
   546  	// Gujarati India (gu-IN)
   547  	SubLangGujaratiIndia
   548  	// Hausa (Latin) (ha-Latn)
   549  	SubLangHausaLatin
   550  	// Hausa (Latin) Nigeria (ha-Latn-NG)
   551  	SubLangHausaLatinNigeria
   552  	// Hawaiian United States (haw-US)
   553  	SubLangHawaiianUnitedStates
   554  	// Hebrew Israel (he-IL)
   555  	SubLangHebrewIsrael
   556  	// Hindi India (hi-IN)
   557  	SubLangHindiIndia
   558  	// Hungarian Hungary (hu-HU)
   559  	SubLangHungarianHungary
   560  	// Icelandic Iceland (is-IS)
   561  	SubLangIcelandicIceland
   562  	// Igbo Nigeria (ig-NG)
   563  	SubLangIgboNigeria
   564  	// Indonesian Indonesia (id-ID)
   565  	SubLangIndonesianIndonesia
   566  	// Inuktitut (Latin) (iu-Latn)
   567  	SubLangInuktitutLatin
   568  	// Inuktitut (Latin) Canada (iu-Latn-CA)
   569  	SubLangInuktitutLatinCanada
   570  	// Inuktitut (Syllabics) (iu-Cans)
   571  	SubLangInuktitutSyllabics
   572  	// Inuktitut (Syllabics) Canada (iu-Cans-CA)
   573  	SubLangInuktitutSyllabicsCanada
   574  	// Irish Ireland (ga-IE)
   575  	SubLangIrishIreland
   576  	// Italian Italy (it-IT)
   577  	SubLangItalianItaly
   578  	// Italian Switzerland (it-CH)
   579  	SubLangItalianSwitzerland
   580  	// Japanese Japan (ja-JP)
   581  	SubLangJapaneseJapan
   582  	// Kannada India (kn-IN)
   583  	SubLangKannadaIndia
   584  	// Kanuri (Latin) Nigeria (kr-Latn-NG)
   585  	SubLangKanuriLatinNigeria
   586  	// Kashmiri Perso-Arabic (ks-Arab)
   587  	SubLangKashmiriPersoArabic
   588  	// Kashmiri (Devanagari) India (ks-Deva-IN)
   589  	SubLangKashmiriDevanagariIndia
   590  	// Kazakh Kazakhstan (kk-KZ)
   591  	SubLangKazakhKazakhstan
   592  	// Khmer Cambodia (km-KH)
   593  	SubLangKhmerCambodia
   594  	// K'iche Guatemala (quc-Latn-GT)
   595  	SubLangKicheGuatemala
   596  	// Kinyarwanda Rwanda (rw-RW)
   597  	SubLangKinyarwandaRwanda
   598  	// Kiswahili Kenya (sw-KE)
   599  	SubLangKiswahiliKenya
   600  	// Konkani India (kok-IN)
   601  	SubLangKonkaniIndia
   602  	// Korean Korea (ko-KR)
   603  	SubLangKoreanKorea
   604  	// Kyrgyz Kyrgyzstan (ky-KG)
   605  	SubLangKyrgyzKyrgyzstan
   606  	// Lao Lao P.d.r. (lo-LA)
   607  	SubLangLaoLaoPdr
   608  	// Latin Vatican City (la-VA)
   609  	SubLangLatinVaticanCity
   610  	// Latvian Latvia (lv-LV)
   611  	SubLangLatvianLatvia
   612  	// Lithuanian Lithuania (lt-LT)
   613  	SubLangLithuanianLithuania
   614  	// Lower Sorbian Germany (dsb-DE)
   615  	SubLangLowerSorbianGermany
   616  	// Luxembourgish Luxembourg (lb-LU)
   617  	SubLangLuxembourgishLuxembourg
   618  	// Macedonian North Macedonia (mk-MK)
   619  	SubLangMacedonianNorthMacedonia
   620  	// Malay Brunei Darussalam (ms-BN)
   621  	SubLangMalayBruneiDarussalam
   622  	// Malay Malaysia (ms-MY)
   623  	SubLangMalayMalaysia
   624  	// Malayalam India (ml-IN)
   625  	SubLangMalayalamIndia
   626  	// Maltese Malta (mt-MT)
   627  	SubLangMalteseMalta
   628  	// Maori New Zealand (mi-NZ)
   629  	SubLangMaoriNewZealand
   630  	// Mapudungun Chile (arn-CL)
   631  	SubLangMapudungunChile
   632  	// Marathi India (mr-IN)
   633  	SubLangMarathiIndia
   634  	// Mohawk Canada (moh-CA)
   635  	SubLangMohawkCanada
   636  	// Mongolian (Cyrillic) (mn-Cyrl)
   637  	SubLangMongolianCyrillic
   638  	// Mongolian (Cyrillic) Mongolia (mn-MN)
   639  	SubLangMongolianCyrillicMongolia
   640  	// Mongolian (Traditional Mongolian) (mn-Mong)
   641  	SubLangMongolianTraditionalMongolian
   642  	// Mongolian (Traditional Mongolian) People's Republic Of China (mn-MongCN)
   643  	SubLangMongolianTraditionalMongolianPeoplesRepublicOfChina
   644  	// Mongolian (Traditional Mongolian) Mongolia (mn-MongMN)
   645  	SubLangMongolianTraditionalMongolianMongolia
   646  	// Nepali India (ne-IN)
   647  	SubLangNepaliIndia
   648  	// Nepali Nepal (ne-NP)
   649  	SubLangNepaliNepal
   650  	// Norwegian (Bokmal) Norway (nb-NO)
   651  	SubLangNorwegianBokmalNorway
   652  	// Norwegian (Nynorsk) Norway (nn-NO)
   653  	SubLangNorwegianNynorskNorway
   654  	// Occitan France (oc-FR)
   655  	SubLangOccitanFrance
   656  	// Odia India (or-IN)
   657  	SubLangOdiaIndia
   658  	// Oromo Ethiopia (om-ET)
   659  	SubLangOromoEthiopia
   660  	// Pashto Afghanistan (ps-AF)
   661  	SubLangPashtoAfghanistan
   662  	// Persian Iran (fa-IR)
   663  	SubLangPersianIran
   664  	// Polish Poland (pl-PL)
   665  	SubLangPolishPoland
   666  	// Portuguese Brazil (pt-BR)
   667  	SubLangPortugueseBrazil
   668  	// Portuguese Portugal (pt-PT)
   669  	SubLangPortuguesePortugal
   670  	// Pseudo Language Pseudo Locale For East Asian/Complex Script Localization Testing (qps-ploca)
   671  	SubLangPseudoLanguagePseudoLocaleForEastAsianComplexScriptLocalizationTesting
   672  	// Pseudo Language Pseudo Locale Used For Localization Testing (qps-ploc)
   673  	SubLangPseudoLanguagePseudoLocaleUsedForLocalizationTesting
   674  	// Pseudo Language Pseudo Locale Used For Localization Testing Of Mirrored Locales (qps-plocm)
   675  	SubLangPseudoLanguagePseudoLocaleUsedForLocalizationTestingOfMirroredLocales
   676  	// Punjabi (pa-Arab)
   677  	SubLangPunjabi
   678  	// Punjabi India (pa-IN)
   679  	SubLangPunjabiIndia
   680  	// Punjabi Islamic Republic Of Pakistan (pa-Arab-PK)
   681  	SubLangPunjabiIslamicRepublicOfPakistan
   682  	// Quechua Bolivia (quz-BO)
   683  	SubLangQuechuaBolivia
   684  	// Quechua Ecuador (quz-EC)
   685  	SubLangQuechuaEcuador
   686  	// Quechua Peru (quz-PE)
   687  	SubLangQuechuaPeru
   688  	// Romanian Moldova (ro-MD)
   689  	SubLangRomanianMoldova
   690  	// Romanian Romania (ro-RO)
   691  	SubLangRomanianRomania
   692  	// Romansh Switzerland (rm-CH)
   693  	SubLangRomanshSwitzerland
   694  	// Russian Moldova (ru-MD)
   695  	SubLangRussianMoldova
   696  	// Russian Russia (ru-RU)
   697  	SubLangRussianRussia
   698  	// Sakha Russia (sah-RU)
   699  	SubLangSakhaRussia
   700  	// Sami (Inari) Finland (smn-FI)
   701  	SubLangSamiInariFinland
   702  	// Sami (Lule) Norway (smj-NO)
   703  	SubLangSamiLuleNorway
   704  	// Sami (Lule) Sweden (smj-SE)
   705  	SubLangSamiLuleSweden
   706  	// Sami (Northern) Finland (se-FI)
   707  	SubLangSamiNorthernFinland
   708  	// Sami (Northern) Norway (se-NO)
   709  	SubLangSamiNorthernNorway
   710  	// Sami (Northern) Sweden (se-SE)
   711  	SubLangSamiNorthernSweden
   712  	// Sami (Skolt) Finland (sms-FI)
   713  	SubLangSamiSkoltFinland
   714  	// Sami (Southern) Norway (sma-NO)
   715  	SubLangSamiSouthernNorway
   716  	// Sami (Southern) Sweden (sma-SE)
   717  	SubLangSamiSouthernSweden
   718  	// Sanskrit India (sa-IN)
   719  	SubLangSanskritIndia
   720  	// Scottish Gaelic United Kingdom (gd-GB)
   721  	SubLangScottishGaelicUnitedKingdom
   722  	// Serbian (Cyrillic) (sr-Cyrl)
   723  	SubLangSerbianCyrillic
   724  	// Serbian (Cyrillic) Bosnia And Herzegovina (sr-Cyrl-BA)
   725  	SubLangSerbianCyrillicBosniaAndHerzegovina
   726  	// Serbian (Cyrillic) Montenegro (sr-Cyrl-ME)
   727  	SubLangSerbianCyrillicMontenegro
   728  	// Serbian (Cyrillic) Serbia (sr-Cyrl-RS)
   729  	SubLangSerbianCyrillicSerbia
   730  	// Serbian (Cyrillic) Serbia And Montenegro (Former) (sr-Cyrl-CS)
   731  	SubLangSerbianCyrillicSerbiaAndMontenegroFormer
   732  	// Serbian (Latin) (sr-Latn)
   733  	SubLangSerbianLatin
   734  	// Serbian (Latin) Bosnia And Herzegovina (sr-Latn-BA)
   735  	SubLangSerbianLatinBosniaAndHerzegovina
   736  	// Serbian (Latin) Montenegro (sr-Latn-ME)
   737  	SubLangSerbianLatinMontenegro
   738  	// Serbian (Latin) Serbia (sr-Latn-RS)
   739  	SubLangSerbianLatinSerbia
   740  	// Serbian (Latin) Serbia And Montenegro (Former) (sr-Latn-CS)
   741  	SubLangSerbianLatinSerbiaAndMontenegroFormer
   742  	// Sesotho Sa Leboa South Africa (nso-ZA)
   743  	SubLangSesothoSaLeboaSouthAfrica
   744  	// Setswana Botswana (tn-BW)
   745  	SubLangSetswanaBotswana
   746  	// Setswana South Africa (tn-ZA)
   747  	SubLangSetswanaSouthAfrica
   748  	// Sindhi (sd-Arab)
   749  	SubLangSindhi
   750  	// Sindhi Islamic Republic Of Pakistan (sd-Arab-PK)
   751  	SubLangSindhiIslamicRepublicOfPakistan
   752  	// Sinhala Sri Lanka (si-LK)
   753  	SubLangSinhalaSriLanka
   754  	// Slovak Slovakia (sk-SK)
   755  	SubLangSlovakSlovakia
   756  	// Slovenian Slovenia (sl-SI)
   757  	SubLangSlovenianSlovenia
   758  	// Somali Somalia (so-SO)
   759  	SubLangSomaliSomalia
   760  	// Sotho South Africa (st-ZA)
   761  	SubLangSothoSouthAfrica
   762  	// Spanish Argentina (es-AR)
   763  	SubLangSpanishArgentina
   764  	// Spanish Bolivarian Republic Of Venezuela (es-VE)
   765  	SubLangSpanishBolivarianRepublicOfVenezuela
   766  	// Spanish Bolivia (es-BO)
   767  	SubLangSpanishBolivia
   768  	// Spanish Chile (es-CL)
   769  	SubLangSpanishChile
   770  	// Spanish Colombia (es-CO)
   771  	SubLangSpanishColombia
   772  	// Spanish Costa Rica (es-CR)
   773  	SubLangSpanishCostaRica
   774  	// Spanish Cuba (es-CU)
   775  	SubLangSpanishCuba
   776  	// Spanish Dominican Republic (es-DO)
   777  	SubLangSpanishDominicanRepublic
   778  	// Spanish Ecuador (es-EC)
   779  	SubLangSpanishEcuador
   780  	// Spanish El Salvador (es-SV)
   781  	SubLangSpanishElSalvador
   782  	// Spanish Guatemala (es-GT)
   783  	SubLangSpanishGuatemala
   784  	// Spanish Honduras (es-HN)
   785  	SubLangSpanishHonduras
   786  	// Spanish Latin America (es-419)
   787  	SubLangSpanishLatinAmerica
   788  	// Spanish Mexico (es-MX)
   789  	SubLangSpanishMexico
   790  	// Spanish Nicaragua (es-NI)
   791  	SubLangSpanishNicaragua
   792  	// Spanish Panama (es-PA)
   793  	SubLangSpanishPanama
   794  	// Spanish Paraguay (es-PY)
   795  	SubLangSpanishParaguay
   796  	// Spanish Peru (es-PE)
   797  	SubLangSpanishPeru
   798  	// Spanish Puerto Rico (es-PR)
   799  	SubLangSpanishPuertoRico
   800  	// Spanish Spain (es-ES_tradnl)
   801  	SubLangSpanishSpainTraditional
   802  	// Spanish Spain (es-ES)
   803  	SubLangSpanishSpain
   804  	// Spanish United States (es-US)
   805  	SubLangSpanishUnitedStates
   806  	// Spanish Uruguay (es-UY)
   807  	SubLangSpanishUruguay
   808  	// Swedish Finland (sv-FI)
   809  	SubLangSwedishFinland
   810  	// Swedish Sweden (sv-SE)
   811  	SubLangSwedishSweden
   812  	// Syriac Syria (syr-SY)
   813  	SubLangSyriacSyria
   814  	// Tajik (Cyrillic) (tg-Cyrl)
   815  	SubLangTajikCyrillic
   816  	// Tajik (Cyrillic) Tajikistan (tg-Cyrl-TJ)
   817  	SubLangTajikCyrillicTajikistan
   818  	// Tamazight (Latin) (tzm-Latn)
   819  	SubLangTamazightLatin
   820  	// Tamazight (Latin) Algeria (tzm-Latn-DZ)
   821  	SubLangTamazightLatinAlgeria
   822  	// Tamil India (ta-IN)
   823  	SubLangTamilIndia
   824  	// Tamil Sri Lanka (ta-LK)
   825  	SubLangTamilSriLanka
   826  	// Tatar Russia (tt-RU)
   827  	SubLangTatarRussia
   828  	// Telugu India (te-IN)
   829  	SubLangTeluguIndia
   830  	// Thai Thailand (th-TH)
   831  	SubLangThaiThailand
   832  	// Tibetan People's Republic Of China (bo-CN)
   833  	SubLangTibetanPeoplesRepublicOfChina
   834  	// Tigrinya Eritrea (ti-ER)
   835  	SubLangTigrinyaEritrea
   836  	// Tigrinya Ethiopia (ti-ET)
   837  	SubLangTigrinyaEthiopia
   838  	// Tsonga South Africa (ts-ZA)
   839  	SubLangTsongaSouthAfrica
   840  	// Turkish Turkey (tr-TR)
   841  	SubLangTurkishTurkey
   842  	// Turkmen Turkmenistan (tk-TM)
   843  	SubLangTurkmenTurkmenistan
   844  	// Ukrainian Ukraine (uk-UA)
   845  	SubLangUkrainianUkraine
   846  	// Upper Sorbian Germany (hsb-DE)
   847  	SubLangUpperSorbianGermany
   848  	// Urdu India (ur-IN)
   849  	SubLangUrduIndia
   850  	// Urdu Islamic Republic Of Pakistan (ur-PK)
   851  	SubLangUrduIslamicRepublicOfPakistan
   852  	// Uyghur People's Republic Of China (ug-CN)
   853  	SubLangUyghurPeoplesRepublicOfChina
   854  	// Uzbek (Cyrillic) (uz-Cyrl)
   855  	SubLangUzbekCyrillic
   856  	// Uzbek (Cyrillic) Uzbekistan (uz-Cyrl-UZ)
   857  	SubLangUzbekCyrillicUzbekistan
   858  	// Uzbek (Latin) (uz-Latn)
   859  	SubLangUzbekLatin
   860  	// Uzbek (Latin) Uzbekistan (uz-Latn-UZ)
   861  	SubLangUzbekLatinUzbekistan
   862  	// Valencian Spain (ca-ESvalencia)
   863  	SubLangValencianSpain
   864  	// Venda South Africa (ve-ZA)
   865  	SubLangVendaSouthAfrica
   866  	// Vietnamese Vietnam (vi-VN)
   867  	SubLangVietnameseVietnam
   868  	// Welsh United Kingdom (cy-GB)
   869  	SubLangWelshUnitedKingdom
   870  	// Wolof Senegal (wo-SN)
   871  	SubLangWolofSenegal
   872  	// Xhosa South Africa (xh-ZA)
   873  	SubLangXhosaSouthAfrica
   874  	// Yi People's Republic Of China (ii-CN)
   875  	SubLangYiPeoplesRepublicOfChina
   876  	// Yiddish World (yi-001)
   877  	SubLangYiddishWorld
   878  	// Yoruba Nigeria (yo-NG)
   879  	SubLangYorubaNigeria
   880  	// Zulu South Africa (zu-ZA)
   881  	SubLangZuluSouthAfrica
   882  )
   883  
   884  const (
   885  	maxAllowedEntries = 0x1000
   886  )
   887  
   888  // Predefined Resource Types.
   889  const (
   890  	RTCursor       ResourceType = iota + 1      // Hardware-dependent cursor resource.
   891  	RTBitmap                    = 2             // Bitmap resource.
   892  	RTIcon                      = 3             // Hardware-dependent icon resource.
   893  	RTMenu                      = 4             // Menu resource.
   894  	RTDialog                    = 5             // Dialog box.
   895  	RTString                    = 6             // String-table entry.
   896  	RTFontDir                   = 7             // Font directory resource.
   897  	RTFont                      = 8             // Font resource.
   898  	RTAccelerator               = 9             // Accelerator table.
   899  	RTRCdata                    = 10            // Application-defined resource (raw data).
   900  	RTMessageTable              = 11            // Message-table entry.
   901  	RTGroupCursor               = RTCursor + 11 // Hardware-independent cursor resource.
   902  	RTGroupIcon                 = RTIcon + 11   // Hardware-independent icon resource.
   903  	RTVersion                   = 16            // Version resource.
   904  	RTDlgInclude                = 17            // Dialog include entry.
   905  	RTPlugPlay                  = 19            // Plug and Play resource.
   906  	RTVxD                       = 20            // VXD.
   907  	RTAniCursor                 = 21            // Animated cursor.
   908  	RTAniIcon                   = 22            // Animated icon.
   909  	RTHtml                      = 23            // HTML resource.
   910  	RTManifest                  = 24            // Side-by-Side Assembly Manifest.
   911  )
   912  
   913  // ImageResourceDirectory represents the IMAGE_RESOURCE_DIRECTORY.
   914  // This data structure should be considered the heading of a table because the
   915  // table actually consists of directory entries.
   916  type ImageResourceDirectory struct {
   917  	// Resource flags. This field is reserved for future use. It is currently
   918  	// set to zero.
   919  	Characteristics uint32 `json:"characteristics"`
   920  
   921  	// The time that the resource data was created by the resource compiler.
   922  	TimeDateStamp uint32 `json:"time_date_stamp"`
   923  
   924  	// The major version number, set by the user.
   925  	MajorVersion uint16 `json:"major_version"`
   926  
   927  	// The minor version number, set by the user.
   928  	MinorVersion uint16 `json:"minor_version"`
   929  
   930  	// The number of directory entries immediately following the table that use
   931  	// strings to identify Type, Name, or Language entries (depending on the
   932  	// level of the table).
   933  	NumberOfNamedEntries uint16 `json:"number_of_named_entries"`
   934  
   935  	// The number of directory entries immediately following the Name entries
   936  	// that use numeric IDs for Type, Name, or Language entries.
   937  	NumberOfIDEntries uint16 `json:"number_of_id_entries"`
   938  }
   939  
   940  // ImageResourceDirectoryEntry represents an entry in the resource directory
   941  // entries.
   942  type ImageResourceDirectoryEntry struct {
   943  	// Name is used to identify either a type of resource, a resource name, or a
   944  	// resource's language ID.
   945  	Name uint32 `json:"name"`
   946  
   947  	// OffsetToData is always used to point to a sibling in the tree, either a
   948  	// directory node or a leaf node.
   949  	OffsetToData uint32 `json:"offset_to_data"`
   950  }
   951  
   952  // ImageResourceDataEntry Each Resource Data entry describes an actual unit of
   953  // raw data in the Resource Data area.
   954  type ImageResourceDataEntry struct {
   955  	// The address of a unit of resource data in the Resource Data area.
   956  	OffsetToData uint32 `json:"offset_to_data"`
   957  
   958  	// The size, in bytes, of the resource data that is pointed to by the Data
   959  	// RVA field.
   960  	Size uint32 `json:"size"`
   961  
   962  	// The code page that is used to decode code point values within the
   963  	// resource data. Typically, the code page would be the Unicode code page.
   964  	CodePage uint32 `json:"code_page"`
   965  
   966  	// Reserved, must be 0.
   967  	Reserved uint32 `json:"reserved"`
   968  }
   969  
   970  // ResourceDirectory represents resource directory information.
   971  type ResourceDirectory struct {
   972  	// IMAGE_RESOURCE_DIRECTORY structure.
   973  	Struct ImageResourceDirectory `json:"struct"`
   974  
   975  	// list of entries.
   976  	Entries []ResourceDirectoryEntry `json:"entries"`
   977  }
   978  
   979  // ResourceDirectoryEntry represents a resource directory entry.
   980  type ResourceDirectoryEntry struct {
   981  	// IMAGE_RESOURCE_DIRECTORY_ENTRY structure.
   982  	Struct ImageResourceDirectoryEntry `json:"struct"`
   983  
   984  	// If the resource is identified by name this attribute will contain the
   985  	// name string. Empty string otherwise. If identified by id, the id is
   986  	// available at `ID` field.
   987  	Name string `json:"name"`
   988  
   989  	// The resource identifier.
   990  	ID uint32 `json:"id"`
   991  
   992  	// IsResourceDir tell us if the entry is pointing to a resource directory or
   993  	// a resource data entry.
   994  	IsResourceDir bool `json:"is_resource_dir"`
   995  
   996  	// If this entry has a lower level directory this attribute will point to
   997  	// the ResourceDirData instance representing it.
   998  	Directory ResourceDirectory `json:"directory"`
   999  
  1000  	// If this entry has no further lower directories and points to the actual
  1001  	// resource data, this attribute will reference the corresponding
  1002  	// ResourceDataEntry instance.
  1003  	Data ResourceDataEntry `json:"data"`
  1004  }
  1005  
  1006  // ResourceDataEntry represents a resource data entry.
  1007  type ResourceDataEntry struct {
  1008  
  1009  	// IMAGE_RESOURCE_DATA_ENTRY structure.
  1010  	Struct ImageResourceDataEntry `json:"struct"`
  1011  
  1012  	// Primary language ID.
  1013  	Lang ResourceLang `json:"lang"`
  1014  
  1015  	// Sub language ID.
  1016  	SubLang ResourceSubLang `json:"sub_lang"`
  1017  }
  1018  
  1019  func (pe *File) parseResourceDataEntry(rva uint32) ImageResourceDataEntry {
  1020  	dataEntry := ImageResourceDataEntry{}
  1021  	dataEntrySize := uint32(binary.Size(dataEntry))
  1022  	offset := pe.GetOffsetFromRva(rva)
  1023  	err := pe.structUnpack(&dataEntry, offset, dataEntrySize)
  1024  	if err != nil {
  1025  		pe.logger.Warnf("Error parsing a resource directory data entry, the RVA is invalid")
  1026  	}
  1027  	return dataEntry
  1028  }
  1029  
  1030  func (pe *File) parseResourceDirectoryEntry(rva uint32) *ImageResourceDirectoryEntry {
  1031  	resource := ImageResourceDirectoryEntry{}
  1032  	resourceSize := uint32(binary.Size(resource))
  1033  	offset := pe.GetOffsetFromRva(rva)
  1034  	err := pe.structUnpack(&resource, offset, resourceSize)
  1035  	if err != nil {
  1036  		return nil
  1037  	}
  1038  
  1039  	if resource == (ImageResourceDirectoryEntry{}) {
  1040  		return nil
  1041  	}
  1042  
  1043  	// resource.NameOffset = resource.Name & 0x7FFFFFFF
  1044  
  1045  	// resource.__pad = resource.Name & 0xFFFF0000
  1046  	// resource.Id = resource.Name & 0x0000FFFF
  1047  
  1048  	// resource.DataIsDirectory = (resource.OffsetToData & 0x80000000) >> 31
  1049  	// resource.OffsetToDirectory = resource.OffsetToData & 0x7FFFFFFF
  1050  
  1051  	return &resource
  1052  }
  1053  
  1054  // Navigating the resource directory hierarchy is like navigating a hard disk.
  1055  // There's a master directory (the root directory), which has subdirectories.
  1056  // The subdirectories have subdirectories of their own that may point to the
  1057  // raw resource data for things like dialog templates.
  1058  func (pe *File) doParseResourceDirectory(rva, size, baseRVA, level uint32,
  1059  	dirs []uint32) (ResourceDirectory, error) {
  1060  
  1061  	resourceDir := ImageResourceDirectory{}
  1062  	resourceDirSize := uint32(binary.Size(resourceDir))
  1063  	offset := pe.GetOffsetFromRva(rva)
  1064  	err := pe.structUnpack(&resourceDir, offset, resourceDirSize)
  1065  	if err != nil {
  1066  		return ResourceDirectory{}, err
  1067  	}
  1068  
  1069  	if baseRVA == 0 {
  1070  		baseRVA = rva
  1071  	}
  1072  
  1073  	if len(dirs) == 0 {
  1074  		dirs = append(dirs, rva)
  1075  	}
  1076  
  1077  	// Advance the RVA to the position immediately following the directory
  1078  	// table header and pointing to the first entry in the table.
  1079  	rva += resourceDirSize
  1080  
  1081  	numberOfEntries := int(resourceDir.NumberOfNamedEntries +
  1082  		resourceDir.NumberOfIDEntries)
  1083  	var dirEntries []ResourceDirectoryEntry
  1084  
  1085  	// Set a hard limit on the maximum reasonable number of entries.
  1086  	if numberOfEntries > maxAllowedEntries {
  1087  		pe.logger.Warnf(`Error parsing the resources directory.
  1088  		 The directory contains %d entries`, numberOfEntries)
  1089  		return ResourceDirectory{}, nil
  1090  	}
  1091  
  1092  	for i := 0; i < numberOfEntries; i++ {
  1093  		res := pe.parseResourceDirectoryEntry(rva)
  1094  		if res == nil {
  1095  			pe.logger.Warn("Error parsing a resource directory entry, the RVA is invalid")
  1096  			break
  1097  		}
  1098  
  1099  		nameIsString := (res.Name & 0x80000000) >> 31
  1100  		entryName := ""
  1101  		entryID := uint32(0)
  1102  		if nameIsString == 0 {
  1103  			entryID = res.Name
  1104  		} else {
  1105  			nameOffset := res.Name & 0x7FFFFFFF
  1106  			uStringOffset := pe.GetOffsetFromRva(baseRVA + nameOffset)
  1107  			maxLen, err := pe.ReadUint16(uStringOffset)
  1108  			if err != nil {
  1109  				break
  1110  			}
  1111  			entryName = pe.readUnicodeStringAtRVA(baseRVA+nameOffset+2,
  1112  				uint32(maxLen*2))
  1113  		}
  1114  
  1115  		// A directory entry points to either another resource directory or to
  1116  		// the data for an individual resource. When the directory entry points
  1117  		// to another resource directory, the high bit of the second DWORD in
  1118  		// the structure is set and the remaining 31 bits are an offset to the
  1119  		// resource directory.
  1120  		dataIsDirectory := (res.OffsetToData & 0x80000000) >> 31
  1121  
  1122  		// The offset is relative to the beginning of the resource section,
  1123  		// not an RVA.
  1124  		OffsetToDirectory := res.OffsetToData & 0x7FFFFFFF
  1125  		if dataIsDirectory > 0 {
  1126  			// One trick malware can do is to recursively reference
  1127  			// the next directory. This causes hilarity to ensue when
  1128  			// trying to parse everything correctly.
  1129  			// If the original RVA given to this function is equal to
  1130  			// the next one to parse, we assume that it's a trick.
  1131  			// Instead of raising a PEFormatError this would skip some
  1132  			// reasonable data so we just break.
  1133  			// 9ee4d0a0caf095314fd7041a3e4404dc is the offending sample.
  1134  			if intInSlice(baseRVA+OffsetToDirectory, dirs) {
  1135  				break
  1136  			}
  1137  
  1138  			level++
  1139  			dirs = append(dirs, baseRVA+OffsetToDirectory)
  1140  			directoryEntry, _ := pe.doParseResourceDirectory(
  1141  				baseRVA+OffsetToDirectory,
  1142  				size-(rva-baseRVA),
  1143  				baseRVA,
  1144  				level,
  1145  				dirs)
  1146  
  1147  			dirEntries = append(dirEntries, ResourceDirectoryEntry{
  1148  				Struct:        *res,
  1149  				Name:          entryName,
  1150  				ID:            entryID,
  1151  				IsResourceDir: true,
  1152  				Directory:     directoryEntry})
  1153  		} else {
  1154  			// data is entry
  1155  			dataEntryStruct := pe.parseResourceDataEntry(baseRVA +
  1156  				OffsetToDirectory)
  1157  			entryData := ResourceDataEntry{
  1158  				Struct:  dataEntryStruct,
  1159  				Lang:    ResourceLang(res.Name & 0x3ff),
  1160  				SubLang: ResourceSubLang(res.Name >> 10),
  1161  			}
  1162  
  1163  			dirEntries = append(dirEntries, ResourceDirectoryEntry{
  1164  				Struct:        *res,
  1165  				Name:          entryName,
  1166  				ID:            entryID,
  1167  				IsResourceDir: false,
  1168  				Data:          entryData})
  1169  		}
  1170  
  1171  		rva += uint32(binary.Size(res))
  1172  	}
  1173  
  1174  	return ResourceDirectory{
  1175  		Struct:  resourceDir,
  1176  		Entries: dirEntries,
  1177  	}, nil
  1178  }
  1179  
  1180  // The resource directory contains resources like dialog templates, icons,
  1181  // and bitmaps. The resources are found in a section called .rsrc section.
  1182  func (pe *File) parseResourceDirectory(rva, size uint32) error {
  1183  	var dirs []uint32
  1184  	Resources, err := pe.doParseResourceDirectory(rva, size, 0, 0, dirs)
  1185  	if err != nil {
  1186  		return err
  1187  	}
  1188  
  1189  	pe.Resources = Resources
  1190  	pe.HasResource = true
  1191  	return err
  1192  }
  1193  
  1194  // String stringify the resource type.
  1195  func (rt ResourceType) String() string {
  1196  
  1197  	rsrcTypeMap := map[ResourceType]string{
  1198  		RTCursor:       "Cursor",
  1199  		RTBitmap:       "Bitmap",
  1200  		RTIcon:         "Icon",
  1201  		RTMenu:         "Menu",
  1202  		RTDialog:       "Dialog box",
  1203  		RTString:       "String",
  1204  		RTFontDir:      "Font directory",
  1205  		RTFont:         "Font",
  1206  		RTAccelerator:  "Accelerator",
  1207  		RTRCdata:       "RC Data",
  1208  		RTMessageTable: "Message Table",
  1209  		RTGroupCursor:  "Group Cursor",
  1210  		RTGroupIcon:    "Group Icon",
  1211  		RTVersion:      "Version",
  1212  		RTDlgInclude:   "Dialog Include",
  1213  		RTPlugPlay:     "Plug & Play",
  1214  		RTVxD:          "VxD",
  1215  		RTAniCursor:    "Animated Cursor",
  1216  		RTAniIcon:      "Animated Icon",
  1217  		RTHtml:         "HTML",
  1218  		RTManifest:     "Manifest",
  1219  	}
  1220  
  1221  	if val, ok := rsrcTypeMap[rt]; ok {
  1222  		return val
  1223  	}
  1224  
  1225  	return "?"
  1226  }
  1227  
  1228  // String stringify the resource language.
  1229  func (lang ResourceLang) String() string {
  1230  
  1231  	rsrcLangMap := map[ResourceLang]string{
  1232  		LangAfrikaans:         "Afrikaans (af)",
  1233  		LangAlbanian:          "Albanian (sq)",
  1234  		LangAlsatian:          "Alsatian (gsw)",
  1235  		LangAmharic:           "Amharic (am)",
  1236  		LangArabic:            "Arabic (ar)",
  1237  		LangArmenian:          "Armenian (hy)",
  1238  		LangAssamese:          "Assamese (as)",
  1239  		LangAzerbaijaniLatin:  "Azerbaijani (Latin) (az)",
  1240  		LangBangla:            "Bangla (bn)",
  1241  		LangBashkir:           "Bashkir (ba)",
  1242  		LangBasque:            "Basque (eu)",
  1243  		LangBelarusian:        "Belarusian (be)",
  1244  		LangBosnianLatin:      "Bosnian (Latin) (bs)",
  1245  		LangBreton:            "Breton (br)",
  1246  		LangBulgarian:         "Bulgarian (bg)",
  1247  		LangBurmese:           "Burmese (my)",
  1248  		LangCatalan:           "Catalan (ca)",
  1249  		LangCentralKurdish:    "Central Kurdish (ku)",
  1250  		LangCherokee:          "Cherokee (chr)",
  1251  		LangChineseSimplified: "Chinese (Simplified) (zh)",
  1252  		LangCorsican:          "Corsican (co)",
  1253  		LangCroatian:          "Croatian (hr)",
  1254  		LangCzech:             "Czech (cs)",
  1255  		LangDanish:            "Danish (da)",
  1256  		LangDari:              "Dari (prs)",
  1257  		LangDivehi:            "Divehi (dv)",
  1258  		LangDutch:             "Dutch (nl)",
  1259  		LangEnglish:           "English (en)",
  1260  		LangEstonian:          "Estonian (et)",
  1261  		LangFaroese:           "Faroese (fo)",
  1262  		LangFilipino:          "Filipino (fil)",
  1263  		LangFinnish:           "Finnish (fi)",
  1264  		LangFrench:            "French (fr)",
  1265  		LangFrisian:           "Frisian (fy)",
  1266  		LangFulah:             "Fulah (ff)",
  1267  		LangFulahLatin:        "Fulah (Latin) (ff-Latn)",
  1268  		LangGalician:          "Galician (gl)",
  1269  		LangGeorgian:          "Georgian (ka)",
  1270  		LangGerman:            "German (de)",
  1271  		LangGreek:             "Greek (el)",
  1272  		LangGreenlandic:       "Greenlandic (kl)",
  1273  		LangGuarani:           "Guarani (gn)",
  1274  		LangGujarati:          "Gujarati (gu)",
  1275  		LangHausaLatin:        "Hausa (Latin) (ha)",
  1276  		LangHawaiian:          "Hawaiian (haw)",
  1277  		LangHebrew:            "Hebrew (he)",
  1278  		LangHindi:             "Hindi (hi)",
  1279  		LangHungarian:         "Hungarian (hu)",
  1280  		LangIcelandic:         "Icelandic (is)",
  1281  		LangIgbo:              "Igbo (ig)",
  1282  		LangIndonesian:        "Indonesian (id)",
  1283  		LangInuktitutLatin:    "Inuktitut (Latin) (iu)",
  1284  		LangIrish:             "Irish (ga)",
  1285  		LangItalian:           "Italian (it)",
  1286  		LangJapanese:          "Japanese (ja)",
  1287  		LangKannada:           "Kannada (kn)",
  1288  		LangKashmiri:          "Kashmiri (ks)",
  1289  		LangKazakh:            "Kazakh (kk)",
  1290  		LangKhmer:             "Khmer (km)",
  1291  		LangKiche:             "K'iche (quc)",
  1292  		LangKinyarwanda:       "Kinyarwanda (rw)",
  1293  		LangKiswahili:         "Kiswahili (sw)",
  1294  		LangKonkani:           "Konkani (kok)",
  1295  		LangKorean:            "Korean (ko)",
  1296  		LangKyrgyz:            "Kyrgyz (ky)",
  1297  		LangLao:               "Lao (lo)",
  1298  		LangLatvian:           "Latvian (lv)",
  1299  		LangLithuanian:        "Lithuanian (lt)",
  1300  		LangLowerSorbian:      "Lower Sorbian (dsb)",
  1301  		LangLuxembourgish:     "Luxembourgish (lb)",
  1302  		LangMacedonian:        "Macedonian (mk)",
  1303  		LangMalay:             "Malay (ms)",
  1304  		LangMalayalam:         "Malayalam (ml)",
  1305  		LangMaltese:           "Maltese (mt)",
  1306  		LangMaori:             "Maori (mi)",
  1307  		LangMapudungun:        "Mapudungun (arn)",
  1308  		LangMarathi:           "Marathi (mr)",
  1309  		LangMohawk:            "Mohawk (moh)",
  1310  		LangMongolianCyrillic: "Mongolian (Cyrillic) (mn)",
  1311  		LangNepali:            "Nepali (ne)",
  1312  		LangNorwegianBokmalNo: "Norwegian (Bokmal) (no)",
  1313  		LangNorwegianBokmal:   "Norwegian (Bokmal) (nb)",
  1314  		LangNorwegianNynorsk:  "Norwegian (Nynorsk) (nn)",
  1315  		LangOccitan:           "Occitan (oc)",
  1316  		LangOdia:              "Odia (or)",
  1317  		LangOromo:             "Oromo (om)",
  1318  		LangPashto:            "Pashto (ps)",
  1319  		LangPersian:           "Persian (fa)",
  1320  		LangPolish:            "Polish (pl)",
  1321  		LangPortuguese:        "Portuguese (pt)",
  1322  		LangPunjabi:           "Punjabi (pa)",
  1323  		LangQuechua:           "Quechua (quz)",
  1324  		LangRomanian:          "Romanian (ro)",
  1325  		LangRomansh:           "Romansh (rm)",
  1326  		LangRussian:           "Russian (ru)",
  1327  		LangSakha:             "Sakha (sah)",
  1328  		LangSamiInari:         "Sami (Inari) (smn)",
  1329  		LangSamiLule:          "Sami (Lule) (smj)",
  1330  		LangSamiNorthern:      "Sami (Northern) (se)",
  1331  		LangSamiSkolt:         "Sami (Skolt) (sms)",
  1332  		LangSamiSouthern:      "Sami (Southern) (sma)",
  1333  		LangSanskrit:          "Sanskrit (sa)",
  1334  		LangScottishGaelic:    "Scottish Gaelic (gd)",
  1335  		LangSerbianLatin:      "Serbian (Latin) (sr)",
  1336  		LangSesothoSaLeboa:    "Sesotho Sa Leboa (nso)",
  1337  		LangSetswana:          "Setswana (tn)",
  1338  		LangSindhi:            "Sindhi (sd)",
  1339  		LangSinhala:           "Sinhala (si)",
  1340  		LangSlovak:            "Slovak (sk)",
  1341  		LangSlovenian:         "Slovenian (sl)",
  1342  		LangSomali:            "Somali (so)",
  1343  		LangSotho:             "Sotho (st)",
  1344  		LangSpanish:           "Spanish (es)",
  1345  		LangSwedish:           "Swedish (sv)",
  1346  		LangSyriac:            "Syriac (syr)",
  1347  		LangTajikCyrillic:     "Tajik (Cyrillic) (tg)",
  1348  		LangTamazightLatin:    "Tamazight (Latin) (tzm)",
  1349  		LangTamil:             "Tamil (ta)",
  1350  		LangTatar:             "Tatar (tt)",
  1351  		LangTelugu:            "Telugu (te)",
  1352  		LangThai:              "Thai (th)",
  1353  		LangTibetan:           "Tibetan (bo)",
  1354  		LangTigrinya:          "Tigrinya (ti)",
  1355  		LangTsonga:            "Tsonga (ts)",
  1356  		LangTurkish:           "Turkish (tr)",
  1357  		LangTurkmen:           "Turkmen (tk)",
  1358  		LangUkrainian:         "Ukrainian (uk)",
  1359  		LangUpperSorbian:      "Upper Sorbian (hsb)",
  1360  		LangUrdu:              "Urdu (ur)",
  1361  		LangUyghur:            "Uyghur (ug)",
  1362  		LangUzbekLatin:        "Uzbek (Latin) (uz)",
  1363  		LangVenda:             "Venda (ve)",
  1364  		LangVietnamese:        "Vietnamese (vi)",
  1365  		LangWelsh:             "Welsh (cy)",
  1366  		LangWolof:             "Wolof (wo)",
  1367  		LangXhosa:             "Xhosa (xh)",
  1368  		LangYi:                "Yi (ii)",
  1369  		LangYoruba:            "Yoruba (yo)",
  1370  		LangZulu:              "Zulu (zu)",
  1371  	}
  1372  
  1373  	if val, ok := rsrcLangMap[lang]; ok {
  1374  		return val
  1375  	}
  1376  
  1377  	return "?"
  1378  }
  1379  
  1380  // String stringify the resource sub language.
  1381  func (subLang ResourceSubLang) String() string {
  1382  
  1383  	rsrcSubLangMap := map[ResourceSubLang]string{
  1384  		SubLangAfrikaansSouthAfrica:                    "Afrikaans South Africa (af-ZA)",
  1385  		SubLangAlbanianAlbania:                         "Albanian Albania (sq-AL)",
  1386  		SubLangAlsatianFrance:                          "Alsatian France (gsw-FR)",
  1387  		SubLangAmharicEthiopia:                         "Amharic Ethiopia (am-ET)",
  1388  		SubLangArabicAlgeria:                           "Arabic Algeria (ar-DZ)",
  1389  		SubLangArabicBahrain:                           "Arabic Bahrain (ar-BH)",
  1390  		SubLangArabicEgypt:                             "Arabic Egypt (ar-EG)",
  1391  		SubLangArabicIraq:                              "Arabic Iraq (ar-IQ)",
  1392  		SubLangArabicJordan:                            "Arabic Jordan (ar-JO)",
  1393  		SubLangArabicKuwait:                            "Arabic Kuwait (ar-KW)",
  1394  		SubLangArabicLebanon:                           "Arabic Lebanon (ar-LB)",
  1395  		SubLangArabicLibya:                             "Arabic Libya (ar-LY)",
  1396  		SubLangArabicMorocco:                           "Arabic Morocco (ar-MA)",
  1397  		SubLangArabicOman:                              "Arabic Oman (ar-OM)",
  1398  		SubLangArabicQatar:                             "Arabic Qatar (ar-QA)",
  1399  		SubLangArabicSaudiArabia:                       "Arabic Saudi Arabia (ar-SA)",
  1400  		SubLangArabicSyria:                             "Arabic Syria (ar-SY)",
  1401  		SubLangArabicTunisia:                           "Arabic Tunisia (ar-TN)",
  1402  		SubLangArabicUae:                               "Arabic U.a.e. (ar-AE)",
  1403  		SubLangArabicYemen:                             "Arabic Yemen (ar-YE)",
  1404  		SubLangArmenianArmenia:                         "Armenian Armenia (hy-AM)",
  1405  		SubLangAssameseIndia:                           "Assamese India (as-IN)",
  1406  		SubLangAzerbaijaniCyrillic:                     "Azerbaijani (Cyrillic) (az-Cyrl)",
  1407  		SubLangAzerbaijaniCyrillicAzerbaijan:           "Azerbaijani (Cyrillic) Azerbaijan (az-Cyrl-AZ)",
  1408  		SubLangAzerbaijaniLatin:                        "Azerbaijani (Latin) (az-Latn)",
  1409  		SubLangAzerbaijaniLatinAzerbaijan:              "Azerbaijani (Latin) Azerbaijan (az-Latn-AZ)",
  1410  		SubLangBanglaBangladesh:                        "Bangla Bangladesh (bn-BD)",
  1411  		SubLangBanglaIndia:                             "Bangla India (bn-IN)",
  1412  		SubLangBashkirRussia:                           "Bashkir Russia (ba-RU)",
  1413  		SubLangBasqueSpain:                             "Basque Spain (eu-ES)",
  1414  		SubLangBelarusianBelarus:                       "Belarusian Belarus (be-BY)",
  1415  		SubLangBosnianCyrillic:                         "Bosnian (Cyrillic) (bs-Cyrl)",
  1416  		SubLangBosnianCyrillicBosniaAndHerzegovina:     "Bosnian (Cyrillic) Bosnia And Herzegovina (bs-Cyrl-BA)",
  1417  		SubLangBosnianLatin:                            "Bosnian (Latin) (bs-Latn)",
  1418  		SubLangBosnianLatinBosniaAndHerzegovina:        "Bosnian (Latin) Bosnia And Herzegovina (bs-Latn-BA)",
  1419  		SubLangBretonFrance:                            "Breton France (br-FR)",
  1420  		SubLangBulgarianBulgaria:                       "Bulgarian Bulgaria (bg-BG)",
  1421  		SubLangBurmeseMyanmar:                          "Burmese Myanmar (my-MM)",
  1422  		SubLangCatalanSpain:                            "Catalan Spain (ca-ES)",
  1423  		SubLangCentralAtlasTamazightArabicMorocco:      "Central Atlas Tamazight (Arabic) Morocco (tzm-ArabMA)",
  1424  		SubLangCentralKurdish:                          "Central Kurdish (ku-Arab)",
  1425  		SubLangCentralKurdishIraq:                      "Central Kurdish Iraq (ku-Arab-IQ)",
  1426  		SubLangCherokee:                                "Cherokee (chr-Cher)",
  1427  		SubLangCherokeeUnitedStates:                    "Cherokee United States (chr-Cher-US)",
  1428  		SubLangChineseSimplified:                       "Chinese (Simplified) (zh-Hans)",
  1429  		SubLangChineseSimplifiedPeoplesRepublicOfChina: "Chinese (Simplified) People's Republic Of China (zh-CN)",
  1430  		SubLangChineseSimplifiedSingapore:              "Chinese (Simplified) Singapore (zh-SG)",
  1431  		SubLangChineseTraditional:                      "Chinese (Traditional) (zh-Hant)",
  1432  		SubLangChineseTraditionalHongKongSar:           "Chinese (Traditional) Hong Kong S.a.r. (zh-HK)",
  1433  		SubLangChineseTraditionalMacaoSar:              "Chinese (Traditional) Macao S.a.r. (zh-MO)",
  1434  		SubLangChineseTraditionalTaiwan:                "Chinese (Traditional) Taiwan (zh-TW)",
  1435  		SubLangCorsicanFrance:                          "Corsican France (co-FR)",
  1436  		SubLangCroatianCroatia:                         "Croatian Croatia (hr-HR)",
  1437  		SubLangCroatianLatinBosniaAndHerzegovina:       "Croatian (Latin) Bosnia And Herzegovina (hr-BA)",
  1438  		SubLangCzechCzechRepublic:                      "Czech Czech Republic (cs-CZ)",
  1439  		SubLangDanishDenmark:                           "Danish Denmark (da-DK)",
  1440  		SubLangDariAfghanistan:                         "Dari Afghanistan (prs-AF)",
  1441  		SubLangDivehiMaldives:                          "Divehi Maldives (dv-MV)",
  1442  		SubLangDutchBelgium:                            "Dutch Belgium (nl-BE)",
  1443  		SubLangDutchNetherlands:                        "Dutch Netherlands (nl-NL)",
  1444  		SubLangDzongkhaBhutan:                          "Dzongkha Bhutan (dz-BT)",
  1445  		SubLangEnglishAustralia:                        "English Australia (en-AU)",
  1446  		SubLangEnglishBelize:                           "English Belize (en-BZ)",
  1447  		SubLangEnglishCanada:                           "English Canada (en-CA)",
  1448  		SubLangEnglishCaribbean:                        "English Caribbean (en-029)",
  1449  		SubLangEnglishHongKong:                         "English Hong Kong (en-HK)",
  1450  		SubLangEnglishIndia:                            "English India (en-IN)",
  1451  		SubLangEnglishIreland:                          "English Ireland (en-IE)",
  1452  		SubLangEnglishJamaica:                          "English Jamaica (en-JM)",
  1453  		SubLangEnglishMalaysia:                         "English Malaysia (en-MY)",
  1454  		SubLangEnglishNewZealand:                       "English New Zealand (en-NZ)",
  1455  		SubLangEnglishRepublicOfThePhilippines:         "English Republic Of The Philippines (en-PH)",
  1456  		SubLangEnglishSingapore:                        "English Singapore (en-SG)",
  1457  		SubLangEnglishSouthAfrica:                      "English South Africa (en-ZA)",
  1458  		SubLangEnglishTrinidadAndTobago:                "English Trinidad And Tobago (en-TT)",
  1459  		SubLangEnglishUnitedArabEmirates:               "English United Arab Emirates (en-AE)",
  1460  		SubLangEnglishUnitedKingdom:                    "English United Kingdom (en-GB)",
  1461  		SubLangEnglishUnitedStates:                     "English United States (en-US)",
  1462  		SubLangEnglishZimbabwe:                         "English Zimbabwe (en-ZW)",
  1463  		SubLangEstonianEstonia:                         "Estonian Estonia (et-EE)",
  1464  		SubLangFaroeseFaroeIslands:                     "Faroese Faroe Islands (fo-FO)",
  1465  		SubLangFilipinoPhilippines:                     "Filipino Philippines (fil-PH)",
  1466  		SubLangFinnishFinland:                          "Finnish Finland (fi-FI)",
  1467  		SubLangFrenchBelgium:                           "French Belgium (fr-BE)",
  1468  		SubLangFrenchCameroon:                          "French Cameroon (fr-CM)",
  1469  		SubLangFrenchCanada:                            "French Canada (fr-CA)",
  1470  		SubLangFrenchCaribbean:                         "French Caribbean (fr-029)",
  1471  		SubLangFrenchCongoDrc:                          "French Congo, Drc (fr-CD)",
  1472  		SubLangFrenchCôteDivoire:                       "French Côte D'ivoire (fr-CI)",
  1473  		SubLangFrenchFrance:                            "French France (fr-FR)",
  1474  		SubLangFrenchHaiti:                             "French Haiti (fr-HT)",
  1475  		SubLangFrenchLuxembourg:                        "French Luxembourg (fr-LU)",
  1476  		SubLangFrenchMali:                              "French Mali (fr-ML)",
  1477  		SubLangFrenchMorocco:                           "French Morocco (fr-MA)",
  1478  		SubLangFrenchPrincipalityOfMonaco:              "French Principality Of Monaco (fr-MC)",
  1479  		SubLangFrenchReunion:                           "French Reunion (fr-RE)",
  1480  		SubLangFrenchSenegal:                           "French Senegal (fr-SN)",
  1481  		SubLangFrenchSwitzerland:                       "French Switzerland (fr-CH)",
  1482  		SubLangFrisianNetherlands:                      "Frisian Netherlands (fy-NL)",
  1483  		SubLangFulahNigeria:                            "Fulah Nigeria (ff-NG)",
  1484  		SubLangFulahLatinNigeria:                       "Fulah (Latin) Nigeria (ff-Latn-NG)",
  1485  		SubLangFulahSenegal:                            "Fulah Senegal (ff-Latn-SN)",
  1486  		SubLangGalicianSpain:                           "Galician Spain (gl-ES)",
  1487  		SubLangGeorgianGeorgia:                         "Georgian Georgia (ka-GE)",
  1488  		SubLangGermanAustria:                           "German Austria (de-AT)",
  1489  		SubLangGermanGermany:                           "German Germany (de-DE)",
  1490  		SubLangGermanLiechtenstein:                     "German Liechtenstein (de-LI)",
  1491  		SubLangGermanLuxembourg:                        "German Luxembourg (de-LU)",
  1492  		SubLangGermanSwitzerland:                       "German Switzerland (de-CH)",
  1493  		SubLangGreekGreece:                             "Greek Greece (el-GR)",
  1494  		SubLangGreenlandicGreenland:                    "Greenlandic Greenland (kl-GL)",
  1495  		SubLangGuaraniParaguay:                         "Guarani Paraguay (gn-PY)",
  1496  		SubLangGujaratiIndia:                           "Gujarati India (gu-IN)",
  1497  		SubLangHausaLatin:                              "Hausa (Latin) (ha-Latn)",
  1498  		SubLangHausaLatinNigeria:                       "Hausa (Latin) Nigeria (ha-Latn-NG)",
  1499  		SubLangHawaiianUnitedStates:                    "Hawaiian United States (haw-US)",
  1500  		SubLangHebrewIsrael:                            "Hebrew Israel (he-IL)",
  1501  		SubLangHindiIndia:                              "Hindi India (hi-IN)",
  1502  		SubLangHungarianHungary:                        "Hungarian Hungary (hu-HU)",
  1503  		SubLangIcelandicIceland:                        "Icelandic Iceland (is-IS)",
  1504  		SubLangIgboNigeria:                             "Igbo Nigeria (ig-NG)",
  1505  		SubLangIndonesianIndonesia:                     "Indonesian Indonesia (id-ID)",
  1506  		SubLangInuktitutLatin:                          "Inuktitut (Latin) (iu-Latn)",
  1507  		SubLangInuktitutLatinCanada:                    "Inuktitut (Latin) Canada (iu-Latn-CA)",
  1508  		SubLangInuktitutSyllabics:                      "Inuktitut (Syllabics) (iu-Cans)",
  1509  		SubLangInuktitutSyllabicsCanada:                "Inuktitut (Syllabics) Canada (iu-Cans-CA)",
  1510  		SubLangIrishIreland:                            "Irish Ireland (ga-IE)",
  1511  		SubLangItalianItaly:                            "Italian Italy (it-IT)",
  1512  		SubLangItalianSwitzerland:                      "Italian Switzerland (it-CH)",
  1513  		SubLangJapaneseJapan:                           "Japanese Japan (ja-JP)",
  1514  		SubLangKannadaIndia:                            "Kannada India (kn-IN)",
  1515  		SubLangKanuriLatinNigeria:                      "Kanuri (Latin) Nigeria (kr-Latn-NG)",
  1516  		SubLangKashmiriPersoArabic:                     "Kashmiri Perso-Arabic (ks-Arab)",
  1517  		SubLangKashmiriDevanagariIndia:                 "Kashmiri (Devanagari) India (ks-Deva-IN)",
  1518  		SubLangKazakhKazakhstan:                        "Kazakh Kazakhstan (kk-KZ)",
  1519  		SubLangKhmerCambodia:                           "Khmer Cambodia (km-KH)",
  1520  		SubLangKicheGuatemala:                          "K'iche Guatemala (quc-Latn-GT)",
  1521  		SubLangKinyarwandaRwanda:                       "Kinyarwanda Rwanda (rw-RW)",
  1522  		SubLangKiswahiliKenya:                          "Kiswahili Kenya (sw-KE)",
  1523  		SubLangKonkaniIndia:                            "Konkani India (kok-IN)",
  1524  		SubLangKoreanKorea:                             "Korean Korea (ko-KR)",
  1525  		SubLangKyrgyzKyrgyzstan:                        "Kyrgyz Kyrgyzstan (ky-KG)",
  1526  		SubLangLaoLaoPdr:                               "Lao Lao P.d.r. (lo-LA)",
  1527  		SubLangLatinVaticanCity:                        "Latin Vatican City (la-VA)",
  1528  		SubLangLatvianLatvia:                           "Latvian Latvia (lv-LV)",
  1529  		SubLangLithuanianLithuania:                     "Lithuanian Lithuania (lt-LT)",
  1530  		SubLangLowerSorbianGermany:                     "Lower Sorbian Germany (dsb-DE)",
  1531  		SubLangLuxembourgishLuxembourg:                 "Luxembourgish Luxembourg (lb-LU)",
  1532  		SubLangMacedonianNorthMacedonia:                "Macedonian North Macedonia (mk-MK)",
  1533  		SubLangMalayBruneiDarussalam:                   "Malay Brunei Darussalam (ms-BN)",
  1534  		SubLangMalayMalaysia:                           "Malay Malaysia (ms-MY)",
  1535  		SubLangMalayalamIndia:                          "Malayalam India (ml-IN)",
  1536  		SubLangMalteseMalta:                            "Maltese Malta (mt-MT)",
  1537  		SubLangMaoriNewZealand:                         "Maori New Zealand (mi-NZ)",
  1538  		SubLangMapudungunChile:                         "Mapudungun Chile (arn-CL)",
  1539  		SubLangMarathiIndia:                            "Marathi India (mr-IN)",
  1540  		SubLangMohawkCanada:                            "Mohawk Canada (moh-CA)",
  1541  		SubLangMongolianCyrillic:                       "Mongolian (Cyrillic) (mn-Cyrl)",
  1542  		SubLangMongolianCyrillicMongolia:               "Mongolian (Cyrillic) Mongolia (mn-MN)",
  1543  		SubLangMongolianTraditionalMongolian:           "Mongolian (Traditional Mongolian) (mn-Mong)",
  1544  		SubLangMongolianTraditionalMongolianPeoplesRepublicOfChina: "Mongolian (Traditional Mongolian) People's Republic Of China (mn-MongCN)",
  1545  		SubLangMongolianTraditionalMongolianMongolia:               "Mongolian (Traditional Mongolian) Mongolia (mn-MongMN)",
  1546  		SubLangNepaliIndia:            "Nepali India (ne-IN)",
  1547  		SubLangNepaliNepal:            "Nepali Nepal (ne-NP)",
  1548  		SubLangNorwegianBokmalNorway:  "Norwegian (Bokmal) Norway (nb-NO)",
  1549  		SubLangNorwegianNynorskNorway: "Norwegian (Nynorsk) Norway (nn-NO)",
  1550  		SubLangOccitanFrance:          "Occitan France (oc-FR)",
  1551  		SubLangOdiaIndia:              "Odia India (or-IN)",
  1552  		SubLangOromoEthiopia:          "Oromo Ethiopia (om-ET)",
  1553  		SubLangPashtoAfghanistan:      "Pashto Afghanistan (ps-AF)",
  1554  		SubLangPersianIran:            "Persian Iran (fa-IR)",
  1555  		SubLangPolishPoland:           "Polish Poland (pl-PL)",
  1556  		SubLangPortugueseBrazil:       "Portuguese Brazil (pt-BR)",
  1557  		SubLangPortuguesePortugal:     "Portuguese Portugal (pt-PT)",
  1558  		SubLangPseudoLanguagePseudoLocaleForEastAsianComplexScriptLocalizationTesting: "Pseudo Language Pseudo Locale For East Asian/Complex Script Localization Testing (qps-ploca)",
  1559  		SubLangPseudoLanguagePseudoLocaleUsedForLocalizationTesting:                   "Pseudo Language Pseudo Locale Used For Localization Testing (qps-ploc)",
  1560  		SubLangPseudoLanguagePseudoLocaleUsedForLocalizationTestingOfMirroredLocales:  "Pseudo Language Pseudo Locale Used For Localization Testing Of Mirrored Locales (qps-plocm)",
  1561  		SubLangPunjabi:                                  "Punjabi (pa-Arab)",
  1562  		SubLangPunjabiIndia:                             "Punjabi India (pa-IN)",
  1563  		SubLangPunjabiIslamicRepublicOfPakistan:         "Punjabi Islamic Republic Of Pakistan (pa-Arab-PK)",
  1564  		SubLangQuechuaBolivia:                           "Quechua Bolivia (quz-BO)",
  1565  		SubLangQuechuaEcuador:                           "Quechua Ecuador (quz-EC)",
  1566  		SubLangQuechuaPeru:                              "Quechua Peru (quz-PE)",
  1567  		SubLangRomanianMoldova:                          "Romanian Moldova (ro-MD)",
  1568  		SubLangRomanianRomania:                          "Romanian Romania (ro-RO)",
  1569  		SubLangRomanshSwitzerland:                       "Romansh Switzerland (rm-CH)",
  1570  		SubLangRussianMoldova:                           "Russian Moldova (ru-MD)",
  1571  		SubLangRussianRussia:                            "Russian Russia (ru-RU)",
  1572  		SubLangSakhaRussia:                              "Sakha Russia (sah-RU)",
  1573  		SubLangSamiInariFinland:                         "Sami (Inari) Finland (smn-FI)",
  1574  		SubLangSamiLuleNorway:                           "Sami (Lule) Norway (smj-NO)",
  1575  		SubLangSamiLuleSweden:                           "Sami (Lule) Sweden (smj-SE)",
  1576  		SubLangSamiNorthernFinland:                      "Sami (Northern) Finland (se-FI)",
  1577  		SubLangSamiNorthernNorway:                       "Sami (Northern) Norway (se-NO)",
  1578  		SubLangSamiNorthernSweden:                       "Sami (Northern) Sweden (se-SE)",
  1579  		SubLangSamiSkoltFinland:                         "Sami (Skolt) Finland (sms-FI)",
  1580  		SubLangSamiSouthernNorway:                       "Sami (Southern) Norway (sma-NO)",
  1581  		SubLangSamiSouthernSweden:                       "Sami (Southern) Sweden (sma-SE)",
  1582  		SubLangSanskritIndia:                            "Sanskrit India (sa-IN)",
  1583  		SubLangScottishGaelicUnitedKingdom:              "Scottish Gaelic United Kingdom (gd-GB)",
  1584  		SubLangSerbianCyrillic:                          "Serbian (Cyrillic) (sr-Cyrl)",
  1585  		SubLangSerbianCyrillicBosniaAndHerzegovina:      "Serbian (Cyrillic) Bosnia And Herzegovina (sr-Cyrl-BA)",
  1586  		SubLangSerbianCyrillicMontenegro:                "Serbian (Cyrillic) Montenegro (sr-Cyrl-ME)",
  1587  		SubLangSerbianCyrillicSerbia:                    "Serbian (Cyrillic) Serbia (sr-Cyrl-RS)",
  1588  		SubLangSerbianCyrillicSerbiaAndMontenegroFormer: "Serbian (Cyrillic) Serbia And Montenegro (Former) (sr-Cyrl-CS)",
  1589  		SubLangSerbianLatin:                             "Serbian (Latin) (sr-Latn)",
  1590  		SubLangSerbianLatinBosniaAndHerzegovina:         "Serbian (Latin) Bosnia And Herzegovina (sr-Latn-BA)",
  1591  		SubLangSerbianLatinMontenegro:                   "Serbian (Latin) Montenegro (sr-Latn-ME)",
  1592  		SubLangSerbianLatinSerbia:                       "Serbian (Latin) Serbia (sr-Latn-RS)",
  1593  		SubLangSerbianLatinSerbiaAndMontenegroFormer:    "Serbian (Latin) Serbia And Montenegro (Former) (sr-Latn-CS)",
  1594  		SubLangSesothoSaLeboaSouthAfrica:                "Sesotho Sa Leboa South Africa (nso-ZA)",
  1595  		SubLangSetswanaBotswana:                         "Setswana Botswana (tn-BW)",
  1596  		SubLangSetswanaSouthAfrica:                      "Setswana South Africa (tn-ZA)",
  1597  		SubLangSindhi:                                   "Sindhi (sd-Arab)",
  1598  		SubLangSindhiIslamicRepublicOfPakistan:          "Sindhi Islamic Republic Of Pakistan (sd-Arab-PK)",
  1599  		SubLangSinhalaSriLanka:                          "Sinhala Sri Lanka (si-LK)",
  1600  		SubLangSlovakSlovakia:                           "Slovak Slovakia (sk-SK)",
  1601  		SubLangSlovenianSlovenia:                        "Slovenian Slovenia (sl-SI)",
  1602  		SubLangSomaliSomalia:                            "Somali Somalia (so-SO)",
  1603  		SubLangSothoSouthAfrica:                         "Sotho South Africa (st-ZA)",
  1604  		SubLangSpanishArgentina:                         "Spanish Argentina (es-AR)",
  1605  		SubLangSpanishBolivarianRepublicOfVenezuela:     "Spanish Bolivarian Republic Of Venezuela (es-VE)",
  1606  		SubLangSpanishBolivia:                           "Spanish Bolivia (es-BO)",
  1607  		SubLangSpanishChile:                             "Spanish Chile (es-CL)",
  1608  		SubLangSpanishColombia:                          "Spanish Colombia (es-CO)",
  1609  		SubLangSpanishCostaRica:                         "Spanish Costa Rica (es-CR)",
  1610  		SubLangSpanishCuba:                              "Spanish Cuba (es-CU)",
  1611  		SubLangSpanishDominicanRepublic:                 "Spanish Dominican Republic (es-DO)",
  1612  		SubLangSpanishEcuador:                           "Spanish Ecuador (es-EC)",
  1613  		SubLangSpanishElSalvador:                        "Spanish El Salvador (es-SV)",
  1614  		SubLangSpanishGuatemala:                         "Spanish Guatemala (es-GT)",
  1615  		SubLangSpanishHonduras:                          "Spanish Honduras (es-HN)",
  1616  		SubLangSpanishLatinAmerica:                      "Spanish Latin America (es-419)",
  1617  		SubLangSpanishMexico:                            "Spanish Mexico (es-MX)",
  1618  		SubLangSpanishNicaragua:                         "Spanish Nicaragua (es-NI)",
  1619  		SubLangSpanishPanama:                            "Spanish Panama (es-PA)",
  1620  		SubLangSpanishParaguay:                          "Spanish Paraguay (es-PY)",
  1621  		SubLangSpanishPeru:                              "Spanish Peru (es-PE)",
  1622  		SubLangSpanishPuertoRico:                        "Spanish Puerto Rico (es-PR)",
  1623  		SubLangSpanishSpainTraditional:                  "Spanish Spain (es-ES_tradnl)",
  1624  		SubLangSpanishSpain:                             "Spanish Spain (es-ES)",
  1625  		SubLangSpanishUnitedStates:                      "Spanish United States (es-US)",
  1626  		SubLangSpanishUruguay:                           "Spanish Uruguay (es-UY)",
  1627  		SubLangSwedishFinland:                           "Swedish Finland (sv-FI)",
  1628  		SubLangSwedishSweden:                            "Swedish Sweden (sv-SE)",
  1629  		SubLangSyriacSyria:                              "Syriac Syria (syr-SY)",
  1630  		SubLangTajikCyrillic:                            "Tajik (Cyrillic) (tg-Cyrl)",
  1631  		SubLangTajikCyrillicTajikistan:                  "Tajik (Cyrillic) Tajikistan (tg-Cyrl-TJ)",
  1632  		SubLangTamazightLatin:                           "Tamazight (Latin) (tzm-Latn)",
  1633  		SubLangTamazightLatinAlgeria:                    "Tamazight (Latin) Algeria (tzm-Latn-DZ)",
  1634  		SubLangTamilIndia:                               "Tamil India (ta-IN)",
  1635  		SubLangTamilSriLanka:                            "Tamil Sri Lanka (ta-LK)",
  1636  		SubLangTatarRussia:                              "Tatar Russia (tt-RU)",
  1637  		SubLangTeluguIndia:                              "Telugu India (te-IN)",
  1638  		SubLangThaiThailand:                             "Thai Thailand (th-TH)",
  1639  		SubLangTibetanPeoplesRepublicOfChina:            "Tibetan People's Republic Of China (bo-CN)",
  1640  		SubLangTigrinyaEritrea:                          "Tigrinya Eritrea (ti-ER)",
  1641  		SubLangTigrinyaEthiopia:                         "Tigrinya Ethiopia (ti-ET)",
  1642  		SubLangTsongaSouthAfrica:                        "Tsonga South Africa (ts-ZA)",
  1643  		SubLangTurkishTurkey:                            "Turkish Turkey (tr-TR)",
  1644  		SubLangTurkmenTurkmenistan:                      "Turkmen Turkmenistan (tk-TM)",
  1645  		SubLangUkrainianUkraine:                         "Ukrainian Ukraine (uk-UA)",
  1646  		SubLangUpperSorbianGermany:                      "Upper Sorbian Germany (hsb-DE)",
  1647  		SubLangUrduIndia:                                "Urdu India (ur-IN)",
  1648  		SubLangUrduIslamicRepublicOfPakistan:            "Urdu Islamic Republic Of Pakistan (ur-PK)",
  1649  		SubLangUyghurPeoplesRepublicOfChina:             "Uyghur People's Republic Of China (ug-CN)",
  1650  		SubLangUzbekCyrillic:                            "Uzbek (Cyrillic) (uz-Cyrl)",
  1651  		SubLangUzbekCyrillicUzbekistan:                  "Uzbek (Cyrillic) Uzbekistan (uz-Cyrl-UZ)",
  1652  		SubLangUzbekLatin:                               "Uzbek (Latin) (uz-Latn)",
  1653  		SubLangUzbekLatinUzbekistan:                     "Uzbek (Latin) Uzbekistan (uz-Latn-UZ)",
  1654  		SubLangValencianSpain:                           "Valencian Spain (ca-ESvalencia)",
  1655  		SubLangVendaSouthAfrica:                         "Venda South Africa (ve-ZA)",
  1656  		SubLangVietnameseVietnam:                        "Vietnamese Vietnam (vi-VN)",
  1657  		SubLangWelshUnitedKingdom:                       "Welsh United Kingdom (cy-GB)",
  1658  		SubLangWolofSenegal:                             "Wolof Senegal (wo-SN)",
  1659  		SubLangXhosaSouthAfrica:                         "Xhosa South Africa (xh-ZA)",
  1660  		SubLangYiPeoplesRepublicOfChina:                 "Yi People's Republic Of China (ii-CN)",
  1661  		SubLangYiddishWorld:                             "Yiddish World (yi-001)",
  1662  		SubLangYorubaNigeria:                            "Yoruba Nigeria (yo-NG)",
  1663  		SubLangZuluSouthAfrica:                          "Zulu South Africa (zu-ZA)",
  1664  	}
  1665  
  1666  	if val, ok := rsrcSubLangMap[subLang]; ok {
  1667  		return val
  1668  	}
  1669  
  1670  	return "?"
  1671  }
  1672  
  1673  // PrettyResourceLang prettifies the resource lang and sub lang.
  1674  func PrettyResourceLang(lang ResourceLang, subLang int) string {
  1675  	m := map[ResourceLang]map[int]ResourceSubLang{
  1676  		LangAfrikaans: {
  1677  			0x1: SubLangAfrikaansSouthAfrica,
  1678  		},
  1679  		LangAlbanian: {
  1680  			0x1: SubLangAlbanianAlbania,
  1681  		},
  1682  		LangAlsatian: {
  1683  			0x1: SubLangAlsatianFrance,
  1684  		},
  1685  		LangAmharic: {
  1686  			0x1: SubLangAmharicEthiopia,
  1687  		},
  1688  		LangArabic: {
  1689  			0x5:  SubLangArabicAlgeria,
  1690  			0xf:  SubLangArabicBahrain,
  1691  			0x3:  SubLangArabicEgypt,
  1692  			0x2:  SubLangArabicIraq,
  1693  			0xb:  SubLangArabicJordan,
  1694  			0xd:  SubLangArabicKuwait,
  1695  			0xc:  SubLangArabicLebanon,
  1696  			0x4:  SubLangArabicLibya,
  1697  			0x6:  SubLangArabicMorocco,
  1698  			0x8:  SubLangArabicOman,
  1699  			0x10: SubLangArabicQatar,
  1700  			0x1:  SubLangArabicSaudiArabia,
  1701  			0xa:  SubLangArabicSyria,
  1702  			0x7:  SubLangArabicTunisia,
  1703  			0xe:  SubLangArabicUae,
  1704  			0x9:  SubLangArabicYemen,
  1705  		},
  1706  		LangArmenian: {
  1707  			0x1: SubLangArmenianArmenia,
  1708  		},
  1709  		LangAssamese: {
  1710  			0x1:  SubLangAssameseIndia,
  1711  			0x1d: SubLangAzerbaijaniCyrillic,
  1712  			0x2:  SubLangAzerbaijaniCyrillicAzerbaijan,
  1713  		},
  1714  		LangAzerbaijaniLatin: {
  1715  			0x1e: SubLangAzerbaijaniLatin,
  1716  			0x1:  SubLangAzerbaijaniLatinAzerbaijan,
  1717  		},
  1718  		LangBangla: {
  1719  			0x2: SubLangBanglaBangladesh,
  1720  			0x1: SubLangBanglaIndia,
  1721  		},
  1722  		LangBashkir: {
  1723  			0x1: SubLangBashkirRussia,
  1724  		},
  1725  		LangBasque: {
  1726  			0x1: SubLangBasqueSpain,
  1727  		},
  1728  		LangBelarusian: {
  1729  			0x1:  SubLangBelarusianBelarus,
  1730  			0x19: SubLangBosnianCyrillic,
  1731  			0x8:  SubLangBosnianCyrillicBosniaAndHerzegovina,
  1732  			0x1a: SubLangBosnianLatin,
  1733  		},
  1734  		LangBosnianLatin: {
  1735  			0x5: SubLangBosnianLatinBosniaAndHerzegovina,
  1736  		},
  1737  		LangBreton: {
  1738  			0x1: SubLangBretonFrance,
  1739  		},
  1740  		LangBulgarian: {
  1741  			0x1: SubLangBulgarianBulgaria,
  1742  		},
  1743  		LangBurmese: {
  1744  			0x1: SubLangBurmeseMyanmar,
  1745  		},
  1746  		LangCatalan: {
  1747  			0x1: SubLangCatalanSpain,
  1748  		},
  1749  		LangCentralKurdish: {
  1750  			0x1f: SubLangCentralKurdish,
  1751  			0x1:  SubLangCentralKurdishIraq,
  1752  		},
  1753  		LangCherokee: {
  1754  			0x1f: SubLangCherokee,
  1755  			0x1:  SubLangCherokeeUnitedStates,
  1756  			0x0:  SubLangChineseSimplified,
  1757  		},
  1758  		LangChineseSimplified: {
  1759  			0x2:  SubLangChineseSimplifiedPeoplesRepublicOfChina,
  1760  			0x4:  SubLangChineseSimplifiedSingapore,
  1761  			0x1f: SubLangChineseTraditional,
  1762  			0x3:  SubLangChineseTraditionalHongKongSar,
  1763  			0x5:  SubLangChineseTraditionalMacaoSar,
  1764  			0x1:  SubLangChineseTraditionalTaiwan,
  1765  		},
  1766  		LangCorsican: {
  1767  			0x1: SubLangCorsicanFrance,
  1768  		},
  1769  		LangCroatian: {
  1770  			0x1: SubLangCroatianCroatia,
  1771  			0x4: SubLangCroatianLatinBosniaAndHerzegovina,
  1772  		},
  1773  		LangCzech: {
  1774  			0x1: SubLangCzechCzechRepublic,
  1775  		},
  1776  		LangDanish: {
  1777  			0x1: SubLangDanishDenmark,
  1778  		},
  1779  		LangDari: {
  1780  			0x1: SubLangDariAfghanistan,
  1781  		},
  1782  		LangDivehi: {
  1783  			0x1: SubLangDivehiMaldives,
  1784  		},
  1785  		LangDutch: {
  1786  			0x2: SubLangDutchBelgium,
  1787  			0x1: SubLangDutchNetherlands,
  1788  			0x3: SubLangDzongkhaBhutan,
  1789  		},
  1790  		LangEnglish: {
  1791  			0x3:  SubLangEnglishAustralia,
  1792  			0xa:  SubLangEnglishBelize,
  1793  			0x4:  SubLangEnglishCanada,
  1794  			0x9:  SubLangEnglishCaribbean,
  1795  			0xf:  SubLangEnglishHongKong,
  1796  			0x10: SubLangEnglishIndia,
  1797  			0x6:  SubLangEnglishIreland,
  1798  			0x8:  SubLangEnglishJamaica,
  1799  			0x11: SubLangEnglishMalaysia,
  1800  			0x5:  SubLangEnglishNewZealand,
  1801  			0xd:  SubLangEnglishRepublicOfThePhilippines,
  1802  			0x12: SubLangEnglishSingapore,
  1803  			0x7:  SubLangEnglishSouthAfrica,
  1804  			0xb:  SubLangEnglishTrinidadAndTobago,
  1805  			0x13: SubLangEnglishUnitedArabEmirates,
  1806  			0x2:  SubLangEnglishUnitedKingdom,
  1807  			0x1:  SubLangEnglishUnitedStates,
  1808  			0xc:  SubLangEnglishZimbabwe,
  1809  		},
  1810  		LangEstonian: {
  1811  			0x1: SubLangEstonianEstonia,
  1812  		},
  1813  		LangFaroese: {
  1814  			0x1: SubLangFaroeseFaroeIslands,
  1815  		},
  1816  		LangFilipino: {
  1817  			0x1: SubLangFilipinoPhilippines,
  1818  		},
  1819  		LangFinnish: {
  1820  			0x1: SubLangFinnishFinland,
  1821  		},
  1822  		LangFrench: {
  1823  			0x2: SubLangFrenchBelgium,
  1824  			0xb: SubLangFrenchCameroon,
  1825  			0x3: SubLangFrenchCanada,
  1826  			0x7: SubLangFrenchCaribbean,
  1827  			0x9: SubLangFrenchCongoDrc,
  1828  			0xc: SubLangFrenchCôteDivoire,
  1829  			0x1: SubLangFrenchFrance,
  1830  			0xf: SubLangFrenchHaiti,
  1831  			0x5: SubLangFrenchLuxembourg,
  1832  			0xd: SubLangFrenchMali,
  1833  			0xe: SubLangFrenchMorocco,
  1834  			0x6: SubLangFrenchPrincipalityOfMonaco,
  1835  			0x8: SubLangFrenchReunion,
  1836  			0xa: SubLangFrenchSenegal,
  1837  			0x4: SubLangFrenchSwitzerland,
  1838  		},
  1839  		LangFrisian: {
  1840  			0x1: SubLangFrisianNetherlands,
  1841  		},
  1842  		LangFulah: {
  1843  			0x1: SubLangFulahNigeria,
  1844  			0x2: SubLangFulahSenegal,
  1845  		},
  1846  		LangFulahLatin: {
  1847  			0x1: SubLangFulahLatinNigeria,
  1848  		},
  1849  		LangGalician: {
  1850  			0x1: SubLangGalicianSpain,
  1851  		},
  1852  		LangGeorgian: {
  1853  			0x1: SubLangGeorgianGeorgia,
  1854  		},
  1855  		LangGerman: {
  1856  			0x3: SubLangGermanAustria,
  1857  			0x1: SubLangGermanGermany,
  1858  			0x5: SubLangGermanLiechtenstein,
  1859  			0x4: SubLangGermanLuxembourg,
  1860  			0x2: SubLangGermanSwitzerland,
  1861  		},
  1862  		LangGreek: {
  1863  			0x1: SubLangGreekGreece,
  1864  		},
  1865  		LangGreenlandic: {
  1866  			0x1: SubLangGreenlandicGreenland,
  1867  		},
  1868  		LangGuarani: {
  1869  			0x1: SubLangGuaraniParaguay,
  1870  		},
  1871  		LangGujarati: {
  1872  			0x1: SubLangGujaratiIndia,
  1873  		},
  1874  		LangHausaLatin: {
  1875  			0x1f: SubLangHausaLatin,
  1876  			0x1:  SubLangHausaLatinNigeria,
  1877  		},
  1878  		LangHawaiian: {
  1879  			0x1: SubLangHawaiianUnitedStates,
  1880  		},
  1881  		LangHebrew: {
  1882  			0x1: SubLangHebrewIsrael,
  1883  		},
  1884  		LangHindi: {
  1885  			0x1: SubLangHindiIndia,
  1886  		},
  1887  		LangHungarian: {
  1888  			0x1: SubLangHungarianHungary,
  1889  		},
  1890  		LangIcelandic: {
  1891  			0x1: SubLangIcelandicIceland,
  1892  		},
  1893  		LangIgbo: {
  1894  			0x1: SubLangIgboNigeria,
  1895  		},
  1896  		LangIndonesian: {
  1897  			0x1: SubLangIndonesianIndonesia,
  1898  		},
  1899  		LangInuktitutLatin: {
  1900  			0x1f: SubLangInuktitutLatin,
  1901  			0x2:  SubLangInuktitutLatinCanada,
  1902  			0x1e: SubLangInuktitutSyllabics,
  1903  			0x1:  SubLangInuktitutSyllabicsCanada,
  1904  		},
  1905  		LangIrish: {
  1906  			0x2: SubLangIrishIreland,
  1907  		},
  1908  		LangItalian: {
  1909  			0x1: SubLangItalianItaly,
  1910  			0x2: SubLangItalianSwitzerland,
  1911  		},
  1912  		LangJapanese: {
  1913  			0x1: SubLangJapaneseJapan,
  1914  		},
  1915  		LangKannada: {
  1916  			0x1: SubLangKannadaIndia,
  1917  		},
  1918  		LangKashmiri: {
  1919  			0x1: SubLangKashmiriPersoArabic,
  1920  			0x2: SubLangKashmiriDevanagariIndia,
  1921  		},
  1922  		LangKazakh: {
  1923  			0x1: SubLangKazakhKazakhstan,
  1924  		},
  1925  		LangKhmer: {
  1926  			0x1: SubLangKhmerCambodia,
  1927  		},
  1928  		LangKiche: {
  1929  			0x1: SubLangKicheGuatemala,
  1930  		},
  1931  		LangKinyarwanda: {
  1932  			0x1: SubLangKinyarwandaRwanda,
  1933  		},
  1934  		LangKiswahili: {
  1935  			0x1: SubLangKiswahiliKenya,
  1936  		},
  1937  		LangKonkani: {
  1938  			0x1: SubLangKonkaniIndia,
  1939  		},
  1940  		LangKorean: {
  1941  			0x1: SubLangKoreanKorea,
  1942  		},
  1943  		LangKyrgyz: {
  1944  			0x1: SubLangKyrgyzKyrgyzstan,
  1945  		},
  1946  		LangLao: {
  1947  			0x1: SubLangLaoLaoPdr,
  1948  		},
  1949  		LangLatvian: {
  1950  			0x1: SubLangLatvianLatvia,
  1951  		},
  1952  		LangLithuanian: {
  1953  			0x1: SubLangLithuanianLithuania,
  1954  		},
  1955  		LangLowerSorbian: {
  1956  			0x2: SubLangLowerSorbianGermany,
  1957  		},
  1958  		LangLuxembourgish: {
  1959  			0x1: SubLangLuxembourgishLuxembourg,
  1960  		},
  1961  		LangMacedonian: {
  1962  			0x1: SubLangMacedonianNorthMacedonia,
  1963  		},
  1964  		LangMalay: {
  1965  			0x2: SubLangMalayBruneiDarussalam,
  1966  			0x1: SubLangMalayMalaysia,
  1967  		},
  1968  		LangMalayalam: {
  1969  			0x1: SubLangMalayalamIndia,
  1970  		},
  1971  		LangMaltese: {
  1972  			0x1: SubLangMalteseMalta,
  1973  		},
  1974  		LangMaori: {
  1975  			0x1: SubLangMaoriNewZealand,
  1976  		},
  1977  		LangMapudungun: {
  1978  			0x1: SubLangMapudungunChile,
  1979  		},
  1980  		LangMarathi: {
  1981  			0x1: SubLangMarathiIndia,
  1982  		},
  1983  		LangMohawk: {
  1984  			0x1: SubLangMohawkCanada,
  1985  		},
  1986  		LangMongolianCyrillic: {
  1987  			0x1e: SubLangMongolianCyrillic,
  1988  			0x1:  SubLangMongolianCyrillicMongolia,
  1989  			0x1f: SubLangMongolianTraditionalMongolian,
  1990  			0x2:  SubLangMongolianTraditionalMongolianPeoplesRepublicOfChina,
  1991  			0x3:  SubLangMongolianTraditionalMongolianMongolia,
  1992  		},
  1993  		LangNepali: {
  1994  			0x2: SubLangNepaliIndia,
  1995  			0x1: SubLangNepaliNepal,
  1996  		},
  1997  		LangNorwegianBokmalNo: {},
  1998  		LangNorwegianBokmal: {
  1999  			0x1: SubLangNorwegianBokmalNorway,
  2000  		},
  2001  		LangNorwegianNynorsk: {
  2002  			0x2: SubLangNorwegianNynorskNorway,
  2003  		},
  2004  		LangOccitan: {
  2005  			0x1: SubLangOccitanFrance,
  2006  		},
  2007  		LangOdia: {
  2008  			0x1: SubLangOdiaIndia,
  2009  		},
  2010  		LangOromo: {
  2011  			0x1: SubLangOromoEthiopia,
  2012  		},
  2013  		LangPashto: {
  2014  			0x1: SubLangPashtoAfghanistan,
  2015  		},
  2016  		LangPersian: {
  2017  			0x1: SubLangPersianIran,
  2018  		},
  2019  		LangPolish: {
  2020  			0x1: SubLangPolishPoland,
  2021  		},
  2022  		LangPortuguese: {
  2023  			0x1: SubLangPortugueseBrazil,
  2024  			0x2: SubLangPortuguesePortugal,
  2025  		},
  2026  		LangPunjabi: {
  2027  			0x1f: SubLangPunjabi,
  2028  			0x1:  SubLangPunjabiIndia,
  2029  			0x2:  SubLangPunjabiIslamicRepublicOfPakistan,
  2030  		},
  2031  		LangQuechua: {
  2032  			0x1: SubLangQuechuaBolivia,
  2033  			0x2: SubLangQuechuaEcuador,
  2034  			0x3: SubLangQuechuaPeru,
  2035  		},
  2036  		LangRomanian: {
  2037  			0x2: SubLangRomanianMoldova,
  2038  			0x1: SubLangRomanianRomania,
  2039  		},
  2040  		LangRomansh: {
  2041  			0x1: SubLangRomanshSwitzerland,
  2042  		},
  2043  		LangRussian: {
  2044  			0x2: SubLangRussianMoldova,
  2045  			0x1: SubLangRussianRussia,
  2046  		},
  2047  		LangSakha: {
  2048  			0x1: SubLangSakhaRussia,
  2049  		},
  2050  		LangSamiInari: {
  2051  			0x9: SubLangSamiInariFinland,
  2052  		},
  2053  		LangSamiLule: {
  2054  			0x4: SubLangSamiLuleNorway,
  2055  			0x5: SubLangSamiLuleSweden,
  2056  		},
  2057  		LangSamiNorthern: {
  2058  			0x3: SubLangSamiNorthernFinland,
  2059  			0x1: SubLangSamiNorthernNorway,
  2060  			0x2: SubLangSamiNorthernSweden,
  2061  		},
  2062  		LangSamiSkolt: {
  2063  			0x8: SubLangSamiSkoltFinland,
  2064  		},
  2065  		LangSamiSouthern: {
  2066  			0x6: SubLangSamiSouthernNorway,
  2067  			0x7: SubLangSamiSouthernSweden,
  2068  		},
  2069  		LangSanskrit: {
  2070  			0x1: SubLangSanskritIndia,
  2071  		},
  2072  		LangScottishGaelic: {
  2073  			0x1:  SubLangScottishGaelicUnitedKingdom,
  2074  			0x1b: SubLangSerbianCyrillic,
  2075  			0x7:  SubLangSerbianCyrillicBosniaAndHerzegovina,
  2076  			0xc:  SubLangSerbianCyrillicMontenegro,
  2077  			0xa:  SubLangSerbianCyrillicSerbia,
  2078  			0x3:  SubLangSerbianCyrillicSerbiaAndMontenegroFormer,
  2079  			0x1c: SubLangSerbianLatin,
  2080  		},
  2081  		LangSerbianLatin: {
  2082  			0x6: SubLangSerbianLatinBosniaAndHerzegovina,
  2083  			0xb: SubLangSerbianLatinMontenegro,
  2084  			0x9: SubLangSerbianLatinSerbia,
  2085  			0x2: SubLangSerbianLatinSerbiaAndMontenegroFormer,
  2086  		},
  2087  		LangSesothoSaLeboa: {
  2088  			0x1: SubLangSesothoSaLeboaSouthAfrica,
  2089  		},
  2090  		LangSetswana: {
  2091  			0x2: SubLangSetswanaBotswana,
  2092  			0x1: SubLangSetswanaSouthAfrica,
  2093  		},
  2094  		LangSindhi: {
  2095  			0x1f: SubLangSindhi,
  2096  			0x2:  SubLangSindhiIslamicRepublicOfPakistan,
  2097  		},
  2098  		LangSinhala: {
  2099  			0x1: SubLangSinhalaSriLanka,
  2100  		},
  2101  		LangSlovak: {
  2102  			0x1: SubLangSlovakSlovakia,
  2103  		},
  2104  		LangSlovenian: {
  2105  			0x1: SubLangSlovenianSlovenia,
  2106  		},
  2107  		LangSomali: {
  2108  			0x1: SubLangSomaliSomalia,
  2109  		},
  2110  		LangSotho: {
  2111  			0x1: SubLangSothoSouthAfrica,
  2112  		},
  2113  		LangSpanish: {
  2114  			0xb:  SubLangSpanishArgentina,
  2115  			0x8:  SubLangSpanishBolivarianRepublicOfVenezuela,
  2116  			0x10: SubLangSpanishBolivia,
  2117  			0xd:  SubLangSpanishChile,
  2118  			0x9:  SubLangSpanishColombia,
  2119  			0x5:  SubLangSpanishCostaRica,
  2120  			0x17: SubLangSpanishCuba,
  2121  			0x7:  SubLangSpanishDominicanRepublic,
  2122  			0xc:  SubLangSpanishEcuador,
  2123  			0x11: SubLangSpanishElSalvador,
  2124  			0x4:  SubLangSpanishGuatemala,
  2125  			0x12: SubLangSpanishHonduras,
  2126  			0x16: SubLangSpanishLatinAmerica,
  2127  			0x2:  SubLangSpanishMexico,
  2128  			0x13: SubLangSpanishNicaragua,
  2129  			0x6:  SubLangSpanishPanama,
  2130  			0xf:  SubLangSpanishParaguay,
  2131  			0xa:  SubLangSpanishPeru,
  2132  			0x14: SubLangSpanishPuertoRico,
  2133  			0x1:  SubLangSpanishSpain,
  2134  			0x3:  SubLangSpanishSpain,
  2135  			0x15: SubLangSpanishUnitedStates,
  2136  			0xe:  SubLangSpanishUruguay,
  2137  		},
  2138  		LangSwedish: {
  2139  			0x2: SubLangSwedishFinland,
  2140  			0x1: SubLangSwedishSweden,
  2141  		},
  2142  		LangSyriac: {
  2143  			0x1: SubLangSyriacSyria,
  2144  		},
  2145  		LangTajikCyrillic: {
  2146  			0x1f: SubLangTajikCyrillic,
  2147  			0x1:  SubLangTajikCyrillicTajikistan,
  2148  		},
  2149  		LangTamazightLatin: {
  2150  			0x1f: SubLangTamazightLatin,
  2151  			0x2:  SubLangTamazightLatinAlgeria,
  2152  		},
  2153  		LangTamil: {
  2154  			0x1: SubLangTamilIndia,
  2155  			0x2: SubLangTamilSriLanka,
  2156  		},
  2157  		LangTatar: {
  2158  			0x1: SubLangTatarRussia,
  2159  		},
  2160  		LangTelugu: {
  2161  			0x1: SubLangTeluguIndia,
  2162  		},
  2163  		LangThai: {
  2164  			0x1: SubLangThaiThailand,
  2165  		},
  2166  		LangTibetan: {
  2167  			0x1: SubLangTibetanPeoplesRepublicOfChina,
  2168  		},
  2169  		LangTigrinya: {
  2170  			0x2: SubLangTigrinyaEritrea,
  2171  			0x1: SubLangTigrinyaEthiopia,
  2172  		},
  2173  		LangTsonga: {
  2174  			0x1: SubLangTsongaSouthAfrica,
  2175  		},
  2176  		LangTurkish: {
  2177  			0x1: SubLangTurkishTurkey,
  2178  		},
  2179  		LangTurkmen: {
  2180  			0x1: SubLangTurkmenTurkmenistan,
  2181  		},
  2182  		LangUkrainian: {
  2183  			0x1: SubLangUkrainianUkraine,
  2184  		},
  2185  		LangUpperSorbian: {
  2186  			0x1: SubLangUpperSorbianGermany,
  2187  		},
  2188  		LangUrdu: {
  2189  			0x2: SubLangUrduIndia,
  2190  			0x1: SubLangUrduIslamicRepublicOfPakistan,
  2191  		},
  2192  		LangUyghur: {
  2193  			0x1:  SubLangUyghurPeoplesRepublicOfChina,
  2194  			0x1e: SubLangUzbekCyrillic,
  2195  			0x2:  SubLangUzbekCyrillicUzbekistan,
  2196  		},
  2197  		LangUzbekLatin: {
  2198  			0x1f: SubLangUzbekLatin,
  2199  			0x1:  SubLangUzbekLatinUzbekistan,
  2200  			0x2:  SubLangValencianSpain,
  2201  		},
  2202  		LangVenda: {
  2203  			0x1: SubLangVendaSouthAfrica,
  2204  		},
  2205  		LangVietnamese: {
  2206  			0x1: SubLangVietnameseVietnam,
  2207  		},
  2208  		LangWelsh: {
  2209  			0x1: SubLangWelshUnitedKingdom,
  2210  		},
  2211  		LangWolof: {
  2212  			0x1: SubLangWolofSenegal,
  2213  		},
  2214  		LangXhosa: {
  2215  			0x1: SubLangXhosaSouthAfrica,
  2216  		},
  2217  		LangYi: {
  2218  			0x1: SubLangYiPeoplesRepublicOfChina,
  2219  		},
  2220  		LangYoruba: {
  2221  			0x1: SubLangYorubaNigeria,
  2222  		},
  2223  		LangZulu: {
  2224  			0x1: SubLangZuluSouthAfrica,
  2225  		},
  2226  	}
  2227  
  2228  	if val, ok := m[lang][subLang]; ok {
  2229  		return val.String()
  2230  	}
  2231  
  2232  	return "?"
  2233  }