]> git.openstreetmap.org Git - nominatim.git/commitdiff
Merge remote-tracking branch 'upstream/master' into collect_os_info.sh
authorTareq Al-Ahdal <tareqoalahdal@gmail.com>
Fri, 12 Aug 2022 21:53:39 +0000 (05:53 +0800)
committerTareq Al-Ahdal <tareqoalahdal@gmail.com>
Fri, 12 Aug 2022 21:53:39 +0000 (05:53 +0800)
598 files changed:
.github/actions/build-nominatim/action.yml
.github/actions/setup-postgresql/action.yml
.github/workflows/ci-tests.yml
.mypy.ini [new file with mode: 0644]
.pylintrc
AUTHORS
CMakeLists.txt
CONTRIBUTING.md
ChangeLog
SECURITY.md
VAGRANT.md
cmake/tool-installed.tmpl
cmake/tool.tmpl
data/country_name.sql [deleted file]
docs/CMakeLists.txt
docs/admin/Advanced-Installations.md
docs/admin/Deployment.md
docs/admin/Faq.md
docs/admin/Import.md
docs/admin/Installation.md
docs/admin/Maintenance.md
docs/admin/Migration.md
docs/admin/Setup-Nominatim-UI.md
docs/admin/Update.md
docs/api/Lookup.md
docs/api/Output.md
docs/api/Reverse.md
docs/api/Search.md
docs/customize/Country-Settings.md [new file with mode: 0644]
docs/customize/Import-Styles.md
docs/customize/Settings.md
docs/customize/Tokenizers.md
docs/develop/Database-Layout.md
docs/develop/Development-Environment.md
docs/develop/ICU-Tokenizer-Modules.md [new file with mode: 0644]
docs/develop/Indexing.md
docs/develop/Testing.md
docs/develop/Tokenizers.md
docs/develop/data-sources.md
docs/extra.css
docs/mkdocs.yml
lib-php/AddressDetails.php
lib-php/ClassTypes.php
lib-php/DB.php
lib-php/DatabaseError.php
lib-php/DebugHtml.php
lib-php/DebugNone.php
lib-php/Geocode.php
lib-php/ParameterParser.php
lib-php/Phrase.php
lib-php/PlaceLookup.php
lib-php/Result.php
lib-php/ReverseGeocode.php
lib-php/SearchContext.php
lib-php/SearchDescription.php
lib-php/SearchPosition.php
lib-php/Shell.php
lib-php/SimpleWordList.php
lib-php/SpecialSearchOperator.php
lib-php/Status.php
lib-php/TokenCountry.php
lib-php/TokenHousenumber.php
lib-php/TokenList.php
lib-php/TokenPartial.php
lib-php/TokenPostcode.php
lib-php/TokenSpecialTerm.php
lib-php/TokenWord.php
lib-php/admin/export.php
lib-php/admin/warm.php
lib-php/cmd.php
lib-php/dotenv_loader.php
lib-php/init-cmd.php
lib-php/init-website.php
lib-php/init.php
lib-php/lib.php
lib-php/log.php
lib-php/output.php
lib-php/setup_functions.php
lib-php/template/address-geocodejson.php
lib-php/template/address-geojson.php
lib-php/template/address-json.php
lib-php/template/address-xml.php
lib-php/template/details-json.php
lib-php/template/error-json.php
lib-php/template/search-batch-json.php
lib-php/template/search-geocodejson.php
lib-php/template/search-geojson.php
lib-php/template/search-json.php
lib-php/template/search-xml.php
lib-php/tokenizer/icu_tokenizer.php
lib-php/tokenizer/legacy_tokenizer.php
lib-php/website/deletable.php
lib-php/website/details.php
lib-php/website/lookup.php
lib-php/website/polygons.php
lib-php/website/reverse-only-search.php
lib-php/website/reverse.php
lib-php/website/search.php
lib-php/website/status.php
lib-sql/functions.sql
lib-sql/functions/address_lookup.sql
lib-sql/functions/importance.sql
lib-sql/functions/interpolation.sql
lib-sql/functions/partition-functions.sql
lib-sql/functions/place_triggers.sql
lib-sql/functions/placex_triggers.sql
lib-sql/functions/postcode_triggers.sql
lib-sql/functions/ranking.sql
lib-sql/functions/utils.sql
lib-sql/indices.sql
lib-sql/partition-tables.src.sql
lib-sql/postcode_tables.sql
lib-sql/table-triggers.sql
lib-sql/tables.sql
lib-sql/tiger_import_finish.sql
lib-sql/tiger_import_start.sql
lib-sql/tokenizer/icu_tokenizer.sql
lib-sql/tokenizer/icu_tokenizer_tables.sql
lib-sql/tokenizer/legacy_tokenizer.sql
lib-sql/tokenizer/legacy_tokenizer_indices.sql
lib-sql/tokenizer/legacy_tokenizer_tables.sql
module/CMakeLists.txt
module/nominatim.c
module/tokenstringreplacements.inc
module/utfasciitable.h
munin/nominatim_requests
nominatim/cli.py
nominatim/clicmd/__init__.py
nominatim/clicmd/add_data.py
nominatim/clicmd/admin.py
nominatim/clicmd/api.py
nominatim/clicmd/args.py
nominatim/clicmd/freeze.py
nominatim/clicmd/index.py
nominatim/clicmd/refresh.py
nominatim/clicmd/replication.py
nominatim/clicmd/setup.py
nominatim/clicmd/special_phrases.py
nominatim/config.py
nominatim/data/__init__.py [new file with mode: 0644]
nominatim/data/country_info.py [new file with mode: 0644]
nominatim/data/place_info.py [new file with mode: 0644]
nominatim/data/place_name.py [new file with mode: 0644]
nominatim/data/postcode_format.py [new file with mode: 0644]
nominatim/db/async_connection.py
nominatim/db/connection.py
nominatim/db/properties.py
nominatim/db/sql_preprocessor.py
nominatim/db/status.py
nominatim/db/utils.py
nominatim/errors.py
nominatim/indexer/indexer.py
nominatim/indexer/place_info.py [deleted file]
nominatim/indexer/progress.py
nominatim/indexer/runners.py
nominatim/tokenizer/base.py
nominatim/tokenizer/factory.py
nominatim/tokenizer/icu_rule_loader.py
nominatim/tokenizer/icu_token_analysis.py
nominatim/tokenizer/icu_tokenizer.py
nominatim/tokenizer/legacy_tokenizer.py
nominatim/tokenizer/place_sanitizer.py
nominatim/tokenizer/sanitizers/base.py [new file with mode: 0644]
nominatim/tokenizer/sanitizers/clean_housenumbers.py [new file with mode: 0644]
nominatim/tokenizer/sanitizers/clean_postcodes.py [new file with mode: 0644]
nominatim/tokenizer/sanitizers/config.py [new file with mode: 0644]
nominatim/tokenizer/sanitizers/split_name_list.py
nominatim/tokenizer/sanitizers/strip_brace_terms.py
nominatim/tokenizer/sanitizers/tag_analyzer_by_language.py
nominatim/tokenizer/token_analysis/base.py [new file with mode: 0644]
nominatim/tokenizer/token_analysis/config_variants.py [new file with mode: 0644]
nominatim/tokenizer/token_analysis/generic.py
nominatim/tokenizer/token_analysis/generic_mutation.py [new file with mode: 0644]
nominatim/tokenizer/token_analysis/housenumbers.py [new file with mode: 0644]
nominatim/tokenizer/token_analysis/postcodes.py [new file with mode: 0644]
nominatim/tools/__init__.py
nominatim/tools/add_osm_data.py
nominatim/tools/admin.py
nominatim/tools/check_database.py
nominatim/tools/country_info.py [deleted file]
nominatim/tools/database_import.py
nominatim/tools/exec_utils.py
nominatim/tools/freeze.py
nominatim/tools/migration.py
nominatim/tools/postcodes.py
nominatim/tools/refresh.py
nominatim/tools/replication.py
nominatim/tools/special_phrases/importer_statistics.py
nominatim/tools/special_phrases/sp_csv_loader.py
nominatim/tools/special_phrases/sp_importer.py
nominatim/tools/special_phrases/sp_wiki_loader.py
nominatim/tools/special_phrases/special_phrase.py
nominatim/tools/tiger_data.py
nominatim/typing.py [new file with mode: 0644]
nominatim/utils/__init__.py [new file with mode: 0644]
nominatim/utils/centroid.py [new file with mode: 0644]
nominatim/version.py
osm2pgsql
settings/address-levels.json
settings/country-names/ad.yaml [new file with mode: 0644]
settings/country-names/ae.yaml [new file with mode: 0644]
settings/country-names/af.yaml [new file with mode: 0644]
settings/country-names/ag.yaml [new file with mode: 0644]
settings/country-names/ai.yaml [new file with mode: 0644]
settings/country-names/al.yaml [new file with mode: 0644]
settings/country-names/am.yaml [new file with mode: 0644]
settings/country-names/an.yaml [new file with mode: 0644]
settings/country-names/ao.yaml [new file with mode: 0644]
settings/country-names/aq.yaml [new file with mode: 0644]
settings/country-names/ar.yaml [new file with mode: 0644]
settings/country-names/as.yaml [new file with mode: 0644]
settings/country-names/at.yaml [new file with mode: 0644]
settings/country-names/au.yaml [new file with mode: 0644]
settings/country-names/aw.yaml [new file with mode: 0644]
settings/country-names/ax.yaml [new file with mode: 0644]
settings/country-names/az.yaml [new file with mode: 0644]
settings/country-names/ba.yaml [new file with mode: 0644]
settings/country-names/bb.yaml [new file with mode: 0644]
settings/country-names/bd.yaml [new file with mode: 0644]
settings/country-names/be.yaml [new file with mode: 0644]
settings/country-names/bf.yaml [new file with mode: 0644]
settings/country-names/bg.yaml [new file with mode: 0644]
settings/country-names/bh.yaml [new file with mode: 0644]
settings/country-names/bi.yaml [new file with mode: 0644]
settings/country-names/bj.yaml [new file with mode: 0644]
settings/country-names/bl.yaml [new file with mode: 0644]
settings/country-names/bm.yaml [new file with mode: 0644]
settings/country-names/bn.yaml [new file with mode: 0644]
settings/country-names/bo.yaml [new file with mode: 0644]
settings/country-names/bq.yaml [new file with mode: 0644]
settings/country-names/br.yaml [new file with mode: 0644]
settings/country-names/bs.yaml [new file with mode: 0644]
settings/country-names/bt.yaml [new file with mode: 0644]
settings/country-names/bv.yaml [new file with mode: 0644]
settings/country-names/bw.yaml [new file with mode: 0644]
settings/country-names/by.yaml [new file with mode: 0644]
settings/country-names/bz.yaml [new file with mode: 0644]
settings/country-names/ca.yaml [new file with mode: 0644]
settings/country-names/cc.yaml [new file with mode: 0644]
settings/country-names/cd.yaml [new file with mode: 0644]
settings/country-names/cf.yaml [new file with mode: 0644]
settings/country-names/cg.yaml [new file with mode: 0644]
settings/country-names/ch.yaml [new file with mode: 0644]
settings/country-names/ci.yaml [new file with mode: 0644]
settings/country-names/ck.yaml [new file with mode: 0644]
settings/country-names/cl.yaml [new file with mode: 0644]
settings/country-names/cm.yaml [new file with mode: 0644]
settings/country-names/cn.yaml [new file with mode: 0644]
settings/country-names/co.yaml [new file with mode: 0644]
settings/country-names/cr.yaml [new file with mode: 0644]
settings/country-names/cu.yaml [new file with mode: 0644]
settings/country-names/cv.yaml [new file with mode: 0644]
settings/country-names/cw.yaml [new file with mode: 0644]
settings/country-names/cx.yaml [new file with mode: 0644]
settings/country-names/cy.yaml [new file with mode: 0644]
settings/country-names/cz.yaml [new file with mode: 0644]
settings/country-names/de.yaml [new file with mode: 0644]
settings/country-names/dj.yaml [new file with mode: 0644]
settings/country-names/dk.yaml [new file with mode: 0644]
settings/country-names/dm.yaml [new file with mode: 0644]
settings/country-names/do.yaml [new file with mode: 0644]
settings/country-names/dz.yaml [new file with mode: 0644]
settings/country-names/ec.yaml [new file with mode: 0644]
settings/country-names/ee.yaml [new file with mode: 0644]
settings/country-names/eg.yaml [new file with mode: 0644]
settings/country-names/eh.yaml [new file with mode: 0644]
settings/country-names/er.yaml [new file with mode: 0644]
settings/country-names/es.yaml [new file with mode: 0644]
settings/country-names/et.yaml [new file with mode: 0644]
settings/country-names/fi.yaml [new file with mode: 0644]
settings/country-names/fj.yaml [new file with mode: 0644]
settings/country-names/fk.yaml [new file with mode: 0644]
settings/country-names/fm.yaml [new file with mode: 0644]
settings/country-names/fo.yaml [new file with mode: 0644]
settings/country-names/fr.yaml [new file with mode: 0644]
settings/country-names/ga.yaml [new file with mode: 0644]
settings/country-names/gb.yaml [new file with mode: 0644]
settings/country-names/gd.yaml [new file with mode: 0644]
settings/country-names/ge.yaml [new file with mode: 0644]
settings/country-names/gf.yaml [new file with mode: 0644]
settings/country-names/gg.yaml [new file with mode: 0644]
settings/country-names/gh.yaml [new file with mode: 0644]
settings/country-names/gi.yaml [new file with mode: 0644]
settings/country-names/gl.yaml [new file with mode: 0644]
settings/country-names/gm.yaml [new file with mode: 0644]
settings/country-names/gn.yaml [new file with mode: 0644]
settings/country-names/gp.yaml [new file with mode: 0644]
settings/country-names/gq.yaml [new file with mode: 0644]
settings/country-names/gr.yaml [new file with mode: 0644]
settings/country-names/gs.yaml [new file with mode: 0644]
settings/country-names/gt.yaml [new file with mode: 0644]
settings/country-names/gu.yaml [new file with mode: 0644]
settings/country-names/gw.yaml [new file with mode: 0644]
settings/country-names/gy.yaml [new file with mode: 0644]
settings/country-names/hk.yaml [new file with mode: 0644]
settings/country-names/hm.yaml [new file with mode: 0644]
settings/country-names/hn.yaml [new file with mode: 0644]
settings/country-names/hr.yaml [new file with mode: 0644]
settings/country-names/ht.yaml [new file with mode: 0644]
settings/country-names/hu.yaml [new file with mode: 0644]
settings/country-names/id.yaml [new file with mode: 0644]
settings/country-names/ie.yaml [new file with mode: 0644]
settings/country-names/il.yaml [new file with mode: 0644]
settings/country-names/im.yaml [new file with mode: 0644]
settings/country-names/in.yaml [new file with mode: 0644]
settings/country-names/io.yaml [new file with mode: 0644]
settings/country-names/iq.yaml [new file with mode: 0644]
settings/country-names/ir.yaml [new file with mode: 0644]
settings/country-names/is.yaml [new file with mode: 0644]
settings/country-names/it.yaml [new file with mode: 0644]
settings/country-names/je.yaml [new file with mode: 0644]
settings/country-names/jm.yaml [new file with mode: 0644]
settings/country-names/jo.yaml [new file with mode: 0644]
settings/country-names/jp.yaml [new file with mode: 0644]
settings/country-names/ke.yaml [new file with mode: 0644]
settings/country-names/kg.yaml [new file with mode: 0644]
settings/country-names/kh.yaml [new file with mode: 0644]
settings/country-names/ki.yaml [new file with mode: 0644]
settings/country-names/km.yaml [new file with mode: 0644]
settings/country-names/kn.yaml [new file with mode: 0644]
settings/country-names/kp.yaml [new file with mode: 0644]
settings/country-names/kr.yaml [new file with mode: 0644]
settings/country-names/kw.yaml [new file with mode: 0644]
settings/country-names/ky.yaml [new file with mode: 0644]
settings/country-names/kz.yaml [new file with mode: 0644]
settings/country-names/la.yaml [new file with mode: 0644]
settings/country-names/lb.yaml [new file with mode: 0644]
settings/country-names/lc.yaml [new file with mode: 0644]
settings/country-names/li.yaml [new file with mode: 0644]
settings/country-names/lk.yaml [new file with mode: 0644]
settings/country-names/lr.yaml [new file with mode: 0644]
settings/country-names/ls.yaml [new file with mode: 0644]
settings/country-names/lt.yaml [new file with mode: 0644]
settings/country-names/lu.yaml [new file with mode: 0644]
settings/country-names/lv.yaml [new file with mode: 0644]
settings/country-names/ly.yaml [new file with mode: 0644]
settings/country-names/ma.yaml [new file with mode: 0644]
settings/country-names/mc.yaml [new file with mode: 0644]
settings/country-names/md.yaml [new file with mode: 0644]
settings/country-names/me.yaml [new file with mode: 0644]
settings/country-names/mf.yaml [new file with mode: 0644]
settings/country-names/mg.yaml [new file with mode: 0644]
settings/country-names/mh.yaml [new file with mode: 0644]
settings/country-names/mk.yaml [new file with mode: 0644]
settings/country-names/ml.yaml [new file with mode: 0644]
settings/country-names/mm.yaml [new file with mode: 0644]
settings/country-names/mn.yaml [new file with mode: 0644]
settings/country-names/mo.yaml [new file with mode: 0644]
settings/country-names/mp.yaml [new file with mode: 0644]
settings/country-names/mq.yaml [new file with mode: 0644]
settings/country-names/mr.yaml [new file with mode: 0644]
settings/country-names/ms.yaml [new file with mode: 0644]
settings/country-names/mt.yaml [new file with mode: 0644]
settings/country-names/mu.yaml [new file with mode: 0644]
settings/country-names/mv.yaml [new file with mode: 0644]
settings/country-names/mw.yaml [new file with mode: 0644]
settings/country-names/mx.yaml [new file with mode: 0644]
settings/country-names/my.yaml [new file with mode: 0644]
settings/country-names/mz.yaml [new file with mode: 0644]
settings/country-names/na.yaml [new file with mode: 0644]
settings/country-names/nc.yaml [new file with mode: 0644]
settings/country-names/ne.yaml [new file with mode: 0644]
settings/country-names/nf.yaml [new file with mode: 0644]
settings/country-names/ng.yaml [new file with mode: 0644]
settings/country-names/ni.yaml [new file with mode: 0644]
settings/country-names/nl.yaml [new file with mode: 0644]
settings/country-names/no.yaml [new file with mode: 0644]
settings/country-names/np.yaml [new file with mode: 0644]
settings/country-names/nr.yaml [new file with mode: 0644]
settings/country-names/nu.yaml [new file with mode: 0644]
settings/country-names/nz.yaml [new file with mode: 0644]
settings/country-names/om.yaml [new file with mode: 0644]
settings/country-names/pa.yaml [new file with mode: 0644]
settings/country-names/pe.yaml [new file with mode: 0644]
settings/country-names/pf.yaml [new file with mode: 0644]
settings/country-names/pg.yaml [new file with mode: 0644]
settings/country-names/ph.yaml [new file with mode: 0644]
settings/country-names/pk.yaml [new file with mode: 0644]
settings/country-names/pl.yaml [new file with mode: 0644]
settings/country-names/pm.yaml [new file with mode: 0644]
settings/country-names/pn.yaml [new file with mode: 0644]
settings/country-names/pr.yaml [new file with mode: 0644]
settings/country-names/ps.yaml [new file with mode: 0644]
settings/country-names/pt.yaml [new file with mode: 0644]
settings/country-names/pw.yaml [new file with mode: 0644]
settings/country-names/py.yaml [new file with mode: 0644]
settings/country-names/qa.yaml [new file with mode: 0644]
settings/country-names/re.yaml [new file with mode: 0644]
settings/country-names/ro.yaml [new file with mode: 0644]
settings/country-names/rs.yaml [new file with mode: 0644]
settings/country-names/ru.yaml [new file with mode: 0644]
settings/country-names/rw.yaml [new file with mode: 0644]
settings/country-names/sa.yaml [new file with mode: 0644]
settings/country-names/sb.yaml [new file with mode: 0644]
settings/country-names/sc.yaml [new file with mode: 0644]
settings/country-names/sd.yaml [new file with mode: 0644]
settings/country-names/se.yaml [new file with mode: 0644]
settings/country-names/sg.yaml [new file with mode: 0644]
settings/country-names/sh.yaml [new file with mode: 0644]
settings/country-names/si.yaml [new file with mode: 0644]
settings/country-names/sj.yaml [new file with mode: 0644]
settings/country-names/sk.yaml [new file with mode: 0644]
settings/country-names/sl.yaml [new file with mode: 0644]
settings/country-names/sm.yaml [new file with mode: 0644]
settings/country-names/sn.yaml [new file with mode: 0644]
settings/country-names/so.yaml [new file with mode: 0644]
settings/country-names/sr.yaml [new file with mode: 0644]
settings/country-names/ss.yaml [new file with mode: 0644]
settings/country-names/st.yaml [new file with mode: 0644]
settings/country-names/sv.yaml [new file with mode: 0644]
settings/country-names/sx.yaml [new file with mode: 0644]
settings/country-names/sy.yaml [new file with mode: 0644]
settings/country-names/sz.yaml [new file with mode: 0644]
settings/country-names/tc.yaml [new file with mode: 0644]
settings/country-names/td.yaml [new file with mode: 0644]
settings/country-names/tf.yaml [new file with mode: 0644]
settings/country-names/tg.yaml [new file with mode: 0644]
settings/country-names/th.yaml [new file with mode: 0644]
settings/country-names/tj.yaml [new file with mode: 0644]
settings/country-names/tk.yaml [new file with mode: 0644]
settings/country-names/tl.yaml [new file with mode: 0644]
settings/country-names/tm.yaml [new file with mode: 0644]
settings/country-names/tn.yaml [new file with mode: 0644]
settings/country-names/to.yaml [new file with mode: 0644]
settings/country-names/tr.yaml [new file with mode: 0644]
settings/country-names/tt.yaml [new file with mode: 0644]
settings/country-names/tv.yaml [new file with mode: 0644]
settings/country-names/tw.yaml [new file with mode: 0644]
settings/country-names/tz.yaml [new file with mode: 0644]
settings/country-names/ua.yaml [new file with mode: 0644]
settings/country-names/ug.yaml [new file with mode: 0644]
settings/country-names/um.yaml [new file with mode: 0644]
settings/country-names/us.yaml [new file with mode: 0644]
settings/country-names/uy.yaml [new file with mode: 0644]
settings/country-names/uz.yaml [new file with mode: 0644]
settings/country-names/va.yaml [new file with mode: 0644]
settings/country-names/vc.yaml [new file with mode: 0644]
settings/country-names/ve.yaml [new file with mode: 0644]
settings/country-names/vg.yaml [new file with mode: 0644]
settings/country-names/vi.yaml [new file with mode: 0644]
settings/country-names/vn.yaml [new file with mode: 0644]
settings/country-names/vu.yaml [new file with mode: 0644]
settings/country-names/wf.yaml [new file with mode: 0644]
settings/country-names/ws.yaml [new file with mode: 0644]
settings/country-names/xk.yaml [new file with mode: 0644]
settings/country-names/ye.yaml [new file with mode: 0644]
settings/country-names/yt.yaml [new file with mode: 0644]
settings/country-names/za.yaml [new file with mode: 0644]
settings/country-names/zm.yaml [new file with mode: 0644]
settings/country-names/zw.yaml [new file with mode: 0644]
settings/country_settings.yaml
settings/env.defaults
settings/icu_tokenizer.yaml
settings/import-address.style
settings/import-admin.style
settings/import-extratags.style
settings/import-full.style
settings/import-street.style
test/bdd/.behaverc
test/bdd/api/reverse/queries.feature
test/bdd/api/search/params.feature
test/bdd/api/search/queries.feature
test/bdd/db/import/addressing.feature
test/bdd/db/import/country.feature
test/bdd/db/import/interpolation.feature
test/bdd/db/import/linking.feature
test/bdd/db/import/naming.feature
test/bdd/db/import/parenting.feature
test/bdd/db/import/placex.feature
test/bdd/db/import/postcodes.feature
test/bdd/db/import/rank_computation.feature
test/bdd/db/import/search_name.feature
test/bdd/db/query/housenumbers.feature [new file with mode: 0644]
test/bdd/db/query/interpolation.feature [new file with mode: 0644]
test/bdd/db/query/linking.feature
test/bdd/db/query/normalization.feature
test/bdd/db/query/postcodes.feature [new file with mode: 0644]
test/bdd/db/query/search_simple.feature
test/bdd/db/update/country.feature [new file with mode: 0644]
test/bdd/db/update/interpolation.feature
test/bdd/db/update/linked_places.feature
test/bdd/db/update/naming.feature
test/bdd/db/update/parenting.feature
test/bdd/db/update/postcode.feature
test/bdd/db/update/simple.feature
test/bdd/environment.py
test/bdd/osm2pgsql/update/relation.feature
test/bdd/steps/cgi-with-coverage.php
test/bdd/steps/check_functions.py
test/bdd/steps/geometry_alias.py [new file with mode: 0644]
test/bdd/steps/geometry_factory.py
test/bdd/steps/http_responses.py
test/bdd/steps/nominatim_environment.py
test/bdd/steps/place_inserter.py
test/bdd/steps/steps_api_queries.py
test/bdd/steps/steps_db_ops.py
test/bdd/steps/steps_osm_data.py
test/bdd/steps/table_compare.py
test/bdd/steps/utils.py
test/php/Nominatim/AddressDetailsTest.php
test/php/Nominatim/ClassTypesTest.php
test/php/Nominatim/DBTest.php
test/php/Nominatim/DatabaseErrorTest.php
test/php/Nominatim/DebugTest.php
test/php/Nominatim/LibTest.php
test/php/Nominatim/ParameterParserTest.php
test/php/Nominatim/ResultTest.php
test/php/Nominatim/SearchContextTest.php
test/php/Nominatim/ShellTest.php
test/php/Nominatim/SimpleWordListTest.php
test/php/Nominatim/StatusTest.php
test/php/Nominatim/TokenListTest.php
test/php/Nominatim/tokenizer.php
test/php/bootstrap.php
test/php/fixtures/address_details_10_downing_street.json
test/php/phpunit.xml
test/python/cli/conftest.py
test/python/cli/test_cli.py
test/python/cli/test_cmd_admin.py
test/python/cli/test_cmd_api.py
test/python/cli/test_cmd_import.py
test/python/cli/test_cmd_refresh.py
test/python/cli/test_cmd_replication.py
test/python/config/test_config.py
test/python/config/test_config_load_module.py [new file with mode: 0644]
test/python/conftest.py
test/python/cursor.py
test/python/data/test_country_info.py [new file with mode: 0644]
test/python/db/test_async_connection.py
test/python/db/test_connection.py
test/python/db/test_properties.py
test/python/db/test_sql_preprocessor.py
test/python/db/test_status.py
test/python/db/test_utils.py
test/python/dummy_tokenizer.py
test/python/indexer/test_indexing.py
test/python/mock_icu_word_table.py
test/python/mock_legacy_word_table.py
test/python/mocks.py
test/python/pytest.ini [new file with mode: 0644]
test/python/tokenizer/sanitizers/test_clean_housenumbers.py [new file with mode: 0644]
test/python/tokenizer/sanitizers/test_clean_postcodes.py [new file with mode: 0644]
test/python/tokenizer/sanitizers/test_sanitizer_config.py [new file with mode: 0644]
test/python/tokenizer/sanitizers/test_split_name_list.py
test/python/tokenizer/sanitizers/test_strip_brace_terms.py
test/python/tokenizer/sanitizers/test_tag_analyzer_by_language.py
test/python/tokenizer/test_factory.py
test/python/tokenizer/test_icu.py
test/python/tokenizer/test_icu_rule_loader.py
test/python/tokenizer/test_legacy.py
test/python/tokenizer/test_place_sanitizer.py
test/python/tokenizer/token_analysis/test_analysis_postcodes.py [new file with mode: 0644]
test/python/tokenizer/token_analysis/test_generic.py
test/python/tokenizer/token_analysis/test_generic_mutation.py [new file with mode: 0644]
test/python/tools/conftest.py
test/python/tools/test_add_osm_data.py
test/python/tools/test_admin.py
test/python/tools/test_check_database.py
test/python/tools/test_country_info.py [deleted file]
test/python/tools/test_database_import.py
test/python/tools/test_exec_utils.py
test/python/tools/test_freeze.py
test/python/tools/test_import_special_phrases.py
test/python/tools/test_migration.py
test/python/tools/test_postcodes.py
test/python/tools/test_refresh.py
test/python/tools/test_refresh_address_levels.py
test/python/tools/test_refresh_create_functions.py
test/python/tools/test_refresh_setup_website.py
test/python/tools/test_replication.py
test/python/tools/test_sp_csv_loader.py
test/python/tools/test_sp_wiki_loader.py
test/python/tools/test_tiger_data.py
test/python/utils/test_centroid.py [new file with mode: 0644]
test/scenes/bin/Makefile [deleted file]
test/scenes/bin/make_scenes.sh [deleted file]
test/scenes/bin/osm2wkt.cc [deleted file]
test/scenes/data/admin-areas.wkt [deleted file]
test/scenes/data/admin.osm [deleted file]
test/scenes/data/building-on-street-corner.wkt [deleted file]
test/scenes/data/building-with-parallel-streets.wkt [deleted file]
test/scenes/data/country.sql [deleted file]
test/scenes/data/country.wkt [deleted file]
test/scenes/data/parallel-road.wkt [deleted file]
test/scenes/data/points-on-roads.wkt [deleted file]
test/scenes/data/poly-area.wkt [deleted file]
test/scenes/data/poly-areas.osm [deleted file]
test/scenes/data/road-with-alley.wkt [deleted file]
test/scenes/data/roads-with-pois.wkt [deleted file]
test/scenes/data/roads.osm [deleted file]
test/scenes/data/split-road.wkt [deleted file]
test/scenes/data/way-area-with-center.wkt [deleted file]
test/testdata/sp_csv_test.csv
test/testdata/special_phrases_test_content.txt
vagrant/Install-on-Centos-8.sh [deleted file]
vagrant/Install-on-Ubuntu-18.sh
vagrant/Install-on-Ubuntu-20.sh
vagrant/Install-on-Ubuntu-22.sh [new file with mode: 0755]

index 757decd4f63c7379033ac956acb38cf6c12b0cad..c6ff7a31ca599caff9e35b51081e88ebc0c1fd28 100644 (file)
@@ -5,11 +5,20 @@ inputs:
         description: 'Version of Ubuntu to install on'
         required: false
         default: '20'
+    cmake-args:
+        description: 'Additional options to hand to cmake'
+        required: false
+        default: ''
 
 runs:
     using: "composite"
 
     steps:
+        - name: Clean out the disk
+          run: |
+            sudo rm -rf /opt/hostedtoolcache/go /opt/hostedtoolcache/CodeQL /usr/lib/jvm /usr/local/share/chromium /usr/local/lib/android
+            df -h
+          shell: bash
         - name: Install prerequisites
           run: |
             sudo apt-get install -y -qq libboost-system-dev libboost-filesystem-dev libexpat1-dev zlib1g-dev libbz2-dev libpq-dev libproj-dev libicu-dev
@@ -21,18 +30,13 @@ runs:
           shell: bash
           env:
             UBUNTUVER: ${{ inputs.ubuntu }}
-
-        - name: Download dependencies
-          run: |
-              if [ ! -f country_grid.sql.gz ]; then
-                  wget --no-verbose https://www.nominatim.org/data/country_grid.sql.gz
-              fi
-              cp country_grid.sql.gz Nominatim/data/country_osm_grid.sql.gz
-          shell: bash
+            CMAKE_ARGS: ${{ inputs.cmake-args }}
 
         - name: Configure
-          run: mkdir build && cd build && cmake ../Nominatim
+          run: mkdir build && cd build && cmake $CMAKE_ARGS ../Nominatim
           shell: bash
+          env:
+            CMAKE_ARGS: ${{ inputs.cmake-args }}
 
         - name: Build
           run: |
index 060a678941b2610c5bfc29c4bada275812a7ccd3..19a19e17e12c65c06044a381045d523e160ab16a 100644 (file)
@@ -22,7 +22,7 @@ runs:
 
         - name: Install PostgreSQL
           run: |
-              sudo apt-get install -y -qq --no-install-suggests --no-install-recommends postgresql-client-${PGVER} postgresql-${PGVER}-postgis-${POSTGISVER} postgresql-${PGVER}-postgis-${POSTGISVER}-scripts postgresql-contrib-${PGVER} postgresql-${PGVER} postgresql-server-dev-${PGVER}
+              sudo apt-get install -y -qq --no-install-suggests --no-install-recommends postgresql-client-${PGVER} postgresql-${PGVER}-postgis-${POSTGISVER} postgresql-${PGVER}-postgis-${POSTGISVER}-scripts postgresql-contrib-${PGVER} postgresql-${PGVER}
           shell: bash
           env:
               PGVER: ${{ inputs.postgresql-version }}
index 23d640d7f084a9347c963db14ab1c9b5bacd8edd..481ec767cd088d12d3d228c50f129f23771f5359 100644 (file)
@@ -37,10 +37,10 @@ jobs:
         needs: create-archive
         strategy:
             matrix:
-                ubuntu: [18, 20]
+                ubuntu: [18, 20, 22]
                 include:
                     - ubuntu: 18
-                      postgresql: 9.5
+                      postgresql: 9.6
                       postgis: 2.5
                       pytest: pytest
                       php: 7.2
@@ -49,6 +49,11 @@ jobs:
                       postgis: 3
                       pytest: py.test-3
                       php: 7.4
+                    - ubuntu: 22
+                      postgresql: 14
+                      postgis: 3
+                      pytest: py.test-3
+                      php: 8.1
 
         runs-on: ubuntu-${{ matrix.ubuntu }}.04
 
@@ -64,8 +69,8 @@ jobs:
               uses: shivammathur/setup-php@v2
               with:
                   php-version: ${{ matrix.php }}
-                  coverage: xdebug
                   tools: phpunit, phpcs, composer
+                  ini-values: opcache.jit=disable
 
             - uses: actions/setup-python@v2
               with:
@@ -82,12 +87,19 @@ jobs:
                   ubuntu: ${{ matrix.ubuntu }}
 
             - name: Install test prerequsites
-              run: sudo apt-get install -y -qq pylint python3-pytest python3-behave python3-pytest-cov php-codecoverage
+              run: sudo apt-get install -y -qq python3-pytest python3-behave
               if: matrix.ubuntu == 20
 
             - name: Install test prerequsites
-              run: pip3 install pylint==2.6.0 pytest pytest-cov behave==1.2.6
-              if: matrix.ubuntu == 18
+              run: pip3 install pylint pytest behave==1.2.6
+              if: ${{ (matrix.ubuntu == 18) || (matrix.ubuntu == 22) }}
+
+            - name: Install test prerequsites
+              run: sudo apt-get install -y -qq python3-pytest
+              if: matrix.ubuntu == 22
+
+            - name: Install latest pylint/mypy
+              run: pip3 install -U pylint mypy types-PyYAML types-jinja2 types-psycopg2 types-psutil typing-extensions
 
             - name: PHP linting
               run: phpcs --report-width=120 .
@@ -97,57 +109,31 @@ jobs:
               run: pylint nominatim
               working-directory: Nominatim
 
+            - name: Python static typechecking
+              run: mypy --strict nominatim
+              working-directory: Nominatim
+
+
             - name: PHP unit tests
-              run: phpunit --coverage-clover ../../coverage-php.xml ./
+              run: phpunit ./
               working-directory: Nominatim/test/php
-              if: matrix.ubuntu == 20
+              if: ${{ (matrix.ubuntu == 20) || (matrix.ubuntu == 22) }}
 
             - name: Python unit tests
-              run: $PYTEST --cov=nominatim --cov-report=xml test/python
+              run: $PYTEST test/python
               working-directory: Nominatim
               env:
                 PYTEST: ${{ matrix.pytest }}
 
-            - name: BDD tests
-              run: |
-                  mkdir cov
-                  behave -DREMOVE_TEMPLATE=1 -DBUILDDIR=$GITHUB_WORKSPACE/build --format=progress3 -DPHPCOV=./cov
-                  composer require phpunit/phpcov:7.0.2
-                  vendor/bin/phpcov merge --clover ../../coverage-bdd.xml ./cov
-              working-directory: Nominatim/test/bdd
-              if: matrix.ubuntu == 20
-
             - name: BDD tests
               run: |
                   behave -DREMOVE_TEMPLATE=1 -DBUILDDIR=$GITHUB_WORKSPACE/build --format=progress3
               working-directory: Nominatim/test/bdd
-              if: matrix.ubuntu == 18
-
-            - name: Upload coverage to Codecov
-              uses: codecov/codecov-action@v1
-              with:
-                files: ./Nominatim/coverage*.xml
-                directory: ./
-                name: codecov-umbrella
-                fail_ci_if_error: false
-                path_to_write_report: ./coverage/codecov_report.txt
-                verbose: true
-              if: matrix.ubuntu == 20
 
 
-    icu-test:
+    legacy-test:
         needs: create-archive
-        strategy:
-            matrix:
-                ubuntu: [20]
-                include:
-                    - ubuntu: 20
-                      postgresql: 13
-                      postgis: 3
-                      pytest: py.test-3
-                      php: 7.4
-
-        runs-on: ubuntu-${{ matrix.ubuntu }}.04
+        runs-on: ubuntu-20.04
 
         steps:
             - uses: actions/download-artifact@v2
@@ -160,35 +146,27 @@ jobs:
             - name: Setup PHP
               uses: shivammathur/setup-php@v2
               with:
-                  php-version: ${{ matrix.php }}
-                  coverage: xdebug
-                  tools: phpunit, phpcs, composer
-
-            - uses: actions/setup-python@v2
-              with:
-                python-version: 3.6
-              if: matrix.ubuntu == 18
+                  php-version: 7.4
 
             - uses: ./Nominatim/.github/actions/setup-postgresql
               with:
-                  postgresql-version: ${{ matrix.postgresql }}
-                  postgis-version: ${{ matrix.postgis }}
+                  postgresql-version: 13
+                  postgis-version: 3
+
+            - name: Install Postgresql server dev
+              run: sudo apt-get install postgresql-server-dev-13
 
             - uses: ./Nominatim/.github/actions/build-nominatim
               with:
-                  ubuntu: ${{ matrix.ubuntu }}
+                  ubuntu: 20
+                  cmake-args: -DBUILD_MODULE=on
 
             - name: Install test prerequsites
               run: sudo apt-get install -y -qq python3-behave
-              if: matrix.ubuntu == 20
 
-            - name: Install test prerequsites
-              run: pip3 install behave==1.2.6
-              if: matrix.ubuntu == 18
-
-            - name: BDD tests (icu tokenizer)
+            - name: BDD tests (legacy tokenizer)
               run: |
-                  behave -DREMOVE_TEMPLATE=1 -DBUILDDIR=$GITHUB_WORKSPACE/build -DTOKENIZER=icu --format=progress3
+                  behave -DREMOVE_TEMPLATE=1 -DBUILDDIR=$GITHUB_WORKSPACE/build -DTOKENIZER=legacy --format=progress3
               working-directory: Nominatim/test/bdd
 
 
@@ -198,7 +176,7 @@ jobs:
 
         strategy:
             matrix:
-                name: [Ubuntu-18, Ubuntu-20, Centos-8]
+                name: [Ubuntu-18, Ubuntu-20, Ubuntu-22]
                 include:
                     - name: Ubuntu-18
                       flavour: ubuntu
@@ -210,9 +188,11 @@ jobs:
                       image: "ubuntu:20.04"
                       ubuntu: 20
                       install_mode: install-apache
-                    - name: Centos-8
-                      flavour: centos
-                      image: "centos:8"
+                    - name: Ubuntu-22
+                      flavour: ubuntu
+                      image: "ubuntu:22.04"
+                      ubuntu: 22
+                      install_mode: install-apache
 
         container:
             image: ${{ matrix.image }}
@@ -281,6 +261,10 @@ jobs:
               working-directory: /home/nominatim
               if: matrix.flavour == 'centos'
 
+            - name: Print version
+              run: nominatim --version
+              working-directory: /home/nominatim/nominatim-project
+
             - name: Import
               run: nominatim import --osm-file ../test.pbf
               working-directory: /home/nominatim/nominatim-project
@@ -309,12 +293,20 @@ jobs:
                   NOMINATIM_REPLICATION_MAX_DIFF=1 nominatim replication --once
               working-directory: /home/nominatim/nominatim-project
 
+            - name: Clean up database
+              run: nominatim refresh --postcodes --word-tokens
+              working-directory: /home/nominatim/nominatim-project
+
             - name: Run reverse-only import
               run : |
                   echo 'NOMINATIM_DATABASE_DSN="pgsql:dbname=reverse"' >> .env
                   nominatim import --osm-file ../test.pbf --reverse-only --no-updates
               working-directory: /home/nominatim/data-env-reverse
 
-            - name: Check reverse import
+            - name: Check reverse-only import
               run: nominatim admin --check-database
               working-directory: /home/nominatim/data-env-reverse
+
+            - name: Clean up database (reverse-only import)
+              run: nominatim refresh --postcodes --word-tokens
+              working-directory: /home/nominatim/nominatim-project
diff --git a/.mypy.ini b/.mypy.ini
new file mode 100644 (file)
index 0000000..81a5c2e
--- /dev/null
+++ b/.mypy.ini
@@ -0,0 +1,13 @@
+[mypy]
+
+[mypy-icu.*]
+ignore_missing_imports = True
+
+[mypy-osmium.*]
+ignore_missing_imports = True
+
+[mypy-datrie.*]
+ignore_missing_imports = True
+
+[mypy-dotenv.*]
+ignore_missing_imports = True
index e283292ac9535283c316ccf876293a24754d8e6b..e860940778fe9492072a9d50ce322ea643df6ce9 100644 (file)
--- a/.pylintrc
+++ b/.pylintrc
@@ -10,6 +10,9 @@ ignored-modules=icu,datrie
 # closing added here because it sometimes triggers a false positive with
 # 'with' statements.
 ignored-classes=NominatimArgs,closing
-disable=too-few-public-methods,duplicate-code
+# 'too-many-ancestors' is triggered already by deriving from UserDict
+# 'not-context-manager' disabled because it causes false positives once
+#   typed Python is enabled. See also https://github.com/PyCQA/pylint/issues/5273
+disable=too-few-public-methods,duplicate-code,too-many-ancestors,bad-option-value,no-self-use,not-context-manager
 
-good-names=i,x,y,fd,db
+good-names=i,x,y,fd,db,cc
diff --git a/AUTHORS b/AUTHORS
index fc28bf2e7fea28d8e32a4e484de14371cc4de1b8..e52785d38295ef83cf892aa874e7d0fef4d34c39 100644 (file)
--- a/AUTHORS
+++ b/AUTHORS
@@ -1,15 +1,15 @@
 Nominatim was written by:
 
-  Brian Quinion
-  Sarah Hoffmann
-  Marc Tobias Metten
+* Brian Quinion
+* Sarah Hoffmann
+* Marc Tobias Metten
 
-  markigail
-  gemo1011
-  IrlJidel
-  Frederik Ramm
+* markigail
+* AntoJvlt
+* gemo1011
+* darkshredder
 
 and many more.
 
-For a full list of contributors see
+For a full list of contributors see the Git logs or visit
 https://github.com/openstreetmap/Nominatim/graphs/contributors
index b7591ec3ada8e7cc43730dd7a9b525633a207866..036dda31b03418d575a763ae88705646bfd9a240 100644 (file)
@@ -19,13 +19,24 @@ list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake")
 project(nominatim)
 
 set(NOMINATIM_VERSION_MAJOR 4)
-set(NOMINATIM_VERSION_MINOR 0)
+set(NOMINATIM_VERSION_MINOR 1)
 set(NOMINATIM_VERSION_PATCH 0)
 
 set(NOMINATIM_VERSION "${NOMINATIM_VERSION_MAJOR}.${NOMINATIM_VERSION_MINOR}.${NOMINATIM_VERSION_PATCH}")
 
 add_definitions(-DNOMINATIM_VERSION="${NOMINATIM_VERSION}")
 
+# Setting GIT_HASH
+find_package(Git)
+if (GIT_FOUND)
+    execute_process(
+        COMMAND "${GIT_EXECUTABLE}" log -1 --format=%h
+        WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}
+        OUTPUT_VARIABLE GIT_HASH
+        OUTPUT_STRIP_TRAILING_WHITESPACE
+        ERROR_QUIET
+        )
+endif()
 
 #-----------------------------------------------------------------------------
 #  Configuration
@@ -33,7 +44,7 @@ add_definitions(-DNOMINATIM_VERSION="${NOMINATIM_VERSION}")
 
 set(BUILD_IMPORTER on CACHE BOOL "Build everything for importing/updating the database")
 set(BUILD_API on CACHE BOOL "Build everything for the API server")
-set(BUILD_MODULE on CACHE BOOL "Build PostgreSQL module")
+set(BUILD_MODULE off CACHE BOOL "Build PostgreSQL module for legacy tokenizer")
 set(BUILD_TESTS on CACHE BOOL "Build test suite")
 set(BUILD_DOCS on CACHE BOOL "Build documentation")
 set(BUILD_MANPAGE on CACHE BOOL "Build Manual Page")
@@ -226,8 +237,7 @@ if (BUILD_IMPORTER)
             PATTERN __pycache__ EXCLUDE)
     install(DIRECTORY lib-sql DESTINATION ${NOMINATIM_LIBDIR})
 
-    install(FILES data/country_name.sql
-                  ${COUNTRY_GRID_FILE}
+    install(FILES ${COUNTRY_GRID_FILE}
                   data/words.sql
             DESTINATION ${NOMINATIM_DATADIR})
 endif()
@@ -266,6 +276,8 @@ install(FILES settings/env.defaults
 
 install(DIRECTORY settings/icu-rules
         DESTINATION ${NOMINATIM_CONFIGDIR})
+install(DIRECTORY settings/country-names
+        DESTINATION ${NOMINATIM_CONFIGDIR})
 
 if (INSTALL_MUNIN_PLUGINS)
     install(FILES munin/nominatim_importlag
index 6798c39dc1fcde20525204cd2af4abbc2e392e2a..e031cd91116df9030c0e82f4f1dd1eebcbcfe37b 100644 (file)
@@ -36,7 +36,7 @@ Nominatim historically hasn't followed a particular coding style but we
 are in process of consolidating the style. The following rules apply:
 
  * Python code uses the official Python style
- * indention
+ * indentation
    * SQL use 2 spaces
    * all other file types use 4 spaces
    * [BSD style](https://en.wikipedia.org/wiki/Indent_style#Allman_style) for braces
index b42ce7ee619e208542746fe36a7cffda779baa13..c38b2a793204c7bff3b71a22dc770d2dd22bb94a 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,48 @@
+4.1.0
+
+ * switch to ICU tokenizer as default
+ * add housenumber normalization and support optional spaces during search
+ * add postcode format checking and support optional spaces during search
+ * add function for cleaning housenumbers in word table
+ * add updates/deletion of country names imported from OSM
+ * linked places no longer overwrite names from a place permanently
+ * move default country name configuration into yaml file (thanks @tareqpi)
+ * more compact layout for interpolation and TIGER tables
+ * introduce mutations to ICU tokenizer (used for German umlauts)
+ * support reinitializing a full project directory with refresh --website
+ * fix various issues with linked places on updates
+ * add support for external sanitizers and token analyzers
+ * add CLI commands for forced indexing
+ * add CLI command for version report
+ * add offline import mode
+ * change geocodejson to return a feature class in the 'type' field
+ * add ISO3166-2 to address output (thanks @I70l0teN4ik)
+ * improve parsing and matching of addr: tags
+ * support relations as street members of associatedStreet
+ * better ranking for address results from TIGER data
+ * adapt rank classification to changed tag usage in OSM
+ * update bundled osm2pgsql to 1.6.0
+ * add typing information to Python code
+ * improve unit test coverage
+ * reorganise and speed up code for BDD tests, drop support for scenes
+ * move PHP unit tests to PHP 9.5
+ * extensive typo fixes in documentation (thanks @woodpeck,@StephanGeorg,
+   @amandasaurus, @nslxndr, @stefkiourk, @Luflosi, @kianmeng)
+ * drop official support for installation on CentOS
+ * add installation instructions for Ubuntu 22.04
+ * add support for PHP8
+ * add setup instructions for updates and systemd
+ * drop support for PostgreSQL 9.5
+
+4.0.1
+
+ * fix initialisation error in replication script
+ * ICU tokenizer: avoid any special characters in word tokens
+ * better error message when API php script does not exist
+ * fix quoting of house numbers in SQL queries
+ * small fixes and improvements in search query parsing
+ * add documentation for moving the database to a different machine
+
 4.0.0
 
  * refactor name token computation and introduce ICU tokenizer
index 41a6f2ef281f82870b02ae61750ad9d6b6921d4a..9ac793b345eb7f803a6222eb2a3b73063ef16324 100644 (file)
@@ -9,10 +9,10 @@ versions.
 
 | Version | End of support for security updates |
 | ------- | ----------------------------------- |
+| 4.0.x   | 2023-11-02                          |
 | 3.7.x   | 2023-04-05                          |
 | 3.6.x   | 2022-12-12                          |
 | 3.5.x   | 2022-06-05                          |
-| 3.4.x   | 2021-10-24                          |
 
 ## Reporting a Vulnerability
 
index b10a5ac779cc9e9fe756f7e375e838ad0a37a827..e00e09542c71f3d7c266b602725eb18c3efcfd25 100644 (file)
@@ -42,9 +42,9 @@ is.
 
       ```
       # inside the virtual machine:
-      cd build
-      wget --no-verbose --output-document=/tmp/monaco.osm.pbf http://download.geofabrik.de/europe/monaco-latest.osm.pbf
-      ./utils/setup.php --osm-file /tmp/monaco.osm.pbf --osm2pgsql-cache 1000 --all 2>&1 | tee monaco.$$.log
+      cd nominatim-project
+      wget --no-verbose --output-document=monaco.osm.pbf http://download.geofabrik.de/europe/monaco-latest.osm.pbf
+      nominatim import --osm-file monaco.osm.pbf 2>&1 | tee monaco.$$.log
       ```
 
     To repeat an import you'd need to delete the database first
@@ -56,7 +56,7 @@ is.
 ## Development
 
 Vagrant maps the virtual machine's port 8089 to your host machine. Thus you can
-see Nominatim in action on [locahost:8089](http://localhost:8089/nominatim/).
+see Nominatim in action on [localhost:8089](http://localhost:8089/nominatim/).
 
 You edit code on your host machine in any editor you like. There is no need to
 restart any software: just refresh your browser window.
index 0b245dbbe74b6dd43e34dfaaa6418aaa559cb570..8825daaf9b3b1599f67ac4bff156b602b29954fd 100644 (file)
@@ -7,6 +7,9 @@ sys.path.insert(1, '@NOMINATIM_LIBDIR@/lib-python')
 os.environ['NOMINATIM_NOMINATIM_TOOL'] = os.path.abspath(__file__)
 
 from nominatim import cli
+from nominatim import version
+
+version.GIT_COMMIT_HASH = '@GIT_HASH@'
 
 exit(cli.nominatim(module_dir='@NOMINATIM_LIBDIR@/module',
                    osm2pgsql_path='@NOMINATIM_LIBDIR@/osm2pgsql',
index a6022402650719a53db6f1e0d3cdf3841130258c..c1ecd3f03eec002aa686e065c17c6255cc3dd816 100755 (executable)
@@ -7,6 +7,9 @@ sys.path.insert(1, '@CMAKE_SOURCE_DIR@')
 os.environ['NOMINATIM_NOMINATIM_TOOL'] = os.path.abspath(__file__)
 
 from nominatim import cli
+from nominatim import version
+
+version.GIT_COMMIT_HASH = '@GIT_HASH@'
 
 exit(cli.nominatim(module_dir='@CMAKE_BINARY_DIR@/module',
                    osm2pgsql_path='@CMAKE_BINARY_DIR@/osm2pgsql/osm2pgsql',
diff --git a/data/country_name.sql b/data/country_name.sql
deleted file mode 100644 (file)
index 4dfdcaa..0000000
+++ /dev/null
@@ -1,265 +0,0 @@
---
--- PostgreSQL database dump
---
-
-CREATE TABLE public.country_name (
-    country_code character varying(2),
-    name public.hstore,
-    country_default_language_code text,
-    partition integer
-);
-
-
-COPY public.country_name (country_code, name) FROM stdin;
-an     "name"=>"De Nederlandse Antillen", "name:af"=>"Nederlandse Antille", "name:an"=>"Antillas Neerlandesas", "name:ar"=>"جزر الأنتيل", "name:be"=>"Нідэрландскія Антылы", "name:bg"=>"Холандски Антили", "name:br"=>"Antilhez Nederlandat", "name:bs"=>"Holandski Antili", "name:ca"=>"Antilles Neerlandeses", "name:cs"=>"Nizozemské Antily", "name:cy"=>"Antilles yr Iseldiroedd", "name:da"=>"Nederlandske Antiller", "name:de"=>"Niederländische Antillen", "name:dv"=>"ނެދަލޭންޑު އެންޓިލޭ", "name:el"=>"Ολλανδικές Αντίλλες", "name:en"=>"Netherlands Antilles", "name:eo"=>"Nederlandaj Antiloj", "name:es"=>"Antillas Neerlandesas;Antillas Holandesas;Indias Occidentales Holandesas", "name:et"=>"Hollandi Antillid", "name:eu"=>"Holandarren Antillak", "name:fa"=>"آنتیل هلند", "name:fi"=>"Alankomaiden Antillit", "name:fo"=>"Niðurlendsku Antillurnar", "name:fr"=>"Antilles néerlandaises", "name:fy"=>"Nederlânske Antillen", "name:ga"=>"Aintillí na hÍsiltíre", "name:gl"=>"Antillas Neerlandesas", "name:he"=>"האנטילים ההולנדיים", "name:hi"=>"नीदरलैंड एंटीलीज़", "name:hr"=>"Nizozemski Antili", "name:hu"=>"Holland Antillák", "name:ia"=>"Antillas Nederlandese", "name:id"=>"Antillen Belanda", "name:io"=>"Nederlandana Antili", "name:is"=>"Hollensku Antillaeyjar", "name:it"=>"Antille Olandesi", "name:ja"=>"オランダ領アンティル", "name:jv"=>"Antillen Walanda", "name:ka"=>"ნიდერლანდის ანტილები", "name:kk"=>"Антийлер", "name:ko"=>"네덜란드령 안틸레스", "name:kw"=>"Antillys Iseldiryek", "name:la"=>"Antillae Nederlandiae", "name:lb"=>"Hollännesch Antillen", "name:li"=>"Nederlandse Antille", "name:ln"=>"Antiya ya Holanda", "name:lt"=>"Nyderlandų Antilai", "name:lv"=>"Antiļas", "name:mn"=>"Нидерландын Антиллийн Арлууд", "name:mr"=>"नेदरलँड्स अँटिल्स", "name:ms"=>"Antillen Belanda", "name:nn"=>"Dei nederlandske Antillane", "name:no"=>"De nederlandske Antillene", "name:pl"=>"Antyle Holenderskie", "name:pt"=>"Antilhas Holandesas", "name:ro"=>"Antilele Olandeze", "name:ru"=>"Нидерландские Антилы", "name:sh"=>"Nizozemski Antili", "name:sk"=>"Holandské Antily", "name:sl"=>"Nizozemski Antili", "name:sr"=>"Холандски Антили", "name:sv"=>"Nederländska Antillerna", "name:sw"=>"Antili za Kiholanzi", "name:ta"=>"நெதர்லாந்து அண்டிலிசு", "name:tg"=>"Антил Ҳоланд", "name:th"=>"เนเธอร์แลนด์แอนทิลลิส", "name:tr"=>"Hollanda Antilleri", "name:uk"=>"Нідерландські Антильські острови", "name:vi"=>"Antille thuộc Hà Lan", "name:zh"=>"荷属安的列斯"
-np     "name"=>"Nepal", "name:ar"=>"نيبال", "name:be"=>"Непал", "name:br"=>"Nepal", "name:el"=>"Νεπάλ", "name:en"=>"Nepal", "name:eo"=>"Nepalo", "name:fa"=>"نپال", "name:fi"=>"Nepal", "name:fr"=>"Népal", "name:ga"=>"Neipeal", "name:gd"=>"Neapàl", "name:he"=>"נפאל", "name:hu"=>"Nepál", "name:is"=>"Nepal", "name:it"=>"Nepal", "name:ja"=>"ネパール", "name:la"=>"Nepalia", "name:lt"=>"Nepalas", "name:lv"=>"Nepāla", "name:mn"=>"Балба", "name:ne"=>"नेपाल", "name:pl"=>"Nepal", "name:ru"=>"Непал", "name:sv"=>"Nepal", "name:th"=>"ประเทศเนปาล", "name:uk"=>"Непал", "name:zh"=>"尼泊尔"
-gb     "name"=>"United Kingdom", "name:ab"=>"Британиа Ду", "name:af"=>"Verenigde Koninkryk", "name:ak"=>"United Kingdom", "name:am"=>"ዩናይትድ ኪንግደም", "name:an"=>"Reino Unito", "name:ar"=>"المملكة المتحدة", "name:as"=>"যুক্তৰাজ্য", "name:av"=>"Кӏудабиритан", "name:az"=>"Böyük Britaniya", "name:ba"=>"Бөйөк Британия", "name:be"=>"Вялікабрытанія", "name:bg"=>"Обединено кралство Великобритания и Северна Ирландия", "name:bh"=>"यूनाइटेड किंगडम", "name:bi"=>"Unaeted Kingdom", "name:bn"=>"যুক্তরাজ্য", "name:bo"=>"དབྱིན་ཇི་མཉམ་འབྲེལ།", "name:br"=>"Rouantelezh-Unanet", "name:bs"=>"Ujedinjeno Kraljevstvo Velike Britanije i Sjeverne Irske", "name:ca"=>"Regne Unit", "name:ce"=>"Йоккха Британи", "name:ch"=>"Reinu Unidu", "name:co"=>"Regnu Unitu", "name:cs"=>"Spojené království", "name:cu"=>"Вєлика Британїꙗ", "name:cv"=>"Аслă Британи", "name:cy"=>"Deyrnas Unedig", "name:da"=>"Storbritannien", "name:de"=>"Vereinigtes Königreich", "name:dv"=>"ޔުނައިޓެޑް ކިންގްޑަމް", "name:dz"=>"ཡུ་ནའི་ཊེཊ་ཀིང་ཌམ", "name:ee"=>"United Kingdom", "name:el"=>"Ηνωμένο Βασίλειο", "name:en"=>"United Kingdom", "name:eo"=>"Unuiĝinta Reĝlando", "name:es"=>"Reino Unido", "name:et"=>"Suurbritannia", "name:eu"=>"Erresuma Batua", "name:fa"=>"بریتانیا", "name:ff"=>"Biritaani-Mawndi", "name:fi"=>"Yhdistynyt kuningaskunta", "name:fo"=>"Stóra Bretland", "name:fr"=>"Royaume-Uni", "name:fy"=>"Feriene Keninkryk", "name:ga"=>"An Ríocht Aontaithe", "name:gd"=>"An Rìoghachd Aonaichte", "name:gl"=>"Reino Unido", "name:gn"=>"Tavetã Joaju", "name:gu"=>"યુનાઇટેડ કિંગડમ", "name:gv"=>"Reeriaght Unnaneysit", "name:ha"=>"Birtaniya", "name:he"=>"הממלכה המאוחדת", "name:hi"=>"यूनाइटेड किंगडम", "name:hr"=>"Ujedinjeno Kraljevstvo", "name:ht"=>"Wayòm Ini", "name:hu"=>"Egyesült Királyság", "name:hy"=>"Միացյալ Թագավորություն", "name:ia"=>"Regno Unite", "name:id"=>"Britania Raya", "name:ie"=>"Reyatu Unit", "name:ig"=>"Obodoézè Nà Ofú", "name:io"=>"Unionita Rejio", "name:is"=>"Bretland", "name:it"=>"Regno Unito", "name:iu"=>"ᑐᓗᐃᑦ ᓄᓈᑦ", "name:ja"=>"イギリス", "name:jv"=>"Britania Raya", "name:ka"=>"გაერთიანებული სამეფო", "name:kg"=>"Royaume-Uni", "name:kk"=>"Ұлыбритания", "name:kl"=>"Tuluit Nunaat", "name:km"=>"រាជាណាចក្ររួម", "name:kn"=>"ಯುನೈಟೆಡ್ ಕಿಂಗ್‌ಡಂ", "name:ko"=>"영국", "name:ku"=>"Keyaniya Yekbûyî", "name:kv"=>"Ыджыд Британия", "name:kw"=>"Ruwvaneth Unys", "name:ky"=>"Улуу Британия жана Түндүк Ирландия", "name:la"=>"Britanniarum Regnum", "name:lb"=>"Groussbritannien an Nordirland", "name:li"=>"Vereineg Keuninkriek", "name:ln"=>"Ingɛlɛ́tɛlɛ", "name:lo"=>"ສະຫະຣາຊອານາຈັກ", "name:lt"=>"Jungtinė Karalystė", "name:lv"=>"Apvienotā Karaliste", "name:mg"=>"Fanjakana Mitambatra", "name:mi"=>"Kīngitanga Kotahi", "name:mk"=>"Обединето Кралство", "name:ml"=>"യുണൈറ്റഡ് കിങ്ഡം", "name:mn"=>"Их Британи", "name:mr"=>"युनायटेड किंग्डम", "name:ms"=>"United Kingdom", "name:mt"=>"Renju Unit", "name:my"=>"ယူနိုက်တက်ကင်းဒမ်းနိုင်ငံ", "name:na"=>"Ingerand", "name:ne"=>"संयुक्त अधिराज्य", "name:nl"=>"Verenigd Koninkrijk", "name:nn"=>"Storbritannia", "name:no"=>"Storbritannia", "name:nv"=>"Tótaʼ Dineʼé Bikéyah", "name:oc"=>"Reialme Unit", "name:om"=>"Yunaayitid Kingidem", "name:or"=>"ଯୁକ୍ତରାଜ୍ୟ", "name:os"=>"Стыр Британи", "name:pa"=>"ਸੰਯੁਕਤ ਬਾਦਸ਼ਾਹੀ", "name:pl"=>"Wielka Brytania", "name:ps"=>"بريتانيا", "name:pt"=>"Reino Unido", "name:qu"=>"Hukllachasqa Qhapaq Suyu", "name:rm"=>"Reginavel Unì", "name:ro"=>"Regatul Unit al Marii Britanii și al Irlandei de Nord", "name:ru"=>"Великобритания", "name:rw"=>"Ubwongereza", "name:sa"=>"संयुक्त अधिराज्य", "name:sc"=>"Rennu Auniadu", "name:sd"=>"گڏيل بادشاھت", "name:se"=>"Ovttastuvvan gonagasriika", "name:sh"=>"Ujedinjeno Kraljevstvo", "name:si"=>"එක්සත් රාජධානිය", "name:sk"=>"Spojené kráľovstvo", "name:sl"=>"Združeno kraljestvo Velike Britanije in Severne Irske", "name:sm"=>"Peretānia", "name:sn"=>"United Kingdom", "name:so"=>"Midowga boqortooyada Britan", "name:sq"=>"Mbretëria e Bashkuar e Britanisë dhe Irlandës së Veriut", "name:sr"=>"Уједињено Краљевство", "name:ss"=>"United Kingdom", "name:su"=>"Britania", "name:sv"=>"Storbritannien", "name:sw"=>"Ufalme wa Muungano", "name:ta"=>"ஐக்கிய இராச்சியம்", "name:te"=>"యునైటెడ్ కింగ్‌డమ్", "name:tg"=>"Подшоҳии Муттаҳида", "name:th"=>"สหราชอาณาจักร", "name:tk"=>"Birleşen Patyşalyk", "name:tl"=>"Nagkakaisang Kaharian", "name:to"=>"Pilitānia", "name:tr"=>"Birleşik Krallık", "name:tt"=>"Бөекбритания", "name:tw"=>"United Kingdom", "name:ty"=>"Paratāne", "name:ug"=>"بۈيۈك بېرىتانىيە", "name:uk"=>"Велика Британія", "name:ur"=>"برطانیہ", "name:uz"=>"Birlashgan Qirollik", "name:vi"=>"Vương quốc Anh", "name:vo"=>"Regän Pebalöl", "name:wa"=>"Rweyåme-Uni", "name:wo"=>"Nguur-Yu-Bennoo", "name:yi"=>"פאראייניגטע קעניגרייך", "name:yo"=>"Ilẹ̀ọba Aṣọ̀kan", "name:za"=>"Yinghgoz", "name:zh"=>"英国/英國", "name:zu"=>"Umbuso Ohlangeneyo"
-us     "name"=>"United States", "name:ab"=>"Америка Еиду Аштатқәа", "name:af"=>"Verenigde State van Amerika", "name:am"=>"የተባበሩት የአሜሪካ ግዛቶች", "name:an"=>"Estatos Unitos d'America", "name:ar"=>"الولايات المتّحدة الأمريكيّة", "name:as"=>"মাৰ্কিন যুক্তৰাষ্ট্ৰ", "name:av"=>"Америкалъул Цолъарал Штатал", "name:ay"=>"Istadus Unidus", "name:az"=>"Amerika Birləşmiş Ştatları", "name:ba"=>"Америка Ҡушма Штаттары", "name:be"=>"Злучаныя Штаты Амерыкі", "name:bg"=>"Съединени американски щати", "name:bi"=>"Yunaeted Stet blong Amerika", "name:bm"=>"Amerika ka Kelenyalen Jamanaw", "name:bn"=>"মার্কিন যুক্তরাষ্ট্র", "name:bo"=>"ཨ་མེ་རི་ཁ་རྒྱལ་ཕྲན་མཉམ་འབྲེལ་རྒྱལ་ཁབ།", "name:br"=>"Stadoù-Unanet Amerika", "name:bs"=>"Sjedinjene Američke Države", "name:ca"=>"Estats Units d'Amèrica", "name:ce"=>"Iамерка пачхьалк", "name:co"=>"Stati Uniti d'America", "name:cs"=>"Spojené státy americké", "name:cu"=>"Амєрика́ньскꙑ Ѥдьнѥнꙑ́ Дрьжа́вꙑ", "name:cv"=>"Америкăри Пĕрлешӳллĕ Штатсем", "name:cy"=>"Unol Daleithiau America", "name:da"=>"Amerikas Forenede Stater", "name:de"=>"Vereinigte Staaten von Amerika", "name:dv"=>"އެމެރިކާ", "name:dz"=>"ཡུ་ནའིཊེཊ་སི་ཊེས", "name:ee"=>"United States", "name:el"=>"Ηνωμένες Πολιτείες της Αμερικής", "name:en"=>"United States", "name:eo"=>"Usono", "name:es"=>"Estados Unidos de América", "name:et"=>"Ameerika Ühendriigid", "name:eu"=>"Ameriketako Estatu Batuak", "name:fa"=>"ایالات متحده آمریکا", "name:ff"=>"Dowlaaji Dentuɗi", "name:fi"=>"Amerikan yhdysvallat", "name:fo"=>"Sambandsríkið Amerika", "name:fr"=>"États-Unis d'Amérique", "name:fy"=>"Feriene Steaten fan Amearika", "name:ga"=>"Stáit Aontaithe Mheiriceá", "name:gd"=>"Na Stàitean Aonaichte", "name:gl"=>"Estados Unidos de América", "name:gn"=>"Tetã peteĩ reko Amérikagua", "name:gu"=>"સંયુક્ત રાજ્ય અમેરિકા", "name:gv"=>"Steatyn Unnaneysit America", "name:ha"=>"kunkiyar taraiyar Amurika", "name:he"=>"ארצות הברית", "name:hi"=>"संयुक्त राज्य अमेरिका", "name:hr"=>"Sjedinjene Američke Države", "name:ht"=>"Etazini", "name:hu"=>"Amerikai Egyesült Államok", "name:hy"=>"Ամերիկայի Միացյալ Նահանգներ", "name:ia"=>"Statos Unite de America", "name:id"=>"Amerika Serikat", "name:ie"=>"Unit States de America", "name:ig"=>"Njikota Obodo Amerika", "name:ik"=>"United States of America", "name:io"=>"Unionita Stati di Amerika", "name:is"=>"Bandaríki Norður-Ameríku", "name:it"=>"Stati Uniti d'America", "name:iu"=>"ᐊᒥᐊᓕᑲ", "name:ja"=>"アメリカ合衆国", "name:jv"=>"Amérika Sarékat", "name:ka"=>"ამერიკის შეერთებული შტატები", "name:ki"=>"United States", "name:kk"=>"Америка Құрама Штаттары", "name:kl"=>"Naalagaaffeqatigiit", "name:km"=>"សហរដ្ឋអាមេរិក", "name:kn"=>"ಅಮೇರಿಕ ಸಂಯುಕ್ತ ಸಂಸ್ಥಾನ", "name:ko"=>"미국", "name:ks"=>"संयुक्त राज्य अमेरिका", "name:ku"=>"Dewletên Yekbûyî yên Amerîkayê", "name:kv"=>"Америкаса Ӧтувтӧм Штатъяс", "name:kw"=>"Statys Unys Amerika", "name:ky"=>"Америка Кошмо Штаттары", "name:la"=>"Civitates Foederatae Americae", "name:lb"=>"Vereenegt Staate vun Amerika", "name:lg"=>"Amereka", "name:li"=>"Vereinegde State van Amerika", "name:ln"=>"Lisangá lya Ameríka", "name:lo"=>"ສະຫະລັດອາເມລິກາ", "name:lt"=>"Jungtinės Amerikos Valstijos", "name:lv"=>"Amerikas Savienotās Valstis", "name:mg"=>"Etazonia", "name:mi"=>"Amerika", "name:mk"=>"Соединети Американски Држави", "name:ml"=>"അമേരിക്കന് ഐക്യനാടുകള്", "name:mn"=>"Америкийн Нэгдсэн Улс", "name:mo"=>"Стателе Уните але Америчий", "name:mr"=>"अमेरिकेची संयुक्त संस्थाने", "name:ms"=>"Amerika Syarikat", "name:mt"=>"Stati Uniti tal-Amerika", "name:my"=>"အမေရိကန်ပြည်ထောင်စု", "name:na"=>"Eben Merika", "name:nb"=>"USA", "name:ne"=>"संयुक्त राज्य अमेरिका", "name:nl"=>"Verenigde Staten", "name:nn"=>"USA", "name:no"=>"Amerikas forente stater", "name:nv"=>"Wááshindoon Bikéyah Ałhidadiidzooígíí", "name:oc"=>"Estats Units d'America", "name:om"=>"USA", "name:or"=>"ଯୁକ୍ତରାଷ୍ଟ୍ର ଆମେରିକା", "name:os"=>"Америкæйы Иугонд Штаттæ", "name:pa"=>"ਸੰਯੁਕਤ ਰਾਜ ਅਮਰੀਕਾ", "name:pl"=>"Stany Zjednoczone", "name:ps"=>"د امريکا متحده ايالات", "name:pt"=>"Estados Unidos da América", "name:qu"=>"Hukllachasqa Amirika Suyukuna", "name:rm"=>"Stadis Unids da l'America", "name:rn"=>"Leta Zunze Ubumwe za Amerika", "name:ro"=>"Statele Unite ale Americii", "name:ru"=>"Соединённые Штаты Америки", "name:rw"=>"Leta Zunze Ubumwe z’Amerika", "name:sa"=>"संयुक्तानि राज्यानि", "name:sc"=>"Istados Unidos de America", "name:sd"=>"آمريڪا", "name:se"=>"Amerihká ovttastuvvan stáhtat", "name:sg"=>"ÂKödörö-ôko tî Amerîka", "name:sh"=>"Sjedinjene Američke Države", "name:si"=>"අ'මෙරිකාවේ එක්සත් රාජ්යයන්", "name:sk"=>"Spojené štáty americké", "name:sl"=>"Združene države Amerike", "name:sm"=>"Iunaite Sitete o Amerika", "name:sn"=>"United States of America", "name:so"=>"Mareykanka", "name:sq"=>"Shtetet e Bashkuara të Amerikës", "name:sr"=>"Сједињене Америчке Државе", "name:ss"=>"IMelika", "name:su"=>"Amérika Sarikat", "name:sv"=>"Amerikas Förenta Stater", "name:sw"=>"Muungano wa Madola ya Amerika", "name:ta"=>"அமெரிக்க ஐக்கிய நாடு", "name:te"=>"అమెరికా సంయుక్త రాష్ట్రాలు", "name:tg"=>"Иёлоти Муттаҳидаи Амрико", "name:th"=>"สหรัฐอเมริกา", "name:tk"=>"Amerikanyň Birleşen Ştatlary", "name:tl"=>"Estados Unidos", "name:tn"=>"USA", "name:to"=>"Puleʻanga Fakataha 'o 'Amelika", "name:tr"=>"Amerika Birleşik Devletleri", "name:ts"=>"United States", "name:tt"=>"Америка Кушма Штатлары", "name:tw"=>"USA", "name:ty"=>"Fenua Marite", "name:ug"=>"ئامېرىكا قوشما شتاتلىرى", "name:uk"=>"Сполучені Штати Америки", "name:ur"=>"ریاستہائے متحدہ امریکہ", "name:uz"=>"Amerika Qoʻshma Shtatlari", "name:vi"=>"Hoa Kỳ", "name:vo"=>"Lamerikän", "name:wa"=>"Estats Unis d' Amerike", "name:wo"=>"Diwaan-yu-Bennoo yu Aamerig", "name:xh"=>"IYunayithedi Steyitsi", "name:yi"=>"פאראייניקטע שטאטן פון אמעריקע", "name:yo"=>"Àwọn Ìpínlẹ̀ Aṣọ̀kan Amẹ́ríkà", "name:za"=>"Meijgoz", "name:zh"=>"美利坚合众国/美利堅合眾國", "name:zu"=>"IMelika"
-de     "name"=>"Deutschland", "name:ab"=>"Алмантәыла", "name:af"=>"Duitsland", "name:ak"=>"Germany", "name:am"=>"ጀርመን", "name:an"=>"Alemanya", "name:ar"=>"ألمانيا", "name:av"=>"Алмания", "name:ay"=>"Alimaña", "name:az"=>"Almaniya", "name:ba"=>"Германия", "name:be"=>"Германія", "name:bg"=>"Германия", "name:bi"=>"Germany", "name:bm"=>"Jermani", "name:bn"=>"জার্মানি", "name:bo"=>"འཇར་མན།", "name:br"=>"Alamagn", "name:bs"=>"Njemačka", "name:ca"=>"Alemanya", "name:ce"=>"Германи", "name:co"=>"Germania", "name:cs"=>"Německo", "name:cu"=>"Нѣмьци", "name:cv"=>"Германи", "name:cy"=>"Yr Almaen", "name:da"=>"Tyskland", "name:de"=>"Deutschland", "name:dv"=>"ޖަރުމަނުވިލާތް", "name:dz"=>"ཇཱར་མ་ནི", "name:ee"=>"Germany", "name:el"=>"Γερμανία", "name:en"=>"Germany", "name:eo"=>"Germanio", "name:es"=>"Alemania", "name:et"=>"Saksamaa", "name:eu"=>"Alemania", "name:fa"=>"آلمان", "name:ff"=>"Almaanya", "name:fi"=>"Saksa", "name:fo"=>"Týskland", "name:fr"=>"Allemagne", "name:fy"=>"Dútslân", "name:ga"=>"An Ghearmáin", "name:gd"=>"A' Ghearmailt", "name:gl"=>"Alemaña", "name:gn"=>"Alemaña", "name:gu"=>"જર્મની", "name:gv"=>"Yn Ghermaan", "name:ha"=>"Jamus", "name:he"=>"גרמניה", "name:hi"=>"जर्मनी", "name:hr"=>"Njemačka", "name:ht"=>"Almay", "name:hu"=>"Németország", "name:hy"=>"Գերմանիա", "name:ia"=>"Germania", "name:id"=>"Jerman", "name:ie"=>"Germania", "name:ig"=>"Jémanị", "name:io"=>"Germania", "name:is"=>"Þýskaland", "name:it"=>"Germania", "name:iu"=>"ᔮᒪᓂ", "name:ja"=>"ドイツ", "name:jv"=>"Jerman", "name:ka"=>"გერმანია", "name:kg"=>"Alemanyi", "name:ki"=>"Germany", "name:kk"=>"Германия Федеративтік Республикасы", "name:kl"=>"Tyskit Nunaat", "name:km"=>"អាល្លឺម៉ង់", "name:kn"=>"ಜರ್ಮನಿ", "name:ko"=>"독일", "name:ks"=>"جرمٔنی", "name:ku"=>"Almanya", "name:kv"=>"Германия", "name:kw"=>"Almayn", "name:ky"=>"Германия", "name:la"=>"Germania", "name:lb"=>"Däitschland", "name:lg"=>"Girimane", "name:li"=>"Duutsjlandj", "name:ln"=>"Alémani", "name:lo"=>"ປະເທດເຢັຽລະມັນ", "name:lt"=>"Vokietija", "name:lv"=>"Vācija", "name:mg"=>"Alemaina", "name:mi"=>"Tiamani", "name:mk"=>"Германија", "name:ml"=>"ജർമ്മനി", "name:mn"=>"Герман", "name:mo"=>"Ӂермания", "name:mr"=>"जर्मनी", "name:ms"=>"Jerman", "name:mt"=>"Ġermanja", "name:my"=>"ဂျာမနီနိုင်ငံ", "name:na"=>"Djermani", "name:ne"=>"जर्मनी", "name:nl"=>"Duitsland", "name:nn"=>"Tyskland", "name:no"=>"Tyskland", "name:nv"=>"Béésh Bichʼahii Bikéyah", "name:oc"=>"Alemanha", "name:or"=>"ଜର୍ମାନୀ", "name:os"=>"Герман", "name:pa"=>"ਜਰਮਨੀ", "name:pl"=>"Niemcy", "name:ps"=>"آلمان", "name:pt"=>"Alemanha", "name:qu"=>"Alimanya", "name:rm"=>"Germania", "name:rn"=>"Ubudagi", "name:ro"=>"Germania", "name:ru"=>"Германия", "name:rw"=>"Ubudage", "name:sa"=>"जर्मनी", "name:sc"=>"Germània", "name:se"=>"Duiska", "name:sh"=>"Nemačka", "name:si"=>"ජර්මනිය", "name:sk"=>"Nemecko", "name:sl"=>"Nemčija", "name:sm"=>"Siamani", "name:so"=>"Jarmalka", "name:sq"=>"Gjermania", "name:sr"=>"Немачка", "name:ss"=>"IJalimane", "name:su"=>"Jérman", "name:sv"=>"Tyskland", "name:sw"=>"Ujerumani", "name:ta"=>"செருமனி", "name:te"=>"జర్మనీ", "name:tg"=>"Олмон", "name:th"=>"ประเทศเยอรมนี", "name:ti"=>"ጀርመን", "name:tk"=>"Germaniýa", "name:tl"=>"Alemanya", "name:tr"=>"Almanya", "name:ts"=>"Jarimani", "name:tt"=>"Алмания", "name:tw"=>"Gyaaman", "name:ty"=>"Heremani", "name:ug"=>"گېرمانىيە", "name:uk"=>"Німеччина", "name:ur"=>"جرمنی", "name:uz"=>"Olmoniya", "name:vi"=>"Đức", "name:vo"=>"Deutän", "name:wa"=>"Almagne", "name:wo"=>"Almaañ", "name:xh"=>"IJamani", "name:yi"=>"דייטשלאנד", "name:yo"=>"Jẹ́mánì", "name:za"=>"Dwzgoz", "name:zh"=>"德国", "name:zu"=>"IJalimani"
-fr     "name"=>"France", "name:af"=>"Frankryk", "name:ak"=>"Frɛnkyeman", "name:am"=>"ፈረንሣይ", "name:an"=>"Francia", "name:ar"=>"فرنسا", "name:as"=>"ফ্ৰান্স", "name:ay"=>"Phransiya", "name:az"=>"Fransa", "name:ba"=>"Франция", "name:be"=>"Францыя", "name:bg"=>"Франция", "name:bi"=>"Franis", "name:bm"=>"France", "name:bn"=>"ফ্রান্স", "name:bo"=>"ཧྥ་རན་སི།", "name:br"=>"Bro-C'hall", "name:bs"=>"Francuska", "name:ca"=>"França", "name:ce"=>"Франци", "name:co"=>"Francia", "name:cs"=>"Francie", "name:cu"=>"Франкїꙗ", "name:cv"=>"Франци", "name:cy"=>"Ffrainc", "name:da"=>"Frankrig", "name:de"=>"Frankreich", "name:dv"=>"ފަރަންސޭސިވިލާތް", "name:dz"=>"ཕརཱནསི་", "name:ee"=>"France", "name:el"=>"Γαλλία", "name:en"=>"France", "name:eo"=>"Francio", "name:es"=>"Francia", "name:et"=>"Prantsusmaa", "name:eu"=>"Frantzia", "name:fa"=>"فرانسه", "name:ff"=>"Faransi", "name:fi"=>"Ranska", "name:fo"=>"Frakland", "name:fr"=>"France", "name:fy"=>"Frankryk", "name:ga"=>"An Fhrainc", "name:gd"=>"An Fhraing", "name:gl"=>"Francia", "name:gn"=>"Hyãsia", "name:gu"=>"ફ્રાન્સ", "name:gv"=>"Yn Rank", "name:ha"=>"Faransa", "name:he"=>"צרפת", "name:hi"=>"फ़्रान्स", "name:hr"=>"Francuska", "name:ht"=>"Frans", "name:hu"=>"Franciaország", "name:hy"=>"Ֆրանսիա", "name:ia"=>"Francia", "name:id"=>"Perancis", "name:ie"=>"Francia", "name:io"=>"Francia", "name:is"=>"Frakkland", "name:it"=>"Francia", "name:ja"=>"フランス", "name:jv"=>"Prancis", "name:ka"=>"საფრანგეთი", "name:kg"=>"Fwalansa", "name:ki"=>"Ubaranja", "name:kk"=>"Франция", "name:kl"=>"Frankrigi", "name:km"=>"បារាំង", "name:kn"=>"ಫ್ರಾನ್ಸ್", "name:ko"=>"프랑스", "name:ks"=>"فرٛانس", "name:ku"=>"Fransa", "name:kv"=>"Франция", "name:kw"=>"Pow Frynk", "name:ky"=>"Франция", "name:la"=>"Francia", "name:lb"=>"Frankräich", "name:lg"=>"Bufalansa", "name:li"=>"Frankriek", "name:ln"=>"Falansia", "name:lo"=>"ປະເທດຝະລັ່ງ", "name:lt"=>"Prancūzija", "name:lv"=>"Francija", "name:mg"=>"Frantsa", "name:mi"=>"Wīwī", "name:mk"=>"Франција", "name:ml"=>"ഫ്രാൻസ്", "name:mn"=>"Франц", "name:mo"=>"Франца", "name:mr"=>"फ्रान्स", "name:ms"=>"Perancis", "name:mt"=>"Franza", "name:my"=>"ပြင်သစ်နိုင်ငံ", "name:na"=>"Prant", "name:ne"=>"फ्रान्स", "name:nl"=>"Frankrijk", "name:nn"=>"Frankrike", "name:no"=>"Frankrike", "name:nv"=>"Dáághahii Dineʼé Bikéyah", "name:oc"=>"França", "name:or"=>"ଫ୍ରାନ୍ସ", "name:os"=>"Франц", "name:pa"=>"ਫ੍ਰਾਂਸ", "name:pl"=>"Francja", "name:ps"=>"فرانسه", "name:pt"=>"França", "name:qu"=>"Ransiya", "name:rm"=>"Frantscha", "name:rn"=>"Francia", "name:ro"=>"Franța", "name:ru"=>"Франция", "name:rw"=>"Ubufaransa", "name:sa"=>"फ्रान्सदेशः", "name:sc"=>"Frantza", "name:se"=>"Frankriika", "name:sg"=>"Farânzi", "name:sh"=>"Francuska", "name:si"=>"ප්රංශය", "name:sk"=>"Francúzsko", "name:sl"=>"Francija", "name:sm"=>"Farani", "name:so"=>"Faransiiska", "name:sq"=>"Franca", "name:sr"=>"Француска", "name:ss"=>"IFulansi", "name:st"=>"Fora", "name:su"=>"Perancis", "name:sv"=>"Frankrike", "name:sw"=>"Ufaransa", "name:ta"=>"பிரான்சு", "name:te"=>"ఫ్రాన్స్", "name:tg"=>"Фаронса", "name:th"=>"ประเทศฝรั่งเศส", "name:ti"=>"ፈረንሳይ", "name:tk"=>"Fransiýa", "name:tl"=>"Pransiya", "name:to"=>"Falanisē", "name:tr"=>"Fransa", "name:tt"=>"Франция", "name:ty"=>"Farāni", "name:ug"=>"فرانسىيە", "name:uk"=>"Франція", "name:ur"=>"فرانس", "name:uz"=>"Fransiya", "name:vi"=>"Pháp", "name:vo"=>"Fransän", "name:wa"=>"France", "name:wo"=>"Faraas", "name:yi"=>"פראנקרייך", "name:yo"=>"Fránsì", "name:za"=>"Fazgoz", "name:zh"=>"法國/法国", "name:zu"=>"IFulansi"
-ch     "name"=>"Schweiz/Suisse/Svizzera/Svizra", "name:af"=>"Switserland", "name:am"=>"ስዊዘርላንድ", "name:an"=>"Suiza", "name:ar"=>"سويسرا", "name:az"=>"İsveçrə", "name:ba"=>"Швейцария", "name:be"=>"Швейцарыя", "name:bg"=>"Швейцария", "name:bi"=>"Switzerland", "name:bn"=>"Switzerland", "name:bo"=>"སུད་སི།", "name:br"=>"Suis", "name:bs"=>"Švicarska", "name:ca"=>"Suïssa", "name:ce"=>"Швейцари", "name:co"=>"Svizzera", "name:cs"=>"Švýcarsko", "name:cu"=>"Свицєра", "name:cv"=>"Швейцари", "name:cy"=>"Y Swistir", "name:da"=>"Schweiz", "name:de"=>"Schweiz", "name:dv"=>"ސުވިޒަލޭންޑު", "name:dz"=>"སུའིཊ་ཛར་ལེན་", "name:ee"=>"Switzerland", "name:el"=>"Ελβετία", "name:en"=>"Switzerland", "name:eo"=>"Svislando", "name:es"=>"Suiza", "name:et"=>"Šveits", "name:eu"=>"Suitza", "name:fa"=>"سوئیس", "name:fi"=>"Sveitsi", "name:fo"=>"Sveis", "name:fr"=>"Suisse", "name:fy"=>"Switserlân", "name:ga"=>"An Eilbhéis", "name:gd"=>"An Eilbheis", "name:gl"=>"Suíza", "name:gn"=>"Suisa", "name:gu"=>"સ્વિત્ઝરલેન્ડ", "name:gv"=>"Yn Elveeish", "name:he"=>"שוויץ", "name:hi"=>"स्विट्ज़रलैंड", "name:hr"=>"Švicarska", "name:ht"=>"Swis", "name:hu"=>"Svájc", "name:hy"=>"Շվեյցարիա", "name:ia"=>"Suissa", "name:id"=>"Swiss", "name:ie"=>"Svissia", "name:io"=>"Suisia", "name:is"=>"Sviss", "name:it"=>"Svizzera", "name:ja"=>"スイス", "name:jv"=>"Swiss", "name:ka"=>"შვეიცარია", "name:kg"=>"Suisi", "name:kk"=>"Швейцария", "name:kl"=>"Schweizi", "name:kn"=>"ಸ್ವಿಟ್ಜರ್ಲ್ಯಾಂಡ್", "name:ko"=>"스위스", "name:ku"=>"Swîsre", "name:kv"=>"Швейцария", "name:kw"=>"Swistir", "name:ky"=>"Швейцария", "name:la"=>"Helvetia", "name:lb"=>"Schwäiz", "name:li"=>"Zweitserland", "name:ln"=>"Swisi", "name:lt"=>"Šveicarija", "name:lv"=>"Šveice", "name:mg"=>"Soisa", "name:mi"=>"Huiterangi", "name:mk"=>"Швајцарија", "name:ml"=>"സ്വിറ്റ്സര്ലാന്റ്", "name:mn"=>"Швейцари", "name:mr"=>"स्वित्झर्लंड", "name:ms"=>"Switzerland", "name:mt"=>"Żvizzera", "name:my"=>"ဆွစ်ဇာလန်နိုင်ငံ", "name:na"=>"Switzerland", "name:ne"=>"स्विजरल्याण्ड", "name:nl"=>"Zwitserland", "name:nn"=>"Sveits", "name:no"=>"Sveits", "name:nv"=>"Swis Bikéyah", "name:oc"=>"Soïssa", "name:or"=>"ସୁଇଜରଲ୍ୟାଣ୍ଡ", "name:os"=>"Швейцари", "name:pa"=>"ਸਵਿਟਜ਼ਰਲੈਂਡ", "name:pl"=>"Szwajcaria", "name:ps"=>"سويس", "name:pt"=>"Suíça", "name:qu"=>"Suwisa", "name:rm"=>"Svizra", "name:ro"=>"Elveţia", "name:ru"=>"Швейцария", "name:rw"=>"Ubusuwisi", "name:sa"=>"स्विटजरलैंड", "name:sc"=>"Isvìtzera", "name:se"=>"Šveica", "name:sh"=>"Švajcarska", "name:si"=>"ස්විට්සර්ලන්තය", "name:sk"=>"Švajčiarsko", "name:sl"=>"Švica", "name:so"=>"Iswiizerlaan", "name:sq"=>"Zvicra", "name:sr"=>"Швајцарска", "name:ss"=>"ISwizalandi", "name:su"=>"Suis", "name:sv"=>"Schweiz", "name:sw"=>"Uswisi", "name:ta"=>"சுவிட்சர்லாந்து", "name:te"=>"స్విట్జర్లాండ్", "name:tg"=>"Швейтсария", "name:th"=>"ประเทศสวิตเซอร์แลนด์", "name:tk"=>"Şweýsariýa", "name:tl"=>"Suwisa", "name:tr"=>"İsviçre", "name:tt"=>"Швейцария", "name:ug"=>"Shwétsariye", "name:uk"=>"Швейцарія", "name:ur"=>"سویٹزر لینڈ", "name:uz"=>"Shveysariya", "name:vi"=>"Thụy Sĩ", "name:vo"=>"Jveizän", "name:wo"=>"Suwis", "name:yi"=>"שווייץ", "name:yo"=>"Swítsàlandì", "name:za"=>"Nyeiqswq", "name:zh"=>"瑞士"
-ba     "name"=>"Bosna i Hercegovina / Босна и Херцеговина", "name:af"=>"Bosnië en Herzegowina", "name:ak"=>"Bosnia and Herzegovina", "name:am"=>"ቦስኒያና ሄርጸጎቪና", "name:an"=>"Bosnia y Herzegovina", "name:ar"=>"البوسنة والهرسك", "name:av"=>"Бо́сния ва Герцегови́на", "name:az"=>"Bosniya və Herseqovina", "name:ba"=>"Босния һәм Герцеговина", "name:be"=>"Бо́снія і Герцагаві́на", "name:bg"=>"Босна и Херцеговина", "name:bh"=>"बोस्निया आ हर्जेगोविना", "name:bi"=>"Bosnia mo Herzegovina", "name:bm"=>"Bozni-Ɛrizigovini", "name:bn"=>"বসনিয়া ও হার্জেগোভিনা", "name:bo"=>"བྷོསུ་ནིཡ་དང་ཧར་ཛེ་གྷོ་ཝི་ན།", "name:br"=>"Bosnia-ha-Herzegovina", "name:bs"=>"Bosna i Hercegovina", "name:ca"=>"Bòsnia i Hercegovina", "name:ce"=>"Босни а Герцеговина а", "name:co"=>"Bosnia è Erzegovina", "name:cs"=>"Bosna a Hercegovina", "name:cu"=>"Босна́", "name:cv"=>"Босни тата Герцеговина", "name:cy"=>"Bosnia a Hercegovina", "name:da"=>"Bosnien og Hercegovina", "name:de"=>"Bosnien und Herzegowina", "name:dv"=>"ބޮސްނިޔާ އެންޑް ހެރްޒިގޮވީނާ", "name:ee"=>"Bosnia and Herzegovina", "name:el"=>"Βοσνία και Ερζεγοβίνη", "name:en"=>"Bosnia and Herzegovina", "name:eo"=>"Bosnio kaj Hercegovino", "name:es"=>"Bosnia y Herzegovina", "name:et"=>"Bosnia ja Hertsegoviina", "name:eu"=>"Bosnia eta Herzegovinako", "name:fa"=>"بوسنی و هرزگوین", "name:ff"=>"Bosniya e Herzegovina", "name:fi"=>"Bosnia ja Hertsegovina", "name:fo"=>"Bosnia og Hersegovina", "name:fr"=>"Bosnie-et-Herzégovine", "name:fy"=>"Bosnje-Hertsegovina", "name:ga"=>"an Bhoisnia-Heirseagaivéin", "name:gd"=>"Bosna agus Hearsagobhana", "name:gl"=>"Bosnia e Hercegovina", "name:gn"=>"Vonia ha Hesegovina", "name:gu"=>"બોસ્નિયા અને હર્ઝેગોવિના", "name:gv"=>"Bosnia as Herzegovina", "name:ha"=>"Bosnia da Herzegovina", "name:he"=>"בּוֹסְנִיָּה וְהֶרְצֶגוֹבִינָה", "name:hi"=>"बॉस्निया और हर्ज़ेगोविना", "name:hr"=>"Bosna i Hercegovina", "name:ht"=>"Bosni ak Erzegovin", "name:hu"=>"Bosznia-Hercegovina", "name:hy"=>"Բոսնիա և Հերցեգովինա", "name:ia"=>"Bosnia e Herzegovina", "name:id"=>"Bosnia dan Herzegovina", "name:ie"=>"Bosnia e Herzegovina", "name:ig"=>"Bosnia na Herzegovina", "name:io"=>"Bosnia e Herzegovina", "name:is"=>"Bosnía og Hersegóvína", "name:it"=>"Bosnia ed Erzegovina", "name:ja"=>"ボスニア・ヘルツェゴビナ", "name:jv"=>"Bosnia lan Hércegovina", "name:ka"=>"ბოსნია და ჰერცეგოვინა", "name:kg"=>"Bosna", "name:ki"=>"Mbocinia na Hecengobina", "name:kk"=>"Босния және Герцеговина", "name:kl"=>"Bosnia-Hercegovina", "name:km"=>"បូស្ន៉ី", "name:kn"=>"ಬೊಸ್ನಿಯ ಮತ್ತು ಹೆರ್ಜೆಗೊವಿನ", "name:ko"=>"보스니아 헤르체고비나", "name:ks"=>"बास्निया", "name:ku"=>"Bosniya û Herzegovîna", "name:kv"=>"Босния да Герцеговина", "name:kw"=>"Bosni–Hercegovina", "name:ky"=>"Босния жана Герцеговина", "name:la"=>"Bosnia et Herzegovina", "name:lb"=>"Bosnien an Herzegowina", "name:li"=>"Bosnië en Herzegovina", "name:ln"=>"Bosnia na Erzegovina", "name:lo"=>"ປະເທດບົດສະນີແຮກເຊໂກວີນ", "name:lt"=>"Bosnija ir Hercegovina", "name:lv"=>"Bosnija un Hercegovina", "name:mg"=>"Bosnia sy Herzegovina", "name:mi"=>"Pōngia-Herekōmina", "name:mk"=>"Босна и Херцеговина", "name:ml"=>"ബോസ്നിയ ആന്റ് ഹെർസെഗോവിന", "name:mn"=>"Босни ба Херцеговина", "name:mr"=>"बॉस्निया आणि हर्झगोव्हिना", "name:ms"=>"Bosnia dan Herzegovina", "name:mt"=>"Bożnija u Ħerżegovina", "name:my"=>"ဘော့စနီးယားနှင့် ဟာဇီဂိုးဗီးနားနိုင်ငံ", "name:na"=>"Boteniya me Erdegobina", "name:ne"=>"बोस्निया र हर्जगोभिना", "name:nl"=>"Bosnië en Herzegovina", "name:nn"=>"Bosnia-Hercegovina", "name:no"=>"Bosnia-Hercegovina", "name:nv"=>"Bosna dóó Hetsog Bikéyah", "name:oc"=>"Bòsnia e Ercegovina", "name:om"=>"Boosniyaa fi Herzegoviinaa", "name:or"=>"ବୋସନିଆ ଓ ହରଜଗୋଭିନା", "name:os"=>"Босни æмæ Герцеговинæ", "name:pa"=>"ਬੋਸਨੀਆ ਅਤੇ ਹਰਜ਼ੇਗੋਵੀਨਾ", "name:pi"=>"बास्निया", "name:pl"=>"Bośnia i Hercegowina", "name:ps"=>"بوسنيا او هېرزګوينا", "name:pt"=>"Bósnia e Herzegovina", "name:qu"=>"Busna-Hirsiquwina", "name:rm"=>"Bosnia-Erzegovina", "name:rn"=>"Bosiniya na Herigozevine", "name:ro"=>"Bosnia și Herțegovina", "name:ru"=>"Босния и Герцеговина", "name:rw"=>"Bosiniya na Herizegovina", "name:sa"=>"बास्निया", "name:sc"=>"Bòsnia e Erzegòvina", "name:se"=>"Bosnia ja Hercegovina", "name:sg"=>"Bosnïi na Herzegovînni", "name:sh"=>"Bosna i Hercegovina", "name:si"=>"බොස්නියා සහ හර්සගෝවිනා", "name:sk"=>"Bosna a Hercegovina", "name:sl"=>"Bosna in Hercegovina", "name:sm"=>"Bosnia ma Herzegovina", "name:sn"=>"Bosnia and Herzegovina", "name:so"=>"Bosniya iyo Herzegovina", "name:sq"=>"Bosnja dhe Hercegovina", "name:sr"=>"Босна и Херцеговина", "name:ss"=>"iBhosinya ne Hezegovi", "name:su"=>"Bosnia jeung Hérzégovina", "name:sv"=>"Bosnien och Hercegovina", "name:sw"=>"Bosnia na Herzegovina", "name:ta"=>"பொசுனியாவும் எர்செகோவினாவும்", "name:te"=>"బోస్నియా మరియు హెర్జెగొవీనా", "name:tg"=>"Босния ва Ҳерсеговина", "name:th"=>"บอสเนียและเฮอร์เซโกวีนา", "name:ti"=>"ቦስኒያ እና ሄርዞጎቪኒያ", "name:tk"=>"Bosniýa we Gersegowina", "name:tl"=>"Bosnia at Herzegovina", "name:to"=>"Posinia mo Hesikōvinia", "name:tr"=>"Bosna-Hersek", "name:ts"=>"Bosnia and Herzegovina", "name:tt"=>"Бо́сния һәм Герцегови́на", "name:ty"=>"Pōtinia-Heretōvina", "name:ug"=>"بوسنىيە ۋە ھېرسېگوۋىنا", "name:uk"=>"Бо́снія і Герцеґови́на", "name:ur"=>"بوسنیا و ہرزیگووینا", "name:uz"=>"Bosniya va Gersegovina", "name:vi"=>"Bosnia và Herzegovina", "name:vo"=>"Bosnän e Härzegovän", "name:wa"=>"Bosneye", "name:wo"=>"Bosni Hersegowin", "name:yi"=>"באסניע און הערצעגאווינע", "name:yo"=>"Bósníà àti Hẹrjẹgòfínà", "name:zh"=>"波斯尼亞和黑塞哥維那", "name:zu"=>"IBhosniya neHerzegovina"
-fi     "name"=>"Suomi", "name:ab"=>"Суоми", "name:af"=>"Finland", "name:am"=>"ፊንላንድ", "name:an"=>"Finlandia", "name:ar"=>"فنلندا", "name:ay"=>"Phini suyu", "name:az"=>"Finlandiya", "name:ba"=>"Финляндия", "name:be"=>"Фінляндыя", "name:bg"=>"Финландия", "name:bi"=>"Finland", "name:bm"=>"Finland", "name:bn"=>"ফিনল্যান্ড", "name:bo"=>"ཧྥིན་ལན", "name:br"=>"Finland", "name:bs"=>"Finska", "name:ca"=>"Finlàndia", "name:ce"=>"Финлянди", "name:co"=>"Finlandia", "name:cs"=>"Finsko", "name:cu"=>"Соумь", "name:cv"=>"Финлянди", "name:cy"=>"Y Ffindir", "name:da"=>"Finland", "name:de"=>"Finnland", "name:dv"=>"ފިންލޭންޑު", "name:dz"=>"ཕིན་ལེནཌ་", "name:ee"=>"Finland", "name:el"=>"Φινλανδία", "name:en"=>"Finland", "name:eo"=>"Finnlando", "name:es"=>"Finlandia", "name:et"=>"Soome", "name:eu"=>"Finlandia", "name:fa"=>"فنلاند", "name:fi"=>"Suomi", "name:fo"=>"Finnland", "name:fr"=>"Finlande", "name:fy"=>"Finlân", "name:ga"=>"An Fhionlainn", "name:gd"=>"Suòmaidh", "name:gl"=>"Finlandia", "name:gn"=>"Hĩlandia", "name:gu"=>"ફીનલેંડ", "name:gv"=>"Finnlynn", "name:he"=>"פינלנד", "name:hi"=>"फ़िनलैंड", "name:hr"=>"Finska", "name:ht"=>"Fenlann", "name:hu"=>"Finnország", "name:hy"=>"Ֆինլանդիա", "name:ia"=>"Finlandia", "name:id"=>"Finlandia", "name:ie"=>"Finland", "name:ig"=>"Finland", "name:io"=>"Finlando", "name:is"=>"Finnland", "name:it"=>"Finlandia", "name:iu"=>"ᐃᓐᓚᓐᑦ", "name:ja"=>"フィンランド", "name:jv"=>"Finlandia", "name:ka"=>"ფინეთი", "name:kg"=>"Finlandi", "name:ki"=>"Finland", "name:kk"=>"Финландия", "name:kl"=>"Finlandi", "name:kn"=>"ಫಿನ್‍ಲ್ಯಾಂಡ್", "name:ko"=>"핀란드", "name:ks"=>"فننش", "name:ku"=>"Fînland", "name:kv"=>"Финляндия", "name:kw"=>"Pow Finn", "name:ky"=>"Финляндия", "name:la"=>"Finnia", "name:lb"=>"Finnland", "name:lg"=>"Finilandi", "name:li"=>"Finland", "name:ln"=>"Finilanda", "name:lt"=>"Suomija", "name:lv"=>"Somija", "name:mg"=>"Finlandy", "name:mi"=>"Whinarana", "name:mk"=>"Финска", "name:ml"=>"ഫിൻലാന്റ്", "name:mn"=>"Финлянд", "name:mr"=>"फिनलंड", "name:ms"=>"Finland", "name:mt"=>"Finlandja", "name:my"=>"ဖင်လန်နိုင်ငံ", "name:na"=>"Finland", "name:ne"=>"फिनल्याण्ड", "name:nl"=>"Finland", "name:nn"=>"Finland", "name:no"=>"Finland", "name:nv"=>"Nahoditsʼǫʼłání", "name:oc"=>"Finlàndia", "name:or"=>"ଫିନଲ୍ୟାଣ୍ଡ", "name:os"=>"Финлянди", "name:pa"=>"ਫ਼ਿਨਲੈਂਡ", "name:pl"=>"Finlandia", "name:ps"=>"فېنلانډ", "name:pt"=>"Finlândia", "name:qu"=>"Phinsuyu", "name:rm"=>"Finlanda", "name:ro"=>"Finlanda", "name:ru"=>"Финляндия", "name:rw"=>"Finilande", "name:sa"=>"फिन्लैंड", "name:sc"=>"Finlandia", "name:se"=>"Suopma", "name:sh"=>"Finska", "name:si"=>"ෆින්ලන්තය", "name:sk"=>"Fínsko", "name:sl"=>"Finska", "name:sm"=>"Finalagi", "name:so"=>"Finland", "name:sq"=>"Finlanda", "name:sr"=>"Финска", "name:ss"=>"IFini", "name:st"=>"Finland", "name:su"=>"Finlandia", "name:sv"=>"Finland", "name:sw"=>"Ufini", "name:ta"=>"பின்லாந்து", "name:te"=>"ఫిన్లెండ్", "name:tg"=>"Финланд", "name:th"=>"ประเทศฟินแลนด์", "name:tk"=>"Finlýandiýa", "name:tl"=>"Pinlandiya", "name:tr"=>"Finlandiya", "name:tt"=>"Finlândiä", "name:ug"=>"فىنلاندىيە", "name:uk"=>"Фінляндія", "name:ur"=>"فن لینڈ", "name:uz"=>"Finlandiya", "name:vi"=>"Phần Lan", "name:vo"=>"Suomiyän", "name:wa"=>"Finlande", "name:wo"=>"Finlaand", "name:yi"=>"פינלאנד", "name:yo"=>"Finlandi", "name:za"=>"Finlan", "name:zh"=>"芬兰", "name:zu"=>"IFinlandi"
-ge     "name"=>"საქართველო", "name:ab"=>"Қырҭтәыла", "name:af"=>"Georgië", "name:am"=>"ጂዮርጂያ", "name:an"=>"Cheorchia", "name:ar"=>"جورجيا", "name:av"=>"Гуржи", "name:az"=>"Gürcüstan", "name:be"=>"Грузія", "name:bg"=>"Грузия", "name:bn"=>"জর্জিয়া (রাষ্ট্র)", "name:bo"=>"འཇོར་ཇི་ཡ། (རྒྱལ་ཁབ།)", "name:br"=>"Jorjia (bro)", "name:bs"=>"Gruzija", "name:ca"=>"Geòrgia", "name:ce"=>"Гуьржийчоь", "name:cs"=>"Gruzie", "name:cu"=>"Гєѡргїꙗ", "name:cv"=>"Грузи", "name:cy"=>"Georgia", "name:da"=>"Georgien", "name:de"=>"Georgien", "name:dv"=>"ޖޯޖިޔާ (ޤައުމު)", "name:dz"=>"ཇཽ་ཇཱ", "name:ee"=>"Georgia", "name:el"=>"Γεωργία", "name:en"=>"Georgia", "name:eo"=>"Kartvelio", "name:es"=>"Georgia", "name:et"=>"Gruusia", "name:eu"=>"Georgia", "name:fa"=>"گرجستان", "name:fi"=>"Georgia", "name:fo"=>"Georgia (land)", "name:fr"=>"Géorgie", "name:fy"=>"Geörgje", "name:ga"=>"An tSeoirsia", "name:gd"=>"A' Chairtbheil", "name:gl"=>"Xeorxia - საქართველო", "name:gu"=>"જ્યોર્જીયા (દેશ)", "name:gv"=>"Yn Çhorshey", "name:he"=>"גאורגיה", "name:hi"=>"जॉर्जिया", "name:hr"=>"Gruzija", "name:ht"=>"Jeoji", "name:hu"=>"Grúzia", "name:hy"=>"Վրաստան", "name:ia"=>"Georgia", "name:id"=>"Georgia", "name:ie"=>"Georgia", "name:io"=>"Gruzia", "name:is"=>"Georgía", "name:it"=>"Georgia", "name:ja"=>"グルジア", "name:jv"=>"Georgia", "name:ka"=>"საქართველო", "name:kk"=>"Грузия", "name:kn"=>"ಜಾರ್ಜಿಯ", "name:ko"=>"조지아 (국가)", "name:ku"=>"Gurcistan", "name:kv"=>"Грузия", "name:kw"=>"Pow Grouzi", "name:ky"=>"Грузия", "name:la"=>"Georgia", "name:lb"=>"Georgien", "name:li"=>"Georgië", "name:lt"=>"Gruzija", "name:lv"=>"Gruzija", "name:mi"=>"Hōria", "name:mk"=>"Грузија", "name:ml"=>"ജോർജ്ജിയ", "name:mn"=>"Гүрж", "name:mr"=>"जॉर्जिया", "name:ms"=>"Georgia", "name:mt"=>"Ġeorġja", "name:my"=>"ဂျော်ဂျီယာနိုင်ငံ", "name:na"=>"Djiordjiya", "name:ne"=>"जर्जिया (देश)", "name:nl"=>"Georgië", "name:nn"=>"Georgia", "name:no"=>"Georgia", "name:nv"=>"Jóojah (Kéyah)", "name:oc"=>"Georgia (Caucàs)", "name:or"=>"ଜର୍ଜିଆ", "name:os"=>"Гуырдзыстон", "name:pl"=>"Gruzja", "name:ps"=>"ګرجستان", "name:pt"=>"Geórgia", "name:qu"=>"Kartulsuyu", "name:ro"=>"Georgia", "name:ru"=>"Грузия", "name:rw"=>"Geworugiya", "name:sc"=>"Georgia", "name:se"=>"Georgia", "name:sh"=>"Gruzija", "name:si"=>"ජෝර්ජියා (රට)", "name:sk"=>"Gruzínsko", "name:sl"=>"Gruzija", "name:so"=>"Joorjiya", "name:sq"=>"Gjeorgjia", "name:sr"=>"Грузија", "name:ss"=>"IJojiya", "name:su"=>"Géorgia", "name:sv"=>"Georgien", "name:sw"=>"Georgia (nchi)", "name:ta"=>"சியார்சியா (நாடு)", "name:te"=>"జార్జియా (దేశం)", "name:tg"=>"Гурҷистон", "name:th"=>"ประเทศจอร์เจีย", "name:tk"=>"Gruziýa", "name:tl"=>"Heorhiya", "name:tr"=>"Gürcistan", "name:tt"=>"Гөрҗистан", "name:ug"=>"گرۇزىيە", "name:uk"=>"Грузія", "name:ur"=>"جارجیا", "name:uz"=>"Gurjiston", "name:vi"=>"Gruzia", "name:vo"=>"Grusiyän", "name:wo"=>"Jeoorji", "name:yi"=>"גרוזיע", "name:yo"=>"Georgia", "name:zh"=>"格鲁吉亚"
-nc     "name"=>"Nouvelle-Calédonie", "name:af"=>"Nieu-Caledonia", "name:ar"=>"كاليدونيا الجديدة", "name:be"=>"Новая Каледонія", "name:br"=>"Kaledonia Nevez", "name:ca"=>"Nova Caledònia", "name:cy"=>"Caledonia Newydd", "name:da"=>"Ny Kaledonien", "name:de"=>"Neukaledonien", "name:el"=>"Νέα Καληδονία", "name:en"=>"New Caledonia", "name:eo"=>"Nov-Kaledonio", "name:es"=>"Nueva Caledonia", "name:fa"=>"کالدونیای جدید", "name:fi"=>"Uusi-Kaledonia", "name:fr"=>"Nouvelle-Calédonie", "name:ga"=>"An Nua-Chaladóin", "name:he"=>"קלדוניה החדשה", "name:hr"=>"Nova Kaledonija", "name:hu"=>"Új-Kaledónia", "name:id"=>"Kaledonia Baru", "name:is"=>"Nýja-Kaledónía", "name:it"=>"Nuova Caledonia", "name:la"=>"Nova Caledonia", "name:lt"=>"Naujoji Kaledonija", "name:lv"=>"Jaunkaledonija", "name:mn"=>"Шинэ Каледони", "name:nl"=>"Nieuw-Caledonië", "name:pl"=>"Nowa Kaledonia", "name:ru"=>"Новая Каледония", "name:sl"=>"Nova Kaledonija", "name:sv"=>"Nya Kaledonien", "name:th"=>"นิวแคลิโดเนีย", "name:tr"=>"Yeni Kaledonya", "name:uk"=>"Нова Каледонія", "name:zh"=>"新喀里多尼亚"
-tm     "name"=>"Türkmenistan", "name:af"=>"Turkmenistan", "name:am"=>"ቱርክመኒስታን", "name:an"=>"Turkmenistán", "name:ar"=>"تركمانستان", "name:av"=>"Туркменистан", "name:az"=>"Türkmənistan", "name:ba"=>"Төрөкмәнстан", "name:be"=>"Туркменістан", "name:bg"=>"Туркменистан", "name:bn"=>"তুর্কমেনিস্তান", "name:bo"=>"ཏུརཀ་མེ་ནི་སུཏན།", "name:br"=>"Turkmenistan", "name:bs"=>"Turkmenistan", "name:ca"=>"Turkmenistan", "name:co"=>"Turkmenistan", "name:cs"=>"Turkmenistán", "name:cv"=>"Туркменистан", "name:cy"=>"Turkmenistan", "name:da"=>"Turkmenistan", "name:de"=>"Turkmenistan", "name:dv"=>"ތުރުކުމެނިސްތާން", "name:ee"=>"Turkmenistan", "name:el"=>"Τουρκμενιστάν", "name:en"=>"Turkmenistan", "name:eo"=>"Turkmenio", "name:es"=>"Turkmenistán", "name:et"=>"Türkmenistan", "name:eu"=>"Turkmenistan", "name:fa"=>"ترکمنستان", "name:fi"=>"Turkmenistan", "name:fo"=>"Turkmenistan", "name:fr"=>"Turkménistan", "name:fy"=>"Turkmenistan", "name:ga"=>"An Tuircméanastáin", "name:gd"=>"Turcmanastàn", "name:gl"=>"Turcomenistán", "name:gu"=>"તુર્કમેનિસ્તાન", "name:gv"=>"Yn Turkmenistaan", "name:he"=>"טורקמניסטן", "name:hi"=>"तुर्कमेनिस्तान", "name:hr"=>"Turkmenistan", "name:ht"=>"Tirkmenistan", "name:hu"=>"Türkmenisztán", "name:hy"=>"Թուրքմենստան", "name:ia"=>"Turkmenistan", "name:id"=>"Turkmenistan", "name:ie"=>"Turkmenistan", "name:io"=>"Turkmenistan", "name:is"=>"Túrkmenistan", "name:it"=>"Turkmenistan", "name:ja"=>"トルクメニスタン", "name:jv"=>"Turkmenistan", "name:ka"=>"თურქმენეთი", "name:kk"=>"Түрікменстан", "name:km"=>"តួរមិនីស្ថាន", "name:kn"=>"ತುರ್ಕಮೆನಿಸ್ತಾನ್", "name:ko"=>"투르크메니스탄", "name:ku"=>"Tirkmenistan", "name:kv"=>"Туркменистан", "name:kw"=>"Pow Turkmen", "name:ky"=>"Түркмөнстан", "name:la"=>"Turcomannia", "name:li"=>"Turkmenistan", "name:ln"=>"Turkmenistáni", "name:lt"=>"Turkmėnija", "name:lv"=>"Turkmenistāna", "name:mk"=>"Туркменистан", "name:ml"=>"തുർക്‌മെനിസ്ഥാൻ", "name:mn"=>"Туркменистан", "name:mr"=>"तुर्कमेनिस्तान", "name:ms"=>"Turkmenistan", "name:my"=>"တာ့ခ်မင်နစ္စတန်နိုင်ငံ", "name:na"=>"Turkmenistan", "name:ne"=>"तुर्कमेनिस्तान", "name:nl"=>"Turkmenistan", "name:nn"=>"Turkmenistan", "name:no"=>"Turkmenistan", "name:nv"=>"Tʼóokmen Bikéyah", "name:oc"=>"Turcmenistan", "name:or"=>"ତୁର୍କମେନିସ୍ଥାନ", "name:os"=>"Туркмени", "name:pa"=>"ਤੁਰਕਮੇਨਸਤਾਨ", "name:pl"=>"Turkmenistan", "name:ps"=>"ترکمنستان", "name:pt"=>"Turquemenistão", "name:qu"=>"Turkminsuyu", "name:ro"=>"Turkmenistan", "name:ru"=>"Туркменистан", "name:rw"=>"Turukimenisitani", "name:sa"=>"तुर्कमिनिस्थान", "name:se"=>"Turkmenistan", "name:sh"=>"Turkmenistan", "name:sk"=>"Turkménsko", "name:sl"=>"Turkmenistan", "name:so"=>"Turkmenistan", "name:sq"=>"Turkmenistani", "name:sr"=>"Туркменистан", "name:ss"=>"IThumekhi", "name:su"=>"Turkménistan", "name:sv"=>"Turkmenistan", "name:sw"=>"Turkmenistan", "name:ta"=>"துருக்மெனிஸ்தான்", "name:te"=>"తుర్కమేనిస్తాన్", "name:tg"=>"Туркманистон", "name:th"=>"ประเทศเติร์กเมนิสถาน", "name:tk"=>"Türkmenistan", "name:tl"=>"Turkmenistan", "name:tr"=>"Türkmenistan", "name:tt"=>"Төрекмәнстан", "name:ug"=>"تۈركمەنىستان", "name:uk"=>"Туркменістан", "name:ur"=>"ترکمانستان", "name:uz"=>"Turkmaniston", "name:vi"=>"Turkmenistan", "name:vo"=>"Turkmenän", "name:wo"=>"Turkumenistaan", "name:yi"=>"טורקמעניסטאן", "name:yo"=>"Turkmẹ́nìstán", "name:zh"=>"土库曼斯坦"
-je     "name"=>"Jersey", "name:af"=>"Jersey", "name:an"=>"Jèrri", "name:ar"=>"جيرزي", "name:az"=>"Cersi", "name:be"=>"Джэрсi", "name:bg"=>"Джърси", "name:br"=>"Jerzenez", "name:bs"=>"Jersey", "name:ca"=>"Jersey", "name:cs"=>"Jersey", "name:cy"=>"Jersey", "name:da"=>"Jersey", "name:de"=>"Jersey", "name:dv"=>"ޖާސޭ", "name:el"=>"Υερσέη", "name:en"=>"Jersey", "name:eo"=>"Ĵerzejo", "name:es"=>"Jersey", "name:et"=>"Jersey", "name:eu"=>"Jersey", "name:fa"=>"جرزی", "name:fi"=>"Jersey", "name:fr"=>"Jersey", "name:ga"=>"Geirsí", "name:gd"=>"Jersey", "name:gl"=>"Illa de Jersey", "name:gv"=>"Jersee", "name:he"=>"ג'רזי", "name:hr"=>"Jersey", "name:hu"=>"Jersey", "name:hy"=>"Ջերսի", "name:id"=>"Jersey", "name:io"=>"Jersey", "name:is"=>"Jersey", "name:it"=>"Isola di Jersey", "name:ja"=>"ジャージー", "name:jv"=>"Jersey", "name:ka"=>"ჯერზი", "name:kn"=>"ಜರ್ಸಿ", "name:ko"=>"저지 섬", "name:kw"=>"Jersi", "name:la"=>"Caesarea Insula", "name:li"=>"Jersey", "name:lt"=>"Džersis", "name:lv"=>"Džērsija", "name:mi"=>"Tōrehe", "name:mn"=>"Жерси", "name:mr"=>"जर्सी", "name:ms"=>"Jersey", "name:ne"=>"जर्सी", "name:nl"=>"Jersey", "name:nn"=>"Jersey", "name:no"=>"Jersey", "name:oc"=>"Jersei", "name:os"=>"Джерси", "name:pa"=>"ਜਰਸੀ", "name:pl"=>"Jersey", "name:pt"=>"Jersey", "name:ro"=>"Insula Jersey", "name:ru"=>"Джерси", "name:rw"=>"Jersey", "name:sh"=>"Jersey", "name:sk"=>"Jersey", "name:sl"=>"Jersey", "name:sq"=>"Jersey", "name:sr"=>"Џерзи", "name:su"=>"Jersey", "name:sv"=>"Jersey", "name:sw"=>"Jersey", "name:ta"=>"யேர்சி", "name:te"=>"జెర్సీ", "name:th"=>"เจอร์ซีย์", "name:tl"=>"Hersey", "name:tr"=>"Jersey", "name:tt"=>"Җерси", "name:uk"=>"Джерсі", "name:ur"=>"جرزی", "name:vi"=>"Jersey", "name:yo"=>"Jersey", "name:zh"=>"澤西島"
-re     "name"=>"Réunion", "name:af"=>"Réunion", "name:ar"=>"ريونيون", "name:be"=>"Руньён", "name:br"=>"Ar Reunion", "name:ca"=>"Illa de la Reunió", "name:da"=>"Reunion", "name:el"=>"Ρεϊνιόν", "name:eo"=>"Reunio", "name:es"=>"La Reunión", "name:fa"=>"رئونیون", "name:fi"=>"Réunion", "name:fr"=>"La Réunion", "name:he"=>"ראוניון", "name:hu"=>"Réunion", "name:is"=>"Réunion", "name:it"=>"Riunione", "name:la"=>"Reunio", "name:lt"=>"Reunionas", "name:lv"=>"Reinjona", "name:mn"=>"Реюньон", "name:pl"=>"Reunion", "name:ru"=>"Реюньон", "name:sl"=>"Reunion", "name:sv"=>"Réunion", "name:th"=>"เรอูนียง", "name:uk"=>"Реюньйон", "name:zh"=>"留尼汪"
-pm     "name"=>"Saint-Pierre-et-Miquelon", "name:af"=>"Saint-Pierre et Miquelon", "name:be"=>"Святы П’ер і Міквелон", "name:da"=>"Saint Pierre og Miquelon", "name:de"=>"Saint-Pierre und Miquelon", "name:en"=>"Saint Pierre and Miquelon", "name:eo"=>"Sankta-Piero kaj Mikelono", "name:es"=>"San Pedro y Miguelón", "name:fi"=>"Saint-Pierre ja Miquelon", "name:fr"=>"Saint-Pierre-et-Miquelon", "name:hr"=>"Sveti Petar i Mikelon", "name:hu"=>"Saint-Pierre és Miquelon", "name:lt"=>"Sen Pjeras ir Mikelonas", "name:lv"=>"Senpjēra un Mikelona", "name:mn"=>"Сент Пьер ба Микелон", "name:sv"=>"Saint-Pierre och Miquelon", "name:tr"=>"Saint-Pierre ve Miquelon", "name:uk"=>"Сен-П'єр і Мікелон"
-vc     "name"=>"Saint Vincent and the Grenadines", "name:af"=>"Sint Vincent en die Grenadines", "name:ar"=>"سانت فنسنت وجزر غرينادين", "name:be"=>"Святы Вінцэнт і Грэнадзіны", "name:br"=>"Sant-Visant hag ar Grenadinez", "name:ca"=>"Saint Vincent i les Grenadines", "name:cs"=>"Svatý Vincent a Grenadiny", "name:cy"=>"Saint Vincent a'r Grenadines", "name:da"=>"Saint Vincent og Grenadinerne", "name:de"=>"St. Vincent und die Grenadinen", "name:el"=>"Άγιος Βικέντιος και Γρεναδίνες", "name:en"=>"Saint Vincent and the Grenadines", "name:eo"=>"Sankta Vincento kaj Grenadinoj", "name:es"=>"San Vicente y las Granadinas", "name:fa"=>"سنت وینسنت و گرنادین", "name:fi"=>"Saint Vincent ja Grenadiinit", "name:fr"=>"Saint-Vincent-et-les Grenadines", "name:fy"=>"Sint Finsint en de Grenadinen", "name:ga"=>"San Uinseann agus na Greanáidíní", "name:gd"=>"Naomh Bhionsant agus Eileanan Greanadach", "name:he"=>"סנט וינסנט והגרנדינים", "name:hr"=>"Sveti Vincent i Grenadini", "name:hu"=>"Saint Vincent és a Grenadine-szigetek", "name:id"=>"Saint Vincent dan Grenadines", "name:is"=>"Sankti Vinsent og Grenadíneyjar", "name:it"=>"Saint Vincent e Grenadine", "name:ja"=>"セントビンセント及びグレナディーン諸島", "name:lb"=>"Saint Vincent an d’Grenadinen", "name:li"=>"Saint-Vincent", "name:lt"=>"Sent Vinsentas ir Grenadinai", "name:mn"=>"Сент-Винсент ба Гренадин", "name:nl"=>"Saint Vincent en de Grenadines", "name:pl"=>"Saint Vincent i Grenadyny", "name:pt"=>"São Vicente e Granadinas", "name:ru"=>"Сент-Винсент и Гренадины", "name:se"=>"Saint Vincent ja Grenadiinnat", "name:sk"=>"Svätý Vincent a Grenadíny", "name:sl"=>"Sveti Vincencij in Grenadine", "name:sv"=>"Saint Vincent och Grenadinerna", "name:ta"=>"செயின்ட் வின்செண்டு மற்றும் கிரெனடீன்கள்", "name:th"=>"ประเทศเซนต์วินเซนต์และเกรนาดีนส์", "name:tr"=>"Saint Vincent ve Grenadinler", "name:uk"=>"Сент-Вінсент і Гренадини", "name:vi"=>"Saint Vincent và Grenadines", "name:vo"=>"Saluda-Vinsenteän e Grenadineäns", "name:zh"=>"圣文森特和格林纳丁斯"
-in     "name"=>"India", "name:af"=>"Indië", "name:ar"=>"الهند", "name:be"=>"Індыя", "name:br"=>"India", "name:da"=>"Indien", "name:de"=>"Indien", "name:el"=>"Ινδία", "name:en"=>"India", "name:eo"=>"Barato", "name:fa"=>"هند", "name:fi"=>"Intia", "name:fr"=>"Inde", "name:fy"=>"Yndia", "name:ga"=>"An India", "name:gd"=>"Na h-Innseachan", "name:he"=>"הודו", "name:hi"=>"भारत", "name:hu"=>"India", "name:is"=>"Indland", "name:it"=>"India", "name:iu"=>"ᐃᓐᑎᐊ/intia", "name:ja"=>"インド", "name:lb"=>"Indien", "name:lt"=>"Indija", "name:lv"=>"Indija", "name:mn"=>"Энэтхэг", "name:pl"=>"Indie", "name:ru"=>"Индия", "name:sl"=>"Indija", "name:sv"=>"Indien", "name:th"=>"ประเทศอินเดีย", "name:tr"=>"Hindistan", "name:uk"=>"Індія", "name:vi"=>"Ấn Độ", "name:zh"=>"印度"
-tf     "name"=>"Terres australes et antarctiques françaises", "name:af"=>"Franse Suidelike en Antarktiese Gebiede", "name:an"=>"Territorios Australs Franzeses", "name:ar"=>"الأراضي الجنوبية الفرنسية", "name:be"=>"Французскія Паўднёвыя тэрыторыі", "name:bg"=>"Френски южни и антарктически територии", "name:br"=>"Douaroù Aostral hag Antarktikel Frañs", "name:ca"=>"Terres Australs i Antàrtiques Franceses", "name:cs"=>"Francouzská jižní a antarktická území", "name:da"=>"Franske sydlige og Antarktiske territorier", "name:de"=>"Französische Süd- und Antarktisgebiete", "name:el"=>"Γαλλικά νότια και ανταρκτικά εδάφη", "name:en"=>"French Southern Lands", "name:eo"=>"Francaj Sudaj Teritorioj", "name:es"=>"Tierras Australes y Antárticas Francesas", "name:eu"=>"Frantziaren lurralde austral eta antartikoak", "name:fi"=>"Ranskan eteläiset ja antarktiset alueet", "name:fr"=>"Terres australes et antarctiques françaises", "name:fy"=>"Frânske Súdlike en Antarktyske Lannen", "name:gl"=>"Terras Austrais e Antárticas Francesas", "name:hr"=>"Francuski južni i antarktički teritoriji", "name:hu"=>"Francia déli és antarktiszi területek", "name:id"=>"Daratan Selatan dan Antarktika Perancis", "name:is"=>"Frönsku suðlægu landsvæðin", "name:it"=>"Terre Australi e Antartiche Francesi", "name:ja"=>"フランス領南方・南極地域", "name:ko"=>"프랑스령 남부와 남극 지역", "name:kw"=>"Tiryow Deghow hag Antarktik Frynkek", "name:lt"=>"Prancūzijos Pietų Sritys", "name:lv"=>"Francijas Dienvidjūru un Antarktikas Zemes", "name:nl"=>"Franse Zuidelijke en Antarctische Gebieden", "name:no"=>"De franske sørterritorier", "name:oc"=>"Tèrras Australas e Antarticas Francesas", "name:pl"=>"Francuskie Terytoria Południowe i Antarktyczne", "name:pt"=>"Terras Austrais e Antárticas Francesas", "name:ro"=>"Teritoriile australe şi antarctice franceze", "name:ru"=>"Французские Южные и Антарктические территории", "name:sh"=>"Francuske Južne Teritorije", "name:sk"=>"Francúzske južné a antarktické územia", "name:sl"=>"Francoske južne in antarktične dežele", "name:sr"=>"Француске јужне и антарктичке земље", "name:sv"=>"Franska sydterritorierna", "name:ta"=>"பிரெஞ்சு தென்னக நிலங்களும் அண்டாடிக் நிலமும்", "name:tr"=>"Fransız Güney ve Antarktika Toprakları", "name:uk"=>"Французькі Південні та Антарктичні території", "name:vi"=>"Vùng đất phía Nam và châu Nam Cực thuộc Pháp", "name:zh"=>"法属南部领地"
-ai     "name"=>"Anguilla", "name:af"=>"Anguilla", "name:an"=>"Anguila", "name:ar"=>"أنجويلا", "name:az"=>"Angilya", "name:ba"=>"Ангилья", "name:be"=>"Ангілья", "name:bg"=>"Ангуила", "name:br"=>"Anguilla", "name:bs"=>"Angvila", "name:ca"=>"Anguilla", "name:cs"=>"Anguilla", "name:cy"=>"Anguilla", "name:da"=>"Anguilla", "name:de"=>"Anguilla", "name:dv"=>"އަންގީލާ", "name:el"=>"Ανγκουίλα", "name:en"=>"Anguilla", "name:eo"=>"Angvilo", "name:es"=>"Anguila", "name:et"=>"Anguilla", "name:eu"=>"Aingira", "name:fa"=>"آنگویلا", "name:fi"=>"Anguilla", "name:fr"=>"Anguilla", "name:ga"=>"Angaíle", "name:gl"=>"Anguila", "name:he"=>"אנגווילה", "name:hi"=>"अंगुइला", "name:hr"=>"Angvila", "name:hu"=>"Anguilla", "name:hy"=>"Անգիլիա", "name:id"=>"Anguilla", "name:io"=>"Anguila", "name:is"=>"Angvilla", "name:it"=>"Anguilla", "name:ja"=>"アンギラ", "name:jv"=>"Anguilla", "name:ka"=>"ანგილია", "name:ko"=>"앵귈라", "name:kw"=>"Angwilla", "name:lb"=>"Anguilla", "name:li"=>"Anguilla", "name:lt"=>"Angilija", "name:lv"=>"Angilja", "name:mk"=>"Ангвила", "name:mn"=>"Ангилья", "name:mr"=>"अँग्विला", "name:ms"=>"Anguilla", "name:ne"=>"एन्गुला", "name:nl"=>"Anguilla", "name:nn"=>"Anguilla", "name:no"=>"Anguilla", "name:oc"=>"Anguilla", "name:pa"=>"ਐਂਗੁਈਲਾ", "name:pl"=>"Anguilla", "name:pt"=>"Anguilla", "name:ro"=>"Anguilla", "name:ru"=>"Ангилья", "name:rw"=>"Angwiya", "name:sh"=>"Angvila", "name:sk"=>"Anguilla", "name:sl"=>"Angvila", "name:sq"=>"Anguilla", "name:sr"=>"Ангвила", "name:su"=>"Anguilla", "name:sv"=>"Anguilla", "name:sw"=>"Anguilla", "name:ta"=>"அங்கியுலா", "name:th"=>"แองกวิลลา", "name:tl"=>"Anggilya", "name:tr"=>"Anguilla", "name:ug"=>"ئانگۋىللا", "name:uk"=>"Ангілья", "name:ur"=>"اینگویلا", "name:uz"=>"Angilya", "name:vi"=>"Anguilla", "name:wo"=>"Angila", "name:yo"=>"Àngúíllà", "name:zh"=>"安圭拉"
-pn     "name"=>"Pitcairn Islands", "name:ar"=>"بتكايرن", "name:be"=>"Піткерн", "name:br"=>"Inizi Pitcairn", "name:ca"=>"Illes Pitcairn", "name:cs"=>"Pitcairnovy ostrovy", "name:cy"=>"Ynysoedd Pitcairn", "name:da"=>"Pitcairn", "name:de"=>"Pitcairninseln", "name:el"=>"Νήσοι Πίτκαιρν", "name:en"=>"Pitcairn Islands", "name:eo"=>"Pitkarna Insularo", "name:es"=>"Islas Pitcairn", "name:fa"=>"پیت‌کرن", "name:fi"=>"Pitcairn", "name:fr"=>"Îles Pitcairn", "name:fy"=>"de Pitcairneilannen", "name:ga"=>"Oileán Pitcairn", "name:gd"=>"Eilean Pitcairn", "name:he"=>"פיטקרן", "name:hr"=>"Pitcairnovo Otočje", "name:hu"=>"Pitcairn-szigetek", "name:id"=>"Kepulauan Pitcairn", "name:is"=>"Pitcairn", "name:it"=>"Isole Pitcairn", "name:la"=>"Pitcairn Insulae", "name:lt"=>"Pitkerno salos", "name:lv"=>"Pitkērna", "name:mi"=>"Pitikeina", "name:mk"=>"Питкерн", "name:mn"=>"Питкэрн Арлууд", "name:nl"=>"Pitcairneilanden", "name:pl"=>"Wyspy Pitcairn", "name:ru"=>"Острова Питкэрн", "name:sl"=>"Pitcairnovi otoki", "name:sv"=>"Pitcairnöarna", "name:th"=>"หมู่เกาะพิตแคร์น", "name:tr"=>"Pitcairn Adaları", "name:uk"=>"Острови Піткерн", "name:vi"=>"Quần đảo Pitcairn", "name:zh"=>"皮特凯恩群岛"
-aq     "name"=>"Antarctica"
-as     "name"=>"American Samoa"
-aw     "name"=>"Aruba"
-gu     "name"=>"Guam"
-hk     "name"=>"Hong Kong"
-mo     "name"=>"Macao"
-pr     "name"=>"Puerto Rico"
-ps     "name"=>"Palestinian Territory"
-pf     "name"=>"Polynésie française", "name:af"=>"Franse Polynesië", "name:an"=>"Polinesia Franzesa", "name:ar"=>"بولونيزيا الفرنسية", "name:az"=>"Fransa Polineziyası", "name:be"=>"Французская Палінезія", "name:bg"=>"Френска Полинезия", "name:br"=>"Polinezia Frañs", "name:bs"=>"Francuska Polinezija", "name:ca"=>"Polinèsia Francesa", "name:cs"=>"Francouzská Polynésie", "name:cy"=>"Polynesia Ffrengig", "name:da"=>"Fransk Polynesien", "name:de"=>"Französisch-Polynesien", "name:dv"=>"ފަރަންސޭސި ޕޮލިނޭޝިއާ", "name:el"=>"Γαλλική Πολυνησία", "name:en"=>"French Polynesia", "name:eo"=>"Franca Polinezio", "name:es"=>"Polinesia Francesa", "name:et"=>"Prantsuse Polüneesia", "name:eu"=>"Frantziar Polinesia", "name:fa"=>"پلی‌نزی فرانسه", "name:fi"=>"Ranskan Polynesia", "name:fr"=>"Polynésie française", "name:fy"=>"Frânsk Polyneezje", "name:ga"=>"Polainéis na Fraince", "name:gd"=>"French Polynesia", "name:gl"=>"Polinesia francesa", "name:he"=>"פולינזיה הצרפתית", "name:hi"=>"फ्रेंच पोलीनेशिया", "name:hr"=>"Francuska Polinezija", "name:hu"=>"Francia Polinézia", "name:id"=>"Polinesia Perancis", "name:io"=>"Franca Polinezia", "name:is"=>"Franska Pólýnesía", "name:it"=>"Polinesia francese", "name:ja"=>"フランス領ポリネシア", "name:jv"=>"Polinesia Perancis", "name:kk"=>"Франция Полинезиясы", "name:ko"=>"프랑스령 폴리네시아", "name:kw"=>"Polynesi Frynkek", "name:la"=>"Polynesia Francica", "name:lb"=>"Franséisch-Polynesien", "name:lt"=>"Prancūzijos Polinezija", "name:lv"=>"Franču Polinēzija", "name:mi"=>"Porinīhia Wīwī", "name:mk"=>"Француска Полинезија", "name:mn"=>"Францын Полинез", "name:mr"=>"फ्रेंच पॉलिनेशिया", "name:ms"=>"Polinesia Perancis", "name:nl"=>"Frans-Polynesië", "name:nn"=>"Fransk Polynesia", "name:no"=>"Fransk Polynesia", "name:oc"=>"Polinesia Francesa", "name:os"=>"Францы Полинези", "name:pl"=>"Polinezja Francuska", "name:pt"=>"Polinésia Francesa", "name:qu"=>"Phransis Pulinisya", "name:ro"=>"Polinezia Franceză", "name:ru"=>"Французская Полинезия", "name:se"=>"Frankriikka Polynesia", "name:sh"=>"Francuska Polinezija", "name:sk"=>"Francúzska Polynézia", "name:sl"=>"Francoska Polinezija", "name:sr"=>"Француска Полинезија", "name:sv"=>"Franska Polynesien", "name:sw"=>"Polynesia ya Kifaransa", "name:ta"=>"பிரெஞ்சு பொலினீசியா", "name:th"=>"เฟรนช์โปลินีเซีย", "name:tr"=>"Fransız Polinezyası", "name:ty"=>"Pōrīnetia Farāni", "name:ug"=>"Fransiyige Qarashliq Polinéziye", "name:uk"=>"Французька Полінезія", "name:vi"=>"Polynésie thuộc Pháp", "name:wo"=>"Polineesi gu Faraas", "name:zh"=>"法属波利尼西亚"
-nr     "name"=>"Naoero", "name:am"=>"ናውሩ", "name:ar"=>"ناورو", "name:be"=>"Наўру", "name:bg"=>"Науру", "name:bn"=>"নাউরু", "name:br"=>"Nauru", "name:cs"=>"Nauru", "name:da"=>"Nauru", "name:de"=>"Nauru", "name:dv"=>"ނައުރޫ", "name:el"=>"Ναουρού", "name:en"=>"Nauru", "name:eo"=>"Nauro", "name:fa"=>"نائورو", "name:fi"=>"Nauru", "name:fr"=>"Nauru", "name:fy"=>"Naurû", "name:ga"=>"Nárú", "name:he"=>"נאורו", "name:hi"=>"नाउरु", "name:hr"=>"Nauru", "name:hu"=>"Nauru", "name:is"=>"Nárú", "name:ja"=>"ナウル", "name:li"=>"Naoeroe", "name:lv"=>"Nauru", "name:ml"=>"നൗറു", "name:mn"=>"Науру", "name:mt"=>"Nawru", "name:pl"=>"Nauru", "name:ru"=>"Науру", "name:se"=>"Nauru", "name:sk"=>"Nauru", "name:sq"=>"Naurua", "name:sv"=>"Nauru", "name:ta"=>"நவூரு", "name:th"=>"ประเทศนาอูรู", "name:uk"=>"Науру", "name:ur"=>"ناورو", "name:vo"=>"Naureän", "name:zh"=>"諾魯"
-nf     "name"=>"Norfolk Island", "name:af"=>"Norfolkeiland", "name:ar"=>"جزيرة نورفولك", "name:be"=>"Норфалк", "name:br"=>"Enez Norfolk", "name:ca"=>"Illa Norfolk", "name:cy"=>"Ynys Norfolk", "name:da"=>"Norfolk-øen", "name:de"=>"Norfolkinsel", "name:en"=>"Norfolk Island", "name:eo"=>"Norfolkinsulo", "name:es"=>"Isla Norfolk", "name:et"=>"Norfolki saar", "name:fi"=>"Norfolkinsaari", "name:fr"=>"Île Norfolk", "name:fy"=>"Norfolk", "name:ga"=>"Oileán Norfolk", "name:he"=>"האי נורפוק", "name:hr"=>"Otok Norfolk", "name:hu"=>"Norfolk-sziget", "name:id"=>"Pulau Norfolk", "name:is"=>"Norfolkeyja", "name:it"=>"Isola Norfolk", "name:la"=>"Insula Norfolcia", "name:lt"=>"Norfolko sala", "name:lv"=>"Norfolkas sala", "name:mn"=>"Норфолк Арал", "name:nl"=>"Norfolk", "name:pl"=>"Wyspa Norfolk", "name:ru"=>"Остров Норфолк", "name:sv"=>"Norfolkön", "name:tr"=>"Norfolk Adası", "name:uk"=>"Острів Норфолк", "name:vi"=>"Đảo Norfolk", "name:zh"=>"诺福克岛"
-xk     "name"=>"Kosova / Kosovo", "name:af"=>"Kosovo", "name:am"=>"ኮሶቮ", "name:an"=>"Kosovo", "name:ar"=>"كوسوفو", "name:ay"=>"Kusuwu", "name:az"=>"Kosovo", "name:ba"=>"Косово", "name:be"=>"Косава", "name:bg"=>"Косово", "name:bn"=>"কসোভো", "name:bo"=>"ཁོ་སོ་ཝོ།", "name:br"=>"Kosovo", "name:bs"=>"Kosovo", "name:ca"=>"Kosovo", "name:ce"=>"Косово", "name:cs"=>"Kosovo", "name:cv"=>"Косово", "name:cy"=>"Cosofo", "name:da"=>"Kosovo", "name:de"=>"Kosovo", "name:el"=>"Κοσσυφοπέδιο", "name:en"=>"Kosovo", "name:eo"=>"Kosovo", "name:es"=>"Kosovo", "name:et"=>"Kosovo", "name:eu"=>"Kosovo", "name:fa"=>"کوزوو", "name:fi"=>"Kosovo", "name:fo"=>"Kosovo", "name:fr"=>"Kosovo", "name:fy"=>"Kosovo", "name:ga"=>"An Chosaiv", "name:gd"=>"Cosobho", "name:gl"=>"Kosovo", "name:gn"=>"Kosovo", "name:gv"=>"Kosovo", "name:he"=>"קוסובו", "name:hi"=>"कोसोवो गणराज्य", "name:hr"=>"Kosovo", "name:hu"=>"Koszovó", "name:hy"=>"Կոսովոն", "name:ia"=>"Kosovo", "name:id"=>"Kosovo", "name:ie"=>"Kosovo", "name:ig"=>"Kosovo", "name:io"=>"Kosovo", "name:is"=>"Kosóvó", "name:it"=>"Kosovo", "name:ja"=>"コソボ", "name:jv"=>"Kosovo", "name:ka"=>"კოსოვო", "name:kk"=>"Косово", "name:kl"=>"Kosovo", "name:kn"=>"ಕೊಸೊವೊ", "name:ko"=>"코소보", "name:ku"=>"Kosova", "name:kv"=>"Косово", "name:kw"=>"Kosova", "name:ky"=>"Косово", "name:la"=>"Kosovia", "name:lb"=>"Kosovo", "name:li"=>"Kosovo", "name:lo"=>"ປະເທດໂກໂຊໂວ", "name:lt"=>"Kosovas", "name:lv"=>"Kosova", "name:mk"=>"Косово", "name:ml"=>"കൊസോവോ", "name:mn"=>"Косово", "name:mr"=>"कोसोव्हो", "name:ms"=>"Kosovo", "name:mt"=>"Kosovo", "name:my"=>"ကိုဆိုဗို", "name:na"=>"Kosovo", "name:nl"=>"Kosovo", "name:nn"=>"Kosovo", "name:no"=>"Kosovo", "name:ny"=>"Kosovo", "name:oc"=>"Kosova", "name:os"=>"Косово", "name:pa"=>"ਕੋਸੋਵੋ ਗਣਰਾਜ", "name:pl"=>"Kosowo", "name:pt"=>"Kosovo", "name:qu"=>"Kusuwu", "name:rm"=>"Cosovo", "name:ro"=>"Kosovo", "name:ru"=>"Косово", "name:rw"=>"Kosovo", "name:sc"=>"Kòssovu", "name:sh"=>"Kosovo", "name:si"=>"කොසෝවො", "name:sk"=>"Kosovo", "name:sl"=>"Kosovo", "name:sm"=>"Kosovo", "name:sn"=>"Kosovo", "name:so"=>"Kosofo", "name:sq"=>"Kosovo", "name:sr"=>"Косово", "name:su"=>"Kosovo", "name:sv"=>"Kosovo", "name:sw"=>"Kosovo", "name:ta"=>"கொசோவோ", "name:te"=>"కొసావో", "name:th"=>"ประเทศคอซอวอ", "name:tl"=>"Kosovo", "name:tr"=>"Kosova", "name:ts"=>"Kosovo", "name:tt"=>"Косово Җөмһүрияте", "name:uk"=>"Косово", "name:ur"=>"کوسووہ", "name:uz"=>"Kosovo", "name:vi"=>"Kosovo", "name:vo"=>"Kosovän", "name:yo"=>"Kósófò", "name:zh"=>"科索沃"
-ec     "name"=>"Ecuador", "name:am"=>"ኤኳዶር", "name:an"=>"Ecuador", "name:ar"=>"الإكوادور", "name:ay"=>"Ikwadur", "name:az"=>"Ekvador", "name:ba"=>"Эквадор", "name:be"=>"Эквадор", "name:bg"=>"Еквадор", "name:bn"=>"ইকুয়েডর", "name:bo"=>"ཨེ་ཁོའོ་ཌོར།", "name:br"=>"Ecuador", "name:bs"=>"Ekvador", "name:ca"=>"Equador", "name:ce"=>"Эквадор", "name:cs"=>"Ekvádor", "name:cv"=>"Эквадор", "name:cy"=>"Ecuador", "name:da"=>"Ecuador", "name:de"=>"Ecuador", "name:dv"=>"އިކުއެޑޯރު", "name:ee"=>"Ecuador", "name:el"=>"Ισημερινός (χώρα)", "name:en"=>"Ecuador", "name:eo"=>"Ekvadoro", "name:es"=>"Ecuador", "name:et"=>"Ecuador", "name:eu"=>"Ekuador", "name:fa"=>"اکوادور", "name:fi"=>"Ecuador", "name:fo"=>"Ekvador", "name:fr"=>"Équateur", "name:fy"=>"Ekwador", "name:ga"=>"Eacuadór", "name:gd"=>"Eacuador", "name:gl"=>"Ecuador", "name:gn"=>"Ekuator", "name:gu"=>"ઈક્વેડોર", "name:gv"=>"Ecuador", "name:he"=>"אקוודור", "name:hi"=>"ईक्वाडोर", "name:hr"=>"Ekvador", "name:ht"=>"Ekwatè", "name:hu"=>"Ecuador", "name:hy"=>"Էկվադոր", "name:ia"=>"Ecuador", "name:id"=>"Ekuador", "name:ie"=>"Ecuador", "name:io"=>"Equador", "name:is"=>"Ekvador", "name:it"=>"Ecuador", "name:ja"=>"エクアドル", "name:jv"=>"Ekuador", "name:ka"=>"ეკვადორი", "name:ki"=>"Ecuador", "name:kk"=>"Эквадор", "name:kl"=>"Ecuador", "name:kn"=>"ಎಕ್ವಡಾರ್", "name:ko"=>"에콰도르", "name:ku"=>"Ekuador", "name:kw"=>"Pow Ekwadorel", "name:la"=>"Aequatoria", "name:lb"=>"Ecuador", "name:li"=>"Ecuador", "name:ln"=>"Republíki ya Ekwatéli", "name:lt"=>"Ekvadoras", "name:lv"=>"Ekvadora", "name:mi"=>"Ekuatoa", "name:mk"=>"Еквадор", "name:ml"=>"ഇക്വഡോർ", "name:mn"=>"Эквадор", "name:mr"=>"इक्वेडोर", "name:ms"=>"Ecuador", "name:mt"=>"Ekwador", "name:my"=>"အီကွေဒေါနိုင်ငံ", "name:na"=>"Ekwador", "name:ne"=>"इक्वेडर", "name:nl"=>"Ecuador", "name:nn"=>"Ecuador", "name:no"=>"Ecuador", "name:nv"=>"Kéyah Nahasdzáán Ałníiʼgi Siʼánígíí", "name:oc"=>"Eqüator", "name:or"=>"ଏକ୍ଵାଡୋର", "name:os"=>"Эквадор", "name:pa"=>"ਏਕੁਆਦੋਰ", "name:pl"=>"Ekwador", "name:ps"=>"اېکوادور", "name:pt"=>"Equador", "name:qu"=>"Ikwadur", "name:rm"=>"Ecuador", "name:ro"=>"Ecuador", "name:ru"=>"Эквадор", "name:rw"=>"Ekwadoro", "name:sa"=>"एक्वाडोर", "name:se"=>"Ecuador", "name:sh"=>"Ekvador", "name:sk"=>"Ekvádor", "name:sl"=>"Ekvador", "name:so"=>"Ikwadoor", "name:sq"=>"Ekuadori", "name:sr"=>"Еквадор", "name:su"=>"Ékuador", "name:sv"=>"Ecuador", "name:sw"=>"Ekuador", "name:ta"=>"எக்குவடோர்", "name:te"=>"ఈక్వడార్", "name:tg"=>"Экуадор", "name:th"=>"ประเทศเอกวาดอร์", "name:tl"=>"Ecuador", "name:tr"=>"Ekvador", "name:tt"=>"Эквадор", "name:ug"=>"ئېكۋادور", "name:uk"=>"Еквадор", "name:ur"=>"ایکواڈور", "name:uz"=>"Ekvador", "name:vi"=>"Ecuador", "name:vo"=>"Lekvadorän", "name:wo"=>"Ekwadoor", "name:yi"=>"עקוואדאר", "name:yo"=>"Ẹ̀kùàdọ̀r", "name:zh"=>"厄瓜多尔"
-kg     "name"=>"Кыргызстан", "name:ab"=>"Ҟырҕызсҭан", "name:af"=>"Kirgisië", "name:am"=>"ኪርጊዝስታን", "name:an"=>"Kirguizistán", "name:ar"=>"قرغيزستان", "name:az"=>"Qırğızıstan", "name:ba"=>"Ҡырғыҙстан", "name:be"=>"Кыргызстан", "name:bg"=>"Киргизстан", "name:bn"=>"কিরগিজিস্তান", "name:bo"=>"ཀེ་རེ་གེཛུ་སུཏེན།", "name:br"=>"Kirgizstan", "name:bs"=>"Kirgistan", "name:ca"=>"Kirguizistan", "name:ce"=>"Киргизи", "name:cs"=>"Kyrgyzstán", "name:cv"=>"Киргизи", "name:cy"=>"Kyrgyzstan", "name:da"=>"Kirgisistan", "name:de"=>"Kirgisistan", "name:dv"=>"ކިރިގިސްތާން", "name:ee"=>"Kyrgyzstan", "name:el"=>"Κιργιζία", "name:en"=>"Kyrgyzstan", "name:eo"=>"Kirgizio", "name:es"=>"Kirguistán", "name:et"=>"Kõrgõzstan", "name:eu"=>"Kirgizistan", "name:fa"=>"قرقیزستان", "name:fi"=>"Kirgisia", "name:fr"=>"Kirghizistan", "name:fy"=>"Kirgyzje", "name:ga"=>"An Chirgeastáin", "name:gd"=>"Cìorgastan", "name:gl"=>"Kirguizistán", "name:gu"=>"કિર્ગિસ્તાન", "name:gv"=>"Yn Chyrgistaan", "name:he"=>"קירגיזסטן", "name:hi"=>"किर्गिज़स्तान", "name:hr"=>"Kirgistan", "name:ht"=>"Kirgistan", "name:hu"=>"Kirgizisztán", "name:hy"=>"Ղրղզստան", "name:ia"=>"Kyrgyzistan", "name:id"=>"Kirgizstan", "name:ie"=>"Kirgizistan", "name:io"=>"Kirgizistan", "name:is"=>"Kirgisistan", "name:it"=>"Kirghizistan", "name:ja"=>"キルギス", "name:jv"=>"Kirgizstan", "name:ka"=>"ყირგიზეთი", "name:kk"=>"Қырғызстан", "name:km"=>"កៀហ៊្សីស៊ីស្ថាន", "name:kn"=>"ಕಿರ್ಗಿಸ್ಥಾನ್", "name:ko"=>"키르기스스탄", "name:ks"=>"کرغیزستان", "name:ku"=>"Qirgizistan", "name:kv"=>"Кыргызстан", "name:kw"=>"Pow Kyrgys", "name:ky"=>"Кыргызстан", "name:la"=>"Chirgisia", "name:lb"=>"Kirgisistan", "name:li"=>"Kirgizië", "name:ln"=>"Kirghizistáni", "name:lt"=>"Kirgizija", "name:lv"=>"Kirgizstāna", "name:mk"=>"Киргистан", "name:ml"=>"കിർഗ്ഗിസ്ഥാൻ", "name:mn"=>"Кыргызстан", "name:mr"=>"किर्गिझस्तान", "name:ms"=>"Kyrgyzstan", "name:my"=>"ကာဂျစ္စတန်နိုင်ငံ", "name:na"=>"Kirgitan", "name:nl"=>"Kirgizië", "name:nn"=>"Kirgisistan", "name:no"=>"Kirgisistan", "name:nv"=>"Kíígiz Bikéyah", "name:oc"=>"Quirguizstan", "name:or"=>"କିରଗିଜସ୍ତାନ", "name:os"=>"Хъиргъиз", "name:pa"=>"ਕਿਰਗਿਜ਼ਸਤਾਨ", "name:pl"=>"Kirgistan", "name:ps"=>"قرغزستان", "name:pt"=>"Quirguistão", "name:qu"=>"Kirkisuyu", "name:ro"=>"Kârgâzstan", "name:ru"=>"Киргизия", "name:rw"=>"Kirigizisitani", "name:sa"=>"किरगिस्थान", "name:sd"=>"ڪِرگزِستانُ", "name:se"=>"Kirgisistan", "name:sh"=>"Kirgistan", "name:sk"=>"Kirgizsko", "name:sl"=>"Kirgizistan", "name:so"=>"Qargistan", "name:sq"=>"Kirgistani", "name:sr"=>"Киргистан", "name:ss"=>"IKhirigi", "name:su"=>"Kirgistan", "name:sv"=>"Kirgizistan", "name:sw"=>"Kirgizia", "name:ta"=>"கிர்கிசுத்தான்", "name:te"=>"కిర్గిజిస్తాన్", "name:tg"=>"Қирғизистон", "name:th"=>"ประเทศคีร์กีซสถาน", "name:tk"=>"Gyrgyzystan", "name:tl"=>"Kirgistan", "name:tr"=>"Kırgızistan", "name:tt"=>"Кыргызстан", "name:ug"=>"قىرغىزىستان", "name:uk"=>"Киргизстан", "name:ur"=>"کرغیزستان", "name:uz"=>"Qirgʻiziston", "name:vi"=>"Kyrgyzstan", "name:vo"=>"Kirgistän", "name:wo"=>"Kirgistaan", "name:yi"=>"קירגיזסטאן", "name:yo"=>"Kirgistani", "name:zh"=>"吉尔吉斯斯坦"
-kz     "name"=>"Қазақстан", "name:ab"=>"Ҟазаҟсҭан", "name:af"=>"Kasakstan", "name:am"=>"ካዛክስታን", "name:an"=>"Cazaquistán", "name:ar"=>"كازاخستان", "name:av"=>"Хъазахъистан", "name:az"=>"Qazaxıstan", "name:ba"=>"Ҡаҙағстан", "name:be"=>"Казахстан", "name:bg"=>"Казахстан", "name:bi"=>"Kazakhstan", "name:bn"=>"কাজাখস্তান", "name:bo"=>"ཀཛ་ཀིསུ་གཏན།", "name:br"=>"Kazakstan", "name:bs"=>"Kazahstan", "name:ca"=>"Kazakhstan", "name:ce"=>"Кхазакхстан", "name:cs"=>"Kazachstán", "name:cu"=>"Каꙁахстанъ", "name:cv"=>"Казахстан", "name:cy"=>"Kazakstan", "name:da"=>"Kasakhstan", "name:de"=>"Kasachstan", "name:dv"=>"ކަޒަކިސްތާން", "name:ee"=>"Kazakhstan", "name:el"=>"Καζακστάν", "name:en"=>"Kazakhstan", "name:eo"=>"Kazaĥio", "name:es"=>"Kazajistán", "name:et"=>"Kasahstan", "name:eu"=>"Kazakhstan", "name:fa"=>"قزاقستان", "name:fi"=>"Kazakstan", "name:fo"=>"Kasakstan", "name:fr"=>"Kazakhstan", "name:fy"=>"Kazakstan", "name:ga"=>"An Chasacstáin", "name:gd"=>"Casachstàn", "name:gl"=>"Casaquistán", "name:gn"=>"Kazajistán", "name:gu"=>"કઝાકિસ્તાન", "name:gv"=>"Yn Chassaghstaan", "name:he"=>"קזחסטן", "name:hi"=>"कज़ाख़िस्तान", "name:hr"=>"Kazahstan", "name:ht"=>"Kazakstan", "name:hu"=>"Kazahsztán", "name:hy"=>"Ղազախստան", "name:ia"=>"Kazakhstan", "name:id"=>"Kazakhstan", "name:ie"=>"Kazakstan", "name:io"=>"Kazakstan", "name:is"=>"Kasakstan", "name:it"=>"Kazakistan", "name:ja"=>"カザフスタン", "name:jv"=>"Kazakhstan", "name:ka"=>"ყაზახეთი", "name:kg"=>"Kazakhstan", "name:kk"=>"Қазақстан", "name:kl"=>"Kasakhstani", "name:km"=>"កាសាក់ស្ថាន", "name:kn"=>"ಕಜಾಕಸ್ಥಾನ್", "name:ko"=>"카자흐스탄", "name:ku"=>"Qazaxistan", "name:kv"=>"Казахстан", "name:kw"=>"Pow Kazagh", "name:ky"=>"Казакстан Республикасы", "name:la"=>"Kazachstania", "name:lb"=>"Kasachstan", "name:li"=>"Kazachstan", "name:ln"=>"Kazakstáni", "name:lt"=>"Kazachstanas", "name:lv"=>"Kazahstāna", "name:mg"=>"Kazakstàna", "name:mi"=>"Katatānga", "name:mk"=>"Казахстан", "name:ml"=>"ഖസാഖ്സ്ഥാൻ", "name:mn"=>"Казахстан", "name:mr"=>"कझाकस्तान", "name:ms"=>"Kazakhstan", "name:mt"=>"Każakistan", "name:my"=>"ကာဇက်စတန်နိုင်ငံ", "name:na"=>"Kadaketan", "name:nl"=>"Kazachstan", "name:nn"=>"Kasakhstan", "name:no"=>"Kasakhstan", "name:nv"=>"Kʼazah Bikéyah", "name:oc"=>"Cazacstan", "name:or"=>"କାଜାଖସ୍ତାନ", "name:os"=>"Хъазахстан", "name:pa"=>"ਕਜਾਖਸਤਾਨ", "name:pl"=>"Kazachstan", "name:ps"=>"قزاقستان", "name:pt"=>"Cazaquistão", "name:qu"=>"Qasaqsuyu", "name:rm"=>"Kasachstan", "name:ro"=>"Kazahstan", "name:ru"=>"Казахстан", "name:rw"=>"Kazakisitani", "name:sa"=>"कजाकस्थान", "name:se"=>"Kazakstan", "name:sh"=>"Kazahstan", "name:si"=>"කසක්ස්තානය", "name:sk"=>"Kazachstan", "name:sl"=>"Kazahstan", "name:so"=>"Kasakhstan", "name:sq"=>"Kazakistani", "name:sr"=>"Казахстан", "name:ss"=>"IKhazakhi", "name:su"=>"Kazastan", "name:sv"=>"Kazakhstan", "name:sw"=>"Kazakhstan", "name:ta"=>"கசக்ஸ்தான்", "name:te"=>"కజకస్తాన్", "name:tg"=>"Қазоқистон", "name:th"=>"ประเทศคาซัคสถาน", "name:tk"=>"Gazagystan", "name:tl"=>"Kazakhstan", "name:tr"=>"Kazakistan", "name:tt"=>"Казакъстан", "name:ug"=>"قازاقىستان", "name:uk"=>"Казахстан", "name:ur"=>"قازقستان", "name:uz"=>"Qozogʻiston", "name:vi"=>"Kazakhstan", "name:vo"=>"Kazakistän", "name:wo"=>"Kasakistaan", "name:yi"=>"קאזאכסטאן", "name:yo"=>"Kàsàkstán", "name:za"=>"Hahsazgwswhdanj", "name:zh"=>"哈萨克斯坦/哈薩克"
-lc     "name"=>"Saint Lucia", "name:af"=>"Sint Lucia", "name:ar"=>"سانت لوسيا", "name:be"=>"Святая Лусія", "name:br"=>"Saint Lucia", "name:cs"=>"Svatá Lucie", "name:da"=>"Saint Lucia", "name:de"=>"St. Lucia", "name:el"=>"Αγία Λουκία", "name:en"=>"Saint Lucia", "name:eo"=>"Sankta Lucio", "name:es"=>"Santa Lucía", "name:fa"=>"سنت لوسیا", "name:fi"=>"Saint Lucia", "name:fr"=>"Sainte-Lucie", "name:fy"=>"Sint Lusia", "name:ga"=>"San Lucia", "name:gd"=>"Naomh Lùisia", "name:he"=>"סנט לוסיה", "name:hr"=>"Sveta Lucija", "name:hu"=>"Saint Lucia", "name:is"=>"Sankti Lúsía", "name:it"=>"Santa Lucia", "name:ja"=>"セントルシア", "name:la"=>"Sancta Lucia", "name:li"=>"Santa Lucia", "name:lt"=>"Sent Lusija", "name:lv"=>"Sentlūsija", "name:mn"=>"Сент Люсиа", "name:nl"=>"Saint Lucia", "name:pl"=>"Saint Lucia", "name:pt"=>"Santa Lúcia", "name:ru"=>"Сент-Люсия", "name:se"=>"Saint Lucia", "name:sk"=>"Svätá Lucia", "name:sl"=>"Sveta Lucija", "name:sv"=>"Saint Lucia", "name:ta"=>"செயிண்ட் லூசியா", "name:th"=>"ประเทศเซนต์ลูเซีย", "name:uk"=>"Сент-Люсія", "name:vo"=>"Sanlusiyän", "name:zh"=>"圣卢西亚岛"
-ht     "name"=>"Ayiti", "name:af"=>"Haïti", "name:am"=>"ሃይቲ", "name:an"=>"Haití", "name:ar"=>"هايتي", "name:ay"=>"Ayti", "name:az"=>"Haiti Respublikası", "name:be"=>"Гаіці", "name:bg"=>"Хаити", "name:bm"=>"Ayiti", "name:bn"=>"হাইতি", "name:bo"=>"ཧའི་ཏི།", "name:br"=>"Republik Haiti", "name:bs"=>"Haiti", "name:ca"=>"Haití", "name:ce"=>"Гаити Пачхьалкх", "name:co"=>"Haiti", "name:cs"=>"Haiti", "name:cv"=>"Гаити", "name:cy"=>"Haiti", "name:da"=>"Haiti", "name:de"=>"Haiti", "name:dv"=>"ހެއިޓީ", "name:ee"=>"Haiti", "name:el"=>"Αϊτή", "name:en"=>"Haiti", "name:eo"=>"Haitio", "name:es"=>"Haití", "name:et"=>"Haiti", "name:eu"=>"Haiti", "name:fa"=>"هائیتی", "name:fi"=>"Haiti", "name:fo"=>"Haiti", "name:fr"=>"Haïti", "name:fy"=>"Haïty", "name:ga"=>"Háítí", "name:gd"=>"Haiti", "name:gl"=>"Haití - Haïti", "name:gu"=>"હૈતી", "name:gv"=>"Haiti", "name:he"=>"האיטי", "name:hi"=>"हैती", "name:hr"=>"Haiti", "name:ht"=>"Ayiti", "name:hu"=>"Haiti", "name:hy"=>"Հաիթի", "name:ia"=>"Haiti", "name:id"=>"Haiti", "name:io"=>"Haiti", "name:is"=>"Haítí", "name:it"=>"Haiti", "name:ja"=>"ハイチ", "name:jv"=>"Haiti", "name:ka"=>"ჰაიტი", "name:kg"=>"Ayiti", "name:ki"=>"Haiti", "name:kk"=>"Гаити", "name:ko"=>"아이티", "name:ku"=>"Haîtî", "name:kw"=>"Hayti", "name:la"=>"Haitia", "name:lb"=>"Haiti", "name:li"=>"Haïti", "name:ln"=>"Ayiti", "name:lt"=>"Haitis", "name:lv"=>"Haiti", "name:mg"=>"Haiti", "name:mk"=>"Хаити", "name:ml"=>"ഹെയ്റ്റി", "name:mn"=>"Гайти", "name:mr"=>"हैती", "name:ms"=>"Haiti", "name:mt"=>"Ħaiti", "name:my"=>"ဟေတီနိုင်ငံ", "name:na"=>"Aiti", "name:ne"=>"हाइटी", "name:nl"=>"Haïti", "name:nn"=>"Haiti", "name:no"=>"Haiti", "name:nv"=>"Héítii", "name:oc"=>"Haití (estat)", "name:or"=>"ହିଟି", "name:os"=>"Гаити", "name:pa"=>"ਹੈਤੀ", "name:pl"=>"Haiti", "name:ps"=>"هایتي", "name:pt"=>"Haiti", "name:qu"=>"Ayti (mama llaqta)", "name:ro"=>"Haiti", "name:ru"=>"Гаити", "name:rw"=>"Hayiti", "name:se"=>"Haiti", "name:sh"=>"Haiti", "name:si"=>"හෙයිටි", "name:sk"=>"Haiti", "name:sl"=>"Haiti", "name:so"=>"Haiti", "name:sq"=>"Haitia", "name:sr"=>"Хаити", "name:ss"=>"IHayithi", "name:su"=>"Haiti", "name:sv"=>"Haiti", "name:sw"=>"Haiti", "name:ta"=>"எயிட்டி", "name:th"=>"ประเทศเฮติ", "name:tl"=>"Hayti", "name:tr"=>"Haiti", "name:tt"=>"Гаити", "name:ug"=>"ھايتى", "name:uk"=>"Гаїті", "name:ur"=>"ہیٹی", "name:uz"=>"Gaiti", "name:vi"=>"Haiti", "name:vo"=>"Haitiyän", "name:wa"=>"Ayiti", "name:wo"=>"Ayiti", "name:yi"=>"האיטי", "name:yo"=>"Hàítì", "name:zh"=>"海地"
-af     "name"=>"افغانستان", "name:af"=>"Afghanistan", "name:ak"=>"Afganistan", "name:am"=>"አፍጋኒስታን", "name:an"=>"Afganistán", "name:ar"=>"أفغانستان", "name:as"=>"আফগানিস্তান", "name:az"=>"Əfqanıstan", "name:ba"=>"Афғанстан", "name:be"=>"Афганістан", "name:bg"=>"Афганистан", "name:bh"=>"अफ़ग़ानिस्तान", "name:bm"=>"Afiganistaŋ", "name:bn"=>"আফগানিস্তান", "name:bo"=>"ཨ་ཧྥུའུ་རྒན་སི་ཐན།", "name:br"=>"Afghanistan", "name:bs"=>"Afganistan", "name:ca"=>"Afganistan", "name:ce"=>"АфгIанистан", "name:ch"=>"Afghanistan", "name:co"=>"Afghanistan", "name:cs"=>"Afghánistán", "name:cv"=>"Афганистан", "name:cy"=>"Affganistan", "name:da"=>"Afghanistan", "name:de"=>"Afghanistan", "name:dv"=>"އަފްޣާނިސްތާން", "name:dz"=>"ཨཕ་ག་ནིསི་ཏཱན་", "name:ee"=>"Afghanistan nutome", "name:el"=>"Αφγανιστάν", "name:en"=>"Afghanistan", "name:eo"=>"Afganio", "name:es"=>"Afganistán", "name:et"=>"Afganistan", "name:eu"=>"Afganistan", "name:fa"=>"افغانستان", "name:ff"=>"Afganistaan", "name:fi"=>"Afganistan", "name:fo"=>"Afghanistan", "name:fr"=>"Afghanistan", "name:fy"=>"Afganistan", "name:ga"=>"An Afganastáin", "name:gd"=>"Afganastan", "name:gl"=>"Afganistán - افغانستان", "name:gn"=>"Ahyganitã", "name:gu"=>"અફઘાનિસ્તાન", "name:gv"=>"Yn Afghanistaan", "name:ha"=>"Afghanistan", "name:he"=>"אפגניסטן", "name:hi"=>"अफ़्गानिस्तान", "name:hr"=>"Afganistan", "name:ht"=>"Afganistan", "name:hu"=>"Afganisztán", "name:hy"=>"Աֆղանստան", "name:ia"=>"Afghanistan", "name:id"=>"Afganistan", "name:ie"=>"Afghanistan", "name:io"=>"Afganistan", "name:is"=>"Afganistan", "name:it"=>"Afghanistan", "name:iu"=>"ᐊᑉᒐᓂᔅᑕᓐ", "name:ja"=>"アフガニスタン", "name:jv"=>"Afganistan", "name:ka"=>"ავღანეთი", "name:kg"=>"Afghanistan", "name:ki"=>"Afghanistan", "name:kk"=>"Ауғанстан", "name:kl"=>"Afghanistan", "name:km"=>"សាធារណរដ្ឋឥស្លាមអាហ្វហ្កានីស្ថាន", "name:kn"=>"ಅಫ್ಘಾನಿಸ್ತಾನ", "name:ko"=>"아프가니스탄", "name:ks"=>"اَفغانَستان", "name:ku"=>"Afxanistan", "name:kv"=>"Афганистан", "name:kw"=>"Afghanistan", "name:ky"=>"Ооганстан", "name:la"=>"Afgania", "name:lb"=>"Afghanistan", "name:lg"=>"Afaganisitani", "name:li"=>"Afghanistan", "name:ln"=>"Afganistáni", "name:lo"=>"ອັບການິສະຖານ", "name:lt"=>"Afganistanas", "name:lv"=>"Afganistāna", "name:mg"=>"Afganistana", "name:mi"=>"Āwhekenetāna", "name:mk"=>"Авганистан", "name:ml"=>"അഫ്ഗാനിസ്താൻ", "name:mn"=>"Афганистан", "name:mo"=>"Афганистан", "name:mr"=>"अफगाणिस्तान", "name:ms"=>"Afghanistan", "name:mt"=>"Afganistan", "name:my"=>"အာဖဂန်နစ္စတန်နိုင်ငံ", "name:na"=>"Apeganitan", "name:ne"=>"अफगानिस्तान", "name:nl"=>"Afghanistan", "name:nn"=>"Afghanistan", "name:no"=>"Afghanistan", "name:oc"=>"Afganistan", "name:om"=>"Afgaanistaan", "name:or"=>"ଆଫଗାନିସ୍ତାନ", "name:os"=>"Афгъанистан", "name:pa"=>"ਅਫ਼ਗ਼ਾਨਿਸਤਾਨ", "name:pi"=>"अफगानस्थान", "name:pl"=>"Afganistan", "name:ps"=>"افغانستان", "name:pt"=>"Afeganistão", "name:qu"=>"Afgansuyu", "name:rm"=>"Afganistan", "name:rn"=>"Afuganisitani", "name:ro"=>"Afganistan", "name:ru"=>"Афганистан", "name:rw"=>"Afuganisitani", "name:sa"=>"अफगानस्थान", "name:sc"=>"Afganistàn", "name:sd"=>"افغانستان", "name:se"=>"Afganistána", "name:sg"=>"Faganïta, Afganïstäan", "name:sh"=>"Afganistan", "name:si"=>"ඇෆ්ගනිස්ථානය", "name:sk"=>"Afganistan", "name:sl"=>"Afganistan", "name:sm"=>"Afakanisitana", "name:sn"=>"Afghanistan", "name:so"=>"Afgaanistan", "name:sq"=>"Afganistani", "name:sr"=>"Авганистан", "name:ss"=>"I-Afugani", "name:su"=>"Apganistan", "name:sv"=>"Afghanistan", "name:sw"=>"Afghanistan", "name:ta"=>"ஆப்கானித்தான்", "name:te"=>"ఆఫ్ఘనిస్తాన్", "name:tg"=>"Афғонистон", "name:th"=>"ประเทศอัฟกานิสถาน", "name:ti"=>"አፍጋኒስታን", "name:tk"=>"Owganystan", "name:tl"=>"Apganistan", "name:to"=>"ʻAfukanisitani", "name:tr"=>"Afganistan", "name:tt"=>"Әфганстан", "name:ug"=>"ئافغانىستان", "name:uk"=>"Афганістан", "name:ur"=>"افغانستان", "name:uz"=>"Afgʻoniston", "name:vi"=>"Afghanistan", "name:vo"=>"Lafganistän", "name:wo"=>"Afganistaan", "name:yi"=>"אפגאניסטאן", "name:yo"=>"Afghanístàn", "name:za"=>"Afghanistan", "name:zh"=>"阿富汗", "name:zu"=>"I-Afganistani"
-es     "name"=>"España", "name:af"=>"Spanje", "name:am"=>"እስፓንያ", "name:an"=>"Espanya", "name:ar"=>"إسبانيا", "name:ay"=>"Ispaña", "name:az"=>"İspaniya", "name:ba"=>"Испания", "name:be"=>"Іспанія", "name:bg"=>"Испания", "name:bi"=>"Spain", "name:bn"=>"স্পেন", "name:bo"=>"ཞི་པན་ཡ།", "name:br"=>"Spagn", "name:bs"=>"Španija", "name:ca"=>"Espanya", "name:ce"=>"Испани", "name:ch"=>"España", "name:co"=>"Spagna", "name:cs"=>"Španělsko", "name:cu"=>"Їспанїꙗ", "name:cv"=>"Испани", "name:cy"=>"Sbaen", "name:da"=>"Spanien", "name:de"=>"Spanien", "name:dv"=>"އިސްޕެއިން", "name:dz"=>"སིཔཱེན་", "name:ee"=>"Spain", "name:el"=>"Ισπανία", "name:en"=>"Spain", "name:eo"=>"Hispanio", "name:es"=>"España", "name:et"=>"Hispaania", "name:eu"=>"Espainia", "name:fa"=>"اسپانیا", "name:fi"=>"Espanja", "name:fo"=>"Spania", "name:fr"=>"Espagne", "name:fy"=>"Spanje", "name:ga"=>"An Spáinn", "name:gd"=>"An Spàinn", "name:gl"=>"España", "name:gn"=>"España", "name:gu"=>"સ્પેન", "name:gv"=>"Yn Spaainey", "name:he"=>"ספרד", "name:hi"=>"स्पेन", "name:hr"=>"Španjolska", "name:ht"=>"Espay", "name:hu"=>"Spanyolország", "name:hy"=>"Իսպանիա", "name:ia"=>"Espania", "name:id"=>"Spanyol", "name:ie"=>"Hispania", "name:ig"=>"Spain", "name:ik"=>"Spaña", "name:io"=>"Hispania", "name:is"=>"Spánn", "name:it"=>"Spagna", "name:iu"=>"ᓯᐸᐃᓐ", "name:ja"=>"スペイン", "name:jv"=>"Spanyol", "name:ka"=>"ესპანეთი", "name:kg"=>"Espania", "name:kk"=>"Испания", "name:kl"=>"Spania", "name:km"=>"អេស្ប៉ាញ", "name:kn"=>"ಸ್ಪೇನ್", "name:ko"=>"스페인", "name:ku"=>"Spanya", "name:kv"=>"Испания", "name:kw"=>"Spayn", "name:ky"=>"Испания", "name:la"=>"Hispania", "name:lb"=>"Spuenien", "name:li"=>"Spanje", "name:ln"=>"Espania", "name:lt"=>"Ispanija", "name:lv"=>"Spānija", "name:mg"=>"Espaina", "name:mi"=>"Peina", "name:mk"=>"Шпанија", "name:ml"=>"സ്പെയിൻ", "name:mn"=>"Испани", "name:mr"=>"स्पेन", "name:ms"=>"Sepanyol", "name:mt"=>"Spanja", "name:my"=>"စပိန်နိုင်ငံ", "name:na"=>"Pain", "name:nb"=>"Spania", "name:ne"=>"स्पेन", "name:nl"=>"Spanje", "name:nn"=>"Spania", "name:no"=>"Spania", "name:nv"=>"Dibé Diníí Bikéyah", "name:oc"=>"Espanha", "name:or"=>"ସ୍ପେନ", "name:os"=>"Испани", "name:pa"=>"ਸਪੇਨ", "name:pl"=>"Hiszpania", "name:ps"=>"اسپانیا", "name:pt"=>"Espanha", "name:qu"=>"Ispaña", "name:rm"=>"Spagna", "name:rn"=>"Esipanye", "name:ro"=>"Spania", "name:ru"=>"Испания", "name:rw"=>"Esipanye", "name:sa"=>"स्पेन्", "name:sc"=>"Ispagna", "name:se"=>"Espánnja", "name:sh"=>"Španija", "name:sk"=>"Španielsko", "name:sl"=>"Španija", "name:sm"=>"Spania", "name:so"=>"Isbania", "name:sq"=>"Spanja", "name:sr"=>"Шпанија", "name:ss"=>"Sipeyini", "name:st"=>"Spain", "name:su"=>"Spanyol", "name:sv"=>"Spanien", "name:sw"=>"Hispania", "name:ta"=>"எசுப்பானியா", "name:te"=>"స్పెయిన్", "name:tg"=>"Испониё", "name:th"=>"ประเทศสเปน", "name:tk"=>"Ispaniýa", "name:tl"=>"Espanya", "name:to"=>"Sepeni", "name:tr"=>"İspanya", "name:ts"=>"Spaniya", "name:tt"=>"Испания", "name:ty"=>"Paniora", "name:ug"=>"ئىسپانىيە", "name:uk"=>"Іспанія", "name:ur"=>"ہسپانیہ", "name:uz"=>"Ispaniya", "name:vi"=>"Tây Ban Nha", "name:vo"=>"Spanyän", "name:wa"=>"Espagne", "name:wo"=>"Ispaañ", "name:yi"=>"שפאניע", "name:yo"=>"Spéìn", "name:za"=>"Sihbanhyaz", "name:zh"=>"西班牙", "name:zu"=>"ISpeyini"
-th     "name"=>"ประเทศไทย", "name:af"=>"Thailand", "name:am"=>"ታይላንድ", "name:an"=>"Tailandia", "name:ar"=>"تايلاند", "name:as"=>"থাইলেণ্ড", "name:az"=>"Tailand", "name:ba"=>"Таиланд", "name:be"=>"Тайланд", "name:bg"=>"Тайланд", "name:bn"=>"থাইল্যান্ড", "name:bo"=>"ཐའི་ལེན།", "name:br"=>"Thailand", "name:bs"=>"Tajland", "name:ca"=>"Tailàndia", "name:ce"=>"Таиланд", "name:cs"=>"Thajsko", "name:cv"=>"Таиланд", "name:cy"=>"Gwlad Thai", "name:da"=>"Thailand", "name:de"=>"Thailand", "name:dv"=>"ސިޔާމު", "name:dz"=>"ཐཱའི་ལེནཌ", "name:el"=>"Ταϊλάνδη", "name:en"=>"Thailand", "name:eo"=>"Tajlando", "name:es"=>"Tailandia", "name:et"=>"Tai", "name:eu"=>"Thailandia", "name:fa"=>"تایلند", "name:fi"=>"Thaimaa", "name:fo"=>"Teiland", "name:fr"=>"Thaïlande", "name:fy"=>"Tailân", "name:ga"=>"An Téalainn", "name:gd"=>"Dùthaich nan Tàidh", "name:gl"=>"Tailandia", "name:gn"=>"Tailandia", "name:gu"=>"થાઇલેન્ડ", "name:gv"=>"Yn Çheer Thai", "name:he"=>"תאילנד", "name:hi"=>"थाईलैण्ड", "name:hr"=>"Tajland", "name:ht"=>"Tayilann", "name:hu"=>"Thaiföld", "name:hy"=>"Թաիլանդ", "name:ia"=>"Thailanda", "name:id"=>"Thailand", "name:ie"=>"Thailand", "name:io"=>"Tailando", "name:is"=>"Taíland", "name:it"=>"Thailandia", "name:ja"=>"タイ王国", "name:jv"=>"Thailand", "name:ka"=>"ტაილანდი", "name:ki"=>"Thailand", "name:kk"=>"Тайланд", "name:kl"=>"Thailandi", "name:km"=>"ថៃ", "name:kn"=>"ಥೈಲ್ಯಾಂಡ್", "name:ko"=>"태국", "name:ks"=>"تھائی لینڈ", "name:ku"=>"Taylenda", "name:kv"=>"Таиланд", "name:kw"=>"Pow Tay", "name:la"=>"Thailandia", "name:lb"=>"Thailand", "name:li"=>"Thailand", "name:lo"=>"ປະເທດໄທ", "name:lt"=>"Tailandas", "name:lv"=>"Taizeme", "name:mg"=>"Tailandy", "name:mi"=>"Tairana", "name:mk"=>"Тајланд", "name:ml"=>"തായ്‌ലാന്റ്", "name:mn"=>"Тайланд", "name:mr"=>"थायलंड", "name:ms"=>"Thailand", "name:my"=>"ထိုင်းနိုင်ငံ", "name:na"=>"Thailand", "name:ne"=>"थाइल्याण्ड", "name:nl"=>"Thailand", "name:nn"=>"Thailand", "name:no"=>"Thailand", "name:nv"=>"Tʼáí Bikéyah", "name:oc"=>"Tailàndia", "name:or"=>"ଥାଇଲାଣ୍ଡ", "name:os"=>"Таиланд", "name:pa"=>"ਥਾਈਲੈਂਡ", "name:pl"=>"Tajlandia", "name:ps"=>"تايلنډ", "name:pt"=>"Tailândia", "name:qu"=>"Thaysuyu", "name:ro"=>"Thailanda", "name:ru"=>"Таиланд", "name:rw"=>"Tayilande", "name:sa"=>"श्यामदेश", "name:sd"=>"ٿائيلينڊ", "name:se"=>"Thaieana", "name:sg"=>"Tailânde", "name:sh"=>"Tajland", "name:sk"=>"Thajsko", "name:sl"=>"Tajska", "name:so"=>"Tayland", "name:sq"=>"Tajlanda", "name:sr"=>"Тајланд", "name:ss"=>"IThayilandi", "name:su"=>"Thailand", "name:sv"=>"Thailand", "name:sw"=>"Uthai", "name:ta"=>"தாய்லாந்து", "name:te"=>"థాయిలాండ్", "name:tg"=>"Таиланд", "name:th"=>"Muang Thai", "name:tk"=>"Tailand", "name:tl"=>"Taylandiya", "name:tr"=>"Tayland", "name:tt"=>"Таиланд", "name:tw"=>"Thailand", "name:ug"=>"تايلاند", "name:uk"=>"Таїланд", "name:ur"=>"تھائی لینڈ", "name:uz"=>"Tailand", "name:vi"=>"Thái Lan", "name:vo"=>"Tayän", "name:wo"=>"Taaylaand", "name:yi"=>"טיילאנד", "name:yo"=>"Tháílàndì", "name:za"=>"Daigoz", "name:zh"=>"泰国"
-cu     "name"=>"Cuba", "name:af"=>"Kuba", "name:am"=>"ኩባ", "name:an"=>"Cuba", "name:ar"=>"كوبا", "name:ay"=>"Kuba", "name:az"=>"Kuba", "name:ba"=>"Куба", "name:be"=>"Куба", "name:bg"=>"Куба", "name:bm"=>"Kuba", "name:bn"=>"কিউবা", "name:bo"=>"ཀུ་བ།", "name:br"=>"Kuba", "name:bs"=>"Kuba", "name:ca"=>"Cuba", "name:ce"=>"Куба", "name:cs"=>"Kuba", "name:cv"=>"Куба", "name:cy"=>"Cuba", "name:da"=>"Cuba", "name:de"=>"Kuba", "name:dv"=>"ކިއުބާ", "name:ee"=>"Cuba", "name:el"=>"Κούβα", "name:en"=>"Cuba", "name:eo"=>"Kubo", "name:es"=>"Cuba", "name:et"=>"Kuuba", "name:eu"=>"Kuba", "name:fa"=>"کوبا", "name:fi"=>"Kuuba", "name:fo"=>"Kuba", "name:fr"=>"Cuba", "name:fy"=>"Kuba", "name:ga"=>"Cúba", "name:gd"=>"Cùba", "name:gl"=>"Cuba", "name:gn"=>"Kuva", "name:gv"=>"Yn Choobey", "name:he"=>"קובה", "name:hi"=>"क्यूबा", "name:hr"=>"Kuba", "name:ht"=>"Kiba", "name:hu"=>"Kuba", "name:hy"=>"Կուբա", "name:ia"=>"Cuba", "name:id"=>"Kuba", "name:io"=>"Kuba", "name:is"=>"Kúba", "name:it"=>"Cuba", "name:iu"=>"ᖂᐹ", "name:ja"=>"キューバ", "name:jv"=>"Kuba", "name:ka"=>"კუბა", "name:kk"=>"Куба", "name:km"=>"គុយបា", "name:kn"=>"ಕ್ಯೂಬಾ", "name:ko"=>"쿠바", "name:ku"=>"Kûba", "name:kv"=>"Куба", "name:kw"=>"Kuba", "name:la"=>"Cuba", "name:lb"=>"Kuba", "name:li"=>"Cuba", "name:ln"=>"Kuba", "name:lt"=>"Kuba", "name:lv"=>"Kuba", "name:mi"=>"Kiupa", "name:mk"=>"Куба", "name:ml"=>"ക്യൂബ", "name:mn"=>"Куба", "name:mr"=>"क्युबा", "name:ms"=>"Cuba", "name:mt"=>"Kuba", "name:my"=>"ကျူးဘားနိုင်ငံ", "name:na"=>"Kiuba", "name:ne"=>"क्युबा", "name:nl"=>"Cuba", "name:nn"=>"Cuba", "name:no"=>"Cuba", "name:nv"=>"Kyóoba", "name:oc"=>"Cuba", "name:or"=>"କ୍ୟୁବା", "name:os"=>"Кубæ", "name:pa"=>"ਕਿਊਬਾ", "name:pl"=>"Kuba", "name:pt"=>"Cuba", "name:qu"=>"Kuba", "name:ro"=>"Cuba", "name:ru"=>"Куба", "name:rw"=>"Kiba", "name:sa"=>"क्यूबा", "name:sc"=>"Cuba", "name:se"=>"Cuba", "name:sh"=>"Kuba", "name:si"=>"කියුබාව", "name:sk"=>"Kuba", "name:sl"=>"Kuba", "name:so"=>"Kuuba", "name:sq"=>"Kuba", "name:sr"=>"Куба", "name:ss"=>"IKhuyubha", "name:su"=>"Kuba", "name:sv"=>"Kuba", "name:sw"=>"Kuba", "name:ta"=>"கூபா", "name:te"=>"క్యూబా", "name:tg"=>"Кубо", "name:th"=>"ประเทศคิวบา", "name:tk"=>"Kuba", "name:tl"=>"Kuba", "name:tr"=>"Küba", "name:tt"=>"Куба", "name:ug"=>"كۇبا", "name:uk"=>"Куба", "name:ur"=>"کیوبا", "name:uz"=>"Kuba", "name:vi"=>"Cuba", "name:vo"=>"Kubeän", "name:wa"=>"Couba", "name:wo"=>"Kubaa", "name:yi"=>"קובא", "name:yo"=>"Kúbà", "name:za"=>"Gujbah", "name:zh"=>"古巴"
-hn     "name"=>"Honduras", "name:af"=>"Honduras", "name:am"=>"ሆንዱራስ", "name:an"=>"Honduras", "name:ar"=>"هندوراس", "name:ay"=>"Honduras", "name:az"=>"Honduras", "name:ba"=>"Гондурас", "name:be"=>"Гандурас", "name:bg"=>"Хондурас", "name:bm"=>"Honduras", "name:bn"=>"হন্ডুরাস", "name:bo"=>"ཧོང་དུ་ར་སི།", "name:br"=>"Honduras", "name:bs"=>"Honduras", "name:ca"=>"Hondures", "name:ce"=>"Гондурас", "name:cs"=>"Honduras", "name:cu"=>"Ондоурасъ", "name:cy"=>"Honduras", "name:da"=>"Honduras", "name:de"=>"Honduras", "name:dv"=>"ހޮންޑިއުރަސް", "name:el"=>"Ονδούρα", "name:en"=>"Honduras", "name:eo"=>"Honduro", "name:es"=>"Honduras", "name:et"=>"Honduras", "name:eu"=>"Honduras", "name:fa"=>"هندوراس", "name:fi"=>"Honduras", "name:fo"=>"Honduras", "name:fr"=>"Honduras", "name:fy"=>"Hondueras", "name:ga"=>"Hondúras", "name:gd"=>"Hondùras", "name:gl"=>"Honduras", "name:gn"=>"Honduras", "name:gu"=>"હોન્ડુરાસ", "name:gv"=>"Ny Hondooraghyn", "name:he"=>"הונדורס", "name:hi"=>"हौण्डुरस", "name:hr"=>"Honduras", "name:ht"=>"Ondiras", "name:hu"=>"Honduras", "name:hy"=>"Հոնդուրաս", "name:ia"=>"Honduras", "name:id"=>"Honduras", "name:ie"=>"Honduras", "name:io"=>"Honduras", "name:is"=>"Hondúras", "name:it"=>"Honduras", "name:ja"=>"ホンジュラス", "name:jv"=>"Honduras", "name:ka"=>"ჰონდურასი", "name:kk"=>"Гондурас", "name:ko"=>"온두라스", "name:ku"=>"Hondûras", "name:kw"=>"Hondouras", "name:ky"=>"Гондурас", "name:la"=>"Honduria", "name:lb"=>"Honduras", "name:li"=>"Honduras", "name:ln"=>"Honduras", "name:lt"=>"Hondūras", "name:lv"=>"Hondurasa", "name:mk"=>"Хондурас", "name:ml"=>"ഹോണ്ടുറാസ്", "name:mn"=>"Гондурас", "name:mr"=>"होन्डुरास", "name:ms"=>"Honduras", "name:mt"=>"Ħonduras", "name:my"=>"ဟွန်ဒူးရပ်စ်နိုင်ငံ", "name:na"=>"Ondurat", "name:ne"=>"होण्डुरस", "name:nl"=>"Honduras", "name:nn"=>"Honduras", "name:no"=>"Honduras", "name:oc"=>"Honduras", "name:or"=>"ହୋଣ୍ଡାରୁସ", "name:os"=>"Гондурас", "name:pa"=>"ਹਾਂਡੂਰਾਸ", "name:pl"=>"Honduras", "name:ps"=>"هندوراس", "name:pt"=>"Honduras", "name:qu"=>"Unduras", "name:rn"=>"Honduras", "name:ro"=>"Honduras", "name:ru"=>"Гондурас", "name:rw"=>"Hondurasi", "name:sa"=>"हांडूरस", "name:se"=>"Honduras", "name:sh"=>"Honduras", "name:sk"=>"Honduras", "name:sl"=>"Honduras", "name:sm"=>"Honilagi", "name:sq"=>"Hondurasi", "name:sr"=>"Хондурас", "name:ss"=>"IHondulasi", "name:su"=>"Honduras", "name:sv"=>"Honduras", "name:sw"=>"Honduras", "name:ta"=>"ஹொண்டுராஸ்", "name:te"=>"హోండురాస్", "name:tg"=>"Ҳондурас", "name:th"=>"ประเทศฮอนดูรัส", "name:tl"=>"Honduras", "name:tr"=>"Honduras", "name:tt"=>"Гондурас", "name:ug"=>"ھوندۇراس", "name:uk"=>"Гондурас", "name:ur"=>"ہونڈوراس", "name:uz"=>"Gonduras", "name:vi"=>"Honduras", "name:vo"=>"Hondurän", "name:wa"=>"Hondourasse", "name:wo"=>"Onduras", "name:yi"=>"האנדוראס", "name:yo"=>"Họ̀ndúràs", "name:zh"=>"洪都拉斯", "name:zu"=>"Honduras"
-nl     "name"=>"Nederland", "name:af"=>"Nederland", "name:am"=>"ሆላንድ", "name:an"=>"Países Baixos", "name:ar"=>"هولندا", "name:ay"=>"Aynacha Jach'a Markanaka", "name:az"=>"Niderland", "name:ba"=>"Нидерландтар", "name:be"=>"Нідэрланды", "name:bg"=>"Нидерландия", "name:bh"=>"एम्सटर्डम", "name:bi"=>"Netherlands", "name:bn"=>"নেদারল্যান্ডস", "name:bo"=>"ཧོ་ལན།", "name:br"=>"Izelvroioù", "name:bs"=>"Holandija", "name:ca"=>"Països Baixos", "name:ce"=>"Нидерландаш", "name:co"=>"Paesi Bassi", "name:cs"=>"Nizozemsko", "name:cu"=>"Нидєрландꙑ", "name:cv"=>"Нидерландсем", "name:cy"=>"Yr Iseldiroedd", "name:da"=>"Holland", "name:de"=>"Niederlande", "name:dv"=>"ނެދަލޭންޑު", "name:dz"=>"ནེ་དར་ལེནཌསི་", "name:ee"=>"Netherlands", "name:el"=>"Κάτω Χώρες", "name:en"=>"Netherlands", "name:eo"=>"Nederlando", "name:es"=>"Países Bajos", "name:et"=>"Holland", "name:eu"=>"Herbehereak", "name:fa"=>"هلند", "name:ff"=>"Holannda", "name:fi"=>"Alankomaat", "name:fo"=>"Niðurlond", "name:fr"=>"Pays-Bas", "name:fy"=>"Nederlân", "name:ga"=>"An Ísiltír", "name:gd"=>"Na Tìrean Ìsle", "name:gl"=>"Países Baixos", "name:gn"=>"Tetãnguéra Yvýi", "name:gu"=>"નેધરલેંડ", "name:gv"=>"Yn Çheer Injil", "name:he"=>"הולנד", "name:hi"=>"नीदरलैण्ड", "name:hr"=>"Nizozemska", "name:ht"=>"Peyiba", "name:hu"=>"Hollandia", "name:hy"=>"Նիդերլանդներ", "name:ia"=>"Pais Basse", "name:id"=>"Belanda", "name:ie"=>"Nederland", "name:io"=>"Nederlando", "name:is"=>"Holland", "name:it"=>"Paesi Bassi", "name:ja"=>"オランダ", "name:jv"=>"Walanda", "name:ka"=>"ნიდერლანდი", "name:kg"=>"Pays-Bas", "name:kk"=>"Нидерланд", "name:kl"=>"Hollandi", "name:kn"=>"ನೆದರ್‍ಲ್ಯಾಂಡ್ಸ್", "name:ko"=>"네덜란드", "name:ks"=>"नेदरलैंड्स", "name:ku"=>"Holenda", "name:kv"=>"Нидерландъяс", "name:kw"=>"Iseldiryow", "name:ky"=>"Нидерландтар", "name:la"=>"Nederlandia", "name:lb"=>"Holland", "name:li"=>"Nederland", "name:ln"=>"Holanda", "name:lt"=>"Nyderlandai", "name:lv"=>"Nīderlande", "name:mi"=>"Hōrana", "name:mk"=>"Холандија", "name:ml"=>"നെതർലന്റ്സ്", "name:mn"=>"Нидерланд", "name:mr"=>"नेदरलँड्स", "name:ms"=>"Belanda", "name:mt"=>"Pajjiżi l-Baxxi", "name:my"=>"နယ်သာလန်နိုင်ငံ", "name:na"=>"Eben Eyong", "name:ne"=>"नेदरल्याण्ड्स", "name:nl"=>"Nederland", "name:nn"=>"Nederland", "name:no"=>"Nederland", "name:nv"=>"Tsin Bikeeʼ Dineʼé Bikéyah", "name:oc"=>"Païses Basses", "name:os"=>"Нидерландтæ", "name:pa"=>"ਨੀਦਰਲੈਂਡ", "name:pl"=>"Królestwo Niderlandów", "name:ps"=>"هالنډ", "name:pt"=>"Países Baixos", "name:qu"=>"Urasuyu", "name:rm"=>"Pajais Bass", "name:ro"=>"Țările de Jos", "name:ru"=>"Нидерланды", "name:rw"=>"Ubuholandi", "name:sa"=>"नेदरलैंड्स", "name:sc"=>"Logos Bascios", "name:se"=>"Vuolleeatnamat", "name:sh"=>"Holandija", "name:si"=>"නෙදර්ලන්තය", "name:sk"=>"Holandsko", "name:sl"=>"Nizozemska", "name:so"=>"Holland", "name:sq"=>"Holanda", "name:sr"=>"Холандија", "name:ss"=>"IDashi", "name:st"=>"Hôlanê", "name:su"=>"Walanda", "name:sv"=>"Nederländerna", "name:sw"=>"Uholanzi", "name:ta"=>"நெதர்லாந்து", "name:te"=>"నెదర్లాండ్", "name:tg"=>"Нидерланд", "name:th"=>"ประเทศเนเธอร์แลนด์", "name:tk"=>"Niderlandlar", "name:tl"=>"Olanda", "name:to"=>"Holani", "name:tr"=>"Hollanda", "name:tt"=>"Нидерландлар", "name:ug"=>"گوللاندىيە", "name:uk"=>"Нідерланди", "name:ur"=>"ہالینڈ", "name:uz"=>"Niderlandlar", "name:vi"=>"Hà Lan", "name:vo"=>"Nedän", "name:wa"=>"Bas Payis", "name:wo"=>"Olaand", "name:xh"=>"ENetherlands", "name:yi"=>"האלאנד", "name:yo"=>"Nẹ́dálándì", "name:zh"=>"荷蘭", "name:zu"=>"Netherlands"
-ms     "name"=>"Montserrat", "name:af"=>"Montserrat", "name:an"=>"Isla de Montserrat", "name:ar"=>"مونتسرات", "name:az"=>"Montserrat", "name:ba"=>"Монтсеррат", "name:be"=>"Мантсерат", "name:bg"=>"Монсерат", "name:br"=>"Enez Montserrat", "name:bs"=>"Monserat", "name:ca"=>"Illa de Montserrat", "name:cs"=>"Montserrat", "name:cy"=>"Montserrat", "name:da"=>"Montserrat", "name:de"=>"Montserrat", "name:dv"=>"މޮންސެރާޓު", "name:el"=>"Μοντσερράτ", "name:en"=>"Montserrat", "name:eo"=>"Moncerato", "name:es"=>"Montserrat", "name:et"=>"Montserrat", "name:eu"=>"Montserrat", "name:fa"=>"مونتسرات", "name:fi"=>"Montserrat", "name:fr"=>"Montserrat", "name:ga"=>"Montsarat", "name:gl"=>"Illa Montserrat", "name:he"=>"מונטסראט", "name:hi"=>"मॉण्टसेराट", "name:hr"=>"Montserrat", "name:ht"=>"Montserrat", "name:hu"=>"Montserrat", "name:hy"=>"Մոնտսերատ", "name:id"=>"Montserrat", "name:io"=>"Montserrat", "name:is"=>"Montserrat", "name:it"=>"Montserrat", "name:ja"=>"モントセラト", "name:jv"=>"Montserrat", "name:ka"=>"მონსერატი", "name:ko"=>"몬트세랫", "name:kw"=>"Montserrat", "name:la"=>"Montserrat", "name:lb"=>"Montserrat", "name:li"=>"Montserrat", "name:lt"=>"Montseratas", "name:lv"=>"Montserrata", "name:mk"=>"Монтсерат", "name:mn"=>"Монтсеррат", "name:mr"=>"माँटसेराट", "name:ms"=>"Montserrat", "name:nl"=>"Montserrat", "name:nn"=>"Montserrat", "name:no"=>"Montserrat", "name:oc"=>"Montserrat", "name:pa"=>"ਮਾਂਟਸਰਾਤ", "name:pl"=>"Montserrat", "name:pt"=>"Montserrat", "name:ro"=>"Montserrat", "name:ru"=>"Монтсеррат", "name:rw"=>"Monserati", "name:sh"=>"Montserrat", "name:sk"=>"Montserrat", "name:sl"=>"Montserrat", "name:sq"=>"Montserrati", "name:sr"=>"Монтсерат", "name:su"=>"Montserrat", "name:sv"=>"Montserrat", "name:ta"=>"மொன்செராட்", "name:th"=>"มอนต์เซอร์รัต", "name:tl"=>"Montserrat", "name:tr"=>"Montserrat", "name:ug"=>"مونتسەررات", "name:uk"=>"Монтсеррат", "name:ur"=>"مانٹسریٹ", "name:vi"=>"Montserrat", "name:wo"=>"Montserrat", "name:yo"=>"Montserrat", "name:zh"=>"蒙塞拉特島"
-tl     "name"=>"Timór Lorosa'e", "name:af"=>"Oos-Timor", "name:ar"=>"جمهورية تيمور", "name:br"=>"Timor ar Reter", "name:ca"=>"Timor Oriental", "name:cs"=>"Východní Timor", "name:cy"=>"Dwyrain Timor", "name:da"=>"Østtimor", "name:de"=>"Osttimor", "name:el"=>"Ανατολικό Τιμόρ", "name:en"=>"East Timor", "name:eo"=>"Orienta Timoro", "name:es"=>"Timor Oriental", "name:et"=>"Ida-Timor", "name:fa"=>"تیمور شرقی", "name:fi"=>"Itä-Timor", "name:fr"=>"Timor oriental", "name:fy"=>"East-Timor", "name:ga"=>"An Tíomór Thoir", "name:gd"=>"Tiomor an Ear", "name:he"=>"מזרח טימור", "name:hr"=>"Istočni Timor", "name:hu"=>"Kelet-Timor", "name:id"=>"Timor Leste", "name:is"=>"Austur-Tímor", "name:it"=>"Timor Est", "name:la"=>"Timoria Orientalis", "name:li"=>"Oos-Timor", "name:lt"=>"Rytų Timoras", "name:mn"=>"Зүүн Тимор", "name:ms"=>"Timor Timur", "name:nl"=>"Oost-Timor", "name:no"=>"Øst-Timor", "name:pl"=>"Timor Wschodni", "name:pt"=>"Timor-Leste", "name:ru"=>"Восточный Тимор", "name:se"=>"Nuorta-Timor", "name:sk"=>"Východný Timor", "name:sl"=>"Vzhodni Timor", "name:sv"=>"Östtimor", "name:ta"=>"கிழக்குத் திமோர்", "name:th"=>"ประเทศติมอร์ตะวันออก", "name:tl"=>"Silangan Timor", "name:tr"=>"Doğu Timor", "name:tt"=>"Көнчыгыш Тимор", "name:uk"=>"Східний Тимор", "name:vi"=>"Đông Timor", "name:zh"=>"东帝汶 / 東帝汶"
-sh     "name"=>"Saint Helena, Ascension and Tristan da Cunha", "name:ar"=>"سانت هيلينا، أسينسيون وتريستان دا كونها", "name:cs"=>"Svatá Helena, Ascension a Tristan da Cunha", "name:de"=>"St. Helena, Ascension und Tristan da Cunha", "name:el"=>"Αγία Ελένη, Ασενσιόν και Τριστάν ντα Κούνια", "name:en"=>"Saint Helena, Ascension and Tristan da Cunha", "name:eo"=>"Sankta Heleno, Ascension kaj Tristan da Cunha", "name:es"=>"Santa Elena, Ascensión y Tristán de Acuña", "name:fa"=>"سنت هلنا، اسنشن و تریستان دا کونا", "name:fr"=>"Sainte-Hélène, Ascension et Tristan da Cunha", "name:hr"=>"Sveta Helena", "name:hu"=>"Szent Ilona, Ascension és Tristan da Cunha", "name:it"=>"Sant'Elena, Ascensione e Tristan da Cunha", "name:lt"=>"Šventoji Elena, Dangun Žengimo ir Tristanas da Kunja", "name:mk"=>"Света Елена, Успение и Тристан да Куња", "name:nl"=>"Sint-Helena, Ascension en Tristan da Cunha", "name:pt"=>"Santa Helena, Ascensão e Tristão da Cunha", "name:ru"=>"Острова Святой Елены, Вознесения и Тристан-да-Кунья", "name:sk"=>"Svätá Helena, Ascension a Tristan da Cunha", "name:sr"=>"Света Хелена, Асенсион, и Тристан да Куња", "name:tr"=>"Saint Helena, Ascension ve Tristan da Cunha", "name:uk"=>"Острови Святої Єлени, Вознесіння і Тристан-да-Кунья", "name:vi"=>"Saint Helena, Ascension và Tristan da Cunha", "name:zh"=>"圣赫勒拿、阿森松和特里斯坦-达库尼亚"
-sv     "name"=>"El Salvador", "name:af"=>"El Salvador", "name:am"=>"ኤል ሳልቫዶር", "name:an"=>"El Salvador", "name:ar"=>"السلفادور", "name:ay"=>"El Salvador", "name:az"=>"Salvador", "name:ba"=>"Сальвадор", "name:be"=>"Сальвадор", "name:bg"=>"Салвадор", "name:bm"=>"El Salvador", "name:bn"=>"এল সালভাদোর", "name:bo"=>"ཨིལ་སལ་ཝ་ཌོར།", "name:br"=>"El Salvador", "name:bs"=>"El Salvador", "name:ca"=>"El Salvador", "name:ce"=>"Сальвадор", "name:cs"=>"Salvador", "name:cy"=>"El Salvador", "name:da"=>"El Salvador", "name:de"=>"El Salvador", "name:dv"=>"އެލްސެލްވަޑޯރު", "name:ee"=>"El Salvador", "name:el"=>"Ελ Σαλβαδόρ", "name:en"=>"El Salvador", "name:eo"=>"Salvadoro", "name:es"=>"República de El Salvador", "name:et"=>"El Salvador", "name:eu"=>"El Salvador", "name:fa"=>"السالوادور", "name:fi"=>"El Salvador", "name:fo"=>"El Salvador", "name:fr"=>"Salvador", "name:fy"=>"El Salvador", "name:ga"=>"An tSalvadóir", "name:gd"=>"El Salbhador", "name:gl"=>"O Salvador", "name:gn"=>"Salvador", "name:gv"=>"Yn Salvador", "name:he"=>"אל סלוודור", "name:hi"=>"अल साल्वाडोर", "name:hr"=>"Salvador", "name:ht"=>"Salvadò", "name:hu"=>"Salvador", "name:hy"=>"Սալվադոր", "name:ia"=>"El Salvador", "name:id"=>"El Salvador", "name:io"=>"Salvadoria", "name:is"=>"El Salvador", "name:it"=>"El Salvador", "name:ja"=>"エルサルバドル", "name:jv"=>"El Salvador", "name:ka"=>"სალვადორი", "name:kk"=>"Эль-Сальвадор Республикасы", "name:kn"=>"ಎಲ್ ಸಾಲ್ವಡಾರ್", "name:ko"=>"엘살바도르", "name:ku"=>"El Salvador", "name:kw"=>"El Salvador", "name:la"=>"Salvatoria", "name:lb"=>"El Salvador", "name:li"=>"El Salvador", "name:ln"=>"El Salvador", "name:lt"=>"Salvadoras", "name:lv"=>"Salvadora", "name:mi"=>"Te Whakaora", "name:mk"=>"Ел Салвадор", "name:ml"=>"എൽ സാൽവദോർ", "name:mn"=>"Эль Сальвадор", "name:mr"=>"एल साल्व्हाडोर", "name:ms"=>"El Salvador", "name:mt"=>"El Salvador", "name:my"=>"အယ်ဆာဗေဒိုနိုင်ငံ", "name:na"=>"Ersarbador", "name:ne"=>"एल साल्भादोर", "name:nl"=>"El Salvador", "name:nn"=>"El Salvador", "name:no"=>"El Salvador", "name:oc"=>"Lo Salvador", "name:or"=>"ଏଲ ସାଲଭାଡୋର", "name:os"=>"Сальвадор", "name:pa"=>"ਸਾਲਵਾਦੋਰ", "name:pl"=>"Salwador", "name:ps"=>"اېلسلوادور", "name:pt"=>"El Salvador", "name:qu"=>"Salwadur", "name:ro"=>"El Salvador", "name:ru"=>"Сальвадор", "name:rw"=>"Saluvadoro", "name:sa"=>"एल-साल्वाडोर", "name:se"=>"El Salvador", "name:sh"=>"Salvador", "name:si"=>"එල් සැල්ව‍ඩෝ", "name:sk"=>"Salvádor", "name:sl"=>"Salvador", "name:so"=>"El Salfador", "name:sq"=>"Salvadori", "name:sr"=>"Салвадор", "name:ss"=>"ISalivado", "name:su"=>"Él Salvador", "name:sv"=>"El Salvador", "name:sw"=>"El Salvador", "name:ta"=>"எல் சால்வடோர்", "name:tg"=>"Салвадор", "name:th"=>"ประเทศเอลซัลวาดอร์", "name:tl"=>"El Salvador", "name:tr"=>"El Salvador", "name:tt"=>"Сальвадор", "name:ug"=>"ئەل سالۋادور", "name:uk"=>"Сальвадор", "name:ur"=>"ایل سیلواڈور", "name:uz"=>"El Salvador", "name:vi"=>"El Salvador", "name:vo"=>"Salvadorän", "name:wo"=>"Salbadoor", "name:yi"=>"על סאלוואדאר", "name:yo"=>"El Salfador", "name:zh"=>"萨尔瓦多", "name:zu"=>"El Salvador"
-tc     "name"=>"Turks and Caicos Islands", "name:af"=>"Turks en Caicos Eilande", "name:an"=>"Islas Turcas e Caicos", "name:ar"=>"جزر تركس وكايكوس", "name:bg"=>"Търкс и Кайкос", "name:bn"=>"টার্কস্‌ ও কেইকোস দ্বীপপুঞ্জ", "name:br"=>"Inizi  Turks ha Caicos", "name:bs"=>"Ostrva Turks i Caicos", "name:ca"=>"Illes Turks i Caicos", "name:cs"=>"Turks a Caicos", "name:cv"=>"Тĕркс тата Кайкос", "name:cy"=>"Ynysoedd Turks a Caicos", "name:da"=>"Turks- og Caicosøerne", "name:de"=>"Turks- und Caicosinseln", "name:dv"=>"ޓާކަސް އަދި ކައިކޯ ޖަޒީރާ", "name:el"=>"Τερκς και Κάικος", "name:en"=>"Turks and Caicos Islands", "name:eo"=>"Turkoj kaj Kajkoj", "name:es"=>"Islas Turcas y Caicos", "name:et"=>"Turks ja Caicos", "name:eu"=>"Turks eta Caicos uharteak", "name:fa"=>"جزایر تورکس و کایکوس", "name:fi"=>"Turks- ja Caicossaaret", "name:fr"=>"Îles Turques-et-Caïques", "name:fy"=>"Turks- en Kaikoseilannen", "name:ga"=>"Oileáin na dTurcach agus Caicos", "name:gd"=>"Oileáin na dTurcach agus Caicos", "name:gl"=>"Turks e Caicos", "name:he"=>"איי טרקס וקייקוס", "name:hi"=>"टर्क्स और केकोस द्वीप-समूह", "name:hr"=>"Otočje Turks i Caicos", "name:hu"=>"Turks- és Caicos-szigetek", "name:id"=>"Kepulauan Turks dan Caicos", "name:io"=>"Turks e Kaikos-Insuli", "name:is"=>"Turks- og Caicoseyjar", "name:it"=>"Turks e Caicos", "name:ja"=>"タークス・カイコス諸島", "name:jv"=>"Kapuloan Turks lan Caicos", "name:ko"=>"터크스 케이커스 제도", "name:kw"=>"Turks ha Kaykos", "name:lt"=>"Terksas ir Kaikosas", "name:lv"=>"Tērksas un Kaikosas", "name:mn"=>"Туркс ба Кайкосын Арлууд", "name:mr"=>"टर्क्स आणि कैकास द्वीपसमूह", "name:ms"=>"Kepulauan Turks dan Caicos", "name:nl"=>"Turks- en Caicoseilanden", "name:nn"=>"Turks- og Caicosøyane", "name:no"=>"Turks- og Caicosøyene", "name:pl"=>"Turks i Caicos", "name:pt"=>"Ilhas Turcas e Caicos", "name:ro"=>"Insulele Turks şi Caicos", "name:ru"=>"Тёркс и Кайкос", "name:sh"=>"Turks i Caicos Otoci", "name:sk"=>"Turks a Caicos", "name:sl"=>"Otoki Turks in Caicos", "name:sq"=>"Turks dhe Kaikos", "name:sr"=>"Туркс и Кајкос", "name:sv"=>"Turks- och Caicosöarna", "name:sw"=>"Visiwa vya Turks na Caicos", "name:ta"=>"துர்கசு கைகோசு தீவுகள்", "name:th"=>"หมู่เกาะเติร์กและไคคอส", "name:tr"=>"Turks ve Caicos Adaları", "name:ug"=>"Turks we Kaykos Taqim Aralliri", "name:uk"=>"Острови Теркс і Кайкос", "name:vi"=>"Quần đảo Turks và Caicos", "name:wo"=>"Turks and Caicos Islands", "name:zh"=>"特克斯和凱科斯群島"
-pt     "name"=>"Portugal", "name:af"=>"Portugal", "name:am"=>"ፖርቱጋል", "name:an"=>"Portugal", "name:ar"=>"البرتغال", "name:ay"=>"Purtuwal", "name:az"=>"Portuqaliya", "name:ba"=>"Португалия", "name:be"=>"Партугалія", "name:bg"=>"Португалия", "name:bi"=>"Portugal", "name:bn"=>"পর্তুগাল", "name:bo"=>"པོ་ཅུ་གྷལ།", "name:br"=>"Portugal", "name:bs"=>"Portugal", "name:ca"=>"Portugal", "name:ce"=>"Португали", "name:co"=>"Portugallu", "name:cs"=>"Portugalsko", "name:cu"=>"Портогалїꙗ", "name:cv"=>"Португали", "name:cy"=>"Portiwgal", "name:da"=>"Portugal", "name:de"=>"Portugal", "name:dv"=>"ޕޯޗުގަލް", "name:dz"=>"པོར་ཅུ་གལ་", "name:ee"=>"Portugal", "name:el"=>"Πορτογαλία", "name:en"=>"Portugal", "name:eo"=>"Portugalio", "name:es"=>"Portugal", "name:et"=>"Portugal", "name:eu"=>"Portugal", "name:fa"=>"پرتغال", "name:fi"=>"Portugali", "name:fo"=>"Portugal", "name:fr"=>"Portugal", "name:fy"=>"Portegal", "name:ga"=>"An Phortaingéil", "name:gd"=>"A' Phortagail", "name:gl"=>"Portugal", "name:gn"=>"Poytuga", "name:gu"=>"પોર્ટુગલ", "name:gv"=>"Yn Phortiugal", "name:he"=>"פורטוגל", "name:hi"=>"पुर्तगाल", "name:hr"=>"Portugal", "name:ht"=>"Pòtigal", "name:hu"=>"Portugália", "name:hy"=>"Պորտուգալիա", "name:ia"=>"Portugal", "name:id"=>"Portugal", "name:ie"=>"Portugal", "name:io"=>"Portugal", "name:is"=>"Portúgal", "name:it"=>"Portogallo", "name:ja"=>"ポルトガル", "name:jv"=>"Portugal", "name:ka"=>"პორტუგალია", "name:kg"=>"Mputulukesi", "name:kk"=>"Португалия", "name:kl"=>"Portugal", "name:km"=>"ប្រទេស ព័រទុយហ្គាល់", "name:kn"=>"ಪೋರ್ಚುಗಲ್", "name:ko"=>"포르투갈", "name:ku"=>"Portûgal", "name:kv"=>"Португалия", "name:kw"=>"Portyngal", "name:ky"=>"Португалия", "name:la"=>"Portugallia", "name:lb"=>"Portugal", "name:li"=>"Portugal", "name:ln"=>"Pulutugal", "name:lt"=>"Portugalija", "name:lv"=>"Portugāle", "name:mg"=>"Pôrtogaly", "name:mi"=>"Potukara", "name:mk"=>"Португалија", "name:ml"=>"പോർച്ചുഗൽ", "name:mn"=>"Португал", "name:mr"=>"पोर्तुगाल", "name:ms"=>"Portugal", "name:mt"=>"Portugall", "name:my"=>"ပေါ်တူဂီနိုင်ငံ", "name:na"=>"Portsiugar", "name:ne"=>"पोर्चुगल", "name:nl"=>"Portugal", "name:nn"=>"Portugal", "name:no"=>"Portugal", "name:oc"=>"Portugal", "name:or"=>"ପର୍ତ୍ତୁଗାଲ", "name:os"=>"Португали", "name:pl"=>"Portugalia", "name:ps"=>"پرتګال", "name:pt"=>"Portugal", "name:qu"=>"Purtugal", "name:rm"=>"Portugal", "name:rn"=>"Portugal", "name:ro"=>"Portugalia", "name:ru"=>"Португалия", "name:rw"=>"Porutigali", "name:sa"=>"पुर्तगाल", "name:sc"=>"Portogallo", "name:se"=>"Portugal", "name:sh"=>"Portugal", "name:si"=>"පෘතුගාලය", "name:sk"=>"Portugalsko", "name:sl"=>"Portugalska", "name:sm"=>"Portugal", "name:so"=>"Bortuqaal", "name:sq"=>"Portugalia", "name:sr"=>"Португалија", "name:ss"=>"IPhuthukezi", "name:st"=>"Portugal", "name:su"=>"Portugal", "name:sv"=>"Portugal", "name:sw"=>"Ureno", "name:ta"=>"போர்த்துகல்", "name:te"=>"పోర్చుగల్", "name:tg"=>"Португалия", "name:th"=>"ประเทศโปรตุเกส", "name:tk"=>"Portugaliýa", "name:tl"=>"Portugal", "name:tr"=>"Portekiz", "name:tt"=>"Португалия", "name:ty"=>"Pōtītī", "name:ug"=>"Portugaliye", "name:uk"=>"Португалія", "name:ur"=>"پرتگال", "name:uz"=>"Portugaliya", "name:vi"=>"Bồ Đào Nha", "name:vo"=>"Portugän", "name:wa"=>"Portugal", "name:wo"=>"Portugaal", "name:yi"=>"פארטוגאל", "name:yo"=>"Pọ́rtúgàl", "name:zh"=>"葡萄牙", "name:zu"=>"IPhothugali"
-si     "name"=>"Slovenija", "name:af"=>"Slowenië", "name:am"=>"ስሎቬኒያ", "name:an"=>"Eslovenia", "name:ar"=>"سلوفينيا", "name:az"=>"Sloveniya", "name:ba"=>"Словения", "name:be"=>"Славенія", "name:bg"=>"Словения", "name:bi"=>"Slovenia", "name:bn"=>"স্লোভেনিয়া", "name:bo"=>"སི་ལོ་ཝེ་ནི་ཡ།", "name:br"=>"Slovenia", "name:bs"=>"Slovenija", "name:ca"=>"Eslovènia", "name:ce"=>"Словени", "name:co"=>"Sluvenia", "name:cs"=>"Slovinsko", "name:cu"=>"Їллѷрїиска Словѣнїꙗ", "name:cv"=>"Словени", "name:cy"=>"Slofenia", "name:da"=>"Slovenien", "name:de"=>"Slowenien", "name:dv"=>"ސުލޮވީނިއާ", "name:ee"=>"Slovenia", "name:el"=>"Σλοβενία", "name:en"=>"Slovenia", "name:eo"=>"Slovenio", "name:es"=>"Eslovenia", "name:et"=>"Sloveenia", "name:eu"=>"Eslovenia", "name:fa"=>"اسلوونی", "name:fi"=>"Slovenia", "name:fo"=>"Slovenia", "name:fr"=>"Slovénie", "name:fy"=>"Sloveenje", "name:ga"=>"An tSlóivéin", "name:gd"=>"Sloibhìnia", "name:gl"=>"Eslovenia", "name:gn"=>"Eloveña", "name:gu"=>"સ્લોવેનિયા", "name:gv"=>"Yn Clovean", "name:he"=>"סלובניה", "name:hi"=>"स्लोवेनिया", "name:hr"=>"Slovenija", "name:ht"=>"Sloveni", "name:hu"=>"Szlovénia", "name:hy"=>"Սլովենիա", "name:ia"=>"Slovenia", "name:id"=>"Slovenia", "name:ie"=>"Slovenia", "name:io"=>"Slovenia", "name:is"=>"Slóvenía", "name:it"=>"Slovenia", "name:ja"=>"スロベニア", "name:jv"=>"Slovénia", "name:ka"=>"სლოვენია", "name:kg"=>"Slovenia", "name:kk"=>"Словения", "name:kl"=>"Slovenia", "name:ko"=>"슬로베니아", "name:ku"=>"Slovenya", "name:kv"=>"Словения", "name:kw"=>"Sloveni", "name:la"=>"Slovenia", "name:lb"=>"Slowenien", "name:li"=>"Slovenië", "name:ln"=>"Slovenia", "name:lt"=>"Slovėnija", "name:lv"=>"Slovēnija", "name:mi"=>"Horowinia", "name:mk"=>"Словенија", "name:ml"=>"സ്ലൊവീന്യ", "name:mn"=>"Словен", "name:mr"=>"स्लोव्हेनिया", "name:ms"=>"Slovenia", "name:mt"=>"Slovenja", "name:my"=>"ဆလိုဗေးနီးယားနိုင်ငံ", "name:na"=>"Tsirobeniya", "name:ne"=>"स्लोभेनिया", "name:nl"=>"Slovenië", "name:nn"=>"Slovenia", "name:no"=>"Slovenia", "name:nv"=>"Słobíín Bikéyah", "name:oc"=>"Eslovènia", "name:or"=>"ସ୍ଲୋଭେନିଆ", "name:os"=>"Словени", "name:pl"=>"Słowenia", "name:ps"=>"سلووانیا", "name:pt"=>"Eslovénia", "name:qu"=>"Isluwinya", "name:rm"=>"Slovenia", "name:ro"=>"Slovenia", "name:ru"=>"Словения", "name:rw"=>"Siloveniya", "name:sa"=>"स्लोवीनिया", "name:sc"=>"Islovènia", "name:se"=>"Slovenia", "name:sh"=>"Slovenija", "name:sk"=>"Slovinsko", "name:sl"=>"Slovenija", "name:sm"=>"Slovenia", "name:so"=>"Isloveeniya", "name:sq"=>"Sllovenia", "name:sr"=>"Словенија", "name:ss"=>"Siloveni", "name:st"=>"Slovenia", "name:su"=>"Slovénia", "name:sv"=>"Slovenien", "name:sw"=>"Slovenia", "name:ta"=>"சுலோவீனியா", "name:te"=>"స్లోవేనియా", "name:tg"=>"Словения", "name:th"=>"ประเทศสโลวีเนีย", "name:tk"=>"Sloweniýa", "name:tl"=>"Eslobenya", "name:tr"=>"Slovenya", "name:tt"=>"Словения", "name:ug"=>"Slowéniye", "name:uk"=>"Словенія", "name:ur"=>"سلووینیا", "name:uz"=>"Sloveniya", "name:vi"=>"Slovenia", "name:vo"=>"Sloveniyän", "name:wo"=>"Esloweeni", "name:yi"=>"סלאוועניע", "name:yo"=>"Sloféníà", "name:zh"=>"斯洛文尼亞"
-ky     "name"=>"Cayman Islands", "name:af"=>"Kaaimanseilande", "name:ak"=>"Kemanfo Islands", "name:am"=>"ካይማን ደሴቶች", "name:ar"=>"جزر الكايمان", "name:az"=>"Kayman Adaları", "name:be"=>"Кайманавы астравы", "name:bg"=>"Кайманови острови", "name:bm"=>"Bama Gun", "name:bn"=>"কেম্যান দ্বীপপুঞ্জ", "name:bo"=>"ཁེ་མེན་གླིང་ཕྲན།", "name:br"=>"Inizi Cayman", "name:bs"=>"Kajmanska Ostrva", "name:ca"=>"Illes Caiman", "name:cs"=>"Kajmanské ostrovy", "name:cy"=>"Ynysoedd Cayman", "name:da"=>"Caymanøerne", "name:de"=>"Kaimaninseln", "name:dz"=>"ཁེ་མེན་གླིང་ཚོམ", "name:ee"=>"Kayman ƒudomekpowo nutome", "name:el"=>"Νήσοι Κέιμαν", "name:en"=>"Cayman Islands", "name:eo"=>"Kajmana Insularo", "name:es"=>"Islas Caimán", "name:et"=>"Kaimanisaared", "name:eu"=>"Kaiman Uharteak", "name:fa"=>"جزایر کایمان", "name:ff"=>"Duuɗe Kaymaa", "name:fi"=>"Caymansaaret", "name:fo"=>"Caymanoyggjarnar", "name:fr"=>"Îles Caïmans", "name:fy"=>"de Kaaimaneilannen", "name:ga"=>"Oileáin Cayman", "name:gd"=>"Na h-Eileanan Caimean", "name:gl"=>"Illas Caimán", "name:gu"=>"કેયમેન આઇલૅંડ્સ", "name:gv"=>"Ellanyn Cayman", "name:ha"=>"Tsibiran Kaiman", "name:he"=>"איי קיימן", "name:hi"=>"केमैन द्वीपसमूह", "name:hr"=>"Kajmanski Otoci", "name:hu"=>"Kajmán-szigetek", "name:ia"=>"Insulas de Caiman", "name:id"=>"Kepulauan Cayman", "name:io"=>"Insuli Kaiman", "name:is"=>"Caymaneyjar", "name:it"=>"Isole Cayman", "name:ja"=>"ケイマン諸島", "name:ka"=>"კაიმანის კუნძულები", "name:ki"=>"Visiwa vya Kayman", "name:km"=>"កោះ​កៃម៉ង់", "name:kn"=>"ಕೇಮನ್ ದ್ವೀಪಗಳು", "name:ko"=>"케이맨제도", "name:ks"=>"کیمَن جٔزیٖرٕ", "name:ku"=>"Giravên Caymanê", "name:lb"=>"Kaimaninselen", "name:lg"=>"Bizinga ebya Kayimaani", "name:ln"=>"Bisanga bya Kayíma", "name:lo"=>"ຄາຍແມນ ອິດແລນ", "name:lt"=>"Kaimanų salos", "name:lv"=>"Kaimanu salas", "name:mg"=>"Nosy Kayman", "name:mk"=>"Кајмански Острови", "name:ml"=>"കേയ്മാൻ ദ്വീപുകൾ", "name:mn"=>"Кайманы Арлууд", "name:mr"=>"केमन बेटे", "name:mt"=>"Gżejjer Kajmani", "name:my"=>"ကေမန် ကျွန်းစု", "name:ne"=>"केयमान टापु", "name:nl"=>"Kaaimaneilanden", "name:nn"=>"Caymanøyane", "name:no"=>"Caymanøyene", "name:or"=>"କେମ୍ୟାନ୍ ଦ୍ବୀପପୁଞ୍ଜ", "name:pl"=>"Kajmany", "name:pt"=>"Ilhas Cayman", "name:rm"=>"Inslas Cayman", "name:rn"=>"Ibirwa bya Keyimani", "name:ro"=>"Insulele Cayman", "name:ru"=>"Острова Кайман", "name:se"=>"Cayman-sullot", "name:sg"=>"Âzûâ Ngundë, Kaimäni", "name:si"=>"කේමන් දූපත්", "name:sk"=>"Kajmanie ostrovy", "name:sl"=>"Kajmanski otoki", "name:sn"=>"Zvitsuwa zveCayman", "name:sr"=>"Кајманска Острва", "name:sv"=>"Caymanöarna", "name:sw"=>"Visiwa vya Kayman", "name:ta"=>"கேமென் தீவுகள்", "name:te"=>"కేమాన్ దీవులు", "name:th"=>"หมู่เกาะเคย์แมน", "name:ti"=>"ካይማን ደሴቶች", "name:to"=>"ʻOtumotu Keimeni", "name:tr"=>"Kayman Adaları", "name:uk"=>"Кайманові острови", "name:ur"=>"کیمین آئلینڈز", "name:vi"=>"Quần đảo Cayman", "name:yo"=>"Orílẹ́ède Etíokun Kámánì", "name:zh"=>"开曼群岛", "name:zu"=>"i-Cayman Islands"
-dj     "name"=>"Djibouti جيبوتي", "name:af"=>"Djiboeti", "name:am"=>"ጅቡቲ", "name:an"=>"Chibuti", "name:ar"=>"جيبوتي", "name:az"=>"Cibuti", "name:ba"=>"Джибути", "name:be"=>"Джыбуці", "name:bg"=>"Джибути", "name:bn"=>"জিবুতি", "name:bo"=>"ཇི་བའོ་ཊི།", "name:br"=>"Djibouti", "name:bs"=>"Džibuti", "name:ca"=>"Djibouti", "name:ce"=>"Джибути", "name:cs"=>"Džibutsko", "name:cv"=>"Джибути", "name:cy"=>"Djibouti", "name:da"=>"Djibouti", "name:de"=>"Dschibuti", "name:dv"=>"ޖިބުތީ", "name:ee"=>"Djibouti", "name:el"=>"Τζιμπουτί", "name:en"=>"Djibouti", "name:eo"=>"Ĝibutio", "name:es"=>"Yibuti", "name:et"=>"Djibouti", "name:eu"=>"Djibuti", "name:fa"=>"جیبوتی", "name:fi"=>"Djibouti", "name:fr"=>"Djibouti", "name:fy"=>"Dzjibûty", "name:ga"=>"Diobúití", "name:gd"=>"Diobùtaidh", "name:gl"=>"Xibutí", "name:gv"=>"Djibouti", "name:he"=>"ג'יבוטי", "name:hi"=>"जिबूती", "name:hr"=>"Džibuti", "name:ht"=>"Djibouti", "name:hu"=>"Dzsibuti", "name:hy"=>"Ջիբութի", "name:ia"=>"Djibouti", "name:id"=>"Djibouti", "name:ie"=>"Djibouti", "name:io"=>"Djibuti", "name:is"=>"Djíbútí", "name:it"=>"Gibuti", "name:ja"=>"ジブチ", "name:jv"=>"Djibouti", "name:ka"=>"ჯიბუტი", "name:kg"=>"Djibuti", "name:ki"=>"Djibouti", "name:kk"=>"Джибути", "name:ko"=>"지부티", "name:ku"=>"Cîbûtî", "name:kw"=>"Jibouti", "name:la"=>"Gibutum", "name:lb"=>"Dschibuti", "name:li"=>"Djibouti", "name:ln"=>"Djibuti", "name:lt"=>"Džibutis", "name:lv"=>"Džibutija", "name:mg"=>"Jibotia", "name:mi"=>"Tipūti", "name:mk"=>"Џибути", "name:ml"=>"ജിബൂട്ടി", "name:mn"=>"Джибути", "name:mr"=>"जिबूती", "name:ms"=>"Djibouti", "name:mt"=>"Ġibuti", "name:my"=>"ဂျီဘူတီနိုင်ငံ", "name:na"=>"Djibuti", "name:ne"=>"जिबुटी", "name:nl"=>"Djibouti", "name:nn"=>"Djibouti", "name:no"=>"Djibouti", "name:nv"=>"Jibótii", "name:oc"=>"Jiboti", "name:om"=>"Jibuutii", "name:or"=>"ଡିଜିବୋଇଟି", "name:os"=>"Джибути", "name:pa"=>"ਜਿਬੂਤੀ", "name:pl"=>"Dżibuti", "name:ps"=>"جېبوتي", "name:pt"=>"Djibouti", "name:qu"=>"Yiwuti", "name:ro"=>"Djibouti", "name:ru"=>"Джибути", "name:rw"=>"Jibuti", "name:sa"=>"जिबूटी", "name:sc"=>"Gibuti", "name:se"=>"Djibouti", "name:sg"=>"Dibutùii", "name:sh"=>"Džibuti", "name:sk"=>"Džibutsko", "name:sl"=>"Džibuti", "name:sn"=>"Djibouti", "name:so"=>"Jabuuti", "name:sq"=>"Xhibuti", "name:sr"=>"Џибути", "name:ss"=>"IJibhuthi", "name:su"=>"Djibouti", "name:sv"=>"Djibouti", "name:sw"=>"Jibuti", "name:ta"=>"சீபூத்தீ", "name:te"=>"జిబౌటి", "name:tg"=>"Ҷибути", "name:th"=>"ประเทศจิบูตี", "name:ti"=>"ጂቡቲ", "name:tk"=>"Jibuti", "name:tl"=>"Hiboti", "name:tr"=>"Cibuti", "name:ts"=>"Djibouti", "name:tt"=>"Җибути", "name:ug"=>"جىبۇتى", "name:uk"=>"Джибуті", "name:ur"=>"جبوتی", "name:uz"=>"Jibuti", "name:vi"=>"Djibouti", "name:vo"=>"Cibutän", "name:wo"=>"Jibuti", "name:yi"=>"דזשיבוטי", "name:yo"=>"Djìbútì", "name:zh"=>"吉布提", "name:zu"=>"IJibuthi"
-cv     "name"=>"Cabo Verde", "name:af"=>"Kaap Verde", "name:ar"=>"الرأس الأخضر", "name:be"=>"Каба-Вердэ", "name:br"=>"Kab Glas", "name:ca"=>"Cap Verd", "name:cs"=>"Kapverdy", "name:cy"=>"Cabo Verde", "name:da"=>"Kap Verde", "name:de"=>"Kap Verde", "name:el"=>"Πράσινο Ακρωτήριο", "name:en"=>"Cape Verde", "name:eo"=>"Kaboverdo", "name:es"=>"Cabo Verde", "name:et"=>"Roheneemesaared", "name:fa"=>"کیپ ورد", "name:fi"=>"Kap Verde", "name:fr"=>"Cap-Vert", "name:fy"=>"Kaapverdje", "name:ga"=>"Rinn Verde", "name:gd"=>"Cape Verde", "name:he"=>"כף ורדה", "name:hr"=>"Zelenortski Otoci", "name:hu"=>"Zöld-foki Köztársaság", "name:id"=>"Tanjung Verde", "name:io"=>"Kabo Verda", "name:is"=>"Grænhöfðaeyjar", "name:it"=>"Capo Verde", "name:la"=>"Promontorium Viride", "name:lb"=>"Kap Verde", "name:li"=>"Kaapverdië", "name:lt"=>"Žaliasis Kyšulys", "name:lv"=>"Kaboverde", "name:mi"=>"Te Kūrae Matomato", "name:mk"=>"Зелен ’Рт", "name:mn"=>"Кабо-Верде", "name:nl"=>"Kaapverdië", "name:pl"=>"Republika Zielonego Przylądka", "name:pt"=>"Cabo Verde", "name:ru"=>"Кабо-Верде", "name:se"=>"Kap Verde", "name:sl"=>"Zelenortski otoki", "name:sr"=>"Зеленортска Острва", "name:sv"=>"Kap Verde", "name:ta"=>"கேப் வர்டி", "name:th"=>"ประเทศเคปเวิร์ด", "name:tr"=>"Yeşil Burun Adaları", "name:uk"=>"Кабо-Верде", "name:uz"=>"Kabo-Verde", "name:vo"=>"Kabovärduäns", "name:zh"=>"佛得角"
-mf     "name"=>"Saint Martin"
-bl     "name"=>"Saint Barthélemy"
-ax     "name"=>"Aland Islands"
-bv     "name"=>"Bouvet Island"
-cx     "name"=>"Christmas Island", "name:af"=>"Christmas-eiland", "name:ar"=>"جزيرة الميلاد", "name:bg"=>"Рождество", "name:br"=>"Enez Nedeleg", "name:bs"=>"Božićno ostrvo", "name:ca"=>"Illa Christmas", "name:cs"=>"Vánoční ostrov", "name:cy"=>"Ynys y Nadolig", "name:da"=>"Juleøen", "name:de"=>"Weihnachtsinsel", "name:el"=>"Νήσος των Χριστουγέννων", "name:eo"=>"Kristnaskinsulo", "name:es"=>"Isla de Navidad", "name:et"=>"Jõulusaar", "name:eu"=>"Christmas uhartea", "name:fa"=>"جزیره کریسمس", "name:fi"=>"Joulusaari", "name:fr"=>"Île Christmas", "name:fy"=>"Krysteilân", "name:ga"=>"Oileán na Nollag", "name:gl"=>"Illa de Nadal", "name:he"=>"טריטוריית האי חג המולד", "name:hi"=>"क्रिसमस आईलैंड", "name:hr"=>"Božićni otok", "name:hu"=>"Karácsony-sziget", "name:id"=>"Pulau Natal", "name:is"=>"Jólaeyja", "name:it"=>"Isola del Natale", "name:ja"=>"クリスマス島", "name:ka"=>"შობის კუნძული", "name:kk"=>"Кристмас аралы", "name:ko"=>"크리스마스 섬", "name:kw"=>"Ynys Nadelik", "name:lb"=>"Chrëschtdagsinsel", "name:lt"=>"Kalėdų sala", "name:lv"=>"Ziemsvētku sala", "name:mn"=>"Зул Сарын Арал", "name:mr"=>"क्रिसमस द्वीप", "name:ms"=>"Pulau Krismas", "name:nl"=>"Christmaseiland", "name:nn"=>"Christmasøya", "name:no"=>"Christmasøya", "name:pl"=>"Wyspa Bożego Narodzenia", "name:pt"=>"Ilha Christmas", "name:ro"=>"Insula Crăciunului", "name:ru"=>"Остров Рождества", "name:sh"=>"Božićni otok", "name:sk"=>"Vianočný ostrov", "name:sl"=>"Božični otoki", "name:sr"=>"Божићно Острво", "name:sv"=>"Julön", "name:sw"=>"Kisiwa cha Krismasi", "name:ta"=>"கிறிஸ்துமசு தீவு", "name:th"=>"เกาะคริสต์มาส", "name:tr"=>"Christmas Adası", "name:uk"=>"Острів Різдва", "name:vi"=>"Đảo Christmas", "name:wo"=>"Dunu Christmas", "name:zh"=>"圣诞岛"
-hm     "name"=>"Heard Island and MaxDonald Islands"
-mp     "name"=>"Northern Mariana Islands"
-sj     "name"=>"Svalbard and Jan Mayen"
-no     "name"=>"Norge", "name:af"=>"Noorweë", "name:am"=>"ኖርዌይ", "name:an"=>"Noruega", "name:ar"=>"النرويج", "name:ay"=>"Nurweka", "name:az"=>"Norveç", "name:ba"=>"Норвегия", "name:be"=>"Нарвегія", "name:bg"=>"Норвегия", "name:bi"=>"Norway", "name:bm"=>"Norwij", "name:bn"=>"নরওয়ে", "name:bo"=>"ནོར་ཝེ།", "name:br"=>"Norvegia", "name:bs"=>"Norveška", "name:ca"=>"Noruega", "name:ce"=>"Норвеги", "name:co"=>"Nurvegia", "name:cs"=>"Norsko", "name:cu"=>"Норєгъ", "name:cv"=>"Норвеги", "name:cy"=>"Norwy", "name:da"=>"Norge", "name:de"=>"Norwegen", "name:dv"=>"ނޯވޭ", "name:dz"=>"ནོ་ཝེ་", "name:ee"=>"Norway", "name:el"=>"Νορβηγία", "name:en"=>"Norway", "name:eo"=>"Norvegio", "name:es"=>"Noruega", "name:et"=>"Norra", "name:eu"=>"Norvegia", "name:fa"=>"نروژ", "name:fi"=>"Norja", "name:fo"=>"Noregur", "name:fr"=>"Norvège", "name:fy"=>"Noarwegen", "name:ga"=>"An Iorua", "name:gd"=>"Nirribhidh", "name:gl"=>"Noruega", "name:gn"=>"Noruega", "name:gu"=>"નોર્વે", "name:gv"=>"Norlynn", "name:he"=>"נורבגיה", "name:hi"=>"नॉर्वे", "name:hr"=>"Norveška", "name:ht"=>"Nòvèj", "name:hu"=>"Norvégia", "name:hy"=>"Նորվեգիա", "name:ia"=>"Norvegia", "name:id"=>"Norwegia", "name:ie"=>"Norvegia", "name:io"=>"Norvegia", "name:is"=>"Noregur", "name:it"=>"Norvegia", "name:iu"=>"ᓄᕐᒋ", "name:ja"=>"ノルウェー", "name:jv"=>"Norwégia", "name:ka"=>"ნორვეგია", "name:kg"=>"Norge", "name:kk"=>"Норвегия", "name:kl"=>"Norge", "name:kn"=>"ನಾರ್ವೇ", "name:ko"=>"노르웨이", "name:ku"=>"Norwêc", "name:kv"=>"Норвегия", "name:kw"=>"Norgagh", "name:ky"=>"Норвегия", "name:la"=>"Norvegia", "name:lb"=>"Norwegen", "name:li"=>"Noorwege", "name:ln"=>"Norvej", "name:lt"=>"Norvegija", "name:lv"=>"Norvēģija", "name:mg"=>"Norvezy", "name:mi"=>"Nōwei", "name:mk"=>"Норвешка", "name:ml"=>"നോർവെ", "name:mn"=>"Норвеги", "name:mr"=>"नॉर्वे", "name:ms"=>"Norway", "name:mt"=>"Norveġja", "name:my"=>"နော်ဝေနိုင်ငံ", "name:na"=>"Norwei", "name:nb"=>"Norge", "name:ne"=>"नर्वे", "name:nl"=>"Noorwegen", "name:nn"=>"Noreg", "name:no"=>"Norge", "name:oc"=>"Norvègia", "name:om"=>"Norway", "name:or"=>"ନରୱେ", "name:os"=>"Норвеги", "name:pa"=>"ਨਾਰਵੇ", "name:pl"=>"Norwegia", "name:ps"=>"ناروې", "name:pt"=>"Noruega", "name:qu"=>"Nurwiga", "name:rm"=>"Norvegia", "name:rn"=>"Noruega", "name:ro"=>"Norvegia", "name:ru"=>"Норвегия", "name:rw"=>"Noruveje", "name:sa"=>"नार्वे", "name:sc"=>"Norvegia", "name:se"=>"Norga", "name:sh"=>"Norveška", "name:sk"=>"Nórsko", "name:sl"=>"Norveška", "name:so"=>"Norway", "name:sq"=>"Norvegjia", "name:sr"=>"Норвешка", "name:ss"=>"INoweyi", "name:su"=>"Norwégia", "name:sv"=>"Norge", "name:sw"=>"Norwei", "name:ta"=>"நோர்வே", "name:te"=>"నార్వే", "name:tg"=>"Норвегия", "name:th"=>"ประเทศนอร์เวย์", "name:tk"=>"Norwegiýa", "name:tl"=>"Noruwega", "name:tr"=>"Norveç", "name:ts"=>"Norge", "name:tt"=>"Норвегия", "name:ug"=>"نورۋېگىيە", "name:uk"=>"Норвегія", "name:ur"=>"ناروے", "name:uz"=>"Norvegiya", "name:vi"=>"Na Uy", "name:vo"=>"Norgän", "name:wa"=>"Norvedje", "name:wo"=>"Noorwees", "name:yi"=>"נארוועגיע", "name:yo"=>"Nọ́rwèy", "name:za"=>"Nozveih", "name:zh"=>"挪威", "name:zu"=>"INoki"
-vu     "name"=>"Vanuatu", "name:ab"=>"Вануату", "name:ar"=>"فانواتو", "name:be"=>"Вануату", "name:bg"=>"Вануату", "name:bn"=>"ভানুয়াটু", "name:bo"=>"ཝ་ནུའ་ཏུ།", "name:br"=>"Vanuatu", "name:ce"=>"Вануату", "name:cs"=>"Vanuatu", "name:da"=>"Vanuatu", "name:de"=>"Vanuatu", "name:dv"=>"ވަނުއާޓޫ", "name:el"=>"Βανουάτου", "name:en"=>"Vanuatu", "name:eo"=>"Vanuatuo", "name:es"=>"Vanuatu", "name:fa"=>"وانواتو", "name:fi"=>"Vanuatu", "name:fr"=>"Vanuatu", "name:fy"=>"Fanuatû", "name:ga"=>"Vanuatú", "name:gd"=>"Bhanuatu", "name:he"=>"ונואטו", "name:hi"=>"वानूअतु", "name:hr"=>"Vanuatu", "name:ht"=>"Vanwatou", "name:hu"=>"Vanuatu", "name:hy"=>"Վանուատու", "name:is"=>"Vanúatú", "name:ja"=>"バヌアツ", "name:ka"=>"ვანუატუ", "name:kk"=>"Вануату", "name:kn"=>"ವನುವಾಟು", "name:ko"=>"바누아투", "name:ku"=>"Vanûatû", "name:ky"=>"Вануату", "name:lt"=>"Vanuatu", "name:mk"=>"Вануату", "name:ml"=>"വാനുവാടു", "name:mn"=>"Вануату", "name:mr"=>"व्हानुआतू", "name:mt"=>"Vanwatu", "name:my"=>"ဗနွားတူနိုင်ငံ", "name:na"=>"Banuatu", "name:ne"=>"भानुअटु", "name:nv"=>"Banoʼáátʼoo", "name:oc"=>"Vanuatu", "name:or"=>"ଭାନୁଆଟୁ", "name:os"=>"Вануату", "name:pa"=>"ਵਨੁਆਤੂ", "name:pl"=>"Vanuatu", "name:pt"=>"Vanuatu", "name:qu"=>"Wanwatu", "name:ru"=>"Вануату", "name:rw"=>"Vanuwatu", "name:se"=>"Vanuatu", "name:sk"=>"Vanuatu", "name:sr"=>"Вануату", "name:sv"=>"Vanuatu", "name:ta"=>"வனுவாட்டு", "name:te"=>"వనాటు", "name:tg"=>"Вануату", "name:th"=>"ประเทศวานูอาตู", "name:tt"=>"Вануату", "name:ug"=>"ۋانۇئاتۇ", "name:uk"=>"Вануату", "name:ur"=>"وانواتو", "name:vo"=>"Vanuatuäns", "name:wo"=>"Wanuatu", "name:yo"=>"Fanuatu", "name:zh"=>"瓦努阿图"
-um     "name"=>"United States Minor Outlying Islands"
-vi     "name"=>"United States Virgin Islands"
-yt     "name"=>"Mayotte"
-al     "name"=>"Shqipëria", "name:ab"=>"Арнауыҭтәыла", "name:af"=>"Albanië", "name:ak"=>"Albania", "name:am"=>"አልባኒያ", "name:an"=>"Albania", "name:ar"=>"ألبانيا", "name:as"=>"আলবেনিয়া", "name:av"=>"Алба́ния", "name:ay"=>"Alwaña", "name:az"=>"Albaniya", "name:ba"=>"Алба́ния", "name:be"=>"Алба́нія", "name:bg"=>"Албания", "name:bh"=>"अल्बानिया", "name:bi"=>"Albania", "name:bm"=>"Alibani", "name:bn"=>"আলবেনিয়া", "name:bo"=>"ཨལ་པ་ཉི་ཡ།", "name:br"=>"Albania", "name:bs"=>"Albanija", "name:ca"=>"Albània", "name:ce"=>"Алба́ни", "name:ch"=>"Albania", "name:co"=>"Albania", "name:cs"=>"Albánie", "name:cu"=>"Алванїꙗ", "name:cv"=>"Албани", "name:cy"=>"Albania", "name:da"=>"Albanien", "name:de"=>"Albanien", "name:dv"=>"އަލްބޭނިއާ", "name:dz"=>"ཨཱལ་བེ་ནི་ཡ", "name:ee"=>"Albania", "name:el"=>"Αλβανία", "name:en"=>"Albania", "name:eo"=>"Albanio", "name:es"=>"Albania", "name:et"=>"Albaania", "name:eu"=>"Albania", "name:fa"=>"آلبانی", "name:ff"=>"Albaniya", "name:fi"=>"Albania", "name:fo"=>"Albania", "name:fr"=>"Albanie", "name:fy"=>"Albaanje", "name:ga"=>"An Albáin", "name:gd"=>"Albàinia", "name:gl"=>"Albania", "name:gn"=>"Avaña", "name:gu"=>"આલ્બેનિયા", "name:gv"=>"Yn Albaan", "name:ha"=>"Albaniya", "name:he"=>"אַלְבַּנְיָה", "name:hi"=>"अल्बानिया", "name:hr"=>"Albanija", "name:ht"=>"Albani", "name:hu"=>"Albánia", "name:hy"=>"Ալբանիա", "name:ia"=>"Albania", "name:id"=>"Albania", "name:ie"=>"Albania", "name:ig"=>"Albania", "name:io"=>"Albania", "name:is"=>"Albanía", "name:it"=>"Albania", "name:iu"=>"ᐊᓪᐹᓂᐊ", "name:ja"=>"アルバニア", "name:jv"=>"Albania", "name:ka"=>"ალბანეთი", "name:kg"=>"Albania", "name:ki"=>"Arũmbĩnia", "name:kk"=>"Албания", "name:kl"=>"Albania", "name:km"=>"អាល់បានី", "name:kn"=>"ಅಲ್ಬೇನಿಯ", "name:ko"=>"알바니아", "name:ks"=>"اٮ۪لبانِیا", "name:ku"=>"Albanya", "name:kv"=>"Албания", "name:kw"=>"Albani", "name:ky"=>"Албания", "name:la"=>"Albania", "name:lb"=>"Albanien", "name:lg"=>"Alibaniya", "name:li"=>"Albanië", "name:ln"=>"Albania", "name:lo"=>"ແອລເບເນຍ", "name:lt"=>"Albanija", "name:lv"=>"Albānija", "name:mg"=>"Albania", "name:mi"=>"Arapeinia", "name:mk"=>"Албанија", "name:ml"=>"അൽബേനിയ", "name:mn"=>"Албани", "name:mr"=>"आल्बेनिया", "name:ms"=>"Albania", "name:mt"=>"Albanija", "name:my"=>"အယ်လ်ဘေးနီးယား၏", "name:na"=>"Arbainiya", "name:ne"=>"अल्बानिया", "name:nl"=>"Albanië", "name:nn"=>"Albania", "name:no"=>"Albania", "name:nv"=>"Dziłigaii Bikéyah", "name:oc"=>"Albania", "name:om"=>"Albeeniyaa", "name:or"=>"ଆଲବାନିଆ", "name:os"=>"Албани", "name:pa"=>"ਅਲਬਾਨੀਆ", "name:pi"=>"अल्बानिया", "name:pl"=>"Albania", "name:ps"=>"البانیا", "name:pt"=>"Albânia", "name:qu"=>"Albanya", "name:rm"=>"Albania", "name:rn"=>"Alubaniya", "name:ro"=>"Albania", "name:ru"=>"Албания", "name:rw"=>"Alubaniya", "name:sa"=>"अल्बेनिया", "name:sc"=>"Albania", "name:sd"=>"البانيا", "name:se"=>"Albánia", "name:sg"=>"Albanïi", "name:sh"=>"Albanija", "name:si"=>"ඇල්බේනියාව", "name:sk"=>"Albánsko", "name:sl"=>"Albanija", "name:sm"=>"Albania", "name:sn"=>"Albania", "name:so"=>"Albania", "name:sq"=>"Shqipëria", "name:sr"=>"Албанија", "name:ss"=>"I-Alibheniya", "name:st"=>"Albania", "name:su"=>"Albania", "name:sv"=>"Albanien", "name:sw"=>"Albania", "name:ta"=>"அல்பேனியா", "name:te"=>"అల్బేనియా", "name:tg"=>"Албания", "name:th"=>"ประเทศแอลเบเนีย", "name:ti"=>"አልባኒያ", "name:tk"=>"Albaniýa", "name:tl"=>"Albanya", "name:to"=>"ʻAlipania", "name:tr"=>"Arnavutluk", "name:ts"=>"Albania", "name:tt"=>"Албания", "name:tw"=>"Albania", "name:ty"=>"Arapania", "name:ug"=>"ئالبانىيە", "name:uk"=>"Алба́нія", "name:ur"=>"البانیا", "name:uz"=>"Albaniya", "name:vi"=>"Albania", "name:vo"=>"Lalbanän", "name:wa"=>"Albaneye", "name:wo"=>"Albaani", "name:yi"=>"אלבאניע", "name:yo"=>"Albáníà", "name:za"=>"Albania", "name:zh"=>"阿爾巴尼亞", "name:zu"=>"I-Albaniya"
-fo     "name"=>"Føroyar", "name:af"=>"Faroëreilande", "name:am"=>"ፋሮ ደሴቶች", "name:an"=>"Islas Feroe", "name:ar"=>"جزر فارو", "name:az"=>"Farer adaları", "name:be"=>"Фарэрскія астравы", "name:bg"=>"Ферьорски острови", "name:bi"=>"Faroe aelan", "name:br"=>"Faero", "name:bs"=>"Farska ostrva", "name:ca"=>"Illes Fèroe", "name:ce"=>"Фарерийн гІайренаш", "name:cs"=>"Faerské ostrovy", "name:cy"=>"Føroyar", "name:da"=>"Færøerne", "name:de"=>"Färöer", "name:dv"=>"ފަރޮއޭ ޖަޒީރާ", "name:ee"=>"Faroe Islands", "name:el"=>"Νήσοι Φερόες", "name:en"=>"Faroe Islands", "name:eo"=>"Ferooj", "name:es"=>"Islas Feroe", "name:et"=>"Fääri saared", "name:eu"=>"Faroeak", "name:fa"=>"جزایر فارو", "name:fi"=>"Färsaaret", "name:fo"=>"Føroyar", "name:fr"=>"Îles Féroé", "name:fy"=>"Faeröer", "name:ga"=>"Oileáin Fharó", "name:gd"=>"Na h-Eileanan Fàro", "name:gl"=>"Illas Feroe", "name:gu"=>"ફરો દ્વિપસમૂહ", "name:gv"=>"Ellanyn ny Geyrragh", "name:he"=>"איי פארו", "name:hi"=>"फ़रो द्वीपसमूह", "name:hr"=>"Ferojski Otoci", "name:hu"=>"Feröer", "name:hy"=>"Ֆարերյան կղզիներ", "name:ia"=>"Insulas Feroe", "name:id"=>"Kepulauan Faroe", "name:io"=>"Faero", "name:is"=>"Færeyjar", "name:it"=>"Fær Øer", "name:ja"=>"フェロー諸島", "name:jv"=>"Kapuloan Faroe", "name:ka"=>"ფარერის კუნძულები", "name:kk"=>"Фарер аралдары", "name:kl"=>"Savalimmiut", "name:ko"=>"페로 제도", "name:ku"=>"Giravên Feroe", "name:kv"=>"Фарер діяс", "name:kw"=>"Ynysow Faroe", "name:la"=>"Faeroae insulae", "name:li"=>"Faeröer", "name:lt"=>"Farerai", "name:lv"=>"Fēru Salas", "name:mi"=>"Moutere Faroe", "name:mk"=>"Фарски Острови", "name:mn"=>"Фарерын арлууд", "name:mr"=>"फेरो द्वीपसमूह", "name:ms"=>"Kepulauan Faroe", "name:mt"=>"Gżejjer Faroe", "name:ne"=>"फरोइ टापु", "name:nl"=>"Faeröer", "name:nn"=>"Færøyane", "name:no"=>"Færøyene", "name:oc"=>"Illas Feròe", "name:os"=>"Фареры сакъадæхтæ", "name:pl"=>"Wyspy Owcze", "name:pt"=>"Ilhas Feroe", "name:qu"=>"Pharuy", "name:rm"=>"Inslas Feroe", "name:ro"=>"Insulele Feroe", "name:ru"=>"Фарерские острова", "name:rw"=>"Ibirwa bya Farowe", "name:se"=>"Fearsullot", "name:sh"=>"Farski Otoci", "name:si"=>"ෆාරෝ දිවයින්", "name:sk"=>"Faerské ostrovy", "name:sl"=>"Ferski otoki", "name:so"=>"Jasiiradaha Feroe", "name:sq"=>"Ishujt Faroe", "name:sr"=>"Фарска Острва", "name:su"=>"Kapuloan Faroe", "name:sv"=>"Färöarna", "name:sw"=>"Visiwa vya Faroe", "name:ta"=>"பரோயே தீவுகள்", "name:tg"=>"Ҷазираҳои Фаро", "name:th"=>"หมู่เกาะแฟโร", "name:tl"=>"Kapuluang Peroe", "name:tr"=>"Faroe Adaları", "name:tt"=>"Фарер утраулары", "name:uk"=>"Фарерські острови", "name:ur"=>"جزائرفارو", "name:vi"=>"Quần đảo Faroe", "name:wo"=>"Duni Faarow", "name:yo"=>"Àwọn Erékùṣù Fàróè", "name:zh"=>"法罗群岛"
-jp     "name"=>"日本", "name:ab"=>"Иапониа", "name:af"=>"Japan", "name:am"=>"ጃፓን", "name:an"=>"Chapón", "name:ar"=>"اليابان", "name:as"=>"জাপান", "name:ay"=>"Nihun", "name:az"=>"Yaponiya", "name:ba"=>"Япония", "name:be"=>"Японія", "name:bg"=>"Япония", "name:bn"=>"জাপান", "name:bo"=>"རི་པིན།", "name:br"=>"Japan", "name:bs"=>"Japan", "name:ca"=>"Japó", "name:ce"=>"Япони", "name:ch"=>"Chapan", "name:cs"=>"Japonsko", "name:cu"=>"Ꙗпѡнїꙗ", "name:cv"=>"Япони", "name:cy"=>"Japan", "name:da"=>"Japan", "name:de"=>"Japan", "name:dv"=>"ޖަޕާނު", "name:dz"=>"ཇཱ་པཱན།", "name:ee"=>"Japan", "name:el"=>"Ιαπωνία", "name:en"=>"Japan", "name:eo"=>"Japanio", "name:es"=>"Japón", "name:et"=>"Jaapan", "name:eu"=>"Japonia", "name:fa"=>"ژاپن", "name:fi"=>"Japani", "name:fo"=>"Japan", "name:fr"=>"Japon", "name:fy"=>"Japan", "name:ga"=>"An tSeapáin", "name:gd"=>"An t-Seapan", "name:gl"=>"Xapón", "name:gn"=>"Hapõ", "name:gu"=>"જાપાન", "name:gv"=>"Yn Çhapaan", "name:ha"=>"Japan", "name:he"=>"יפן", "name:hi"=>"जापान", "name:hr"=>"Japan", "name:ht"=>"Japon", "name:hu"=>"Japán", "name:hy"=>"Ճապոնիա", "name:ia"=>"Japon", "name:id"=>"Jepang", "name:ie"=>"Japan", "name:io"=>"Japonia", "name:is"=>"Japan", "name:it"=>"Giappone", "name:iu"=>"ᓃᑉᐊᓐ", "name:ja"=>"日本", "name:jv"=>"Jepang", "name:ka"=>"იაპონია", "name:ki"=>"Japan", "name:kk"=>"Жапония", "name:kl"=>"Japani", "name:km"=>"ជប៉ុន", "name:kn"=>"ಜಪಾನ್", "name:ko"=>"일본", "name:ks"=>"जापान", "name:ku"=>"Japon", "name:kv"=>"Япония", "name:kw"=>"Nihon", "name:ky"=>"Жапония", "name:la"=>"Iaponia", "name:lb"=>"Japan", "name:li"=>"Japan", "name:ln"=>"Zapɔ́", "name:lo"=>"ປະເທດຍີ່ປຸ່ນ", "name:lt"=>"Japonija", "name:lv"=>"Japāna", "name:mg"=>"Japana", "name:mi"=>"Hapani", "name:mk"=>"Јапонија", "name:ml"=>"ജപ്പാൻ", "name:mn"=>"Япон", "name:mo"=>"Жапония", "name:mr"=>"जपान", "name:ms"=>"Jepun", "name:mt"=>"Ġappun", "name:my"=>"ဂျပန်နိုင်ငံ", "name:na"=>"Djapan", "name:ne"=>"जापान", "name:nl"=>"Japan", "name:nn"=>"Japan", "name:no"=>"Japan", "name:nv"=>"Binaʼadaałtzózí Dinéʼiʼ Bikéyah", "name:oc"=>"Japon", "name:om"=>"Jaappaan", "name:or"=>"ଜାପାନ", "name:os"=>"Япон", "name:pa"=>"ਜਪਾਨ", "name:pl"=>"Japonia", "name:ps"=>"جاپان", "name:pt"=>"Japão", "name:qu"=>"Nihun", "name:rm"=>"Giapun", "name:ro"=>"Japonia", "name:ru"=>"Япония", "name:rw"=>"Ubuyapani", "name:sa"=>"सूर्यमूल", "name:sc"=>"Giapone", "name:sd"=>"جاپان", "name:se"=>"Japána", "name:sh"=>"Japan", "name:si"=>"ජපානය", "name:sk"=>"Japonsko", "name:sl"=>"Japonska", "name:sm"=>"Iapani", "name:so"=>"Jabaan", "name:sq"=>"Japonia", "name:sr"=>"Јапан", "name:ss"=>"IJaphani", "name:su"=>"Jepang", "name:sv"=>"Japan", "name:sw"=>"Japani", "name:ta"=>"ஜப்பான்", "name:te"=>"జపాన్", "name:tg"=>"Жопун", "name:th"=>"ประเทศญี่ปุ่น", "name:ti"=>"ጃፓን", "name:tk"=>"Ýaponiýa", "name:tl"=>"Hapon", "name:tr"=>"Japonya", "name:tt"=>"Япония", "name:tw"=>"Yapan", "name:ty"=>"Tāpōnē", "name:ug"=>"ياپونىيە", "name:uk"=>"Японія", "name:ur"=>"جاپان", "name:uz"=>"Yaponiya", "name:vi"=>"Nhật Bản", "name:vo"=>"Yapän", "name:wo"=>"Sapoŋ", "name:yi"=>"יאפאן", "name:yo"=>"Japan", "name:za"=>"Nditbonj", "name:zh"=>"日本", "name:zu"=>"IJapani"
-io     "name"=>"British Indian Ocean Territory", "name:af"=>"Britse Indiese Oseaan Gebied", "name:ak"=>"Britenfo Hɔn Man Wɔ India Po No Mu", "name:am"=>"የብሪታኒያ ህንድ ውቂያኖስ ግዛት", "name:an"=>"Territorio Britanico de l'Ozián Indico", "name:ar"=>"إقليم المحيط الهندي البريطاني", "name:az"=>"Britaniya-Hindistan Okeanik territoriyası", "name:be"=>"Брытанскія Індыйска-акіянскія тэрыторыі", "name:bg"=>"Британска индоокеанска територия", "name:bm"=>"Angilɛ ka ɛndu dugukolo", "name:bn"=>"ব্রিটিশ ভারত মহাসাগরীয় অঞ্চল", "name:br"=>"Tiriad Meurvor Indez Breizh-Veur", "name:bs"=>"Britanski teritorij Indijskog okeana", "name:ca"=>"Territori Britànic de l'Oceà Índic", "name:cs"=>"Britské indickooceánské území", "name:cy"=>"Tiriogaeth Prydain yng Nghefnfor India", "name:da"=>"Britiske Indiske Ocean", "name:de"=>"Britisches Territorium im Indischen Ozean", "name:dz"=>"བྲི་ཊིཤ་རྒྱ་གར་གྱི་རྒྱ་མཚོ་ས་ཁོངས", "name:ee"=>"Britaintɔwo ƒe india ƒudome nutome", "name:el"=>"Βρετανικό Έδαφος Ινδικού Ωκεανού", "name:en"=>"British Indian Ocean Territory", "name:eo"=>"Brita Hindoceana Teritorio", "name:es"=>"Territorio Británico del Océano Índico", "name:et"=>"Briti India ookeani ala", "name:eu"=>"Indiako Ozeanoko Britainiar Lurraldea", "name:fa"=>"مستعمره‌های بریتانیا در اقیانوس هند", "name:ff"=>"Keeriindi britaani to maayo enndo", "name:fi"=>"Brittiläinen Intian valtameren alue", "name:fo"=>"Bretsku Indiahavsoyggjarnar", "name:fr"=>"Territoire britannique de l'Océan Indien", "name:fy"=>"Britske Yndyske-Oseaanterritoarium", "name:ga"=>"Críoch Aigéan Indiach na Breataine", "name:gd"=>"Ranntair Breatannach Cuan nan Innseachan", "name:gl"=>"Territorio Británico do Océano Índico", "name:gu"=>"બ્રિટિશ ઇન્ડિયન ઓશન ટેરિટરી", "name:ha"=>"Yankin Birtaniya Na Tekun Indiya", "name:he"=>"טריטוריה בריטית באוקיאנוס ההודי", "name:hi"=>"ब्रिटिश हिंद महासागर क्षेत्र", "name:hr"=>"Britanski Indijskooceanski Teritoriji", "name:hu"=>"Brit Indiai-óceáni Terület", "name:ia"=>"Territorio oceanic britanno-indian", "name:id"=>"Teritorial Britania di Samudra Hindia", "name:io"=>"Britaniana teritorio en Indiana Oceano", "name:is"=>"Breska Indlandshafseyjar", "name:it"=>"Territorio britannico dell'oceano Indiano", "name:ja"=>"イギリス領インド洋地域", "name:ka"=>"ბრიტანეთის ინდოეთის ოკეანის ტერიტორია", "name:ki"=>"Eneo la Uingereza katika Bahari Hindi", "name:km"=>"ដែន​មហា​សមុទ្រ​ឥណ្ឌា ចក្រភព​អង់គ្លេស", "name:kn"=>"ಬ್ರಿಟೀಶ್ ಇಂಡಿಯನ್ ಮಹಾಸಾಗರ ಪ್ರದೇಶ", "name:ko"=>"영국령 인도양 지역", "name:ks"=>"برطانوی بحرِ ہِنٛدۍ علاقہٕ", "name:ku"=>"Xakên Brîtanyayê yên Okyanûsa Hindî", "name:lg"=>"Bizinga by'eCago", "name:ln"=>"Mabelé ya Angɛlɛtɛ́lɛ na mbú ya Indiya", "name:lo"=>"ບຣິດທິສອິນດ່ຽນໂອຊ່ຽນເທີຣິທໍຣີ", "name:lt"=>"Indijos vandenyno Britų sritis", "name:lv"=>"Indijas okeāna Britu teritorija", "name:mg"=>"Faridranomasina indiana britanika", "name:mk"=>"Британска Индоокеанска Територија", "name:ml"=>"ബ്രിട്ടീഷ് ഇന്ത്യൻ മഹാസമുദ്ര പ്രദേശം", "name:mn"=>"Британийн Энэтхэгийн Далайн Нутаг дэвсгэр", "name:mr"=>"ब्रिटीश हिंदी महासागर क्षेत्र", "name:ms"=>"Wilayah Lautan Hindi British", "name:my"=>"ဗြိတိသျှ အိန္ဒြိယ သမုဒ္ဒရာ ပိုင်နက်", "name:ne"=>"बेलायती हिन्द महासागर क्षेत्र", "name:nl"=>"Brits Territorium in de Indische Oceaan", "name:nn"=>"Britiske område i Det indiske hav", "name:no"=>"Det britiske territoriet i Indiahavet", "name:or"=>"ବ୍ରିଟିଶ୍ ଭାରତୀୟ ସାମୁଦ୍ରିକ କ୍ଷେତ୍ର", "name:pl"=>"Brytyjskie Terytorium Oceanu Indyjskiego", "name:pt"=>"Território Britânico do Oceano Índico", "name:rm"=>"Territori Britannic en l'Ocean Indic", "name:rn"=>"Intara y'Ubwongereza yo mu birwa by'Abahindi", "name:ro"=>"Teritoriul Britanic din Oceanul Indian", "name:ru"=>"Британская Территория в Индийском Океане", "name:sg"=>"Sêse tî Anglëe na Ngûyämä tî Ênnde", "name:sh"=>"Britanski teritorij Indijskog oceana", "name:si"=>"බ්‍රිතාන්‍ය ඉන්දීය සාගර ප්‍රාන්තය", "name:sk"=>"Britské indickooceánske územie", "name:sl"=>"Britanski teritorij v Indijskem oceanu", "name:sr"=>"Британска територија Индијског океана", "name:sv"=>"Brittiska territoriet i Indiska oceanen", "name:sw"=>"Eneo la Uingereza katika Bahari Hindi", "name:ta"=>"பிரித்தானிய இந்தியப் பெருங்கடல் மண்டலம்", "name:te"=>"బ్రిటిష్ భారతీయ ఓషన్ ప్రాంతం", "name:th"=>"บริติชอินเดียนโอเชียนเทร์ริทอรี", "name:ti"=>"የብሪታኒያ ህንድ ውቂያኖስ ግዛት", "name:to"=>"Potu fonua moana ʻInitia fakapilitānia", "name:tr"=>"Britanya Hint Okyanusu Toprakları", "name:uk"=>"Британська територія в Індійському океані", "name:ur"=>"برطانوی ہندوستانی سمندری خطہ", "name:vi"=>"Lãnh thổ Ấn Độ Dương thuộc Anh", "name:yo"=>"Orílẹ́ède Etíkun Índíánì ti Ìlú Bírítísì", "name:zh"=>"英属印度洋领地", "name:zu"=>"i-British Indian Ocean Territory"
-gq     "name"=>"Guinea Ecuatorial", "name:af"=>"Ekwatoriaal-Guinee", "name:ak"=>"Gini Ikuweta", "name:am"=>"ኢኳቶሪያል ጊኔ", "name:an"=>"Guinea Equatorial", "name:ar"=>"غينيا الاستوائية", "name:az"=>"Ekvatorial Qvineya", "name:ba"=>"Экватор Гвинеяһы", "name:be"=>"Экватарыяльная Гвінея", "name:bg"=>"Екваториална Гвинея", "name:bh"=>"भूमध्यरेखीय गिनी", "name:bm"=>"Cɛmajan Gine", "name:bn"=>"বিষুবীয় গিনি", "name:bo"=>"ཨི་ཁུའ་ཊོ་རལ་གི་ནེ།", "name:br"=>"Ginea ar C'heheder", "name:bs"=>"Ekvatorijalna Gvineja", "name:ca"=>"Guinea Equatorial", "name:ce"=>"Дуьнена асанан Гвине", "name:co"=>"Guinea Equatoriale", "name:cs"=>"Rovníková Guinea", "name:cv"=>"Экваториаллă Гвиней", "name:cy"=>"Gini Gyhydeddol", "name:da"=>"Ækvatorialguinea", "name:de"=>"Äquatorialguinea", "name:dv"=>"އިކުއެޓޯރިއަލް ގިނީ", "name:dz"=>"ཨེ་ཀུ་ཊོ་རེལ་ གི་ནི", "name:ee"=>"Gini Ekwatoria", "name:el"=>"Ισημερινή Γουινέα", "name:en"=>"Equatorial Guinea", "name:eo"=>"Ekvatora Gvineo", "name:es"=>"Guinea Ecuatorial", "name:et"=>"Ekvatoriaal-Guinea", "name:eu"=>"Ekuatore Ginea", "name:fa"=>"گینه استوایی", "name:ff"=>"Gine Ekwatoriyal", "name:fi"=>"Päiväntasaajan Guinea", "name:fo"=>"Ekvatorguinea", "name:fr"=>"Guinée équatoriale", "name:fy"=>"Ekwatoriaal-Guinee", "name:ga"=>"an Ghuine Mheánchriosach", "name:gd"=>"Gini Mheadhan-Chriosach", "name:gl"=>"Guinea Ecuatorial", "name:gu"=>"ઇક્વેટોરિયલ ગિની", "name:gv"=>"Guinea Chryss ny Cruinney", "name:ha"=>"Gini Ikwatoriya", "name:he"=>"גינאה המשוונית", "name:hi"=>"भूमध्यरेखीय गिनी", "name:hr"=>"Ekvatorska Gvineja", "name:ht"=>"Gine ekwateryal", "name:hu"=>"Egyenlítői-Guinea", "name:hy"=>"Հասարակածային Գվինեա", "name:ia"=>"Guinea Equatorial", "name:id"=>"Guinea Khatulistiwa", "name:ie"=>"Equatorial Guinéa", "name:ig"=>"Equatorial Guinea", "name:io"=>"Equatorala Guinea", "name:is"=>"Miðbaugs-Gínea", "name:it"=>"Guinea Equatoriale", "name:ja"=>"赤道ギニア", "name:jv"=>"Guinea Khatulistiwa", "name:ka"=>"ეკვატორული გვინეა", "name:kg"=>"Ginea ya Ekwatelo", "name:ki"=>"Ginekweta", "name:kk"=>"Экваторлық Гвинея", "name:km"=>"ហ្គីណេអេក្វាទ័រ", "name:kn"=>"ವಿಷುವದ್ರೇಖೆಯ ಗಿನಿ", "name:ko"=>"적도 기니", "name:ks"=>"اِکوِٹورِیَل گِنی", "name:ku"=>"Gîneya Rojbendî", "name:kw"=>"Gyni Ekwadoriel", "name:la"=>"Guinea Aequatorensis", "name:lb"=>"Equatorialguinea", "name:lg"=>"Equatorial Guinea", "name:li"=>"Equatoriaal Guinee", "name:ln"=>"Gine-Ekwatorial", "name:lo"=>"ອີຄົວໂທເລຍກີເນຍ", "name:lt"=>"Pusiaujo Gvinėja", "name:lv"=>"Ekvatoriālā Gvineja", "name:mg"=>"Ginea Ekoatorialy", "name:mi"=>"Kini Ekuatoria", "name:mk"=>"Екваторска Гвинеја", "name:ml"=>"ഇക്വറ്റോറിയൽ ഗിനി", "name:mn"=>"Экваторын Гвиней", "name:mr"=>"इक्वेटोरीयल गिनी", "name:ms"=>"Guinea Khatulistiwa", "name:mt"=>"Gwinea Ekwatorjali", "name:my"=>"အီကွေတာဂီနီနိုင်ငံ", "name:na"=>"Gini t Ekwador", "name:nb"=>"Ekvatorial-Guinea", "name:ne"=>"इक्वेटोरियल गिनी", "name:nl"=>"Equatoriaal Guinee", "name:nn"=>"Ekvatorial-Guinea", "name:no"=>"Ekvatorial-Guinea", "name:nv"=>"Gíní Nahasdzáán Ałníiʼgi Siʼánígíí", "name:oc"=>"Guinèa Eqüatoriala", "name:om"=>"Iqu’aatoriyaal Giinii", "name:or"=>"ବିଷୁବରେଖୀୟ ଗିନି", "name:os"=>"Экваториалон Гвиней", "name:pa"=>"ਭੂ-ਮੱਧ ਰੇਖਾਈ ਗਿਨੀ", "name:pl"=>"Gwinea Równikowa", "name:ps"=>"اېکواټوريال ګوينا", "name:pt"=>"Guiné Equatorial", "name:qu"=>"Chawpipacha Khiniya", "name:rm"=>"Guinea Equatoriala", "name:ro"=>"Guineea Ecuatorială", "name:ru"=>"Экваториальная Гвинея", "name:rw"=>"Gineya Ekwatoriyale", "name:sc"=>"Guinea Ecuadoriale", "name:se"=>"Ekvatoriála Guinea", "name:sg"=>"Ginëe tî Ekuatëre", "name:sh"=>"Ekvatorijalna Gvineja", "name:si"=>"සමක ගිනියාව", "name:sk"=>"Rovníková Guinea", "name:sl"=>"Ekvatorialna Gvineja", "name:sm"=>"Kini Ekuatoria", "name:sn"=>"Equatorial Guinea", "name:so"=>"Ikweetiga Guinea", "name:sq"=>"Guinea Ekuatoriale", "name:sr"=>"Екваторијална Гвинеја", "name:st"=>"Equatorial Guinea", "name:su"=>"Guinéa Khatulistiwa", "name:sv"=>"Ekvatorialguinea", "name:sw"=>"Guinea ya Ikweta", "name:ta"=>"எக்குவடோரியல் கினி", "name:te"=>"ఎక్వేటోరియాల్ గినియా", "name:tg"=>"Гвинеяи Истивоӣ", "name:th"=>"อิเควทอเรียลกินี", "name:ti"=>"ኢኳቶሪያል ጊኒ", "name:tk"=>"Ekwatorial Gwineýa", "name:tl"=>"Gineang Ekwatoriyal", "name:to"=>"ʻEkueta Kini", "name:tr"=>"Ekvator Ginesi", "name:ts"=>"Gineya ya le Nkaveni", "name:tt"=>"Экваториа́ль Гвине́я", "name:ug"=>"ئېكۋاتور گۋىنېيىسى", "name:uk"=>"Екваторіа́льна Ґвіне́я", "name:ur"=>"استوائی گنی", "name:uz"=>"Ekvatorli Gvineya", "name:vi"=>"Guinea Xích Đạo", "name:vo"=>"Kveatora-Gineyän", "name:wo"=>"Gineg yamoo", "name:yi"=>"עקוואטארישע גינע", "name:yo"=>"Guinea Alágedeméjì", "name:zh"=>"赤道几内亚", "name:zu"=>"iGini Enkabazwe"
-pk     "name"=>"پاکستان", "name:af"=>"Pakistan", "name:am"=>"ፓኪስታን", "name:an"=>"Pakistán", "name:ar"=>"باكستان", "name:as"=>"পাকিস্তান", "name:az"=>"Pakistan", "name:ba"=>"Пакистан", "name:be"=>"Пакістан", "name:bg"=>"Пакистан", "name:bh"=>"पाकिस्तान", "name:bn"=>"পাকিস্তান", "name:bo"=>"པ་ཀི་སི་ཐན", "name:br"=>"Pakistan", "name:bs"=>"Pakistan", "name:ca"=>"Pakistan", "name:ce"=>"Пакистан", "name:cs"=>"Pákistán", "name:cv"=>"Пакистан", "name:cy"=>"Pakistan", "name:da"=>"Pakistan", "name:de"=>"Pakistan", "name:dv"=>"ޕާކިސްތާން", "name:el"=>"Πακιστάν", "name:en"=>"Pakistan", "name:eo"=>"Pakistano", "name:es"=>"Pakistán", "name:et"=>"Pakistan", "name:eu"=>"Pakistan", "name:fa"=>"پاکستان", "name:fi"=>"Pakistan", "name:fo"=>"Pakistan", "name:fr"=>"Pakistan", "name:fy"=>"Pakistan", "name:ga"=>"An Phacastáin", "name:gd"=>"Pagastàn", "name:gl"=>"Paquistán", "name:gn"=>"Pakistán", "name:gu"=>"પાકિસ્તાન", "name:gv"=>"Yn Phakistaan", "name:ha"=>"Pakistan", "name:he"=>"פקיסטן", "name:hi"=>"पाकिस्तान", "name:hr"=>"Pakistan", "name:ht"=>"Pakistan", "name:hu"=>"Pakisztán", "name:hy"=>"Պակիստան", "name:ia"=>"Pakistan", "name:id"=>"Pakistan", "name:ie"=>"Pakistan", "name:io"=>"Pakistan", "name:is"=>"Pakistan", "name:it"=>"Pakistan", "name:iu"=>"ᐸᑭᔅᑕᓐ", "name:ja"=>"パキスタン", "name:jv"=>"Pakistan", "name:ka"=>"პაკისტანი", "name:ki"=>"Pakistan", "name:kk"=>"Пәкістан", "name:kl"=>"Pakistan", "name:km"=>"ប៉ាគីស្ថាន", "name:kn"=>"ಪಾಕಿಸ್ತಾನ", "name:ko"=>"파키스탄", "name:ks"=>"پاکِستان", "name:ku"=>"Pakistan", "name:kv"=>"Пакистан", "name:kw"=>"Pakistan", "name:ky"=>"Пакистан", "name:la"=>"Pakistania", "name:lb"=>"Pakistan", "name:li"=>"Pakistan", "name:ln"=>"Pakistáni", "name:lt"=>"Pakistanas", "name:lv"=>"Pakistāna", "name:mi"=>"Pakitāne", "name:mk"=>"Пакистан", "name:ml"=>"പാകിസ്താൻ", "name:mn"=>"Пакистан", "name:mr"=>"पाकिस्तान", "name:ms"=>"Pakistan", "name:mt"=>"Pakistan", "name:my"=>"ပါကစ္စတန်နိုင်ငံ", "name:na"=>"Pakistan", "name:nb"=>"Pakistan", "name:ne"=>"पाकिस्तान", "name:nl"=>"Pakistan", "name:nn"=>"Pakistan", "name:no"=>"Pakistan", "name:nv"=>"Eʼeʼaahjí Naakaii Dootłʼizhí Bikéyah", "name:oc"=>"Paquistan", "name:or"=>"ପାକିସ୍ଥାନ", "name:os"=>"Пакистан", "name:pa"=>"ਪਾਕਿਸਤਾਨ", "name:pl"=>"Pakistan", "name:ps"=>"پاکستان", "name:pt"=>"Paquistão", "name:qu"=>"Pakistan", "name:ro"=>"Pakistan", "name:ru"=>"Пакистан", "name:rw"=>"Pakisitani", "name:sa"=>"पाकिस्तानम्", "name:sd"=>"پاڪستان", "name:se"=>"Pakistan", "name:sh"=>"Pakistan", "name:si"=>"පාකිස්ථානය", "name:sk"=>"Pakistan", "name:sl"=>"Pakistan", "name:so"=>"Bakistaan", "name:sq"=>"Pakistani", "name:sr"=>"Пакистан", "name:ss"=>"IPhakhistani", "name:su"=>"Pakistan", "name:sv"=>"Pakistan", "name:sw"=>"Pakistan", "name:ta"=>"பாக்கித்தான்", "name:te"=>"పాకిస్తాన్", "name:tg"=>"Покистон", "name:th"=>"ประเทศปากีสถาน", "name:tk"=>"Päkistan", "name:tl"=>"Pakistan", "name:tr"=>"Pakistan", "name:tt"=>"Пакъстан", "name:ug"=>"پاكىستان", "name:uk"=>"Пакистан", "name:ur"=>"‏پاکستان‎", "name:uz"=>"Pokiston", "name:vi"=>"Pakistan", "name:vo"=>"Pakistän", "name:wa"=>"Pakistan", "name:wo"=>"Pakistaan", "name:yi"=>"פאקיסטאן", "name:yo"=>"Pakístàn", "name:zh"=>"巴基斯坦", "name:zu"=>"IPakistani"
-be     "name"=>"België / Belgique / Belgien", "name:af"=>"België", "name:ak"=>"Belgium", "name:am"=>"ቤልጅግ", "name:an"=>"Belchica", "name:ar"=>"بلجيكا", "name:av"=>"Бе́льгия", "name:ay"=>"Bilkiya", "name:az"=>"Belçika", "name:ba"=>"Бе́льгия", "name:be"=>"Бeльгія", "name:bg"=>"Белгия", "name:bh"=>"बेल्जियम", "name:bi"=>"Beljiom", "name:bm"=>"Bɛliziki", "name:bn"=>"বেলজিয়াম", "name:bo"=>"པེར་ཅིན།", "name:br"=>"Belgia", "name:bs"=>"Belgija", "name:ca"=>"Bèlgica", "name:ce"=>"Бельги", "name:co"=>"Belgica", "name:cs"=>"Belgie", "name:cu"=>"Бє́лгїѥ", "name:cv"=>"Бельги", "name:cy"=>"Gwlad Belg", "name:da"=>"Belgien", "name:de"=>"Belgien", "name:dv"=>"ބެލްޖިއަމް", "name:dz"=>"བེལ་ཇིཡམ", "name:ee"=>"Belgium", "name:el"=>"Βέλγιο", "name:en"=>"Belgium", "name:eo"=>"Belgio", "name:es"=>"Bélgica", "name:et"=>"Belgia", "name:eu"=>"Belgika", "name:fa"=>"بلژیک", "name:ff"=>"Beljik", "name:fi"=>"Belgia", "name:fo"=>"Belgia", "name:fr"=>"Belgique", "name:fy"=>"Belgje", "name:ga"=>"an Bheilg", "name:gd"=>"a' Bheilg", "name:gl"=>"Bélxica", "name:gn"=>"Véyhika", "name:gu"=>"બેલ્જિયમ", "name:gv"=>"Velg", "name:ha"=>"Beljik", "name:he"=>"בֶּלְגְיָה", "name:hi"=>"बेल्जियम", "name:hr"=>"Belgija", "name:ht"=>"Bèljik", "name:hu"=>"Belgium", "name:hy"=>"Բելգիա", "name:ia"=>"Belgica", "name:id"=>"Belgia", "name:ie"=>"Belgia", "name:ig"=>"Belgium", "name:io"=>"Belgia", "name:is"=>"Belgía", "name:it"=>"Belgio", "name:ja"=>"ベルギー", "name:jv"=>"Bèlgia", "name:ka"=>"ბელგია", "name:kg"=>"Belezi", "name:ki"=>"Ubelgiji", "name:kk"=>"Бельгия", "name:kl"=>"Belgia", "name:km"=>"បែលហ្ស៉ិក", "name:kn"=>"ಬೆಲ್ಜಿಯಂ", "name:ko"=>"벨기에", "name:ks"=>"बेल्जियम", "name:ku"=>"Belçîka", "name:kv"=>"Бельгия", "name:kw"=>"Pow Belg", "name:ky"=>"Бельгия", "name:la"=>"Belgica", "name:lb"=>"Belsch", "name:lg"=>"Bubirigi", "name:li"=>"Belsj", "name:ln"=>"Bɛ́ljika", "name:lo"=>"ປະເທດແບນຊິກ", "name:lt"=>"Belgija", "name:lv"=>"Beļģija", "name:mg"=>"Belzika", "name:mi"=>"Pehiamu", "name:mk"=>"Белгија", "name:ml"=>"ബെൽജിയം", "name:mn"=>"Бельги", "name:mr"=>"बेल्जियम", "name:ms"=>"Belgium", "name:mt"=>"Belġju", "name:my"=>"ဘယ်လ်ဂျီယမ်နိုင်ငံ", "name:na"=>"Berdjiyum", "name:nb"=>"Belgia", "name:ne"=>"बेल्जियम", "name:nl"=>"België", "name:nn"=>"Belgia", "name:no"=>"Belgia", "name:oc"=>"Belgica", "name:om"=>"Beeljiyeem", "name:or"=>"ବେଲଜିଅମ", "name:os"=>"Бельги", "name:pa"=>"ਬੈਲਜੀਅਮ", "name:pi"=>"बेल्जियम", "name:pl"=>"Belgia", "name:ps"=>"بلجیم", "name:pt"=>"Bélgica", "name:qu"=>"Bilhika", "name:rm"=>"Belgia", "name:rn"=>"Ububirigi", "name:ro"=>"Belgia", "name:ru"=>"Бельгия", "name:rw"=>"Ububiligi", "name:sa"=>"बेल्जियम", "name:sc"=>"Bèlgiu", "name:sd"=>"بيلجيم", "name:se"=>"Belgia", "name:sg"=>"Bêleze", "name:sh"=>"Belgija", "name:si"=>"බෙල්ජියම්", "name:sk"=>"Belgicko", "name:sl"=>"Bélgija", "name:sm"=>"Peleseuma", "name:sn"=>"Belgium", "name:so"=>"Beljim", "name:sq"=>"Belgjika", "name:sr"=>"Белгија", "name:ss"=>"iBhelijiyamu", "name:su"=>"Bélgia", "name:sv"=>"Belgien", "name:sw"=>"Ubelgiji", "name:ta"=>"பெல்ஜியம்", "name:te"=>"బెల్జియం", "name:tg"=>"Белгия", "name:th"=>"เบลเยียม", "name:ti"=>"ቤልጄም", "name:tk"=>"Belgiýa", "name:tl"=>"Belhika", "name:to"=>"Pelesiume", "name:tr"=>"Belçika", "name:ts"=>"Belgium", "name:tt"=>"Бе́льгия", "name:tw"=>"Belgium", "name:ug"=>"بېلگىيە", "name:uk"=>"Бе́льгія", "name:ur"=>"بلجئیم", "name:uz"=>"Belgiya", "name:vi"=>"Bỉ", "name:vo"=>"Belgän", "name:wa"=>"Beldjike", "name:wo"=>"Belsik", "name:yi"=>"בעלגיע", "name:yo"=>"Bẹ́ljíọ̀m", "name:zh"=>"比利時", "name:zu"=>"i-Belgium"
-eg     "name"=>"مصر", "name:ab"=>"Мы́сры", "name:af"=>"Egipte", "name:ak"=>"Igyipt", "name:am"=>"ግብፅ", "name:an"=>"Echipto", "name:ar"=>"مصر", "name:as"=>"ইজিপ্ত", "name:av"=>"Еги́пет", "name:ay"=>"Iqiqtu", "name:az"=>"Misir", "name:ba"=>"Мысыр", "name:be"=>"Егі́пет", "name:bg"=>"Египет", "name:bh"=>"मिस्र", "name:bm"=>"Misra", "name:bn"=>"মিশর", "name:bo"=>"ཨའི་ཅི།", "name:br"=>"Egipt", "name:bs"=>"Egipat", "name:ca"=>"Egipte", "name:ce"=>"Мисар", "name:ch"=>"Ehiptu", "name:cs"=>"Egypt", "name:cu"=>"Єгѷптъ", "name:cy"=>"Yr Aifft", "name:da"=>"Egypten", "name:de"=>"Ägypten", "name:dv"=>"މިޞްރު", "name:ee"=>"Edzipti", "name:el"=>"Αίγυπτος", "name:en"=>"Egypt", "name:eo"=>"Egiptio", "name:es"=>"Egipto", "name:et"=>"Egiptus", "name:eu"=>"Egipto", "name:fa"=>"مصر", "name:ff"=>"Ejipt", "name:fi"=>"Egypti", "name:fj"=>"Ijipta", "name:fo"=>"Egyptaland", "name:fr"=>"Égypte", "name:fy"=>"Egypte", "name:ga"=>"An Éigipt", "name:gd"=>"An Èipheit", "name:gl"=>"Exipto", "name:gn"=>"Ehipto", "name:gu"=>"ઇજિપ્ત", "name:gv"=>"Yn Egypt", "name:ha"=>"Misra", "name:he"=>"מצרים", "name:hi"=>"मिस्र", "name:hr"=>"Egipat", "name:ht"=>"Ejip", "name:hu"=>"Egyiptom", "name:hy"=>"Եգիպտոս", "name:ia"=>"Egypto", "name:id"=>"Mesir", "name:ie"=>"Egiptia", "name:ig"=>"Egypt", "name:io"=>"Egiptia", "name:is"=>"Egyptaland", "name:it"=>"Egitto", "name:ja"=>"エジプト", "name:jv"=>"Mesir", "name:ka"=>"ეგვიპტე", "name:kg"=>"Misiri", "name:ki"=>"Egypt", "name:kk"=>"Мысыр", "name:kl"=>"Egypt", "name:km"=>"អេហ៊្សីប", "name:kn"=>"ಈಜಿಪ್ಟ್", "name:ko"=>"이집트", "name:ks"=>"مِسر", "name:ku"=>"Misir", "name:kv"=>"Египет", "name:kw"=>"Ejyp", "name:ky"=>"Египет", "name:la"=>"Aegyptus", "name:lb"=>"Egypten", "name:lg"=>"Egypt", "name:li"=>"Egypte", "name:ln"=>"Ejipte", "name:lo"=>"ອີຢິບ", "name:lt"=>"Egiptas", "name:lv"=>"Ēģipte", "name:mg"=>"Ejipta", "name:mi"=>"Īhipa", "name:mk"=>"Египет", "name:ml"=>"ഈജിപ്ത്", "name:mn"=>"Египет", "name:mr"=>"इजिप्त", "name:ms"=>"Mesir", "name:mt"=>"Eġittu", "name:my"=>"အီဂျစ်နိုင်ငံ", "name:na"=>"Idjipt", "name:ne"=>"मिश्र", "name:nl"=>"Egypte", "name:nn"=>"Egypt", "name:no"=>"Egypt", "name:nv"=>"Ííjip", "name:oc"=>"Egipte", "name:om"=>"Ijiipti", "name:or"=>"ଇଜିପ୍ଟ", "name:os"=>"Мысыр", "name:pa"=>"ਮਿਸਰ", "name:pi"=>"ईजिप्ट", "name:pl"=>"Egipt", "name:ps"=>"مصر", "name:pt"=>"Egito", "name:qu"=>"Ihiptu", "name:rm"=>"Egipta", "name:rn"=>"Egipto", "name:ro"=>"Egipt", "name:ru"=>"Египет", "name:sa"=>"ईजिप्तदेशः", "name:sc"=>"Egittu", "name:sd"=>"مصر", "name:se"=>"Egypta", "name:sg"=>"Kâmitâ", "name:sh"=>"Egipat", "name:si"=>"ඊජීප්තුව", "name:sk"=>"Egypt", "name:sl"=>"Egipt", "name:sm"=>"Aikupito", "name:sn"=>"Egypt", "name:so"=>"Masar", "name:sq"=>"Egjipti", "name:sr"=>"Египат", "name:ss"=>"iGibhithe", "name:st"=>"Egepeta", "name:su"=>"Mesir", "name:sv"=>"Egypten", "name:sw"=>"Misri", "name:ta"=>"எகிப்து", "name:te"=>"ఈజిప్టు", "name:tg"=>"Миср", "name:th"=>"ประเทศอียิปต์", "name:ti"=>"ግብጽ", "name:tk"=>"Müsür", "name:tl"=>"Ehipto", "name:to"=>"ʻIsipite", "name:tr"=>"Mısır", "name:ts"=>"Gibita", "name:tt"=>"Мисы́р", "name:tw"=>"Egypt", "name:ty"=>"’Aifiti", "name:ug"=>"مىسىر", "name:uk"=>"Єги́пет", "name:ur"=>"مصر", "name:uz"=>"Misr", "name:vi"=>"Ai Cập", "name:vo"=>"Lägüptän", "name:wa"=>"Edjipe", "name:wo"=>"Isipt", "name:yi"=>"עגיפטן", "name:yo"=>"Ẹ́gíptì", "name:za"=>"Aehciz", "name:zh"=>"埃及", "name:zu"=>"iGibhithe"
-jo     "name"=>"الأردن", "name:af"=>"Jordanië", "name:am"=>"ጆርዳን", "name:an"=>"Chordania", "name:ar"=>"الأردن", "name:az"=>"İordaniya", "name:ba"=>"Иордания", "name:be"=>"Іарданія", "name:bg"=>"Йордания", "name:bm"=>"Ordon", "name:bn"=>"জর্দান", "name:bo"=>"རྗོར་ཌན།", "name:br"=>"Jordania", "name:bs"=>"Jordan", "name:ca"=>"Jordània", "name:cs"=>"Jordánsko", "name:cv"=>"Иордани", "name:cy"=>"Gwlad Iorddonen", "name:da"=>"Jordan", "name:de"=>"Jordanien", "name:dv"=>"އުރުދުން", "name:el"=>"Ιορδανία", "name:en"=>"Jordan", "name:eo"=>"Jordanio", "name:es"=>"Jordania", "name:et"=>"Jordaania", "name:eu"=>"Jordania", "name:fa"=>"اردن", "name:fi"=>"Jordania", "name:fo"=>"Jordan", "name:fr"=>"Jordanie", "name:fy"=>"Jordaanje", "name:ga"=>"An Iordáin", "name:gd"=>"Iòrdan", "name:gl"=>"Xordania", "name:gu"=>"જૉર્ડન", "name:gv"=>"Yn Jordaan", "name:he"=>"ירדן", "name:hi"=>"जॉर्डन", "name:hr"=>"Jordan", "name:ht"=>"Jòdani", "name:hu"=>"Jordánia", "name:hy"=>"Հորդանան", "name:ia"=>"Jordania", "name:id"=>"Yordania", "name:ie"=>"Jordania", "name:io"=>"Jordania", "name:is"=>"Jórdanía", "name:it"=>"Giordania", "name:ja"=>"ヨルダン", "name:jv"=>"Yordania", "name:ka"=>"იორდანია", "name:kk"=>"Иордания", "name:kl"=>"Jordan", "name:km"=>"ហ្សកដង់", "name:ko"=>"요르단", "name:ks"=>"اردن", "name:ku"=>"Urdun", "name:kv"=>"Иордания", "name:kw"=>"Jordan", "name:la"=>"Iordania", "name:lb"=>"Jordanien", "name:li"=>"Jordanië", "name:ln"=>"Zordaní", "name:lt"=>"Jordanija", "name:lv"=>"Jordānija", "name:mi"=>"Hōrano", "name:mk"=>"Јордан", "name:ml"=>"ജോർദാൻ", "name:mn"=>"Йордан", "name:mr"=>"जॉर्डन", "name:ms"=>"Jordan", "name:mt"=>"Ġordan", "name:my"=>"ဂျော်ဒန်နိုင်ငံ", "name:na"=>"Djordan", "name:nl"=>"Jordanië", "name:nn"=>"Jordan", "name:no"=>"Jordan", "name:nv"=>"Jóoʼdan", "name:oc"=>"Jordania", "name:or"=>"ଜୋର୍ଡାନ", "name:os"=>"Иордани", "name:pa"=>"ਜਾਰਡਨ", "name:pl"=>"Jordania", "name:ps"=>"اردن", "name:pt"=>"Jordânia", "name:qu"=>"Hurdanya", "name:ro"=>"Iordania", "name:ru"=>"Иордания", "name:rw"=>"Yorudani", "name:sa"=>"जार्डन", "name:se"=>"Jordania", "name:sh"=>"Jordan", "name:sk"=>"Jordánsko", "name:sl"=>"Jordanija", "name:so"=>"Urdun", "name:sq"=>"Jordania", "name:sr"=>"Јордан", "name:ss"=>"IJoridane", "name:su"=>"Yordania", "name:sv"=>"Jordanien", "name:sw"=>"Yordani", "name:ta"=>"ஜோர்தான்", "name:te"=>"జోర్డాన్", "name:th"=>"ประเทศจอร์แดน", "name:tk"=>"Iordaniýa", "name:tl"=>"Hordan", "name:tr"=>"Ürdün", "name:tt"=>"Үрдүн", "name:ug"=>"ئىئوردانىيە", "name:uk"=>"Йорданія", "name:ur"=>"اردن", "name:uz"=>"Iordaniya", "name:vi"=>"Jordan", "name:vo"=>"Yordän", "name:wo"=>"Jordaani", "name:yi"=>"יארדאניע", "name:yo"=>"Jọ́rdánì", "name:zh"=>"约旦/約旦"
-tn     "name"=>"تونس", "name:af"=>"Tunisië", "name:am"=>"ቱኒዚያ", "name:an"=>"Tunicia", "name:ar"=>"تونس", "name:az"=>"Tunis", "name:ba"=>"Тунис", "name:be"=>"Туніс", "name:bg"=>"Тунис", "name:bm"=>"Tunizi", "name:bn"=>"তিউনিসিয়া", "name:bo"=>"ཏུ་ནི་ཤི་ཡ།", "name:br"=>"Tunizia", "name:bs"=>"Tunis", "name:ca"=>"Tunísia", "name:ce"=>"Тунис", "name:cs"=>"Tunisko", "name:cv"=>"Тунис", "name:cy"=>"Tunisia", "name:da"=>"Tunesien", "name:de"=>"Tunesien", "name:dv"=>"ތޫނިސް", "name:ee"=>"Tunisia", "name:el"=>"Τυνησία", "name:en"=>"Tunisia", "name:eo"=>"Tunizio", "name:es"=>"Túnez", "name:et"=>"Tuneesia", "name:eu"=>"Tunisia", "name:fa"=>"تونس", "name:fi"=>"Tunisia", "name:fo"=>"Tunesia", "name:fr"=>"Tunisie", "name:fy"=>"Tuneezje", "name:ga"=>"An Túinéis", "name:gd"=>"Tuinisia", "name:gl"=>"Tunisia", "name:gu"=>"ટ્યુનિશિયા", "name:gv"=>"Yn Tooneesh", "name:he"=>"תוניסיה", "name:hi"=>"ट्यूनिशिया", "name:hr"=>"Tunis", "name:ht"=>"Tinizi", "name:hu"=>"Tunézia", "name:hy"=>"Թունիս", "name:id"=>"Tunisia", "name:ie"=>"Tunisia", "name:io"=>"Tunizia", "name:is"=>"Túnis", "name:it"=>"Tunisia", "name:ja"=>"チュニジア", "name:jv"=>"Tunisia", "name:ka"=>"ტუნისი", "name:kg"=>"Tunisia", "name:kk"=>"Тунис", "name:kn"=>"ಟುನೀಶಿಯ", "name:ko"=>"튀니지", "name:ks"=>"تونس", "name:ku"=>"Tûnis", "name:kw"=>"Tunisi", "name:ky"=>"Тунис", "name:la"=>"Tunesia", "name:lb"=>"Tunesien", "name:li"=>"Tunesië", "name:ln"=>"Tunisia", "name:lt"=>"Tunisas", "name:lv"=>"Tunisija", "name:mg"=>"Tonizia", "name:mi"=>"Tūnihia", "name:mk"=>"Тунис", "name:ml"=>"ടുണീഷ്യ", "name:mn"=>"Тунис", "name:mr"=>"ट्युनिसिया", "name:ms"=>"Tunisia", "name:mt"=>"Tuneżija", "name:my"=>"တူနီးရှားနိုင်ငံ", "name:nl"=>"Tunesië", "name:nn"=>"Tunisia", "name:no"=>"Tunisia", "name:oc"=>"Tunisia", "name:or"=>"ଟ୍ୟୁନିସିଆ", "name:os"=>"Тунис", "name:pa"=>"ਤੁਨੀਸੀਆ", "name:pl"=>"Tunezja", "name:ps"=>"تونس", "name:pt"=>"Tunísia", "name:qu"=>"Tunisya", "name:rm"=>"Tunesia", "name:ro"=>"Tunisia", "name:ru"=>"Тунис", "name:rw"=>"Tunisiya", "name:sa"=>"टुनिशिया", "name:sc"=>"Tunisia", "name:se"=>"Tunisia", "name:sg"=>"Tunizïi", "name:sh"=>"Tunis", "name:sk"=>"Tunisko", "name:sl"=>"Tunizija", "name:sn"=>"Tunisia", "name:so"=>"Tunisiya", "name:sq"=>"Tunizia", "name:sr"=>"Тунис", "name:ss"=>"IThunisiya", "name:su"=>"Tunisia", "name:sv"=>"Tunisien", "name:sw"=>"Tunisia", "name:ta"=>"துனீசியா", "name:te"=>"ట్యునీషియా", "name:tg"=>"Тунис", "name:th"=>"ประเทศตูนิเซีย", "name:ti"=>"ቱኒዢያ", "name:tk"=>"Tunis", "name:tl"=>"Tunisya", "name:tr"=>"Tunus", "name:ts"=>"Tunisia", "name:tt"=>"Тунис", "name:ug"=>"تۇنىس", "name:uk"=>"Туніс", "name:ur"=>"تونس", "name:uz"=>"Tunis", "name:vi"=>"Tunisia", "name:vo"=>"Tünisän", "name:wa"=>"Tunizeye", "name:wo"=>"Tiniisi", "name:yi"=>"טוניסיע", "name:yo"=>"Tùnísíà", "name:zh"=>"突尼西亞", "name:zu"=>"ITunisia"
-dz     "name"=>"Algérie / ⵍⵣⵣⴰⵢⴻⵔ / الجزائر", "name:af"=>"Algerië", "name:ak"=>"Algeria", "name:am"=>"አልጄሪያ", "name:an"=>"Alcheria", "name:ar"=>"الجزائر", "name:as"=>"আলজেৰিয়া", "name:ay"=>"Alhirya", "name:az"=>"Əlcəzair", "name:ba"=>"Алжи́р", "name:be"=>"Алжы́р", "name:bg"=>"Алжѝр", "name:bh"=>"अल्जीरिया", "name:bm"=>"Algeri", "name:bn"=>"আলজেরিয়া", "name:bo"=>"ཨཱལ་ཇི་རི་ཡ།", "name:br"=>"Aljeria", "name:bs"=>"Alžir", "name:ca"=>"Algèria", "name:ce"=>"Алжи́р", "name:cs"=>"Alžírsko", "name:cv"=>"Алжир", "name:cy"=>"Algeria", "name:da"=>"Algeriet", "name:de"=>"Algerien", "name:dv"=>"ޖަޒާއިރު", "name:dz"=>"ཨཱལ་ཇི་རི་ཡ", "name:ee"=>"Ɔldzeria", "name:el"=>"Αλγερία", "name:en"=>"Algeria", "name:eo"=>"Alĝerio", "name:es"=>"Argelia", "name:et"=>"Alžeeria", "name:eu"=>"Aljeria", "name:fa"=>"الجزایر", "name:ff"=>"Aljeri", "name:fi"=>"Algeria", "name:fo"=>"Algeria", "name:fr"=>"Algérie", "name:fy"=>"Algerije", "name:ga"=>"An Ailgéir", "name:gd"=>"Aildiria", "name:gl"=>"Alxeria", "name:gn"=>"Ayhelia", "name:gu"=>"અલ્જીરિયા", "name:gv"=>"Yn Algear", "name:ha"=>"Aljeriya", "name:he"=>"אלג'יריה", "name:hi"=>"अल्जीरिया", "name:hr"=>"Alžir", "name:ht"=>"Aljeri", "name:hu"=>"Algéria", "name:hy"=>"Ալժիր", "name:ia"=>"Algeria", "name:id"=>"Aljazair", "name:ie"=>"Algeria", "name:ig"=>"Algeria", "name:io"=>"Aljeria", "name:is"=>"Alsír", "name:it"=>"Algeria", "name:ja"=>"アルジェリア", "name:jv"=>"Aljazair", "name:ka"=>"ალჟირი", "name:kg"=>"Algeria", "name:ki"=>"Algeria", "name:kk"=>"Алжир", "name:kl"=>"Algeriet", "name:km"=>"ប្រទេសអាល់ហ្សេរី", "name:kn"=>"ಅಲ್ಜೀರಿಯ", "name:ko"=>"알제리", "name:ks"=>"اٮ۪لجیرِیا", "name:ku"=>"Cezayir", "name:kw"=>"Aljeri", "name:ky"=>"Алжир", "name:la"=>"Algerium", "name:lb"=>"Algerien", "name:lg"=>"Algeria", "name:li"=>"Algerieë", "name:ln"=>"Aljeria", "name:lo"=>"ແອລຈິເລຍ", "name:lt"=>"Alžyras", "name:lv"=>"Alžīrija", "name:mg"=>"Aljeria", "name:mi"=>"Aratiria", "name:mk"=>"Алжир", "name:ml"=>"അൾജീറിയ", "name:mn"=>"Алжир", "name:mr"=>"अल्जीरिया", "name:ms"=>"Algeria", "name:mt"=>"Alġerija", "name:my"=>"အယ်လ်ဂျီးရီးယားနိုင်ငံ", "name:na"=>"Ardjiriya", "name:ne"=>"अल्जेरिया", "name:nl"=>"Algerije", "name:nn"=>"Algerie", "name:no"=>"Algerie", "name:nv"=>"Aljííya", "name:ny"=>"Algeria", "name:oc"=>"Argeria", "name:om"=>"Aljeeriyaa", "name:or"=>"ଆଲଜେରିଆ", "name:os"=>"Алжир", "name:pa"=>"ਅਲਜੀਰੀਆ", "name:pi"=>"अल्जीरिया", "name:pl"=>"Algieria", "name:ps"=>"الجزاير", "name:pt"=>"Argélia", "name:qu"=>"Alhirya", "name:rm"=>"Algeria", "name:rn"=>"Alijeriya", "name:ro"=>"Algeria", "name:ru"=>"Алжир", "name:rw"=>"Aligeriya", "name:sa"=>"अल्जीरिया", "name:sc"=>"Algerìa", "name:sd"=>"الجزائر", "name:se"=>"Algeria", "name:sg"=>"Alazëri", "name:sh"=>"Alžir", "name:si"=>"ඇල්ජීරියාව", "name:sk"=>"Alžírsko", "name:sl"=>"Alžirija", "name:sm"=>"Algeria", "name:sn"=>"Algeria", "name:so"=>"Aljeeriya", "name:sq"=>"Algjeria", "name:sr"=>"Алжир", "name:ss"=>"i-Alijeriya", "name:st"=>"Algeria", "name:su"=>"Aljazair", "name:sv"=>"Algeriet", "name:sw"=>"Algeria", "name:ta"=>"அல்சீரியா", "name:te"=>"అల్జీరియా", "name:tg"=>"Алҷазоир", "name:th"=>"ประเทศแอลจีเรีย", "name:ti"=>"አልጀሪያ", "name:tk"=>"Alžir", "name:tl"=>"Arhelya", "name:to"=>"ʻAisilia", "name:tr"=>"Cezayir", "name:ts"=>"Algeriya", "name:tt"=>"Әлҗәзаи́р", "name:tw"=>"Algeria", "name:ug"=>"ئالجىرىيە", "name:uk"=>"Алжир", "name:ur"=>"الجزائر", "name:uz"=>"Jazoir", "name:vi"=>"Algérie", "name:vo"=>"Laljerän", "name:wa"=>"Aldjereye", "name:wo"=>"Alseeri", "name:xh"=>"I-Algeria", "name:yi"=>"אַלזשיר", "name:yo"=>"Àlgéríà", "name:za"=>"Algeria", "name:zh"=>"阿尔及利亚", "name:zu"=>"iAljiriya"
-az     "name"=>"Azərbaycan", "name:ab"=>"Азербаиџьан", "name:af"=>"Azerbeidjan", "name:ak"=>"Azerbaijan", "name:am"=>"አዘርባይጃን", "name:an"=>"Azerbaichán", "name:ar"=>"أذربيجان", "name:as"=>"আজেৰবাইজান", "name:av"=>"Азарбижан", "name:az"=>"Azərbaycan", "name:ba"=>"Әзербайжан", "name:be"=>"Азербайджа́н", "name:bg"=>"Азербайджан", "name:bh"=>"अज़रबैजान", "name:bi"=>"Azerbaijan", "name:bm"=>"Azɛrbayjaŋ", "name:bn"=>"আজারবাইজান", "name:bo"=>"ཨ་ཛར་བཡི་ཇན།", "name:br"=>"Azerbaidjan", "name:bs"=>"Azerbejdžan", "name:ca"=>"Azerbaidjan", "name:ce"=>"Азербайджа́н", "name:co"=>"Azerbaighjan", "name:cs"=>"Ázerbájdžán", "name:cu"=>"Аꙁѣрбаича́нъ", "name:cv"=>"Азербайджан", "name:cy"=>"Aserbaijan", "name:da"=>"Aserbajdsjan", "name:de"=>"Aserbaidschan", "name:dv"=>"އަޒަރުބައިޖާން", "name:dz"=>"ཨཛར་བཡེ་ཇན།", "name:ee"=>"Azerbaijan", "name:el"=>"Αζερμπαϊτζάν", "name:en"=>"Azerbaijan", "name:eo"=>"Azerbajĝano", "name:es"=>"Azerbaiyán", "name:et"=>"Aserbaidžaan", "name:eu"=>"Azerbaijan", "name:fa"=>"آذربایجان", "name:ff"=>"Aserbayjan", "name:fi"=>"Azerbaidžan", "name:fo"=>"Aserbadsjan", "name:fr"=>"Azerbaïdjan", "name:fy"=>"Azerbeidzjan", "name:ga"=>"an Asarbaiseáin", "name:gd"=>"Asarbaideàn", "name:gl"=>"Acerbaixán", "name:gn"=>"Aservaijã", "name:gu"=>"અઝેરબીજાન", "name:gv"=>"yn Asserbajaan", "name:ha"=>"Azerbaijan", "name:he"=>"אָזַרְבַּיְיגָ'ן", "name:hi"=>"अज़रबैजान", "name:hr"=>"Azerbajdžan", "name:ht"=>"Azerbaydjan", "name:hu"=>"Azerbajdzsán", "name:hy"=>"Ադրբեջան", "name:ia"=>"Azerbaidzhan", "name:id"=>"Azerbaijan", "name:ie"=>"Azerbaidjan", "name:io"=>"Azerbaijan", "name:is"=>"Aserbaísjan", "name:it"=>"Azerbaigian", "name:ja"=>"アゼルバイジャン", "name:jv"=>"Azerbaijan", "name:ka"=>"აზერბაიჯანი", "name:kg"=>"Azerbaidjan", "name:ki"=>"Azerbaijan", "name:kk"=>"Әзірбайжан", "name:kl"=>"Aserbajdsjan", "name:km"=>"អាស៊ែបៃហ្សង់", "name:kn"=>"ಅಜೆರ್ಬೈಜಾನ್", "name:ko"=>"아제르바이잔", "name:ks"=>"آزَرباجان", "name:ku"=>"Azerbaycan", "name:kv"=>"Азербайджа́н", "name:kw"=>"Azerbayjan", "name:ky"=>"Азербайжан", "name:la"=>"Atropatene", "name:lb"=>"Aserbaidschan", "name:lg"=>"Azerebayijaani", "name:li"=>"Azerbaidzjan", "name:ln"=>"Azɛrbayzáni", "name:lo"=>"ປະເທດອາແຊກບາຍຊັງ", "name:lt"=>"Azerbaidžanas", "name:lv"=>"Azerbaidžāna", "name:mg"=>"Azerbaijana", "name:mi"=>"Atepaihānia", "name:mk"=>"Азербејџан", "name:ml"=>"അസർബെയ്ജാൻ", "name:mn"=>"Азербайжан", "name:mo"=>"Азербаиӂан", "name:mr"=>"अझरबैजान", "name:ms"=>"Azerbaijan", "name:mt"=>"Ażerbajġan", "name:my"=>"အဇာဘိုင်ဂျန်နိုင်ငံ", "name:na"=>"Aderbaidjan", "name:nb"=>"Aserbajdsjan", "name:ne"=>"अजरबैजान", "name:nl"=>"Azerbeidzjan", "name:nn"=>"Aserbajdsjan", "name:no"=>"Aserbajdsjan", "name:nv"=>"Azééwii Bikéyah", "name:ny"=>"Azerbaijan", "name:oc"=>"Azerbaitjan", "name:om"=>"Azarbaajan", "name:or"=>"ଆଜରବାଇଜାନ", "name:os"=>"Азербайджан", "name:pa"=>"ਅਜ਼ਰਬਾਈਜਾਨ", "name:pi"=>"अजर्बैजान", "name:pl"=>"Azerbejdżan", "name:ps"=>"آزربایجان", "name:pt"=>"Azerbaijão", "name:qu"=>"Asarsuyu", "name:rm"=>"Aserbeidschan", "name:ro"=>"Azerbaidjan", "name:ru"=>"Азербайджан", "name:rw"=>"Azeribayijani", "name:sa"=>"अजर्बैजान", "name:sc"=>"Azerbaigián", "name:se"=>"Azerbaižan", "name:sg"=>"Zerebaidyäan", "name:sh"=>"Azerbejdžan", "name:si"=>"අසර්බයිජානය", "name:sk"=>"Azerbajdžan", "name:sl"=>"Azerbajdžan", "name:sm"=>"Azerbaijin", "name:sn"=>"Azerbaijan", "name:so"=>"Aserbiijaan", "name:sq"=>"Azerbajxhani", "name:sr"=>"Азербејџан", "name:ss"=>"iZebajani", "name:su"=>"Azerbaijan", "name:sv"=>"Azerbajdzjan", "name:sw"=>"Azerbaijan", "name:ta"=>"அசர்பைஜான்", "name:te"=>"అజర్‌బైజాన్", "name:tg"=>"Озарбойҷон", "name:th"=>"อาเซอร์ไบจาน", "name:ti"=>"አዘርባጃን", "name:tk"=>"Azerbaýjan", "name:tl"=>"Aserbayan", "name:to"=>"ʻAsapaisani", "name:tr"=>"Azerbaycan", "name:ts"=>"Azerbaijan", "name:tt"=>"Азәрбайҗан", "name:tw"=>"Azerbaijan", "name:ty"=>"Atepaihānia", "name:ug"=>"ئەزەربەيجان", "name:uk"=>"Азербайджа́н", "name:ur"=>"آذربائیجان", "name:uz"=>"Ozarbayjon", "name:vi"=>"Azerbaijan", "name:vo"=>"Lasärbäcän", "name:wo"=>"Aserbayjaan", "name:yi"=>"אַזערבײַדזשאַן", "name:yo"=>"Azerbaijan", "name:za"=>"Ahsehbaiqgyangh", "name:zh"=>"阿塞拜疆", "name:zu"=>"Azerbaijan"
-br     "name"=>"Brasil", "name:af"=>"Brasilië", "name:ak"=>"Brazil", "name:am"=>"ብራዚል", "name:an"=>"Brasil", "name:ar"=>"البَرَازِيل", "name:as"=>"ব্ৰাজিল", "name:ay"=>"Wrasil", "name:az"=>"Braziliya", "name:ba"=>"Брази́лия", "name:be"=>"Бразі́лія", "name:bg"=>"Бразилия", "name:bh"=>"ब्राज़ील", "name:bi"=>"Brazil", "name:bm"=>"Brazil", "name:bn"=>"ব্রাজিল", "name:bo"=>"པུ་རུ་ཟིལ།", "name:br"=>"Brazil", "name:bs"=>"Brazil", "name:ca"=>"Brasil", "name:ce"=>"Брази́ли", "name:ch"=>"Brazil", "name:co"=>"Brasile", "name:cs"=>"Brazílie", "name:cu"=>"Браꙁїлі́ꙗ", "name:cv"=>"Бразили", "name:cy"=>"Brasil", "name:da"=>"Brasilien", "name:de"=>"Brasilien", "name:dv"=>"ބުރެޒިލް", "name:dz"=>"བཱརཱ་ཛིལ་", "name:ee"=>"Brazil", "name:el"=>"Βραζιλία", "name:en"=>"Brazil", "name:eo"=>"Brazilo", "name:es"=>"Brasil", "name:et"=>"Brasiilia", "name:eu"=>"Brasil", "name:fa"=>"برزیل", "name:ff"=>"Barazil", "name:fi"=>"Brasilia", "name:fj"=>"Brazil", "name:fo"=>"Brasilia", "name:fr"=>"Brésil", "name:fy"=>"Brazylje", "name:ga"=>"an Bhrasaíl", "name:gd"=>"Braisil", "name:gl"=>"Brasil", "name:gn"=>"Pindoráma", "name:gu"=>"બ્રાઝિલ", "name:gv"=>"yn Vrasseel", "name:ha"=>"Brazil", "name:he"=>"ברזיל", "name:hi"=>"ब्रास़ील", "name:hr"=>"Brazil", "name:ht"=>"Brezil", "name:hu"=>"Brazília", "name:hy"=>"Բրազիլիա", "name:ia"=>"Brasil", "name:id"=>"Brasil", "name:ie"=>"Brasil", "name:ig"=>"Brazil", "name:io"=>"Brazilia", "name:is"=>"Brasilía", "name:it"=>"Brasile", "name:ja"=>"ブラジル", "name:jv"=>"Brasil", "name:ka"=>"ბრაზილია", "name:kg"=>"Brazilia", "name:ki"=>"Brazil", "name:kk"=>"Бразилия", "name:kl"=>"Brazil", "name:km"=>"ប្រេស៊ីល", "name:kn"=>"ಬ್ರೆಜಿಲ್", "name:ko"=>"브라질", "name:ks"=>"برٛازِل", "name:ku"=>"Brazîl", "name:kv"=>"Бразилия", "name:kw"=>"Brasil", "name:ky"=>"Бразилия", "name:la"=>"Brasilia", "name:lb"=>"Brasilien", "name:lg"=>"Buraziiri", "name:li"=>"Braziel", "name:ln"=>"Brazil", "name:lo"=>"ບະເຣຊິນ", "name:lt"=>"Brazilija", "name:lv"=>"Brazīlija", "name:mg"=>"Brazila", "name:mi"=>"Parīhi", "name:mk"=>"Бразил", "name:ml"=>"ബ്രസീൽ", "name:mn"=>"Бразил", "name:mr"=>"ब्राझील", "name:ms"=>"Brazil", "name:mt"=>"Brażil", "name:my"=>"ဘရာဇီးနိုင်ငံ", "name:na"=>"Bradir", "name:ne"=>"ब्राजिल", "name:nl"=>"Brazilië", "name:nn"=>"Brasil", "name:no"=>"Brasil", "name:nv"=>"Bwazííl", "name:oc"=>"Brasil", "name:om"=>"Biraazil", "name:or"=>"ବ୍ରାଜିଲ", "name:os"=>"Бразили", "name:pa"=>"ਬ੍ਰਾਜ਼ੀਲ", "name:pi"=>"ब्रासील", "name:pl"=>"Brazylia", "name:ps"=>"برازیل", "name:pt"=>"Brasil", "name:qu"=>"Prasil", "name:rm"=>"Brasilia", "name:rn"=>"Brazil", "name:ro"=>"Brazilia", "name:ru"=>"Бразилия", "name:rw"=>"Burezile", "name:sa"=>"ब्रासील", "name:sc"=>"Brasile", "name:sd"=>"برازيل", "name:se"=>"Brasilia", "name:sh"=>"Brazil", "name:si"=>"බ්රසීලය", "name:sk"=>"Brazília", "name:sl"=>"Brazilija", "name:sm"=>"Pasila", "name:sn"=>"Brazil", "name:so"=>"Barasiil", "name:sq"=>"Brazili", "name:sr"=>"Бразил", "name:st"=>"Brazil", "name:su"=>"Brasil", "name:sv"=>"Brasilien", "name:sw"=>"Brazil", "name:ta"=>"பிரேசில்", "name:te"=>"బ్రెజిల్", "name:tg"=>"Бразилия", "name:th"=>"บราซิล", "name:ti"=>"ብራዚል", "name:tk"=>"Braziliýa", "name:tl"=>"Brasil", "name:to"=>"Palāsili", "name:tr"=>"Brezilya", "name:tt"=>"Брази́лия", "name:tw"=>"Brazil", "name:ty"=>"Parīihi", "name:ug"=>"برازىلىيە", "name:uk"=>"Брази́лія", "name:ur"=>"برازیل", "name:uz"=>"Braziliya", "name:ve"=>"Brazil", "name:vi"=>"Brasil", "name:vo"=>"Brasilän", "name:wa"=>"Braezi", "name:wo"=>"Breesil", "name:xh"=>"Brasil", "name:yi"=>"בראַזיל", "name:yo"=>"Brasil", "name:za"=>"Bahsih", "name:zh"=>"巴西", "name:zu"=>"IBrazili"
-co     "name"=>"Colombia", "name:af"=>"Colombia", "name:am"=>"ኮሎምቢያ", "name:an"=>"Colombia", "name:ar"=>"كولومبيا", "name:ay"=>"Kuluwya", "name:az"=>"Kolumbiya", "name:ba"=>"Колумбия", "name:be"=>"Калумбія", "name:bg"=>"Колумбия", "name:bi"=>"Colombia", "name:bn"=>"কলম্বিয়া", "name:bo"=>"ཁོ་ལོམ་བི་ཡ།", "name:br"=>"Kolombia", "name:bs"=>"Kolumbija", "name:ca"=>"Colòmbia", "name:ce"=>"Колумби", "name:co"=>"Colombia", "name:cs"=>"Kolumbie", "name:cv"=>"Колумби", "name:cy"=>"Colombia", "name:da"=>"Colombia", "name:de"=>"Kolumbien", "name:dv"=>"ކޮލަންބިއާ", "name:dz"=>"ཀོ་ལོམ་བི་ཡ", "name:ee"=>"Colombia", "name:el"=>"Κολομβία", "name:en"=>"Colombia", "name:eo"=>"Kolombio", "name:es"=>"Colombia", "name:et"=>"Colombia", "name:eu"=>"Kolonbia", "name:fa"=>"کلمبیا", "name:fi"=>"Kolumbia", "name:fo"=>"Kolumbia", "name:fr"=>"Colombie", "name:fy"=>"Kolombia", "name:ga"=>"An Cholóim", "name:gd"=>"Coloimbia", "name:gl"=>"Colombia", "name:gn"=>"Kolómbia", "name:gu"=>"કોલમ્બિયા", "name:gv"=>"Yn Cholombey", "name:he"=>"קולומביה", "name:hi"=>"कोलम्बिया", "name:hr"=>"Kolumbija", "name:ht"=>"Kolonbi", "name:hu"=>"Kolumbia", "name:hy"=>"Կոլումբիա", "name:ia"=>"Colombia", "name:id"=>"Kolombia", "name:ie"=>"Columbia", "name:io"=>"Kolumbia", "name:is"=>"Kólumbía", "name:it"=>"Colombia", "name:ja"=>"コロンビア", "name:jv"=>"Kolombia", "name:ka"=>"კოლუმბია", "name:kk"=>"Колумбия Республикасы", "name:kl"=>"Colombia", "name:km"=>"កូឡុំប៊ី", "name:kn"=>"ಕೊಲೊಂಬಿಯ", "name:ko"=>"콜롬비아", "name:ku"=>"Kolombiya", "name:kw"=>"Kolombi", "name:la"=>"Columbia", "name:lb"=>"Kolumbien", "name:li"=>"Colombia", "name:ln"=>"Kolombi", "name:lt"=>"Kolumbija", "name:lv"=>"Kolumbija", "name:mg"=>"Kolombia", "name:mi"=>"Koromōpia", "name:mk"=>"Колумбија", "name:ml"=>"കൊളംബിയ", "name:mn"=>"Колумб", "name:mr"=>"कोलंबिया", "name:ms"=>"Colombia", "name:mt"=>"Kolombja", "name:my"=>"ကိုလံဘီယာနိုင်ငံ", "name:na"=>"Korombiya", "name:ne"=>"कोलम्बिया", "name:nl"=>"Colombia", "name:nn"=>"Colombia", "name:no"=>"Colombia", "name:nv"=>"Kolámbiya", "name:oc"=>"Colómbia", "name:om"=>"Colombia", "name:or"=>"କଲୋମ୍ବିଆ", "name:os"=>"Колумби", "name:pa"=>"ਕੋਲੰਬੀਆ", "name:pl"=>"Kolumbia", "name:pt"=>"Colômbia", "name:qu"=>"Kulumbya", "name:rm"=>"Columbia", "name:ro"=>"Columbia", "name:ru"=>"Колумбия", "name:rw"=>"Kolombiya", "name:sa"=>"कोलोम्बिया", "name:se"=>"Colombia", "name:sh"=>"Kolumbija", "name:sk"=>"Kolumbia", "name:sl"=>"Kolumbija", "name:so"=>"Kolombiya", "name:sq"=>"Kolumbia", "name:sr"=>"Колумбија", "name:su"=>"Kolombia", "name:sv"=>"Colombia", "name:sw"=>"Kolombia", "name:ta"=>"கொலொம்பியா", "name:te"=>"కొలంబియా", "name:tg"=>"Кулумбия", "name:th"=>"ประเทศโคลอมเบีย", "name:tl"=>"Colombia", "name:tr"=>"Kolombiya", "name:ts"=>"Colombia", "name:tt"=>"Колумбия", "name:ug"=>"كولومبىيە", "name:uk"=>"Колумбія", "name:ur"=>"کولمبیا", "name:uz"=>"Kolumbiya", "name:vi"=>"Colombia", "name:vo"=>"Kolumbän", "name:wo"=>"Koloombi", "name:xh"=>"IsiColombia", "name:yi"=>"קאלאמביע", "name:yo"=>"Kòlómbìà", "name:zh"=>"哥伦比亚", "name:zu"=>"IKolombiya"
-om     "name"=>"عمان", "name:af"=>"Oman", "name:am"=>"ኦማን", "name:an"=>"Omán", "name:ar"=>"عمان", "name:az"=>"Oman", "name:ba"=>"Оман", "name:be"=>"Аман", "name:bg"=>"Оман", "name:bn"=>"ওমান", "name:bo"=>"ཨོ་མན།", "name:br"=>"Oman", "name:bs"=>"Oman", "name:ca"=>"Oman", "name:ce"=>"Оман", "name:cs"=>"Omán", "name:cv"=>"Оман", "name:cy"=>"Oman", "name:da"=>"Oman", "name:de"=>"Oman", "name:dv"=>"ޢުމާން", "name:el"=>"Ομάν", "name:en"=>"Oman", "name:eo"=>"Omano", "name:es"=>"Omán", "name:et"=>"Omaan", "name:eu"=>"Oman", "name:fa"=>"عمان", "name:fi"=>"Oman", "name:fr"=>"Oman", "name:fy"=>"Oman", "name:ga"=>"Óman", "name:gd"=>"Omàn", "name:gl"=>"Omán", "name:gn"=>"Omã", "name:gu"=>"ઓમાન", "name:gv"=>"Yn Omaan", "name:he"=>"עומאן", "name:hi"=>"ओमान", "name:hr"=>"Oman", "name:ht"=>"Omàn", "name:hu"=>"Omán", "name:hy"=>"Օման", "name:ia"=>"Oman", "name:id"=>"Oman", "name:ie"=>"Oman", "name:io"=>"Oman", "name:is"=>"Óman", "name:it"=>"Oman", "name:ja"=>"オマーン", "name:jv"=>"Oman", "name:ka"=>"ომანი", "name:kk"=>"Оман", "name:kl"=>"Oman", "name:kn"=>"ಒಮಾನ್", "name:ko"=>"오만", "name:ku"=>"Oman", "name:kv"=>"Оман", "name:kw"=>"Oman", "name:la"=>"Omania", "name:lb"=>"Oman", "name:li"=>"Omaan", "name:ln"=>"Oman", "name:lt"=>"Omanas", "name:lv"=>"Omāna", "name:mi"=>"Omāna", "name:mk"=>"Оман", "name:ml"=>"ഒമാൻ", "name:mn"=>"Оман", "name:mr"=>"ओमान", "name:ms"=>"Oman", "name:my"=>"အိုမန်နိုင်ငံ", "name:na"=>"Oman", "name:nl"=>"Oman", "name:nn"=>"Oman", "name:no"=>"Oman", "name:nv"=>"Omą́ą́", "name:oc"=>"Oman", "name:or"=>"ଓମାନ", "name:os"=>"Оман", "name:pa"=>"ਓਮਾਨ", "name:pl"=>"Oman", "name:ps"=>"عمان", "name:pt"=>"Omã", "name:qu"=>"Uman", "name:ro"=>"Oman", "name:ru"=>"Оман", "name:rw"=>"Omani", "name:sa"=>"ओमान", "name:se"=>"Oman", "name:sh"=>"Oman", "name:si"=>"ඕමානය", "name:sk"=>"Omán", "name:sl"=>"Oman", "name:so"=>"Cumaan", "name:sq"=>"Omani", "name:sr"=>"Оман", "name:ss"=>"IMani", "name:su"=>"Oman", "name:sv"=>"Oman", "name:sw"=>"Omani", "name:ta"=>"ஓமான்", "name:te"=>"ఒమన్", "name:tg"=>"Оман", "name:th"=>"ประเทศโอมาน", "name:tk"=>"Oman", "name:tl"=>"Oman", "name:tr"=>"Umman", "name:tt"=>"Оман", "name:ug"=>"ئومان", "name:uk"=>"Оман", "name:ur"=>"سلطنت عمان", "name:uz"=>"Oman", "name:vi"=>"Oman", "name:vo"=>"Lomän", "name:wo"=>"Omaan", "name:yi"=>"אמאן", "name:yo"=>"Oman", "name:zh"=>"阿曼"
-cm     "name"=>"Cameroun", "name:af"=>"Kameroen", "name:am"=>"ካሜሩን", "name:an"=>"Camerún", "name:ar"=>"الكاميرون", "name:az"=>"Kamerun", "name:ba"=>"Камерун", "name:be"=>"Камерун", "name:bg"=>"Камерун", "name:bm"=>"Kamerun", "name:bn"=>"ক্যামেরুন", "name:bo"=>"ཁམ་མུ་རོན།", "name:br"=>"Kameroun", "name:bs"=>"Kamerun", "name:ca"=>"Camerun", "name:cs"=>"Kamerun", "name:cv"=>"Камерун", "name:cy"=>"Camerŵn", "name:da"=>"Cameroun", "name:de"=>"Kamerun", "name:dv"=>"ކެމަރޫން", "name:ee"=>"Cameroon", "name:el"=>"Καμερούν", "name:en"=>"Cameroon", "name:eo"=>"Kameruno", "name:es"=>"Camerún", "name:et"=>"Kamerun", "name:eu"=>"Kamerun", "name:fa"=>"کامرون", "name:ff"=>"Kamerun", "name:fi"=>"Kamerun", "name:fo"=>"Kamerun", "name:fr"=>"Cameroun", "name:fy"=>"Kameroen", "name:ga"=>"Camarún", "name:gd"=>"Camarun", "name:gl"=>"Camerún", "name:gv"=>"Cameroon", "name:ha"=>"Kameru", "name:he"=>"קמרון", "name:hi"=>"कैमरुन", "name:hr"=>"Kamerun", "name:ht"=>"Kamewoun", "name:hu"=>"Kamerun", "name:hy"=>"Կամերուն", "name:ia"=>"Camerun", "name:id"=>"Kamerun", "name:ie"=>"Cameroon", "name:ig"=>"Kameroon", "name:io"=>"Kamerun", "name:is"=>"Kamerún", "name:it"=>"Camerun", "name:ja"=>"カメルーン", "name:jv"=>"Kamerun", "name:ka"=>"კამერუნი", "name:kg"=>"Kamerun", "name:ki"=>"Cameroon", "name:kk"=>"Камерун", "name:kn"=>"ಕ್ಯಾಮರೂನ್", "name:ko"=>"카메룬", "name:ks"=>"کیٚمِروٗن", "name:ku"=>"Kamerûn", "name:kw"=>"Kameroun", "name:la"=>"Cameronia", "name:lb"=>"Kamerun", "name:li"=>"Kameroen", "name:ln"=>"Kamerun", "name:lt"=>"Kamerūnas", "name:lv"=>"Kamerūna", "name:mi"=>"Kamarūna", "name:mk"=>"Камерун", "name:ml"=>"കാമറൂൺ", "name:mn"=>"Камерун", "name:mr"=>"कामेरून", "name:ms"=>"Cameroon", "name:mt"=>"Kamerun", "name:my"=>"ကင်မရွန်းနိုင်ငံ", "name:na"=>"Kamerun", "name:ne"=>"क्यामेरून", "name:nl"=>"Kameroen", "name:nn"=>"Kamerun", "name:no"=>"Kamerun", "name:nv"=>"Táłtłʼááh Chʼosh Daadánígíí Bitooh", "name:oc"=>"Cameron", "name:or"=>"କାମେରୁନ", "name:os"=>"Камерун", "name:pa"=>"ਕੈਮਰੂਨ", "name:pl"=>"Kamerun", "name:ps"=>"کامرون", "name:pt"=>"Camarões", "name:qu"=>"Kamirun", "name:rm"=>"Camerun", "name:ro"=>"Camerun", "name:ru"=>"Камерун", "name:rw"=>"Kameruni", "name:sa"=>"केमेरून", "name:sc"=>"Camerùn", "name:se"=>"Kamerun", "name:sg"=>"Kamerün", "name:sh"=>"Kamerun", "name:sk"=>"Kamerun", "name:sl"=>"Kamerun", "name:sn"=>"Cameroon", "name:so"=>"Kamiruun", "name:sq"=>"Kameruni", "name:sr"=>"Камерун", "name:ss"=>"IKhameruni", "name:su"=>"Kamerun", "name:sv"=>"Kamerun", "name:sw"=>"Kamerun", "name:ta"=>"கமரூன்", "name:te"=>"కామెరూన్", "name:tg"=>"Камерун", "name:th"=>"ประเทศแคเมอรูน", "name:tk"=>"Kamerun", "name:tl"=>"Kamerun", "name:tr"=>"Kamerun", "name:ts"=>"Cameroon", "name:tt"=>"Камерун", "name:ug"=>"كامېرۇن", "name:uk"=>"Камерун", "name:ur"=>"کیمرون", "name:uz"=>"Kamerun", "name:vi"=>"Cameroon", "name:vo"=>"Kamerunän", "name:wo"=>"Kamerun", "name:yi"=>"קאמערון", "name:yo"=>"Kamẹrúùn", "name:zh"=>"喀麦隆", "name:zu"=>"IKamerooni"
-er     "name"=>"ኤርትራ Eritrea إرتريا", "name:af"=>"Eritrea", "name:am"=>"ኤርትራ", "name:an"=>"Eritrea", "name:ar"=>"إرتريا", "name:az"=>"Eritreya", "name:ba"=>"Эритрея", "name:be"=>"Эрытрэя", "name:bg"=>"Еритрея", "name:bm"=>"Eritrea", "name:bn"=>"ইরিত্রিয়া", "name:bo"=>"ཨི་རི་ཏྲའ།", "name:br"=>"Eritrea", "name:bs"=>"Eritreja", "name:ca"=>"Eritrea", "name:ce"=>"Эритре", "name:cs"=>"Eritrea", "name:cu"=>"Єрѷѳрїꙗ", "name:cy"=>"Eritrea", "name:da"=>"Eritrea", "name:de"=>"Eritrea", "name:dv"=>"އެރިތުރިއާ", "name:ee"=>"Eritrea", "name:el"=>"Ερυθραία", "name:en"=>"Eritrea", "name:eo"=>"Eritreo", "name:es"=>"Eritrea", "name:et"=>"Eritrea", "name:eu"=>"Eritrea", "name:fa"=>"اریتره", "name:fi"=>"Eritrea", "name:fo"=>"Eritrea", "name:fr"=>"Érythrée", "name:fy"=>"Eritreä", "name:ga"=>"An Eiritré", "name:gd"=>"Eartra", "name:gl"=>"Eritrea", "name:gn"=>"Erityrea", "name:gv"=>"Eritrea", "name:he"=>"אריתריאה", "name:hi"=>"इरित्रिया", "name:hr"=>"Eritreja", "name:ht"=>"Eritre", "name:hu"=>"Eritrea", "name:hy"=>"Էրիթրեա", "name:ia"=>"Eritrea", "name:id"=>"Eritrea", "name:ie"=>"Eritréa", "name:io"=>"Eritrea", "name:is"=>"Erítrea", "name:it"=>"Eritrea", "name:ja"=>"エリトリア", "name:jv"=>"Eritrea", "name:ka"=>"ერიტრეა", "name:kg"=>"Eritrea", "name:kk"=>"Эритрея", "name:kn"=>"ಎರಿಟ್ರಿಯ", "name:ko"=>"에리트레아", "name:ku"=>"Erîtrea", "name:kw"=>"Eritrea", "name:ky"=>"Эритрея", "name:la"=>"Erythraea", "name:lb"=>"Eritrea", "name:li"=>"Eritrea", "name:ln"=>"Elitré", "name:lt"=>"Eritrėja", "name:lv"=>"Eritreja", "name:mi"=>"Eritēria", "name:mk"=>"Еритреја", "name:ml"=>"എരിട്രിയ", "name:mn"=>"Эритрей", "name:mr"=>"इरिट्रिया", "name:ms"=>"Eritrea", "name:mt"=>"Eritrea", "name:my"=>"အီရီထရီးယားနိုင်ငံ", "name:na"=>"Eritrea", "name:ne"=>"एरिट्रिया", "name:nl"=>"Eritrea", "name:nn"=>"Eritrea", "name:no"=>"Eritrea", "name:oc"=>"Eritrèa", "name:om"=>"Eritrea", "name:or"=>"ଇରିଟ୍ରିଆ", "name:os"=>"Эритрей", "name:pa"=>"ਇਰੀਤਰੀਆ", "name:pl"=>"Erytrea", "name:ps"=>"اریتره", "name:pt"=>"Eritreia", "name:qu"=>"Iritriya", "name:ro"=>"Eritreea", "name:ru"=>"Эритрея", "name:rw"=>"Eritereya", "name:sa"=>"इरीट्रिया", "name:sc"=>"Eritrea", "name:se"=>"Eritrea", "name:sg"=>"Eritrëe", "name:sh"=>"Eritreja", "name:sk"=>"Eritrea", "name:sl"=>"Eritreja", "name:sn"=>"Eritrea", "name:so"=>"Eratareya", "name:sq"=>"Eritrea", "name:sr"=>"Еритреја", "name:ss"=>"IRitheya", "name:st"=>"Eritrea", "name:su"=>"Éritréa", "name:sv"=>"Eritrea", "name:sw"=>"Eritrea", "name:ta"=>"எரித்திரியா", "name:te"=>"ఎరిత్రియా", "name:tg"=>"Эритрея", "name:th"=>"ประเทศเอริเทรีย", "name:ti"=>"ኤርትራ", "name:tk"=>"Eritreýa", "name:tl"=>"Eritrea", "name:tr"=>"Eritre", "name:ts"=>"Eritreya", "name:tt"=>"Эритрея", "name:ug"=>"ئېرىترېيە", "name:uk"=>"Еритрея", "name:ur"=>"اریتریا", "name:uz"=>"Eritriya", "name:vi"=>"Eritrea", "name:vo"=>"Lerüträn", "name:wo"=>"Eritere", "name:yi"=>"עריטרעא", "name:yo"=>"Ẹritrẹ́à", "name:zh"=>"厄立特里亚", "name:zu"=>"I-Eritrea"
-ro     "name"=>"România", "name:af"=>"Roemenië", "name:am"=>"ሮማንያ", "name:an"=>"Rumanía", "name:ar"=>"رومانيا", "name:ay"=>"Rumanya", "name:az"=>"Rumıniya", "name:ba"=>"Румыния", "name:be"=>"Румынія", "name:bg"=>"Румъния", "name:bi"=>"Romania", "name:bn"=>"রোমানিয়া", "name:bo"=>"རོ་མ་ནི་ཡ།", "name:br"=>"Roumania", "name:bs"=>"Rumunija", "name:ca"=>"Romania", "name:ce"=>"Румыни", "name:co"=>"Romania", "name:cs"=>"Rumunsko", "name:cu"=>"Роумꙑнїꙗ", "name:cv"=>"Румыни", "name:cy"=>"Rwmania", "name:da"=>"Rumænien", "name:de"=>"Rumänien", "name:dv"=>"ރުމޭނިއާ", "name:ee"=>"Romania", "name:el"=>"Ρουμανία", "name:en"=>"Romania", "name:eo"=>"Rumanio", "name:es"=>"Rumanía", "name:et"=>"Rumeenia", "name:eu"=>"Errumania", "name:fa"=>"رومانی", "name:fi"=>"Romania", "name:fo"=>"Rumenia", "name:fr"=>"Roumanie", "name:fy"=>"Roemeenje", "name:ga"=>"An Rómáin", "name:gd"=>"Romàinia", "name:gl"=>"Romanía", "name:gn"=>"Rrumaña", "name:gu"=>"રોમાનિયા", "name:gv"=>"Yn Romaan", "name:he"=>"רומניה", "name:hi"=>"रोमानिया", "name:hr"=>"Rumunjska", "name:ht"=>"Woumani", "name:hu"=>"Románia", "name:hy"=>"Ռումինիա", "name:ia"=>"Romania", "name:id"=>"Rumania", "name:ie"=>"Rumania", "name:io"=>"Rumania", "name:is"=>"Rúmenía", "name:it"=>"Romania", "name:ja"=>"ルーマニア", "name:jv"=>"Rumania", "name:ka"=>"რუმინეთი", "name:kg"=>"Romania", "name:kk"=>"Румыния", "name:kl"=>"Rumænia", "name:kn"=>"ರೊಮಾನಿಯ", "name:ko"=>"루마니아", "name:ku"=>"Romanya", "name:kv"=>"Румыния", "name:kw"=>"Roumani", "name:ky"=>"Румыния", "name:la"=>"Romania", "name:lb"=>"Rumänien", "name:li"=>"Roemenië", "name:ln"=>"Rumania", "name:lt"=>"Rumunija", "name:lv"=>"Rumānija", "name:mi"=>"Romeinia", "name:mk"=>"Романија", "name:ml"=>"റൊമാനിയ", "name:mn"=>"Румын", "name:mr"=>"रोमेनिया", "name:ms"=>"Romania", "name:mt"=>"Rumanija", "name:my"=>"ရိုမေးနီးယားနိုင်ငံ", "name:na"=>"Romania", "name:ne"=>"रोमानिया", "name:nl"=>"Roemenië", "name:nn"=>"Romania", "name:no"=>"Romania", "name:nv"=>"Wooméiniya", "name:oc"=>"Romania", "name:or"=>"ରୋମାନିଆ", "name:os"=>"Румыни", "name:pa"=>"ਰੋਮਾਨੀਆ", "name:pl"=>"Rumunia", "name:ps"=>"رومانیا", "name:pt"=>"Roménia", "name:qu"=>"Rumanya", "name:rm"=>"Rumenia", "name:ro"=>"România", "name:ru"=>"Румыния", "name:rw"=>"Romaniya", "name:sc"=>"Romania", "name:se"=>"Romania", "name:sh"=>"Rumunija", "name:si"=>"රුමේනියාව", "name:sk"=>"Rumunsko", "name:sl"=>"Romunija", "name:sm"=>"Romania", "name:so"=>"Romania", "name:sq"=>"Rumania", "name:sr"=>"Румунија", "name:ss"=>"IRomaniya", "name:su"=>"Romania", "name:sv"=>"Rumänien", "name:sw"=>"Romania", "name:ta"=>"உருமேனியா", "name:te"=>"రొమేనియా", "name:tg"=>"Руминия", "name:th"=>"ประเทศโรมาเนีย", "name:tk"=>"Rumyniýa", "name:tl"=>"Rumanya", "name:tr"=>"Romanya", "name:tt"=>"Румыния", "name:ug"=>"Ruminiye", "name:uk"=>"Румунія", "name:ur"=>"رومانیہ", "name:uz"=>"Ruminiya", "name:vi"=>"Romania", "name:vo"=>"Rumän", "name:wa"=>"Roumaneye", "name:wo"=>"Romaani", "name:yi"=>"רומעניע", "name:yo"=>"Románíà", "name:zh"=>"羅馬尼亞"
-mk     "name"=>"Северна Македонија", "name:af"=>"Masedonië", "name:ak"=>"Masedonia", "name:am"=>"ማሴዶንያ", "name:an"=>"Republica de Macedonia", "name:ar"=>"شمال مقدونيا", "name:az"=>"Masedoniya", "name:ba"=>"Македония Республикаһы", "name:be"=>"Македонія", "name:bg"=>"Северна Македония", "name:bi"=>"Macedonia", "name:bm"=>"Macedɔni", "name:bn"=>"মেসিডোনিয়া[FYROM]", "name:bo"=>"མ་སེ་ཌོ་ནིཡ། (རྒྱལ་ཁབ།)", "name:br"=>"Makedonia", "name:bs"=>"Sjeverna Makedonija", "name:ca"=>"Macedònia del Nord", "name:ce"=>"Македони", "name:cs"=>"Severní Makedonie", "name:cu"=>"Макєдонїꙗ", "name:cv"=>"Македони Республики", "name:cy"=>"Gogledd Macedonia", "name:da"=>"Nordmakedonien", "name:de"=>"Nordmazedonien", "name:dv"=>"މެސެޑޯނިއާ", "name:dz"=>"མ་སེ་ཌོ་ནི་ཡ་ [ཡུ་གོ་སླཱ་བི་ཡ]", "name:ee"=>"Makedonia", "name:el"=>"Βόρεια Μακεδονία", "name:en"=>"North Macedonia", "name:eo"=>"Nord-Makedonio", "name:es"=>"Macedonia del Norte", "name:et"=>"Põhja-Makedoonia", "name:eu"=>"Ipar Mazedonia", "name:fa"=>"مقدونیه شمالی", "name:ff"=>"Meceduwaan", "name:fi"=>"Makedonia", "name:fo"=>"Makedónia", "name:fr"=>"Macédoine du Nord", "name:fy"=>"Noard-Masedoanje", "name:ga"=>"An Mhacadóin", "name:gd"=>"Masadoinia a Tuath", "name:gl"=>"Macedonia do Norte", "name:gn"=>"Masendoña", "name:gu"=>"મેસેડોનિયા", "name:gv"=>"Massadoan Hwoaie", "name:ha"=>"Masedoniya", "name:he"=>"מקדוניה הצפונית", "name:hi"=>"उत्तर मेसीडोनिया", "name:hr"=>"Sjeverna Makedonija", "name:ht"=>"Repiblik d Masedoni", "name:hu"=>"Észak-Macedónia", "name:hy"=>"Մակեդոնիայի Հանրապետություն", "name:ia"=>"Macedonia", "name:id"=>"Republik Makedonia", "name:ie"=>"Macedonia", "name:io"=>"Republiko Macedonia", "name:is"=>"Makedónía", "name:it"=>"Macedonia del Nord", "name:ja"=>"北マケドニア", "name:jv"=>"Républik Makedonia", "name:ka"=>"მაკედონია", "name:kg"=>"Makedonia", "name:ki"=>"Masedonia", "name:kk"=>"Македония Республикасы", "name:kl"=>"Makedonia", "name:km"=>"ម៉ាសេដ្វាន", "name:kn"=>"ಮ್ಯಾಸಿಡೋನಿಯ", "name:ko"=>"북마케도니아", "name:ks"=>"مٮ۪سوڑونِیا", "name:ku"=>"Komara Makedonyayê", "name:kv"=>"Македония Республика", "name:kw"=>"Repoblek Makedoni", "name:la"=>"Macedonia Septentrionalis", "name:lb"=>"Nordmazedonien", "name:lg"=>"Masedoniya", "name:li"=>"Noord-Macedonië", "name:ln"=>"Masedoni", "name:lo"=>"ມາຊີໂດເນຍ", "name:lt"=>"Šiaurės Makedonija", "name:lv"=>"Ziemeļmaķedonija", "name:mg"=>"Makedonia", "name:mi"=>"Makerōnia", "name:mk"=>"Северна Македонија", "name:ml"=>"റിപ്പബ്ലിക് ഓഫ് മാസിഡോണിയ", "name:mn"=>"Бүгд Найрамдах Македон Улс", "name:mr"=>"मॅसिडोनिया", "name:ms"=>"Republik Macedonia", "name:mt"=>"Repubblika tal-Maċedonja", "name:my"=>"မက်စီဒိုးနီးယားနိုင်ငံ", "name:na"=>"Matedoniya", "name:ne"=>"म्यासेडोनिया", "name:nl"=>"Noord-Macedonië", "name:nn"=>"Nord-Makedonia", "name:no"=>"Nord-Makedonia", "name:oc"=>"Republica de Macedònia", "name:or"=>"ମାସିଡୋନିଆ", "name:os"=>"Республикæ Македони", "name:pa"=>"ਮਕਦੂਨੀਆ ਗਣਰਾਜ", "name:pl"=>"Macedonia Północna", "name:ps"=>"د مقدونيې ولسمشريزه", "name:pt"=>"Macedónia do Norte", "name:qu"=>"Makidunya", "name:rm"=>"Macedonia", "name:rn"=>"Masedoniya", "name:ro"=>"Macedonia de Nord", "name:ru"=>"Северная Македония", "name:rw"=>"Masedoniya", "name:sa"=>"मेसेडोनिया", "name:sc"=>"Matzedònia", "name:se"=>"Davvi-Makedonia", "name:sg"=>"Maseduäni", "name:sh"=>"Severna Makedonija", "name:si"=>"මැසිඩෝනියාන [FYROM]", "name:sk"=>"Severné Macedónsko", "name:sl"=>"Makedonija", "name:sn"=>"Macedonia", "name:so"=>"Makedonia", "name:sq"=>"Maqedonia e Veriut", "name:sr"=>"Северна Македонија", "name:ss"=>"IMakhedoniya", "name:su"=>"Makédonia", "name:sv"=>"Nordmakedonien", "name:sw"=>"Jamhuri ya Masedonia", "name:ta"=>"மாக்கடோனியக் குடியரசு", "name:te"=>"మేసిడోనియా", "name:tg"=>"Ҷумҳурии Мақдуния", "name:th"=>"ประเทศมาซิโดเนีย", "name:ti"=>"ማከዶኒያ", "name:tk"=>"Makedoniýa Respublikasy", "name:tl"=>"Republika ng Masedonya", "name:to"=>"Masitōnia [FYROM]", "name:tr"=>"Kuzey Makedonya", "name:tt"=>"Македония Җөмһүрияте", "name:ug"=>"ماكېدونىيە", "name:uk"=>"Північна Македонія", "name:ur"=>"شمالی مقدونیہ", "name:uz"=>"Makedoniya Respublikasi", "name:vi"=>"Bắc Macedonia", "name:vo"=>"Nolüda-Makedoniyän", "name:wo"=>"Réewum Maseduwaan", "name:yi"=>"רעפובליק פון מאקעדאניע", "name:yo"=>"Orílẹ̀-èdè Olómìnira ilẹ̀ Makẹdóníà", "name:zh"=>"北马其顿共和国", "name:zu"=>"isi-Macedonia [FYROM]"
-fk     "name"=>"Falkland Islands", "name:af"=>"Falklandeilande", "name:ak"=>"Fɔlkman Aeland", "name:am"=>"ፎክላንድ ደሴቶች (ኢስላስ ማልቪናስ)", "name:ar"=>"جزر الفولكلاند", "name:az"=>"Folkland Adaları", "name:be"=>"Фалклендскія астравы", "name:bg"=>"Фолкландски острови (Малвини)", "name:bm"=>"Maluwini Gun", "name:bn"=>"ফকল্যান্ড আইল্যান্ড (ইসল্যাস মাসভেনিস)", "name:bo"=>"ཕལྐ་ལནྜ་གླིང་ཕྲན།", "name:br"=>"Inizi Falkland (Inizi Maloù)", "name:bs"=>"Folklandska ostrva (Malvinska ostrva)", "name:ca"=>"Illes Malvines", "name:cs"=>"Falklandy", "name:cy"=>"Ynysoedd y Falklands", "name:da"=>"Falklandsøerne", "name:de"=>"Falklandinseln", "name:dz"=>"ཕལྐ་ལནྜ་གླིང་ཚོམ (ཨིས་ལཱས་མལ་བི་ཎཱས)", "name:ee"=>"Falkland ƒudomekpowo (Islas Malvinas) nutome", "name:el"=>"Νήσοι Φώκλαντ", "name:en"=>"Falkland Islands", "name:eo"=>"Falklandoj", "name:es"=>"Islas Malvinas", "name:et"=>"Falklandi saared", "name:eu"=>"Falkland uharteak (Malvina uharteak)", "name:fa"=>"جزایر فالکلند", "name:ff"=>"Duuɗe Falkland", "name:fi"=>"Falklandinsaaret", "name:fo"=>"Falklandsoyggjarnar", "name:fr"=>"Îles Malouines (Îles Falkland)", "name:fy"=>"Falklâneilannen", "name:ga"=>"Oileáin Fháclainne", "name:gd"=>"Na h-Eileanan Fàclainn", "name:gl"=>"Illas Malvinas", "name:gu"=>"ફૉકલેન્ડ આઇલેન્ડ્સ", "name:gv"=>"Ny Malveenaghyn", "name:ha"=>"Tsibiran Falkilan", "name:he"=>"איי פוקלנד (מלווינס)", "name:hi"=>"फ़ॉकलैंड आइलैंड (इज्लास माल्विनास)", "name:hr"=>"Falklandski Otoci", "name:hu"=>"Falkland-szigetek", "name:id"=>"Kepulauan Falkland", "name:is"=>"Falklandseyjar", "name:it"=>"Isole Falkland", "name:ja"=>"フォークランド諸島 (マルビナス諸島)", "name:ka"=>"ფალკლენდის კუნძულები", "name:ki"=>"Visiwa vya Falkland", "name:kl"=>"Falklandi qeqertaq", "name:km"=>"កោះ​ហ្វក់ឡែន (Islas Malvinas)", "name:kn"=>"ಫಾಲ್ಕ್‌ಲ್ಯಾಂಡ್ ದ್ವೀಪಗಳು (ಇಸ್ಲಾಸ್ ಮಾಲ್ವಿನಸ್)", "name:ko"=>"포클랜드 제도 (말비나스 군도)", "name:ks"=>"فٕلاکلینٛڑ جٔزیٖرٕ", "name:ku"=>"Giravên Malvîn", "name:la"=>"Insulae Malvinae", "name:lb"=>"Falkland Inselen", "name:lg"=>"Bizinga by'eFalikalandi", "name:ln"=>"Bisanga bya Falkland", "name:lo"=>"ຫມູ່ເກາະຟອກແລນ (ອິສລາສ ມາວິລນາສ)", "name:lt"=>"Folklando (Malvinų) Salos", "name:lv"=>"Folklenda salas", "name:mg"=>"Nosy Falkand", "name:mk"=>"Фолкландски Острови", "name:ml"=>"ഫോക്ൿലൻഡ് ദ്വീപുകൾ (മൽവിനാസ്)", "name:mn"=>"Фолклендийн Арлууд", "name:mr"=>"फॉकलंड बेटे (इस्लास मालविनास)", "name:ms"=>"Kepulauan Falkland (Islas Malvinas)", "name:mt"=>"Falkland Islands", "name:my"=>"ဖောက်ကလန် ကျွန်းစု", "name:ne"=>"फक्ल्याण्ड टापुहरू (इज्लास माल्भिनास)", "name:nl"=>"Falklandeilanden", "name:nn"=>"Falklandsøyane", "name:no"=>"Falklandsøyene", "name:or"=>"ଫଲ୍କଲ୍ୟାଣ୍ଡ ଦ୍ବୀପପୁଞ୍ଜ", "name:pl"=>"Falklandy", "name:pt"=>"Ilhas Malvinas", "name:rm"=>"Inslas dal Falkland", "name:rn"=>"Izinga rya Filikilandi", "name:ro"=>"Insulele Falkland", "name:ru"=>"Фолклендские острова", "name:se"=>"Falklandsullot", "name:sg"=>"Âzûâ tî Mälüîni", "name:si"=>"ෆෝක්ලන්ත දූපත් (අයිලස් මල්වියනාස්)", "name:sk"=>"Falklandy", "name:sl"=>"Falklandi", "name:sn"=>"Zvitsuwa zveFalklands", "name:so"=>"Jaziiradaha Fooklaan", "name:sr"=>"Фокландска (Малвинска) Острва", "name:sv"=>"Falklandsöarna", "name:sw"=>"Visiwa vya Falklandi (Islas Malvinas)", "name:ta"=>"ஃபாக்லாந்து தீவுகள் (இஸ்லாஸ் மால்வினஸ்)", "name:te"=>"ఫాక్ లేండ్ దీవులు (ఇస్లాస్ మాల్వినాస్)", "name:th"=>"หมู่เกาะฟอล์กแลนด์", "name:ti"=>"የፎልክላንድ ደሴቶች", "name:tl"=>"Kapuluang Falkland (Kapuluang Malvinas)", "name:to"=>"ʻOtumotu Fokuleni", "name:tr"=>"Falkland Adaları", "name:tt"=>"Фолкленд утраулары", "name:uk"=>"Фолклендські острови", "name:ur"=>"فاکلینڈ آئلینڈز (ازلاس مالوینس)", "name:vi"=>"Quần đảo Falkland", "name:yo"=>"Orílẹ́ède Etikun Fakalandi", "name:zh"=>"福克兰群岛", "name:zu"=>"i-Falkland Islands (i-Islas Malvinas)"
-mw     "name"=>"Malawi", "name:af"=>"Malawi", "name:am"=>"ማላዊ", "name:an"=>"Malawi", "name:ar"=>"مالاوي", "name:az"=>"Malavi", "name:ba"=>"Малави", "name:be"=>"Малаві", "name:bg"=>"Малави", "name:bm"=>"Malawi", "name:bn"=>"মালাউই", "name:bo"=>"མ་ལ་ཝི།", "name:br"=>"Malawi", "name:bs"=>"Malavi", "name:ca"=>"Malawi", "name:ce"=>"Малави", "name:cs"=>"Malawi", "name:cv"=>"Малави", "name:cy"=>"Malawi", "name:da"=>"Malawi", "name:de"=>"Malawi", "name:dv"=>"މަލާވީ", "name:ee"=>"Malawi", "name:el"=>"Μαλάουι", "name:en"=>"Malawi", "name:eo"=>"Malavio", "name:es"=>"Malaui", "name:et"=>"Malawi", "name:eu"=>"Malawi", "name:fa"=>"مالاوی", "name:fi"=>"Malawi", "name:fo"=>"Malavi", "name:fr"=>"Malawi", "name:fy"=>"Malawy", "name:ga"=>"An Mhaláiv", "name:gd"=>"Malabhaidh", "name:gl"=>"Malaui - Malawi", "name:gv"=>"Malawi", "name:he"=>"מלאווי", "name:hi"=>"मलावी", "name:hr"=>"Malavi", "name:ht"=>"Malawi", "name:hu"=>"Malawi", "name:hy"=>"Մալավի", "name:ia"=>"Malawi", "name:id"=>"Malawi", "name:ie"=>"Malawi", "name:io"=>"Malawi", "name:is"=>"Malaví", "name:it"=>"Malawi", "name:ja"=>"マラウイ", "name:jv"=>"Malawi", "name:ka"=>"მალავი", "name:kg"=>"Malawi", "name:ki"=>"Malawi", "name:kk"=>"Малави", "name:kn"=>"ಮಲಾವಿ", "name:ko"=>"말라위", "name:ku"=>"Malavî", "name:kw"=>"Malawi", "name:la"=>"Malavium", "name:lb"=>"Malawi", "name:li"=>"Malawi", "name:ln"=>"Malawi", "name:lt"=>"Malavis", "name:lv"=>"Malāvija", "name:mg"=>"Malawi", "name:mi"=>"Marāwi", "name:mk"=>"Малави", "name:ml"=>"മലാവി", "name:mn"=>"Малави", "name:mr"=>"मलावी", "name:ms"=>"Malawi", "name:mt"=>"Malawi", "name:my"=>"မာလဝီနိုင်ငံ", "name:nl"=>"Malawi", "name:nn"=>"Malawi", "name:no"=>"Malawi", "name:nv"=>"Malááwii", "name:ny"=>"Malaŵi", "name:oc"=>"Malawi", "name:os"=>"Малави", "name:pa"=>"ਮਲਾਵੀ", "name:pl"=>"Malawi", "name:ps"=>"مالاوي", "name:pt"=>"Malawi", "name:qu"=>"Malawi", "name:ro"=>"Malawi", "name:ru"=>"Малави", "name:rw"=>"Malawi", "name:sa"=>"मलावी", "name:sc"=>"Malawi", "name:se"=>"Malawi", "name:sg"=>"Malawïi", "name:sh"=>"Malavi", "name:sk"=>"Malawi", "name:sl"=>"Malavi", "name:sn"=>"Malawi", "name:so"=>"Malaawi", "name:sq"=>"Malavi", "name:sr"=>"Малави", "name:ss"=>"IMalawi", "name:su"=>"Malawi", "name:sv"=>"Malawi", "name:sw"=>"Malawi", "name:ta"=>"மலாவி", "name:tg"=>"Малави", "name:th"=>"ประเทศมาลาวี", "name:ti"=>"ማላዊ", "name:tk"=>"Malawi", "name:tl"=>"Malawi", "name:tr"=>"Malavi", "name:ts"=>"Malawi", "name:ug"=>"مالاۋى", "name:uk"=>"Малаві", "name:ur"=>"ملاوی", "name:uz"=>"Malavi", "name:vi"=>"Malawi", "name:vo"=>"Malaviyän", "name:wo"=>"Malawi", "name:yi"=>"מאלאווי", "name:yo"=>"Màláwì", "name:zh"=>"马拉维", "name:zu"=>"IMalawi"
-uz     "name"=>"Oʻzbekiston", "name:af"=>"Oesbekistan", "name:am"=>"ኡዝቤኪስታን", "name:an"=>"Uzbekistán", "name:ar"=>"أوزبكستان", "name:az"=>"Özbəkistan", "name:ba"=>"Үзбәкстан", "name:be"=>"Узбекістан", "name:bg"=>"Узбекистан", "name:bn"=>"উজবেকিস্তান", "name:bo"=>"ཨུ་ཟ་བྷེ་ཁི་སི་ཐན།", "name:br"=>"Ouzbekistan", "name:bs"=>"Uzbekistan", "name:ca"=>"Uzbekistan", "name:ce"=>"Узбекистан", "name:cs"=>"Uzbekistán", "name:cv"=>"Ӳспекстан", "name:cy"=>"Uzbekistan", "name:da"=>"Usbekistan", "name:de"=>"Usbekistan", "name:dv"=>"އުޒްބެކިސްތާން", "name:dz"=>"ཨུཛ་བེ་ཀིསི་ཏཱན་", "name:ee"=>"Uzbekistan", "name:el"=>"Ουζμπεκιστάν", "name:en"=>"Uzbekistan", "name:eo"=>"Uzbekio", "name:es"=>"Uzbekistán", "name:et"=>"Usbekistan", "name:eu"=>"Uzbekistan", "name:fa"=>"ازبکستان", "name:fi"=>"Uzbekistan", "name:fo"=>"Usbekistan", "name:fr"=>"Ouzbékistan", "name:fy"=>"Oezbekistan", "name:ga"=>"An Úisbéiceastáin", "name:gd"=>"Usbagastàn", "name:gl"=>"Uzbequistán", "name:gu"=>"ઉઝબેકિસ્તાન", "name:gv"=>"Yn Oosbeckistaan", "name:he"=>"אוזבקיסטן", "name:hi"=>"उज़्बेकिस्तान", "name:hr"=>"Uzbekistan", "name:ht"=>"Ouzbekistan", "name:hu"=>"Üzbegisztán", "name:hy"=>"Ուզբեկստան", "name:ia"=>"Uzbekistan", "name:id"=>"Uzbekistan", "name:ie"=>"Uzbekistan", "name:io"=>"Uzbekistan", "name:is"=>"Úsbekistan", "name:it"=>"Uzbekistan", "name:ja"=>"ウズベキスタン", "name:jv"=>"Uzbekistan", "name:ka"=>"უზბეკეთი", "name:kk"=>"Өзбекстан", "name:kn"=>"ಉಜ್ಬೇಕಿಸ್ಥಾನ್", "name:ko"=>"우즈베키스탄", "name:ku"=>"Ûzbêkistan", "name:kv"=>"Узбекистан", "name:kw"=>"Pow Ousbek", "name:ky"=>"Өзбекстан", "name:la"=>"Uzbecia", "name:lb"=>"Usbekistan", "name:li"=>"Oesbekistan", "name:ln"=>"Uzbekistáni", "name:lt"=>"Uzbekija", "name:lv"=>"Uzbekistāna", "name:mk"=>"Узбекистан", "name:ml"=>"ഉസ്ബെക്കിസ്ഥാൻ", "name:mn"=>"Узбекистан", "name:mr"=>"उझबेकिस्तान", "name:ms"=>"Uzbekistan", "name:my"=>"ဥဇဘက်ကစ္စတန်နိုင်ငံ", "name:na"=>"Uzbekistan", "name:nl"=>"Oezbekistan", "name:nn"=>"Usbekistan", "name:no"=>"Usbekistan", "name:nv"=>"Ózbeʼ Bikéyah", "name:oc"=>"Ozbequistan", "name:or"=>"ଉଜବେକିସ୍ଥାନ", "name:os"=>"Узбекистан", "name:pa"=>"ਉਜ਼ਬੇਕਿਸਤਾਨ", "name:pl"=>"Uzbekistan", "name:ps"=>"اوزبکستان", "name:pt"=>"Uzbequistão", "name:qu"=>"Usbiksuyu", "name:ro"=>"Uzbekistan", "name:ru"=>"Узбекистан", "name:rw"=>"Uzubekisitani", "name:sa"=>"उजबेकिस्थान", "name:sd"=>"ازبڪستان", "name:se"=>"Uzbekistan", "name:sh"=>"Uzbekistan", "name:sk"=>"Uzbekistan", "name:sl"=>"Uzbekistan", "name:so"=>"Usbekistan", "name:sq"=>"Uzbekistani", "name:sr"=>"Узбекистан", "name:ss"=>"IZubekhi", "name:su"=>"Uzbékistan", "name:sv"=>"Uzbekistan", "name:sw"=>"Uzbekistan", "name:ta"=>"உசுபெக்கிசுத்தான்", "name:te"=>"ఉజ్బెకిస్తాన్", "name:tg"=>"Ӯзбакистон", "name:th"=>"ประเทศอุซเบกิสถาน", "name:tk"=>"Özbegistan", "name:tl"=>"Uzbekistan", "name:tr"=>"Özbekistan", "name:tt"=>"Үзбәкстан", "name:ug"=>"ئۆزبېكىستان", "name:uk"=>"Узбекистан", "name:ur"=>"ازبکستان", "name:uz"=>"Oʻzbekiston", "name:vi"=>"Uzbekistan", "name:vo"=>"Lusbekän", "name:wo"=>"Usbekistaan", "name:yi"=>"אוזבעקיסטאן", "name:yo"=>"Ùsbẹ̀kìstán", "name:zh"=>"乌兹别克斯坦"
-ly     "name"=>"ليبيا", "name:af"=>"Libië", "name:am"=>"ሊቢያ", "name:an"=>"Libia", "name:ar"=>"ليبيا", "name:az"=>"Liviya", "name:ba"=>"Ливия", "name:be"=>"Лівія", "name:bg"=>"Либия", "name:bm"=>"Libya", "name:bn"=>"লিবিয়া", "name:bo"=>"ལི་པི་ཡ།", "name:br"=>"Libia", "name:bs"=>"Libija", "name:ca"=>"Líbia", "name:ce"=>"Ливи", "name:cs"=>"Libye", "name:cv"=>"Ливи", "name:cy"=>"Libya", "name:da"=>"Libyen", "name:de"=>"Libyen", "name:dv"=>"ލީބިޔާ", "name:ee"=>"Libya", "name:el"=>"Λιβύη", "name:en"=>"Libya", "name:eo"=>"Libio", "name:es"=>"Libia", "name:et"=>"Liibüa", "name:eu"=>"Libia", "name:fa"=>"لیبی", "name:fi"=>"Libya", "name:fo"=>"Libya", "name:fr"=>"Libye", "name:fy"=>"Lybje", "name:ga"=>"An Libia", "name:gd"=>"Libia", "name:gl"=>"Libia", "name:gn"=>"Livia", "name:gv"=>"Yn Leeb", "name:ha"=>"Libya", "name:he"=>"לוב", "name:hi"=>"लीबिया", "name:hr"=>"Libija", "name:ht"=>"Libi", "name:hu"=>"Líbia", "name:hy"=>"Լիբիա", "name:ia"=>"Libya", "name:id"=>"Libya", "name:ie"=>"Libya", "name:io"=>"Libia", "name:is"=>"Líbýa", "name:it"=>"Libia", "name:ja"=>"リビア", "name:jv"=>"Libya", "name:ka"=>"ლიბია", "name:kg"=>"Libia", "name:kk"=>"Ливия", "name:kl"=>"Libya", "name:kn"=>"ಲಿಬಿಯಾ", "name:ko"=>"리비아", "name:ks"=>"لِبیا", "name:ku"=>"Lîbya", "name:kw"=>"Libi", "name:ky"=>"Ливия", "name:la"=>"Libya", "name:lb"=>"Libyen", "name:li"=>"Libië", "name:ln"=>"Libîya", "name:lt"=>"Libija", "name:lv"=>"Lībija", "name:mg"=>"Libia", "name:mi"=>"Rīpia", "name:mk"=>"Либија", "name:ml"=>"ലിബിയ", "name:mn"=>"Ливи", "name:mr"=>"लीबिया", "name:ms"=>"Libya", "name:mt"=>"Libja", "name:my"=>"လစ်ဗျားနိုင်ငံ", "name:ne"=>"लिबिया", "name:nl"=>"Libië", "name:nn"=>"Libya", "name:no"=>"Libya", "name:nv"=>"Łíbya", "name:oc"=>"Libia", "name:or"=>"ଲିବିଆ", "name:os"=>"Ливи", "name:pa"=>"ਲੀਬੀਆ", "name:pl"=>"Libia", "name:ps"=>"لېبيا", "name:pt"=>"Líbia", "name:qu"=>"Libya", "name:ro"=>"Libia", "name:ru"=>"Ливия", "name:rw"=>"Libiya", "name:sa"=>"लिबिया", "name:sc"=>"Lìbia", "name:se"=>"Libya", "name:sg"=>"Libïi", "name:sh"=>"Libija", "name:si"=>"ලිබියාව", "name:sk"=>"Líbya", "name:sl"=>"Libija", "name:sm"=>"Libya", "name:sn"=>"Libya", "name:so"=>"Libiya", "name:sq"=>"Libia", "name:sr"=>"Либија", "name:ss"=>"ILibhiya", "name:su"=>"Libya", "name:sv"=>"Libyen", "name:sw"=>"Libya", "name:ta"=>"லிபியா", "name:te"=>"లిబియా", "name:tg"=>"Либия", "name:th"=>"ประเทศลิเบีย", "name:ti"=>"ሊቢያ", "name:tk"=>"Liwiýa", "name:tl"=>"Libya", "name:tr"=>"Libya", "name:ts"=>"Libiya", "name:tt"=>"Ливия", "name:ug"=>"لىۋىيە", "name:uk"=>"Лівія", "name:ur"=>"لیبیا", "name:uz"=>"Liviya", "name:vi"=>"Libya", "name:vo"=>"Lübän", "name:wa"=>"Libeye", "name:wo"=>"Libi", "name:yi"=>"ליביע", "name:yo"=>"Líbyà", "name:zh"=>"利比亚", "name:zu"=>"ILibiya"
-qa     "name"=>"قطر", "name:af"=>"Katar", "name:am"=>"ቃጣር", "name:an"=>"Qatar", "name:ar"=>"قطر", "name:as"=>"কাটাৰ", "name:az"=>"Qətər", "name:be"=>"Катар", "name:bg"=>"Катар", "name:bn"=>"কাতার", "name:bo"=>"ཁ་ཏར།", "name:br"=>"Katar", "name:bs"=>"Katar", "name:ca"=>"Qatar", "name:ce"=>"Катар", "name:cs"=>"Katar", "name:cv"=>"Катар", "name:cy"=>"Qatar", "name:da"=>"Qatar", "name:de"=>"Katar", "name:dv"=>"ޤަޠަރު", "name:dz"=>"ཀ་ཏར་", "name:ee"=>"Qatar", "name:el"=>"Κατάρ", "name:en"=>"Qatar", "name:eo"=>"Kataro", "name:es"=>"Catar", "name:et"=>"Katar", "name:eu"=>"Qatar", "name:fa"=>"قطر", "name:fi"=>"Qatar", "name:fo"=>"Katar", "name:fr"=>"Qatar", "name:fy"=>"Katar", "name:ga"=>"Catar", "name:gd"=>"Catar", "name:gl"=>"Qatar - قطر", "name:gu"=>"કતાર (અરબસ્તાન)", "name:gv"=>"Yn Chatar", "name:he"=>"קטאר", "name:hi"=>"क़तर", "name:hr"=>"Katar", "name:ht"=>"Katar", "name:hu"=>"Katar", "name:hy"=>"Քաթար", "name:id"=>"Qatar", "name:ie"=>"Katar", "name:io"=>"Katar", "name:is"=>"Katar", "name:it"=>"Qatar", "name:ja"=>"カタール", "name:jv"=>"Qatar", "name:ka"=>"კატარი", "name:kk"=>"Катар", "name:kl"=>"Qatar", "name:kn"=>"ಕಟಾರ್", "name:ko"=>"카타르", "name:ku"=>"Qeter", "name:kv"=>"Катар", "name:kw"=>"Katar", "name:la"=>"Quataria", "name:lb"=>"Katar", "name:li"=>"Katar", "name:ln"=>"Katar", "name:lt"=>"Kataras", "name:lv"=>"Katara", "name:mi"=>"Katā", "name:mk"=>"Катар", "name:ml"=>"ഖത്തർ", "name:mn"=>"Катар", "name:mr"=>"कतार", "name:ms"=>"Qatar", "name:mt"=>"Qatar", "name:my"=>"ကာတာနိုင်ငံ", "name:na"=>"Qatar", "name:nl"=>"Qatar", "name:nn"=>"Qatar", "name:no"=>"Qatar", "name:nv"=>"Kʼatár", "name:oc"=>"Qatar", "name:or"=>"କତର", "name:os"=>"Катар", "name:pa"=>"ਕਤਰ", "name:pl"=>"Katar", "name:ps"=>"قطر", "name:pt"=>"Catar", "name:qu"=>"Qatar", "name:ro"=>"Qatar", "name:ru"=>"Катар", "name:rw"=>"Katari", "name:sa"=>"कतार", "name:se"=>"Qatar", "name:sk"=>"Katar (štát)", "name:sl"=>"Katar", "name:so"=>"Qatar", "name:sq"=>"Katari", "name:sr"=>"Катар", "name:ss"=>"IKhathari", "name:su"=>"Qatar", "name:sv"=>"Qatar", "name:sw"=>"Qatar", "name:ta"=>"கத்தார்", "name:te"=>"కతర్", "name:tg"=>"Қатар", "name:th"=>"ประเทศกาตาร์", "name:tk"=>"Katar", "name:tl"=>"Katar", "name:tr"=>"Katar", "name:tt"=>"Катар", "name:ug"=>"قاتار", "name:uk"=>"Катар", "name:ur"=>"قطر", "name:uz"=>"Qatar", "name:vi"=>"Qatar", "name:vo"=>"Katarän", "name:wo"=>"Kataar", "name:yi"=>"קאטאר", "name:yo"=>"Katar", "name:zh"=>"卡塔尔"
-me     "name"=>"Crna Gora / Црна Гора", "name:af"=>"Montenegro", "name:am"=>"ሞንቴኔግሮ", "name:an"=>"Montenegro", "name:ar"=>"الجبل الأسود", "name:av"=>"Чеэраб Меэр", "name:az"=>"Monteneqro", "name:ba"=>"Черногория", "name:be"=>"Чарнагорыя", "name:bg"=>"Черна гора", "name:bi"=>"Montenegro", "name:bn"=>"মন্টিনিগ্রো", "name:bo"=>"མོན་ཊེནིག་རོ།", "name:br"=>"Montenegro", "name:bs"=>"Crna Gora", "name:ca"=>"Montenegro", "name:ce"=>"Iаьржалаьмни", "name:cs"=>"Černá Hora", "name:cu"=>"Чрьна Гора", "name:cv"=>"Черногори", "name:cy"=>"Montenegro", "name:da"=>"Montenegro", "name:de"=>"Montenegro", "name:dv"=>"މޮންޓެނީގުރޯ", "name:ee"=>"Montenegro", "name:el"=>"Μαυροβούνιο", "name:en"=>"Montenegro", "name:eo"=>"Montenegro", "name:es"=>"Montenegro", "name:et"=>"Montenegro", "name:eu"=>"Montenegro", "name:fa"=>"مونته‌نگرو", "name:fi"=>"Montenegro", "name:fo"=>"Montenegro", "name:fr"=>"Monténégro", "name:fy"=>"Montenegro", "name:ga"=>"Montainéagró", "name:gd"=>"Am Monadh Neagrach", "name:gl"=>"Montenegro", "name:gu"=>"મોન્ટેનીગ્રો", "name:gv"=>"Montenegro", "name:he"=>"מונטנגרו", "name:hr"=>"Crna Gora", "name:ht"=>"Montenegwo", "name:hu"=>"Montenegró", "name:hy"=>"Չեռնոգորիա", "name:ia"=>"Montenegro", "name:id"=>"Montenegro", "name:ie"=>"Montenegro", "name:io"=>"Montenegro", "name:is"=>"Svartfjallaland", "name:it"=>"Montenegro", "name:ja"=>"モンテネグロ", "name:jv"=>"Montenégro", "name:ka"=>"ჩერნოგორია", "name:kg"=>"Monte Negro", "name:kk"=>"Черногория", "name:kl"=>"Montenegro", "name:kn"=>"ಮಾಂಟೆನೆಗ್ರೊ", "name:ko"=>"몬테네그로", "name:ku"=>"Montenegro", "name:kv"=>"Черногория", "name:kw"=>"Montenegro", "name:ky"=>"Монтенегро", "name:la"=>"Mons Niger", "name:lb"=>"Montenegro", "name:li"=>"Montenegro", "name:ln"=>"Montenegro", "name:lt"=>"Juodkalnija", "name:lv"=>"Melnkalne", "name:mi"=>"Monotenīkoro", "name:mk"=>"Црна Гора", "name:ml"=>"മോണ്ടെനെഗ്രൊ", "name:mn"=>"Монтенегро", "name:mr"=>"माँटेनिग्रो", "name:ms"=>"Montenegro", "name:mt"=>"Montenegro", "name:my"=>"မွန်တီနီဂရိုးနိုင်ငံ", "name:na"=>"Montenegro", "name:ne"=>"मोन्टेनेग्रो", "name:nl"=>"Montenegro", "name:nn"=>"Montenegro", "name:no"=>"Montenegro", "name:nv"=>"Dziłizhin Bikéyah", "name:oc"=>"Montenegro", "name:or"=>"ମୋଣ୍ଟେନେଗ୍ରୋ", "name:os"=>"Черногори", "name:pa"=>"ਮੋਂਟੇਨੇਗਰੋ", "name:pl"=>"Czarnogóra", "name:ps"=>"مانتېنېګرو", "name:pt"=>"Montenegro", "name:qu"=>"Yanaurqu", "name:ro"=>"Muntenegru", "name:ru"=>"Черногория", "name:rw"=>"Montenegoro", "name:sc"=>"Montenegro", "name:se"=>"Montenegro", "name:sh"=>"Crna Gora", "name:sk"=>"Čierna Hora", "name:sl"=>"Črna gora", "name:sm"=>"Montenegro", "name:so"=>"Montenegro", "name:sq"=>"Mali i Zi", "name:sr"=>"Црна Гора", "name:ss"=>"IMonthenekho", "name:su"=>"Monténégro", "name:sv"=>"Montenegro", "name:sw"=>"Montenegro", "name:ta"=>"மொண்டெனேகுரோ", "name:tg"=>"Монтенегро", "name:th"=>"ประเทศมอนเตเนโกร", "name:tk"=>"Çernogoriýa", "name:tl"=>"Montenegro", "name:tr"=>"Karadağ", "name:tt"=>"Монтенегро", "name:ug"=>"چېرنوگورىيە", "name:uk"=>"Чорногорія", "name:ur"=>"مونٹینیگرو", "name:uz"=>"Chernogoriya", "name:vi"=>"Montenegro", "name:vo"=>"Montenegrän", "name:wo"=>"Montenegro", "name:yi"=>"מאנטענעגרא", "name:yo"=>"Montenẹ́grò", "name:zh"=>"蒙特內哥羅"
-im     "name"=>"Isle of Man", "name:af"=>"Eiland Man", "name:an"=>"Isla de Man", "name:ar"=>"جزيرة مان", "name:az"=>"Men adası", "name:be"=>"Востраў Мэн", "name:bg"=>"Ман", "name:bn"=>"আইল অফ ম্যান", "name:br"=>"Manav", "name:bs"=>"Ostrvo Man", "name:ca"=>"Illa de Man", "name:cs"=>"Man", "name:cv"=>"Мэн утравĕ", "name:cy"=>"Ynys Manaw", "name:da"=>"Isle of Man", "name:de"=>"Insel Man", "name:dv"=>"އައިޒަލް އޮފް މޭން", "name:el"=>"Νήσος του Μαν", "name:en"=>"Isle of Man", "name:eo"=>"Manksinsulo", "name:es"=>"Isla de Man", "name:et"=>"Man", "name:eu"=>"Man", "name:fa"=>"جزیره من", "name:fi"=>"Mansaari", "name:fo"=>"Mann", "name:fr"=>"Île de Man", "name:fy"=>"Man", "name:ga"=>"Oileán Mhanann", "name:gd"=>"Eilean Mhanainn", "name:gl"=>"Illa de Man", "name:gv"=>"Ellan Vannin", "name:he"=>"האי מאן", "name:hi"=>"आइल ऑफ़ मैन", "name:hr"=>"Otok Man", "name:hu"=>"Man", "name:hy"=>"Մեն կղզի", "name:ia"=>"Insula de Man", "name:id"=>"Pulau Man", "name:io"=>"Man-Insulo", "name:is"=>"Mön", "name:it"=>"Isola di Man", "name:ja"=>"マン島", "name:jv"=>"Pulo Man", "name:ka"=>"მენი", "name:ko"=>"맨 섬", "name:kw"=>"Ynys Manow", "name:la"=>"Monapia", "name:li"=>"Man", "name:lt"=>"Meno Sala", "name:lv"=>"Menas Sala", "name:mi"=>"Motu o Man", "name:mk"=>"Ман", "name:ml"=>"ഐൽ ഒഫ് മാൻ", "name:mr"=>"आईल ऑफ मान", "name:ms"=>"Isle of Man", "name:nl"=>"Eiland Man", "name:nn"=>"Isle of Man", "name:no"=>"Man", "name:oc"=>"Illa de Man", "name:os"=>"Мэн", "name:pa"=>"ਮੈਨ ਟਾਪੂ", "name:pl"=>"Wyspa Man", "name:pt"=>"Ilha de Man", "name:qu"=>"Man wat'a", "name:ro"=>"Insula Man", "name:ru"=>"Остров Мэн", "name:rw"=>"Ikirwa cya Man", "name:sh"=>"Otok Man", "name:sk"=>"Ostrov Man", "name:sl"=>"Otok Man", "name:sq"=>"Ishulli i Njeriut", "name:sr"=>"Острво Ман", "name:su"=>"Pulo Man", "name:sv"=>"Isle of Man", "name:sw"=>"Isle of Man", "name:ta"=>"மாண் தீவு", "name:th"=>"เกาะแมน", "name:tl"=>"Pulo ng Man", "name:tr"=>"Man Adası", "name:tt"=>"Мэн утравы", "name:uk"=>"Острів Мен", "name:ur"=>"آئل آف مین", "name:vi"=>"Đảo Man", "name:vo"=>"Mäneän", "name:yo"=>"Erékùṣù ilẹ̀ Man", "name:zh"=>"马恩岛"
-gd     "name"=>"Grenada", "name:ar"=>"غرينادا", "name:be"=>"Грэнада", "name:br"=>"Grenada", "name:cs"=>"Grenada", "name:da"=>"Grenada", "name:de"=>"Grenada", "name:el"=>"Γρενάδα", "name:en"=>"Grenada", "name:eo"=>"Grenado", "name:es"=>"Granada", "name:fa"=>"گرنادا", "name:fi"=>"Grenada", "name:fr"=>"Grenade", "name:fy"=>"Grenada", "name:ga"=>"Greanáda", "name:gd"=>"Greanada", "name:he"=>"גרנדה", "name:hr"=>"Grenada", "name:hu"=>"Grenada", "name:is"=>"Grenada", "name:it"=>"Grenada", "name:ja"=>"グレナダ", "name:la"=>"Granata", "name:lb"=>"Granada", "name:lv"=>"Grenāda", "name:mn"=>"Гренада", "name:nl"=>"Grenada", "name:pl"=>"Granada", "name:pt"=>"Granada", "name:ru"=>"Гренада", "name:se"=>"Grenada", "name:sl"=>"Grenada", "name:sv"=>"Grenada", "name:ta"=>"கிரெனடா", "name:th"=>"ประเทศเกรเนดา", "name:uk"=>"Гренада", "name:vo"=>"Grenadeän", "name:zh"=>"格林纳达"
-sm     "name"=>"San Marino", "name:ar"=>"سان مارينو", "name:be"=>"Сан-Марына", "name:bg"=>"Сан Марино", "name:br"=>"San Marino", "name:cs"=>"San Marino", "name:da"=>"San Marino", "name:de"=>"San Marino", "name:el"=>"Άγιος Μαρίνος", "name:en"=>"San Marino", "name:eo"=>"San-Marino", "name:fa"=>"سان مارینو", "name:fi"=>"San Marino", "name:fr"=>"Saint-Marin", "name:fy"=>"San Marino", "name:ga"=>"San Mairíne", "name:he"=>"סן מרינו", "name:hr"=>"San Marino", "name:hu"=>"San Marino", "name:ia"=>"San Marino", "name:io"=>"San Marino", "name:is"=>"San Marínó", "name:it"=>"San Marino", "name:la"=>"Sancti Marini", "name:lt"=>"San Marinas", "name:mi"=>"Hato Marino", "name:mn"=>"Сан-Марино", "name:nl"=>"San Marino", "name:pl"=>"San Marino", "name:pt"=>"San Marino", "name:ru"=>"Сан-Марино", "name:se"=>"San Marino", "name:sk"=>"San Maríno", "name:sv"=>"San Marino", "name:ta"=>"சான் மரீனோ", "name:th"=>"ประเทศซานมารีโน", "name:uk"=>"Сан-Маріно", "name:vo"=>"Sanmarinän", "name:zh"=>"圣马力诺"
-tk     "name"=>"Tokelau", "name:am"=>"ቶክላው", "name:ar"=>"توكلو", "name:be"=>"Такелаў", "name:bg"=>"Токелау", "name:bm"=>"Tokelo", "name:bn"=>"টোকেলাউ", "name:br"=>"Tokelau", "name:ca"=>"Tokelau", "name:cs"=>"Tokelau", "name:da"=>"Tokelau", "name:de"=>"Tokelau", "name:dz"=>"ཏོ་ཀེ་ལའུ་ མཚོ་གླིང", "name:ee"=>"Tokelau nutome", "name:el"=>"Τοκελάου", "name:en"=>"Tokelau", "name:eo"=>"Tokelao", "name:es"=>"Tokelau", "name:fa"=>"توکلائو", "name:ff"=>"Tokelaaw", "name:fi"=>"Tokelau", "name:fr"=>"Tokelau", "name:fy"=>"Tokelaû", "name:ga"=>"Oileáin Tócalá", "name:gu"=>"ટોકેલાઉ", "name:ha"=>"Takelau", "name:he"=>"טוקלאו", "name:hi"=>"तोकेलाउ", "name:hr"=>"Tokelau", "name:hu"=>"Tokelau-szigetek", "name:is"=>"Tókelá", "name:ja"=>"トケラウ", "name:km"=>"តូខេឡៅ", "name:kn"=>"ಟೊಕೆಲಾವ್", "name:ko"=>"토켈라우", "name:ks"=>"توکیلاو", "name:ku"=>"Tokelau", "name:lg"=>"Tokelawu", "name:lo"=>"ໂຕເກເລົາ", "name:lt"=>"Tokelau", "name:lv"=>"Tokelau", "name:mg"=>"Tokelao", "name:mk"=>"Токелау", "name:ml"=>"ടൊകെലാവു", "name:mn"=>"Токелау", "name:mr"=>"तोकेलाउ", "name:mt"=>"Tokelaw", "name:ne"=>"तोगो", "name:no"=>"Tokelau", "name:or"=>"ଟୋକେଲାଉ", "name:pl"=>"Tokelau", "name:pt"=>"Toquelau", "name:rn"=>"Tokelawu", "name:ru"=>"Токелау", "name:si"=>"ටොකලාවු", "name:sk"=>"Tokelau", "name:sr"=>"Токелау", "name:sv"=>"Tokelauöarna", "name:ta"=>"டோகேலோ", "name:te"=>"టోకేలావ్", "name:th"=>"โตเกเลา", "name:ti"=>"ቶክላው", "name:uk"=>"Токелау", "name:ur"=>"ٹوکیلاؤ", "name:vi"=>"Tokelau", "name:yo"=>"Orílẹ́ède Tokelau", "name:zh"=>"托克劳", "name:zu"=>"i-Tokelau"
-td     "name"=>"Tchad تشاد", "name:af"=>"Tsjad", "name:am"=>"ቻድ", "name:an"=>"Chad", "name:ar"=>"تشاد", "name:az"=>"Çad", "name:ba"=>"Чад", "name:be"=>"Чад", "name:bg"=>"Чад", "name:bm"=>"Cad", "name:bn"=>"চাদ", "name:bo"=>"ཆཱ་ཌ།", "name:br"=>"Tchad", "name:bs"=>"Čad", "name:ca"=>"Txad", "name:ce"=>"Чад", "name:cs"=>"Čad", "name:cv"=>"Чад", "name:cy"=>"Tchad", "name:da"=>"Tchad", "name:de"=>"Tschad", "name:dv"=>"ޝާދު", "name:ee"=>"Chad", "name:el"=>"Τσαντ", "name:en"=>"Chad", "name:eo"=>"Ĉado", "name:es"=>"Chad", "name:et"=>"Tšaad", "name:eu"=>"Txad", "name:fa"=>"چاد", "name:fi"=>"Tšad", "name:fo"=>"Kjad", "name:fr"=>"Tchad", "name:fy"=>"Tsjaad", "name:ga"=>"Sead", "name:gd"=>"An t-Siad", "name:gl"=>"Chad - Tchad", "name:gu"=>"ચૅડ", "name:gv"=>"Shad", "name:ha"=>"Cadi", "name:he"=>"צ'אד", "name:hi"=>"चाड", "name:hr"=>"Čad", "name:ht"=>"Tchad", "name:hu"=>"Csád", "name:hy"=>"Չադ", "name:ia"=>"Tchad", "name:id"=>"Chad", "name:ie"=>"Chad", "name:ig"=>"Chad", "name:io"=>"Chad", "name:is"=>"Tsjad", "name:it"=>"Ciad", "name:ja"=>"チャド", "name:jv"=>"Chad", "name:ka"=>"ჩადი", "name:kg"=>"Tasadi", "name:kk"=>"Чад", "name:ko"=>"차드", "name:ku"=>"Çad", "name:kw"=>"Chad", "name:la"=>"Tzadia", "name:lb"=>"Tschad", "name:li"=>"Tsjaad", "name:ln"=>"Tshadi", "name:lt"=>"Čadas", "name:lv"=>"Čada", "name:mi"=>"Kāta", "name:mk"=>"Чад", "name:ml"=>"ഛാഡ്", "name:mn"=>"Чад", "name:mr"=>"चाड", "name:ms"=>"Chad", "name:mt"=>"Ċad", "name:my"=>"ချဒ်သမ္မတနိုင်ငံ", "name:na"=>"Tsiad", "name:nl"=>"Tsjaad", "name:nn"=>"Tsjad", "name:no"=>"Tsjad", "name:oc"=>"Chad", "name:or"=>"ଚାଡ", "name:os"=>"Чад", "name:pa"=>"ਚਾਡ", "name:pl"=>"Czad", "name:ps"=>"چاډ", "name:pt"=>"Chade", "name:qu"=>"Chad", "name:rm"=>"Tschad", "name:ro"=>"Ciad", "name:ru"=>"Чад", "name:rw"=>"Cade", "name:sa"=>"चाड", "name:sc"=>"Chad", "name:se"=>"Chad", "name:sg"=>"Sâde", "name:sh"=>"Čad", "name:si"=>"චෑඩ්", "name:sk"=>"Čad", "name:sl"=>"Čad", "name:sn"=>"Chad", "name:so"=>"Jad", "name:sq"=>"Çadi", "name:sr"=>"Чад", "name:ss"=>"IShedi", "name:su"=>"Chad", "name:sv"=>"Tchad", "name:sw"=>"Chad", "name:ta"=>"சாட்", "name:te"=>"చాద్", "name:tg"=>"Чад", "name:th"=>"ประเทศชาด", "name:ti"=>"ቻድ", "name:tk"=>"Çad", "name:tl"=>"Tsad", "name:tr"=>"Çad", "name:ts"=>"Chad", "name:tt"=>"Чад", "name:ug"=>"چاد", "name:uk"=>"Чад", "name:ur"=>"چاڈ", "name:uz"=>"Chad", "name:vi"=>"Tchad", "name:vo"=>"Tjadän", "name:wa"=>"Tchad", "name:wo"=>"Cadd", "name:yi"=>"טשאד", "name:yo"=>"Tsad", "name:zh"=>"乍得", "name:zu"=>"ITshedi"
-fm     "name"=>"Micronesia", "name:af"=>"Mikronesië", "name:ar"=>"ميكرونيسيا", "name:be"=>"Мікранэзія", "name:br"=>"Mikronezia", "name:ca"=>"Micronèsia", "name:cs"=>"Mikronésie", "name:da"=>"Mikronesien", "name:de"=>"Föderierte Staaten von Mikronesien", "name:en"=>"Federated States of Micronesia", "name:eo"=>"Mikronezio", "name:es"=>"Estados Federados de Micronesia", "name:et"=>"Mikroneesia", "name:fa"=>"میکرونزی", "name:fi"=>"Mikronesia", "name:fr"=>"États fédérés de Micronésie", "name:fy"=>"Mikroneezje", "name:ga"=>"An Mhicrinéis", "name:gd"=>"Na Meanbh Eileanan", "name:he"=>"מיקרונזיה", "name:hr"=>"Mikronezija", "name:hu"=>"Mikronézia", "name:ia"=>"Micronesia", "name:id"=>"Mikronesia", "name:io"=>"Mikronezia", "name:is"=>"Míkrónesía", "name:lb"=>"Mikronesien", "name:li"=>"Micronesië", "name:lt"=>"Mikronezija", "name:lv"=>"Mikronēzija", "name:mn"=>"Микронези", "name:nl"=>"Micronesia", "name:no"=>"Mikronesia", "name:oc"=>"Estats Federats de Micronesia", "name:pl"=>"Mikronezja", "name:ru"=>"Федеративные Штаты Микронезии", "name:se"=>"Mikronesia", "name:sk"=>"Mikronézia", "name:sl"=>"Mikronezija", "name:sr"=>"Микронезија", "name:sv"=>"Mikronesiens federerade stater", "name:ta"=>"மைக்குரோனீசியக் கூட்டு நாடுகள்", "name:th"=>"ประเทศไมโครนีเซีย", "name:tr"=>"Mikronezya", "name:uk"=>"Федеративні Штати Мікронезії", "name:vi"=>"Liên bang Micronesia", "name:vo"=>"Smala-Seanuäns", "name:zh"=>"密克罗尼西亚 / 密克羅尼西亞"
-li     "name"=>"Liechtenstein", "name:ar"=>"ليختنشتاين", "name:be"=>"Лiхтэнштэйн", "name:br"=>"Liechtenstein", "name:bs"=>"Lihtenštajn", "name:cs"=>"Lichtenštejnsko", "name:de"=>"Liechtenstein", "name:el"=>"Λίχτενσταϊν", "name:en"=>"Liechtenstein", "name:eo"=>"Liĥtenŝtejno", "name:fa"=>"لیختن‌اشتاین", "name:fi"=>"Liechtenstein", "name:fo"=>"Liktinstein", "name:fr"=>"Liechtenstein", "name:fy"=>"Lychtenstein", "name:ga"=>"Lichtinstéin", "name:he"=>"ליכטנשטיין", "name:hr"=>"Lihtenštajn", "name:hu"=>"Liechtenstein", "name:ia"=>"Liechtenstein", "name:io"=>"Liechtenstein", "name:is"=>"Liechtenstein", "name:it"=>"Liechtenstein", "name:ja"=>"リヒテンシュタイン", "name:ku"=>"Lînxiniştayn", "name:la"=>"Lichtenstenum", "name:lt"=>"Lichtenšteinas", "name:lv"=>"Lihtenšteina", "name:mi"=>"Rīkeneteina", "name:mk"=>"Лихтенштајн", "name:mn"=>"Лихтенштейн", "name:nl"=>"Liechtenstein", "name:pl"=>"Liechtenstein", "name:ru"=>"Лихтенштейн", "name:se"=>"Liechtenstein", "name:sk"=>"Lichtenštajnsko", "name:sl"=>"Lihtenštajn", "name:sr"=>"Лихтенштајн", "name:sv"=>"Liechtenstein", "name:ta"=>"லீக்கின்ஸ்டைன்", "name:th"=>"ประเทศลิกเตนสไตน์", "name:tr"=>"Lihtenştayn", "name:uk"=>"Ліхтенштейн", "name:vo"=>"Ligtänstän", "name:zh"=>"列支敦士登"
-sc     "name"=>"Sesel", "name:af"=>"Seychelle", "name:am"=>"ሲሸልስ", "name:an"=>"Seychelles", "name:ar"=>"سيشيل", "name:az"=>"Seyşel adaları", "name:be"=>"Сейшэльскія Астравы", "name:bg"=>"Сейшели", "name:bm"=>"Seshel", "name:bn"=>"সেশেল", "name:bo"=>"སེ་ཞེལ།", "name:br"=>"Sechelez", "name:bs"=>"Sejšeli", "name:ca"=>"Seychelles", "name:ce"=>"Сейшелан гlайреш", "name:cs"=>"Seychely", "name:cv"=>"Сейшел утравĕсем", "name:cy"=>"Seychelles", "name:da"=>"Seychellerne", "name:de"=>"Seychellen", "name:dv"=>"ތޭންގަދީބު", "name:el"=>"Σεϋχέλλες", "name:en"=>"Seychelles", "name:eo"=>"Sejŝeloj", "name:es"=>"Seychelles", "name:et"=>"Seišellid", "name:eu"=>"Seychelleak", "name:fa"=>"سیشل", "name:fi"=>"Seychellit", "name:fo"=>"Seyskelloyggjar", "name:fr"=>"Seychelles", "name:fy"=>"Seysjellen", "name:ga"=>"Na Séiséil", "name:gd"=>"Na h-Eileanan Sheiseall", "name:gl"=>"Seixeles - Seychelles", "name:gv"=>"Ny h-Ellanyn Heshell", "name:he"=>"סיישל", "name:hi"=>"सेशेल्स", "name:hr"=>"Sejšeli", "name:ht"=>"Sechèl", "name:hu"=>"Seychelle-szigetek", "name:ia"=>"Seychelles", "name:id"=>"Seychelles", "name:ie"=>"Seychelles", "name:io"=>"Seycheli", "name:is"=>"Seychelles-eyjar", "name:it"=>"Seychelles", "name:ja"=>"セーシェル", "name:jv"=>"Seychelles", "name:ka"=>"სეიშელის კუნძულები", "name:kg"=>"Seychell", "name:kk"=>"Сейшель Аралдары", "name:kn"=>"ಸೆಶೆಲ್ಸ್", "name:ko"=>"세이셸", "name:ku"=>"Seyşel", "name:kw"=>"Seychellys", "name:la"=>"Insulae Seisellenses", "name:lb"=>"Seychellen", "name:li"=>"Seychelle", "name:ln"=>"Seyshel", "name:lt"=>"Seišeliai", "name:lv"=>"Seišelas", "name:mg"=>"Seychelles", "name:mk"=>"Сејшели", "name:ml"=>"സെയ്‌ഷെൽസ്", "name:mn"=>"Сейшелийн арлууд", "name:mr"=>"सेशेल्स", "name:ms"=>"Seychelles", "name:mt"=>"Seychelles", "name:my"=>"ဆေးရှဲနိုင်ငံ", "name:nl"=>"Seychellen", "name:nn"=>"Seychellane", "name:no"=>"Seychellene", "name:nv"=>"Seishel", "name:oc"=>"Seichèlas", "name:or"=>"ସେସେଲଜ", "name:os"=>"Сейшелтæ", "name:pa"=>"ਸੇਸ਼ੈਲ", "name:pl"=>"Seszele", "name:ps"=>"سیشل", "name:pt"=>"Seychelles", "name:qu"=>"Sichillakuna", "name:rm"=>"Seychellas", "name:ro"=>"Seychelles", "name:ru"=>"Сейшелы", "name:rw"=>"Seyishele", "name:sa"=>"सेशेल", "name:sc"=>"Seychelles", "name:se"=>"Seychellat", "name:sg"=>"Sëyshêle", "name:sk"=>"Seychely", "name:sl"=>"Sejšeli", "name:sn"=>"Seychelles", "name:so"=>"Seyshelles", "name:sq"=>"Sejshellet", "name:sr"=>"Сејшели", "name:ss"=>"ISeyishelesi", "name:su"=>"Seychéll", "name:sv"=>"Seychellerna", "name:sw"=>"Shelisheli", "name:ta"=>"சீசெல்சு", "name:tg"=>"Ҷазираҳои Сейшел", "name:th"=>"ประเทศเซเชลส์", "name:tk"=>"Seýşel Adalary", "name:tl"=>"Seyshels", "name:tr"=>"Seyşeller", "name:ts"=>"Seychelles", "name:tt"=>"Сейшел утраулары", "name:ug"=>"سېيشېل ئاراللىرى", "name:uk"=>"Сейшельські Острови", "name:ur"=>"سیچیلیس", "name:uz"=>"Seyshell orollari", "name:vi"=>"Seychelles", "name:vo"=>"Säceluäns", "name:wo"=>"Seysel", "name:yo"=>"Ṣèíhẹ́lẹ́sì", "name:zh"=>"塞舌尔", "name:zu"=>"IsiSeyisheli"
-rs     "name"=>"Србија", "name:af"=>"Serwië", "name:am"=>"ሰርቢያ", "name:an"=>"Serbia", "name:ar"=>"صربيا", "name:ay"=>"Sirwiya", "name:az"=>"Serbiya", "name:ba"=>"Сербия", "name:be"=>"Сербія", "name:bg"=>"Сърбия", "name:bi"=>"Serbia", "name:bn"=>"সার্বিয়া", "name:bo"=>"སེར་བྷི་ཡ།", "name:br"=>"Serbia", "name:bs"=>"Srbija", "name:ca"=>"Sèrbia", "name:ce"=>"Серби", "name:co"=>"Serbia", "name:cs"=>"Srbsko", "name:cu"=>"Срьбїꙗ", "name:cv"=>"Серби", "name:cy"=>"Serbia", "name:da"=>"Serbien", "name:de"=>"Serbien", "name:dv"=>"ސާބިއާ", "name:ee"=>"Serbia", "name:el"=>"Σερβία", "name:en"=>"Serbia", "name:eo"=>"Serbio", "name:es"=>"Serbia", "name:et"=>"Serbia", "name:eu"=>"Serbia", "name:fa"=>"صربستان", "name:fi"=>"Serbia", "name:fo"=>"Serbia", "name:fr"=>"Serbie", "name:fy"=>"Servje", "name:ga"=>"An tSeirbia", "name:gd"=>"An t-Sèirb", "name:gl"=>"Serbia", "name:gn"=>"Sevia", "name:gv"=>"Yn Serb", "name:he"=>"סרביה", "name:hi"=>"सर्बिया", "name:hr"=>"Srbija", "name:ht"=>"Sèbi", "name:hu"=>"Szerbia", "name:hy"=>"Սերբիա", "name:ia"=>"Serbia", "name:id"=>"Serbia", "name:ie"=>"Serbia", "name:io"=>"Serbia", "name:is"=>"Serbía", "name:it"=>"Serbia", "name:ja"=>"セルビア", "name:jv"=>"Serbia", "name:ka"=>"სერბეთი", "name:kg"=>"Serbie", "name:kk"=>"Сербия", "name:kl"=>"Serbia", "name:ko"=>"세르비아", "name:ku"=>"Serbistan", "name:kv"=>"Сербия", "name:kw"=>"Serbi", "name:ky"=>"Сербия", "name:la"=>"Serbia", "name:lb"=>"Serbien", "name:li"=>"Servië", "name:ln"=>"Serbia", "name:lt"=>"Serbija", "name:lv"=>"Serbija", "name:mg"=>"Serbia", "name:mi"=>"Serbia", "name:mk"=>"Србија", "name:ml"=>"സെർബിയ", "name:mn"=>"Серби", "name:mr"=>"सर्बिया", "name:ms"=>"Serbia", "name:mt"=>"Serbja", "name:my"=>"ဆားဘီးယားနိုင်ငံ", "name:na"=>"Terbiya", "name:nb"=>"Serbia", "name:ne"=>"सर्बिया", "name:nl"=>"Servië", "name:nn"=>"Serbia", "name:no"=>"Serbia", "name:oc"=>"Serbia", "name:or"=>"ସର୍ବିଆ", "name:os"=>"Серби", "name:pa"=>"ਸਰਬੀਆ", "name:pl"=>"Serbia", "name:ps"=>"سربيا", "name:pt"=>"Sérvia", "name:qu"=>"Sirbya", "name:rm"=>"Serbia", "name:ro"=>"Serbia", "name:ru"=>"Сербия", "name:rw"=>"Seribiya", "name:sa"=>"सर्बिया", "name:sc"=>"Sèrbia", "name:se"=>"Serbia", "name:sh"=>"Srbija", "name:sk"=>"Srbsko", "name:sl"=>"Srbija", "name:sm"=>"Serbia", "name:so"=>"Serbia", "name:sq"=>"Serbia", "name:sr"=>"Србија", "name:ss"=>"ISebhiya", "name:st"=>"Serbia", "name:su"=>"Sérbia", "name:sv"=>"Serbien", "name:sw"=>"Serbia", "name:ta"=>"செர்பியா", "name:te"=>"సెర్బియా", "name:tg"=>"Сербия", "name:th"=>"ประเทศเซอร์เบีย", "name:tk"=>"Serbiýa", "name:tl"=>"Serbiya", "name:tr"=>"Sırbistan", "name:tt"=>"Сербия", "name:tw"=>"Serbia", "name:ty"=>"Terepia", "name:ug"=>"Sérbiye", "name:uk"=>"Сербія", "name:ur"=>"سربیا", "name:uz"=>"Serbiya", "name:vi"=>"Serbia", "name:vo"=>"Särbän", "name:wo"=>"Seerbi", "name:yi"=>"סערביע", "name:yo"=>"Sérbíà", "name:zh"=>"塞爾維亞", "name:zu"=>"ISerbiya"
-lb     "name"=>"لبنان", "name:af"=>"Libanon", "name:am"=>"ሊባኖስ", "name:an"=>"Liban", "name:ar"=>"لبنان", "name:az"=>"Livan", "name:ba"=>"Ливан", "name:be"=>"Ліван", "name:bg"=>"Ливан", "name:bm"=>"Lubenan", "name:bn"=>"লেবানন", "name:bo"=>"ལེ་པ་ནོན།", "name:br"=>"Liban", "name:bs"=>"Liban", "name:ca"=>"Líban", "name:ce"=>"Ливан", "name:cs"=>"Libanon", "name:cv"=>"Ливан", "name:cy"=>"Libanus", "name:da"=>"Libanon", "name:de"=>"Libanon", "name:dv"=>"ލުބުނާން", "name:dz"=>"ལེ་བཱ་ནཱོན་", "name:el"=>"Λίβανος", "name:en"=>"Lebanon", "name:eo"=>"Libano", "name:es"=>"Líbano", "name:et"=>"Liibanon", "name:eu"=>"Libano", "name:fa"=>"لبنان", "name:fi"=>"Libanon", "name:fo"=>"Libanon", "name:fr"=>"Liban", "name:fy"=>"Libanon", "name:ga"=>"An Liobáin", "name:gd"=>"Leabanon", "name:gl"=>"Líbano", "name:gn"=>"Lívano", "name:gu"=>"લેબેનાન", "name:gv"=>"Yn Livaan", "name:he"=>"לבנון", "name:hi"=>"लेबनान", "name:hr"=>"Libanon", "name:ht"=>"Liban", "name:hu"=>"Libanon", "name:hy"=>"Լիբանան", "name:ia"=>"Libano", "name:id"=>"Lebanon", "name:ie"=>"Libano", "name:io"=>"Libano", "name:is"=>"Líbanon", "name:it"=>"Libano", "name:ja"=>"レバノン", "name:jv"=>"Libanon", "name:ka"=>"ლიბანი", "name:kk"=>"Ливан", "name:kl"=>"Lebanon", "name:km"=>"លីបង់", "name:ko"=>"레바논", "name:ku"=>"Libnan", "name:kv"=>"Ливан", "name:kw"=>"Lebnon", "name:ky"=>"Ливан", "name:la"=>"Libanus", "name:lb"=>"Libanon", "name:li"=>"Libanon", "name:lt"=>"Libanas", "name:lv"=>"Libāna", "name:mi"=>"Repanona", "name:mk"=>"Либан", "name:ml"=>"ലെബനാൻ", "name:mn"=>"Ливан", "name:mr"=>"लेबेनॉन", "name:ms"=>"Lubnan", "name:mt"=>"Libanu", "name:my"=>"လက်ဘနွန်နိုင်ငံ", "name:na"=>"Ribanon", "name:nb"=>"Libanon", "name:nl"=>"Libanon", "name:nn"=>"Libanon", "name:no"=>"Libanon", "name:nv"=>"Łíbanoo", "name:oc"=>"Liban", "name:or"=>"ଲେବନାନ", "name:os"=>"Ливан", "name:pa"=>"ਲਿਬਨਾਨ", "name:pl"=>"Liban", "name:ps"=>"لېبنان", "name:pt"=>"Líbano", "name:qu"=>"Libanu", "name:ro"=>"Liban", "name:ru"=>"Ливан", "name:rw"=>"Libani", "name:sa"=>"लेबनान", "name:se"=>"Libanon", "name:sh"=>"Libanon", "name:sk"=>"Libanon", "name:sl"=>"Libanon", "name:so"=>"Lubnaan", "name:sq"=>"Libani", "name:sr"=>"Либан", "name:ss"=>"ILibhanoni", "name:su"=>"Libanon", "name:sv"=>"Libanon", "name:sw"=>"Lebanoni", "name:ta"=>"லெபனான்", "name:te"=>"లెబనాన్", "name:tg"=>"Лубнон", "name:th"=>"ประเทศเลบานอน", "name:tk"=>"Liwan", "name:tl"=>"Libano", "name:tr"=>"Lübnan", "name:tt"=>"Ливан", "name:ug"=>"لىۋان", "name:uk"=>"Ліван", "name:ur"=>"لبنان", "name:uz"=>"Livan", "name:vi"=>"Liban", "name:vo"=>"Libanän", "name:wo"=>"Libaa", "name:yi"=>"לבנון", "name:yo"=>"Lẹ́bánọ́nì", "name:zh"=>"黎巴嫩"
-gg     "name"=>"Guernsey", "name:af"=>"Guernsey", "name:an"=>"Guernési", "name:ar"=>"غيرنزي", "name:az"=>"Gernsi", "name:be"=>"Гернсi", "name:bg"=>"Гърнси", "name:br"=>"Gwernenez", "name:bs"=>"Guernsey", "name:ca"=>"Guernsey", "name:cs"=>"Guernsey", "name:cy"=>"Ynys y Garn", "name:da"=>"Guernsey", "name:de"=>"Guernsey", "name:dv"=>"ގުއާންސޭ", "name:el"=>"Γουερνισία", "name:en"=>"Guernsey", "name:eo"=>"Gernezejo", "name:es"=>"Guernsey", "name:et"=>"Guernsey", "name:eu"=>"Guernesey", "name:fa"=>"گرنزی", "name:fi"=>"Guernsey", "name:fr"=>"Guernesey", "name:fy"=>"Guernsey", "name:ga"=>"Geansaí", "name:gd"=>"Guernsey", "name:gl"=>"Guernsey", "name:gv"=>"Guernsey", "name:he"=>"גרנזי", "name:hi"=>"ग्वेर्नसे", "name:hr"=>"Guernsey", "name:hu"=>"Guernsey", "name:hy"=>"Գերնսի", "name:id"=>"Guernsey", "name:io"=>"Guernsey", "name:is"=>"Guernsey", "name:it"=>"Guernsey", "name:ja"=>"ガーンジー", "name:jv"=>"Guernsey", "name:ka"=>"გერნზი", "name:kn"=>"ಗುರ್ನ್‌ಸಿ", "name:ko"=>"건지 섬", "name:kw"=>"Gwernenys", "name:la"=>"Lisia", "name:lb"=>"Guernsey", "name:li"=>"Guernsey", "name:lt"=>"Gernsis", "name:lv"=>"Gērnsija", "name:mi"=>"Kōnihi", "name:mk"=>"Гернзи", "name:mn"=>"Гернси", "name:mr"=>"गर्न्सी", "name:ms"=>"Guernsey", "name:ne"=>"गुर्न्जी", "name:nl"=>"Guernsey", "name:nn"=>"Guernsey", "name:no"=>"Guernsey", "name:oc"=>"Guernesey", "name:os"=>"Гернси", "name:pa"=>"ਗਰਨਜ਼ੇ", "name:pl"=>"Guernsey", "name:pt"=>"Guernsey", "name:ro"=>"Guernsey", "name:ru"=>"Гернси", "name:rw"=>"Gwasi", "name:sh"=>"Guernsey", "name:sk"=>"Guernsey", "name:sl"=>"Guernsey", "name:sq"=>"Guernsey", "name:sr"=>"Гернзи", "name:su"=>"Guernsey", "name:sv"=>"Guernsey", "name:sw"=>"Guernsey", "name:ta"=>"குயெர்ன்சி", "name:tg"=>"Гернси", "name:th"=>"เกิร์นซีย์", "name:tl"=>"Gernesey", "name:tr"=>"Guernsey", "name:tt"=>"Гернси", "name:uk"=>"Гернсі", "name:ur"=>"گرنزی", "name:vi"=>"Guernsey", "name:yo"=>"Guernsey", "name:zh"=>"根西島"
-mh     "name"=>"Ṃajeḷ", "name:af"=>"Marshalleilande", "name:ar"=>"جزر مارشال", "name:be"=>"Маршалавы астравы", "name:br"=>"Inizi Marshall", "name:ca"=>"Illes Marshall", "name:cy"=>"Ynysoedd Marshall", "name:da"=>"Marshalløerne", "name:de"=>"Marshallinseln", "name:en"=>"Marshall Islands", "name:eo"=>"Marŝaloj", "name:es"=>"Islas Marshall", "name:et"=>"Marshalli Saared", "name:fa"=>"جزایر مارشال", "name:fi"=>"Marshallinsaaret", "name:fr"=>"Îles Marshall", "name:fy"=>"de Marshalleilannen", "name:ga"=>"Oileáin Marshall", "name:gd"=>"Na h-Eileanan Mharshall", "name:he"=>"איי מרשל", "name:hr"=>"Maršalovi Otoci", "name:hu"=>"Marshall-szigetek", "name:ia"=>"Insulas Marshall", "name:id"=>"Kepulauan Marshall", "name:io"=>"Insuli Marshall", "name:is"=>"Marshalleyjar", "name:it"=>"Isole Marshall", "name:la"=>"Insulae Marsalienses", "name:lb"=>"Marshallinselen", "name:li"=>"Marshall-eilen", "name:lt"=>"Maršalo salos", "name:lv"=>"Māršala salas", "name:mk"=>"Маршалски Острови", "name:mn"=>"Маршаллын арлууд", "name:nl"=>"Marshalleilanden", "name:oc"=>"Illas Marshall", "name:pl"=>"Wyspy Marshalla", "name:pt"=>"Ilhas Marshall", "name:ru"=>"Маршалловы Острова", "name:se"=>"Marshallsullot", "name:sk"=>"Mashallove ostrovy", "name:sl"=>"Marshallovi otoki", "name:sv"=>"Marshallöarna", "name:ta"=>"மார்சல் தீவுகள்", "name:th"=>"สาธารณรัฐหมู่เกาะมาร์แชลล์", "name:tr"=>"Marshall Adaları", "name:uk"=>"Маршаллові Острови", "name:vi"=>"Quần đảo Marshall", "name:vo"=>"Marjaluäns", "name:zh"=>"马绍尔群岛"
-bm     "name"=>"Bermuda", "name:ar"=>"برمودا", "name:be"=>"Бярмуды", "name:br"=>"Bermudez", "name:ca"=>"Bermudes", "name:cs"=>"Bermudy", "name:da"=>"Bermuda", "name:de"=>"Bermuda", "name:el"=>"Βερμούδες", "name:en"=>"Bermuda", "name:eo"=>"Bermudoj", "name:fa"=>"برمودا", "name:fi"=>"Bermuda", "name:fr"=>"Bermudes", "name:ga"=>"Beirmiúda", "name:gl"=>"Bermudas", "name:he"=>"ברמודה", "name:hr"=>"Bermudski Otoci", "name:hu"=>"Bermuda", "name:id"=>"Bermuda", "name:is"=>"Bermúda", "name:it"=>"Bermuda", "name:lt"=>"Bermuda", "name:lv"=>"Bermudu salas", "name:mk"=>"Бермуда", "name:mn"=>"Бермудын Арал", "name:oc"=>"Bermudas", "name:pl"=>"Bermudy", "name:pt"=>"Bermudas", "name:ru"=>"Бермудские острова", "name:sl"=>"Bermudi", "name:sr"=>"Бермуди", "name:sv"=>"Bermuda", "name:th"=>"เบอร์มิวดา", "name:tr"=>"Bermuda", "name:uk"=>"Бермудські острови", "name:uz"=>"Bermud orollari", "name:zh"=>"百慕大"
-sd     "name"=>"السودان", "name:af"=>"Soedan", "name:ak"=>"Sudan", "name:am"=>"ሱዳን", "name:an"=>"Sudán", "name:ar"=>"السودان", "name:az"=>"Sudan", "name:ba"=>"Судан", "name:be"=>"Судан", "name:bg"=>"Судан", "name:bm"=>"Sudan", "name:bn"=>"সুদান", "name:bo"=>"སུའུ་ཏན།", "name:br"=>"Soudan", "name:bs"=>"Sudan", "name:ca"=>"Sudan", "name:ce"=>"Судан", "name:cs"=>"Súdán", "name:cv"=>"Судан", "name:cy"=>"Sudan", "name:da"=>"Sudan", "name:de"=>"Sudan", "name:dv"=>"ސޫދާން", "name:ee"=>"Sudan", "name:el"=>"Σουδάν", "name:en"=>"Sudan", "name:eo"=>"Sudano", "name:es"=>"Sudán", "name:et"=>"Sudaan", "name:eu"=>"Sudan", "name:fa"=>"سودان", "name:fi"=>"Sudan", "name:fo"=>"Sudan", "name:fr"=>"Soudan", "name:fy"=>"Sûdan", "name:ga"=>"An tSúdáin", "name:gd"=>"Sudan", "name:gl"=>"Sudán", "name:gn"=>"Sudano", "name:gu"=>"સુદાન", "name:gv"=>"Yn Toodaan", "name:ha"=>"Sudan", "name:he"=>"סודאן", "name:hi"=>"सूडान", "name:hr"=>"Sudan", "name:ht"=>"Soudan", "name:hu"=>"Szudán", "name:hy"=>"Սուդան", "name:ia"=>"Sudan", "name:id"=>"Sudan", "name:ie"=>"Sudan", "name:ig"=>"Sudan", "name:io"=>"Sudan", "name:is"=>"Súdan", "name:it"=>"Sudan", "name:ja"=>"スーダン", "name:jv"=>"Sudan", "name:ka"=>"სუდანი", "name:kg"=>"Sudan", "name:ki"=>"Sũdana", "name:kk"=>"Судан", "name:kn"=>"ಸುಡಾನ್", "name:ko"=>"수단", "name:ku"=>"Sûdan", "name:kw"=>"Soudan", "name:ky"=>"Судан", "name:la"=>"Sudania", "name:lb"=>"Sudan", "name:li"=>"Soedan", "name:ln"=>"Sudani", "name:lt"=>"Sudanas", "name:lv"=>"Sudāna", "name:mi"=>"Hūtāne", "name:mk"=>"Судан", "name:ml"=>"സുഡാൻ", "name:mn"=>"Судан", "name:mr"=>"सुदान", "name:ms"=>"Sudan", "name:mt"=>"Sudan", "name:my"=>"ဆူဒန်နိုင်ငံ", "name:na"=>"Tudan", "name:nl"=>"Soedan", "name:nn"=>"Sudan", "name:no"=>"Sudan", "name:nv"=>"Soodą́ą", "name:ny"=>"Sudan", "name:oc"=>"Sodan", "name:om"=>"Sudaan", "name:or"=>"ସୁଦାନ", "name:os"=>"Судан", "name:pa"=>"ਸੁਡਾਨ", "name:pl"=>"Sudan", "name:ps"=>"سوډان", "name:pt"=>"Sudão", "name:qu"=>"Sudan", "name:rm"=>"Sudan", "name:ro"=>"Sudan", "name:ru"=>"Судан", "name:rw"=>"Sudani", "name:sa"=>"सूडान", "name:sc"=>"Sudan", "name:sd"=>"سوڊان", "name:se"=>"Sudan", "name:sg"=>"Sudäan", "name:sh"=>"Sudan", "name:sk"=>"Sudán", "name:sl"=>"Sudan", "name:sm"=>"Sudan", "name:sn"=>"Sudan", "name:so"=>"Suudaan", "name:sq"=>"Sudani", "name:sr"=>"Судан", "name:ss"=>"ISudani", "name:su"=>"Sudan", "name:sv"=>"Sudan", "name:sw"=>"Sudan", "name:ta"=>"சூடான்", "name:te"=>"సూడాన్", "name:tg"=>"Судон", "name:th"=>"ประเทศซูดาน", "name:ti"=>"ሱዳን", "name:tk"=>"Sudan", "name:tl"=>"Sudan", "name:tr"=>"Sudan", "name:ts"=>"Sudan", "name:tt"=>"Судан", "name:ug"=>"سۇدان", "name:uk"=>"Судан", "name:ur"=>"سوڈان", "name:uz"=>"Sudan", "name:vi"=>"Sudan", "name:vo"=>"Sudän", "name:wo"=>"Sudaan", "name:yi"=>"סודאן", "name:yo"=>"Sudan", "name:zh"=>"苏丹共和国"
-za     "name"=>"South Africa", "name:af"=>"Suid-Afrika", "name:ak"=>"Afrika Anaafo", "name:am"=>"ደቡብ አፍሪካ", "name:an"=>"Sudafrica", "name:ar"=>"جنوب أفريقيا", "name:az"=>"Cənub Afrika", "name:be"=>"Паўднёва-Афрыканская Рэспубліка", "name:bg"=>"Южна Африка", "name:bm"=>"Worodugu Afriki", "name:bn"=>"দক্ষিণ আফ্রিকা", "name:bo"=>"ལྷོ་ ཨཕྲི་ཀ།", "name:br"=>"Suafrika", "name:bs"=>"Južna Afrika", "name:ca"=>"Sud-àfrica", "name:ce"=>"Къилба-Африкин Республика", "name:cs"=>"Jižní Afrika", "name:cv"=>"Кăнтăр Африка", "name:cy"=>"De Affrica", "name:da"=>"Sydafrika", "name:de"=>"Südafrika", "name:dv"=>"ދެކުނު އެފްރިކާ", "name:dz"=>"སཱའུཐ་ ཨཕ་རི་ཀ", "name:ee"=>"Anyiehe Afrika nutome", "name:el"=>"Νότια Αφρική", "name:en"=>"South Africa", "name:eo"=>"Sud-Afriko", "name:es"=>"Sudáfrica", "name:et"=>"Lõuna-Aafrika Vabariik", "name:eu"=>"Hegoafrika", "name:fa"=>"آفریقای جنوبی", "name:ff"=>"Afrik bŋ Worgo", "name:fi"=>"Etelä-Afrikka", "name:fo"=>"Suðurafrika", "name:fr"=>"Afrique du Sud", "name:fy"=>"Súd-Afrika", "name:ga"=>"An Afraic Theas", "name:gd"=>"Afraga a Deas", "name:gl"=>"Suráfrica", "name:gn"=>"Yvyafrika", "name:gu"=>"દક્ષિણ આફ્રિકા", "name:gv"=>"Yn Affrick Yiass", "name:ha"=>"Afirka ta Kudu", "name:he"=>"דרום אפריקה", "name:hi"=>"दक्षिण अफ़्रीका", "name:hr"=>"Južna Afrika", "name:ht"=>"Afrik disid", "name:hu"=>"Dél-Afrika", "name:hy"=>"Հարավային Աֆրիկա", "name:ia"=>"Africa del Sud", "name:id"=>"Afrika Selatan", "name:ie"=>"Sudafrica", "name:io"=>"Sud-Afrika", "name:is"=>"Suður-Afríka", "name:it"=>"Sudafrica", "name:ja"=>"南アフリカ", "name:jv"=>"Afrika Kidul", "name:ka"=>"სამხრეთ აფრიკა", "name:kg"=>"Afelika ya Sudi", "name:ki"=>"Abĩrika Kusini", "name:kk"=>"Оңтүстік Африка", "name:km"=>"អាព្រិក​ភាគ​ខាង​ត្បូង", "name:kn"=>"ದಕ್ಷಿಣ ಆಫ್ರಿಕಾ", "name:ko"=>"남아프리카", "name:ks"=>"جَنوٗبی اَفریٖکا", "name:ku"=>"Afrîkaya Başûr", "name:kv"=>"Лунвыв Африкаса Республика", "name:kw"=>"Afrika Dhyhow", "name:ky"=>"Африкаанс тили", "name:la"=>"Africa Australis", "name:lb"=>"Südafrika", "name:lg"=>"Sawusafirika", "name:li"=>"Zuud-Afrika", "name:ln"=>"Sidafríka", "name:lo"=>"ອາຟະລິກາໃຕ້", "name:lt"=>"Pietų Afrika", "name:lv"=>"Dienvidāfrika", "name:mg"=>"Afrika Atsimo", "name:mi"=>"Awherika ki te Tonga", "name:mk"=>"Јужна Африка", "name:ml"=>"ദക്ഷിണാഫ്രിക്ക", "name:mn"=>"Өмнөд Африк", "name:mr"=>"दक्षिण अफ्रिका", "name:ms"=>"Afrika Selatan", "name:mt"=>"Afrika t’Isfel", "name:my"=>"တောင်အာဖရိက", "name:ne"=>"दक्षिण अफ्रिका", "name:nl"=>"Zuid-Afrika", "name:nn"=>"Sør-Afrika", "name:no"=>"Sør-Afrika", "name:nv"=>"Kéyah Naakai Łizhinii Bikéyah Shádiʼááhjí Siʼánígíí", "name:ny"=>"South Africa", "name:oc"=>"Sud d'Africa", "name:or"=>"ଦକ୍ଷିଣ ଆଫ୍ରିକା", "name:os"=>"Хуссар Африкæйы", "name:pa"=>"ਦੱਖਣੀ ਅਫ਼ਰੀਕਾ", "name:pl"=>"Republika Południowej Afryki", "name:ps"=>"سویلي افریقا", "name:pt"=>"África do Sul", "name:qu"=>"Urin Aphrika", "name:rm"=>"Africa dal Sid", "name:rn"=>"Afurika y'Epfo", "name:ro"=>"Africa de Sud", "name:ru"=>"Южная Африка", "name:rw"=>"Afurika y’Epfo", "name:sa"=>"दक्षिण-आफ्रिका", "name:sc"=>"Sudàfrica", "name:se"=>"Lulli-Afrihká", "name:sg"=>"Afrîka-Mbongo", "name:sh"=>"Južna Afrika", "name:si"=>"දකුණු අප්‍රිකාව", "name:sk"=>"Južná Afrika", "name:sl"=>"Južna Afrika", "name:sn"=>"South Africa", "name:so"=>"Koonfur Afrika", "name:sq"=>"Afrika e Jugut", "name:sr"=>"Јужна Африка", "name:ss"=>"INingizimu Afrika", "name:st"=>"Afrika Borwa", "name:su"=>"Afrika Kidul", "name:sv"=>"Sydafrika", "name:sw"=>"Afrika Kusini", "name:ta"=>"தென் ஆப்பிரிக்கா", "name:te"=>"దక్షిణ ఆఫ్రికా రాజ్యం", "name:tg"=>"Африқои Ҷанубӣ", "name:th"=>"แอฟริกาใต้", "name:ti"=>"ደቡብ አፍሪካ", "name:tk"=>"Günorta Afrika", "name:tl"=>"Timog Aprika", "name:tn"=>"Aferika Borwa", "name:to"=>"ʻAfilika tonga", "name:tr"=>"Güney Afrika", "name:ts"=>"Afrika-Dzonga", "name:tt"=>"Көньяк Африка", "name:ug"=>"جەنۇبىي ئافرىقا", "name:uk"=>"Південна Африка", "name:ur"=>"جنوبی افریقہ", "name:uz"=>"Janubiy Afrika", "name:ve"=>"Afurika Tshipembe", "name:vi"=>"Nam Phi", "name:vo"=>"Sulüdafrikän", "name:wa"=>"Nonne-Afrike", "name:wo"=>"Afrig gu Bëj-saalum", "name:xh"=>"uMzantsi Afrika", "name:yi"=>"דרום אפריקע", "name:yo"=>"Gúúsù Áfríkà", "name:zh"=>"南非", "name:zu"=>"iNingizimu Afrika"
-kn     "name"=>"Saint Kitts and Nevis", "name:af"=>"Sint Kitts en Nevis", "name:ar"=>"سانت كيتس ونيفس", "name:be"=>"Святы Кітс і Невіс", "name:br"=>"Saint Kitts-ha-Nevis", "name:ca"=>"Saint Kitts i Nevis", "name:cs"=>"Svatý Kryštof a Nevis", "name:cy"=>"Saint Kitts a Nevis", "name:da"=>"Saint Kitts og Nevis", "name:de"=>"St. Kitts und Nevis", "name:el"=>"Άγιος Χριστόφορος και Νέβις", "name:en"=>"Saint Kitts and Nevis", "name:eo"=>"Sankta Kristoforo kaj Neviso", "name:es"=>"San Cristóbal y Nieves", "name:et"=>"Saint Kitts ja Nevis", "name:fa"=>"سنت کیتس و نویس", "name:fi"=>"Saint Kitts ja Nevis", "name:fr"=>"Saint-Christophe-et-Niévès", "name:fy"=>"Sint Kitts en Nevis", "name:ga"=>"San Críostóir-Nimheas", "name:gd"=>"Naomh Crìstean agus Nibheis", "name:he"=>"סנט קיטס ונוויס", "name:hr"=>"Sveti Kristofor i Nevis", "name:hu"=>"Saint Kitts és Nevis", "name:ia"=>"Sancte Christophoro e Nevis", "name:id"=>"Saint Kitts dan Nevis", "name:io"=>"Santa Kitts e Nevis", "name:is"=>"Sankti Kristófer og Nevis", "name:it"=>"Saint Kitts e Nevis", "name:lb"=>"Saint Kitts a Nevis", "name:li"=>"Saint-Kitts", "name:lt"=>"Sent Kitsas ir Nevis", "name:mk"=>"Свети Кристифер и Невис", "name:mn"=>"Сент-Киттс ба Невис", "name:nl"=>"Saint Kitts en Nevis", "name:pl"=>"Saint Kitts i Nevis", "name:pt"=>"São Cristóvão e Nevis", "name:ru"=>"Сент-Китс и Невис", "name:se"=>"Saint Kitts ja Nevis", "name:sl"=>"Sveti Krištof in Nevis", "name:sv"=>"Saint Kitts och Nevis", "name:ta"=>"செயிண்ட் கிட்சும் நெவிசும்", "name:th"=>"ประเทศเซนต์คิตส์และเนวิส", "name:tr"=>"Saint Kitts ve Nevis", "name:uk"=>"Сент-Кіттс і Невіс", "name:vi"=>"Saint Kitts và Nevis", "name:vo"=>"Sankiteän e Neviseän", "name:zh"=>"圣基茨和尼维斯"
-jm     "name"=>"Jamaica", "name:af"=>"Jamaika", "name:ar"=>"جامايكا", "name:be"=>"Ямайка", "name:br"=>"Jamaika", "name:cs"=>"Jamajka", "name:de"=>"Jamaika", "name:el"=>"Ιαμαϊκή", "name:en"=>"Jamaica", "name:eo"=>"Jamajko", "name:fa"=>"جامائیکا", "name:fi"=>"Jamaika", "name:fr"=>"Jamaïque", "name:fy"=>"Jamaika", "name:ga"=>"Iamáice", "name:gd"=>"Iaimeuca", "name:he"=>"ג'מייקה", "name:hr"=>"Jamajka", "name:hu"=>"Jamaica", "name:id"=>"Jamaika", "name:io"=>"Jamaika", "name:is"=>"Jamaíka", "name:it"=>"Giamaica", "name:ja"=>"ジャマイカ", "name:ku"=>"Camayka", "name:la"=>"Iamaica", "name:lb"=>"Jamaika", "name:lt"=>"Jamaika", "name:lv"=>"Jamaika", "name:mn"=>"Ямайка", "name:nl"=>"Jamaica", "name:oc"=>"Jamaica", "name:pl"=>"Jamajka", "name:pt"=>"Jamaica", "name:ru"=>"Ямайка", "name:se"=>"Jamaica", "name:sk"=>"Jamajka", "name:sl"=>"Jamajka", "name:sv"=>"Jamaica", "name:ta"=>"ஜமேக்கா", "name:th"=>"ประเทศจาเมกา", "name:tr"=>"Jamaika", "name:uk"=>"Ямайка", "name:vo"=>"Camekeän", "name:zh"=>"牙买加"
-cl     "name"=>"Chile", "name:ab"=>"Чили", "name:af"=>"Chili", "name:ak"=>"Chile", "name:am"=>"ቺሌ", "name:an"=>"Chile", "name:ar"=>"تشيلي", "name:as"=>"চিলি", "name:av"=>"Чили", "name:ay"=>"Chili", "name:az"=>"Çili", "name:ba"=>"Чи́ли", "name:be"=>"Чылі", "name:bg"=>"Чили", "name:bh"=>"चिली", "name:bi"=>"Chile", "name:bm"=>"Chile", "name:bn"=>"চিলি", "name:bo"=>"ཅི་ལི།", "name:br"=>"Chile", "name:bs"=>"Čile", "name:ca"=>"Xile", "name:ce"=>"Чили", "name:ch"=>"Chile", "name:co"=>"Cile", "name:cs"=>"Chile", "name:cu"=>"Чилє", "name:cv"=>"Чили", "name:cy"=>"Chile", "name:da"=>"Chile", "name:de"=>"Chile", "name:dv"=>"ޗިލީ", "name:dz"=>"ཅི་ལེ", "name:ee"=>"Chile", "name:el"=>"Χιλή", "name:en"=>"Chile", "name:eo"=>"Ĉilio", "name:es"=>"Chile", "name:et"=>"Tšiili", "name:eu"=>"Txile", "name:fa"=>"شیلی", "name:ff"=>"Ciile", "name:fi"=>"Chile", "name:fj"=>"Chile", "name:fo"=>"Kili", "name:fr"=>"Chili", "name:fy"=>"Sily", "name:ga"=>"an tSile", "name:gd"=>"an t-Sile", "name:gl"=>"Chile", "name:gn"=>"Chile", "name:gu"=>"ચીલી", "name:gv"=>"yn Çhillee", "name:ha"=>"Chile", "name:he"=>"צ'ילה", "name:hi"=>"चिली", "name:hr"=>"Čile", "name:ht"=>"Chili", "name:hu"=>"Chile", "name:hy"=>"Չիլի", "name:ia"=>"Chile", "name:id"=>"Chili", "name:ie"=>"Chile", "name:ig"=>"Chile", "name:ik"=>"Cili", "name:io"=>"Chili", "name:is"=>"Síle", "name:it"=>"Cile", "name:iu"=>"ᓯᓕ", "name:ja"=>"チリ", "name:jv"=>"Chili", "name:ka"=>"ჩილე", "name:kg"=>"Chile", "name:ki"=>"Chile", "name:kk"=>"Чили", "name:kl"=>"Chile", "name:km"=>"ឈីលី", "name:kn"=>"ಚಿಲಿ", "name:ko"=>"칠레", "name:ks"=>"چِلی", "name:ku"=>"Şîle", "name:kv"=>"Чили", "name:kw"=>"Chile", "name:ky"=>"Чили", "name:la"=>"Chilia", "name:lb"=>"Chile", "name:lg"=>"Chile", "name:li"=>"Chili", "name:ln"=>"Shili", "name:lo"=>"ປະເທດຈີເລ", "name:lt"=>"Čilė", "name:lv"=>"Čīle", "name:mg"=>"Silia", "name:mi"=>"Hiri", "name:mk"=>"Чиле", "name:ml"=>"ചിലി", "name:mn"=>"Чили", "name:mr"=>"चिली", "name:ms"=>"Chile", "name:mt"=>"Ċili", "name:my"=>"ချီလီနိုင်ငံ", "name:na"=>"Tsire", "name:ne"=>"चिली", "name:nl"=>"Chili", "name:nn"=>"Chile", "name:no"=>"Chile", "name:nv"=>"Chíilii", "name:ny"=>"Chile", "name:oc"=>"Chile", "name:om"=>"Chiilii", "name:or"=>"ଚିଲି", "name:os"=>"Чили", "name:pa"=>"ਚਿਲੀ", "name:pi"=>"चिले", "name:pl"=>"Chile", "name:ps"=>"چېلي", "name:pt"=>"Chile", "name:qu"=>"Chili", "name:rm"=>"Chile", "name:rn"=>"Chile", "name:ro"=>"Chile", "name:ru"=>"Чили", "name:rw"=>"Shili", "name:sa"=>"चिले", "name:sc"=>"Cile", "name:sd"=>"چلي", "name:se"=>"Chile", "name:sg"=>"Shilïi", "name:sh"=>"Čile", "name:si"=>"චිලි", "name:sk"=>"Čile", "name:sl"=>"Čile", "name:sm"=>"Shili", "name:sn"=>"Chile", "name:so"=>"Jili", "name:sq"=>"Kilia", "name:sr"=>"Чиле", "name:ss"=>"iShile", "name:st"=>"Chile", "name:su"=>"Cilé", "name:sv"=>"Chile", "name:sw"=>"Chile", "name:ta"=>"சிலி", "name:te"=>"చిలీ", "name:tg"=>"Чиле", "name:th"=>"ชิลี", "name:ti"=>"ቺሌ", "name:tk"=>"Çili", "name:tl"=>"Chile", "name:tn"=>"Chile", "name:to"=>"Sile", "name:tr"=>"Şili", "name:ts"=>"Chile", "name:tt"=>"Чи́ли", "name:tw"=>"Kyili", "name:ty"=>"Tīri", "name:ug"=>"چىلى", "name:uk"=>"Чи́лі", "name:ur"=>"چلی", "name:uz"=>"Chili", "name:ve"=>"Shile", "name:vi"=>"Chi-lê", "name:vo"=>"Cilän", "name:wa"=>"Tchili", "name:wo"=>"Ciili", "name:xh"=>"iChile", "name:yi"=>"טשילע", "name:yo"=>"Tsílè", "name:za"=>"Chile", "name:zh"=>"智利", "name:zu"=>"ITshile"
-et     "name"=>"ኢትዮጵያ", "name:af"=>"Ethiopië", "name:ak"=>"Ithiopia", "name:am"=>"ኢትዮጵያ", "name:an"=>"Etiopia", "name:ar"=>"إثيوبيا", "name:av"=>"Хабашистан", "name:az"=>"Efiopiya", "name:ba"=>"Эфио́пия", "name:be"=>"Эфіопія", "name:bg"=>"Етиопия", "name:bh"=>"इथियोपिया", "name:bm"=>"Etiopia", "name:bn"=>"ইথিওপিয়া", "name:bo"=>"ཨི་ཐི་ཨོ་པི་ཡ།", "name:br"=>"Etiopia", "name:bs"=>"Etiopija", "name:ca"=>"Etiòpia", "name:ce"=>"Эфио́пи", "name:cs"=>"Etiopie", "name:cu"=>"Єѳїопі́ꙗ", "name:cv"=>"Эфиопи", "name:cy"=>"Ethiopia", "name:da"=>"Etiopien", "name:de"=>"Äthiopien", "name:dv"=>"ޙަބުޝްކަރަ", "name:dz"=>"ཨི་ཐི་ཡོ་པི་ཡ", "name:ee"=>"Etiopia", "name:el"=>"Αιθιοπία", "name:en"=>"Ethiopia", "name:eo"=>"Etiopio", "name:es"=>"Etiopía", "name:et"=>"Etioopia", "name:eu"=>"Etiopia", "name:fa"=>"اتیوپی", "name:fi"=>"Etiopia", "name:fo"=>"Etiopia", "name:fr"=>"Éthiopie", "name:fy"=>"Etioopje", "name:ga"=>"an Aetóip", "name:gd"=>"An Aetiòp", "name:gl"=>"Etiopía - Ityop'iya", "name:gn"=>"Etiopia", "name:gu"=>"ઇથિયોપિયા", "name:gv"=>"yn Eetoip", "name:ha"=>"Ethiopia", "name:he"=>"אתיופיה", "name:hi"=>"इथियोपिया", "name:hr"=>"Etiopija", "name:ht"=>"Etyopi", "name:hu"=>"Etiópia", "name:hy"=>"Եթովպիա", "name:ia"=>"Ethiopia", "name:id"=>"Ethiopia", "name:ie"=>"Etiopia", "name:ig"=>"Ethiopia", "name:io"=>"Etiopia", "name:is"=>"Eþíópía", "name:it"=>"Etiopia", "name:ja"=>"エチオピア", "name:jv"=>"Étiopia", "name:ka"=>"ეთიოპია", "name:kg"=>"Itiopia", "name:ki"=>"Ethiopia", "name:kk"=>"Ефиопия", "name:km"=>"អេត្យូពី", "name:kn"=>"ಇತಿಯೋಪಿಯ", "name:ko"=>"에티오피아", "name:ks"=>"اِتھوپِیا", "name:ku"=>"Etiyopya", "name:kv"=>"Эфиопия", "name:kw"=>"Ethiopi", "name:ky"=>"Эфиопия", "name:la"=>"Aethiopia", "name:lb"=>"Ethiopien", "name:lg"=>"Ethiopia", "name:li"=>"Ethiopië", "name:ln"=>"Etiopi", "name:lo"=>"ເອທີໂອເປຍ", "name:lt"=>"Etiopija", "name:lv"=>"Etiopija", "name:mg"=>"Etiopia", "name:mi"=>"Etiopia", "name:mk"=>"Етиопија", "name:ml"=>"എത്യോപ്യ", "name:mn"=>"Этиоп", "name:mr"=>"इथियोपिया", "name:ms"=>"Habsyah", "name:mt"=>"Etjopja", "name:my"=>"အီသီယိုးပီးယားနိုင်ငံ", "name:na"=>"Itiyopiya", "name:ne"=>"इथियोपिया", "name:nl"=>"Ethiopië", "name:nn"=>"Etiopia", "name:no"=>"Etiopia", "name:nv"=>"Iithiyópya", "name:oc"=>"Etiopia", "name:om"=>"Itoophiyaa", "name:or"=>"ଇଥିଓପିଆ", "name:os"=>"Эфио́пи", "name:pa"=>"ਇਥੋਪੀਆ", "name:pi"=>"ईथ्योपिया", "name:pl"=>"Etiopia", "name:ps"=>"اېتوپیا", "name:pt"=>"Etiópia", "name:qu"=>"Ithiyupya", "name:rm"=>"Etiopia", "name:ro"=>"Etiopia", "name:ru"=>"Эфиопия", "name:rw"=>"Etiyopiya", "name:sa"=>"ईथ्योपिया", "name:sc"=>"Etiòpia", "name:se"=>"Etiopia", "name:sg"=>"Etiopïi", "name:sh"=>"Etiopija", "name:si"=>"ඉතියෝපියාව", "name:sk"=>"Etiópia", "name:sl"=>"Etiópija", "name:sm"=>"Ethiopia", "name:sn"=>"Ethiopia", "name:so"=>"Itoobiya", "name:sq"=>"Etiopia", "name:sr"=>"Етиопија", "name:ss"=>"iTopiya", "name:st"=>"Ethiopia", "name:su"=>"Étiopia", "name:sv"=>"Etiopien", "name:sw"=>"Ethiopia", "name:ta"=>"எத்தியோப்பியா", "name:te"=>"ఇథియోపియా", "name:tg"=>"Эфиопия", "name:th"=>"เอธิโอเปีย", "name:ti"=>"ኢትዮጵያ", "name:tk"=>"Efiopiýa", "name:tl"=>"Etiyopiya", "name:to"=>"ʻItiōpea", "name:tr"=>"Etiyopya", "name:ts"=>"Topiya", "name:tt"=>"Хәбәшстан", "name:ug"=>"ئېفىئوپىيە", "name:uk"=>"Ефіо́пія", "name:ur"=>"ایتھوپیا", "name:uz"=>"Efiopiya", "name:vi"=>"Ethiopia", "name:vo"=>"Lätiopän", "name:wa"=>"Etiopeye", "name:wo"=>"Ecoopi", "name:xh"=>"iTopiya", "name:yi"=>"עטיאָפּיע", "name:yo"=>"Ethiópíà", "name:za"=>"Ethiopia", "name:zh"=>"埃塞俄比亚", "name:zu"=>"i-Ithiopia"
-lk     "name"=>"ශ්‍රී ලංකාව இலங்கை", "name:af"=>"Sri Lanka", "name:am"=>"ሽሪ ላንካ", "name:an"=>"Sri Lanka", "name:ar"=>"سريلانكا", "name:az"=>"Şri-Lanka", "name:ba"=>"Шри-Ланка", "name:be"=>"Шры-Ланка", "name:bg"=>"Шри Ланка", "name:bn"=>"শ্রীলঙ্কা", "name:bo"=>"སེང་ག་གླིང་།", "name:br"=>"Sri Lanka", "name:bs"=>"Šri Lanka", "name:ca"=>"Sri Lanka", "name:cs"=>"Šrí Lanka", "name:cv"=>"Шри-Ланка", "name:cy"=>"Sri Lanka", "name:da"=>"Sri Lanka", "name:de"=>"Sri Lanka", "name:dv"=>"އޮޅުދޫކަރަ", "name:dz"=>"ཤྲཱྀ་ལངཀ་", "name:el"=>"Σρι Λάνκα", "name:en"=>"Sri Lanka", "name:eo"=>"Sri-Lanko", "name:es"=>"Sri Lanka", "name:et"=>"Sri Lanka", "name:eu"=>"Sri Lanka", "name:fa"=>"سری‌لانکا", "name:fi"=>"Sri Lanka", "name:fo"=>"Sri Lanka", "name:fr"=>"Sri Lanka", "name:fy"=>"Sry Lanka", "name:ga"=>"Srí Lanca", "name:gd"=>"Sri Lanca", "name:gl"=>"Sri Lanka - Sri Lankā", "name:gu"=>"શ્રીલંકા", "name:gv"=>"Sri Lanka", "name:he"=>"סרי לנקה", "name:hi"=>"श्रीलंका", "name:hr"=>"Šri Lanka", "name:ht"=>"Srilanka", "name:hu"=>"Srí Lanka", "name:hy"=>"Շրի Լանկա", "name:ia"=>"Sri Lanka", "name:id"=>"Sri Lanka", "name:ie"=>"Sri Lanka", "name:io"=>"Sri Lanka", "name:is"=>"Srí Lanka", "name:it"=>"Sri Lanka", "name:ja"=>"スリランカ", "name:jv"=>"Sri Lanka", "name:ka"=>"შრი-ლანკა", "name:ki"=>"Sri Lanka", "name:kk"=>"Шри-Ланка", "name:km"=>"ស្រីលង្កា", "name:kn"=>"ಶ್ರೀಲಂಕಾ", "name:ko"=>"스리랑카", "name:ku"=>"Srî Lanka", "name:kv"=>"Шри-Ланка", "name:kw"=>"Shri Lanka", "name:la"=>"Taprobane", "name:lb"=>"Sri Lanka", "name:li"=>"Sri Lanka", "name:ln"=>"Sri Lanka", "name:lt"=>"Šri Lanka", "name:lv"=>"Šrilanka", "name:mg"=>"Sri Lanka", "name:mi"=>"Hīraka", "name:mk"=>"Шри Ланка", "name:ml"=>"ശ്രീലങ്ക", "name:mn"=>"Шри Ланка", "name:mr"=>"श्रीलंका", "name:ms"=>"Sri Lanka", "name:mt"=>"Sri Lanka", "name:my"=>"သီရိလင်္ကာနိုင်ငံ", "name:na"=>"Sri Lanka", "name:ne"=>"श्रीलंका", "name:nl"=>"Sri Lanka", "name:nn"=>"Sri Lanka", "name:no"=>"Sri Lanka", "name:nv"=>"Swii Lankʼa", "name:oc"=>"Sri Lanka", "name:om"=>"Sirilaankaa", "name:or"=>"ଶ୍ରୀଲଙ୍କା", "name:os"=>"Шри-Ланка", "name:pa"=>"ਸ੍ਰੀਲੰਕਾ", "name:pl"=>"Sri Lanka", "name:ps"=>"سریلانکا", "name:pt"=>"Seri-Lanca", "name:qu"=>"Sri Lanka", "name:ro"=>"Sri Lanka", "name:ru"=>"Шри-Ланка", "name:rw"=>"Siri Lanka", "name:sa"=>"श्रीलङ्का", "name:se"=>"Sri Lanka", "name:sh"=>"Šri Lanka", "name:si"=>"ශ්‍රී ලංකාව", "name:sk"=>"Srí Lanka", "name:sl"=>"Šrilanka", "name:sm"=>"Sri Lanka", "name:so"=>"Siri Lanka", "name:sq"=>"Sri Lanka", "name:sr"=>"Шри Ланка", "name:ss"=>"Siri Lanka", "name:su"=>"Sri Langka", "name:sv"=>"Sri Lanka", "name:sw"=>"Sri Lanka", "name:ta"=>"இலங்கை", "name:te"=>"శ్రీలంక", "name:tg"=>"Шри-Ланка", "name:th"=>"ประเทศศรีลังกา", "name:tk"=>"Şri-Lanka", "name:tl"=>"Sri Lanka", "name:tr"=>"Sri Lanka", "name:tt"=>"Шри-Ланка", "name:ug"=>"سرىلانكا", "name:uk"=>"Шрі-Ланка", "name:ur"=>"سری لنکا", "name:uz"=>"Shri-Lanka", "name:vi"=>"Sri Lanka", "name:vo"=>"Sri-Lankän", "name:wo"=>"Siri Laanka", "name:yi"=>"סרי לאנקא", "name:yo"=>"Sri Lanka", "name:zh"=>"斯里蘭卡"
-mz     "name"=>"Moçambique", "name:af"=>"Mosambiek", "name:am"=>"ሞዛምቢክ", "name:an"=>"Mozambique", "name:ar"=>"موزمبيق", "name:az"=>"Mozambik", "name:ba"=>"Мозамбик", "name:be"=>"Мазамбік", "name:bg"=>"Мозамбик", "name:bm"=>"Mozanbik", "name:bn"=>"মোজাম্বিক", "name:bo"=>"མོ་ཛམ་བིཀ།", "name:br"=>"Mozambik", "name:bs"=>"Mozambik", "name:ca"=>"Moçambic", "name:ce"=>"Мозамбик", "name:co"=>"Mozambicu", "name:cs"=>"Mosambik", "name:cv"=>"Мозамбик", "name:cy"=>"Mosambic", "name:da"=>"Mozambique", "name:de"=>"Mosambik", "name:dv"=>"މުސިންބީ", "name:el"=>"Μοζαμβίκη", "name:en"=>"Mozambique", "name:eo"=>"Mozambiko", "name:es"=>"Mozambique", "name:et"=>"Mosambiik", "name:eu"=>"Mozambike", "name:fa"=>"موزامبیک", "name:fi"=>"Mosambik", "name:fo"=>"Mosambik", "name:fr"=>"Mozambique", "name:fy"=>"Mozambyk", "name:ga"=>"Poblacht Mhósaimbíc", "name:gd"=>"Mòsaimbic", "name:gl"=>"Mozambique", "name:gn"=>"Mosambike", "name:gv"=>"Yn Vosambeeck", "name:he"=>"מוזמביק", "name:hi"=>"मोज़ाम्बीक", "name:hr"=>"Mozambik", "name:ht"=>"Mozanbik", "name:hu"=>"Mozambik", "name:hy"=>"Մոզամբիկ", "name:ia"=>"Mozambique", "name:id"=>"Mozambik", "name:ie"=>"Mozambique", "name:io"=>"Mozambik", "name:is"=>"Mósambík", "name:it"=>"Mozambico", "name:ja"=>"モザンビーク", "name:jv"=>"Mozambik", "name:ka"=>"მოზამბიკი", "name:kg"=>"Musambiki", "name:kk"=>"Мозамбик", "name:kn"=>"ಮೊಜಾಂಬಿಕ್", "name:ko"=>"모잠비크", "name:ku"=>"Mozambîk", "name:kw"=>"Mosambik", "name:la"=>"Mozambicum", "name:lb"=>"Mosambik", "name:li"=>"Mozambique", "name:ln"=>"Mozambíki", "name:lt"=>"Mozambikas", "name:lv"=>"Mozambika", "name:mg"=>"Mozambika", "name:mi"=>"Mohapiki", "name:mk"=>"Мозамбик", "name:ml"=>"മൊസാംബിക്ക്", "name:mn"=>"Мозамбик", "name:mr"=>"मोझांबिक", "name:ms"=>"Mozambique", "name:mt"=>"Możambik", "name:my"=>"မိုဇမ်ဘစ်နိုင်ငံ", "name:nl"=>"Mozambique", "name:nn"=>"Mosambik", "name:no"=>"Mosambik", "name:ny"=>"Mozambique", "name:oc"=>"Moçambic", "name:or"=>"ମୋଜାମ୍ବିକ", "name:os"=>"Мозамбик", "name:pa"=>"ਮੋਜ਼ੈਂਬੀਕ", "name:pl"=>"Mozambik", "name:ps"=>"موزمبيق", "name:pt"=>"Moçambique", "name:qu"=>"Musambik", "name:ro"=>"Mozambic", "name:ru"=>"Мозамбик", "name:rw"=>"Mozambike", "name:sa"=>"मोजम्बीक", "name:sc"=>"Mozambico", "name:se"=>"Mosambik", "name:sg"=>"Mözämbîka", "name:sh"=>"Mozambik", "name:sk"=>"Mozambik", "name:sl"=>"Mozambik", "name:sn"=>"Mozambique", "name:so"=>"Musanbiig", "name:sq"=>"Mozambiku", "name:sr"=>"Мозамбик", "name:ss"=>"IMozambikhi", "name:su"=>"Mosambik", "name:sv"=>"Moçambique", "name:sw"=>"Msumbiji", "name:ta"=>"மொசாம்பிக்", "name:tg"=>"Мозамбик", "name:th"=>"ประเทศโมซัมบิก", "name:ti"=>"ሞዛምቢክ", "name:tk"=>"Mozambik", "name:tl"=>"Musambik", "name:tr"=>"Mozambik", "name:ts"=>"Mozambique", "name:ug"=>"موزامبىك", "name:uk"=>"Мозамбік", "name:ur"=>"موزمبیق", "name:uz"=>"Mozambik", "name:ve"=>"Mozambikwi", "name:vi"=>"Mozambique", "name:vo"=>"Mozambikän", "name:wo"=>"Mosambik", "name:yi"=>"מאזאמביק", "name:yo"=>"Mòsámbìk", "name:zh"=>"莫桑比克", "name:zu"=>"IMozambiki"
-py     "name"=>"Paraguay", "name:af"=>"Paraguay", "name:am"=>"ፓራጓይ", "name:an"=>"Paraguai", "name:ar"=>"باراغواي", "name:ay"=>"Parawayi", "name:az"=>"Paraqvay", "name:ba"=>"Парагвай", "name:be"=>"Парагвай", "name:bg"=>"Парагвай", "name:bi"=>"Paraguay", "name:bn"=>"প্যারাগুয়ে", "name:bo"=>"པ་ར་གུ་ཡེ།", "name:br"=>"Paraguay", "name:bs"=>"Paragvaj", "name:ca"=>"Paraguai", "name:ce"=>"Парагвай", "name:co"=>"Paraguay", "name:cs"=>"Paraguay", "name:cv"=>"Парагвай", "name:cy"=>"Paraguay", "name:da"=>"Paraguay", "name:de"=>"Paraguay", "name:dv"=>"ޕެރަގުއޭ", "name:ee"=>"Paraguay", "name:el"=>"Παραγουάη", "name:en"=>"Paraguay", "name:eo"=>"Paragvajo", "name:es"=>"Paraguay", "name:et"=>"Paraguay", "name:eu"=>"Paraguai", "name:fa"=>"پاراگوئه", "name:fi"=>"Paraguay", "name:fo"=>"Paraguei", "name:fr"=>"Paraguay", "name:fy"=>"Paraguay", "name:ga"=>"Paragua", "name:gd"=>"Paraguaidh", "name:gl"=>"Paraguai", "name:gn"=>"Paraguái", "name:gv"=>"Yn Pharaguay", "name:he"=>"פרגוואי", "name:hi"=>"पैराग्वे", "name:hr"=>"Paragvaj", "name:ht"=>"Paragwe", "name:hu"=>"Paraguay", "name:hy"=>"Պարագվայ", "name:ia"=>"Paraguay", "name:id"=>"Paraguay", "name:ie"=>"Paraguay", "name:io"=>"Paraguay", "name:is"=>"Paragvæ", "name:it"=>"Paraguay", "name:ja"=>"パラグアイ", "name:jv"=>"Paraguay", "name:ka"=>"პარაგვაი", "name:kk"=>"Парагвай", "name:kl"=>"Paraguay", "name:kn"=>"ಪೆರಗ್ವೆ", "name:ko"=>"파라과이", "name:ku"=>"Paraguay", "name:kw"=>"Paragway", "name:la"=>"Paraquaria", "name:lb"=>"Paraguay", "name:li"=>"Paraguay", "name:ln"=>"Palagway", "name:lt"=>"Paragvajus", "name:lv"=>"Paragvaja", "name:mk"=>"Парагвај", "name:ml"=>"പരഗ്വെ", "name:mn"=>"Парагвай", "name:mr"=>"पेराग्वे", "name:ms"=>"Paraguay", "name:mt"=>"Paragwaj", "name:my"=>"ပါရာဂွေးနိုင်ငံ", "name:ne"=>"पाराग्वे", "name:nl"=>"Paraguay", "name:nn"=>"Paraguay", "name:no"=>"Paraguay", "name:oc"=>"Paraguai", "name:or"=>"ପାରାଗୁଏ", "name:os"=>"Парагвай", "name:pa"=>"ਪੈਰਾਗੁਏ", "name:pl"=>"Paragwaj", "name:pt"=>"Paraguai", "name:qu"=>"Parawayi", "name:rm"=>"Paraguay", "name:ro"=>"Paraguay", "name:ru"=>"Парагвай", "name:rw"=>"Paragwe", "name:sa"=>"पेरेग्वाय", "name:se"=>"Paraguay", "name:sh"=>"Paragvaj", "name:sk"=>"Paraguaj", "name:sl"=>"Paragvaj", "name:so"=>"Paraguay", "name:sq"=>"Paraguaji", "name:sr"=>"Парагвај", "name:su"=>"Paraguay", "name:sv"=>"Paraguay", "name:sw"=>"Paraguay", "name:ta"=>"பரகுவை", "name:tg"=>"Парагвай", "name:th"=>"ประเทศปารากวัย", "name:tl"=>"Paraguay", "name:tr"=>"Paraguay", "name:tt"=>"Парагвай", "name:ug"=>"پاراگۋاي", "name:uk"=>"Парагвай", "name:ur"=>"پیراگوئے", "name:uz"=>"Paragvay", "name:vi"=>"Paraguay", "name:vo"=>"Paragvän", "name:wo"=>"Paraguwaay", "name:yi"=>"פאראגוויי", "name:yo"=>"Paragúáì", "name:zh"=>"巴拉圭"
-st     "name"=>"São Tomé e Príncipe", "name:af"=>"São Tomé en Principe", "name:ar"=>"سان تومي وبرينسيبي", "name:br"=>"São Tomé ha Príncipe", "name:ca"=>"São Tomé i Príncipe", "name:cs"=>"Svatý Tomáš a Princův ostrov", "name:cy"=>"São Tomé a Príncipe", "name:da"=>"São Tomé og Príncipe", "name:de"=>"São Tomé und Príncipe", "name:el"=>"Σάο Τομέ και Πρίνσιπε", "name:en"=>"São Tomé and Príncipe", "name:eo"=>"Sao-Tomeo kaj Principeo", "name:es"=>"Santo Tomé y Príncipe", "name:et"=>"São Tomé ja Príncipe", "name:fa"=>"سائوتومه و پرینسیپ", "name:fi"=>"São Tomé ja Príncipe", "name:fr"=>"Sao Tomé-et-Principe", "name:fy"=>"Sao Tomee en Prinsipe", "name:ga"=>"São Tomé agus Príncipe", "name:gd"=>"São Tomé agus Príncipe", "name:he"=>"סאו טומה ופרינסיפה", "name:hr"=>"Sveti Toma i Princip", "name:hu"=>"São Tomé és Príncipe", "name:id"=>"Sao Tome dan Principe", "name:io"=>"San-Tome e Principe", "name:is"=>"Saó Tóme og Prinsípe", "name:la"=>"Insulae Sancti Thomae et Principis", "name:lb"=>"São Tomé a Príncipe", "name:li"=>"São Tomé en Príncipe", "name:lt"=>"Sao Tomė ir Prinsipė", "name:mn"=>"Сан-Томе ба Принсипи", "name:nl"=>"Sao Tomé en Principe", "name:pl"=>"Wyspy Świętego Tomasza i Książęca", "name:pt"=>"São Tomé e Príncipe", "name:ru"=>"Сан-Томе и Принсипи", "name:se"=>"São Tomé ja Príncipe", "name:sk"=>"Svätý Tomáš a Princov ostrov", "name:sl"=>"Sveti Tomaž in Princ", "name:sr"=>"Сао Томе и Принсипе", "name:sv"=>"São Tomé och Príncipe", "name:ta"=>"சாவோ தொமே மற்றும் பிரின்சிப்பி", "name:th"=>"ประเทศเซาตูเมและปรินซิปี", "name:tr"=>"São Tomé ve Príncipe", "name:uk"=>"Сан-Томе і Принсіпі", "name:vi"=>"São Tomé và Príncipe", "name:vo"=>"Saluda-Tomeän e Prinsipeän", "name:zh"=>"圣多美和普林西比"
-mv     "name"=>"ދިވެހިރާއްޖެ", "name:af"=>"Maldive", "name:am"=>"ማልዲቭስ", "name:ar"=>"ملديف", "name:az"=>"Maldiv", "name:be"=>"Мальдывы", "name:bg"=>"Малдиви", "name:bm"=>"Maldivi", "name:bn"=>"মালদ্বীপ", "name:bo"=>"མལ་དྭིབ།", "name:br"=>"Maldivez", "name:bs"=>"Maldivi", "name:ca"=>"Maldives", "name:cs"=>"Maledivy", "name:da"=>"Maldiverne", "name:de"=>"Malediven", "name:dv"=>"ދިވެހިރާއްޖެ", "name:dz"=>"མཱལ་དིབས", "name:ee"=>"maldivesdukɔ", "name:el"=>"Μαλδίβες", "name:en"=>"Maldives", "name:eo"=>"Maldivoj", "name:es"=>"Maldivas", "name:et"=>"Maldiivid", "name:eu"=>"Maldivak", "name:fa"=>"مالدیو", "name:ff"=>"Maldiiwe", "name:fi"=>"Malediivit", "name:fo"=>"Maldivuoyggjarnar", "name:fr"=>"Maldives", "name:fy"=>"de Maldiven", "name:ga"=>"Oileáin Mhaildíve", "name:gd"=>"Na h-Eileanan Mhaladaibh", "name:gl"=>"Maldivas", "name:gu"=>"માલદિવ્સ", "name:gv"=>"Ny Maldeevaghyn", "name:ha"=>"Maldibi", "name:he"=>"מלדיבים", "name:hi"=>"मालदीव", "name:hr"=>"Maldivi", "name:hu"=>"Maldív-szigetek", "name:hy"=>"Մալդիվներ", "name:id"=>"Maladewa", "name:ig"=>"Maldivesa", "name:io"=>"Maldivi", "name:is"=>"Maldíveyjar", "name:it"=>"Maldive", "name:ka"=>"მალდივის კუნძულები", "name:ki"=>"Modivu", "name:km"=>"ម៉ាល់ឌីវ", "name:kn"=>"ಮಾಲ್ಡಿವ್ಸ್", "name:ks"=>"مالدیٖو", "name:ku"=>"Maldîv", "name:la"=>"Insulae Maldivae", "name:lb"=>"Malediven", "name:lg"=>"Bizinga by'eMalidive", "name:ln"=>"Madívɛ", "name:lo"=>"ມັນດິຟ", "name:lt"=>"Maldyvai", "name:lv"=>"Maldīvija", "name:mg"=>"Maldiva", "name:mk"=>"Малдиви", "name:ml"=>"മാലിദ്വീപ്", "name:mn"=>"Мальдив", "name:mr"=>"मालदीव्ज", "name:ms"=>"Maldiv", "name:my"=>"မော်လဒိုက်", "name:ne"=>"माल्दिभ्स", "name:nl"=>"Malediven", "name:nn"=>"Maldivane", "name:no"=>"Maldivene", "name:or"=>"ମାଳଦ୍ବୀପ", "name:pl"=>"Malediwy", "name:pt"=>"Maldivas", "name:rm"=>"Maldivas", "name:rn"=>"Moludave", "name:ro"=>"Maldive", "name:ru"=>"Мальдивы", "name:se"=>"Malediivvat", "name:sg"=>"Maldîva", "name:si"=>"මාල දිවයින", "name:sk"=>"Maledivy", "name:sl"=>"Maldivi", "name:so"=>"Maaldiqeen", "name:sq"=>"Maldivit", "name:sr"=>"Малдиви", "name:sv"=>"Maldiverna", "name:sw"=>"Modivu", "name:ta"=>"மாலத்தீவு", "name:te"=>"మాల్దీవులు", "name:th"=>"ประเทศมัลดีฟส์", "name:ti"=>"ማልዲቭስ", "name:to"=>"Malativisi", "name:tr"=>"Maldivler", "name:tt"=>"Мальдивлар", "name:uk"=>"Мальдіви", "name:ur"=>"مالدیو", "name:vo"=>"Maldivuäns", "name:yo"=>"Orílẹ́ède Maladifi", "name:zh"=>"马尔代夫/馬爾地夫", "name:zu"=>"i-Maldives"
-na     "name"=>"Namibia", "name:af"=>"Namibië", "name:am"=>"ናሚቢያ", "name:an"=>"Namibia", "name:ar"=>"ناميبيا", "name:az"=>"Namibiya", "name:ba"=>"Намибия", "name:be"=>"Намібія", "name:bg"=>"Намибия", "name:bm"=>"Namibia", "name:bn"=>"নামিবিয়া", "name:bo"=>"ན་མི་བྷི་ཡ།", "name:br"=>"Namibia", "name:bs"=>"Namibija", "name:ca"=>"Namíbia", "name:ce"=>"Намиби", "name:cs"=>"Namibie", "name:cv"=>"Намиби", "name:cy"=>"Namibia", "name:da"=>"Namibia", "name:de"=>"Namibia", "name:el"=>"Ναμίμπια", "name:en"=>"Namibia", "name:eo"=>"Namibio", "name:es"=>"Namibia", "name:et"=>"Namiibia", "name:eu"=>"Namibia", "name:fa"=>"نامیبیا", "name:fi"=>"Namibia", "name:fo"=>"Namibia", "name:fr"=>"Namibie", "name:fy"=>"Namybje", "name:ga"=>"An Namaib", "name:gd"=>"Naimibia", "name:gl"=>"Namibia", "name:gv"=>"Yn Nameeb", "name:he"=>"נמיביה", "name:hi"=>"नामीबिया", "name:hr"=>"Namibija", "name:ht"=>"Namibi", "name:hu"=>"Namíbia", "name:hy"=>"Նամիբիա", "name:ia"=>"Namibia", "name:id"=>"Namibia", "name:ie"=>"Namibia", "name:io"=>"Namibia", "name:is"=>"Namibía", "name:it"=>"Namibia", "name:ja"=>"ナミビア", "name:jv"=>"Namibia", "name:ka"=>"ნამიბია", "name:kg"=>"Namibia", "name:ki"=>"Namibia", "name:kk"=>"Намибия", "name:kn"=>"ನಮೀಬಿಯ", "name:ko"=>"나미비아", "name:ku"=>"Namîbya", "name:kw"=>"Namibi", "name:la"=>"Namibia", "name:lb"=>"Namibien", "name:li"=>"Namibië", "name:ln"=>"Namibia", "name:lt"=>"Namibija", "name:lv"=>"Namībija", "name:mg"=>"Namibia", "name:mi"=>"Namīpia", "name:mk"=>"Намибија", "name:ml"=>"നമീബിയ", "name:mn"=>"Намиби", "name:mr"=>"नामिबिया", "name:ms"=>"Namibia", "name:mt"=>"Namibja", "name:my"=>"နမီးဘီးယားနိုင်ငံ", "name:nl"=>"Namibië", "name:nn"=>"Namibia", "name:no"=>"Namibia", "name:nv"=>"Namííbya", "name:oc"=>"Namibia", "name:or"=>"ନାମିବିଆ", "name:os"=>"Намиби", "name:pa"=>"ਨਮੀਬੀਆ", "name:pl"=>"Namibia", "name:ps"=>"نېمبیا", "name:pt"=>"Namíbia", "name:qu"=>"Namiwya", "name:rm"=>"Namibia", "name:ro"=>"Namibia", "name:ru"=>"Намибия", "name:rw"=>"Namibiya", "name:sa"=>"नमीबिया", "name:sc"=>"Namìbia", "name:se"=>"Namibia", "name:sg"=>"Namibùii", "name:sh"=>"Namibija", "name:sk"=>"Namíbia", "name:sl"=>"Namibija", "name:sn"=>"Namibia", "name:so"=>"Nambiya", "name:sq"=>"Namibia", "name:sr"=>"Намибија", "name:ss"=>"INamibiya", "name:st"=>"Namibia", "name:su"=>"Namibia", "name:sv"=>"Namibia", "name:sw"=>"Namibia", "name:ta"=>"நமீபியா", "name:te"=>"నమీబియా", "name:tg"=>"Намибия", "name:th"=>"ประเทศนามิเบีย", "name:ti"=>"ናሚቢያ", "name:tk"=>"Namibiýa", "name:tl"=>"Namibya", "name:tn"=>"Namibia", "name:tr"=>"Namibya", "name:ts"=>"Namibia", "name:tt"=>"Намибия", "name:ug"=>"نامىبىيە", "name:uk"=>"Намібія", "name:ur"=>"نمیبیا", "name:uz"=>"Namibiya", "name:ve"=>"Namibia", "name:vi"=>"Namibia", "name:vo"=>"Namibiyän", "name:wo"=>"Namibi", "name:yi"=>"נאמיביע", "name:yo"=>"Nàmíbíà", "name:zh"=>"纳米比亚", "name:zu"=>"INamibhiya"
-rw     "name"=>"Rwanda", "name:af"=>"Rwanda", "name:am"=>"ሩዋንዳ", "name:an"=>"Ruanda", "name:ar"=>"رواندا", "name:az"=>"Ruanda", "name:ba"=>"Руанда", "name:be"=>"Руанда", "name:bg"=>"Руанда", "name:bm"=>"Rwanda", "name:bn"=>"রুয়ান্ডা", "name:bo"=>"རུ་ཝན་ཌ།", "name:br"=>"Rwanda", "name:bs"=>"Ruanda", "name:ca"=>"Rwanda", "name:ce"=>"Руанда", "name:cs"=>"Rwanda", "name:cv"=>"Руанда", "name:cy"=>"Rwanda", "name:da"=>"Rwanda", "name:de"=>"Ruanda", "name:dv"=>"ރުވާންޑާ", "name:ee"=>"Rwanda", "name:el"=>"Ρουάντα", "name:en"=>"Rwanda", "name:eo"=>"Ruando", "name:es"=>"Ruanda", "name:et"=>"Rwanda", "name:eu"=>"Ruanda", "name:fa"=>"رواندا", "name:fi"=>"Ruanda", "name:fo"=>"Ruanda", "name:fr"=>"Rwanda", "name:fy"=>"Rûanda", "name:ga"=>"Ruanda", "name:gd"=>"Rubhanda", "name:gl"=>"Ruanda", "name:gv"=>"Rooandey", "name:he"=>"רואנדה", "name:hi"=>"रवाण्डा", "name:hr"=>"Ruanda", "name:ht"=>"Rwanda", "name:hu"=>"Ruanda", "name:hy"=>"Ռուանդա", "name:ia"=>"Ruanda", "name:id"=>"Rwanda", "name:ie"=>"Rwanda", "name:io"=>"Ruanda", "name:is"=>"Rúanda", "name:it"=>"Ruanda", "name:ja"=>"ルワンダ", "name:jv"=>"Rwanda", "name:ka"=>"რუანდა", "name:kg"=>"Rwanda", "name:ki"=>"Rwanda", "name:kk"=>"Руанда", "name:kn"=>"ರ್ವಾಂಡ", "name:ko"=>"르완다", "name:ku"=>"Rwanda", "name:kw"=>"Rwanda", "name:la"=>"Ruanda", "name:lb"=>"Ruanda", "name:li"=>"Rwanda", "name:ln"=>"Rwanda", "name:lt"=>"Ruanda", "name:lv"=>"Ruanda", "name:mk"=>"Руанда", "name:ml"=>"റുവാണ്ട", "name:mn"=>"Руанда", "name:mr"=>"ऱ्वान्डा", "name:ms"=>"Rwanda", "name:mt"=>"Rwanda", "name:my"=>"ရဝမ်ဒါနိုင်ငံ", "name:ne"=>"रुवाण्डा", "name:nl"=>"Rwanda", "name:nn"=>"Rwanda", "name:no"=>"Rwanda", "name:nv"=>"Wánda Dineʼé Bikéyah", "name:oc"=>"Rwanda", "name:or"=>"ରଵାଣ୍ଡା", "name:os"=>"Руандæ", "name:pa"=>"ਰਵਾਂਡਾ", "name:pl"=>"Rwanda", "name:ps"=>"راونډا", "name:pt"=>"Ruanda", "name:qu"=>"Rwanda", "name:rn"=>"Rwanda", "name:ro"=>"Rwanda", "name:ru"=>"Руанда", "name:rw"=>"Rwanda", "name:sa"=>"रवाण्डा", "name:sc"=>"Ruanda", "name:se"=>"Rwanda", "name:sg"=>"Ruandäa", "name:sh"=>"Ruanda", "name:si"=>"රුවන්ඩා ජනරජය", "name:sk"=>"Rwanda", "name:sl"=>"Ruanda", "name:sn"=>"Rwanda", "name:so"=>"Ruwanda", "name:sq"=>"Ruanda", "name:sr"=>"Руанда", "name:ss"=>"IRuwanda", "name:su"=>"Rwanda", "name:sv"=>"Rwanda", "name:sw"=>"Rwanda", "name:ta"=>"ருவாண்டா", "name:te"=>"రువాండా", "name:tg"=>"Руанда", "name:th"=>"ประเทศรวันดา", "name:ti"=>"ሩዋንዳ", "name:tk"=>"Ruanda", "name:tl"=>"Ruwanda", "name:tr"=>"Ruanda", "name:ts"=>"Rwanda", "name:tt"=>"Руанда", "name:ug"=>"رۋاندا", "name:uk"=>"Руанда", "name:ur"=>"روانڈا", "name:uz"=>"Ruanda", "name:vi"=>"Rwanda", "name:vo"=>"Ruandän", "name:wo"=>"Ruwandaa", "name:yi"=>"רוואנדע", "name:yo"=>"Rùwándà", "name:zh"=>"卢旺达", "name:zu"=>"IRuwanda"
-va     "name"=>"Civitas Vaticana", "name:af"=>"Vatikaanstad", "name:am"=>"ቫቲካን ከተማ", "name:an"=>"Ciudat d'o Vaticano", "name:ar"=>"الفاتيكان", "name:az"=>"Vatikan", "name:ba"=>"Ватикан", "name:be"=>"Ватыкан", "name:bg"=>"Ватикан", "name:bi"=>"Vatican Siti", "name:bn"=>"ভ্যাটিকান সিটি", "name:bo"=>"ཝ་ཏི་ཀན་གྲོང་ཁྱོར།", "name:br"=>"Keoded ar Vatikan", "name:bs"=>"Vatikan", "name:ca"=>"Ciutat del Vaticà", "name:ce"=>"Ватикан", "name:co"=>"Cità di u Vaticanu", "name:cs"=>"Vatikán", "name:cu"=>"Ватиканъ", "name:cv"=>"Ватикан", "name:cy"=>"Y Fatican", "name:da"=>"Vatikanstaten", "name:de"=>"Staat Vatikanstadt", "name:dv"=>"ވެޓިކަން ސިޓީ", "name:dz"=>"བ་ཊི་ཀཱན།", "name:ee"=>"Vatican City", "name:el"=>"Βατικανό", "name:en"=>"Vatican City", "name:eo"=>"Vatikano", "name:es"=>"Ciudad del Vaticano", "name:et"=>"Vatikan", "name:eu"=>"Vatikano Hiria", "name:fa"=>"واتیکان", "name:fi"=>"Vatikaanivaltio", "name:fo"=>"Vatikanið", "name:fr"=>"Cité du Vatican", "name:fy"=>"Fatikaanstêd", "name:ga"=>"Cathair na Vatacáine", "name:gd"=>"Cathair na Bhatacain", "name:gl"=>"Cidade do Vaticano", "name:gn"=>"Táva Vatikano", "name:gv"=>"Ard-valley yn Phaab", "name:he"=>"קריית הוותיקן", "name:hi"=>"वैटिकन सिटी", "name:hr"=>"Vatikan", "name:ht"=>"Vatikan", "name:hu"=>"Vatikán", "name:hy"=>"Վատիկան", "name:ia"=>"Citate Vatican", "name:id"=>"Vatikan", "name:ie"=>"Vaticano", "name:io"=>"Vatikano", "name:is"=>"Vatíkanið", "name:it"=>"Città del Vaticano", "name:ja"=>"バチカン", "name:jv"=>"Vatikan", "name:ka"=>"ვატიკანი", "name:kg"=>"Vatican", "name:kk"=>"Ватикан", "name:kl"=>"Vatikani", "name:km"=>"បុរីវ៉ាទីកង់", "name:kn"=>"ವ್ಯಾಟಿಕನ್ ನಗರ", "name:ko"=>"바티칸 시국", "name:ku"=>"Vatîkan", "name:kv"=>"Ватикан", "name:kw"=>"Cita Vatikan", "name:ky"=>"Ватикан", "name:la"=>"Status Civitatis Vaticanæ", "name:lb"=>"Vatikanstad", "name:li"=>"Vaticaanstad", "name:ln"=>"Vatikáni", "name:lt"=>"Vatikanas", "name:lv"=>"Vatikāns", "name:mi"=>"Poho o Pita", "name:mk"=>"Ватикан", "name:ml"=>"വത്തിക്കാൻ നഗരം", "name:mn"=>"Ватикан", "name:mr"=>"व्हॅटिकन सिटी", "name:ms"=>"Kota Vatican", "name:mt"=>"Belt tal-Vatikan", "name:my"=>"ဗာတီကန်စီးတီး", "name:na"=>"Batikan", "name:ne"=>"भ्याटिकन सिटी", "name:nl"=>"Vaticaanstad", "name:nn"=>"Vatikanstaten", "name:no"=>"Vatikanstaten", "name:nv"=>"Bádikin Sídii", "name:oc"=>"Vatican", "name:or"=>"ଭାଟିକାନ ସିଟି", "name:os"=>"Ватикан", "name:pa"=>"ਵੈਟੀਕਨ ਸ਼ਹਿਰ", "name:pl"=>"Watykan", "name:ps"=>"واټيکان ښار", "name:pt"=>"Vaticano", "name:qu"=>"Watikanu llaqta", "name:rm"=>"Citad dal Vatican", "name:ro"=>"Vatican", "name:ru"=>"Ватикан", "name:rw"=>"Vatikani", "name:sa"=>"वैटिकन", "name:sc"=>"Tzitade de su Vaticanu", "name:se"=>"Vatikána", "name:sh"=>"Vatikan", "name:si"=>"වතිකානුව", "name:sk"=>"Vatikán", "name:sl"=>"Vatikan", "name:so"=>"Faatikan", "name:sq"=>"Vatikani", "name:sr"=>"Ватикан", "name:ss"=>"IVathikhi", "name:su"=>"Vatikan", "name:sv"=>"Vatikanstaten", "name:sw"=>"Vatikani", "name:ta"=>"வத்திக்கான் நகர்", "name:te"=>"వాటికన్ నగరం", "name:tg"=>"Вотикон", "name:th"=>"นครรัฐวาติกัน", "name:tk"=>"Watikan", "name:tl"=>"Lungsod ng Vaticano", "name:tr"=>"Vatikan", "name:tt"=>"Ватикан", "name:ug"=>"Watikan Shehiri", "name:uk"=>"Ватикан", "name:ur"=>"ویٹیکن سٹی", "name:uz"=>"Vatikan shahri", "name:vi"=>"Thành Vatican", "name:vo"=>"Vatikän", "name:wo"=>"Watikaa", "name:yi"=>"וואטיקאן", "name:yo"=>"Ìlú Fatikan", "name:zh"=>"梵蒂冈", "name:zu"=>"Indolobha yaseVathikhani"
-ve     "name"=>"Venezuela", "name:af"=>"Venezuela", "name:am"=>"ቬኔዝዌላ", "name:an"=>"Venezuela", "name:ar"=>"فنزويلا", "name:av"=>"Венесуэла", "name:ay"=>"Winïxwila", "name:az"=>"Venesuela", "name:ba"=>"Венесуэла", "name:be"=>"Венесуэла", "name:bg"=>"Венецуела", "name:bi"=>"Venezuela", "name:bm"=>"Venezuela", "name:bn"=>"ভেনেজুয়েলা", "name:bo"=>"ཝེ་ནེ་ཟུའེ་ལ།", "name:br"=>"Venezuela", "name:bs"=>"Venecuela", "name:ca"=>"Veneçuela", "name:ce"=>"Венесуэла", "name:co"=>"Venezuela", "name:cs"=>"Venezuela", "name:cv"=>"Венесуэла", "name:cy"=>"Venezuela", "name:da"=>"Venezuela", "name:de"=>"Venezuela", "name:dv"=>"ވެނެޒުއޭލާ", "name:ee"=>"Venezuela", "name:el"=>"Βενεζουέλα", "name:en"=>"Venezuela", "name:eo"=>"Venezuelo", "name:es"=>"Venezuela", "name:et"=>"Venezuela", "name:eu"=>"Venezuela", "name:fa"=>"ونزوئلا", "name:fi"=>"Venezuela", "name:fo"=>"Venesuela", "name:fr"=>"Venezuela", "name:fy"=>"Fenezuëla", "name:ga"=>"Veiniséala", "name:gd"=>"A' Bheiniseala", "name:gl"=>"Venezuela", "name:gn"=>"Venesuéla", "name:gu"=>"વેનેઝુએલા", "name:gv"=>"Yn Veneswaaley", "name:he"=>"ונצואלה", "name:hi"=>"वेनेज़ुएला", "name:hr"=>"Venezuela", "name:ht"=>"Venezwela", "name:hu"=>"Venezuela", "name:hy"=>"Վենեսուելա", "name:ia"=>"Venezuela", "name:id"=>"Venezuela", "name:ie"=>"Venezuela", "name:io"=>"Venezuela", "name:is"=>"Venesúela", "name:it"=>"Venezuela", "name:ja"=>"ベネズエラ", "name:jv"=>"Venezuela", "name:ka"=>"ვენესუელა", "name:kk"=>"Венесуэла", "name:kn"=>"ವೆನೆಜುವೆಲಾ", "name:ko"=>"베네수엘라", "name:ku"=>"Venezuela", "name:kw"=>"Veneswela", "name:la"=>"Venetiola", "name:lb"=>"Venezuela", "name:li"=>"Venezuela", "name:ln"=>"Venezwela", "name:lt"=>"Venesuela", "name:lv"=>"Venecuēla", "name:mg"=>"Venezoela", "name:mi"=>"Wenehūera", "name:mk"=>"Венецуела", "name:ml"=>"വെനിസ്വേല", "name:mn"=>"Венесуэл", "name:mr"=>"व्हेनेझुएला", "name:ms"=>"Venezuela", "name:mt"=>"Veneżwela", "name:my"=>"ဗင်နီဇွဲလားနိုင်ငံ", "name:ne"=>"भेनेजुएला", "name:nl"=>"Venezuela", "name:nn"=>"Venezuela", "name:no"=>"Venezuela", "name:nv"=>"Táłkááʼ Bighan Dineʼé Bikéyah", "name:oc"=>"Veneçuèla", "name:or"=>"ଭେନେଜୁଏଲା", "name:os"=>"Венесуэлæ", "name:pa"=>"ਵੈਨੇਜ਼ੁਏਲਾ", "name:pl"=>"Wenezuela", "name:pt"=>"Venezuela", "name:qu"=>"Winisuyla", "name:rm"=>"Venezuela", "name:rn"=>"Venezuela", "name:ro"=>"Venezuela", "name:ru"=>"Венесуэла", "name:rw"=>"Venezuwela", "name:sa"=>"वेनेज्वेला", "name:se"=>"Venezuela", "name:sh"=>"Venezuela", "name:sk"=>"Venezuela", "name:sl"=>"Venezuela", "name:sm"=>"Venesuela", "name:so"=>"Fanansuwela", "name:sq"=>"Venezuela", "name:sr"=>"Венецуела", "name:su"=>"Vénézuéla", "name:sv"=>"Venezuela", "name:sw"=>"Venezuela", "name:ta"=>"வெனிசுவேலா", "name:tg"=>"Венесуэла", "name:th"=>"ประเทศเวเนซุเอลา", "name:tk"=>"Wenesuela", "name:tl"=>"Venezuela", "name:tr"=>"Venezuela", "name:tt"=>"Венесуэла", "name:ug"=>"ۋېنېسۇئېلا", "name:uk"=>"Венесуела", "name:ur"=>"وینیزویلا", "name:uz"=>"Venesuela", "name:ve"=>"Venezuela", "name:vi"=>"Venezuela", "name:vo"=>"Venesolän", "name:wa"=>"Venezwela", "name:wo"=>"Benesuwela", "name:yi"=>"ווענעזועלע", "name:yo"=>"Fenesuela", "name:zh"=>"委內瑞拉", "name:zu"=>"Venezuela"
-cc     "name"=>"Cocos (Keeling) Islands", "name:af"=>"Cocos (Keeling) Eilande", "name:ar"=>"جزر كوكوس (كيلينغ)", "name:be"=>"Какосавыя (Кілінг) астравы", "name:br"=>"Inizi Kokoz", "name:ca"=>"Illes Cocos", "name:da"=>"Cocosøerne", "name:de"=>"Kokosinseln", "name:el"=>"Νησιά Κόκος", "name:en"=>"Cocos (Keeling) Islands", "name:eo"=>"Kokosinsuloj", "name:es"=>"Islas Cocos (Keeling)", "name:et"=>"Kookossaared", "name:eu"=>"Cocos (Keeling) uharteak", "name:fa"=>"جزایر کوکوس", "name:fi"=>"Kookossaaret", "name:fr"=>"Îles Cocos", "name:fy"=>"de Kokoseilannen", "name:he"=>"איי קוקוס (קילינג)", "name:hr"=>"Kokosovi otoci", "name:hu"=>"Kókusz (Keeling)-szigetek", "name:id"=>"Kepulauan Cocos (Keeling)", "name:is"=>"Kókoseyjar", "name:it"=>"Isole Cocos e Keeling", "name:lt"=>"Kokoso (Keelingo) salos", "name:lv"=>"Kokosu (Kīlinga) salas", "name:mn"=>"Кокосын (Кийлингийн) Арлууд", "name:nl"=>"Cocoseilanden", "name:pl"=>"Wyspy Kokosowe", "name:ru"=>"Кокосовые острова", "name:sl"=>"Kokosovi otoki", "name:sv"=>"Kokosöarna", "name:tr"=>"Cocos (Keeling) Adaları", "name:uk"=>"Кокосові острови", "name:vi"=>"Quần đảo Cocos (Keeling)", "name:zh"=>"科科斯(基林)群島"
-sg     "name"=>"Singapore", "name:af"=>"Singapoer", "name:am"=>"ሲንጋፖር", "name:an"=>"Singapur", "name:ar"=>"سنغافورة", "name:az"=>"Sinqapur", "name:ba"=>"Сингапур", "name:be"=>"Сінгапур", "name:bg"=>"Сингапур", "name:bi"=>"Singapore", "name:bn"=>"সিঙ্গাপুর", "name:bo"=>"སེང་ག་ཕོར།", "name:br"=>"Singapour", "name:bs"=>"Singapur", "name:ca"=>"Singapur", "name:ce"=>"Сингапур", "name:cs"=>"Singapur", "name:cv"=>"Сингапур", "name:cy"=>"Singapore", "name:da"=>"Singapore", "name:de"=>"Singapur", "name:dv"=>"ސިންގަޕޫރު", "name:el"=>"Σιγκαπούρη", "name:en"=>"Singapore", "name:eo"=>"Singapuro", "name:es"=>"Singapur", "name:et"=>"Singapur", "name:eu"=>"Singapur", "name:fa"=>"سنگاپور", "name:ff"=>"Sinngapuur", "name:fi"=>"Singapore", "name:fo"=>"Singapor", "name:fr"=>"Singapour", "name:fy"=>"Singapoer", "name:ga"=>"Singeapór", "name:gd"=>"Singeapòr", "name:gl"=>"Singapur", "name:gu"=>"સિંગાપુર", "name:gv"=>"Singapore", "name:ha"=>"Singapore", "name:he"=>"סינגפור", "name:hi"=>"सिंगापुर", "name:hr"=>"Singapur", "name:ht"=>"Sengapou", "name:hu"=>"Szingapúr", "name:hy"=>"Սինգապուրի Հանրապետություն", "name:ia"=>"Singapur", "name:id"=>"Singapura", "name:ie"=>"Singapor", "name:io"=>"Singapur", "name:is"=>"Singapúr", "name:it"=>"Singapore", "name:ja"=>"シンガポール", "name:jv"=>"Singapura", "name:ka"=>"სინგაპური", "name:ki"=>"Singapore", "name:kk"=>"Сингапур", "name:kl"=>"Singapore", "name:km"=>"សិង្ហបុរី", "name:kn"=>"ಸಿಂಗಾಪುರ್", "name:ko"=>"싱가포르", "name:ku"=>"Singapûr", "name:kv"=>"Сингапур", "name:kw"=>"Singapour", "name:ky"=>"Сингапур", "name:la"=>"Singapura", "name:lb"=>"Singapur", "name:li"=>"Singapore", "name:ln"=>"Singapur", "name:lt"=>"Singapūras", "name:lv"=>"Singapūra", "name:mg"=>"Singapaoro", "name:mi"=>"Hingapoa", "name:mk"=>"Сингапур", "name:ml"=>"സിംഗപ്പൂർ", "name:mn"=>"Сингапур", "name:mr"=>"सिंगापूर", "name:ms"=>"Singapura", "name:mt"=>"Singapor", "name:my"=>"စင်ကာပူနိုင်ငံ", "name:na"=>"Tsingapoar", "name:ne"=>"सिंगापुर", "name:nl"=>"Singapore", "name:nn"=>"Singapore", "name:no"=>"Singapore", "name:nv"=>"Sį́ʼgaboo", "name:oc"=>"Singapor", "name:or"=>"ସିଙ୍ଗାପୁର", "name:os"=>"Сингапур", "name:pa"=>"ਸਿੰਘਾਪੁਰ", "name:pl"=>"Singapur", "name:ps"=>"سينګاپور", "name:pt"=>"Singapura", "name:qu"=>"Singapur", "name:ro"=>"Singapore", "name:ru"=>"Сингапур", "name:rw"=>"Singapore", "name:sa"=>"सिङ्गापुरम्", "name:se"=>"Singapore", "name:sg"=>"Sïngäpûru", "name:sh"=>"Singapur", "name:sk"=>"Singapur", "name:sl"=>"Singapur", "name:sm"=>"Sigapoa", "name:so"=>"Singabuur", "name:sq"=>"Singapori", "name:sr"=>"Сингапур", "name:ss"=>"ISingapholo", "name:su"=>"Singapura", "name:sv"=>"Singapore", "name:sw"=>"Singapuri", "name:ta"=>"சிங்கப்பூர்", "name:te"=>"సింగపూరు", "name:tg"=>"Сингапур", "name:th"=>"ประเทศสิงคโปร์", "name:tk"=>"Singapur", "name:tl"=>"Singapore", "name:tr"=>"Singapur", "name:tt"=>"Сингапур", "name:ug"=>"سىنگاپور", "name:uk"=>"Сінгапур", "name:ur"=>"سنگاپور", "name:uz"=>"Singapur", "name:vi"=>"Singapore", "name:vo"=>"Singapurän", "name:wo"=>"Singapoor", "name:yi"=>"סינגאפור", "name:yo"=>"Singapore", "name:zh"=>"新加坡"
-bo     "name"=>"Bolivia", "name:ab"=>"Боли́виа", "name:af"=>"Bolivië", "name:am"=>"ቦሊቪያ", "name:an"=>"Bolivia", "name:ar"=>"بوليفيا", "name:ay"=>"Wuliwya", "name:az"=>"Boliviya", "name:ba"=>"Боливия", "name:be"=>"Балі́вія", "name:bg"=>"Боливия", "name:bh"=>"बोलीविया", "name:bi"=>"Bolivia", "name:bm"=>"Bolivia", "name:bn"=>"বলিভিয়া", "name:bo"=>"བྷོ་ལི་ཝི་ཡ།", "name:br"=>"Bolivia", "name:bs"=>"Bolivija", "name:ca"=>"Bolívia", "name:ce"=>"Боливи", "name:co"=>"Bolivia", "name:cs"=>"Bolívie", "name:cv"=>"Боливи", "name:cy"=>"Bolifia", "name:da"=>"Bolivia", "name:de"=>"Bolivien", "name:dv"=>"ބޮލީވިއާ", "name:dz"=>"བོ་ལི་ཝིཡ", "name:ee"=>"Bolivia", "name:el"=>"Βολιβία", "name:en"=>"Bolivia", "name:eo"=>"Bolivio", "name:es"=>"Bolivia", "name:et"=>"Boliivia", "name:eu"=>"Bolivia", "name:fa"=>"بولیوی", "name:ff"=>"Boliwii", "name:fi"=>"Bolivia", "name:fo"=>"Bolivia", "name:fr"=>"Bolivie", "name:fy"=>"Bolivia", "name:ga"=>"an Bholaiv", "name:gd"=>"Boilibhia", "name:gl"=>"Bolivia", "name:gn"=>"Volívia", "name:gu"=>"બોલીવિયા", "name:gv"=>"yn Volivia", "name:ha"=>"Bolibiya", "name:he"=>"בוליביה", "name:hi"=>"बोलिविया", "name:hr"=>"Bolivija", "name:ht"=>"Bolivi", "name:hu"=>"Bolívia", "name:hy"=>"Բոլիվիան", "name:ia"=>"Bolivia", "name:id"=>"Bolivia", "name:ie"=>"Bolivia", "name:ig"=>"Bolivia", "name:io"=>"Bolivia", "name:is"=>"Bólivía", "name:it"=>"Bolivia", "name:ja"=>"ボリビア", "name:jv"=>"Bolivia", "name:ka"=>"ბოლივია", "name:kg"=>"Bolivia", "name:ki"=>"Bolivia", "name:kk"=>"Боли́вия", "name:kl"=>"Bolivia", "name:km"=>"បូលីវី", "name:kn"=>"ಬೊಲಿವಿಯ", "name:ko"=>"볼리비아", "name:ks"=>"بولِوِیا", "name:ku"=>"Bolîvya", "name:kw"=>"Bolivi", "name:ky"=>"Боливия", "name:la"=>"Bolivia", "name:lb"=>"Bolivien", "name:lg"=>"Boliviya", "name:li"=>"Bolivia", "name:ln"=>"Bolivia", "name:lo"=>"ໂບລີວີ", "name:lt"=>"Bolivija", "name:lv"=>"Bolīvija", "name:mg"=>"Bolivia", "name:mi"=>"Poriwia", "name:mk"=>"Боливија", "name:ml"=>"ബൊളീവിയ", "name:mn"=>"Боливи", "name:mr"=>"बोलिव्हिया", "name:ms"=>"Bolivia", "name:mt"=>"Bolivja", "name:my"=>"ဘိုလီးဗီးယားနိုင်ငံ", "name:na"=>"Boribiya", "name:ne"=>"बोलिभिया", "name:nl"=>"Bolivia", "name:nn"=>"Bolivia", "name:no"=>"Bolivia", "name:nv"=>"Bolíbiya", "name:oc"=>"Bolívia", "name:om"=>"Boliiviyaa", "name:or"=>"ବୋଲିଭିଆ", "name:os"=>"Боливи", "name:pa"=>"ਬੋਲੀਵੀਆ", "name:pi"=>"बोलिविया", "name:pl"=>"Boliwia", "name:ps"=>"بولېویا", "name:pt"=>"Bolívia", "name:qu"=>"Wuliwiya", "name:rm"=>"Bolivia", "name:rn"=>"Boliviya", "name:ro"=>"Bolivia", "name:ru"=>"Боливия", "name:rw"=>"Boliviya", "name:sa"=>"बोलिविया", "name:sc"=>"Bolìvia", "name:se"=>"Bolivia", "name:sg"=>"Bolivïi", "name:sh"=>"Bolivija", "name:si"=>"බොලීවියාව", "name:sk"=>"Bolívia", "name:sl"=>"Bolivija", "name:sm"=>"Polevia", "name:sn"=>"Bolivia", "name:so"=>"Boliifia", "name:sq"=>"Bolivia", "name:sr"=>"Боливија", "name:ss"=>"IBholiviya", "name:su"=>"Bolivia", "name:sv"=>"Bolivia", "name:sw"=>"Bolivia", "name:ta"=>"பொலிவியா", "name:te"=>"బొలీవియా", "name:tg"=>"Боливия", "name:th"=>"โบลิเวีย", "name:ti"=>"ቦሊቪያ", "name:tk"=>"Boliwiýa", "name:tl"=>"Bolivia", "name:to"=>"Polīvia", "name:tr"=>"Bolivya", "name:tt"=>"Боли́вия", "name:ug"=>"بولىۋىيە", "name:uk"=>"Болі́вія", "name:ur"=>"بولیویا", "name:uz"=>"Boliviya", "name:vi"=>"Bolivia", "name:vo"=>"Bolivän", "name:wa"=>"Boliveye", "name:wo"=>"Boliibi", "name:yi"=>"באליוויע", "name:yo"=>"Bòlífíà", "name:za"=>"Bolivia", "name:zh"=>"玻利维亚", "name:zu"=>"i-Bolivia"
-bw     "name"=>"Botswana", "name:af"=>"Botswana", "name:ak"=>"Bɔtswana", "name:am"=>"ቦትስዋና", "name:an"=>"Botswana", "name:ar"=>"بوتسوانا", "name:az"=>"Botsvana", "name:ba"=>"Ботсвана", "name:be"=>"Батсва́на", "name:bg"=>"Ботсвана", "name:bh"=>"बोत्सवाना", "name:bm"=>"Botswana", "name:bn"=>"বতসোয়ানা", "name:bo"=>"བྷོ་ཙི་ཝ་ན།", "name:br"=>"Botswana", "name:bs"=>"Bocvana", "name:ca"=>"Botswana", "name:ce"=>"Ботсвана", "name:cs"=>"Botswana", "name:cv"=>"Ботсвана", "name:cy"=>"Botswana", "name:da"=>"Botswana", "name:de"=>"Botsuana", "name:dv"=>"ބޮޓުސްވާނާ", "name:dz"=>"བྷོཙ་ཝ་ན", "name:ee"=>"Botswana", "name:el"=>"Μποτσουάνα", "name:en"=>"Botswana", "name:eo"=>"Bocvano", "name:es"=>"Botsuana", "name:et"=>"Botswana", "name:eu"=>"Botswana", "name:fa"=>"بوتسوانا", "name:ff"=>"Botswana", "name:fi"=>"Botswana", "name:fo"=>"Botsvana", "name:fr"=>"Botswana", "name:fy"=>"Botswana", "name:ga"=>"an Bhotsuáin", "name:gd"=>"Botsuana", "name:gl"=>"Botswana", "name:gn"=>"Votusuana", "name:gu"=>"બોત્સ્વાના", "name:gv"=>"yn Votswaan", "name:ha"=>"Botswana", "name:he"=>"בּוֹטְסְוָאנָה", "name:hi"=>"बोत्सवाना", "name:hr"=>"Bocvana", "name:ht"=>"Botswana", "name:hu"=>"Botswana", "name:hy"=>"Բոտսվանա", "name:ia"=>"Botswana", "name:id"=>"Botswana", "name:ie"=>"Botswana", "name:ig"=>"Botswana", "name:io"=>"Botswana", "name:is"=>"Botsvana", "name:it"=>"Botswana", "name:ja"=>"ボツワナ", "name:jv"=>"Botswana", "name:ka"=>"ბოტსვანა", "name:kg"=>"Botswana", "name:ki"=>"Botswana", "name:kk"=>"Ботсвана", "name:km"=>"បុតស្វាណា", "name:kn"=>"ಬೋಟ್ಸ್ವಾನ", "name:ko"=>"보츠와나", "name:ks"=>"بوتَسوانا", "name:ku"=>"Botswana", "name:kw"=>"Botswana", "name:ky"=>"Ботсвана", "name:la"=>"Botsuana", "name:lb"=>"Botswana", "name:lg"=>"Botswana", "name:li"=>"Botswana", "name:ln"=>"Botswana", "name:lo"=>"ບອດສະວານາ", "name:lt"=>"Botsvana", "name:lv"=>"Botsvana", "name:mg"=>"Bôtsoàna", "name:mi"=>"Poriwana", "name:mk"=>"Боцвана", "name:ml"=>"ബോട്സ്വാന", "name:mn"=>"Ботсвана", "name:mr"=>"बोत्स्वाना", "name:ms"=>"Botswana", "name:mt"=>"Botswana", "name:my"=>"ဘော့ဆွာနာ သမ္မတနိုင်ငံ", "name:na"=>"Botwana", "name:ne"=>"बोत्स्वाना", "name:nl"=>"Botswana", "name:nn"=>"Botswana", "name:no"=>"Botswana", "name:nv"=>"Tswana Dineʼé Bikéyah", "name:oc"=>"Botswana", "name:om"=>"Bootiswaanaa", "name:or"=>"ବୋସଚୱାନା", "name:os"=>"Ботсванæ", "name:pa"=>"ਬੋਤਸਵਾਨਾ", "name:pi"=>"बोत्सवाना", "name:pl"=>"Botswana", "name:ps"=>"بوتسوانا", "name:pt"=>"Botsuana", "name:qu"=>"Butswana", "name:rm"=>"Botswana", "name:ro"=>"Botswana", "name:ru"=>"Ботсвана", "name:rw"=>"Botswana", "name:sa"=>"बोत्सवाना", "name:sc"=>"Botzuana", "name:se"=>"Botswana", "name:sg"=>"Botswana", "name:sh"=>"Bocvana", "name:si"=>"බොට්ස්වානා", "name:sk"=>"Botswana", "name:sl"=>"Bocvána", "name:sn"=>"Botswana", "name:so"=>"Botswana", "name:sq"=>"Bocvana", "name:sr"=>"Боцвана", "name:ss"=>"ÉButjwána", "name:st"=>"Botswana", "name:su"=>"Botswana", "name:sv"=>"Botswana", "name:sw"=>"Botswana", "name:ta"=>"போட்சுவானா", "name:te"=>"బోత్సువానా", "name:tg"=>"Ботсвана", "name:th"=>"บอตสวานา", "name:ti"=>"ቦትስዋና", "name:tk"=>"Botswana", "name:tl"=>"Botswana", "name:tn"=>"Botswana", "name:to"=>"Potisiuana", "name:tr"=>"Botsvana", "name:ts"=>"Botswana", "name:tt"=>"Ботсва́на", "name:ug"=>"بوتسۋانا", "name:uk"=>"Ботсва́на", "name:ur"=>"بوٹسوانا", "name:uz"=>"Botsvana", "name:ve"=>"Vhu-Tswana", "name:vi"=>"Bốt-xoa-na", "name:vo"=>"Zvanän", "name:wa"=>"Boswana", "name:wo"=>"Botswana", "name:yi"=>"באצוואַנע", "name:yo"=>"Bòtswánà", "name:zh"=>"波札那", "name:zu"=>"i-Botswana"
-ke     "name"=>"Kenya", "name:af"=>"Kenia", "name:am"=>"ኬንያ", "name:an"=>"Kenia", "name:ar"=>"كينيا", "name:az"=>"Keniya", "name:ba"=>"Кения", "name:be"=>"Кенія", "name:bg"=>"Кения", "name:bm"=>"Kenya", "name:bn"=>"কেনিয়া", "name:bo"=>"ཁེ་ནི་ཡ།", "name:br"=>"Kenya", "name:bs"=>"Kenija", "name:ca"=>"Kenya", "name:ce"=>"Кени", "name:cs"=>"Keňa", "name:cv"=>"Кени", "name:cy"=>"Kenya", "name:da"=>"Kenya", "name:de"=>"Kenia", "name:dv"=>"ކެންޔާ", "name:dz"=>"ཀེ་ནི་ཡ་", "name:el"=>"Κένυα", "name:en"=>"Kenya", "name:eo"=>"Kenjo", "name:es"=>"Kenia", "name:et"=>"Keenia", "name:eu"=>"Kenya", "name:fa"=>"کنیا", "name:ff"=>"Kenya", "name:fi"=>"Kenia", "name:fo"=>"Kenja", "name:fr"=>"Kenya", "name:fy"=>"Kenya", "name:ga"=>"An Chéinia", "name:gd"=>"A' Cheinia", "name:gl"=>"Quenia - Kenya", "name:gu"=>"કેન્યા", "name:gv"=>"Yn Cheinney", "name:ha"=>"Kenya", "name:he"=>"קניה", "name:hi"=>"कीनिया", "name:hr"=>"Kenija", "name:ht"=>"Kenya", "name:hu"=>"Kenya", "name:hy"=>"Քենիա", "name:ia"=>"Kenya", "name:id"=>"Kenya", "name:ie"=>"Kenia", "name:io"=>"Kenia", "name:is"=>"Kenía", "name:it"=>"Kenya", "name:ja"=>"ケニア", "name:jv"=>"Kénya", "name:ka"=>"კენია", "name:kg"=>"Kenya", "name:ki"=>"Kenya", "name:kk"=>"Кения", "name:kl"=>"Kenya", "name:kn"=>"ಕೀನ್ಯಾ", "name:ko"=>"케냐", "name:ku"=>"Kenya", "name:kw"=>"Kenya", "name:la"=>"Kenia", "name:lb"=>"Kenia", "name:lg"=>"Kenya", "name:li"=>"Kenia", "name:ln"=>"Kénya", "name:lt"=>"Kenija", "name:lv"=>"Kenija", "name:mg"=>"Kenia", "name:mi"=>"Kēnia", "name:mk"=>"Кенија", "name:ml"=>"കെനിയ", "name:mn"=>"Кени", "name:mr"=>"केनिया", "name:ms"=>"Kenya", "name:mt"=>"Kenja", "name:my"=>"ကင်ညာနိုင်ငံ", "name:na"=>"Keniya", "name:nl"=>"Kenia", "name:nn"=>"Kenya", "name:no"=>"Kenya", "name:nv"=>"Kénya", "name:oc"=>"Kenya", "name:om"=>"Keeniyaa", "name:or"=>"କେନିଆ", "name:os"=>"Кени", "name:pa"=>"ਕੀਨੀਆ", "name:pl"=>"Kenia", "name:ps"=>"کېنيا", "name:pt"=>"Quénia", "name:qu"=>"Kinya", "name:ro"=>"Kenya", "name:ru"=>"Кения", "name:rw"=>"Kenya", "name:sa"=>"केन्या", "name:sc"=>"Kènya", "name:se"=>"Kenia", "name:sg"=>"Kenyäa", "name:sh"=>"Kenija", "name:sk"=>"Keňa", "name:sl"=>"Kenija", "name:sn"=>"Kenya", "name:so"=>"Kiinya", "name:sq"=>"Kenia", "name:sr"=>"Кенија", "name:ss"=>"IKheniya", "name:su"=>"Kénya", "name:sv"=>"Kenya", "name:sw"=>"Kenya", "name:ta"=>"கென்யா", "name:te"=>"కెన్యా", "name:tg"=>"Кения", "name:th"=>"ประเทศเคนยา", "name:ti"=>"ኬንያ", "name:tk"=>"Keniýa", "name:tl"=>"Kenya", "name:tr"=>"Kenya", "name:ts"=>"Kenya", "name:tt"=>"Кения", "name:ug"=>"كېنىيە", "name:uk"=>"Кенія", "name:ur"=>"کینیا", "name:uz"=>"Keniya", "name:vi"=>"Kenya", "name:vo"=>"Kenyän", "name:wo"=>"Keeñaa", "name:yi"=>"קעניע", "name:yo"=>"Kẹ́nyà", "name:zh"=>"肯尼亚", "name:zu"=>"IKenya"
-tj     "name"=>"Тоҷикистон", "name:af"=>"Tadjikistan", "name:am"=>"ታጂኪስታን", "name:an"=>"Tachiquistán", "name:ar"=>"طاجيكستان", "name:ay"=>"Tayiksuyu", "name:az"=>"Tacikistan", "name:ba"=>"Тажикстан", "name:be"=>"Таджыкістан", "name:bg"=>"Таджикистан", "name:bn"=>"তাজিকিস্তান", "name:bo"=>"ཐ་ཇི་ཁེ་སི་ཏན།", "name:br"=>"Tadjikistan", "name:bs"=>"Tadžikistan", "name:ca"=>"Tadjikistan", "name:ce"=>"Таджикистан", "name:cs"=>"Tádžikistán", "name:cu"=>"Таджикистанъ", "name:cv"=>"Таджикистан", "name:cy"=>"Tajikistan", "name:da"=>"Tadsjikistan", "name:de"=>"Tadschikistan", "name:dv"=>"ތަޖިކިސްތާން", "name:dz"=>"ཏ་ཇག་ཀིསི་ཏཱན་", "name:ee"=>"Tajikistan", "name:el"=>"Τατζικιστάν", "name:en"=>"Tajikistan", "name:eo"=>"Taĝikio", "name:es"=>"Tayikistán", "name:et"=>"Tadžikistan", "name:eu"=>"Tajikistan", "name:fa"=>"تاجیکستان", "name:fi"=>"Tadžikistan", "name:fo"=>"Tadsjikistan", "name:fr"=>"Tadjikistan", "name:fy"=>"Tadzjikistan", "name:ga"=>"An Táidsíceastáin", "name:gd"=>"Taidigeastàn", "name:gl"=>"Taxiquistán", "name:gu"=>"તાજિકિસ્તાન", "name:gv"=>"Yn Tajikistaan", "name:he"=>"טג'יקיסטן", "name:hi"=>"ताजिकिस्तान", "name:hr"=>"Tadžikistan", "name:ht"=>"Tadjikistan", "name:hu"=>"Tádzsikisztán", "name:hy"=>"Տաջիկստան", "name:ia"=>"Tajikistan", "name:id"=>"Tajikistan", "name:ie"=>"Tadjikistan", "name:io"=>"Tajikistan", "name:is"=>"Tadsjikistan", "name:it"=>"Tagikistan", "name:ja"=>"タジキスタン", "name:jv"=>"Tajikistan", "name:ka"=>"ტაჯიკეთი", "name:kk"=>"Тәжікстан", "name:km"=>"តាជីគីស្ថាន", "name:kn"=>"ತಜಿಕಿಸ್ತಾನ್", "name:ko"=>"타지키스탄", "name:ku"=>"Tacîkistan", "name:kv"=>"Таджикистан", "name:kw"=>"Pow Tajik", "name:ky"=>"Тажикстан", "name:la"=>"Tadzikistania", "name:lb"=>"Tadjikistan", "name:li"=>"Tadzjikistan", "name:lt"=>"Tadžikija", "name:lv"=>"Tadžikistāna", "name:mk"=>"Таџикистан", "name:ml"=>"താജിക്കിസ്ഥാൻ", "name:mn"=>"Тажикистан", "name:mr"=>"ताजिकिस्तान", "name:ms"=>"Tajikistan", "name:my"=>"တာဂျစ်ကစ္စတန်နိုင်ငံ", "name:na"=>"Tadjikitan", "name:nl"=>"Tadzjikistan", "name:nn"=>"Tadsjikistan", "name:no"=>"Tadsjikistan", "name:nv"=>"Tʼajiʼ Bikéyah", "name:oc"=>"Tatgiquistan", "name:or"=>"ତାଜିକିସ୍ତାନ", "name:os"=>"Таджикистан", "name:pl"=>"Tadżykistan", "name:ps"=>"تاجيکستان", "name:pt"=>"Tajiquistão", "name:qu"=>"Tayiksuyu", "name:ro"=>"Tadjikistan", "name:ru"=>"Таджикистан", "name:rw"=>"Tajikisitani", "name:sa"=>"ताजिकिस्थान", "name:se"=>"Tažikistan", "name:sh"=>"Tadžikistan", "name:si"=>"ටජිකිස්ථාන්", "name:sk"=>"Tadžikistan", "name:sl"=>"Tadžikistan", "name:so"=>"Tadsjikistan", "name:sq"=>"Taxhikistani", "name:sr"=>"Таџикистан", "name:ss"=>"IThajiki", "name:su"=>"Tajikistan", "name:sv"=>"Tadzjikistan", "name:sw"=>"Tajikistan", "name:ta"=>"தஜிகிஸ்தான்", "name:te"=>"తజికిస్తాన్", "name:tg"=>"Тоҷикистон", "name:th"=>"ประเทศทาจิกิสถาน", "name:tk"=>"Täjigistan", "name:tl"=>"Tayikistan", "name:tr"=>"Tacikistan", "name:tt"=>"Таҗикстан", "name:ug"=>"تاجىكىستان", "name:uk"=>"Таджикистан", "name:ur"=>"تاجکستان", "name:uz"=>"Tojikiston", "name:vi"=>"Tajikistan", "name:vo"=>"Tacikistän", "name:wo"=>"Tajikistaan", "name:yi"=>"טאדזשיקיסטאן", "name:yo"=>"Tajikistan", "name:zh"=>"塔吉克斯坦"
-tz     "name"=>"Tanzania", "name:af"=>"Tanzanië", "name:ak"=>"Tanzania", "name:am"=>"ታንዛኒያ", "name:an"=>"Tanzania", "name:ar"=>"تنزانيا", "name:az"=>"Tanzaniya", "name:ba"=>"Танзания", "name:be"=>"Танзанія", "name:bg"=>"Танзания", "name:bm"=>"Tanzania", "name:bn"=>"তানজানিয়া", "name:bo"=>"ཏན་ཛ་ནི་ཡ།", "name:br"=>"Tanzania", "name:bs"=>"Tanzanija", "name:ca"=>"Tanzània", "name:ce"=>"Танзани", "name:cs"=>"Tanzanie", "name:cv"=>"Танзани", "name:cy"=>"Tanzania", "name:da"=>"Tanzania", "name:de"=>"Tansania", "name:dv"=>"ޓެންޒޭނިއާ", "name:ee"=>"Tanzania", "name:el"=>"Τανζανία", "name:en"=>"Tanzania", "name:eo"=>"Tanzanio", "name:es"=>"Tanzania", "name:et"=>"Tansaania", "name:eu"=>"Tanzania", "name:fa"=>"تانزانیا", "name:fi"=>"Tansania", "name:fo"=>"Tansania", "name:fr"=>"Tanzanie", "name:fy"=>"Tanzania", "name:ga"=>"An Tansáin", "name:gd"=>"Tansainìa", "name:gl"=>"Tanzania", "name:gu"=>"ટાન્ઝાનિયા", "name:gv"=>"Tanzania", "name:he"=>"טנזניה", "name:hi"=>"तंज़ानिया", "name:hr"=>"Tanzanija", "name:ht"=>"Tanzani", "name:hu"=>"Tanzánia", "name:hy"=>"Տանզանիա", "name:ia"=>"Tanzania", "name:id"=>"Tanzania", "name:ie"=>"Tanzania", "name:io"=>"Tanzania", "name:is"=>"Tansanía", "name:it"=>"Tanzania", "name:ja"=>"タンザニア", "name:jv"=>"Tanzania", "name:ka"=>"ტანზანია", "name:kg"=>"Tanzania", "name:ki"=>"Tanzania", "name:kk"=>"Танзания", "name:kl"=>"Tanzania", "name:kn"=>"ಟಾಂಜಾನಿಯ", "name:ko"=>"탄자니아", "name:ku"=>"Tanzanya", "name:kw"=>"Tanzania", "name:la"=>"Tanzania", "name:lb"=>"Tansania", "name:li"=>"Tanzania", "name:ln"=>"Tanzania", "name:lt"=>"Tanzanija", "name:lv"=>"Tanzānija", "name:mg"=>"Tanzania", "name:mi"=>"Tānahia", "name:mk"=>"Танзанија", "name:ml"=>"ടാൻസാനിയ", "name:mn"=>"Танзани", "name:mr"=>"टांझानिया", "name:ms"=>"Tanzania", "name:mt"=>"Tanżanija", "name:my"=>"တန်ဇေးနီးယားနိုင်ငံ", "name:ne"=>"तन्जानिया", "name:nl"=>"Tanzania", "name:nn"=>"Tanzania", "name:no"=>"Tanzania", "name:nv"=>"Tʼanzanííya", "name:ny"=>"Tanzania", "name:oc"=>"Tanzania", "name:om"=>"Tanzania", "name:or"=>"ତାଞ୍ଜାନିଆ", "name:os"=>"Танзани", "name:pa"=>"ਤਨਜ਼ਾਨੀਆ", "name:pl"=>"Tanzania", "name:pt"=>"Tanzânia", "name:qu"=>"Tansanya", "name:rm"=>"Tansania", "name:rn"=>"Tanzaniya", "name:ro"=>"Tanzania", "name:ru"=>"Танзания", "name:rw"=>"Tanzaniya", "name:sa"=>"टंजानिया", "name:sc"=>"Tanzània", "name:se"=>"Tanzania", "name:sg"=>"Tanzanïi", "name:sh"=>"Tanzanija", "name:sk"=>"Tanzánia", "name:sl"=>"Tanzanija", "name:sn"=>"Tanzania", "name:so"=>"Tansaaniya", "name:sq"=>"Tanzania", "name:sr"=>"Танзанија", "name:ss"=>"IThanzaniya", "name:st"=>"Tanzania", "name:su"=>"Tanzania", "name:sv"=>"Tanzania", "name:sw"=>"Tanzania", "name:ta"=>"தன்சானியா", "name:te"=>"టాంజానియా", "name:tg"=>"Танзания", "name:th"=>"ประเทศแทนซาเนีย", "name:ti"=>"ታንዛኒያ", "name:tk"=>"Tanzaniýa", "name:tl"=>"Tanzania", "name:tr"=>"Tanzanya", "name:ts"=>"Tanzania", "name:tt"=>"Танзания", "name:tw"=>"Tanzania", "name:ug"=>"تانزانىيە", "name:uk"=>"Танзанія", "name:ur"=>"تنزانیہ", "name:uz"=>"Tanzaniya", "name:vi"=>"Tanzania", "name:vo"=>"Tansanän", "name:wo"=>"Tansani", "name:yi"=>"טאנזאניע", "name:yo"=>"Tànsáníà", "name:zh"=>"坦桑尼亚", "name:zu"=>"ITanzania"
-ws     "name"=>"Sāmoa", "name:am"=>"ሳሞአ", "name:ar"=>"ساموا", "name:be"=>"Самоа", "name:bg"=>"Самоа", "name:bm"=>"Samowa", "name:bn"=>"সামোয়া", "name:bo"=>"ནུ་བ་ས་མོ་འ།", "name:br"=>"Samoa", "name:ca"=>"Samoa", "name:cs"=>"Samoa", "name:da"=>"Samoa", "name:de"=>"Samoa", "name:dz"=>"ས་མོ་ཨ", "name:ee"=>"Samoa nutome", "name:el"=>"Σαμόα", "name:en"=>"Samoa", "name:eo"=>"Samoo", "name:es"=>"Samoa", "name:et"=>"Samoa", "name:fa"=>"ساموآ", "name:ff"=>"Samowaa", "name:fi"=>"Samoa", "name:fo"=>"Sámoa", "name:fr"=>"Samoa", "name:fy"=>"Samoä", "name:ga"=>"Samó", "name:gd"=>"Samotha", "name:gu"=>"સમોઆ", "name:gv"=>"Samoa", "name:ha"=>"Samowa", "name:he"=>"סמואה", "name:hi"=>"समोआ", "name:hr"=>"Samoa", "name:hu"=>"Szamoa", "name:hy"=>"Սամոա", "name:ia"=>"Samoa", "name:io"=>"Samoa", "name:is"=>"Samóa", "name:it"=>"Samoa", "name:ja"=>"サモア", "name:ka"=>"სამოა", "name:km"=>"សាមូអា", "name:kn"=>"ಸಮೋವಾ", "name:ko"=>"사모아", "name:ks"=>"سیمووا", "name:ku"=>"Samoa", "name:lg"=>"Samowa", "name:li"=>"Samoa", "name:lo"=>"ຊາມົວ", "name:lv"=>"Samoa", "name:mi"=>"Hāmoa", "name:mk"=>"Самоа", "name:ml"=>"സാമോവ", "name:mn"=>"Самоа", "name:mr"=>"सामोआ", "name:ne"=>"सामोआ", "name:nl"=>"Samoa", "name:no"=>"Samoa", "name:or"=>"ସାମୋଆ", "name:pl"=>"Samoa", "name:rn"=>"Samowa", "name:ru"=>"Самоа", "name:se"=>"Samoa", "name:sg"=>"Samoäa", "name:si"=>"සැමෝවා", "name:sk"=>"Samoa", "name:sl"=>"Samoa", "name:sr"=>"Самоа", "name:sv"=>"Samoa", "name:ta"=>"சமோவா", "name:te"=>"సమోవా", "name:th"=>"ประเทศซามัว", "name:ti"=>"ሳሞአ", "name:to"=>"Haʻamoa", "name:uk"=>"Самоа", "name:ur"=>"ساموآ", "name:vo"=>"Samovuäns", "name:yo"=>"Orílẹ́ède Samọ", "name:zh"=>"萨摩亚", "name:zu"=>"i-Samoa"
-la     "name"=>"ປະເທດລາວ", "name:af"=>"Laos", "name:am"=>"ላዎስ", "name:an"=>"Laos", "name:ar"=>"لاوس", "name:az"=>"Laos", "name:ba"=>"Лаос", "name:be"=>"Лаос", "name:bg"=>"Лаос", "name:bi"=>"Laos", "name:bn"=>"লাওস", "name:bo"=>"ལའོ་སུ།", "name:br"=>"Laos", "name:bs"=>"Laos", "name:ca"=>"Laos", "name:ce"=>"Лаос", "name:cs"=>"Laos", "name:cv"=>"Лаос", "name:cy"=>"Laos", "name:da"=>"Laos", "name:de"=>"Laos", "name:dv"=>"ލާއޯސް", "name:el"=>"Λάος", "name:en"=>"Laos", "name:eo"=>"Laoso", "name:es"=>"Laos", "name:et"=>"Laos", "name:eu"=>"Laos", "name:fa"=>"لائوس", "name:fi"=>"Laos", "name:fo"=>"Laos", "name:fr"=>"Laos", "name:fy"=>"Laos", "name:ga"=>"Laos", "name:gd"=>"Làthos", "name:gl"=>"Laos", "name:gu"=>"લાઓસ", "name:gv"=>"Yn Laos", "name:he"=>"לאוס", "name:hi"=>"लाओस", "name:hr"=>"Laos", "name:ht"=>"Laos", "name:hu"=>"Laosz", "name:hy"=>"Լաոս", "name:ia"=>"Laos", "name:id"=>"Laos", "name:ie"=>"Laos", "name:io"=>"Laos", "name:is"=>"Laos", "name:it"=>"Laos", "name:ja"=>"ラオス", "name:jv"=>"Laos", "name:ka"=>"ლაოსი", "name:ki"=>"Laos", "name:kk"=>"Лаос", "name:km"=>"ឡាវ", "name:kn"=>"ಲಾವೋಸ್", "name:ko"=>"라오스", "name:ku"=>"Laos", "name:kv"=>"Лаос", "name:kw"=>"Pow Lao", "name:la"=>"Laotia", "name:lb"=>"Laos", "name:li"=>"Laos", "name:ln"=>"Laos", "name:lo"=>"ປະເທດລາວ", "name:lt"=>"Laosas", "name:lv"=>"Laosa", "name:mi"=>"Rāoho", "name:mk"=>"Лаос", "name:ml"=>"ലാവോസ്", "name:mn"=>"Лаос", "name:mr"=>"लाओस", "name:ms"=>"Laos", "name:my"=>"လာအိုနိုင်ငံ", "name:na"=>"Raot", "name:nl"=>"Laos", "name:nn"=>"Laos", "name:no"=>"Laos", "name:nv"=>"Lááʼos", "name:oc"=>"Laos", "name:or"=>"ଲାଓସ", "name:os"=>"Лаос", "name:pa"=>"ਲਾਓਸ", "name:pl"=>"Laos", "name:ps"=>"لاووس", "name:pt"=>"Laos", "name:qu"=>"Law suyu", "name:ro"=>"Laos", "name:ru"=>"Лаос", "name:rw"=>"Lawosi", "name:sa"=>"लाओस", "name:se"=>"Laos", "name:sh"=>"Laos", "name:si"=>"ලාඕසය", "name:sk"=>"Laos", "name:sl"=>"Laos", "name:so"=>"Laos", "name:sq"=>"Laosi", "name:sr"=>"Лаос", "name:ss"=>"ILawoso", "name:su"=>"Laos", "name:sv"=>"Laos", "name:sw"=>"Laos", "name:ta"=>"லாவோஸ்", "name:te"=>"లావోస్", "name:tg"=>"Лаос", "name:th"=>"ประเทศลาว", "name:tk"=>"Laos", "name:tl"=>"Laos", "name:tr"=>"Laos", "name:tt"=>"Лаос", "name:ug"=>"لائوس", "name:uk"=>"Лаос", "name:ur"=>"لاؤس", "name:uz"=>"Laos", "name:vi"=>"Lào", "name:vo"=>"Laosän", "name:wo"=>"Réewum Lawos", "name:yo"=>"Láọ̀s", "name:za"=>"Lao", "name:zh"=>"老挝/寮國"
-ru     "name"=>"Россия", "name:ab"=>"Урыстәыла", "name:af"=>"Rusland", "name:ak"=>"Russia", "name:am"=>"ሩሲያ", "name:an"=>"Rusia", "name:ar"=>"روسيا", "name:as"=>"ৰুশিযা", "name:av"=>"Россиялъул Федерация", "name:ay"=>"Rusiya", "name:az"=>"Rusiya", "name:ba"=>"Рәсәй", "name:be"=>"Расія", "name:bg"=>"Русия", "name:bi"=>"Rusia", "name:bm"=>"Risila", "name:bn"=>"রাশিয়া", "name:bo"=>"ཨུ་རུ་སུ།", "name:br"=>"Rusia", "name:bs"=>"Rusija", "name:ca"=>"Rússia", "name:ce"=>"Росси", "name:ch"=>"Russia", "name:co"=>"Russia", "name:cs"=>"Rusko", "name:cu"=>"Рѡсїꙗ", "name:cv"=>"Раççей Патшалăхĕ", "name:cy"=>"Rwsia", "name:da"=>"Rusland", "name:de"=>"Russland", "name:dv"=>"ރޫސީވިލާތް", "name:dz"=>"ར་ཤི་ཡཱན་ཕེ་ཌི་རེ་ཤཱན", "name:ee"=>"Russia", "name:el"=>"Ρωσία", "name:en"=>"Russia", "name:eo"=>"Rusio", "name:es"=>"Rusia", "name:et"=>"Venemaa", "name:eu"=>"Errusia", "name:fa"=>"روسیه", "name:ff"=>"Roosiya", "name:fi"=>"Venäjä", "name:fo"=>"Russland", "name:fr"=>"Russie", "name:fy"=>"Ruslân", "name:ga"=>"An Rúis", "name:gd"=>"An Ruis", "name:gl"=>"Rusia", "name:gn"=>"Rrúsia", "name:gu"=>"રશિયા", "name:gv"=>"Yn Roosh", "name:ha"=>"Rasha", "name:he"=>"רוסיה", "name:hi"=>"रूस", "name:hr"=>"Ruska Federacija", "name:ht"=>"Risi", "name:hu"=>"Oroszország", "name:hy"=>"Ռուսաստան", "name:ia"=>"Russia", "name:id"=>"Rusia", "name:ie"=>"Russia", "name:ig"=>"Mpaghara Russia", "name:ik"=>"Russia", "name:io"=>"Rusia", "name:is"=>"Rússland", "name:it"=>"Russia", "name:iu"=>"ᐅᓛᓴ", "name:ja"=>"ロシア", "name:jv"=>"Rusia", "name:ka"=>"რუსეთი", "name:kg"=>"Rusia", "name:ki"=>"Russia", "name:kk"=>"Ресей", "name:kl"=>"Ruslandi", "name:km"=>"រុស្ស៊ី", "name:kn"=>"ರಷ್ಯಾ", "name:ko"=>"러시아", "name:ks"=>"روٗس", "name:ku"=>"Rûsya", "name:kv"=>"Рочму", "name:kw"=>"Russi", "name:ky"=>"Орусия", "name:la"=>"Russia", "name:lb"=>"Russland", "name:lg"=>"Rwasha", "name:li"=>"Rusland", "name:ln"=>"Rusí", "name:lo"=>"ລັດເຊັຽ", "name:lt"=>"Rusija", "name:lv"=>"Krievija", "name:mg"=>"Rosia", "name:mi"=>"Ruhia", "name:mk"=>"Русија", "name:ml"=>"റഷ്യ", "name:mn"=>"Оросын Холбооны Улс", "name:mo"=>"Русия", "name:mr"=>"रशिया", "name:ms"=>"Rusia", "name:mt"=>"Russja", "name:my"=>"ရုရှားနိုင်ငံ", "name:na"=>"Ratsiya", "name:ne"=>"रुस", "name:nl"=>"Rusland", "name:nn"=>"Russland", "name:no"=>"Russland", "name:nv"=>"Biʼééʼ Łichííʼí Bikéyah", "name:ny"=>"Russia", "name:oc"=>"Russia", "name:om"=>"Raashiyaa", "name:or"=>"ଋଷିଆ", "name:os"=>"Уæрæсе", "name:pa"=>"ਰੂਸ", "name:pl"=>"Rosja", "name:ps"=>"روسیه", "name:pt"=>"Rússia", "name:qu"=>"Rusiya", "name:rm"=>"Russia", "name:rn"=>"Uburusiya", "name:ro"=>"Rusia", "name:ru"=>"Россия", "name:rw"=>"Uburusiya", "name:sc"=>"Rùssia", "name:sd"=>"روس", "name:se"=>"Ruošša", "name:sg"=>"Rusïi", "name:sh"=>"Rusija", "name:si"=>"රුසියාව", "name:sk"=>"Rusko", "name:sl"=>"Rusija", "name:sm"=>"Lusia", "name:sn"=>"Russia", "name:so"=>"Ruushka", "name:sq"=>"Rusia", "name:sr"=>"Русија", "name:ss"=>"IRashiya", "name:st"=>"Russia", "name:su"=>"Rusia", "name:sv"=>"Ryssland", "name:sw"=>"Shirikisho la Urusi", "name:ta"=>"உருசியா", "name:te"=>"రష్యా", "name:tg"=>"Русия", "name:th"=>"ประเทศรัสเซีย", "name:ti"=>"ራሻ", "name:tk"=>"Russiýa", "name:tl"=>"Pederasyong Ruso", "name:to"=>"Lūsia", "name:tr"=>"Rusya Federasyonu", "name:ts"=>"Russia", "name:tt"=>"Русия", "name:tw"=>"Russia", "name:ty"=>"Rūtia", "name:ug"=>"روسىيە", "name:uk"=>"Росія", "name:ur"=>"روس", "name:uz"=>"Rossiya Federatsiyasi", "name:ve"=>"Rashia", "name:vi"=>"Liên bang Nga", "name:vo"=>"Rusän", "name:wa"=>"Federåcion d' Rûsseye", "name:wo"=>"Federaasioŋ bu Riisi", "name:xh"=>"IRashiya", "name:yi"=>"רוסלאנד", "name:yo"=>"Rọ́síà", "name:za"=>"Ezlozswh Lienzbangh", "name:zh"=>"俄罗斯/俄羅斯", "name:zu"=>"IRashiya"
-bg     "name"=>"Бългaрия", "name:ab"=>"Болга́риа", "name:af"=>"Bulgarye", "name:ak"=>"Bulgaria", "name:am"=>"ቡልጋሪያ", "name:an"=>"Bulgaria", "name:ar"=>"بلغاريا", "name:av"=>"Болга́рия", "name:ay"=>"Bulkariya", "name:az"=>"Bolqarıstan", "name:ba"=>"Болга́рия", "name:be"=>"Балга́рыя", "name:bg"=>"България", "name:bh"=>"बुल्गारिया", "name:bi"=>"Bulgaria", "name:bn"=>"বুলগেরিয়া", "name:bo"=>"པུ་ར་ག་རི་ཡ།", "name:br"=>"Bulgaria", "name:bs"=>"Bugarska", "name:ca"=>"Bulgària", "name:ce"=>"Болга́ри", "name:ch"=>"Bulgaria", "name:co"=>"Bulgaria", "name:cs"=>"Bulharsko", "name:cu"=>"Блъгарїꙗ", "name:cv"=>"Пăлхарĕ", "name:cy"=>"Bwlgaria", "name:da"=>"Bulgarien", "name:de"=>"Bulgarien", "name:dv"=>"ބަލްގޭރިއާ", "name:ee"=>"Bulgaria", "name:el"=>"Βουλγαρία", "name:en"=>"Bulgaria", "name:eo"=>"Bulgario", "name:es"=>"Bulgaria", "name:et"=>"Bulgaaria", "name:eu"=>"Bulgaria", "name:fa"=>"بلغارستان", "name:ff"=>"Bulgariya", "name:fi"=>"Bulgaria", "name:fo"=>"Bulgaria", "name:fr"=>"Bulgarie", "name:fy"=>"Bulgarije", "name:ga"=>"an Bhulgáir", "name:gd"=>"Bulgàiria", "name:gl"=>"Bulgaria", "name:gn"=>"Vugaria", "name:gu"=>"બલ્ગેરિયા", "name:gv"=>"yn Vulgeyr", "name:ha"=>"Bulgairiya", "name:he"=>"בּוּלְגַרְיָה", "name:hi"=>"बुल्गारिया", "name:hr"=>"Bugarska", "name:ht"=>"Bilgari", "name:hu"=>"Bulgária", "name:hy"=>"Բուլղարիա", "name:ia"=>"Bulgaria", "name:id"=>"Bulgaria", "name:ie"=>"Bulgaria", "name:ig"=>"Bulgaria", "name:io"=>"Bulgaria", "name:is"=>"Búlgaría", "name:it"=>"Bulgaria", "name:ja"=>"ブルガリア", "name:jv"=>"Bulgaria", "name:ka"=>"ბულგარეთი", "name:kg"=>"Balgaria", "name:kk"=>"Болгария", "name:kl"=>"Bulgaria", "name:kn"=>"ಬಲ್ಗೇರಿಯ", "name:ko"=>"불가리아", "name:ku"=>"Bulgaristan", "name:kv"=>"Болгария", "name:kw"=>"Bulgari", "name:ky"=>"Болгария", "name:la"=>"Bulgaria", "name:lb"=>"Bulgarien", "name:li"=>"Bölgarije", "name:ln"=>"Bulgaria", "name:lo"=>"ປະເທດບູນກາລີ", "name:lt"=>"Bulgarija", "name:lv"=>"Bulgārija", "name:mg"=>"Biolgaria", "name:mi"=>"Purukāria", "name:mk"=>"Бугарија", "name:ml"=>"ബൾഗേറിയ", "name:mn"=>"Болгар", "name:mr"=>"बल्गेरिया", "name:ms"=>"Bulgaria", "name:mt"=>"Bulgarija", "name:my"=>"ဘူလ်ဂေးရီးယားနိုင်ငံ", "name:na"=>"Borgeriya", "name:ne"=>"बुल्गेरिया", "name:nl"=>"Bulgarije", "name:nn"=>"Bulgaria", "name:no"=>"Bulgaria", "name:nv"=>"Bálgaa Bikéyah", "name:oc"=>"Bulgaria", "name:om"=>"Bulgeeriyaa", "name:or"=>"ବୁଲଗାରିଆ", "name:os"=>"Болгари", "name:pa"=>"ਬੁਲਗਾਰੀਆ", "name:pi"=>"बुल्गारिया", "name:pl"=>"Bułgaria", "name:ps"=>"بلغاریا", "name:pt"=>"Bulgária", "name:qu"=>"Bulgarya", "name:rm"=>"Bulgaria", "name:rn"=>"Bulgaria", "name:ro"=>"Bulgaria", "name:ru"=>"Болгария", "name:rw"=>"Bulugariya", "name:sa"=>"बुल्गारिया", "name:sc"=>"Bulgaria", "name:sd"=>"بلغاريه", "name:se"=>"Bulgária", "name:sg"=>"Bulugarïi", "name:sh"=>"Bugarska", "name:si"=>"බල්ගේරියාව", "name:sk"=>"Bulharsko", "name:sl"=>"Bolgarija", "name:sm"=>"Bultalia", "name:sn"=>"Bulgaria", "name:so"=>"Bulgaria", "name:sq"=>"Bullgaria", "name:sr"=>"Бугарска", "name:ss"=>"iBhulgariya", "name:su"=>"Bulgaria", "name:sv"=>"Bulgarien", "name:sw"=>"Bulgaria", "name:ta"=>"பல்கேரியா", "name:te"=>"బల్గేరియా", "name:tg"=>"Булғористон", "name:th"=>"บัลแกเรีย", "name:tk"=>"Bolgariýa", "name:tl"=>"Bulgarya", "name:tr"=>"Bulgaristan", "name:ts"=>"Bulgaria", "name:tt"=>"Болгария", "name:tw"=>"Bulgaria", "name:ug"=>"بۇلغارىيە", "name:uk"=>"Болга́рія", "name:ur"=>"بلغاریہ", "name:uz"=>"Bolgariya", "name:vi"=>"Bulgaria", "name:vo"=>"Bulgarän", "name:wa"=>"Bulgåreye", "name:wo"=>"Bulgaari", "name:yi"=>"בולגאַריע", "name:yo"=>"Bùlgáríà", "name:zh"=>"保加利亚", "name:zu"=>"IBulgariya"
-iq     "name"=>"العراق", "name:af"=>"Irak", "name:am"=>"ኢራቅ", "name:an"=>"Iraq", "name:ar"=>"العراق", "name:av"=>"ГӀиракъ", "name:az"=>"İraq", "name:be"=>"Ірак", "name:bg"=>"Ирак", "name:bn"=>"ইরাক", "name:bo"=>"ཡི་ལའ་ཁོ།", "name:br"=>"Irak", "name:bs"=>"Irak", "name:ca"=>"Iraq", "name:ce"=>"Ӏиракъ", "name:cs"=>"Irák", "name:cv"=>"Ирак", "name:cy"=>"Irac", "name:da"=>"Irak", "name:de"=>"Irak", "name:dv"=>"ޢިރާޤު", "name:el"=>"Ιράκ", "name:en"=>"Iraq", "name:eo"=>"Irako", "name:es"=>"Irak", "name:et"=>"Iraak", "name:eu"=>"Irak", "name:fa"=>"عراق", "name:fi"=>"Irak", "name:fo"=>"Irak", "name:fr"=>"Irak", "name:fy"=>"Irak", "name:ga"=>"An Iaráic", "name:gd"=>"Ioràc", "name:gl"=>"Iraq - العراق", "name:gu"=>"ઈરાક", "name:gv"=>"Yn Earack", "name:he"=>"עיראק", "name:hi"=>"इराक़", "name:hr"=>"Irak", "name:ht"=>"Irak", "name:hu"=>"Irak", "name:hy"=>"Իրաք", "name:ia"=>"Irak", "name:id"=>"Irak", "name:ie"=>"Irak", "name:io"=>"Irak", "name:is"=>"Írak", "name:it"=>"Iraq", "name:iu"=>"ᐃᕉᒃ", "name:ja"=>"イラク", "name:jv"=>"Irak", "name:ka"=>"ერაყი", "name:ki"=>"Iraq", "name:kk"=>"Ирак", "name:kl"=>"Iraq", "name:kn"=>"ಇರಾಕ್", "name:ko"=>"이라크", "name:ku"=>"Iraq", "name:kv"=>"Ирак", "name:kw"=>"Irak", "name:ky"=>"Ирак", "name:la"=>"Iracum", "name:lb"=>"Irak", "name:li"=>"Irak", "name:ln"=>"Irak", "name:lt"=>"Irakas", "name:lv"=>"Irāka", "name:mi"=>"Irāki", "name:mk"=>"Ирак", "name:ml"=>"ഇറാഖ്", "name:mn"=>"Ирак", "name:mr"=>"इराक", "name:ms"=>"Iraq", "name:mt"=>"Iraq", "name:my"=>"အီရတ်နိုင်ငံ", "name:na"=>"Irak", "name:nb"=>"Irak", "name:ne"=>"ईराक", "name:nl"=>"Irak", "name:nn"=>"Irak", "name:no"=>"Irak", "name:nv"=>"Iiwááʼ", "name:oc"=>"Iraq", "name:or"=>"ଇରାକ", "name:os"=>"Ирак", "name:pa"=>"ਇਰਾਕ", "name:pl"=>"Irak", "name:ps"=>"عراق", "name:pt"=>"Iraque", "name:qu"=>"Iraq", "name:ro"=>"Irak", "name:ru"=>"Ирак", "name:rw"=>"Irake", "name:sa"=>"ईराक", "name:se"=>"Irak", "name:sh"=>"Irak", "name:si"=>"ඉරාක ජනරජය", "name:sk"=>"Irak", "name:sl"=>"Irak", "name:so"=>"Ciraaq", "name:sq"=>"Iraku", "name:sr"=>"Ирак", "name:ss"=>"I-Irakhi", "name:su"=>"Irak", "name:sv"=>"Irak", "name:sw"=>"Iraq", "name:ta"=>"ஈராக்", "name:te"=>"ఇరాక్", "name:tg"=>"Ироқ", "name:th"=>"ประเทศอิรัก", "name:tk"=>"Yrak", "name:tl"=>"Irak", "name:tr"=>"Irak", "name:tt"=>"Гыйрак", "name:tw"=>"Irak", "name:ug"=>"ئىراق", "name:uk"=>"Ірак", "name:ur"=>"عراق", "name:uz"=>"Iroq", "name:vi"=>"Iraq", "name:vo"=>"Lirakän", "name:wa"=>"Irak", "name:wo"=>"Iraak", "name:yi"=>"איראק", "name:yo"=>"Irak", "name:zh"=>"伊拉克", "name:zu"=>"I-Iraki"
-mu     "name"=>"Mauritius", "name:af"=>"Mauritius", "name:am"=>"ሞሪሸስ", "name:an"=>"Mauricio", "name:ar"=>"موريشيوس", "name:az"=>"Mavriki", "name:be"=>"Маўрыкій", "name:bg"=>"Мавриций", "name:bn"=>"মরিশাস", "name:bo"=>"མའུ་རི་ཊིའུ་སུ།", "name:br"=>"Maoris", "name:bs"=>"Mauricijus", "name:ca"=>"Maurici", "name:cs"=>"Mauricius", "name:cv"=>"Маврики", "name:da"=>"Mauritius", "name:de"=>"Mauritius", "name:dv"=>"މޮރިޝަސް", "name:el"=>"Μαυρίκιος", "name:en"=>"Mauritius", "name:eo"=>"Maŭricio", "name:es"=>"Mauricio", "name:eu"=>"Maurizio", "name:fa"=>"موریس", "name:fi"=>"Mauritius", "name:fo"=>"Móritius", "name:fr"=>"Maurice", "name:fy"=>"Mauritsius", "name:ga"=>"Oileán Mhuirís", "name:gd"=>"Na h-Eileanan Mhoiriseas", "name:gl"=>"Mauricio - Maurice", "name:gv"=>"Ellan Wirrish", "name:he"=>"מאוריציוס", "name:hi"=>"मॉरिशस", "name:hr"=>"Mauricijus", "name:ht"=>"Moris", "name:hu"=>"Mauritius", "name:hy"=>"Մավրիկիոս", "name:ia"=>"Mauritio", "name:io"=>"Maurico", "name:is"=>"Máritíus", "name:ja"=>"モーリシャス", "name:ka"=>"მავრიკი", "name:kk"=>"Маврикий", "name:kn"=>"ಮಾರಿಷಸ್", "name:ko"=>"모리셔스", "name:ku"=>"Maurîtius", "name:kw"=>"Ynys Morrys", "name:la"=>"Mauritia", "name:ln"=>"Morisi", "name:lt"=>"Mauricijus", "name:lv"=>"Maurīcija", "name:mg"=>"Maorisy", "name:mk"=>"Маврициус", "name:ml"=>"മൗറീഷ്യസ്", "name:mn"=>"Маврикий", "name:mr"=>"मॉरिशस", "name:mt"=>"Mawrizji", "name:my"=>"မောရစ်ရှနိုင်ငံ", "name:ne"=>"मौरिसस", "name:nl"=>"Mauritius", "name:oc"=>"Maurici", "name:or"=>"ମରିସସ", "name:os"=>"Маврикий", "name:pa"=>"ਮਾਰੀਸ਼ਸ", "name:pl"=>"Mauritius", "name:ps"=>"ماوریتوس", "name:pt"=>"Maurícia", "name:qu"=>"Mawrisyu", "name:ru"=>"Маврикий", "name:rw"=>"Morise", "name:sa"=>"मारिषस्", "name:sc"=>"Mauritzius", "name:se"=>"Mauritius", "name:sg"=>"Mörîsi", "name:si"=>"මුරුසි සමුහාණ්ඩුව", "name:sk"=>"Maurícius", "name:sl"=>"Mavricij", "name:sq"=>"Mauritiusi", "name:sr"=>"Маурицијус", "name:ss"=>"IMorishiyasi", "name:sv"=>"Mauritius", "name:sw"=>"Morisi", "name:ta"=>"மொரிசியசு", "name:te"=>"మారిషస్", "name:tg"=>"Маврикия", "name:th"=>"ประเทศมอริเชียส", "name:tk"=>"Mawrikiý", "name:tl"=>"Maurisyo", "name:tt"=>"Маврикий", "name:ug"=>"ماۋرىتىئۇس", "name:uk"=>"Маврикій", "name:ur"=>"موریشس", "name:uz"=>"Mavritsiya", "name:vo"=>"Moriseän", "name:wo"=>"Móoris", "name:yo"=>"Mọ́rísì", "name:zh"=>"毛里求斯", "name:zu"=>"IMorishisi"
-ni     "name"=>"Nicaragua", "name:af"=>"Nicaragua", "name:am"=>"ኒካራጓ", "name:an"=>"Nicaragua", "name:ar"=>"نيكاراجوا", "name:ay"=>"Nikarwa", "name:az"=>"Nikaraqua", "name:ba"=>"Никарагуа", "name:be"=>"Нікарагуа", "name:bg"=>"Никарагуа", "name:bm"=>"Nikaragwa", "name:bn"=>"নিকারাগুয়া", "name:bo"=>"ནི་ཀ་ར་གུ་ཝ།", "name:br"=>"Nicaragua", "name:bs"=>"Nikaragva", "name:ca"=>"Nicaragua", "name:ce"=>"Никарагуа", "name:cs"=>"Nikaragua", "name:cy"=>"Nicaragua", "name:da"=>"Nicaragua", "name:de"=>"Nicaragua", "name:dv"=>"ނިކަރާގުއާ", "name:ee"=>"Nicaragua", "name:el"=>"Νικαράγουα", "name:en"=>"Nicaragua", "name:eo"=>"Nikaragvo", "name:es"=>"Nicaragua", "name:et"=>"Nicaragua", "name:eu"=>"Nikaragua", "name:fa"=>"نیکاراگوئه", "name:fi"=>"Nicaragua", "name:fo"=>"Nikaragua", "name:fr"=>"Nicaragua", "name:fy"=>"Nikaragûa", "name:ga"=>"Nicearagua", "name:gd"=>"Niocaragua", "name:gl"=>"Nicaragua", "name:gn"=>"Nikaragua", "name:gv"=>"Yn Nickeraag", "name:he"=>"ניקרגואה", "name:hi"=>"निकारागुआ", "name:hr"=>"Nikaragva", "name:ht"=>"Nikaragwa", "name:hu"=>"Nicaragua", "name:hy"=>"Նիկարագուա", "name:ia"=>"Nicaragua", "name:id"=>"Nikaragua", "name:ie"=>"Nicaragua", "name:io"=>"Nikaragua", "name:is"=>"Níkaragva", "name:it"=>"Nicaragua", "name:ja"=>"ニカラグア", "name:jv"=>"Nikaragua", "name:ka"=>"ნიკარაგუა", "name:kk"=>"Никарагуа", "name:ko"=>"니카라과", "name:ku"=>"Nîkaragua", "name:kv"=>"Никарагуа", "name:kw"=>"Nikaragwa", "name:la"=>"Nicaragua", "name:lb"=>"Nicaragua", "name:li"=>"Nicaragua", "name:ln"=>"Nikalagwa", "name:lt"=>"Nikaragva", "name:lv"=>"Nikaragva", "name:mg"=>"Nicaragua", "name:mi"=>"Nikarāhua", "name:mk"=>"Никарагва", "name:ml"=>"നിക്കരാഗ്വ", "name:mn"=>"Никарагуа", "name:mr"=>"निकाराग्वा", "name:ms"=>"Nicaragua", "name:mt"=>"Nikaragwa", "name:my"=>"နီကာရာဂွါနိုင်ငံ", "name:ne"=>"निकाराग्वा", "name:nl"=>"Nicaragua", "name:nn"=>"Nicaragua", "name:no"=>"Nicaragua", "name:oc"=>"Nicaragua", "name:or"=>"ନିକାରାଗୁଆ", "name:os"=>"Никарагуæ", "name:pa"=>"ਨਿਕਾਰਾਗੁਆ", "name:pl"=>"Nikaragua", "name:ps"=>"نیکاراګوا", "name:pt"=>"Nicarágua", "name:qu"=>"Nikarawa", "name:ro"=>"Nicaragua", "name:ru"=>"Никарагуа", "name:rw"=>"Nikaragwa", "name:sa"=>"निकारगुवा", "name:se"=>"Nicaragua", "name:sh"=>"Nikaragva", "name:sk"=>"Nikaragua", "name:sl"=>"Nikaragva", "name:so"=>"Nikaragua", "name:sq"=>"Nikaraguaja", "name:sr"=>"Никарагва", "name:ss"=>"INikhalaga", "name:su"=>"Nikaragua", "name:sv"=>"Nicaragua", "name:sw"=>"Nikaragua", "name:ta"=>"நிக்கராகுவா", "name:tg"=>"Никарагуа", "name:th"=>"ประเทศนิการากัว", "name:tl"=>"Nicaragua", "name:tr"=>"Nikaragua", "name:tt"=>"Никарагуа", "name:ug"=>"نىكاراگۇئا", "name:uk"=>"Нікарагуа", "name:ur"=>"نکاراگوا", "name:uz"=>"Nikaragua", "name:vi"=>"Nicaragua", "name:vo"=>"Nikaraguvän", "name:wo"=>"Nikaraaguwa", "name:yi"=>"ניקאראגוא", "name:yo"=>"Nikarágúà", "name:zh"=>"尼加拉瓜", "name:zu"=>"Nicaragua"
-pa     "name"=>"Panamá", "name:af"=>"Panama", "name:am"=>"ፓናማ", "name:an"=>"Panamá", "name:ar"=>"بنما", "name:ay"=>"Panama", "name:az"=>"Panama", "name:ba"=>"Панама", "name:be"=>"Панама", "name:bg"=>"Панама", "name:bm"=>"Panama", "name:bn"=>"পানামা", "name:bo"=>"པ་ན་མ།", "name:br"=>"Panamá", "name:bs"=>"Panama", "name:ca"=>"Panamà", "name:ce"=>"Панама", "name:cs"=>"Panama", "name:cv"=>"Панама", "name:cy"=>"Panama", "name:da"=>"Panama", "name:de"=>"Panama", "name:dv"=>"ޕެނަމާ", "name:ee"=>"Panama", "name:el"=>"Παναμάς", "name:en"=>"Panama", "name:eo"=>"Panamo", "name:es"=>"Panamá", "name:et"=>"Panama", "name:eu"=>"Panama", "name:fa"=>"پاناما", "name:fi"=>"Panama", "name:fo"=>"Panama", "name:fr"=>"Panamá", "name:fy"=>"Panama", "name:ga"=>"Panama", "name:gd"=>"Panama", "name:gl"=>"Panamá", "name:gn"=>"Panama", "name:gu"=>"પનામા", "name:gv"=>"Yn Phanamaa", "name:he"=>"פנמה", "name:hi"=>"पनामा", "name:hr"=>"Panama", "name:ht"=>"Panama", "name:hu"=>"Panama", "name:hy"=>"Պանամա", "name:ia"=>"Panama", "name:id"=>"Panama", "name:ie"=>"Panamá", "name:io"=>"Panama", "name:is"=>"Panama", "name:it"=>"Panamá", "name:ja"=>"パナマ", "name:jv"=>"Panama", "name:ka"=>"პანამა", "name:ki"=>"Panama", "name:kk"=>"Панама", "name:kn"=>"ಪನಾಮಾ", "name:ko"=>"파나마", "name:ku"=>"Panama", "name:kw"=>"Panama", "name:la"=>"Panama", "name:lb"=>"Panama", "name:li"=>"Panama", "name:ln"=>"Panama", "name:lt"=>"Panama", "name:lv"=>"Panama", "name:mg"=>"Panama", "name:mi"=>"Panama", "name:mk"=>"Панама", "name:ml"=>"പനാമ", "name:mn"=>"Панам", "name:mr"=>"पनामा", "name:ms"=>"Panama", "name:mt"=>"Panama", "name:my"=>"ပနားမားနိုင်ငံ", "name:ne"=>"पानामा", "name:nl"=>"Panama", "name:nn"=>"Panama", "name:no"=>"Panama", "name:oc"=>"Panamà", "name:or"=>"ପାନାମା", "name:os"=>"Панамæ", "name:pa"=>"ਪਨਾਮਾ", "name:pl"=>"Panama", "name:ps"=>"پاناما", "name:pt"=>"Panamá", "name:qu"=>"Panama", "name:ro"=>"Panama", "name:ru"=>"Панама", "name:rw"=>"Panama", "name:sa"=>"पानामा", "name:se"=>"Panama", "name:sh"=>"Panama", "name:sk"=>"Panama", "name:sl"=>"Panama", "name:so"=>"Banama", "name:sq"=>"Panamaja", "name:sr"=>"Панама", "name:ss"=>"IPhanama", "name:su"=>"Panama", "name:sv"=>"Panama", "name:sw"=>"Panama", "name:ta"=>"பனாமா", "name:te"=>"పనామా", "name:tg"=>"Панама", "name:th"=>"ประเทศปานามา", "name:tl"=>"Panama", "name:tr"=>"Panama", "name:tt"=>"Панама", "name:ug"=>"پاناما", "name:uk"=>"Панама", "name:ur"=>"پاناما", "name:uz"=>"Panama", "name:vi"=>"Panama", "name:vo"=>"Panamän", "name:wo"=>"Panamaa", "name:yi"=>"פאנאמא", "name:yo"=>"Panamá", "name:zh"=>"巴拿马", "name:zu"=>"Panama"
-so     "name"=>"Soomaaliya الصومال", "name:af"=>"Somalië", "name:am"=>"ሶማሊያ", "name:an"=>"Somalia", "name:ar"=>"الصومال", "name:az"=>"Somali", "name:ba"=>"Сомали", "name:be"=>"Самалі", "name:bg"=>"Сомалия", "name:bn"=>"সোমালিয়া", "name:bo"=>"སོ་མ་ལི།", "name:br"=>"Somalia", "name:bs"=>"Somalija", "name:ca"=>"Somàlia", "name:ce"=>"Сомали", "name:cs"=>"Somálsko", "name:cy"=>"Somalia", "name:da"=>"Somalia", "name:de"=>"Somalia", "name:dv"=>"ސޯމާލިއާ", "name:ee"=>"Somalia", "name:el"=>"Σομαλία", "name:en"=>"Somalia", "name:eo"=>"Somalio", "name:es"=>"Somalia", "name:et"=>"Somaalia", "name:eu"=>"Somalia", "name:fa"=>"سومالی", "name:fi"=>"Somalia", "name:fo"=>"Somalia", "name:fr"=>"Somalie", "name:fy"=>"Somaalje", "name:ga"=>"An tSomáil", "name:gd"=>"Somàilia", "name:gl"=>"Somalia", "name:gv"=>"Yn Tomaal", "name:he"=>"סומליה", "name:hi"=>"सोमालिया", "name:hr"=>"Somalija", "name:ht"=>"Somali", "name:hu"=>"Szomália", "name:hy"=>"Սոմալի", "name:ia"=>"Somalia", "name:id"=>"Somalia", "name:ie"=>"Somalia", "name:io"=>"Somalia", "name:is"=>"Sómalía", "name:it"=>"Somalia", "name:ja"=>"ソマリア", "name:jv"=>"Somalia", "name:ka"=>"სომალი", "name:kg"=>"Sômâlia", "name:ki"=>"Somalia", "name:kk"=>"Сомали", "name:kn"=>"ಸೊಮಾಲಿಯ", "name:ko"=>"소말리아", "name:ku"=>"Somalya", "name:kw"=>"Somali", "name:la"=>"Somalia", "name:lb"=>"Somalia", "name:li"=>"Somalië", "name:ln"=>"Somalia", "name:lt"=>"Somalis", "name:lv"=>"Somālija", "name:mg"=>"Somalia", "name:mi"=>"Hūmārie", "name:mk"=>"Сомалија", "name:ml"=>"സൊമാലിയ", "name:mn"=>"Сомали", "name:mr"=>"सोमालिया प्रजासत्ताक", "name:ms"=>"Somalia", "name:mt"=>"Somalja", "name:my"=>"ဆိုမာလီယာနိုင်ငံ", "name:na"=>"Tomariya", "name:nl"=>"Somalië", "name:nn"=>"Somalia", "name:no"=>"Somalia", "name:nv"=>"Soomáálii Bikéyah", "name:oc"=>"Somalia", "name:om"=>"Somaaliyaa", "name:or"=>"ସୋମାଲିଆ", "name:os"=>"Сомали", "name:pa"=>"ਸੋਮਾਲੀਆ", "name:pl"=>"Somalia", "name:ps"=>"سومالیا", "name:pt"=>"Somália", "name:qu"=>"Sumalya", "name:rm"=>"Somalia", "name:ro"=>"Somalia", "name:ru"=>"Сомали", "name:rw"=>"Somaliya", "name:sa"=>"सोमालिया", "name:sc"=>"Somàlia", "name:se"=>"Somália", "name:sg"=>"Somalïi", "name:sh"=>"Somalija", "name:si"=>"සෝමාලියාව", "name:sk"=>"Somálsko", "name:sl"=>"Somalija", "name:sm"=>"Somalia", "name:sn"=>"Somalia", "name:so"=>"Soomaaliya", "name:sq"=>"Somalia", "name:sr"=>"Сомалија", "name:ss"=>"ISomaliya", "name:st"=>"Somalia", "name:su"=>"Somalia", "name:sv"=>"Somalia", "name:sw"=>"Somalia", "name:ta"=>"சோமாலியா", "name:te"=>"సొమాలియా", "name:tg"=>"Сумолӣ", "name:th"=>"ประเทศโซมาเลีย", "name:ti"=>"ሶማሊያ", "name:tk"=>"Somali", "name:tl"=>"Somalya", "name:tr"=>"Somali", "name:ts"=>"Somalia", "name:tt"=>"Сомали", "name:ug"=>"سومالى", "name:uk"=>"Сомалі", "name:ur"=>"صومالیہ", "name:uz"=>"Somali", "name:vi"=>"Somalia", "name:vo"=>"Somalän", "name:wo"=>"Somali", "name:yi"=>"סאמאליע", "name:yo"=>"Sòmálíà", "name:zh"=>"索马里", "name:zu"=>"ISomalia"
-ug     "name"=>"Uganda", "name:af"=>"Uganda", "name:am"=>"ዩጋንዳ", "name:an"=>"Uganda", "name:ar"=>"أوغندا", "name:az"=>"Uqanda", "name:ba"=>"Уганда", "name:be"=>"Уганда", "name:bg"=>"Уганда", "name:bm"=>"Uganda", "name:bn"=>"উগান্ডা", "name:bo"=>"ཨུ་གན་ད།", "name:br"=>"Ouganda", "name:bs"=>"Uganda", "name:ca"=>"Uganda", "name:ce"=>"Уганда", "name:cs"=>"Uganda", "name:cv"=>"Уганда", "name:cy"=>"Uganda", "name:da"=>"Uganda", "name:de"=>"Uganda", "name:dv"=>"ޔުގެންޑާ", "name:ee"=>"Uganda", "name:el"=>"Ουγκάντα", "name:en"=>"Uganda", "name:eo"=>"Ugando", "name:es"=>"Uganda", "name:et"=>"Uganda", "name:eu"=>"Uganda", "name:fa"=>"اوگاندا", "name:fi"=>"Uganda", "name:fo"=>"Uganda", "name:fr"=>"Ouganda", "name:fy"=>"Uganda", "name:ga"=>"Uganda", "name:gd"=>"Uganda", "name:gl"=>"Uganda", "name:gv"=>"Ooganda", "name:ha"=>"Uganda", "name:he"=>"אוגנדה", "name:hi"=>"युगाण्डा", "name:hr"=>"Uganda", "name:ht"=>"Ouganda", "name:hu"=>"Uganda", "name:hy"=>"Ուգանդա", "name:ia"=>"Uganda", "name:id"=>"Uganda", "name:ie"=>"Uganda", "name:io"=>"Uganda", "name:is"=>"Úganda", "name:it"=>"Uganda", "name:ja"=>"ウガンダ", "name:jv"=>"Uganda", "name:ka"=>"უგანდა", "name:kg"=>"Uganda", "name:ki"=>"Uganda", "name:kk"=>"Уганда", "name:kl"=>"Uganda", "name:kn"=>"ಉಗಾಂಡ", "name:ko"=>"우간다", "name:ku"=>"Ûganda", "name:kw"=>"Ouganda", "name:la"=>"Uganda", "name:lb"=>"Uganda", "name:lg"=>"Yuganda", "name:li"=>"Oeganda", "name:ln"=>"Uganda", "name:lt"=>"Uganda", "name:lv"=>"Uganda", "name:mi"=>"Ukānga", "name:mk"=>"Уганда", "name:ml"=>"ഉഗാണ്ട", "name:mn"=>"Уганда", "name:mr"=>"युगांडा", "name:ms"=>"Uganda", "name:mt"=>"Uganda", "name:my"=>"ယူဂန်းဒါးနိုင်ငံ", "name:nl"=>"Oeganda", "name:nn"=>"Uganda", "name:no"=>"Uganda", "name:nv"=>"Yogénda", "name:oc"=>"Oganda", "name:or"=>"ଉଗାଣ୍ଡା", "name:os"=>"Угандæ", "name:pa"=>"ਯੁਗਾਂਡਾ", "name:pl"=>"Uganda", "name:pt"=>"Uganda", "name:qu"=>"Uganda", "name:rm"=>"Uganda", "name:ro"=>"Uganda", "name:ru"=>"Уганда", "name:rw"=>"Ubugande", "name:sc"=>"Uganda", "name:se"=>"Uganda", "name:sg"=>"Ugandäa", "name:sh"=>"Uganda", "name:sk"=>"Uganda", "name:sl"=>"Uganda", "name:sn"=>"Uganda", "name:so"=>"Yugandha", "name:sq"=>"Uganda", "name:sr"=>"Уганда", "name:ss"=>"IBuganda", "name:su"=>"Uganda", "name:sv"=>"Uganda", "name:sw"=>"Uganda", "name:ta"=>"உகாண்டா", "name:te"=>"ఉగాండా", "name:tg"=>"Уганда", "name:th"=>"ประเทศยูกันดา", "name:tk"=>"Uganda", "name:tl"=>"Uganda", "name:tr"=>"Uganda", "name:ts"=>"Uganda", "name:tt"=>"Уганда", "name:ug"=>"ئۇگاندا", "name:uk"=>"Уганда", "name:ur"=>"یوگنڈا", "name:uz"=>"Uganda", "name:vi"=>"Uganda", "name:vo"=>"Lugandayän", "name:wo"=>"Ugandaa", "name:yi"=>"אוגאנדע", "name:yo"=>"Ùgándà", "name:zh"=>"乌干达", "name:zu"=>"IYuganda"
-kh     "name"=>"ព្រះរាជាណាចក្រ​កម្ពុជា", "name:af"=>"Kambodja", "name:am"=>"ካምቦዲያ", "name:an"=>"Cambocha", "name:ar"=>"كمبوديا", "name:az"=>"Kamboca", "name:ba"=>"Камбоджа", "name:be"=>"Камбоджа", "name:bg"=>"Камбоджа", "name:bn"=>"কম্বোডিয়া", "name:bo"=>"ཁམ་པོ་ཛ།", "name:br"=>"Kambodja", "name:bs"=>"Kambodža", "name:ca"=>"Cambodja", "name:ce"=>"Камбоджа", "name:cs"=>"Kambodža", "name:cv"=>"Камбоджа", "name:cy"=>"Cambodia", "name:da"=>"Cambodja", "name:de"=>"Kambodscha", "name:dv"=>"ކެންބޯޑިއާ", "name:dz"=>"ཀམ་བོ་ཌི་ཡ་", "name:el"=>"Καμπότζη", "name:en"=>"Cambodia", "name:eo"=>"Kamboĝo", "name:es"=>"Camboya", "name:et"=>"Kambodža", "name:eu"=>"Kanbodia", "name:fa"=>"کامبوج", "name:fi"=>"Kambodža", "name:fo"=>"Kambodja", "name:fr"=>"Cambodge", "name:fy"=>"Kambodja", "name:ga"=>"An Chambóid", "name:gd"=>"Cambuidea", "name:gl"=>"Camboxa", "name:gn"=>"Kamboja", "name:gu"=>"કમ્બોડીયા", "name:gv"=>"Yn Chamboyd", "name:ha"=>"Kambodiya", "name:he"=>"קמבודיה", "name:hi"=>"कम्बोडिया", "name:hr"=>"Kambodža", "name:ht"=>"Kanbòdj", "name:hu"=>"Kambodzsa", "name:hy"=>"Կամբոջա", "name:ia"=>"Cambodgia", "name:id"=>"Kamboja", "name:ie"=>"Cambodja", "name:io"=>"Kambodja", "name:is"=>"Kambódía", "name:it"=>"Cambogia", "name:ja"=>"カンボジア", "name:jv"=>"Kamboja", "name:ka"=>"კამბოჯა", "name:kk"=>"Камбоджа", "name:km"=>"ព្រះរាជាណាចក្រកម្ពុជា", "name:kn"=>"ಕಾಂಬೋಡಿಯ", "name:ko"=>"캄보디아", "name:ku"=>"Kamboca", "name:kv"=>"Камбоджа", "name:kw"=>"Kamboji", "name:la"=>"Cambosia", "name:lb"=>"Kambodscha", "name:li"=>"Cambodja", "name:ln"=>"Kamboji", "name:lo"=>"ປະເທດກຳປູເຈຍ", "name:lt"=>"Kambodža", "name:lv"=>"Kambodža", "name:mg"=>"Kambodia", "name:mi"=>"Kamapōtia", "name:mk"=>"Камбоџа", "name:ml"=>"കംബോഡിയ", "name:mn"=>"Камбож", "name:mr"=>"कंबोडिया", "name:ms"=>"Kemboja", "name:mt"=>"Kambodja", "name:my"=>"ကမ္ဘောဒီးယားနိုင်ငံ", "name:na"=>"Kambodja", "name:nl"=>"Cambodja", "name:nn"=>"Kambodsja", "name:no"=>"Kambodsja", "name:oc"=>"Cambòtja", "name:or"=>"କମ୍ବୋଡ଼ିଆ", "name:os"=>"Камбоджæ", "name:pa"=>"ਕੰਬੋਡੀਆ", "name:pl"=>"Kambodża", "name:ps"=>"کمبودیا", "name:pt"=>"Camboja", "name:qu"=>"Kambuya", "name:rm"=>"Cambodscha", "name:ro"=>"Cambodgia", "name:ru"=>"Камбоджа", "name:rw"=>"Kambodiya", "name:se"=>"Kambodja", "name:sh"=>"Kambodža", "name:si"=>"කාම්බෝජය", "name:sk"=>"Kambodža", "name:sl"=>"Kambodža", "name:so"=>"Kambodiya", "name:sq"=>"Kamboxhia", "name:sr"=>"Камбоџа", "name:ss"=>"IKhambodiya", "name:su"=>"Kamboja", "name:sv"=>"Kambodja", "name:sw"=>"Kamboja", "name:ta"=>"கம்போடியா", "name:te"=>"కంబోడియా", "name:tg"=>"Камбоҷа", "name:th"=>"ประเทศกัมพูชา", "name:tk"=>"Kamboçiýa", "name:tl"=>"Kamboya", "name:tr"=>"Kamboçya", "name:tt"=>"Камбоҗа", "name:ug"=>"كامبوجا", "name:uk"=>"Камбоджа", "name:ur"=>"کمبوڈیا", "name:uz"=>"Kambodja", "name:vi"=>"Campuchia", "name:vo"=>"Kambocän", "name:wo"=>"Kamboodi", "name:yi"=>"קאמבאדיע", "name:yo"=>"Kàmbódíà", "name:zh"=>"柬埔寨"
-mg     "name"=>"Madagasikara", "name:af"=>"Madagaskar", "name:am"=>"ማዳጋስካር", "name:an"=>"Madagascar", "name:ar"=>"مدغشقر", "name:az"=>"Madaqaskar", "name:ba"=>"Мадагаскар", "name:be"=>"Мадагаскар", "name:bg"=>"Мадагаскар", "name:bm"=>"Madagaskar", "name:bn"=>"মাদাগাস্কার", "name:bo"=>"མ་ད་གཱ་སི་ཀར།", "name:br"=>"Madagaskar", "name:bs"=>"Madagaskar", "name:ca"=>"Madagascar", "name:ce"=>"Мадагаскар", "name:cs"=>"Madagaskar", "name:cv"=>"Мадагаскар", "name:cy"=>"Madagascar", "name:da"=>"Madagaskar", "name:de"=>"Madagaskar", "name:dv"=>"މަޑަގަސްކަރަ", "name:ee"=>"Madagascar", "name:el"=>"Μαδαγασκάρη", "name:en"=>"Madagascar", "name:eo"=>"Madagaskaro", "name:es"=>"Madagascar", "name:et"=>"Madagaskar", "name:eu"=>"Madagaskar", "name:fa"=>"ماداگاسکار", "name:fi"=>"Madagaskar", "name:fj"=>"Madagasikar", "name:fo"=>"Madagaskar", "name:fr"=>"Madagascar", "name:fy"=>"Madagaskar", "name:ga"=>"Madagascar", "name:gd"=>"Madagascar", "name:gl"=>"Madagascar", "name:gn"=>"Madagaka", "name:gu"=>"મડાગાસ્કર", "name:gv"=>"Madagascar", "name:he"=>"מדגסקר", "name:hi"=>"मेडागास्कर", "name:hr"=>"Madagaskar", "name:ht"=>"Madagaskar", "name:hu"=>"Madagaszkár", "name:hy"=>"Մադագասկար", "name:ia"=>"Madagascar", "name:id"=>"Madagaskar", "name:ie"=>"Madagascar", "name:io"=>"Madagaskar", "name:is"=>"Madagaskar", "name:it"=>"Madagascar", "name:ja"=>"マダガスカル", "name:jv"=>"Madagaskar", "name:ka"=>"მადაგასკარი", "name:kg"=>"Malagasi", "name:ki"=>"Madagascar", "name:kk"=>"Мадагаскар", "name:kl"=>"Madagascar", "name:kn"=>"ಮಡಾಗಾಸಿಕರ", "name:ko"=>"마다가스카르", "name:ku"=>"Madagaskar", "name:kw"=>"Madagaskar", "name:ky"=>"Мадагаскар", "name:la"=>"Madagascaria", "name:lb"=>"Madagaskar", "name:li"=>"Madagaskar", "name:ln"=>"Madagasikari", "name:lt"=>"Madagaskaras", "name:lv"=>"Madagaskara", "name:mg"=>"Madagasikara", "name:mi"=>"Marakāhia", "name:mk"=>"Мадагаскар", "name:ml"=>"മഡഗാസ്കർ", "name:mn"=>"Мадагаскар", "name:mr"=>"मादागास्कर", "name:ms"=>"Madagaskar", "name:mt"=>"Madagaskar", "name:my"=>"မဒါဂတ်စကားနိုင်ငံ", "name:nl"=>"Madagaskar", "name:nn"=>"Madagaskar", "name:no"=>"Madagaskar", "name:nv"=>"Madaʼgéésgáá", "name:oc"=>"Madagascar", "name:om"=>"Madagascar", "name:or"=>"ମେଡାଗାସ୍କର", "name:os"=>"Мадагаскар", "name:pa"=>"ਮਾਦਾਗਾਸਕਰ", "name:pl"=>"Madagaskar", "name:ps"=>"مادغاسکر", "name:pt"=>"Madagáscar", "name:qu"=>"Madagaskar", "name:ro"=>"Madagascar", "name:ru"=>"Мадагаскар", "name:rw"=>"Madagasikari", "name:sa"=>"मडगास्कर", "name:sc"=>"Madagascàr", "name:se"=>"Madagaskar", "name:sg"=>"Madagaskära", "name:sh"=>"Madagaskar", "name:si"=>"මැඩගස්කරය", "name:sk"=>"Madagaskar", "name:sl"=>"Madagaskar", "name:sm"=>"Madagascar", "name:sn"=>"Madagascar", "name:so"=>"Madagaskar", "name:sq"=>"Madagaskari", "name:sr"=>"Мадагаскар", "name:ss"=>"IMadagasikha", "name:su"=>"Madagaskar", "name:sv"=>"Madagaskar", "name:sw"=>"Madagaska", "name:ta"=>"மடகாசுகர்", "name:te"=>"మడగాస్కర్", "name:tg"=>"Мадагаскар", "name:th"=>"ประเทศมาดากัสการ์", "name:ti"=>"ማዳጋስካር", "name:tk"=>"Madagaskar", "name:tl"=>"Madagaskar", "name:tr"=>"Madagaskar", "name:ts"=>"Madagascar", "name:tt"=>"Мадагаскар", "name:ty"=>"Madagascar", "name:ug"=>"ماداگاسكار", "name:uk"=>"Мадагаскар", "name:ur"=>"مڈغاسکر", "name:uz"=>"Madagaskar", "name:vi"=>"Madagascar", "name:vo"=>"Malagaseän", "name:wo"=>"Madagaskaar", "name:yi"=>"מאדאגאסקאר", "name:yo"=>"Madagáskàr", "name:zh"=>"马达加斯加", "name:zu"=>"IMadagasika"
-mt     "name"=>"Malta", "name:ak"=>"Mɔlta", "name:am"=>"ማልታ", "name:ar"=>"مالطا", "name:be"=>"Мальта", "name:bg"=>"Малта", "name:bm"=>"Malti", "name:bn"=>"মাল্টা", "name:bo"=>"མལ་ཊ།", "name:br"=>"Malta", "name:ca"=>"Malta", "name:cs"=>"Malta", "name:de"=>"Malta", "name:dz"=>"མཱལ་ཊ", "name:ee"=>"Malta nutome", "name:el"=>"Μάλτα", "name:en"=>"Malta", "name:eo"=>"Malto", "name:es"=>"Malta", "name:fa"=>"مالت", "name:ff"=>"Malte", "name:fi"=>"Malta", "name:fr"=>"Malte", "name:ga"=>"Málta", "name:gu"=>"માલ્ટા", "name:gv"=>"Yn Valta", "name:he"=>"מלטה", "name:hi"=>"माल्टा", "name:hr"=>"Malta", "name:hu"=>"Málta", "name:hy"=>"Մալթա", "name:ia"=>"Malta", "name:io"=>"Malta", "name:is"=>"Malta", "name:it"=>"Malta", "name:ja"=>"マルタ", "name:ka"=>"მალტა", "name:km"=>"ម៉ាល់តា", "name:kn"=>"ಮಾಲ್ಟಾ", "name:ko"=>"몰타", "name:ks"=>"مالٹا", "name:ku"=>"Malta", "name:la"=>"Melita", "name:lg"=>"Malita", "name:ln"=>"Malitɛ", "name:lo"=>"ມັນຕາ", "name:lv"=>"Malta", "name:mk"=>"Малта", "name:ml"=>"മാൾട്ട", "name:mn"=>"Мальта", "name:mr"=>"माल्टा", "name:ne"=>"माल्टा", "name:no"=>"Malta", "name:or"=>"ମାଲ୍ଟା", "name:pl"=>"Malta", "name:rn"=>"Malita", "name:ru"=>"Мальта", "name:se"=>"Malta", "name:sg"=>"Mâlta", "name:si"=>"මෝල්ටාව", "name:sk"=>"Malta", "name:so"=>"Maalda", "name:sq"=>"Maltë", "name:sr"=>"Малта", "name:sv"=>"Malta", "name:ta"=>"மால்டா", "name:te"=>"మాల్టా", "name:tg"=>"Малта", "name:th"=>"ประเทศมอลตา", "name:ti"=>"ማልታ", "name:to"=>"Malita", "name:uk"=>"Мальта", "name:ur"=>"مالٹا", "name:vi"=>"Malta", "name:vo"=>"Malteän", "name:yo"=>"Orílẹ́ède Malata", "name:zh"=>"马尔他", "name:zu"=>"i-Malta"
-mn     "name"=>"Монгол улс ᠮᠤᠩᠭᠤᠯ ᠤᠯᠤᠰ", "name:af"=>"Mongolië", "name:am"=>"ሞንጎልያ", "name:an"=>"Mongolia", "name:ar"=>"منغوليا", "name:as"=>"মঙ্গোলিয়া", "name:az"=>"Monqolustan", "name:ba"=>"Монголия", "name:be"=>"Манголія", "name:bg"=>"Монголия", "name:bn"=>"মঙ্গোলিয়া", "name:bo"=>"མོང་གོལ།", "name:br"=>"Mongolia", "name:bs"=>"Mongolija", "name:ca"=>"Mongòlia", "name:ce"=>"Монголи", "name:cs"=>"Mongolsko", "name:cu"=>"Мѫголи", "name:cv"=>"Монголи", "name:cy"=>"Mongolia", "name:da"=>"Mongoliet", "name:de"=>"Mongolei", "name:dv"=>"މޮންގޯލިއާ", "name:dz"=>"སོག་པོ་", "name:ee"=>"Mongolia", "name:el"=>"Μογγολία", "name:en"=>"Mongolia", "name:eo"=>"Mongolio", "name:es"=>"Mongolia", "name:et"=>"Mongoolia", "name:eu"=>"Mongolia", "name:fa"=>"مغولستان", "name:fi"=>"Mongolia", "name:fo"=>"Mongolia", "name:fr"=>"Mongolie", "name:fy"=>"Mongoalje", "name:ga"=>"An Mhongóil", "name:gd"=>"Mongòilia", "name:gl"=>"Mongolia", "name:gn"=>"Mongolia", "name:gu"=>"મંગોલિયા", "name:gv"=>"Yn Vongoil", "name:he"=>"מונגוליה", "name:hi"=>"मंगोलिया", "name:hr"=>"Mongolija", "name:ht"=>"Mongoli", "name:hu"=>"Mongólia", "name:hy"=>"Մոնղոլիա", "name:ia"=>"Mongolia", "name:id"=>"Mongolia", "name:ie"=>"Mongolia", "name:io"=>"Mongolia", "name:is"=>"Mongólía", "name:it"=>"Mongolia", "name:ja"=>"モンゴル国", "name:jv"=>"Mongolia", "name:ka"=>"მონღოლეთი", "name:kk"=>"Моңғолия", "name:kl"=>"Mongolia", "name:km"=>"ម៉ុងហ្គោលី", "name:kn"=>"ಮಂಗೋಲಿಯ", "name:ko"=>"몽골", "name:ku"=>"Mongolya", "name:kv"=>"Монголия", "name:kw"=>"Mongoli", "name:ky"=>"Моңголстан", "name:la"=>"Mongolia", "name:lb"=>"Mongolei", "name:li"=>"Mongolië", "name:ln"=>"Mongolí", "name:lt"=>"Mongolija", "name:lv"=>"Mongolija", "name:mi"=>"Mongōria", "name:mk"=>"Монголија", "name:ml"=>"മംഗോളിയ", "name:mn"=>"Монгол улс ᠮᠤᠩᠭᠤᠯ ᠤᠯᠤᠰ", "name:mo"=>"Монголия", "name:mr"=>"मंगोलिया", "name:ms"=>"Mongolia", "name:my"=>"မွန်ဂိုးလီးယားနိုင်ငံ", "name:na"=>"Mongoriya", "name:ne"=>"मङ्गोलिया", "name:nl"=>"Mongolië", "name:nn"=>"Mongolia", "name:no"=>"Mongolia", "name:nv"=>"Chʼah Diʼilii Bikéyah", "name:oc"=>"Mongolia", "name:or"=>"ମଙ୍ଗୋଲିଆ", "name:os"=>"Мангол", "name:pa"=>"ਮੰਗੋਲੀਆ", "name:pl"=>"Mongolia", "name:ps"=>"مغولستان", "name:pt"=>"Mongólia", "name:qu"=>"Mungul suyu", "name:ro"=>"Mongolia", "name:ru"=>"Монголия", "name:rw"=>"Mongoliya", "name:sa"=>"मंगोलिया", "name:se"=>"Mongolia", "name:sh"=>"Mongolija", "name:si"=>"මොංගෝලියාව", "name:sk"=>"Mongolsko", "name:sl"=>"Mongolija", "name:sm"=>"Mogitolia", "name:so"=>"Mongolia", "name:sq"=>"Mongolia", "name:sr"=>"Монголија", "name:ss"=>"IMongoliya", "name:su"=>"Mongolia", "name:sv"=>"Mongoliet", "name:sw"=>"Mongolia", "name:ta"=>"மங்கோலியா", "name:te"=>"మంగోలియా", "name:tg"=>"Муғулистон", "name:th"=>"ประเทศมองโกเลีย", "name:tk"=>"Mongoliýa", "name:tl"=>"Monggolya", "name:tr"=>"Moğolistan", "name:tt"=>"Монголия", "name:ug"=>"موڭغۇلىيە", "name:uk"=>"Монголія", "name:ur"=>"منگولیا", "name:uz"=>"Moʻgʻuliston", "name:vi"=>"Mông Cổ", "name:vo"=>"Mongolän", "name:wo"=>"Mongoli", "name:yi"=>"מאנגאליי", "name:yo"=>"Mòngólíà", "name:za"=>"Mungzguj", "name:zh"=>"蒙古国"
-ua     "name"=>"Україна", "name:ab"=>"Украина", "name:af"=>"Oekraïne", "name:am"=>"ዩክሬን", "name:an"=>"Ucraína", "name:ar"=>"أوكرانيا", "name:az"=>"Ukrayna", "name:ba"=>"Украина", "name:be"=>"Украіна", "name:bg"=>"Украйна", "name:bi"=>"Ukraine", "name:bn"=>"ইউক্রেন", "name:bo"=>"ཨུཀ་རཡི་ནི།", "name:br"=>"Ukraina", "name:bs"=>"Ukrajina", "name:ca"=>"Ucraïna", "name:ce"=>"Украина", "name:cs"=>"Ukrajina", "name:cu"=>"Оукраина", "name:cv"=>"Украина", "name:cy"=>"Wcráin", "name:da"=>"Ukraine", "name:de"=>"Ukraine", "name:dv"=>"ޔުކްރެއިން", "name:ee"=>"Ukraine", "name:el"=>"Ουκρανία", "name:en"=>"Ukraine", "name:eo"=>"Ukrainio", "name:es"=>"Ucrania", "name:et"=>"Ukraina", "name:eu"=>"Ukraina", "name:fa"=>"اوکراین", "name:fi"=>"Ukraina", "name:fo"=>"Ukraina", "name:fr"=>"Ukraine", "name:fy"=>"Oekraïne", "name:ga"=>"An Úcráin", "name:gd"=>"An Ucràin", "name:gl"=>"Ucraína", "name:gn"=>"Ukyaña", "name:gu"=>"યુક્રેન", "name:gv"=>"Yn Ookraan", "name:he"=>"אוקראינה", "name:hi"=>"युक्रेन", "name:hr"=>"Ukrajina", "name:ht"=>"Ikrèn", "name:hu"=>"Ukrajna", "name:hy"=>"Ուկրաինա", "name:ia"=>"Ukraina", "name:id"=>"Ukraina", "name:ie"=>"Ucraina", "name:ig"=>"Yukrain", "name:io"=>"Ukrainia", "name:is"=>"Úkraína", "name:it"=>"Ucraina", "name:ja"=>"ウクライナ", "name:jv"=>"Ukraina", "name:ka"=>"უკრაინა", "name:kg"=>"Ukrayina", "name:kk"=>"Украина", "name:kl"=>"Ukraine", "name:km"=>"អ៊ុយក្រែន", "name:kn"=>"ಯುಕ್ರೇನ್", "name:ko"=>"우크라이나", "name:ku"=>"Ûkrayna", "name:kv"=>"Украина", "name:kw"=>"Ukrayn", "name:ky"=>"Украина", "name:la"=>"Ucraina", "name:lb"=>"Ukrain", "name:li"=>"Oekraïne", "name:ln"=>"Ukraine", "name:lt"=>"Ukraina", "name:lv"=>"Ukraina", "name:mg"=>"Okraina", "name:mi"=>"Ūkareinga", "name:mk"=>"Украина", "name:ml"=>"ഉക്രൈൻ", "name:mn"=>"Украйн", "name:mr"=>"युक्रेन", "name:ms"=>"Ukraine", "name:mt"=>"Ukrajna", "name:my"=>"ယူကရိန်းနိုင်ငံ", "name:na"=>"Ukraine", "name:ne"=>"युक्रेन", "name:nl"=>"Oekraïne", "name:nn"=>"Ukraina", "name:no"=>"Ukraina", "name:nv"=>"Yóókwein", "name:oc"=>"Ucraïna", "name:or"=>"ୟୁକ୍ରେନ", "name:os"=>"Украинæ", "name:pa"=>"ਯੂਕ੍ਰੇਨ", "name:pl"=>"Ukraina", "name:ps"=>"اوکراین", "name:pt"=>"Ucrânia", "name:qu"=>"Ukranya", "name:rm"=>"Ucraina", "name:ro"=>"Ucraina", "name:ru"=>"Украина", "name:rw"=>"Ikerene", "name:sc"=>"Ucraina", "name:se"=>"Ukraina", "name:sh"=>"Ukrajina", "name:sk"=>"Ukrajina", "name:sl"=>"Ukrajina", "name:sm"=>"Ukraine", "name:sn"=>"Ukraine", "name:so"=>"Ukrain", "name:sq"=>"Ukraina", "name:sr"=>"Украјина", "name:ss"=>"IYukhureni", "name:su"=>"Ukraina", "name:sv"=>"Ukraina", "name:sw"=>"Ukraine", "name:ta"=>"உக்ரைன்", "name:te"=>"ఉక్రెయిన్", "name:tg"=>"Украйина", "name:th"=>"ประเทศยูเครน", "name:tk"=>"Ukraina", "name:tl"=>"Ukranya", "name:tr"=>"Ukrayna", "name:ts"=>"Ukraine", "name:tt"=>"Украина", "name:tw"=>"Ukraine", "name:ug"=>"ئۇكرائىنا", "name:uk"=>"Україна", "name:ur"=>"یوکرین", "name:uz"=>"Ukraina", "name:vi"=>"Ukraina", "name:vo"=>"Lukrayän", "name:wa"=>"Oucrinne", "name:wo"=>"Ukreen", "name:yi"=>"אוקראינע", "name:yo"=>"Ukréìn", "name:zh"=>"乌克兰/烏克蘭"
-uy     "name"=>"Uruguay", "name:af"=>"Uruguay", "name:ak"=>"Yurugwae", "name:am"=>"ኡራጓይ", "name:an"=>"Uruguai", "name:ar"=>"أوروغواي", "name:ay"=>"Uruwayi", "name:az"=>"Uruqvay", "name:ba"=>"Уругвай", "name:be"=>"Уругвай", "name:bg"=>"Уругвай", "name:bi"=>"Uruguay", "name:bm"=>"Urugwayi", "name:bn"=>"উরুগুয়ে", "name:bo"=>"ཨུ་རུ་གུ་ཡེ།", "name:br"=>"Uruguay", "name:bs"=>"Urugvaj", "name:ca"=>"Uruguai", "name:ce"=>"Уругвай", "name:co"=>"Uruguay", "name:cs"=>"Uruguay", "name:cu"=>"Оуроугваи", "name:cv"=>"Уругвай", "name:cy"=>"Uruguay", "name:da"=>"Uruguay", "name:de"=>"Uruguay", "name:dv"=>"އުރުގުއޭ", "name:dz"=>"ཡུ་རུ་གུ་ཝའི", "name:ee"=>"uruguaydukɔ", "name:el"=>"Ουρουγουάη", "name:en"=>"Uruguay", "name:eo"=>"Urugvajo", "name:es"=>"Uruguay", "name:et"=>"Uruguay", "name:eu"=>"Uruguai", "name:fa"=>"اروگوئه", "name:ff"=>"Uruguwaay", "name:fi"=>"Uruguay", "name:fo"=>"Uruguei", "name:fr"=>"Uruguay", "name:fy"=>"Urûguay", "name:ga"=>"Uragua", "name:gd"=>"Uruguaidh", "name:gl"=>"Uruguai", "name:gn"=>"Uruguái", "name:gu"=>"ઉરુગ્વે", "name:gv"=>"Yn Ooraguay", "name:ha"=>"Yurugai", "name:he"=>"אורוגוואי", "name:hi"=>"उरुग्वे", "name:hr"=>"Urugvaj", "name:ht"=>"Irigwe", "name:hu"=>"Uruguay", "name:hy"=>"Ուրուգվայ", "name:ia"=>"Uruguay", "name:id"=>"Uruguay", "name:ie"=>"Uruguay", "name:io"=>"Uruguay", "name:is"=>"Úrúgvæ", "name:it"=>"Uruguay", "name:ja"=>"ウルグアイ", "name:jv"=>"Uruguay", "name:ka"=>"ურუგვაი", "name:ki"=>"Urugwai", "name:kk"=>"Уругвай", "name:kl"=>"Uruguay", "name:km"=>"អ៊ុយរុយហ្គាយ", "name:kn"=>"ಉರುಗ್ವೆ", "name:ko"=>"우루과이", "name:ks"=>"یوٗروگے", "name:ku"=>"Ûrûguay", "name:kw"=>"Urugway", "name:la"=>"Uraquaria", "name:lb"=>"Uruguay", "name:lg"=>"Wurugwayi", "name:li"=>"Urugay", "name:ln"=>"Ulugwai", "name:lo"=>"ອຸລຸກວຍ", "name:lt"=>"Urugvajus", "name:lv"=>"Urugvaja", "name:mg"=>"Orogoay", "name:mi"=>"Urukoi", "name:mk"=>"Уругвај", "name:ml"=>"ഉറുഗ്വേ", "name:mn"=>"Уругвай", "name:mr"=>"उरुग्वे", "name:ms"=>"Uruguay", "name:mt"=>"Urugwaj", "name:my"=>"ဥရုဂွေးနိုင်ငံ", "name:ne"=>"उरुग्वाइ", "name:nl"=>"Uruguay", "name:nn"=>"Uruguay", "name:no"=>"Uruguay", "name:nv"=>"Táłtłʼááh Chʼosh Bitooh (Kéyah Dah Siʼánígíí)", "name:oc"=>"Uruguai", "name:or"=>"ଉରୁଗୁଏ", "name:os"=>"Уругвай", "name:pa"=>"ਉਰੂਗੁਏ", "name:pl"=>"Urugwaj", "name:ps"=>"یوروګوای", "name:pt"=>"Uruguai", "name:qu"=>"Uruwayi", "name:rm"=>"Uruguay", "name:rn"=>"Irigwe", "name:ro"=>"Uruguay", "name:ru"=>"Уругвай", "name:rw"=>"Irigwe", "name:sa"=>"उरुग्वाय", "name:sc"=>"Uruguay", "name:se"=>"Uruguay", "name:sg"=>"Uruguëe", "name:sh"=>"Urugvaj", "name:si"=>"උරුගුවායි", "name:sk"=>"Uruguaj", "name:sl"=>"Urugvaj", "name:so"=>"Uruguwaay", "name:sq"=>"Uruguaji", "name:sr"=>"Уругвај", "name:su"=>"Uruguay", "name:sv"=>"Uruguay", "name:sw"=>"Urugwai", "name:ta"=>"உருகுவை", "name:te"=>"ఉరుగువే", "name:tg"=>"Уругуай", "name:th"=>"ประเทศอุรุกวัย", "name:ti"=>"ኡራጓይ", "name:tl"=>"Urugway", "name:to"=>"ʻUlukuei", "name:tr"=>"Uruguay", "name:tt"=>"Уругвай", "name:ug"=>"ئۇرۇگۋاي", "name:uk"=>"Уругвай", "name:ur"=>"یوراگوئے", "name:uz"=>"Urugvay", "name:vi"=>"Uruguay", "name:vo"=>"Luruguyän", "name:wa"=>"Ourougway", "name:wo"=>"Uruguwaay", "name:yi"=>"אורוגוויי", "name:yo"=>"Urugúáì", "name:zh"=>"乌拉圭", "name:zu"=>"i-Uruguay"
-ki     "name"=>"Kiribati", "name:ar"=>"كيريباس", "name:be"=>"Кірыбаці", "name:br"=>"Kiribati", "name:da"=>"Kiribati", "name:el"=>"Κιριμπάτι", "name:en"=>"Kiribati", "name:eo"=>"Kiribato", "name:fa"=>"کیریباتی", "name:fi"=>"Kiribati", "name:fr"=>"Kiribati", "name:fy"=>"Kiribaty", "name:ga"=>"Cireabaití", "name:he"=>"קיריבטי", "name:hu"=>"Kiribati", "name:is"=>"Kíribatí", "name:li"=>"Kiribati-eilen", "name:lt"=>"Kiribatis", "name:lv"=>"Kiribati", "name:mn"=>"Кирибати", "name:pl"=>"Kiribati", "name:ru"=>"Кирибати", "name:sv"=>"Kiribati", "name:th"=>"ประเทศคิริบาส", "name:uk"=>"Кірибаті", "name:zh"=>"基里巴斯"
-fj     "name"=>"Viti", "name:af"=>"Fidji", "name:am"=>"ፊጂ", "name:an"=>"Fichi", "name:ar"=>"فيجي", "name:az"=>"Fici", "name:ba"=>"Фиджи", "name:be"=>"Фіджы", "name:bg"=>"Фиджи", "name:bh"=>"फिजी", "name:bn"=>"ফিজি", "name:bo"=>"ཧྥི་ཇི།", "name:br"=>"Fidji", "name:bs"=>"Fidži", "name:ca"=>"Fiji", "name:ce"=>"Фиджи", "name:cs"=>"Fidži", "name:cv"=>"Фиджи", "name:cy"=>"Fiji", "name:da"=>"Fiji", "name:de"=>"Fidschi", "name:dv"=>"ފިޖީ", "name:el"=>"Φίτζι", "name:en"=>"Fiji", "name:eo"=>"Fiĝioj", "name:es"=>"Fiyi", "name:et"=>"Fidži", "name:eu"=>"Fiji", "name:fa"=>"فیجی", "name:ff"=>"Fiiji", "name:fi"=>"Fidži", "name:fj"=>"Viti", "name:fo"=>"Fiji", "name:fr"=>"Fidji", "name:fy"=>"Fidzjy", "name:ga"=>"Fidsí", "name:gd"=>"Fìdi", "name:gl"=>"Fidxi - Viti", "name:gv"=>"Fiji", "name:he"=>"פיג'י", "name:hi"=>"फ़िजी", "name:hr"=>"Fidži", "name:ht"=>"Fidji", "name:hu"=>"Fidzsi-szigetek", "name:hy"=>"Ֆիջի", "name:ia"=>"Fiji", "name:id"=>"Fiji", "name:io"=>"Fidji", "name:is"=>"Fídjieyjar", "name:it"=>"Figi", "name:ja"=>"フィジー", "name:jv"=>"Fiji", "name:ka"=>"ფიჯი", "name:kk"=>"Фиджи", "name:kn"=>"ಫಿಜಿ", "name:ko"=>"피지", "name:ku"=>"Fîjî", "name:kw"=>"Fiji", "name:la"=>"Viti", "name:lb"=>"Fidschi", "name:li"=>"Fiji", "name:lt"=>"Fidžis", "name:lv"=>"Fidži", "name:mi"=>"Whītī", "name:mk"=>"Фиџи", "name:ml"=>"ഫിജി", "name:mn"=>"Фижи", "name:mr"=>"फिजी", "name:ms"=>"Fiji", "name:mt"=>"Fiġi", "name:my"=>"ဖီဂျီနိုင်ငံ", "name:na"=>"Bidji", "name:ne"=>"फिजी", "name:nl"=>"Fiji", "name:nn"=>"Fiji", "name:no"=>"Fiji", "name:nv"=>"Fííjii", "name:oc"=>"Fiji", "name:or"=>"ଫିଜି", "name:os"=>"Фиджи", "name:pa"=>"ਫ਼ਿਜੀ", "name:pl"=>"Fidżi", "name:pt"=>"Fiji", "name:qu"=>"Phiyi", "name:ro"=>"Fiji", "name:ru"=>"Фиджи", "name:rw"=>"Fiji", "name:sa"=>"फिजी", "name:se"=>"Fiži", "name:sg"=>"Fidyïi", "name:sh"=>"Fidži", "name:si"=>"ෆීජි", "name:sk"=>"Fidži", "name:sl"=>"Fidži", "name:sm"=>"Fiti", "name:so"=>"Fiji", "name:sq"=>"Fixhi", "name:sr"=>"Фиџи", "name:su"=>"Fiji", "name:sv"=>"Fiji", "name:sw"=>"Fiji", "name:ta"=>"பிஜி", "name:te"=>"ఫిజీ", "name:tg"=>"Фиҷи", "name:th"=>"ประเทศฟิจิ", "name:tl"=>"Piyi", "name:to"=>"Fisi", "name:tr"=>"Fiji", "name:tt"=>"Fiji", "name:ug"=>"فىجى", "name:uk"=>"Фіджі", "name:ur"=>"فجی", "name:uz"=>"Fiji", "name:vi"=>"Fiji", "name:vo"=>"Ficiyuäns", "name:wo"=>"Fiiji", "name:yi"=>"פידזשי", "name:yo"=>"Fíjì", "name:zh"=>"斐濟", "name:zu"=>"IFiji"
-gm     "name"=>"Gambia", "name:af"=>"Gambië", "name:am"=>"ጋምቢያ", "name:an"=>"Gambia", "name:ar"=>"غامبيا", "name:az"=>"Qambiya", "name:ba"=>"Гамбия", "name:be"=>"Гамбія", "name:bg"=>"Гамбия", "name:bm"=>"Gambia", "name:bn"=>"গাম্বিয়া", "name:bo"=>"གེམ་བྷི་ཡ།", "name:br"=>"Gambia", "name:bs"=>"Gambija", "name:ca"=>"Gàmbia", "name:ce"=>"Гамби", "name:cs"=>"Gambie", "name:cv"=>"Гамби", "name:cy"=>"Y Gambia", "name:da"=>"Gambia", "name:de"=>"Gambia", "name:dv"=>"ގެމްބިއާ", "name:dz"=>"གྷེམ་བི་ཡ", "name:ee"=>"Gambia", "name:el"=>"Γκάμπια", "name:en"=>"The Gambia", "name:eo"=>"Gambio", "name:es"=>"Gambia", "name:et"=>"Gambia", "name:eu"=>"Gambia", "name:fa"=>"گامبیا", "name:ff"=>"Gammbi", "name:fi"=>"Gambia", "name:fo"=>"Gambia", "name:fr"=>"Gambie", "name:fy"=>"Gambia", "name:ga"=>"An Ghaimbia", "name:gd"=>"A' Ghaimbia", "name:gl"=>"Gambia", "name:gv"=>"Yn Ghambia", "name:he"=>"גמביה", "name:hi"=>"गाम्बिया", "name:hr"=>"Gambija", "name:ht"=>"Ganbi", "name:hu"=>"Gambia", "name:hy"=>"Գամբիա", "name:ia"=>"Gambia", "name:id"=>"Gambia", "name:ie"=>"The Gambia", "name:io"=>"Gambia", "name:is"=>"Gambía", "name:it"=>"Gambia", "name:ja"=>"ガンビア", "name:jv"=>"Gambia", "name:ka"=>"გამბია", "name:kg"=>"Gambia", "name:ki"=>"Gambia", "name:kk"=>"Гамбия", "name:ko"=>"감비아", "name:ku"=>"Gambiya", "name:kw"=>"Gambi", "name:ky"=>"Гамбия", "name:la"=>"Gambia", "name:lb"=>"Gambia", "name:li"=>"Gambia", "name:ln"=>"Gambi", "name:lt"=>"Gambija", "name:lv"=>"Gambija", "name:mk"=>"Гамбија", "name:ml"=>"ഗാംബിയ", "name:mn"=>"Гамби", "name:mr"=>"गांबिया", "name:ms"=>"Gambia", "name:mt"=>"Gambja", "name:my"=>"ဂမ်ဘီယာနိုင်ငံ", "name:na"=>"Gambiya", "name:nb"=>"Gambia", "name:ne"=>"गाम्बिया", "name:nl"=>"Gambia", "name:nn"=>"Gambia", "name:no"=>"Gambia", "name:nv"=>"Géémbiya", "name:oc"=>"Gàmbia", "name:or"=>"ଗାମ୍ବିଆ", "name:os"=>"Гамби", "name:pa"=>"ਗਾਂਬੀਆ", "name:pl"=>"Gambia", "name:ps"=>"ګامبيا", "name:pt"=>"Gâmbia", "name:qu"=>"Gambya", "name:rm"=>"Gambia", "name:ro"=>"Gambia", "name:ru"=>"Гамбия", "name:rw"=>"Gambiya", "name:sa"=>"गाम्बिया", "name:sc"=>"Gàmbia", "name:sd"=>"گيمبيا", "name:se"=>"Gambia", "name:sg"=>"Gambïi", "name:sh"=>"Gambija", "name:sk"=>"Gambia", "name:sl"=>"Gambija", "name:sn"=>"Gambia", "name:so"=>"Gambia", "name:sq"=>"Gambia", "name:sr"=>"Гамбија", "name:ss"=>"IGambiya", "name:st"=>"Gambia", "name:su"=>"Gambia", "name:sv"=>"Gambia", "name:sw"=>"Gambia", "name:ta"=>"காம்பியா", "name:te"=>"గాంబియా", "name:tg"=>"Гамбия", "name:th"=>"ประเทศแกมเบีย", "name:tk"=>"Gambiýa", "name:tl"=>"Ang Gambiya", "name:tr"=>"Gambiya", "name:ts"=>"Gambiya", "name:tt"=>"Гамбия", "name:ug"=>"گامبىيە", "name:uk"=>"Гамбія", "name:ur"=>"گیمبیا", "name:uz"=>"Gambia", "name:vi"=>"Gambia", "name:vo"=>"Gambiyän", "name:wo"=>"Gàmbi", "name:yi"=>"די גאמביע", "name:yo"=>"Gámbíà", "name:zh"=>"冈比亚", "name:zu"=>"IGambia"
-gy     "name"=>"Guyana", "name:af"=>"Guyana", "name:am"=>"ጋያና", "name:an"=>"Guyana", "name:ar"=>"غويانا", "name:ay"=>"Wayana", "name:az"=>"Qayana", "name:ba"=>"Гайана", "name:be"=>"Гаяна", "name:bg"=>"Гвиана", "name:bn"=>"গায়ানা", "name:bo"=>"གུ་ཡ་ན།", "name:br"=>"Guyana", "name:bs"=>"Gvajana", "name:ca"=>"Guyana", "name:ce"=>"Гайана", "name:cs"=>"Guyana", "name:cv"=>"Гайана", "name:cy"=>"Guyana", "name:da"=>"Guyana", "name:de"=>"Guyana", "name:dv"=>"ގުޔާނާ", "name:ee"=>"Guyana", "name:el"=>"Γουιάνα", "name:en"=>"Guyana", "name:eo"=>"Gujano", "name:es"=>"Guyana", "name:et"=>"Guyana", "name:eu"=>"Guyana", "name:fa"=>"گویان", "name:fi"=>"Guyana", "name:fo"=>"Gujana", "name:fr"=>"Guyana", "name:fy"=>"Guyana", "name:ga"=>"An Ghuáin", "name:gd"=>"Guiana", "name:gl"=>"Güiana", "name:gn"=>"Gujána", "name:gu"=>"ગુયાના", "name:gv"=>"Geeaaney", "name:he"=>"גיאנה", "name:hi"=>"गयाना", "name:hr"=>"Gvajana", "name:ht"=>"Giyàn", "name:hu"=>"Guyana", "name:hy"=>"Գայանա", "name:ia"=>"Guyana", "name:id"=>"Guyana", "name:ie"=>"Guyana", "name:io"=>"Guyana", "name:is"=>"Gvæjana", "name:it"=>"Guyana", "name:ja"=>"ガイアナ", "name:jv"=>"Guyana", "name:ka"=>"გაიანა", "name:kk"=>"Гайана", "name:kl"=>"Guyana", "name:kn"=>"ಗಯಾನ", "name:ko"=>"가이아나", "name:ku"=>"Guyana", "name:kw"=>"Gwayana", "name:la"=>"Guiana", "name:lb"=>"Guyana", "name:li"=>"Guyana", "name:ln"=>"Gwiana", "name:lt"=>"Gajana", "name:lv"=>"Gajāna", "name:mi"=>"Kaiana", "name:mk"=>"Гвајана", "name:ml"=>"ഗയാന", "name:mn"=>"Гайана", "name:mr"=>"गयाना", "name:ms"=>"Guyana", "name:mt"=>"Gujana", "name:my"=>"ဂိုင်ယာနာနိုင်ငံ", "name:na"=>"Guyana", "name:ne"=>"गुयना", "name:nl"=>"Guyana", "name:nn"=>"Guyana", "name:no"=>"Guyana", "name:oc"=>"Guyana", "name:or"=>"ଗାଇଓନା", "name:os"=>"Гайанæ", "name:pa"=>"ਗੁਇਆਨਾ", "name:pl"=>"Gujana", "name:ps"=>"ګويانا", "name:pt"=>"Guiana", "name:qu"=>"Wayana", "name:ro"=>"Guyana", "name:ru"=>"Гайана", "name:rw"=>"Giyana", "name:sa"=>"गयाना", "name:sc"=>"Guyana", "name:se"=>"Guyana", "name:sh"=>"Gvajana", "name:sk"=>"Guyana", "name:sl"=>"Gvajana", "name:so"=>"Guyana", "name:sq"=>"Guajana", "name:sr"=>"Гвајана", "name:su"=>"Guyana", "name:sv"=>"Guyana", "name:sw"=>"Guyana", "name:ta"=>"கயானா", "name:te"=>"గయానా", "name:th"=>"ประเทศกายอานา", "name:tl"=>"Guyana", "name:tr"=>"Guyana", "name:tt"=>"Гайана", "name:ug"=>"گايانا", "name:uk"=>"Гаяна", "name:ur"=>"گیانا", "name:uz"=>"Gayana", "name:vi"=>"Guyana", "name:vo"=>"Gvayän", "name:wo"=>"Guyaana", "name:yi"=>"גויאנע", "name:yo"=>"Gùyánà", "name:zh"=>"圭亚那"
-zm     "name"=>"Zambia", "name:af"=>"Zambië", "name:am"=>"ዛምቢያ", "name:an"=>"Zambia", "name:ar"=>"زامبيا", "name:az"=>"Zambiya", "name:ba"=>"Замбия", "name:be"=>"Замбія", "name:bg"=>"Замбия", "name:bm"=>"Zanbia", "name:bn"=>"জাম্বিয়া", "name:bo"=>"ཛམ་བི་ཡ།", "name:br"=>"Zambia", "name:bs"=>"Zambija", "name:ca"=>"Zàmbia", "name:ce"=>"Замби", "name:cs"=>"Zambie", "name:cv"=>"Замби", "name:cy"=>"Zambia", "name:da"=>"Zambia", "name:de"=>"Sambia", "name:dv"=>"ޒެމްބިއާ", "name:ee"=>"Zambia", "name:el"=>"Ζάμπια", "name:en"=>"Zambia", "name:eo"=>"Zambio", "name:es"=>"Zambia", "name:et"=>"Sambia", "name:eu"=>"Zambia", "name:fa"=>"زامبیا", "name:fi"=>"Sambia", "name:fo"=>"Sambia", "name:fr"=>"Zambie", "name:fy"=>"Sambia", "name:ga"=>"An tSaimbia", "name:gd"=>"Saimbia", "name:gl"=>"Zambia", "name:gv"=>"Yn Tambia", "name:he"=>"זמביה", "name:hi"=>"ज़ाम्बिया", "name:hr"=>"Zambija", "name:ht"=>"Zanbi", "name:hu"=>"Zambia", "name:hy"=>"Զամբիա", "name:id"=>"Zambia", "name:ie"=>"Zambia", "name:io"=>"Zambia", "name:is"=>"Sambía", "name:it"=>"Zambia", "name:ja"=>"ザンビア", "name:jv"=>"Zambia", "name:ka"=>"ზამბია", "name:kg"=>"Zambia", "name:kk"=>"Замбия", "name:km"=>"ប្រទេសហ្សំប៊ី", "name:ko"=>"잠비아", "name:ku"=>"Zambiya", "name:kw"=>"Zambi", "name:la"=>"Zambia", "name:lb"=>"Sambia", "name:li"=>"Zambia", "name:ln"=>"Zambia", "name:lt"=>"Zambija", "name:lv"=>"Zambija", "name:mi"=>"Tāmipia", "name:mk"=>"Замбија", "name:ml"=>"സാംബിയ", "name:mn"=>"Замби", "name:mr"=>"झांबिया", "name:ms"=>"Zambia", "name:mt"=>"Żambja", "name:my"=>"ဇမ်ဘီယာနိုင်ငံ", "name:nl"=>"Zambia", "name:nn"=>"Zambia", "name:no"=>"Zambia", "name:ny"=>"Zambia", "name:oc"=>"Zambia", "name:or"=>"ଜାମ୍ବିଆ", "name:os"=>"Замби", "name:pa"=>"ਜ਼ਾਂਬੀਆ", "name:pl"=>"Zambia", "name:ps"=>"زېمبيا", "name:pt"=>"Zâmbia", "name:qu"=>"Sambya", "name:ro"=>"Zambia", "name:ru"=>"Замбия", "name:rw"=>"Zambiya", "name:sa"=>"जाम्बिया", "name:sc"=>"Zàmbia", "name:se"=>"Zambia", "name:sg"=>"Zambïi", "name:sh"=>"Zambija", "name:sk"=>"Zambia", "name:sl"=>"Zambija", "name:sn"=>"Zambia", "name:so"=>"Saambiya", "name:sq"=>"Zambia", "name:sr"=>"Замбија", "name:ss"=>"IZambiya", "name:su"=>"Zambia", "name:sv"=>"Zambia", "name:sw"=>"Zambia", "name:ta"=>"சாம்பியா", "name:te"=>"జాంబియా", "name:tg"=>"Замбия", "name:th"=>"ประเทศแซมเบีย", "name:ti"=>"ዛምቢያ", "name:tk"=>"Zambiýa", "name:tl"=>"Sambya", "name:tn"=>"Zambia", "name:tr"=>"Zambiya", "name:ts"=>"Zambia", "name:tt"=>"Замбия", "name:ug"=>"زامبىيە", "name:uk"=>"Замбія", "name:ur"=>"زیمبیا", "name:uz"=>"Zambiya", "name:vi"=>"Zambia", "name:vo"=>"Zambiyän", "name:wo"=>"Saambi", "name:yi"=>"זאמביע", "name:yo"=>"Sámbíà", "name:zh"=>"赞比亚", "name:zu"=>"IZambiya"
-lr     "name"=>"Liberia", "name:af"=>"Liberië", "name:am"=>"ላይቤሪያ", "name:an"=>"Liberia", "name:ar"=>"ليبيريا", "name:az"=>"Liberiya", "name:ba"=>"Либерия", "name:be"=>"Ліберыя", "name:bg"=>"Либерия", "name:bm"=>"Liberia", "name:bn"=>"লাইবেরিয়া", "name:bo"=>"ལི་བེ་རི་ཡ།", "name:br"=>"Liberia", "name:bs"=>"Liberija", "name:ca"=>"Libèria", "name:ce"=>"Либери", "name:cs"=>"Libérie", "name:cv"=>"Либери", "name:cy"=>"Liberia", "name:da"=>"Liberia", "name:de"=>"Liberia", "name:dv"=>"ލައިބީރިއާ", "name:ee"=>"Liberia", "name:el"=>"Λιβερία", "name:en"=>"Liberia", "name:eo"=>"Liberio", "name:es"=>"Liberia", "name:et"=>"Libeeria", "name:eu"=>"Liberia", "name:fa"=>"لیبریا", "name:ff"=>"Labiriyaa", "name:fi"=>"Liberia", "name:fo"=>"Liberia", "name:fr"=>"Liberia", "name:fy"=>"Libearia", "name:ga"=>"An Libéir", "name:gd"=>"Libèiria", "name:gl"=>"Liberia", "name:gv"=>"Yn Laibeer", "name:he"=>"ליבריה", "name:hi"=>"लाइबेरिया", "name:hr"=>"Liberija", "name:ht"=>"Liberya", "name:hu"=>"Libéria", "name:hy"=>"Լիբերիա", "name:ia"=>"Liberia", "name:id"=>"Liberia", "name:ie"=>"Liberia", "name:io"=>"Liberia", "name:is"=>"Líbería", "name:it"=>"Liberia", "name:ja"=>"リベリア", "name:jv"=>"Liberia", "name:ka"=>"ლიბერია", "name:kg"=>"Liberia", "name:kk"=>"Либерия", "name:kn"=>"ಲೈಬೀರಿಯ", "name:ko"=>"라이베리아", "name:ku"=>"Lîberya", "name:kw"=>"Liberi", "name:la"=>"Liberia", "name:lb"=>"Liberia", "name:li"=>"Liberia", "name:ln"=>"Liberia", "name:lt"=>"Liberija", "name:lv"=>"Libērija", "name:mi"=>"Raipiri", "name:mk"=>"Либерија", "name:ml"=>"ലൈബീരിയ", "name:mn"=>"Либери", "name:mr"=>"लायबेरिया", "name:ms"=>"Liberia", "name:mt"=>"Liberja", "name:my"=>"လိုက်ဘေးရီးယားနိုင်ငံ", "name:nl"=>"Liberia", "name:nn"=>"Liberia", "name:no"=>"Liberia", "name:oc"=>"Libèria", "name:or"=>"ଲାଇବେରିଆ", "name:os"=>"Либери", "name:pl"=>"Liberia", "name:ps"=>"لايبېريا", "name:pt"=>"Libéria", "name:qu"=>"Libirya", "name:rm"=>"Liberia", "name:ro"=>"Liberia", "name:ru"=>"Либерия", "name:rw"=>"Liberiya", "name:sa"=>"लायबीरिया", "name:sc"=>"Libèria", "name:se"=>"Liberia", "name:sg"=>"Liberïa", "name:sh"=>"Liberija", "name:sk"=>"Libéria", "name:sl"=>"Liberija", "name:sn"=>"Liberia", "name:so"=>"Liberia", "name:sq"=>"Liberia", "name:sr"=>"Либерија", "name:ss"=>"ILibheriya", "name:st"=>"Liberia", "name:su"=>"Liberia", "name:sv"=>"Liberia", "name:sw"=>"Liberia", "name:ta"=>"லைபீரியா", "name:tg"=>"Либерия", "name:th"=>"ประเทศไลบีเรีย", "name:tk"=>"Liberiýa", "name:tl"=>"Liberia", "name:tr"=>"Liberya", "name:ts"=>"Layiberiya", "name:tt"=>"Либерия", "name:ug"=>"لىبېرىيە", "name:uk"=>"Ліберія", "name:ur"=>"لائبیریا", "name:uz"=>"Liberiya", "name:vi"=>"Liberia", "name:vo"=>"Liberän", "name:wo"=>"Libeeria", "name:yi"=>"ליבעריע", "name:yo"=>"Làìbéríà", "name:zh"=>"利比里亚", "name:zu"=>"ILiberia"
-ng     "name"=>"Nigeria", "name:af"=>"Nigerië", "name:ak"=>"Nigeria", "name:am"=>"ናይጄሪያ", "name:an"=>"Nicheria", "name:ar"=>"نيجيريا", "name:az"=>"Nigeriya", "name:ba"=>"Нигерия", "name:be"=>"Нігерыя", "name:bg"=>"Нигерия", "name:bm"=>"Nijeria", "name:bn"=>"নাইজেরিয়া", "name:bo"=>"ནི་ཇི་རི་ཡ།", "name:br"=>"Nigeria", "name:bs"=>"Nigerija", "name:ca"=>"Nigèria", "name:ce"=>"Нигери", "name:cs"=>"Nigérie", "name:cv"=>"Нигери", "name:cy"=>"Nigeria", "name:da"=>"Nigeria", "name:de"=>"Nigeria", "name:dv"=>"ނައިޖީރިއާ", "name:ee"=>"Nigeria", "name:el"=>"Νιγηρία", "name:en"=>"Nigeria", "name:eo"=>"Niĝerio", "name:es"=>"Nigeria", "name:et"=>"Nigeeria", "name:eu"=>"Nigeria", "name:fa"=>"نیجریه", "name:ff"=>"Niiseriya", "name:fi"=>"Nigeria", "name:fo"=>"Nigeria", "name:fr"=>"Nigéria", "name:fy"=>"Nigearia", "name:ga"=>"An Nigéir", "name:gd"=>"Nìgeiria", "name:gl"=>"Nixeria", "name:gn"=>"Niheria", "name:gu"=>"નાઈજેરિયા", "name:gv"=>"Yn Naigeer", "name:ha"=>"Nijeriya", "name:he"=>"ניגריה", "name:hi"=>"नाईजीरिया", "name:hr"=>"Nigerija", "name:ht"=>"Nijerya", "name:hu"=>"Nigéria", "name:hy"=>"Նիգերիա", "name:ia"=>"Nigeria", "name:id"=>"Nigeria", "name:ie"=>"Nigeria", "name:ig"=>"Naigeria", "name:io"=>"Nigeria", "name:is"=>"Nígería", "name:it"=>"Nigeria", "name:ja"=>"ナイジェリア", "name:jv"=>"Nigeria", "name:ka"=>"ნიგერია", "name:kg"=>"Nizeria", "name:kk"=>"Нигерия", "name:kn"=>"ನೈಜೀರಿಯ", "name:ko"=>"나이지리아", "name:ks"=>"نایجیرِیا", "name:ku"=>"Nîjerya", "name:kw"=>"Nijeri", "name:la"=>"Nigeria", "name:lb"=>"Nigeria", "name:li"=>"Nigeria", "name:ln"=>"Nizeria", "name:lt"=>"Nigerija", "name:lv"=>"Nigērija", "name:mg"=>"Nizeria", "name:mi"=>"Ngāitiria", "name:mk"=>"Нигерија", "name:ml"=>"നൈജീരിയ", "name:mn"=>"Нигери", "name:mr"=>"नायजेरिया", "name:ms"=>"Nigeria", "name:mt"=>"Niġerja", "name:my"=>"နိုင်ဂျီးရီးယားနိုင်ငံ", "name:ne"=>"नाइजेरिया", "name:nl"=>"Nigeria", "name:nn"=>"Nigeria", "name:no"=>"Nigeria", "name:oc"=>"Nigèria", "name:or"=>"ନାଇଜେରିଆ", "name:os"=>"Нигери", "name:pa"=>"ਨਾਈਜੀਰੀਆ", "name:pl"=>"Nigeria", "name:ps"=>"نايجېريا", "name:pt"=>"Nigéria", "name:qu"=>"Niqirya", "name:ro"=>"Nigeria", "name:ru"=>"Нигерия", "name:rw"=>"Nijeriya", "name:sa"=>"नैजीरिया", "name:sc"=>"Nigéria", "name:se"=>"Nigeria", "name:sg"=>"Nizerïa", "name:sh"=>"Nigerija", "name:sk"=>"Nigéria", "name:sl"=>"Nigerija", "name:sn"=>"Nigeria", "name:so"=>"Nayjeeriya", "name:sq"=>"Nigeria", "name:sr"=>"Нигерија", "name:ss"=>"INayijeriya", "name:su"=>"Nigeria", "name:sv"=>"Nigeria", "name:sw"=>"Nigeria", "name:ta"=>"நைஜீரியா", "name:te"=>"నైజీరియా", "name:tg"=>"Ниҷерия", "name:th"=>"ประเทศไนจีเรีย", "name:ti"=>"ናይጂሪያ", "name:tk"=>"Nigeriýa", "name:tl"=>"Nigerya", "name:tr"=>"Nijerya", "name:ts"=>"Nigeria", "name:tt"=>"Нигерия", "name:ug"=>"نىگېرىيە", "name:uk"=>"Нігерія", "name:ur"=>"نائجیریا", "name:uz"=>"Nigeriya", "name:vi"=>"Nigeria", "name:vo"=>"Nigeriyän", "name:wa"=>"Nidjeria", "name:xh"=>"INigeria", "name:yi"=>"ניגעריע", "name:yo"=>"Nàìjíríà", "name:za"=>"Nizywlihya", "name:zh"=>"奈及利亞", "name:zu"=>"INigeria"
-sl     "name"=>"Sierra Leone", "name:af"=>"Sierra Leone", "name:ak"=>"Sierra Leone", "name:am"=>"ሴየራ ሌዎን", "name:an"=>"Sierra Leone", "name:ar"=>"سيراليون", "name:az"=>"Syerra-Leone", "name:ba"=>"Сьерра-Леоне", "name:be"=>"Сьера-Леонэ", "name:bg"=>"Сиера Леоне", "name:bm"=>"Sera Leon", "name:bn"=>"সিয়েরা লিওন", "name:bo"=>"སི་ར་ལེ་ཨོན།", "name:br"=>"Sierra Leone", "name:bs"=>"Sijera Leone", "name:ca"=>"Sierra Leone", "name:ce"=>"Сьерра-Леоне", "name:cs"=>"Sierra Leone", "name:cy"=>"Sierra Leone", "name:da"=>"Sierra Leone", "name:de"=>"Sierra Leone", "name:dv"=>"ސެރެލިއޯން", "name:ee"=>"Sierra Leone", "name:el"=>"Σιέρα Λεόνε", "name:en"=>"Sierra Leone", "name:eo"=>"Siera-Leono", "name:es"=>"Sierra Leona", "name:et"=>"Sierra Leone", "name:eu"=>"Sierra Leona", "name:fa"=>"سیرالئون", "name:ff"=>"Sarliyon", "name:fi"=>"Sierra Leone", "name:fo"=>"Sierra Leona", "name:fr"=>"Sierra Leone", "name:fy"=>"Sierra Leöane", "name:ga"=>"Siarra Leon", "name:gd"=>"Siarra Leòmhann", "name:gl"=>"Serra Leoa", "name:gv"=>"Sierra Leone", "name:he"=>"סיירה לאונה", "name:hi"=>"सिएरा लियोन", "name:hr"=>"Sijera Leone", "name:ht"=>"Syera Leòn", "name:hu"=>"Sierra Leone", "name:hy"=>"Սիերա Լեոնե", "name:id"=>"Sierra Leone", "name:ie"=>"Sierra Leone", "name:io"=>"Sierra Leone", "name:is"=>"Síerra Leóne", "name:it"=>"Sierra Leone", "name:ja"=>"シエラレオネ", "name:jv"=>"Sierra Leone", "name:ka"=>"სიერა-ლეონე", "name:kg"=>"Siera Leone", "name:kk"=>"Сиерра-Леоне", "name:kn"=>"ಸಿಯೆರ್ರಾ ಲಿಯೋನ್", "name:ko"=>"시에라리온", "name:ku"=>"Sierra Leone", "name:kw"=>"Sierra Leon", "name:la"=>"Mons Leoninus", "name:lb"=>"Sierra Leone", "name:li"=>"Sierra Leone", "name:ln"=>"Sierra Leone", "name:lt"=>"Siera Leonė", "name:lv"=>"Sjerraleone", "name:mi"=>"Te Araone", "name:mk"=>"Сиера Леоне", "name:ml"=>"സീറാ ലിയോൺ", "name:mn"=>"Сьерра-Леоне", "name:mr"=>"सियेरा लिओन", "name:ms"=>"Sierra Leone", "name:mt"=>"Sierra Leone", "name:my"=>"ဆီရာလီယွန်နိုင်ငံ", "name:nl"=>"Sierra Leone", "name:nn"=>"Sierra Leone", "name:no"=>"Sierra Leone", "name:nv"=>"Náshdóítsoh Bitsiijįʼ Daditłʼooʼígíí Bidził", "name:oc"=>"Sierra Leone", "name:or"=>"ସିଏରା ଲିଓନ", "name:os"=>"Сьеррæ-Леоне", "name:pa"=>"ਸਿਏਰਾ ਲਿਓਨ", "name:pl"=>"Sierra Leone", "name:ps"=>"سېرالیون", "name:pt"=>"Serra Leoa", "name:qu"=>"Liyun Urqu", "name:ro"=>"Sierra Leone", "name:ru"=>"Сьерра-Леоне", "name:rw"=>"Siyera Lewone", "name:sa"=>"सियारा-लियोन", "name:sc"=>"Sierra Leone", "name:se"=>"Sierra Leone", "name:sg"=>"Sierä-Leône", "name:sh"=>"Sijera Leone", "name:si"=>"සියෙරා ලියෝන්", "name:sk"=>"Sierra Leone", "name:sl"=>"Sierra Leone", "name:sn"=>"Sierra Leone", "name:so"=>"Sierra Leone", "name:sq"=>"Siera Leone", "name:sr"=>"Сијера Леоне", "name:ss"=>"ISiriya-Liyoni", "name:su"=>"Sierra Leone", "name:sv"=>"Sierra Leone", "name:sw"=>"Sierra Leone", "name:ta"=>"சியேரா லியோனி", "name:tg"=>"Сиерра Леоне", "name:th"=>"ประเทศเซียร์ราลีโอน", "name:tk"=>"Sýerra-Leone", "name:tl"=>"Bulubunduking Leona", "name:tr"=>"Sierra Leone", "name:ts"=>"Siyera Liyona", "name:tw"=>"Sierra Leone", "name:ug"=>"سيېررا لېئونې", "name:uk"=>"Сьєрра-Леоне", "name:ur"=>"سیرالیون", "name:uz"=>"Syerra Leone", "name:vi"=>"Sierra Leone", "name:vo"=>"Sieraleonän", "name:wo"=>"Siraa Leyoon", "name:yi"=>"סיערע לעאנע", "name:yo"=>"Siẹrra Léònè", "name:zh"=>"塞拉利昂", "name:zu"=>"ISiera Liyoni"
-to     "name"=>"Tonga", "name:af"=>"Tonga", "name:am"=>"ቶንጋ", "name:an"=>"Tonga", "name:ar"=>"تونجا", "name:az"=>"Tonqa", "name:ba"=>"Тонга", "name:be"=>"Тонга", "name:bg"=>"Тонга", "name:bn"=>"টোঙ্গা", "name:bo"=>"ཊོང་ག", "name:br"=>"Tonga", "name:bs"=>"Tonga", "name:ca"=>"Tonga", "name:ce"=>"Тонга", "name:cs"=>"Tonga", "name:cu"=>"Тонга", "name:cy"=>"Tonga", "name:da"=>"Tonga", "name:de"=>"Tonga", "name:dv"=>"ޓޮންގާ", "name:el"=>"Τόνγκα", "name:en"=>"Tonga", "name:eo"=>"Tongo", "name:es"=>"Tonga", "name:et"=>"Tonga", "name:eu"=>"Tonga", "name:fa"=>"تونگا", "name:fi"=>"Tonga", "name:fo"=>"Tonga", "name:fr"=>"Tonga", "name:fy"=>"Tonga", "name:ga"=>"Tonga", "name:gd"=>"Tonga", "name:gl"=>"Tonga", "name:gv"=>"Yn Tongey", "name:he"=>"טונגה", "name:hi"=>"टोंगा", "name:hr"=>"Tonga", "name:ht"=>"Tonga", "name:hu"=>"Tonga", "name:hy"=>"Տոնգա", "name:ia"=>"Tonga", "name:id"=>"Tonga", "name:io"=>"Tonga", "name:is"=>"Tonga", "name:it"=>"Tonga", "name:ja"=>"トンガ", "name:jv"=>"Tonga", "name:ka"=>"ტონგა", "name:kk"=>"Тонга", "name:kn"=>"ಟೋಂಗಾ", "name:ko"=>"통가", "name:ku"=>"Tonga", "name:kw"=>"Tonga", "name:la"=>"Tonga", "name:lb"=>"Tonga", "name:li"=>"Tonga", "name:lt"=>"Tonga", "name:lv"=>"Tonga", "name:mk"=>"Тонга", "name:ml"=>"ടോങ്ക", "name:mn"=>"Тонга", "name:mr"=>"टोंगा", "name:ms"=>"Tonga", "name:mt"=>"Tonga", "name:my"=>"တုံဂါနိုင်ငံ", "name:nl"=>"Tonga", "name:nn"=>"Tonga", "name:no"=>"Tonga", "name:nv"=>"Tʼónga", "name:oc"=>"Tònga", "name:or"=>"ଟୋଙ୍ଗା", "name:os"=>"Тонгæ", "name:pa"=>"ਟੋਂਗਾ", "name:pl"=>"Tonga", "name:pt"=>"Tonga", "name:qu"=>"Tunqa", "name:rm"=>"Tonga", "name:ro"=>"Tonga", "name:ru"=>"Тонга", "name:rw"=>"Tonga", "name:sa"=>"टोंगा", "name:se"=>"Tonga", "name:sh"=>"Tonga", "name:sk"=>"Tonga", "name:sl"=>"Tonga", "name:sm"=>"Toga", "name:sq"=>"Tonga", "name:sr"=>"Тонга", "name:su"=>"Tonga", "name:sv"=>"Tonga", "name:sw"=>"Tonga", "name:ta"=>"தொங்கா", "name:tg"=>"Тонга", "name:th"=>"ประเทศตองกา", "name:tl"=>"Tonga", "name:to"=>"Tonga", "name:tr"=>"Tonga", "name:ts"=>"Tonga", "name:tw"=>"Tonga", "name:ty"=>"To’a", "name:ug"=>"Ton’ga", "name:uk"=>"Тонга", "name:ur"=>"ٹونگا", "name:uz"=>"Tonga", "name:vi"=>"Tonga", "name:vo"=>"Tonguäns", "name:wo"=>"Tonga", "name:yo"=>"Tóngà", "name:zh"=>"東加"
-mq     "name"=>"Martinique", "name:ar"=>"مارتينيك", "name:be"=>"Марцініка", "name:br"=>"Martinik", "name:ca"=>"Martinica", "name:da"=>"Martinique", "name:el"=>"Μαρτινίκα", "name:en"=>"Martinique", "name:eo"=>"Martiniko", "name:es"=>"Martinica", "name:fa"=>"مارتینیک", "name:fi"=>"Martinique", "name:fr"=>"Martinique", "name:fy"=>"Martinyk", "name:he"=>"מרטיניק", "name:hr"=>"Martinik", "name:hu"=>"Martinique", "name:id"=>"Martinik", "name:is"=>"Martinique", "name:it"=>"Martinica", "name:la"=>"Martinica", "name:lt"=>"Martinika", "name:lv"=>"Martinika", "name:mn"=>"Мартиник", "name:pl"=>"Martynika", "name:ru"=>"Мартиника", "name:sv"=>"Martinique", "name:uk"=>"Мартиніка", "name:zh"=>"馬提尼克"
-zw     "name"=>"Zimbabwe", "name:af"=>"Zimbabwe", "name:am"=>"ዚምባብዌ", "name:an"=>"Zimbabwe", "name:ar"=>"زيمبابوي", "name:az"=>"Zimbabve", "name:ba"=>"Зимбабве", "name:be"=>"Зімбабвэ", "name:bg"=>"Зимбабве", "name:bm"=>"Zimbabwe", "name:bn"=>"জিম্বাবুয়ে", "name:bo"=>"ཛིམ་བབ་ཝི།", "name:br"=>"Zimbabwe", "name:bs"=>"Zimbabve", "name:ca"=>"Zimbabwe", "name:ce"=>"Зимбабве", "name:cs"=>"Zimbabwe", "name:cv"=>"Зимбабве", "name:cy"=>"Zimbabwe", "name:da"=>"Zimbabwe", "name:de"=>"Simbabwe", "name:dv"=>"ޒިމްބާބުވޭ", "name:dz"=>"ཛིམ་བབ་ཝེ་", "name:ee"=>"Zimbabwe", "name:el"=>"Ζιμπάμπουε", "name:en"=>"Zimbabwe", "name:eo"=>"Zimbabvo", "name:es"=>"Zimbabue", "name:et"=>"Zimbabwe", "name:eu"=>"Zimbabwe", "name:fa"=>"زیمبابوه", "name:fi"=>"Zimbabwe", "name:fo"=>"Simbabvi", "name:fr"=>"Zimbabwe", "name:fy"=>"Simbabwe", "name:ga"=>"An tSiombáib", "name:gd"=>"Siombabue", "name:gl"=>"Cimbabue", "name:gv"=>"Yn Çhimbabwe", "name:he"=>"זימבבואה", "name:hi"=>"ज़िम्बाब्वे", "name:hr"=>"Zimbabve", "name:ht"=>"Zimbabwe", "name:hu"=>"Zimbabwe", "name:hy"=>"Զիմբաբվե", "name:id"=>"Zimbabwe", "name:ie"=>"Zimbabwe", "name:io"=>"Zimbabwe", "name:is"=>"Simbabve", "name:it"=>"Zimbabwe", "name:ja"=>"ジンバブエ", "name:jv"=>"Zimbabwe", "name:ka"=>"ზიმბაბვე", "name:kg"=>"Zimbabwe", "name:ki"=>"Zimbabwe", "name:kk"=>"Зимбабве", "name:kn"=>"ಜಿಂಬಾಬ್ವೆ", "name:ko"=>"짐바브웨", "name:ku"=>"Zîmbabwe", "name:kw"=>"Zimbabwe", "name:la"=>"Zimbabua", "name:lb"=>"Simbabwe", "name:li"=>"Zimbabwe", "name:ln"=>"Zimbabwe", "name:lt"=>"Zimbabvė", "name:lv"=>"Zimbabve", "name:mi"=>"Timuwawe", "name:mk"=>"Зимбабве", "name:ml"=>"സിംബാബ്വെ", "name:mn"=>"Зимбабве", "name:mr"=>"झिंबाब्वे", "name:ms"=>"Zimbabwe", "name:mt"=>"Żimbabwe", "name:my"=>"ဇင်ဘာဘွေနိုင်ငံ", "name:ne"=>"जिम्बाब्वे", "name:nl"=>"Zimbabwe", "name:nn"=>"Zimbabwe", "name:no"=>"Zimbabwe", "name:nv"=>"Hooghan Tsé Bee Ádaalyaaí Bikéyah", "name:ny"=>"Zimbabwe", "name:oc"=>"Zimbabwe", "name:or"=>"ଜିମ୍ବାୱେ", "name:os"=>"Зимбабве", "name:pa"=>"ਜ਼ਿੰਬਾਬਵੇ", "name:pl"=>"Zimbabwe", "name:ps"=>"زېمبابوې", "name:pt"=>"Zimbabué", "name:qu"=>"Simbabwi", "name:ro"=>"Zimbabwe", "name:ru"=>"Зимбабве", "name:rw"=>"Zimbabwe", "name:sa"=>"जिम्बाबवे", "name:sc"=>"Zimbabwe", "name:se"=>"Zimbabwe", "name:sg"=>"Zimbäbwe", "name:sh"=>"Zimbabve", "name:si"=>"සිම්බාබ්වේ", "name:sk"=>"Zimbabwe", "name:sl"=>"Zimbabve", "name:sn"=>"Zimbabwe", "name:so"=>"Simbaabwi", "name:sq"=>"Zimbabveja", "name:sr"=>"Зимбабве", "name:ss"=>"IZimbabhwe", "name:su"=>"Zimbabwé", "name:sv"=>"Zimbabwe", "name:sw"=>"Zimbabwe", "name:ta"=>"சிம்பாப்வே", "name:te"=>"జింబాబ్వే", "name:tg"=>"Зимбабве", "name:th"=>"ประเทศซิมบับเว", "name:ti"=>"ዚምባብዌ", "name:tk"=>"Zimbabwe", "name:tl"=>"Simbabwe", "name:tn"=>"Zimbabwe", "name:tr"=>"Zimbabve", "name:ts"=>"Zimbabwe", "name:tt"=>"Зимбабве", "name:ug"=>"زىمبابۋې", "name:uk"=>"Зімбабве", "name:ur"=>"زمبابوے", "name:uz"=>"Zimbabve", "name:ve"=>"Zimbagwe", "name:vi"=>"Zimbabwe", "name:vo"=>"Zimbabiyän", "name:wo"=>"Simbaawee", "name:yi"=>"זימבאבווע", "name:yo"=>"Sìmbábúè", "name:zh"=>"辛巴威", "name:zu"=>"IZimbabwe"
-bj     "name"=>"Bénin", "name:af"=>"Benin", "name:ak"=>"Bɛnin", "name:am"=>"ቤኒን", "name:an"=>"Benín", "name:ar"=>"بنين", "name:az"=>"Benin", "name:ba"=>"Бенин", "name:be"=>"Бені́н", "name:bg"=>"Бенин", "name:bh"=>"बेनिन", "name:bm"=>"Benɛn", "name:bn"=>"বেনিন", "name:bo"=>"བེ་ནིན།", "name:br"=>"Benin", "name:bs"=>"Benin", "name:ca"=>"Benín", "name:ce"=>"Бени́н", "name:cs"=>"Benin", "name:cv"=>"Бенин", "name:cy"=>"Benin", "name:da"=>"Benin", "name:de"=>"Benin", "name:dv"=>"ބެނީން", "name:dz"=>"བཱེ་ནིན།", "name:ee"=>"Benɛ̃", "name:el"=>"Μπενίν", "name:en"=>"Benin", "name:eo"=>"Benino", "name:es"=>"Benín", "name:et"=>"Benin", "name:eu"=>"Benin", "name:fa"=>"بنین", "name:ff"=>"Benen", "name:fi"=>"Benin", "name:fo"=>"Benin", "name:fr"=>"Bénin", "name:fy"=>"Benyn", "name:ga"=>"Beinin", "name:gd"=>"Beinin", "name:gl"=>"Benin", "name:gn"=>"Mbenĩ", "name:gu"=>"બેનિન", "name:gv"=>"Benin", "name:ha"=>"Benin", "name:he"=>"בנין", "name:hi"=>"बेनिन", "name:hr"=>"Benin", "name:ht"=>"Benen", "name:hu"=>"Benin", "name:hy"=>"Բենին", "name:ia"=>"Benin", "name:id"=>"Benin", "name:ie"=>"Benin", "name:ig"=>"Benin", "name:io"=>"Benin", "name:is"=>"Benín", "name:it"=>"Benin", "name:ja"=>"ベナン", "name:jv"=>"Bénin", "name:ka"=>"ბენინი", "name:kg"=>"Benin", "name:ki"=>"Benin", "name:kk"=>"Бени́н", "name:kl"=>"Benin", "name:km"=>"បេណាំង", "name:kn"=>"ಬೆನಿನ್", "name:ko"=>"베냉", "name:ks"=>"بِنِن", "name:ku"=>"Bênîn", "name:kw"=>"Benin", "name:ky"=>"Бени́н", "name:la"=>"Beninum", "name:lb"=>"Benin", "name:lg"=>"Benin", "name:li"=>"Benin", "name:ln"=>"Benin", "name:lo"=>"ເບນິນ", "name:lt"=>"Beninas", "name:lv"=>"Benina", "name:mg"=>"Benina", "name:mi"=>"Pēnina", "name:mk"=>"Бенин", "name:ml"=>"ബെനിൻ", "name:mn"=>"Бенин", "name:mr"=>"बेनिन", "name:ms"=>"Benin", "name:mt"=>"Benin", "name:my"=>"ဘီနင်နိုင်ငံ", "name:na"=>"Benin", "name:ne"=>"बेनिन", "name:nl"=>"Benin", "name:nn"=>"Benin", "name:no"=>"Benin", "name:oc"=>"Benin", "name:om"=>"Beeniin", "name:or"=>"ବେନିନ", "name:os"=>"Бенин", "name:pa"=>"ਬੇਨਿਨ", "name:pi"=>"बेनिन", "name:pl"=>"Benin", "name:ps"=>"بېنين", "name:pt"=>"Benim", "name:qu"=>"Binin", "name:rm"=>"Benin", "name:rn"=>"Bene", "name:ro"=>"Benin", "name:ru"=>"Бенин", "name:rw"=>"Bene", "name:sa"=>"बेनिन्", "name:sc"=>"Benin", "name:sd"=>"بينن", "name:se"=>"Benin", "name:sg"=>"Benëen", "name:sh"=>"Benin", "name:si"=>"බෙනින්", "name:sk"=>"Benin", "name:sl"=>"Benin", "name:sn"=>"Benin", "name:so"=>"Benin", "name:sq"=>"Benini", "name:sr"=>"Бенин", "name:ss"=>"iBhenini", "name:st"=>"Benin", "name:su"=>"Bénin", "name:sv"=>"Benin", "name:sw"=>"Benin", "name:ta"=>"பெனின்", "name:te"=>"బెనిన్", "name:tg"=>"Бенѝн", "name:th"=>"เบนิน", "name:ti"=>"ቤኒን", "name:tk"=>"Benin", "name:tl"=>"Benin", "name:to"=>"Penini", "name:tr"=>"Benin", "name:ts"=>"Benin", "name:tt"=>"Бени́н", "name:ug"=>"بېنىن", "name:uk"=>"Бені́н", "name:ur"=>"بینن", "name:uz"=>"Benin", "name:vi"=>"Bénin", "name:vo"=>"Beninän", "name:wo"=>"Bene", "name:yi"=>"בענין", "name:yo"=>"Benin", "name:zh"=>"贝宁", "name:zu"=>"IBenini"
-bf     "name"=>"Burkina Faso", "name:af"=>"Burkina Faso", "name:ak"=>"Burkina Faso", "name:am"=>"ቡርኪና ፋሶ", "name:an"=>"Burkina Faso", "name:ar"=>"بوركينا فاسو", "name:az"=>"Burkina-Faso", "name:ba"=>"Буркина́-Фасо́", "name:be"=>"Буркіна́-Фасо́", "name:bg"=>"Буркина Фасо", "name:bh"=>"बुर्किना फासो", "name:bm"=>"Burukina Faso", "name:bn"=>"বুর্কিনা ফাসো", "name:bo"=>"བུར་ཀི་ན་ཕ་སོ།", "name:br"=>"Burkina Faso", "name:bs"=>"Burkina Faso", "name:ca"=>"Burkina Faso", "name:ce"=>"Буркина-Фасо", "name:cs"=>"Burkina Faso", "name:cv"=>"Буркина Фасо", "name:cy"=>"Bwrcina Ffaso", "name:da"=>"Burkina Faso", "name:de"=>"Burkina Faso", "name:dv"=>"ބުރުކީނާ ފާސޯ", "name:dz"=>"བྷར་ཀི་ན་ ཕེ་སོ", "name:ee"=>"Burkina Faso", "name:el"=>"Μπουρκίνα Φάσο", "name:en"=>"Burkina Faso", "name:eo"=>"Burkina Faso", "name:es"=>"Burkina Faso", "name:et"=>"Burkina Faso", "name:eu"=>"Burkina Faso", "name:fa"=>"بورکینافاسو", "name:ff"=>"Burkina Faso", "name:fi"=>"Burkina Faso", "name:fo"=>"Burkina Faso", "name:fr"=>"Burkina Faso", "name:fy"=>"Boerkina Faso", "name:ga"=>"Buircíne Fasó", "name:gd"=>"Buirciona Faso", "name:gl"=>"Burquina Faso", "name:gu"=>"બુર્કિના ફાસો", "name:gv"=>"Burkina Faso", "name:ha"=>"Burkina faso", "name:he"=>"בורקינה פאסו", "name:hi"=>"बुर्किना फासो", "name:hr"=>"Burkina Faso", "name:ht"=>"Boukinafaso", "name:hu"=>"Burkina Faso", "name:hy"=>"Բուրկինա Ֆասո", "name:ia"=>"Burkina Faso", "name:id"=>"Burkina Faso", "name:ie"=>"Burkina Faso", "name:ig"=>"Burkina Faso", "name:io"=>"Burkina Faso", "name:is"=>"Búrkína Fasó", "name:it"=>"Burkina Faso", "name:ja"=>"ブルキナファソ", "name:jv"=>"Burkina Faso", "name:ka"=>"ბურკინა-ფასო", "name:kg"=>"Burkina Faso", "name:ki"=>"Burkina Faso", "name:kk"=>"Буркина Фасо", "name:km"=>"ប៊ូរគីណាហ្វាសូ", "name:kn"=>"ಬುರ್ಕೀನ ಫಾಸೊ", "name:ko"=>"부르키나파소", "name:ks"=>"بُرکِنا فیسو", "name:ku"=>"Burkîna Faso", "name:kw"=>"Burkina Faso", "name:ky"=>"Буркина-Фасо", "name:la"=>"Burkina Faso", "name:lb"=>"Burkina Faso", "name:lg"=>"Burkina Faso", "name:li"=>"Burkina Faso", "name:ln"=>"Burkina Faso", "name:lo"=>"ເບີກິນາຟາໂຊ", "name:lt"=>"Burkina Fasas", "name:lv"=>"Burkinafaso", "name:mg"=>"Borkina Faso", "name:mk"=>"Буркина Фасо", "name:ml"=>"ബർക്കിനാ ഫാസോ", "name:mn"=>"Буркина Фасо", "name:mr"=>"बर्किना फासो", "name:ms"=>"Burkina Faso", "name:mt"=>"Burkina Faso", "name:my"=>"ဘာကီးနားဖားဆိုနိုင်ငံ", "name:na"=>"Burkinabato", "name:ne"=>"बुर्किना फासो", "name:nl"=>"Burkina Faso", "name:nn"=>"Burkina Faso", "name:no"=>"Burkina Faso", "name:oc"=>"Burkina Faso", "name:om"=>"Burkinaa Faasoo", "name:or"=>"ବୁରକିନା ଫାସୋ", "name:os"=>"Буркина́-Фасо́", "name:pa"=>"ਬੁਰਕੀਨਾ ਫ਼ਾਸੋ", "name:pi"=>"बुर्कीना-फासो", "name:pl"=>"Burkina Faso", "name:ps"=>"بورکینا فاسو", "name:pt"=>"Burquina Faso", "name:qu"=>"Burkina Phasu", "name:rm"=>"Burkina Faso", "name:rn"=>"Burukina Faso", "name:ro"=>"Burkina Faso", "name:ru"=>"Буркина-Фасо", "name:rw"=>"Burukina Faso", "name:sa"=>"बुर्कीना-फासो", "name:sc"=>"Burkina Faso", "name:se"=>"Burkina Faso", "name:sg"=>"Burkina Faso", "name:sh"=>"Burkina Faso", "name:si"=>"බර්කිනා ෆාසෝ", "name:sk"=>"Burkina Faso", "name:sl"=>"Burkina Faso", "name:sm"=>"Burkina Faso", "name:sn"=>"Burkina Faso", "name:so"=>"Burkina Faso", "name:sq"=>"Burkina Faso", "name:sr"=>"Буркина Фасо", "name:ss"=>"iBhukhina-Faso", "name:st"=>"Burkina Faso", "name:su"=>"Burkina Faso", "name:sv"=>"Burkina Faso", "name:sw"=>"Burkina Faso", "name:ta"=>"புர்க்கினா பாசோ", "name:te"=>"బర్కీనా ఫాసో", "name:tg"=>"Буркина Фасо", "name:th"=>"บูร์กินาฟาโซ", "name:ti"=>"ቡርኪና ፋሶ", "name:tk"=>"Burkina-Faso", "name:tl"=>"Burkina Faso", "name:to"=>"Pekano Faso", "name:tr"=>"Burkina Faso", "name:ts"=>"Burkina Faso", "name:tt"=>"Буркина́ Фасо́", "name:ug"=>"بۇركىنا فاسو", "name:uk"=>"Буркіна́-Фасо́", "name:ur"=>"برکینا فاسو", "name:uz"=>"Burkina Faso", "name:vi"=>"Buốc-ki-na Pha-xô", "name:vo"=>"Burkinän", "name:wo"=>"Burkinaa Faaso", "name:yi"=>"בורקינע פֿאַסא", "name:yo"=>"Bùrkínà Fasò", "name:zh"=>"布基纳法索", "name:zu"=>"iBukhina Faso"
-ne     "name"=>"Niger", "name:af"=>"Niger", "name:am"=>"ኒጄር", "name:an"=>"Nícher", "name:ar"=>"النيجر", "name:az"=>"Niger", "name:ba"=>"Нигер", "name:be"=>"Нігер", "name:bg"=>"Нигер", "name:bm"=>"Nijer", "name:bn"=>"নাইজার", "name:bo"=>"ནི་ཇར།", "name:br"=>"Niger", "name:bs"=>"Niger", "name:ca"=>"Níger", "name:ce"=>"Нигер", "name:cs"=>"Niger", "name:cy"=>"Niger", "name:da"=>"Niger", "name:de"=>"Niger", "name:dv"=>"ނީޖަރު", "name:ee"=>"Niger", "name:el"=>"Νίγηρας", "name:en"=>"Niger", "name:eo"=>"Niĝero", "name:es"=>"Níger", "name:et"=>"Niger", "name:eu"=>"Niger", "name:fa"=>"نیجر", "name:fi"=>"Niger", "name:fo"=>"Niger", "name:fr"=>"Niger", "name:fy"=>"Niger", "name:ga"=>"An Nígir", "name:gd"=>"Nìgeir", "name:gl"=>"Níxer", "name:gu"=>"નાઈજર", "name:gv"=>"Yn Neegeyr", "name:ha"=>"Nijar", "name:he"=>"ניז'ר", "name:hi"=>"नाइजर", "name:hr"=>"Niger", "name:ht"=>"Nijè", "name:hu"=>"Niger", "name:hy"=>"Նիգեր", "name:ia"=>"Niger", "name:id"=>"Niger", "name:ie"=>"Niger", "name:ig"=>"Niger", "name:io"=>"Nijer", "name:is"=>"Níger", "name:it"=>"Niger", "name:ja"=>"ニジェール", "name:jv"=>"Niger", "name:ka"=>"ნიგერი", "name:kg"=>"Nijer", "name:kk"=>"Нигер", "name:ko"=>"니제르", "name:ku"=>"Nîjer", "name:kw"=>"Pow Nijer", "name:la"=>"Niger", "name:lb"=>"Niger", "name:li"=>"Niger", "name:ln"=>"Nizer", "name:lt"=>"Nigeris", "name:lv"=>"Nigēra", "name:mi"=>"Ngāika", "name:mk"=>"Нигер", "name:ml"=>"നീഷർ", "name:mn"=>"Нигер", "name:mr"=>"नायजर", "name:ms"=>"Niger", "name:mt"=>"Niġer", "name:my"=>"နိုင်ဂျာနိုင်ငံ", "name:nl"=>"Niger", "name:nn"=>"Niger", "name:no"=>"Niger", "name:oc"=>"Nigèr", "name:or"=>"ନାଇଜର", "name:os"=>"Нигер", "name:pa"=>"ਨਾਈਜਰ", "name:pl"=>"Niger", "name:ps"=>"نایجېر", "name:pt"=>"Níger", "name:qu"=>"Niqir", "name:ro"=>"Niger", "name:ru"=>"Нигер", "name:rw"=>"Nigeri", "name:sa"=>"नीजे", "name:sc"=>"Nixèr", "name:se"=>"Niger", "name:sg"=>"Nizëre", "name:sh"=>"Niger", "name:si"=>"නයිජර්", "name:sk"=>"Niger", "name:sl"=>"Niger", "name:sn"=>"Niger", "name:so"=>"Nayjar", "name:sq"=>"Nigeri", "name:sr"=>"Нигер", "name:ss"=>"INayijari", "name:su"=>"Niger", "name:sv"=>"Niger", "name:sw"=>"Niger", "name:ta"=>"நைஜர்", "name:te"=>"నైజర్", "name:tg"=>"Ниҷер", "name:th"=>"ประเทศไนเจอร์", "name:ti"=>"ናይጀር", "name:tk"=>"Niger", "name:tl"=>"Niyer", "name:tr"=>"Nijer", "name:ts"=>"Niger", "name:ug"=>"نىگېر", "name:uk"=>"Нігер", "name:ur"=>"نائجر", "name:uz"=>"Niger", "name:vi"=>"Niger", "name:vo"=>"Nigerän", "name:wo"=>"Niseer", "name:yi"=>"ניזשער", "name:yo"=>"Nìjẹ̀r", "name:zh"=>"尼日尔", "name:zu"=>"INayighe"
-cf     "name"=>"Ködörösêse tî Bêafrîka - République Centrafricaine", "name:af"=>"Sentraal-Afrikaanse Republiek", "name:am"=>"የመካከለኛው አፍሪካ ሪፐብሊክ", "name:an"=>"Republica Centroafricana", "name:ar"=>"جمهورية أفريقيا الوسطى", "name:az"=>"Mərkəzi Afrika Respublikası", "name:be"=>"Цэнтральна-Афрыканская Рэспубліка", "name:bg"=>"Централноафриканска република", "name:bm"=>"Cema Afrika Fasojamana", "name:bn"=>"মধ্য আফ্রিকান প্রজাতন্ত্র", "name:bo"=>"དབུས་ཨ་ཧྥེ་རི་ཁན་རི་པཔ་ལིཀ།", "name:br"=>"Republik Kreizafrikan", "name:bs"=>"Centralnoafrička Republika", "name:ca"=>"República Centreafricana", "name:ce"=>"Юккъерчу Африкин Республика", "name:cs"=>"Středoafrická republika", "name:cy"=>"Gweriniaeth Canolbarth Affrica", "name:da"=>"Centralafrikanske Republik", "name:de"=>"Zentralafrikanische Republik", "name:dv"=>"މެދުތެރޭ އެފްރިކާގެ ޖުމްހޫރިއްޔާ", "name:ee"=>"Central African Republic", "name:el"=>"Κεντροαφρικανική Δημοκρατία", "name:en"=>"Central African Republic", "name:eo"=>"Centr-Afriko", "name:es"=>"República Centroafricana", "name:et"=>"Kesk-Aafrika Vabariik", "name:eu"=>"Afrika Erdiko Errepublika", "name:fa"=>"جمهوری آفریقای مرکزی", "name:fi"=>"Keski-Afrikan tasavalta", "name:fo"=>"Miðafrikalýðveldið", "name:fr"=>"République Centrafricaine", "name:fy"=>"Sintraal-Afrikaanske Republyk", "name:ga"=>"Poblacht na hAfraice Láir", "name:gd"=>"Poblachd Meadhan Afraga", "name:gl"=>"República Centroafricana", "name:gv"=>"Pobblaght yn Affrick Veanagh", "name:he"=>"הרפובליקה המרכז-אפריקאית", "name:hi"=>"मध्य अफ़्रीकी गणराज्य", "name:hr"=>"Srednjoafrička Republika", "name:ht"=>"Repiblik santafrik", "name:hu"=>"Közép-afrikai Köztársaság", "name:hy"=>"Կենտրոնաաֆրիկյան Հանրապետություն", "name:ia"=>"Republica Centroafrican", "name:id"=>"Republik Afrika Tengah", "name:ie"=>"Central African Republic", "name:io"=>"Centrafrika", "name:is"=>"Mið-Afríkulýðveldið", "name:it"=>"Repubblica Centrafricana", "name:ja"=>"中央アフリカ共和国", "name:jv"=>"Republik Afrika Tengah", "name:ka"=>"ცენტრალური აფრიკის რესპუბლიკა", "name:kg"=>"Repubilika ya Afelika ya Kati", "name:kk"=>"Орталық Африка Республикасы", "name:kn"=>"ಮಧ್ಯ ಆಫ್ರಿಕಾದ ಗಣರಾಜ್ಯ", "name:ko"=>"중앙아프리카 공화국", "name:ks"=>"مرکٔزی اَفریٖکی جموٗریَت", "name:ku"=>"Komara Afrîkaya Navend", "name:kw"=>"Centrafrika", "name:la"=>"Respublica Africae Mediae", "name:lb"=>"Zentralafrikanesch Republik", "name:li"=>"Centraal Afrika", "name:ln"=>"Santrafríka", "name:lt"=>"Centrinės Afrikos Respublika", "name:lv"=>"Centrālāfrikas Republika", "name:mi"=>"Te Puku o Āwherika", "name:mk"=>"Централноафриканска Република", "name:ml"=>"മദ്ധ്യ ആഫ്രിക്കൻ റിപ്പബ്ലിക്ക്", "name:mn"=>"Төв Африкийн Бүгд Найрамдах Улс", "name:mr"=>"मध्य आफ्रिकेचे प्रजासत्ताक", "name:ms"=>"Republik Afrika Tengah", "name:mt"=>"Repubblika Ċentru-Afrikana", "name:my"=>"ဗဟိုအာဖရိကသမ္မတနိုင်ငံ", "name:na"=>"Ripubrikin Aprika Yugaga", "name:ne"=>"मध्य अफ्रिकी गणतन्त्र", "name:nl"=>"Centraal-Afrikaanse Republiek", "name:nn"=>"Den sentralafrikanske republikken", "name:no"=>"Den sentralafrikanske republikk", "name:nv"=>"Naakaii Łizhinii Bikéyah Beʼałnííʼ", "name:oc"=>"Centreafrica", "name:or"=>"ସେଣ୍ଟରାଲ ଆଫ୍ରିକାନ ରିପବ୍ଲିକ", "name:os"=>"Централон Африкæйы Республикæ", "name:pa"=>"ਮੱਧ ਅਫ਼ਰੀਕੀ ਗਣਰਾਜ", "name:pl"=>"Republika Środkowoafrykańska", "name:ps"=>"د منځنی افريقا ولسمشريزه", "name:pt"=>"República da África Central", "name:qu"=>"Chawpi Aphrika Republika", "name:ro"=>"Republica Centrafricană", "name:ru"=>"Центральноафриканская Республика", "name:rw"=>"Repubulika ya Santara Afurika", "name:sa"=>"केन्द्रीय अफ्रीका गणराज्यम्", "name:sc"=>"Tzentràfrica", "name:se"=>"Gaska-Afrihká dásseváldi", "name:sg"=>"Ködörösêse tî Bêafrîka", "name:sh"=>"Srednjoafrička Republika", "name:sk"=>"Stredoafrická republika", "name:sl"=>"Srednjeafriška republika", "name:sn"=>"Central African Republic", "name:so"=>"Jamhuuriyadda Bartamaha Afrika", "name:sq"=>"Republika e Afrikës Qendrore", "name:sr"=>"Централноафричка Република", "name:ss"=>"Umkhatsi we-Afrikha", "name:su"=>"Républik Afrika Tengah", "name:sv"=>"Centralafrikanska republiken", "name:sw"=>"Jamhuri ya Afrika ya Kati", "name:ta"=>"மத்திய ஆப்பிரிக்கக் குடியரசு", "name:te"=>"సెంట్రల్ ఆఫ్రికన్ రిపబ్లిక్", "name:tg"=>"Ҷумҳурии Африқои Марказӣ", "name:th"=>"สาธารณรัฐแอฟริกากลาง", "name:tk"=>"Merkezi Afrika Respublikasy", "name:tl"=>"Republika ng Gitnang Aprika", "name:tr"=>"Orta Afrika Cumhuriyeti", "name:ts"=>"Afrika Wale Xikarhi", "name:tt"=>"Үзәк Африка Җөмһүрияте", "name:ug"=>"ئوتتۇرا ئافرىقا جۇمھۇرىيىتى", "name:uk"=>"Центральноафриканська Республіка", "name:ur"=>"وسطی افریقی جمہوریہ", "name:uz"=>"Markaziy Afrika Respublikasi", "name:vi"=>"Cộng hòa Trung Phi", "name:vo"=>"Zänoda-Frikop", "name:wo"=>"Réewum Diggu Afrig", "name:yo"=>"Orílẹ̀-èdè Olómìnira Àrin Áfríkà", "name:zh"=>"中非共和國", "name:zu"=>"Central African Republic"
-ci     "name"=>"Côte d’Ivoire", "name:af"=>"Ivoorkus", "name:am"=>"ኮት ዲቯር", "name:an"=>"Costa de Vori", "name:ar"=>"ساحل العاج", "name:az"=>"Fil Dişi Sahili", "name:be"=>"Кот-д'Івуар", "name:bg"=>"Кот д'Ивоар", "name:bm"=>"Côte d'Ivoire", "name:bn"=>"কোত দিভোয়ার", "name:bo"=>"ཀོ་ཊི་ཌི་ཨའི་བོ་རི།", "name:br"=>"Aod an Olifant", "name:bs"=>"Obala Slonovače", "name:ca"=>"Costa d'Ivori", "name:ce"=>"Кот-д’Ивуар", "name:cs"=>"Pobřeží slonoviny", "name:cv"=>"Кот-д'Ивуар", "name:cy"=>"Côte d'Ivoire", "name:da"=>"Elfenbenskysten", "name:de"=>"Elfenbeinküste", "name:dv"=>"އައިވަރީ ކޯސްޓު", "name:ee"=>"Côte d'Ivoire", "name:el"=>"Ακτή Ελεφαντοστού", "name:en"=>"Côte d'Ivoire", "name:eo"=>"Ebur-Bordo", "name:es"=>"Costa de Marfil", "name:et"=>"Elevandiluurannik", "name:eu"=>"Boli Kosta", "name:fa"=>"ساحل عاج", "name:ff"=>"Kodduwaar", "name:fi"=>"Norsunluurannikko", "name:fo"=>"Fílabeinsstrondin", "name:fr"=>"Côte d’Ivoire", "name:fy"=>"Ivoarkust", "name:ga"=>"An Cósta Eabhair", "name:gd"=>"Costa Ìbhri", "name:gl"=>"Costa do Marfil", "name:gv"=>"Yn Clyst Iuaagagh", "name:he"=>"חוף השנהב", "name:hi"=>"कोत द'ईवोआर", "name:hr"=>"Obala Bjelokosti", "name:ht"=>"Kòt divwa", "name:hu"=>"Elefántcsontpart", "name:hy"=>"Կոտ դ'Իվուար", "name:ia"=>"Costa de Ebore", "name:id"=>"Pantai Gading", "name:ie"=>"Costa de Ivor", "name:io"=>"Ivora Rivo", "name:is"=>"Fílabeinsströndin", "name:it"=>"Costa d'Avorio", "name:ja"=>"コートジボワール", "name:jv"=>"Panté Gadhing", "name:ka"=>"კოტ-დ’ივუარი", "name:kg"=>"Côte d'Ivoire", "name:ki"=>"Côte d'Ivoire", "name:kk"=>"Кот-д-Ивуар", "name:kn"=>"ಕೋತ್ ದ್'ಇವಾರ್", "name:ko"=>"코트디부아르", "name:ku"=>"Peravê Diranfîl", "name:kw"=>"Côte d'Ivoire", "name:la"=>"Litus Eburneum", "name:lb"=>"Elfebeeküst", "name:li"=>"Ivoorkös", "name:ln"=>"Kotdivuar", "name:lt"=>"Dramblio Kaulo Krantas", "name:lv"=>"Kotdivuāra", "name:mg"=>"Côte d'Ivoire", "name:mi"=>"Te Tai Rei", "name:mk"=>"Брег на Слоновата Коска", "name:ml"=>"ഐവറി കോസ്റ്റ്", "name:mn"=>"Кот д'Ивуар", "name:mr"=>"कोत द'ईवोआर", "name:ms"=>"Ivory Coast", "name:mt"=>"Kosta tal-Avorju", "name:my"=>"အိုင်ဗရီကို့စ်နိုင်ငံ", "name:na"=>"Aibori Kot", "name:ne"=>"आइभरी कोस्ट", "name:nl"=>"Ivoorkust", "name:nn"=>"Elfenbeinskysten", "name:no"=>"Elfenbenskysten", "name:nv"=>"Chį́į́h Yee Adilohii Bideeʼ Tónteel Bibąąh", "name:oc"=>"Còsta d'Evòri", "name:or"=>"ଆଇଭେରି କୋଷ୍ଟ", "name:os"=>"Кот-д’Ивуар", "name:pa"=>"ਦੰਦ ਖੰਡ ਤਟ", "name:pl"=>"Wybrzeże Kości Słoniowej", "name:ps"=>"عاج ساحل", "name:pt"=>"Costa do Marfim", "name:qu"=>"Marphil Chala", "name:rm"=>"Costa d'Ivur", "name:ro"=>"Coasta de Fildeș", "name:ru"=>"Кот-д’Ивуар", "name:rw"=>"Kote Divuwari", "name:sa"=>"कोट ऐवरी", "name:sc"=>"Costa de Avòriu", "name:se"=>"Elefántačalánriddu", "name:sg"=>"Kôdivüära", "name:sh"=>"Obala Slonovače", "name:si"=>"අයිවරි කෝස්ට්", "name:sk"=>"Pobrežie Slonoviny", "name:sl"=>"Slonokoščena obala", "name:sn"=>"Côte d'Ivoire", "name:so"=>"Xeebta Foolmaroodi", "name:sq"=>"Bregu i Fildishtë", "name:sr"=>"Обала Слоноваче", "name:ss"=>"Lugu Lwempondvondlovu", "name:su"=>"Basisir Gading", "name:sv"=>"Elfenbenskusten", "name:sw"=>"Cote d'Ivoire", "name:ta"=>"கோட் டிவார்", "name:te"=>"కోటె డి ఐవొరి", "name:tg"=>"Кот-д'Ивуар", "name:th"=>"ประเทศโกตดิวัวร์", "name:tk"=>"Kot-d’Iwuar", "name:tl"=>"Baybaying Garing", "name:tr"=>"Fildişi Sahili", "name:ts"=>"Côte d'Ivoire", "name:tt"=>"Кот-д’Ивуар", "name:ug"=>"پىل چىشى قىرغىغى", "name:uk"=>"Кот-д'Івуар", "name:ur"=>"کوت داوواغ", "name:uz"=>"Kot-d‘ivuar", "name:vi"=>"Bờ Biển Ngà", "name:vo"=>"Viorajolän", "name:wo"=>"Kodiwaar", "name:yi"=>"בארטן פון העלפאנדביין", "name:yo"=>"Côte d'Ivoire", "name:zh"=>"科特迪瓦", "name:zu"=>"Ugu Emhlophe"
-cd     "name"=>"République démocratique du Congo", "name:af"=>"Demokratiese Republiek van die Kongo", "name:am"=>"ኮንጎ ዲሞክራሲያዊ ሪፐብሊክ", "name:an"=>"Republica Democratica d'o Congo", "name:ar"=>"جمهورية الكونغو الديمقراطية", "name:az"=>"Konqo Demokratik Respublikası", "name:be"=>"Дэмакратычная Рэспубліка Конга", "name:bg"=>"Демократична република Конго", "name:bm"=>"Kongo ka Bɛjɛfanga Fasojamana", "name:bn"=>"গণতান্ত্রিক কঙ্গো প্রজাতন্ত্র", "name:bo"=>"ཀོང་གོ་མི་དམངས་དམངས་གཙོ།", "name:br"=>"Republik Demokratel Kongo", "name:bs"=>"Demokratska Republika Kongo", "name:ca"=>"República Democràtica del Congo", "name:ce"=>"Халкъа куьйгаллийца йолу Пачхьалкх Конго", "name:cs"=>"Demokratická republika Kongo", "name:cv"=>"Конго Демократиллĕ Республики", "name:cy"=>"Gweriniaeth Ddemocrataidd Congo", "name:da"=>"Demokratiske Republik Congo", "name:de"=>"Demokratische Republik Kongo", "name:dv"=>"ކޮންގޯ (ދިމިޤްރާޠީ ޖުމްހޫރިއްޔާ)", "name:el"=>"Λαϊκή Δημοκρατία του Κονγκό", "name:en"=>"Democratic Republic of the Congo", "name:eo"=>"Demokratia Respubliko Kongo", "name:es"=>"República Democrática del Congo", "name:et"=>"Kongo Demokraatlik Vabariik", "name:eu"=>"Kongoko Errepublika Demokratikoa", "name:fa"=>"جمهوری دموکراتیک کنگو", "name:fi"=>"Kongon demokraattinen tasavalta", "name:fo"=>"Fólkaræðiliga Lýðveldið Kongo", "name:fr"=>"République démocratique du Congo", "name:fy"=>"Demokratyske Republyk Kongo", "name:ga"=>"Poblacht Dhaonlathach an Chongó", "name:gd"=>"Poblachd Dheamocrach na Congo", "name:gl"=>"República Democrática do Congo", "name:gn"=>"Tetã Jekopytyjoja Kongo", "name:gv"=>"Pobblaght Gheynlagh ny Congo", "name:ha"=>"Jamhuriyar dimokuradiyya Kwango", "name:he"=>"הרפובליקה הדמוקרטית של קונגו", "name:hi"=>"कांगो लोकतान्त्रिक गणराज्य", "name:hr"=>"Demokratska Republika Kongo", "name:hu"=>"Kongói Demokratikus Köztársaság", "name:hy"=>"Կոնգոյի Դեմոկրատական Հանրապետություն", "name:ia"=>"Republica Democratic del Congo", "name:id"=>"Republik Demokratik Kongo", "name:ie"=>"Democratic Republic de Congo", "name:io"=>"Demokratial Republiko Kongo", "name:is"=>"Lýðræðislega Lýðveldið Kongó", "name:it"=>"Repubblica Democratica del Congo", "name:ja"=>"コンゴ民主共和国", "name:jv"=>"Republik Dhémokratis Kongo", "name:ka"=>"კონგოს დემოკრატიული რესპუბლიკა", "name:kg"=>"Repubilika ya Kongo ya Dimokalasi", "name:kk"=>"Конго Демократиялық Республикасы", "name:kn"=>"ಕಾಂಗೋ ಪ್ರಜಾಸತ್ತಾತ್ಮಕ ಗಣರಾಜ್ಯ", "name:ko"=>"콩고 민주 공화국", "name:ku"=>"Kongoya Demokratîk", "name:kw"=>"Repoblek Werinel Kongo", "name:la"=>"Respublica Democratica Congensis", "name:lb"=>"Demokratesch Republik Kongo", "name:li"=>"Democratische Rippebliek vaan de Kongo", "name:ln"=>"Republiki ya Kongó Demokratiki", "name:lt"=>"Kongo Demokratinė Respublika", "name:lv"=>"Kongo Demokrātiskā Republika", "name:mg"=>"Repoblika Demokratikan'i Kongo", "name:mi"=>"Te Whenua o Kōngo", "name:mk"=>"Демократска Република Конго", "name:ml"=>"ഡെമോക്രാറ്റിക് റിപബ്ലിക്ക് ഓഫ് കോംഗോ", "name:mn"=>"Бүгд Найрамдах Ардчилсан Конго Улс", "name:mr"=>"काँगोचे लोकशाही प्रजासत्ताक", "name:ms"=>"Republik Demokratik Congo", "name:my"=>"ကွန်ဂိုဒီမိုကရက်တစ်သမ္မတနိုင်ငံ", "name:na"=>"Ripubrikit Engame Kongo", "name:ne"=>"प्रजातान्त्रिक गणतन्त्र कंगो", "name:nl"=>"Democratische Republiek Congo", "name:nn"=>"Den demokratiske republikken Kongo", "name:no"=>"Den demokratiske republikken Kongo", "name:nv"=>"Kéyah Káango Shádiʼááhjí Siʼánígíí", "name:oc"=>"Republica Democratica de Còngo", "name:or"=>"କଙ୍ଗୋ", "name:os"=>"Конгойы Демократон Республикæ", "name:pa"=>"ਕਾਂਗੋ ਲੋਕਤੰਤਰੀ ਗਣਰਾਜ", "name:pl"=>"Demokratyczna Republika Konga", "name:pt"=>"República Democrática do Congo", "name:qu"=>"Kungu Runakamaq Republika", "name:ro"=>"Republica Democrată Congo", "name:ru"=>"Демократическая Республика Конго", "name:rw"=>"Repubulika Iharanira Demokarasi ya Kongo", "name:sc"=>"Repùbrica Democràtiga de su Congo", "name:se"=>"Kongo demokráhtalaš dásseváldi", "name:sg"=>"Kùodùorùosêse tî Ngunuhalëzo tî Kongö", "name:sh"=>"Demokratska Republika Kongo", "name:si"=>"කොංගෝ ප්රජාතන්ත්රවාදී ජනරජය", "name:sk"=>"Kongo (býv. Zair)", "name:sl"=>"Demokratična republika Kongo", "name:sn"=>"Democratic Republic of the Congo", "name:so"=>"Jamhuuriyada Dimuqaraadiga Kongo", "name:sq"=>"Republika Demokratike e Kongos", "name:sr"=>"Демократска Република Конго", "name:ss"=>"IKhongo", "name:su"=>"Républik Démokratik Kongo", "name:sv"=>"Demokratiska Republiken Kongo", "name:sw"=>"Jamhuri ya Kidemokrasia ya Kongo", "name:ta"=>"காங்கோ மக்களாட்சிக் குடியரசு", "name:th"=>"สาธารณรัฐประชาธิปไตยคองโก", "name:tk"=>"Kongo Demokratik Respublikasy", "name:tl"=>"Demokratikong Republika ng Konggo", "name:tr"=>"Demokratik Kongo Cumhuriyeti", "name:ts"=>"Democratic Republic of the Congo", "name:tt"=>"Конго Демократик Җөмһүрияте", "name:ug"=>"كونگو دېموكراتىك جۇمھۇرىيىتى", "name:uk"=>"Демократична Республіка Конго", "name:ur"=>"جمہوری جمہوریہ کانگو", "name:uz"=>"Kongo DR", "name:vi"=>"Cộng hòa Dân chủ Congo", "name:vo"=>"Kongoän (Repüblikän Demokratik)", "name:wa"=>"Republike democratike do Congo", "name:wo"=>"Republik Demokaraatik bu Kongóo", "name:yi"=>"דעמאקראטישע רעפובליק פון קאנגא", "name:yo"=>"Orílẹ̀-èdè Olómìnira Olóṣèlú ilẹ̀ Kóngò", "name:za"=>"Ganggoj Minzcuj Gunghozgoz", "name:zh"=>"刚果民主共和国", "name:zu"=>"IRiphabliki Labantu weKongo"
-ga     "name"=>"Gabon", "name:af"=>"Gaboen", "name:am"=>"ጋቦን", "name:an"=>"Gabón", "name:ar"=>"الغابون", "name:az"=>"Qabon", "name:ba"=>"Габон", "name:be"=>"Габон", "name:bg"=>"Габон", "name:bm"=>"Gabon", "name:bn"=>"গাবন", "name:bo"=>"གེ་བོན།", "name:br"=>"Gabon", "name:bs"=>"Gabon", "name:ca"=>"Gabon", "name:ce"=>"Габон", "name:cs"=>"Gabon", "name:cv"=>"Габон", "name:cy"=>"Gabon", "name:da"=>"Gabon", "name:de"=>"Gabun", "name:dv"=>"ގެބޯން", "name:dz"=>"གྷེ་བྷོན", "name:el"=>"Γκαμπόν", "name:en"=>"Gabon", "name:eo"=>"Gabono", "name:es"=>"Gabón", "name:et"=>"Gabon", "name:eu"=>"Gabon", "name:fa"=>"گابن", "name:ff"=>"Gabon", "name:fi"=>"Gabon", "name:fr"=>"Gabon", "name:fy"=>"Gabon", "name:ga"=>"An Ghabúin", "name:gd"=>"Gabon", "name:gl"=>"Gabón", "name:gv"=>"Gabon", "name:he"=>"גבון", "name:hi"=>"गबॉन", "name:hr"=>"Gabon", "name:ht"=>"Gabon", "name:hu"=>"Gabon", "name:hy"=>"Գաբոն", "name:ia"=>"Gabon", "name:id"=>"Gabon", "name:ie"=>"Gabon", "name:io"=>"Gabon", "name:is"=>"Gabon", "name:it"=>"Gabon", "name:ja"=>"ガボン", "name:jv"=>"Gabon", "name:ka"=>"გაბონი", "name:kg"=>"Ngabu", "name:ki"=>"Gabon", "name:kk"=>"Габон", "name:kn"=>"ಗಬೊನ್", "name:ko"=>"가봉", "name:ks"=>"گیبان", "name:ku"=>"Gabon", "name:kw"=>"Gabon", "name:la"=>"Gabonia", "name:lb"=>"Gabun", "name:li"=>"Gabon", "name:ln"=>"Gabɔ́", "name:lt"=>"Gabonas", "name:lv"=>"Gabona", "name:mi"=>"Kāpona", "name:mk"=>"Габон", "name:ml"=>"ഗാബോൺ", "name:mn"=>"Габон", "name:mr"=>"गॅबन", "name:ms"=>"Gabon", "name:mt"=>"Gabon", "name:my"=>"ဂါဘွန်နိုင်ငံ", "name:na"=>"Gabun", "name:ne"=>"गाबोन", "name:nl"=>"Gabon", "name:nn"=>"Gabon", "name:no"=>"Gabon", "name:nv"=>"Gabǫ́ǫ́", "name:oc"=>"Gabon", "name:or"=>"ଗାବୋନ", "name:os"=>"Габон", "name:pa"=>"ਗਬਾਨ", "name:pl"=>"Gabon", "name:ps"=>"ګابن", "name:pt"=>"Gabão", "name:qu"=>"Gabun", "name:rm"=>"Gabun", "name:ro"=>"Gabon", "name:ru"=>"Габон", "name:rw"=>"Gabon", "name:sa"=>"गाबोन", "name:sc"=>"Gabòn", "name:se"=>"Gabon", "name:sg"=>"Gaböon", "name:sh"=>"Gabon", "name:si"=>"ගැබොන්", "name:sk"=>"Gabon", "name:sl"=>"Gabon", "name:sn"=>"Gabon", "name:so"=>"Gabon", "name:sq"=>"Gaboni", "name:sr"=>"Габон", "name:ss"=>"IGabhoni", "name:st"=>"Gabon", "name:su"=>"Gabon", "name:sv"=>"Gabon", "name:sw"=>"Gabon", "name:ta"=>"காபோன்", "name:te"=>"గబాన్", "name:tg"=>"Габон", "name:th"=>"ประเทศกาบอง", "name:tk"=>"Gabon", "name:tl"=>"Gabon", "name:tr"=>"Gabon", "name:ts"=>"Gaboni", "name:tt"=>"Габон", "name:ug"=>"گابون", "name:uk"=>"Габон", "name:ur"=>"گیبون", "name:uz"=>"Gabon", "name:vi"=>"Gabon", "name:vo"=>"Gabunän", "name:wo"=>"Gaboŋ", "name:yi"=>"גאבאן", "name:yo"=>"Gàbọ̀n", "name:zh"=>"加蓬", "name:zu"=>"IGaboni"
-tg     "name"=>"Togo", "name:af"=>"Togo", "name:ak"=>"Togo", "name:am"=>"ቶጎ", "name:an"=>"Togo", "name:ar"=>"توغو", "name:az"=>"Toqo", "name:ba"=>"Того", "name:be"=>"Тога", "name:bg"=>"Того", "name:bm"=>"Togo", "name:bn"=>"টোগো", "name:bo"=>"ཊོ་གོ", "name:br"=>"Togo", "name:bs"=>"Togo", "name:ca"=>"Togo", "name:ce"=>"Того", "name:cs"=>"Togo", "name:cv"=>"Того", "name:cy"=>"Togo", "name:da"=>"Togo", "name:de"=>"Togo", "name:dv"=>"ޓޯގޯ", "name:ee"=>"Togo", "name:el"=>"Τόγκο", "name:en"=>"Togo", "name:eo"=>"Togolando", "name:es"=>"Togo", "name:et"=>"Togo", "name:eu"=>"Togo", "name:fa"=>"توگو", "name:fi"=>"Togo", "name:fr"=>"Togo", "name:fy"=>"Togo", "name:ga"=>"Tóga", "name:gd"=>"Tògo", "name:gl"=>"Togo", "name:gu"=>"ટોગો", "name:gv"=>"Yn Togo", "name:ha"=>"Togo", "name:he"=>"טוגו", "name:hi"=>"टोगो", "name:hr"=>"Togo", "name:ht"=>"Togo", "name:hu"=>"Togo", "name:hy"=>"Տոգո", "name:id"=>"Togo", "name:ie"=>"Togo", "name:ig"=>"Togo", "name:io"=>"Togo", "name:is"=>"Tógó", "name:it"=>"Togo", "name:ja"=>"トーゴ", "name:jv"=>"Togo", "name:ka"=>"ტოგო", "name:kk"=>"Того", "name:kn"=>"ಟೊಗೊ", "name:ko"=>"토고", "name:ku"=>"Togo", "name:kw"=>"Togo", "name:la"=>"Togum", "name:lb"=>"Togo", "name:li"=>"Togo", "name:ln"=>"Togo", "name:lt"=>"Togas", "name:lv"=>"Togo", "name:mi"=>"Toko", "name:mk"=>"Того", "name:ml"=>"ടോഗോ", "name:mn"=>"Того", "name:mr"=>"टोगो", "name:ms"=>"Togo", "name:mt"=>"Togo", "name:my"=>"တိုဂိုနိုင်ငံ", "name:na"=>"Togo", "name:nl"=>"Togo", "name:nn"=>"Togo", "name:no"=>"Togo", "name:nv"=>"Tʼóogo", "name:oc"=>"Tògo", "name:or"=>"ଟୋଗୋ", "name:os"=>"Того", "name:pa"=>"ਟੋਗੋ", "name:pl"=>"Togo", "name:pt"=>"Togo", "name:qu"=>"Tugu", "name:rm"=>"Togo", "name:ro"=>"Togo", "name:ru"=>"Того", "name:rw"=>"Togo", "name:sa"=>"टोगो", "name:sc"=>"Togo", "name:se"=>"Togo", "name:sg"=>"Togö", "name:sh"=>"Togo", "name:si"=>"ටෝගෝ", "name:sk"=>"Togo", "name:sl"=>"Togo", "name:sn"=>"Togo", "name:so"=>"Togo", "name:sq"=>"Togo", "name:sr"=>"Того", "name:ss"=>"IThogo", "name:st"=>"Togo", "name:su"=>"Togo", "name:sv"=>"Togo", "name:sw"=>"Togo", "name:ta"=>"டோகோ", "name:tg"=>"Того", "name:th"=>"ประเทศโตโก", "name:ti"=>"ቶጎ", "name:tk"=>"Togo", "name:tl"=>"Togo", "name:tr"=>"Togo", "name:ts"=>"Togo", "name:tw"=>"Togo", "name:ug"=>"توگو", "name:uk"=>"Того", "name:ur"=>"ٹوگو", "name:uz"=>"Togo", "name:vi"=>"Togo", "name:vo"=>"Togoän", "name:wo"=>"Togóo", "name:yi"=>"טאגא", "name:yo"=>"Tógò", "name:zh"=>"多哥", "name:zu"=>"ITogo"
-gf     "name"=>"Guyane Française", "name:af"=>"Frans-Guyana", "name:ar"=>"غيانا", "name:br"=>"Gwiana c’hall", "name:ca"=>"Guaiana Francesa", "name:cy"=>"Guyane", "name:da"=>"Fransk Guyana", "name:de"=>"Französisch-Guayana", "name:el"=>"Γαλλική Γουιάνα", "name:en"=>"French Guiana", "name:eo"=>"Gujano", "name:es"=>"Guayana Francesa", "name:et"=>"Prantsuse Guajaana", "name:fa"=>"گویان فرانسه", "name:fi"=>"Ranskan Guayana", "name:fr"=>"Guyane française", "name:fy"=>"Frânsk Guyana", "name:ga"=>"Guáin na Fraince", "name:gd"=>"Guiana Fhrangach", "name:he"=>"גיאנה הצרפתית", "name:hr"=>"Francuska Gvajana", "name:hu"=>"Francia Guyana", "name:id"=>"Guyana Perancis", "name:is"=>"Franska Gvæjana", "name:it"=>"Guyana francese", "name:la"=>"Guiana Francica", "name:li"=>"Frans Guyana", "name:lt"=>"Prancūzijos Gviana", "name:lv"=>"Franču Gviāna", "name:mn"=>"Франц Гвиана", "name:nl"=>"Frans-Guyana", "name:pl"=>"Gujana Francuska", "name:ru"=>"Французская Гвиана", "name:sl"=>"Francoska Gvajana", "name:sv"=>"Franska Guyana", "name:th"=>"เฟรนช์เกียนา", "name:tr"=>"Fransız Guyanası", "name:uk"=>"Французька Гвіана", "name:vi"=>"Guyane thuộc Pháp", "name:zh"=>"法属圭亚那"
-gp     "name"=>"Guadeloupe", "name:ar"=>"غوادلوب", "name:be"=>"Гвадэлупа", "name:br"=>"Gwadeloup", "name:ca"=>"Illa de Guadalupe", "name:da"=>"Guadeloupe", "name:el"=>"Γουαδελούπη", "name:en"=>"Guadeloupe", "name:eo"=>"Gvadelupo", "name:es"=>"Guadalupe", "name:fa"=>"گوادلوپ", "name:fi"=>"Guadeloupe", "name:fr"=>"Guadeloupe", "name:fy"=>"Guadelûp", "name:ga"=>"Guadalúip", "name:he"=>"גוואדלופ", "name:hr"=>"Gvadalupa", "name:hu"=>"Guadeloupe", "name:is"=>"Gvadelúpeyjar", "name:it"=>"Guadalupa", "name:la"=>"Guadalupa", "name:lt"=>"Gvadelupa", "name:lv"=>"Gvadelupa", "name:mn"=>"Гуаделупе", "name:pl"=>"Gwadelupa", "name:ru"=>"Гваделупа", "name:sv"=>"Guadeloupe", "name:th"=>"กวาเดอลูป", "name:uk"=>"Гваделупа", "name:zh"=>"瓜德罗普"
-cg     "name"=>"Congo", "name:af"=>"Republiek van die Kongo", "name:am"=>"ኮንጎ ሪፐብሊክ", "name:an"=>"Republica d'o Congo", "name:ar"=>"جمهورية الكونغو", "name:az"=>"Konqo Respublikası", "name:ba"=>"Республика Конго", "name:be"=>"Рэспубліка Конга", "name:bg"=>"Република Конго", "name:bm"=>"Kongo-Brazaville", "name:bn"=>"কঙ্গো প্রজাতন্ত্র", "name:bo"=>"ཀོང་གོ་སྤྱི་མཐུན་རྒྱལ་ཁབ།", "name:br"=>"Republik Kongo", "name:bs"=>"Republika Kongo", "name:ca"=>"República del Congo", "name:ce"=>"Республика Конго", "name:cs"=>"Republika Kongo", "name:cv"=>"Конго Республики", "name:cy"=>"Gweriniaeth y Congo", "name:da"=>"Republikken Congo", "name:de"=>"Republik Kongo", "name:dv"=>"ކޮންގޯ (ޖުމްހޫރިއްޔާ)", "name:el"=>"Δημοκρατία του Κονγκό", "name:en"=>"Congo-Brazzaville", "name:eo"=>"Respubliko Kongo", "name:es"=>"República del Congo", "name:et"=>"Kongo Vabariik", "name:eu"=>"Kongoko Errepublika", "name:fa"=>"جمهوری کنگو", "name:fi"=>"Kongon tasavalta", "name:fr"=>"Congo-Brazzaville", "name:fy"=>"Republyk Kongo", "name:ga"=>"Poblacht an Chongó", "name:gd"=>"A' Chongo", "name:gl"=>"Congo", "name:gv"=>"Pobblaght ny Congo", "name:he"=>"הרפובליקה של קונגו", "name:hi"=>"कांगो गणराज्य", "name:hr"=>"Republika Kongo", "name:ht"=>"Kongo (Brazavil)", "name:hu"=>"Kongói Köztársaság", "name:hy"=>"Կոնգոյի Հանրապետություն", "name:ia"=>"Republica del Congo", "name:id"=>"Republik Kongo", "name:ie"=>"Republic de Congo", "name:io"=>"Republiko Kongo", "name:is"=>"Vestur-Kongó", "name:it"=>"Repubblica del Congo", "name:ja"=>"コンゴ共和国", "name:jv"=>"Republik Kongo", "name:ka"=>"კონგოს რესპუბლიკა", "name:kg"=>"Repubilika ya Kôngo", "name:kk"=>"Конго Республикасы", "name:ko"=>"콩고 공화국", "name:ku"=>"Komara Kongoyê", "name:kw"=>"Repoblek Kongo", "name:la"=>"Respublica Congensis", "name:lb"=>"Republik Kongo", "name:li"=>"Kongo-Brazzaville", "name:ln"=>"Kongó-Brazzaville", "name:lt"=>"Kongo Respublika", "name:lv"=>"Kongo Republika", "name:mk"=>"Република Конго", "name:ml"=>"റിപ്പബ്ലിക്ക് ഓഫ് കോംഗോ", "name:mn"=>"Бүгд Найрамдах Конго Улс", "name:mr"=>"काँगोचे प्रजासत्ताक", "name:ms"=>"Republik Congo", "name:my"=>"ကွန်ဂိုသမ္မတနိုင်ငံ", "name:na"=>"Ripubrikin Kongo", "name:ne"=>"कङ्गो", "name:nl"=>"Congo-Brazzaville", "name:nn"=>"Kongo-Brazzaville", "name:no"=>"Republikken Kongo", "name:nv"=>"Kéyah Káango Náhookǫsjí Siʼánígíí", "name:oc"=>"Republica de Còngo", "name:os"=>"Конгойы Республикæ", "name:pa"=>"ਕਾਂਗੋ ਗਣਰਾਜ", "name:pl"=>"Kongo", "name:ps"=>"د کانګو جمهوريت", "name:pt"=>"República do Congo", "name:qu"=>"Kungu Republika", "name:ro"=>"Republica Congo", "name:ru"=>"Республика Конго", "name:rw"=>"Kongo", "name:sc"=>"Repùbrica de su Congo", "name:se"=>"Kongo dásseváldi", "name:sg"=>"Ködörösêse tî Kongöo", "name:sh"=>"Republika Kongo", "name:si"=>"කොංගෝ ජනරජය", "name:sk"=>"Kongo (Brazzaville)", "name:sl"=>"Republika Kongo", "name:sn"=>"Republic of the Congo", "name:so"=>"Jamhuuriyadda Kongo", "name:sq"=>"Republika e Kongos", "name:sr"=>"Република Конго", "name:ss"=>"Tibuse weKhongo", "name:su"=>"Républik Kongo", "name:sv"=>"Republiken Kongo", "name:sw"=>"Jamhuri ya Kongo", "name:ta"=>"கொங்கோ குடியரசு", "name:te"=>"కాంగో రిపబ్లిక్", "name:tg"=>"Ҷумҳӯрии Конго", "name:th"=>"สาธารณรัฐคองโก", "name:tk"=>"Kongo Respublikasy", "name:tl"=>"Republika ng Konggo", "name:tr"=>"Kongo Cumhuriyeti", "name:ts"=>"Riphabliki ya Congo", "name:tt"=>"Конго Җөмһүрияте", "name:ug"=>"كونگو جۇمھۇرىيىتى", "name:uk"=>"Республіка Конго", "name:ur"=>"جمہوریہ کانگو", "name:uz"=>"Kongo Respublikasi", "name:vi"=>"Cộng hòa Congo", "name:vo"=>"Kongoän (Repüblikän)", "name:wo"=>"Kongóo-Brasaawiil", "name:yi"=>"רעפובליק פון קאנגא", "name:yo"=>"Orílẹ̀-èdè Olómìnira ilẹ̀ Kóngò", "name:zh"=>"刚果共和国", "name:zu"=>"IKongo"
-wf     "name"=>"Wallis-et-Futuna", "name:af"=>"Wallis-en-Futuna", "name:an"=>"Wallis e Futuna", "name:ar"=>"جزر واليس وفوتونا", "name:be"=>"Уоліс і Футуна", "name:bg"=>"Уолис и Футуна", "name:br"=>"Wallis ha Futuna", "name:ca"=>"Wallis i Futuna", "name:cs"=>"Wallis a Futuna", "name:cy"=>"Wallis a Futuna", "name:da"=>"Wallis og Futuna", "name:de"=>"Wallis und Futuna", "name:dv"=>"ވާލީ އަދި ފުތޫނާ", "name:el"=>"Ουώλλις και Φουτούνα", "name:en"=>"Wallis and Futuna Islands", "name:eo"=>"Valiso kaj Futuno", "name:es"=>"Wallis y Futuna", "name:et"=>"Wallis ja Futuna", "name:eu"=>"Wallis eta Futuna", "name:fa"=>"والیس و فوتونا", "name:fi"=>"Wallis- ja Futunasaaret", "name:fr"=>"Wallis-et-Futuna", "name:fy"=>"Wallis en Fûtûna", "name:ga"=>"Vailís agus Futúna", "name:gl"=>"Wallis e Futuna", "name:he"=>"ואליס ופוטונה", "name:hr"=>"Wallis i Futuna", "name:hu"=>"Wallis és Futuna", "name:id"=>"Wallis dan Futuna", "name:io"=>"Wallis e Futuna Insuli", "name:is"=>"Wallis- og Fútúnaeyjar", "name:it"=>"Wallis e Futuna", "name:ja"=>"ウォリス・フツナ", "name:jv"=>"Wallis lan Futuna", "name:ko"=>"왈리스 퓌튀나", "name:kw"=>"Wallis ha Futuna", "name:la"=>"Vallis et Futuna", "name:lb"=>"Wallis a Futuna", "name:lt"=>"Walliso ir Futuna salos", "name:lv"=>"Volisa un Futuna", "name:mn"=>"Уоллис ба Футуна", "name:mr"=>"वालिस व फुतुना", "name:ms"=>"Wallis dan Futuna", "name:nl"=>"Wallis en Futuna", "name:nn"=>"Wallis- og Futunaøyane", "name:no"=>"Wallis- og Futunaøyene", "name:oc"=>"Wallis e Futuna", "name:pl"=>"Wallis i Futuna", "name:pt"=>"Wallis e Futuna", "name:ro"=>"Wallis şi Futuna", "name:ru"=>"Уоллис и Футуна", "name:se"=>"Wallis ja Futuna", "name:sh"=>"Wallis i Futuna", "name:sk"=>"Wallis a Futuna", "name:sl"=>"Wallis in Futuna", "name:sm"=>"Wallis and Futuna", "name:sr"=>"Валис и Футуна", "name:sv"=>"Wallis- och Futunaöarna", "name:sw"=>"Wallis na Futuna", "name:ta"=>"வலிசும் புட்டூனாவும்", "name:th"=>"หมู่เกาะวาลลิสและหมู่เกาะฟุตูนา", "name:tr"=>"Wallis ve Futuna Adaları", "name:ug"=>"Wallis we Futuna Taqim Aralliri", "name:uk"=>"Волліс і Футуна", "name:vi"=>"Wallis và Futuna", "name:wo"=>"Wallis ak Futuna", "name:zh"=>"瓦利斯和富图纳群岛"
-sn     "name"=>"Sénégal", "name:af"=>"Senegal", "name:am"=>"ሴኔጋል", "name:an"=>"Senegal", "name:ar"=>"السنغال", "name:az"=>"Seneqal", "name:ba"=>"Сенегал", "name:be"=>"Сенегал", "name:bg"=>"Сенегал", "name:bm"=>"Senegal", "name:bn"=>"সেনেগাল", "name:bo"=>"སི་ནི་གཱལ།", "name:br"=>"Senegal", "name:bs"=>"Senegal", "name:ca"=>"Senegal", "name:ce"=>"Сенегал", "name:cs"=>"Senegal", "name:cv"=>"Сенегал", "name:cy"=>"Sénégal", "name:da"=>"Senegal", "name:de"=>"Senegal", "name:dv"=>"ސެނެގާލް", "name:ee"=>"Senegal", "name:el"=>"Σενεγάλη", "name:en"=>"Senegal", "name:eo"=>"Senegalo", "name:es"=>"Senegal", "name:et"=>"Senegal", "name:eu"=>"Senegal", "name:fa"=>"سنگال", "name:ff"=>"Senegaal", "name:fi"=>"Senegal", "name:fo"=>"Senegal", "name:fr"=>"Sénégal", "name:fy"=>"Senegal", "name:ga"=>"An tSeineagáil", "name:gd"=>"Seanagal", "name:gl"=>"Senegal", "name:gv"=>"Yn Tenegaal", "name:ha"=>"Senegal", "name:he"=>"סנגל", "name:hi"=>"सेनेगल", "name:hr"=>"Senegal", "name:ht"=>"Senegal", "name:hu"=>"Szenegál", "name:hy"=>"Սենեգալ", "name:ia"=>"Senegal", "name:id"=>"Senegal", "name:ie"=>"Senegal", "name:io"=>"Senegal", "name:is"=>"Senegal", "name:it"=>"Senegal", "name:ja"=>"セネガル", "name:jv"=>"Senegal", "name:ka"=>"სენეგალი", "name:kg"=>"Senangale", "name:kk"=>"Сенегал", "name:kn"=>"ಸೆನೆಗಲ್", "name:ko"=>"세네갈", "name:ku"=>"Senegal", "name:kw"=>"Senegal", "name:ky"=>"Сенегал", "name:la"=>"Senegalia", "name:lb"=>"Senegal", "name:li"=>"Senegal", "name:ln"=>"Senegale", "name:lt"=>"Senegalas", "name:lv"=>"Senegāla", "name:mi"=>"Henekara", "name:mk"=>"Сенегал", "name:ml"=>"സെനെഗൽ", "name:mn"=>"Сенегал", "name:mr"=>"सेनेगाल", "name:ms"=>"Senegal", "name:mt"=>"Senegal", "name:my"=>"ဆီနီဂေါနိုင်ငံ", "name:na"=>"Senegal", "name:nl"=>"Senegal", "name:nn"=>"Senegal", "name:no"=>"Senegal", "name:oc"=>"Senegal", "name:or"=>"ସେନେଗାଲ", "name:os"=>"Сенегал", "name:pa"=>"ਸੇਨੇਗਲ", "name:pl"=>"Senegal", "name:ps"=>"سېنېګال", "name:pt"=>"Senegal", "name:qu"=>"Sinigal", "name:ro"=>"Senegal", "name:ru"=>"Сенегал", "name:rw"=>"Senegali", "name:sa"=>"सेनेगल", "name:sc"=>"Senegàl", "name:sd"=>"سينيگال", "name:se"=>"Senegal", "name:sg"=>"Senegäle", "name:sh"=>"Senegal", "name:sk"=>"Senegal", "name:sl"=>"Senegal", "name:sn"=>"Senegal", "name:so"=>"Sinigaal", "name:sq"=>"Senegali", "name:sr"=>"Сенегал", "name:st"=>"Senegal", "name:su"=>"Sénégal", "name:sv"=>"Senegal", "name:sw"=>"Senegal", "name:ta"=>"செனிகல்", "name:te"=>"సెనెగల్", "name:tg"=>"Сенегал", "name:th"=>"ประเทศเซเนกัล", "name:ti"=>"ሴኔጋል", "name:tk"=>"Senegal", "name:tl"=>"Senegal", "name:tr"=>"Senegal", "name:ts"=>"Senegal", "name:tt"=>"Сенегал", "name:ug"=>"سېنېگال", "name:uk"=>"Сенегал", "name:ur"=>"سینیگال", "name:uz"=>"Senegal", "name:vi"=>"Sénégal", "name:vo"=>"Senegalän", "name:wa"=>"Senegal", "name:wo"=>"Senegaal", "name:yi"=>"סענעגאל", "name:yo"=>"Sẹ̀nẹ̀gàl", "name:zh"=>"塞内加尔", "name:zu"=>"ISenegal"
-gn     "name"=>"Guinée", "name:af"=>"Guinee", "name:am"=>"ጊኔ", "name:an"=>"Guinea", "name:ar"=>"غينيا", "name:az"=>"Qvineya", "name:ba"=>"Гвинея", "name:be"=>"Гвінея", "name:bg"=>"Гвинея", "name:bm"=>"Gine", "name:bn"=>"গিনি", "name:bo"=>"གི་ནེ།", "name:br"=>"Ginea", "name:bs"=>"Gvineja", "name:ca"=>"República de Guinea", "name:ce"=>"Гвине", "name:cs"=>"Guinea", "name:cv"=>"Гвиней", "name:cy"=>"Guinée", "name:da"=>"Guinea", "name:de"=>"Guinea", "name:dv"=>"ގީނިއާ", "name:ee"=>"Guinea", "name:el"=>"Γουινέα", "name:en"=>"Guinea", "name:eo"=>"Gvineo", "name:es"=>"Guinea", "name:et"=>"Guinea", "name:eu"=>"Ginea", "name:fa"=>"گینه", "name:ff"=>"Gine", "name:fi"=>"Guinea", "name:fo"=>"Guinea", "name:fr"=>"Guinée", "name:fy"=>"Guinee", "name:ga"=>"An Ghuine", "name:gd"=>"Gini", "name:gl"=>"Guinea", "name:gv"=>"Yn Ghuinea", "name:ha"=>"Gine", "name:he"=>"גינאה", "name:hi"=>"गिनी", "name:hr"=>"Gvineja", "name:ht"=>"Gine", "name:hu"=>"Guinea", "name:hy"=>"Գվինեա", "name:ia"=>"Guinea", "name:id"=>"Guinea", "name:ie"=>"Guinea", "name:io"=>"Guinea", "name:is"=>"Gínea", "name:it"=>"Guinea", "name:ja"=>"ギニア", "name:jv"=>"Guinea", "name:ka"=>"გვინეა", "name:kg"=>"Ginea", "name:kk"=>"Гвинея", "name:ko"=>"기니", "name:ku"=>"Gîne", "name:kw"=>"Gyni", "name:ky"=>"Гвинея", "name:la"=>"Guinea", "name:lb"=>"Guinea", "name:li"=>"Guinee", "name:ln"=>"Gine-Konakry", "name:lt"=>"Gvinėja", "name:lv"=>"Gvineja", "name:mi"=>"Kini", "name:mk"=>"Гвинеја", "name:ml"=>"ഗിനി", "name:mn"=>"Гвиней", "name:mr"=>"गिनी", "name:ms"=>"Guinea", "name:my"=>"ဂီနီနိုင်ငံ", "name:na"=>"Gini", "name:ne"=>"गिनी", "name:nl"=>"Guinee", "name:nn"=>"Guinea", "name:no"=>"Guinea", "name:nv"=>"Gíní", "name:oc"=>"Guinèa", "name:or"=>"ଗିନି", "name:os"=>"Гвиней", "name:pa"=>"ਗਿਨੀ", "name:pl"=>"Gwinea", "name:pt"=>"Guiné", "name:qu"=>"Khiniya", "name:ro"=>"Guineea", "name:ru"=>"Гвинея", "name:rw"=>"Gineya", "name:sa"=>"गिनी", "name:sc"=>"Guinea", "name:se"=>"Guinea", "name:sg"=>"Ginëe", "name:sh"=>"Gvineja", "name:sk"=>"Guinea", "name:sl"=>"Gvineja", "name:sm"=>"Guinea", "name:sn"=>"Guinea", "name:so"=>"Guinea", "name:sq"=>"Guinea", "name:sr"=>"Гвинеја", "name:ss"=>"IGiniya", "name:st"=>"Guinea", "name:su"=>"Guinéa", "name:sv"=>"Guinea", "name:sw"=>"Guinea", "name:ta"=>"கினி", "name:tg"=>"Гвинея", "name:th"=>"ประเทศกินี", "name:tk"=>"Gwineýa", "name:tl"=>"Ginea", "name:tr"=>"Gine", "name:ts"=>"Gineya", "name:tt"=>"Гвинея", "name:ug"=>"ۋىنېيە", "name:uk"=>"Ґвінея", "name:ur"=>"جمہوریہ گنی", "name:uz"=>"Gvineya", "name:vi"=>"Guinée", "name:vo"=>"Gineyän", "name:wo"=>"Gine", "name:yi"=>"גינע", "name:yo"=>"Guinea", "name:zh"=>"几内亚", "name:zu"=>"IGini"
-cw     "name"=>"Curaçao", "name:en"=>"Curaçao", "name:es"=>"Curazao", "name:fr"=>"Curaçao", "name:ru"=>"Кюрасао", "name:sv"=>"Curaçao"
-sx     "name"=>"Sint Maarten"
-am     "name"=>"Հայաստան", "name:ab"=>"Ермантәыла", "name:af"=>"Armenië", "name:ak"=>"Armenia", "name:am"=>"አርመኒያ", "name:an"=>"Armenia", "name:ar"=>"أرمينيا", "name:as"=>"আৰ্মেনিয়া", "name:av"=>"ЦIамухъ", "name:az"=>"Ermənistan", "name:ba"=>"Әрмәнстан", "name:be"=>"Арме́нія", "name:bg"=>"Армения", "name:bh"=>"आर्मीनिया", "name:bi"=>"Armenia", "name:bm"=>"Arimeni", "name:bn"=>"আর্মেনিয়া", "name:bo"=>"ཨར་མེ་ནི་ཡ།", "name:br"=>"Armenia", "name:bs"=>"Ermenija", "name:ca"=>"Armènia", "name:ce"=>"Эрмалойчоь", "name:ch"=>"Armenia", "name:co"=>"Armenia", "name:cs"=>"Arménie", "name:cu"=>"Армєні́ꙗ", "name:cv"=>"Эрмени", "name:cy"=>"Armenia", "name:da"=>"Armenien", "name:de"=>"Armenien", "name:dv"=>"އަރުމީނިއާ", "name:dz"=>"ཨར་མི་ནི་ཡ", "name:ee"=>"Armenia", "name:el"=>"Αρμενία", "name:en"=>"Armenia", "name:eo"=>"Armenio", "name:es"=>"Armenia", "name:et"=>"Armeenia", "name:eu"=>"Armenia", "name:fa"=>"ارمنستان", "name:ff"=>"Armaaniya", "name:fi"=>"Armenia", "name:fo"=>"Armenia", "name:fr"=>"Arménie", "name:fy"=>"Armeenje", "name:ga"=>"An Airméin", "name:gd"=>"Airmeinia", "name:gl"=>"Armenia", "name:gn"=>"Aymenia", "name:gu"=>"આર્મેનિયા", "name:gv"=>"Armeain", "name:ha"=>"Armeniya", "name:he"=>"אַרְמֶנְיָה", "name:hi"=>"आर्मीनिया", "name:hr"=>"Armenija", "name:ht"=>"Ameni", "name:hu"=>"Örményország", "name:hy"=>"Հայաստան", "name:ia"=>"Armenia", "name:id"=>"Armenia", "name:ie"=>"Armenia", "name:io"=>"Armenia", "name:is"=>"Armenía", "name:it"=>"Armenia", "name:ja"=>"アルメニア", "name:jv"=>"Armènia", "name:ka"=>"სომხეთი", "name:kg"=>"Armenia", "name:ki"=>"Armenia", "name:kk"=>"Армения", "name:kl"=>"Armenia", "name:km"=>"អាមេនី", "name:kn"=>"ಆರ್ಮೇನಿಯ", "name:ko"=>"아르메니아", "name:ks"=>"اَرمانِیا", "name:ku"=>"Ermenistan", "name:kv"=>"Армения", "name:kw"=>"Armeni", "name:ky"=>"Армения", "name:la"=>"Armenia", "name:lb"=>"Armenien", "name:lg"=>"Arameniya", "name:li"=>"Armenië", "name:ln"=>"Armeni", "name:lo"=>"ປະເທດອາກເມນີ", "name:lt"=>"Armėnija", "name:lv"=>"Armēnija", "name:mg"=>"Armenia", "name:mi"=>"Āmenia", "name:mk"=>"Ерменија", "name:ml"=>"അർമേനിയ", "name:mn"=>"Армен", "name:mo"=>"Армения", "name:mr"=>"आर्मेनिया", "name:ms"=>"Armenia", "name:mt"=>"Armenja", "name:my"=>"အာမေးနီးယားနိုင်ငံ", "name:na"=>"Arminiya", "name:ne"=>"आर्मेनिया", "name:nl"=>"Armenië", "name:nn"=>"Armenia", "name:no"=>"Armenia", "name:nv"=>"Aooméénii Bikéyah", "name:oc"=>"Armenia", "name:om"=>"Armeeniyaa", "name:or"=>"ଆର୍ମେନିଆ", "name:os"=>"Сомихыстон", "name:pa"=>"ਅਰਮੀਨੀਆ", "name:pi"=>"आर्मीनिया", "name:pl"=>"Armenia", "name:ps"=>"ارمنستان", "name:pt"=>"Arménia", "name:qu"=>"Arminya", "name:rm"=>"Armenia", "name:rn"=>"Arumeniya", "name:ro"=>"Armenia", "name:ru"=>"Армения", "name:rw"=>"Arumeniya", "name:sa"=>"आर्मीनिया", "name:sc"=>"Armènia", "name:sd"=>"آرمينيا", "name:se"=>"Armenia", "name:sg"=>"Armenïi", "name:sh"=>"Jermenija", "name:si"=>"ආර්මේනියාව", "name:sk"=>"Arménsko", "name:sl"=>"Armenija", "name:sm"=>"Amenia", "name:sn"=>"Armenia", "name:so"=>"Armania", "name:sq"=>"Armenia", "name:sr"=>"Јерменија", "name:ss"=>"iArimeniya", "name:su"=>"Arménia", "name:sv"=>"Armenien", "name:sw"=>"Armenia", "name:ta"=>"ஆர்மீனியா", "name:te"=>"ఆర్మేనియా", "name:tg"=>"Арманистон", "name:th"=>"อาร์มีเนีย", "name:ti"=>"አርሜኒያ", "name:tk"=>"Ermenistan", "name:tl"=>"Armenya", "name:to"=>"ʻĀminia", "name:tr"=>"Ermenistan", "name:ts"=>"Armenia", "name:tt"=>"Әрмәнстан", "name:tw"=>"Aminia", "name:ty"=>"Āmenia", "name:ug"=>"ئەرمېنىيە", "name:uk"=>"Вірме́нія", "name:ur"=>"آرمینیا", "name:uz"=>"Armaniston", "name:vi"=>"Armenia", "name:vo"=>"Larmeniyän", "name:wo"=>"Armeeni", "name:yi"=>"אַרמעניע", "name:yo"=>"Arméníà", "name:za"=>"Armenia", "name:zh"=>"亞美尼亞", "name:zu"=>"i-Armenia"
-ad     "name"=>"Andorra", "name:ab"=>"Андора", "name:af"=>"Andorra", "name:ak"=>"Andora", "name:am"=>"አንዶራ", "name:an"=>"Andorra", "name:ar"=>"أندورا", "name:av"=>"Андо́рра", "name:az"=>"Andorra", "name:ba"=>"Андо́рра", "name:be"=>"Андо́ра", "name:bg"=>"Андора", "name:bh"=>"अंडोरा", "name:bi"=>"Andorra", "name:bm"=>"Andɔr", "name:bn"=>"অ্যান্ডোরা", "name:bo"=>"ཨན་ཌོར་ར།", "name:br"=>"Andorra", "name:bs"=>"Andora", "name:ca"=>"Andorra", "name:ce"=>"Андо́рра", "name:co"=>"Andorra", "name:cs"=>"Andorra", "name:cu"=>"Андо́ра", "name:cv"=>"Андорра", "name:cy"=>"Andorra", "name:da"=>"Andorra", "name:de"=>"Andorra", "name:dv"=>"އެންޑޯރާ", "name:dz"=>"ཨཱན་དོ་ར", "name:ee"=>"Andorra", "name:el"=>"Ανδόρρα", "name:en"=>"Andorra", "name:eo"=>"Andoro", "name:es"=>"Andorra", "name:et"=>"Andorra", "name:eu"=>"Andorra", "name:fa"=>"آندورا", "name:ff"=>"Anndoora", "name:fi"=>"Andorra", "name:fo"=>"Andorra", "name:fr"=>"Andorre", "name:fy"=>"Andorra", "name:ga"=>"Andóra", "name:gd"=>"Andorra", "name:gl"=>"Andorra", "name:gn"=>"Andorra", "name:gu"=>"એન્ડોરા", "name:gv"=>"Andorra", "name:ha"=>"Andorra", "name:he"=>"אַנְדּוֹרָה", "name:hi"=>"अण्डोरा", "name:hr"=>"Andora", "name:ht"=>"Andora", "name:hu"=>"Andorra", "name:hy"=>"Անդորրա", "name:ia"=>"Andorra", "name:id"=>"Andorra", "name:ie"=>"Andorra", "name:ig"=>"Andorra", "name:io"=>"Andora", "name:is"=>"Andorra", "name:it"=>"Andorra", "name:ja"=>"アンドラ", "name:jv"=>"Andorra", "name:ka"=>"ანდორა", "name:kg"=>"Andora", "name:ki"=>"Andora", "name:kk"=>"Андорра", "name:kl"=>"Andorra", "name:km"=>"អង់ដូរ៉ា", "name:kn"=>"ಅಂಡೋರ", "name:ko"=>"안도라", "name:ks"=>"اٮ۪نڑورا", "name:ku"=>"Andorra", "name:kv"=>"Андорра", "name:kw"=>"Andorra", "name:ky"=>"Андорра", "name:la"=>"Andorra", "name:lb"=>"Andorra", "name:lg"=>"Andora", "name:li"=>"Andorra", "name:ln"=>"Andora", "name:lo"=>"ອັງດອກ", "name:lt"=>"Andora", "name:lv"=>"Andora", "name:mg"=>"Andora", "name:mi"=>"Andorra", "name:mk"=>"Андора", "name:ml"=>"അൻഡോറ", "name:mn"=>"Андорра", "name:mr"=>"आंदोरा", "name:ms"=>"Andorra", "name:mt"=>"Andorra", "name:my"=>"အင်ဒိုရာနိုင်ငံ", "name:na"=>"Andorra", "name:ne"=>"एण्डोरा", "name:nl"=>"Andorra", "name:nn"=>"Andorra", "name:no"=>"Andorra", "name:nv"=>"Andówa", "name:oc"=>"Andòrra", "name:om"=>"Andooraa", "name:or"=>"ଆଣ୍ଡୋରା", "name:os"=>"Андоррæ", "name:pa"=>"ਅੰਡੋਰਾ", "name:pi"=>"अंडोरा", "name:pl"=>"Andora", "name:ps"=>"اندورا", "name:pt"=>"Andorra", "name:qu"=>"Andurra", "name:rm"=>"Andorra", "name:rn"=>"Andora", "name:ro"=>"Andorra", "name:ru"=>"Андорра", "name:rw"=>"Andora", "name:sa"=>"अण्डोरा", "name:sc"=>"Andorra", "name:sd"=>"انڊورا", "name:se"=>"Andorra", "name:sg"=>"Andôro", "name:sh"=>"Andora", "name:si"=>"ඇන්ඩෝරා", "name:sk"=>"Andorra", "name:sl"=>"Andora", "name:sm"=>"Andora", "name:sn"=>"Andorra", "name:so"=>"Andorra", "name:sq"=>"Andorra", "name:sr"=>"Андора", "name:ss"=>"iYandola", "name:su"=>"Andorra", "name:sv"=>"Andorra", "name:sw"=>"Andorra", "name:ta"=>"அண்டோரா", "name:te"=>"అండొర్రా", "name:tg"=>"Андорра", "name:th"=>"อันดอร์รา", "name:ti"=>"አንዶራ", "name:tk"=>"Andorra", "name:tl"=>"Andorra", "name:to"=>"ʻEnitola", "name:tr"=>"Andorra", "name:ts"=>"Andorra", "name:tt"=>"Андорра", "name:tw"=>"Andorra", "name:ug"=>"ئاندوررا", "name:uk"=>"Андо́рра", "name:ur"=>"انڈورا", "name:uz"=>"Andorra", "name:vi"=>"Andorra", "name:vo"=>"Landorän", "name:wo"=>"Andoor", "name:yi"=>"אַנדאָרע", "name:yo"=>"Àndórà", "name:zh"=>"安道爾", "name:zu"=>"I-Andora"
-at     "name"=>"Österreich", "name:ab"=>"Австриа", "name:af"=>"Oostenryk", "name:ak"=>"Austria", "name:am"=>"ኦስትሪያ", "name:an"=>"Austria", "name:ar"=>"النمسا", "name:as"=>"অষ্ট্ৰিয়া", "name:av"=>"Авустур", "name:ay"=>"Austriya", "name:az"=>"Avstriya", "name:ba"=>"Австрия", "name:be"=>"Аўстрыя", "name:bg"=>"Австрия", "name:bh"=>"ऑस्ट्रिया", "name:bi"=>"Austria", "name:bn"=>"অস্ট্রিয়া", "name:bo"=>"ཨོ་སི་ཐྲི་ཡ།", "name:br"=>"Aostria", "name:bs"=>"Austrija", "name:ca"=>"Àustria", "name:ce"=>"Австри", "name:ch"=>"Austria", "name:co"=>"Austria", "name:cs"=>"Rakousko", "name:cu"=>"Аѵстрїꙗ", "name:cv"=>"Австри", "name:cy"=>"Awstria", "name:da"=>"Østrig", "name:de"=>"Österreich", "name:dv"=>"އޮސްޓްރިއާ", "name:dz"=>"ཨས་ཊི་ཡ", "name:ee"=>"Austria", "name:el"=>"Αυστρία", "name:en"=>"Austria", "name:eo"=>"Aŭstrio", "name:es"=>"Austria", "name:et"=>"Austria", "name:eu"=>"Austria", "name:fa"=>"اتریش", "name:ff"=>"Otiris", "name:fi"=>"Itävalta", "name:fo"=>"Eysturríki", "name:fr"=>"Autriche", "name:fy"=>"Eastenryk", "name:ga"=>"An Ostair", "name:gd"=>"An Ostair", "name:gl"=>"Austria", "name:gn"=>"Auteria", "name:gu"=>"ઑસ્ટ્રિયા", "name:gv"=>"Yn Austeyr", "name:ha"=>"Austriya", "name:he"=>"אוסטריה", "name:hi"=>"ऑस्ट्रिया", "name:hr"=>"Austrija", "name:ht"=>"Otrich", "name:hu"=>"Ausztria", "name:hy"=>"Ավստրիա", "name:ia"=>"Austria", "name:id"=>"Austria", "name:ie"=>"Austria", "name:ig"=>"Austria", "name:io"=>"Austria", "name:is"=>"Austurríki", "name:it"=>"Austria", "name:ja"=>"オーストリア", "name:jv"=>"Austria", "name:ka"=>"ავსტრია", "name:kg"=>"Autriche", "name:kk"=>"Аустрия Республикасы", "name:kl"=>"Østrigi", "name:kn"=>"ಆಸ್ಟ್ರಿಯ", "name:ko"=>"오스트리아", "name:ku"=>"Awistriya", "name:kv"=>"Австрия", "name:kw"=>"Estrych", "name:ky"=>"Австрия", "name:la"=>"Austria", "name:lb"=>"Éisträich", "name:li"=>"Oosteriek", "name:ln"=>"Otrish", "name:lo"=>"ປະເທດໂອຕະລິດ", "name:lt"=>"Austrija", "name:lv"=>"Austrija", "name:mg"=>"Aotrisy", "name:mi"=>"Ateria", "name:mk"=>"Австрија", "name:ml"=>"ഓസ്ട്രിയ", "name:mn"=>"Австри", "name:mr"=>"ऑस्ट्रिया", "name:ms"=>"Austria", "name:mt"=>"Awstrija", "name:my"=>"သြစတြီးယားနိုင်ငံ", "name:na"=>"Oteriya", "name:ne"=>"अष्ट्रीया", "name:nl"=>"Oostenrijk", "name:nn"=>"Austerrike", "name:no"=>"Østerrike", "name:nv"=>"Óóswiya", "name:oc"=>"Àustria", "name:om"=>"Oostiriyaa", "name:or"=>"ଅଷ୍ଟ୍ରିଆ", "name:os"=>"Австри", "name:pa"=>"ਆਸਟਰੀਆ", "name:pi"=>"आस्ट्रिया", "name:pl"=>"Austria", "name:ps"=>"اتريش", "name:pt"=>"Áustria", "name:qu"=>"Awstiriya", "name:rm"=>"Austria", "name:ro"=>"Austria", "name:ru"=>"Австрия", "name:rw"=>"Ositiriya", "name:sa"=>"आस्ट्रिया", "name:sc"=>"Àustria", "name:sd"=>"آسٽريا", "name:se"=>"Nuortariika", "name:sh"=>"Austrija", "name:si"=>"ඔස්ට්රියාව", "name:sk"=>"Rakúsko", "name:sl"=>"Avstrija", "name:sm"=>"Austilia", "name:sn"=>"Austria", "name:so"=>"Austriya", "name:sq"=>"Austria", "name:sr"=>"Аустрија", "name:ss"=>"IYosithiya", "name:st"=>"Austria", "name:su"=>"Austria", "name:sv"=>"Österrike", "name:sw"=>"Austria", "name:ta"=>"ஆஸ்திரியா", "name:te"=>"ఆస్ట్రియా", "name:tg"=>"Утриш", "name:th"=>"ประเทศออสเตรีย", "name:tk"=>"Awstriýa", "name:tl"=>"Austria", "name:tr"=>"Avusturya", "name:ts"=>"Austria", "name:tt"=>"Австрия", "name:tw"=>"Austria", "name:ug"=>"ئاۋستىرىيە", "name:uk"=>"Австрія", "name:ur"=>"آسٹریا", "name:uz"=>"Avstriya", "name:vi"=>"Áo", "name:vo"=>"Lösterän", "name:wa"=>"Otriche", "name:wo"=>"Otris", "name:yi"=>"עסטרייך", "name:yo"=>"Austríà", "name:za"=>"Audeihleih", "name:zh"=>"奧地利", "name:zu"=>"I-Ostriya"
-bq     \N
-bd     "name"=>"Bangladesh", "name:af"=>"Bangladesj", "name:ar"=>"بنغلاديش", "name:az"=>"Banqladeş", "name:be"=>"Бангладэш", "name:br"=>"Bangladesh", "name:ca"=>"Bangla Desh", "name:da"=>"Bangladesh", "name:de"=>"Bangladesch", "name:el"=>"Μπανγκλαντές", "name:en"=>"Bangladesh", "name:eo"=>"Bangladeŝo", "name:fa"=>"بنگلادش", "name:fi"=>"Bangladesh", "name:fr"=>"Bangladesh", "name:fy"=>"Banglades", "name:ga"=>"An Bhangladéis", "name:gd"=>"Bangladais", "name:he"=>"בנגלדש", "name:hr"=>"Bangladeš", "name:hu"=>"Banglades", "name:is"=>"Bangladess", "name:it"=>"Bangladesh", "name:ja"=>"バングラデシュ", "name:la"=>"Bangladesha", "name:lb"=>"Bangladesch", "name:li"=>"Bangladesj", "name:lt"=>"Bangladešas", "name:lv"=>"Bangladeša", "name:mn"=>"Бангладеш", "name:pl"=>"Bangladesz", "name:pt"=>"Bangladesh", "name:ru"=>"Бангладеш", "name:sl"=>"Bangladeš", "name:sv"=>"Bangladesh", "name:th"=>"ประเทศบังกลาเทศ", "name:tr"=>"Bangladeş", "name:uk"=>"Бангладеш", "name:zh"=>"孟加拉国"
-my     "name"=>"Malaysia", "name:af"=>"Maleisië", "name:am"=>"ማሌዢያ", "name:an"=>"Malaisia", "name:ar"=>"ماليزيا", "name:az"=>"Malayziya", "name:ba"=>"Малайзия", "name:be"=>"Малайзія", "name:bg"=>"Малайзия", "name:bn"=>"মালয়েশিয়া", "name:bo"=>"མ་ལ་ཤི་ཡ།", "name:br"=>"Malaysia", "name:bs"=>"Malezija", "name:ca"=>"Malàisia", "name:ce"=>"Малайзи", "name:cs"=>"Malajsie", "name:cv"=>"Малайзи", "name:cy"=>"Malaysia", "name:da"=>"Malaysia", "name:de"=>"Malaysia", "name:dv"=>"މެލޭޝިޔާ", "name:dz"=>"མ་ལེ་ཤི་ཡ་", "name:el"=>"Μαλαισία", "name:en"=>"Malaysia", "name:eo"=>"Malajzio", "name:es"=>"Malasia", "name:et"=>"Malaisia", "name:eu"=>"Malaysia", "name:fa"=>"مالزی", "name:fi"=>"Malesia", "name:fo"=>"Maleisia", "name:fr"=>"Malaisie", "name:fy"=>"Maleizje", "name:ga"=>"An Mhalaeisia", "name:gd"=>"Malaidhsia", "name:gl"=>"Malaisia", "name:gu"=>"મલેશિયા", "name:gv"=>"Yn Valaysia", "name:he"=>"מלזיה", "name:hi"=>"मलेशिया", "name:hr"=>"Malezija", "name:ht"=>"Malezi", "name:hu"=>"Malajzia", "name:hy"=>"Մալազիա", "name:ia"=>"Malaysia", "name:id"=>"Malaysia", "name:ie"=>"Malaysia", "name:io"=>"Malaizia", "name:is"=>"Malasía", "name:it"=>"Malesia", "name:ja"=>"マレーシア", "name:jv"=>"Malaysia", "name:ka"=>"მალაიზია", "name:ki"=>"Malaysia", "name:kk"=>"Малайзия", "name:km"=>"ម៉ាឡេស៊ី", "name:kn"=>"ಮಲೇಶಿಯ", "name:ko"=>"말레이시아", "name:ku"=>"Malezya", "name:kv"=>"Малайзия", "name:kw"=>"Malaysi", "name:ky"=>"Малайзия", "name:la"=>"Malaesia", "name:lb"=>"Malaysia", "name:li"=>"Maleisië", "name:lo"=>"ປະເທດມາເລເຊຍ", "name:lt"=>"Malaizija", "name:lv"=>"Malaizija", "name:mi"=>"Marēhia", "name:mk"=>"Малезија", "name:ml"=>"മലേഷ്യ", "name:mn"=>"Малайз", "name:mr"=>"मलेशिया", "name:ms"=>"Maleisië", "name:mt"=>"Malażja", "name:my"=>"မလေးရှားနိုင်ငံ", "name:na"=>"Maraidja", "name:ne"=>"मलेशिया", "name:nl"=>"Maleisië", "name:nn"=>"Malaysia", "name:no"=>"Malaysia", "name:nv"=>"Maléízha", "name:oc"=>"Malàisia", "name:or"=>"ମାଲେସିଆ", "name:os"=>"Малайзи", "name:pa"=>"ਮਲੇਸ਼ੀਆ", "name:pl"=>"Malezja", "name:pt"=>"Malásia", "name:qu"=>"Malasya", "name:ro"=>"Malaezia", "name:ru"=>"Малайзия", "name:rw"=>"Malesiya", "name:sa"=>"मलयेशिया", "name:se"=>"Malesia", "name:sg"=>"Malezïi", "name:sh"=>"Malezija", "name:sk"=>"Malajzia", "name:sl"=>"Malezija", "name:so"=>"Malaysiya", "name:sq"=>"Malajzia", "name:sr"=>"Малезија", "name:ss"=>"IMaleshiya", "name:su"=>"Malaysia", "name:sv"=>"Malaysia", "name:sw"=>"Malaysia", "name:ta"=>"மலேசியா", "name:te"=>"మలేషియా", "name:tg"=>"Малайзия", "name:th"=>"ประเทศมาเลเซีย", "name:tk"=>"Malaýziýa", "name:tl"=>"Malasya", "name:tr"=>"Malezya", "name:tt"=>"Малайзия", "name:tw"=>"Malaysia", "name:ug"=>"مالايسىيا", "name:uk"=>"Малайзія", "name:ur"=>"ملائیشیا", "name:uz"=>"Malayziya", "name:vi"=>"Malaysia", "name:vo"=>"Malaysiyän", "name:wo"=>"Maleesi", "name:yi"=>"מאלייזיע", "name:yo"=>"Malaysia", "name:za"=>"Majlaizsihya", "name:zh"=>"马来西亚"
-bi     "name"=>"Burundi", "name:af"=>"Burundi", "name:am"=>"ቡሩንዲ", "name:an"=>"Burundi", "name:ar"=>"بوروندي", "name:az"=>"Burundi", "name:ba"=>"Буру́нди", "name:be"=>"Буру́ндзі", "name:bg"=>"Бурунди", "name:bh"=>"बुरुंडी", "name:bm"=>"Burundi", "name:bn"=>"বুরুন্ডি", "name:bo"=>"བུ་རུན་ཌི།", "name:br"=>"Burundi", "name:bs"=>"Burundi", "name:ca"=>"Burundi", "name:ce"=>"Бурунди", "name:cs"=>"Burundi", "name:cv"=>"Бурунди", "name:cy"=>"Bwrwndi", "name:da"=>"Burundi", "name:de"=>"Burundi", "name:dv"=>"ބުރުންޑީ", "name:dz"=>"བྷུ་རུན་ཌི", "name:ee"=>"Burundi", "name:el"=>"Μπουρούντι", "name:en"=>"Burundi", "name:eo"=>"Burundo", "name:es"=>"Burundí", "name:et"=>"Burundi", "name:eu"=>"Burundi", "name:fa"=>"بوروندی", "name:ff"=>"Burunndi", "name:fi"=>"Burundi", "name:fo"=>"Burundi", "name:fr"=>"Burundi", "name:fy"=>"Boerûndy", "name:ga"=>"an Bhurúin", "name:gd"=>"Burundaidh", "name:gl"=>"Burundi", "name:gn"=>"Vurundi", "name:gu"=>"બુરુંડી", "name:gv"=>"Burundee", "name:ha"=>"Burundi", "name:he"=>"בורונדי", "name:hi"=>"बुरुण्डी", "name:hr"=>"Burundi", "name:ht"=>"Bouroundi", "name:hu"=>"Burundi", "name:hy"=>"Բուրունդի", "name:ia"=>"Burundi", "name:id"=>"Burundi", "name:ie"=>"Burundi", "name:ig"=>"Burundi", "name:io"=>"Burundi", "name:is"=>"Búrúndí", "name:it"=>"Burundi", "name:ja"=>"ブルンジ", "name:jv"=>"Burundi", "name:ka"=>"ბურუნდი", "name:kg"=>"Burundi", "name:ki"=>"Burundi", "name:kk"=>"Бурунди", "name:km"=>"ប៊ូរុនឌី", "name:kn"=>"ಬುರುಂಡಿ", "name:ko"=>"부룬디", "name:ks"=>"بورَنڈِ", "name:ku"=>"Burundî", "name:kw"=>"Burundi", "name:ky"=>"Бурунди", "name:la"=>"Burundia", "name:lb"=>"Burundi", "name:lg"=>"Burundi", "name:li"=>"Boeroendi", "name:ln"=>"Burundi", "name:lo"=>"ບູລັນດີ", "name:lt"=>"Burundis", "name:lv"=>"Burundi", "name:mg"=>"Borondy", "name:mk"=>"Бурунди", "name:ml"=>"ബറുണ്ടി", "name:mn"=>"Бурунди", "name:mr"=>"बुरुंडी", "name:ms"=>"Burundi", "name:mt"=>"Burundi", "name:my"=>"ဘူရွန်ဒီနိုင်ငံ", "name:na"=>"Burundi", "name:ne"=>"बुरूण्डी", "name:nl"=>"Burundi", "name:nn"=>"Burundi", "name:no"=>"Burundi", "name:oc"=>"Burundi", "name:om"=>"Buruundii", "name:or"=>"ବୁରୁଣ୍ଡି", "name:os"=>"Буру́нди", "name:pa"=>"ਬੁਰੂੰਡੀ", "name:pi"=>"बुरुंडी", "name:pl"=>"Burundi", "name:ps"=>"برونډي", "name:pt"=>"Burundi", "name:qu"=>"Burundi", "name:rm"=>"Burundi", "name:rn"=>"Uburundi", "name:ro"=>"Burundi", "name:ru"=>"Бурунди", "name:rw"=>"Uburundi", "name:sa"=>"बुरुंडी", "name:sc"=>"Burundi", "name:se"=>"Burundi", "name:sg"=>"Burundïi", "name:sh"=>"Burundi", "name:si"=>"බුරුන්ඩි", "name:sk"=>"Burundi", "name:sl"=>"Burundi", "name:sn"=>"Burundi", "name:so"=>"Burundi", "name:sq"=>"Burundi", "name:sr"=>"Бурунди", "name:ss"=>"iBurundi", "name:st"=>"Burundi", "name:su"=>"Burundi", "name:sv"=>"Burundi", "name:sw"=>"Burundi", "name:ta"=>"புருண்டி", "name:te"=>"బురుండి", "name:tg"=>"Бурунди", "name:th"=>"บุรุนดี", "name:ti"=>"ብሩንዲ", "name:tk"=>"Burundi", "name:tl"=>"Burundi", "name:to"=>"Pelaniti", "name:tr"=>"Burundi", "name:ts"=>"Burundi", "name:tt"=>"Буру́нди", "name:ug"=>"بۇرۇندى", "name:uk"=>"Буру́нді", "name:ur"=>"برونڈی", "name:uz"=>"Burundi", "name:vi"=>"Burundi", "name:vo"=>"Rundiyän", "name:wa"=>"Bouroundi", "name:wo"=>"Buruundi", "name:yi"=>"בורונדי", "name:yo"=>"Bùrúndì", "name:zh"=>"布隆迪", "name:zu"=>"iBurundi"
-bh     "name"=>"البحرين", "name:af"=>"Bahrein", "name:ak"=>"Baren", "name:am"=>"ባሕሬን", "name:an"=>"Bahrein", "name:ar"=>"البحرين", "name:as"=>"বাহৰেইন", "name:az"=>"Bəhreyn", "name:ba"=>"Бахре́йн", "name:be"=>"Бахрэ́йн", "name:bg"=>"Бахрейн", "name:bh"=>"बहरीन", "name:bm"=>"Bareyini", "name:bn"=>"বাহরাইন", "name:bo"=>"བྷཧ་རཡིན།", "name:br"=>"Bahrein", "name:bs"=>"Bahrein", "name:ca"=>"Bahrain", "name:ce"=>"Бахьрайн", "name:cs"=>"Bahrajn", "name:cv"=>"Бахрейн", "name:cy"=>"Bahrein", "name:da"=>"Bahrain", "name:de"=>"Bahrain", "name:dv"=>"ބަޙްރައިން", "name:dz"=>"བཧ་རེན་", "name:ee"=>"Bahrain nutome", "name:el"=>"Μπαχρέιν", "name:en"=>"Bahrain", "name:eo"=>"Barejno", "name:es"=>"Baréin", "name:et"=>"Bahrein", "name:eu"=>"Bahrain", "name:fa"=>"بحرین", "name:ff"=>"Bahreyn", "name:fi"=>"Bahrain", "name:fo"=>"Barein", "name:fr"=>"Bahreïn", "name:fy"=>"Bachrein", "name:ga"=>"Bairéin", "name:gd"=>"Bachrain", "name:gl"=>"Bahrein", "name:gn"=>"Varéĩ", "name:gu"=>"બહેરીન", "name:gv"=>"Bahrain", "name:ha"=>"Baharain", "name:he"=>"בחריין", "name:hi"=>"बहरीन", "name:hr"=>"Bahrein", "name:ht"=>"Barayn", "name:hu"=>"Bahrein", "name:hy"=>"Բահրեյն", "name:ia"=>"Bahrain", "name:id"=>"Bahrain", "name:ie"=>"Bahrain", "name:io"=>"Bahrain", "name:is"=>"Barein", "name:it"=>"Bahrein", "name:ja"=>"バーレーン", "name:jv"=>"Bahrain", "name:ka"=>"ბაჰრეინი", "name:kg"=>"Bahrain", "name:ki"=>"Bahrain", "name:kk"=>"Бахрейн", "name:kl"=>"Bahrain", "name:km"=>"បារ៉ែន", "name:kn"=>"ಬಹರೇನ್", "name:ko"=>"바레인", "name:ks"=>"بحریٖن", "name:ku"=>"Behreyn", "name:kv"=>"Бахрейн", "name:kw"=>"Bahreyn", "name:ky"=>"Бахре́йн", "name:la"=>"Baharina", "name:lb"=>"Bahrain", "name:lg"=>"Baareeni", "name:li"=>"Bahrein", "name:ln"=>"Bahrein", "name:lo"=>"ບາເລນ", "name:lt"=>"Bahreinas", "name:lv"=>"Bahreina", "name:mg"=>"Baharainy", "name:mk"=>"Бахреин", "name:ml"=>"ബഹ്‌റൈൻ", "name:mn"=>"Бахрейн", "name:mr"=>"बहरैन", "name:ms"=>"Bahrain", "name:mt"=>"Baħrejn", "name:my"=>"ဘာရိန်းနိုင်ငံ", "name:na"=>"Bahrain", "name:ne"=>"बहराइन", "name:nl"=>"Bahrein", "name:nn"=>"Bahrain", "name:no"=>"Bahrain", "name:oc"=>"Bahrayn", "name:om"=>"Baahireen", "name:or"=>"ବାହାରିନ୍", "name:os"=>"Бахрейн", "name:pa"=>"ਬਹਿਰੀਨ", "name:pi"=>"बहरैन", "name:pl"=>"Bahrajn", "name:ps"=>"بحرین", "name:pt"=>"Bahrein", "name:qu"=>"Bahrayn", "name:rm"=>"Bahrain", "name:rn"=>"Bahareyini", "name:ro"=>"Bahrain", "name:ru"=>"Бахрейн", "name:rw"=>"Bahirayini", "name:sa"=>"बहरैन", "name:sd"=>"بحرين", "name:se"=>"Bahrain", "name:sg"=>"Bahrâina", "name:sh"=>"Bahrein", "name:si"=>"බහරේන්", "name:sk"=>"Bahrajn", "name:sl"=>"Bahrájn", "name:sm"=>"Bahrain", "name:sn"=>"Bahrain", "name:so"=>"Baxrayn", "name:sq"=>"Bahraini", "name:sr"=>"Бахреин", "name:ss"=>"iBhaharayi", "name:su"=>"Bahrain", "name:sv"=>"Bahrain", "name:sw"=>"Bahrain", "name:ta"=>"பகுரைன்", "name:te"=>"బహ్రయిన్", "name:tg"=>"Баҳрайн", "name:th"=>"บาห์เรน", "name:ti"=>"ባህሬን", "name:tk"=>"Bahreýn", "name:tl"=>"Bahrain", "name:to"=>"Paleini", "name:tr"=>"Bahreyn", "name:tt"=>"Бәхрәйн", "name:ug"=>"بەھرېيىن", "name:uk"=>"Бахре́йн", "name:ur"=>"بحرین", "name:uz"=>"Baxreyn", "name:vi"=>"Bahrain", "name:vo"=>"Bahruäns", "name:wo"=>"Bahrayni", "name:yi"=>"באכריין", "name:yo"=>"Báháráìnì", "name:zh"=>"巴林", "name:zu"=>"i-Bahrain"
-bn     "name"=>"Brunei", "name:af"=>"Broenei", "name:ak"=>"Brunae", "name:am"=>"ብሩናይ", "name:an"=>"Brunei", "name:ar"=>"بروناي", "name:as"=>"ব্ৰুণেই", "name:az"=>"Bruney", "name:ba"=>"Бруней", "name:be"=>"Бруне́й", "name:bg"=>"Бруней", "name:bh"=>"ब्रूनेई", "name:bm"=>"Burinɛyi", "name:bn"=>"ব্রুনাই", "name:bo"=>"བྷི་རུ་ནི།", "name:br"=>"Brunei", "name:bs"=>"Brunej", "name:ca"=>"Brunei", "name:ce"=>"Бруней", "name:cs"=>"Brunej", "name:cv"=>"Бруней", "name:cy"=>"Brwnei", "name:da"=>"Brunei", "name:de"=>"Brunei", "name:dv"=>"ބުރުނައީ", "name:dz"=>"བྷྲུ་ནའི", "name:el"=>"Μπρουνέι", "name:en"=>"Brunei", "name:eo"=>"Brunejo", "name:es"=>"Brunéi", "name:et"=>"Brunei", "name:eu"=>"Brunei", "name:fa"=>"برونئی", "name:ff"=>"Burnaay", "name:fi"=>"Brunei", "name:fo"=>"Brunei", "name:fr"=>"Brunei", "name:fy"=>"Brûnei", "name:ga"=>"Brúiné", "name:gd"=>"Brùnaigh", "name:gl"=>"Brunei", "name:gn"=>"Mburunéi", "name:gu"=>"બ્રુનેઈ", "name:gv"=>"Brunei", "name:ha"=>"Brunei", "name:he"=>"ברוניי", "name:hi"=>"ब्रुनेई", "name:hr"=>"Brunej", "name:ht"=>"Brouney", "name:hu"=>"Brunei", "name:hy"=>"Բրունեյ", "name:ia"=>"Brunei", "name:id"=>"Brunei", "name:ie"=>"Brunei", "name:ik"=>"Brunei", "name:io"=>"Brunei", "name:is"=>"Brúnei", "name:it"=>"Brunei", "name:ja"=>"ブルネイ", "name:jv"=>"Brunéi", "name:ka"=>"ბრუნეი", "name:kg"=>"Brunei", "name:ki"=>"Brunei", "name:kk"=>"Бруней", "name:kl"=>"Brunei", "name:km"=>"ប្រទេសប៊្រុយណេ", "name:kn"=>"ಬ್ರುನೈ", "name:ko"=>"브루나이", "name:ks"=>"بُرنٔے", "name:ku"=>"Brûney", "name:kv"=>"Бруней", "name:kw"=>"Bruney", "name:ky"=>"Бруней", "name:la"=>"Bruneium", "name:lb"=>"Brunei", "name:li"=>"Brunei", "name:ln"=>"Brunei", "name:lo"=>"ບູໄນ", "name:lt"=>"Brunėjus", "name:lv"=>"Bruneja", "name:mg"=>"Boroney", "name:mi"=>"Poronai", "name:mk"=>"Брунеј", "name:ml"=>"ബ്രൂണൈ", "name:mn"=>"Бруней", "name:mr"=>"ब्रुनेई", "name:ms"=>"Brunei", "name:mt"=>"Brunej", "name:my"=>"ဘရူနိုင်းနိုင်ငံ", "name:na"=>"Brunei", "name:ne"=>"ब्रुनेई", "name:nl"=>"Brunei", "name:nn"=>"Brunei", "name:no"=>"Brunei", "name:ny"=>"Brunei", "name:oc"=>"Brunei", "name:om"=>"Birunaay", "name:or"=>"ବ୍ରୁନେଇ", "name:os"=>"Бруней", "name:pa"=>"ਬਰੂਨਾਈ", "name:pi"=>"ब्रूनै", "name:pl"=>"Brunei", "name:ps"=>"برونای", "name:pt"=>"Brunei", "name:qu"=>"Bruniy", "name:rm"=>"Brunei", "name:ro"=>"Brunei", "name:ru"=>"Бруней", "name:rw"=>"Buruneyi", "name:sa"=>"ब्रूनै", "name:sd"=>"برونئي", "name:se"=>"Brunei", "name:sg"=>"Brunêi", "name:sh"=>"Brunej", "name:si"=>"බෲනායි", "name:sk"=>"Brunej", "name:sl"=>"Brunej", "name:sn"=>"Brunei", "name:so"=>"Barunay", "name:sq"=>"Brunei", "name:sr"=>"Брунеј", "name:ss"=>"iBhruneyi", "name:su"=>"Brunéi", "name:sv"=>"Brunei", "name:sw"=>"Brunei", "name:ta"=>"புரூணை", "name:te"=>"బ్రూనై", "name:tg"=>"Бруней", "name:th"=>"บรูไน", "name:ti"=>"ብሩኒ", "name:tk"=>"Bruneý", "name:tl"=>"Brunei", "name:to"=>"Pulunei", "name:tr"=>"Brunei", "name:tt"=>"Бруне́й", "name:ug"=>"برۇنېي", "name:uk"=>"Бруне́й", "name:ur"=>"برونائی", "name:uz"=>"Bruney", "name:vi"=>"Brunei", "name:vo"=>"Brunän", "name:yi"=>"ברוניי", "name:yo"=>"Brunei", "name:za"=>"Vwnzlaiz", "name:zh"=>"文莱", "name:zu"=>"i-Brunei"
-cr     "name"=>"Costa Rica", "name:ab"=>"Коста-Рика", "name:af"=>"Costa Rica", "name:am"=>"ኮስታ ሪካ", "name:an"=>"Costa Rica", "name:ar"=>"كوستاريكا", "name:ay"=>"Kustarika", "name:az"=>"Kosta-Rika", "name:ba"=>"Коста-Рика", "name:be"=>"Коста-Рыка", "name:bg"=>"Коста Рика", "name:bh"=>"कोस्टा रिका", "name:bm"=>"Kosta Rika", "name:bn"=>"কোস্টা রিকা", "name:bo"=>"ཁོ་ས་ཏ་རི་ཁ", "name:br"=>"Costa Rica", "name:bs"=>"Kostarika", "name:ca"=>"Costa Rica", "name:ce"=>"Коста-Рика", "name:cs"=>"Kostarika", "name:cy"=>"Costa Rica", "name:da"=>"Costa Rica", "name:de"=>"Costa Rica", "name:dv"=>"ކޮސްޓަރީކާ", "name:ee"=>"Costa Rica", "name:el"=>"Κόστα Ρίκα", "name:en"=>"Costa Rica", "name:eo"=>"Kostariko", "name:es"=>"Costa Rica", "name:et"=>"Costa Rica", "name:eu"=>"Costa Rica", "name:fa"=>"کاستاریکا", "name:fi"=>"Costa Rica", "name:fo"=>"Kosta Rika", "name:fr"=>"Costa Rica", "name:fy"=>"Kosta Rika", "name:ga"=>"Cósta Ríce", "name:gd"=>"Costa Rica", "name:gl"=>"Costa Rica", "name:gn"=>"Kosta Rrika", "name:gv"=>"Yn Coose Berçhagh", "name:he"=>"קוסטה ריקה", "name:hi"=>"कोस्टा रीका", "name:hr"=>"Kostarika", "name:ht"=>"Kostarika", "name:hu"=>"Costa Rica", "name:hy"=>"Կոստա Ռիկա", "name:ia"=>"Costa Rica", "name:id"=>"Kosta Rika", "name:ie"=>"Costa Rica", "name:io"=>"Kosta Rika", "name:is"=>"Kosta Ríka", "name:it"=>"Costa Rica", "name:ja"=>"コスタリカ", "name:jv"=>"Kosta Rika", "name:ka"=>"კოსტა-რიკა", "name:kk"=>"Коста-Рика", "name:kn"=>"ಕೋಸ್ಟಾ ರಿಕ", "name:ko"=>"코스타리카", "name:ku"=>"Kosta Rîka", "name:kv"=>"Коста-Рика", "name:kw"=>"Kosta Rika", "name:ky"=>"Коста-Рика", "name:la"=>"Ora Opulenta", "name:lb"=>"Costa Rica", "name:li"=>"Costa Rica", "name:ln"=>"Kosta Rika", "name:lo"=>"ປະເທດກົດສະຕາລິກາ", "name:lt"=>"Kosta Rika", "name:lv"=>"Kostarika", "name:mg"=>"Costa Rica", "name:mi"=>"Koto Rika", "name:mk"=>"Костарика", "name:ml"=>"കോസ്റ്റ റീക്ക", "name:mn"=>"Коста-Рика", "name:mr"=>"कोस्टा रिका", "name:ms"=>"Costa Rica", "name:mt"=>"Kosta Rika", "name:my"=>"ကော့စတာရီကာနိုင်ငံ", "name:na"=>"Kosta Rika", "name:ne"=>"कोस्टारिका", "name:nl"=>"Costa Rica", "name:nn"=>"Costa Rica", "name:no"=>"Costa Rica", "name:oc"=>"Còsta Rica", "name:om"=>"Kostaa Rikaa", "name:or"=>"କୋଷ୍ଟାରିକା", "name:os"=>"Коста-Рикæ", "name:pa"=>"ਕੋਸਤਾ ਰੀਕਾ", "name:pi"=>"कोस्टा रीका", "name:pl"=>"Kostaryka", "name:ps"=>"کوسټاریکا", "name:pt"=>"Costa Rica", "name:qu"=>"Kustarika", "name:ro"=>"Costa Rica", "name:ru"=>"Коста-Рика", "name:rw"=>"Kosita Rika", "name:sa"=>"कोस्टा रीका", "name:se"=>"Costa Rica", "name:sh"=>"Kostarika", "name:si"=>"කෝස්ට රිකා", "name:sk"=>"Kostarika", "name:sl"=>"Kostarika", "name:sm"=>"Kosta Rika", "name:so"=>"Kosta Rika", "name:sq"=>"Kosta Rika", "name:sr"=>"Костарика", "name:ss"=>"IKhosta-Likha", "name:su"=>"Kosta Rika", "name:sv"=>"Costa Rica", "name:sw"=>"Kosta Rika", "name:ta"=>"கோஸ்ட்டா ரிக்கா", "name:te"=>"కోస్టారీకా", "name:tg"=>"Коста Рика", "name:th"=>"ประเทศคอสตาริกา", "name:tk"=>"Kosta-Rika", "name:tl"=>"Costa Rica", "name:tr"=>"Kosta Rika", "name:tt"=>"Коста-Рика", "name:ug"=>"كوستارىكا", "name:uk"=>"Коста-Рика", "name:ur"=>"کوسٹاریکا", "name:uz"=>"Kosta Rika", "name:vi"=>"Costa Rica", "name:vo"=>"Kostarikän", "name:wa"=>"Costa Rica", "name:wo"=>"Kosta Riika", "name:yi"=>"קאסטא ריקא", "name:yo"=>"Kóstá Rikà", "name:zh"=>"哥斯达黎加", "name:zu"=>"Costa Rica"
-do     "name"=>"República Dominicana", "name:af"=>"Dominikaanse Republiek", "name:am"=>"ዶሚኒካን ሪፐብሊክ", "name:an"=>"Republica Dominicana", "name:ar"=>"جمهورية الدومينيكان", "name:ay"=>"Republika Duminikana", "name:az"=>"Dominikan Respublikası", "name:be"=>"Дамініканская Рэспубліка", "name:bg"=>"Доминиканска република", "name:bn"=>"ডোমিনিকান প্রজাতন্ত্র", "name:bo"=>"ཌོ་མི་ནི་ཀན་སྤྱི་མཐུན་རྒྱལ་ཁབ།", "name:br"=>"Republik Dominikan", "name:bs"=>"Dominikanska Republika", "name:ca"=>"República Dominicana", "name:ce"=>"Доминикан Пачхьалкх", "name:cs"=>"Dominikánská republika", "name:cy"=>"Gweriniaeth Dominica", "name:da"=>"Dominikanske Republik", "name:de"=>"Dominikanische Republik", "name:dv"=>"ޑޮމިނިކަން ޖުމްހޫރިއްޔާ", "name:ee"=>"Dominican Republic", "name:el"=>"Δομινικανή Δημοκρατία", "name:en"=>"Dominican Republic", "name:eo"=>"Domingo", "name:es"=>"República Dominicana", "name:et"=>"Dominikaani Vabariik", "name:eu"=>"Dominikar Errepublika", "name:fa"=>"جمهوری دومینیکن", "name:fi"=>"Dominikaaninen tasavalta", "name:fo"=>"Dominikanalýðveldið", "name:fr"=>"République dominicaine", "name:fy"=>"Dominikaanske Republyk", "name:ga"=>"An Phoblacht Dhoiminiceach", "name:gd"=>"Poblachd Dhoiminicia", "name:gl"=>"República Dominicana", "name:gv"=>"Yn Phobblaght Ghominicagh", "name:he"=>"הרפובליקה הדומיניקנית", "name:hi"=>"डोमिनिकन गणराज्य", "name:hr"=>"Dominikanska Republika", "name:ht"=>"Dominikani", "name:hu"=>"Dominikai Köztársaság", "name:hy"=>"Դոմինիկյան Հանրապետություն", "name:ia"=>"Republica Dominican", "name:id"=>"Republik Dominika", "name:io"=>"Dominikana Republiko", "name:is"=>"Dóminíska lýðveldið", "name:it"=>"Repubblica Dominicana", "name:ja"=>"ドミニカ共和国", "name:jv"=>"Republik Dominika", "name:ka"=>"დომინიკელთა რესპუბლიკა", "name:kk"=>"Доминикан Республикасы", "name:kn"=>"ಡೊಮಿನಿಕ ಗಣರಾಜ್ಯ", "name:ko"=>"도미니카 공화국", "name:ku"=>"Komara Domînîk", "name:kw"=>"Repoblek Dhominikanek", "name:la"=>"Respublica Dominicana", "name:lb"=>"Dominikanesch Republik", "name:li"=>"Dominicaanse Rippubliek", "name:ln"=>"Republiki Dominikani", "name:lt"=>"Dominikos Respublika", "name:lv"=>"Dominikāna", "name:mi"=>"Te Whenua Tominika", "name:mk"=>"Доминиканска Република", "name:ml"=>"ഡൊമനിക്കൻ റിപ്പബ്ലിക്", "name:mn"=>"Доминиканы Бүгд Найрамдах Улс", "name:mr"=>"डॉमिनिकन प्रजासत्ताक", "name:ms"=>"Republik Dominika", "name:mt"=>"Repubblika Dominikana", "name:my"=>"ဒိုမီနီကန်သမ္မတနိုင်ငံ", "name:na"=>"Ripubrikin Dominika", "name:ne"=>"डोमिनिकन गणतन्त्र", "name:nl"=>"Dominicaanse Republiek", "name:nn"=>"Den dominikanske republikken", "name:no"=>"Den dominikanske republikk", "name:nv"=>"Domingo Bikéyah", "name:oc"=>"Republica Dominicana", "name:or"=>"ଡୋମେନିକାନ ରିପବ୍ଲିକ", "name:os"=>"Доминиканæйы Республикæ", "name:pa"=>"ਡੋਮਿਨਿਕਾਈ ਗਣਰਾਜ", "name:pl"=>"Dominikana", "name:ps"=>"ډومنيکان جمهوريت", "name:pt"=>"República Dominicana", "name:qu"=>"Duminikana", "name:ro"=>"Republica Dominicană", "name:ru"=>"Доминиканская Республика", "name:rw"=>"Repubulika ya Dominikani", "name:sa"=>"डोमोनिकन रिपब्लिक", "name:se"=>"Dominikána dásseváldi", "name:sh"=>"Dominikanska Republika", "name:sk"=>"Dominikánska republika", "name:sl"=>"Dominikanska republika", "name:sq"=>"Republika Dominikane", "name:sr"=>"Доминиканска Република", "name:ss"=>"Tibuse weDomonokha", "name:su"=>"Républik Dominika", "name:sv"=>"Dominikanska Republiken", "name:sw"=>"Jamhuri ya Dominika", "name:ta"=>"டொமினிக்கன் குடியரசு", "name:te"=>"డొమెనికన్ రిపబ్లిక్", "name:tg"=>"Ҷумҳурии Доминикана", "name:th"=>"สาธารณรัฐโดมินิกัน", "name:tl"=>"Republikang Dominikano", "name:tr"=>"Dominik Cumhuriyeti", "name:tt"=>"Доминикан Җөмһүрияте", "name:ug"=>"دومىنىكان جۇمھۇرىيەتى", "name:uk"=>"Домініканська Республіка", "name:ur"=>"جمہوریہ ڈومینیکن", "name:uz"=>"Dominika Respublikasi", "name:vi"=>"Cộng hòa Dominica", "name:vo"=>"Sandominän", "name:wo"=>"Réewum Dominik", "name:yi"=>"דאמיניקאנישע רעפובליק", "name:yo"=>"Orílẹ̀òmìnira Dómíníkì", "name:zh"=>"多明尼加共和國"
-cz     "name"=>"Česko", "name:ab"=>"Чехиа", "name:af"=>"Tsjeggië", "name:am"=>"ቼክ ሪፐብሊክ", "name:an"=>"Republica Checa", "name:ar"=>"التشيك", "name:av"=>"Чехия", "name:ay"=>"Chexya Ripublika", "name:az"=>"Çexiya", "name:ba"=>"Чехия", "name:be"=>"Чэхія", "name:bg"=>"Чешка република", "name:bh"=>"चेक रिपब्लिक", "name:bi"=>"Czech Republic", "name:bn"=>"চেক প্রজাতন্ত্র", "name:bo"=>"ཅེ་ཁེ།", "name:br"=>"Tchekia", "name:bs"=>"Češka", "name:ca"=>"Txèquia", "name:ce"=>"Чехи", "name:ch"=>"Chekia", "name:co"=>"Cechia", "name:cs"=>"Česko", "name:cu"=>"Чєшьско", "name:cv"=>"Чех Республики", "name:cy"=>"Gweriniaeth Tsiec", "name:da"=>"Tjekkiet", "name:de"=>"Tschechien", "name:dv"=>"ޗެކް ޖުމްހޫރިއްޔާ", "name:dz"=>"ཅེཀ་རི་པབ་ལིཀ་", "name:ee"=>"Czech Republic", "name:el"=>"Τσεχία", "name:en"=>"Czechia", "name:eo"=>"Ĉeĥio", "name:es"=>"Chequia", "name:et"=>"Tšehhi", "name:eu"=>"Txekia", "name:fa"=>"جمهوری چک", "name:ff"=>"Cekiya", "name:fi"=>"Tšekki", "name:fo"=>"Kekkia", "name:fr"=>"Tchéquie", "name:fy"=>"Tsjechje", "name:ga"=>"An tSeic", "name:gd"=>"An t-Seic", "name:gl"=>"República Checa", "name:gn"=>"Cheko", "name:gv"=>"Yn Phobblaght Çheck", "name:ha"=>"Kazech", "name:he"=>"צכיה", "name:hi"=>"चेक गणराज्य", "name:hr"=>"Češka", "name:ht"=>"Repiblik tchèk", "name:hu"=>"Csehország", "name:hy"=>"Չեխիա", "name:ia"=>"Republica Chec", "name:id"=>"Republik Ceko", "name:ie"=>"Tchechia", "name:ig"=>"Chekia", "name:ik"=>"Czech Republic", "name:io"=>"Chekia", "name:is"=>"Tékkland", "name:it"=>"Repubblica Ceca", "name:ja"=>"チェコ", "name:jv"=>"Céko", "name:ka"=>"ჩეხეთი", "name:kg"=>"République tchèque", "name:kk"=>"Чехия", "name:kl"=>"Tjekkia", "name:kn"=>"ಜೆಕ್ ಗಣರಾಜ್ಯ", "name:ko"=>"체코", "name:ku"=>"Komara Çekî", "name:kv"=>"Чехия", "name:kw"=>"Pow Chek", "name:ky"=>"Чехия", "name:la"=>"Cechia", "name:lb"=>"Tschechien", "name:li"=>"Tsjechië", "name:ln"=>"Republíki Sheki", "name:lo"=>"ສາທາລະນະລັດແຊັກ", "name:lt"=>"Čekija", "name:lv"=>"Čehija", "name:mg"=>"Tsekia", "name:mi"=>"Tīekia", "name:mk"=>"Чешка", "name:ml"=>"ചെക്ക് റിപ്പബ്ലിക്ക്", "name:mn"=>"Бүгд Найрамдах Чех Улс", "name:mr"=>"चेक प्रजासत्ताक", "name:ms"=>"Republik Czech", "name:mt"=>"Repubblika Ċeka", "name:my"=>"ချက်သမ္မတနိုင်ငံ", "name:na"=>"Ripubrikin Tsiek", "name:ne"=>"चेक गणतन्त्र", "name:nl"=>"Tsjechië", "name:nn"=>"Tsjekkia", "name:no"=>"Tsjekkia", "name:nv"=>"Chek Bikéyah", "name:oc"=>"Republica Chèca", "name:om"=>"Cheekiyaa", "name:or"=>"ଚେକ ରିପବ୍ଲିକ", "name:os"=>"Чехи", "name:pa"=>"ਚੈੱਕ ਗਣਰਾਜ", "name:pi"=>"चेक रिपब्लिक", "name:pl"=>"Czechy", "name:ps"=>"چېک جمهوريت", "name:pt"=>"Tcheca", "name:qu"=>"Chiksuyu", "name:rm"=>"Tschechia", "name:ro"=>"Cehia", "name:ru"=>"Чехия", "name:rw"=>"Cekiya", "name:sa"=>"ज़ेक् रिपब्लिक", "name:sc"=>"Repùblica Ceca", "name:sd"=>"جمهوريه چيڪ", "name:se"=>"Čeahkka", "name:sh"=>"Češka Republika", "name:si"=>"චෙක් ජනරජය", "name:sk"=>"Česko", "name:sl"=>"Češka", "name:sm"=>"Czechs Republic", "name:sn"=>"Czechia", "name:so"=>"Jamhuuriyadda Tashik", "name:sq"=>"Republika Çeke", "name:sr"=>"Чешка", "name:ss"=>"Shekhi", "name:su"=>"Céko", "name:sv"=>"Tjeckien", "name:sw"=>"Ucheki", "name:ta"=>"செக் குடியரசு", "name:te"=>"చెక్ రిపబ్లిక్", "name:tg"=>"Чехия", "name:th"=>"สาธารณรัฐเช็ก", "name:tk"=>"Çehiýa", "name:tl"=>"Republikang Tseko", "name:tr"=>"Çek Cumhuriyeti", "name:ts"=>"Czech Republic", "name:tt"=>"Чехия", "name:ty"=>"Czech Republic", "name:ug"=>"چېخ جۇمھۇرىيەتى", "name:uk"=>"Чехія", "name:ur"=>"چیک جمہوریہ", "name:uz"=>"Chexiya", "name:vi"=>"Cộng hòa Séc", "name:vo"=>"Tsyegän", "name:wa"=>"Tchekeye", "name:wo"=>"Réewum Cek", "name:yi"=>"טשעכיי", "name:yo"=>"Tsẹ́kì Olómìnira", "name:za"=>"Ciethaek", "name:zh"=>"捷克", "name:zu"=>"ITsheki"
-ee     "name"=>"Eesti", "name:af"=>"Estland", "name:am"=>"ኤስቶኒያ", "name:an"=>"Estonia", "name:ar"=>"إستونيا", "name:az"=>"Estoniya", "name:ba"=>"Эстония", "name:be"=>"Эстонія", "name:bg"=>"Естония", "name:bi"=>"Estonia", "name:bm"=>"Estonia", "name:bn"=>"ইস্তোনিয়া", "name:bo"=>"ཨིསུ་ཊོ་ནིཡ།", "name:br"=>"Estonia", "name:bs"=>"Estonija", "name:ca"=>"Estònia", "name:ce"=>"Эстони", "name:co"=>"Estonia", "name:cs"=>"Estonsko", "name:cu"=>"Єсть", "name:cv"=>"Эстони", "name:cy"=>"Estonia", "name:da"=>"Estland", "name:de"=>"Estland", "name:dz"=>"ཨིསི་ཊོ་ནི་ཡ།", "name:ee"=>"Estonia", "name:el"=>"Εσθονία", "name:en"=>"Estonia", "name:eo"=>"Estonio", "name:es"=>"Estonia", "name:et"=>"Eesti", "name:eu"=>"Estonia", "name:fa"=>"استونی", "name:ff"=>"Estoniya", "name:fi"=>"Viro", "name:fo"=>"Estland", "name:fr"=>"Estonie", "name:fy"=>"Estlân", "name:ga"=>"An Eastóin", "name:gd"=>"Eastòinia", "name:gl"=>"Estonia", "name:gn"=>"Etoña", "name:gu"=>"ઈસ્ટોનિયા", "name:gv"=>"Yn Estaan", "name:he"=>"אסטוניה", "name:hi"=>"एस्टोनिया", "name:hr"=>"Estonija", "name:ht"=>"Estoni", "name:hu"=>"Észtország", "name:hy"=>"Էստոնիա", "name:ia"=>"Estonia", "name:id"=>"Estonia", "name:ie"=>"Estonia", "name:io"=>"Estonia", "name:is"=>"Eistland", "name:it"=>"Estonia", "name:ja"=>"エストニア", "name:jv"=>"Estonia", "name:ka"=>"ესტონეთი", "name:kg"=>"Estonia", "name:kk"=>"Эстония", "name:kl"=>"Estlandi", "name:kn"=>"ಎಸ್ಟೊನಿಯ", "name:ko"=>"에스토니아", "name:ku"=>"Estonya", "name:kv"=>"Эстония", "name:kw"=>"Estoni", "name:ky"=>"Эстония", "name:la"=>"Estonia", "name:lb"=>"Estland", "name:li"=>"Esland", "name:ln"=>"Estonia", "name:lt"=>"Estija", "name:lv"=>"Igaunija", "name:mg"=>"Estonia", "name:mi"=>"Etonia", "name:mk"=>"Естонија", "name:ml"=>"എസ്റ്റോണിയ", "name:mn"=>"Эстон", "name:mr"=>"एस्टोनिया", "name:ms"=>"Estonia", "name:mt"=>"Estonja", "name:my"=>"အက်စ်တိုးနီးယားနိုင်ငံ", "name:na"=>"Etoniya", "name:ne"=>"इस्टोनिया", "name:nl"=>"Estland", "name:nn"=>"Estland", "name:no"=>"Estland", "name:nv"=>"Ééstii Bikéyah", "name:oc"=>"Estònia", "name:or"=>"ଏଷ୍ଟୋନିଆ", "name:os"=>"Эстони", "name:pa"=>"ਇਸਤੋਨੀਆ", "name:pl"=>"Estonia", "name:ps"=>"اېسټونيا", "name:pt"=>"Estónia", "name:qu"=>"Istunya", "name:ro"=>"Estonia", "name:ru"=>"Эстония", "name:rw"=>"Esitoniya", "name:sa"=>"एस्टोनिया", "name:sc"=>"Estònia", "name:se"=>"Estteeana", "name:sh"=>"Estonija", "name:si"=>"එස්ටෝනියා", "name:sk"=>"Estónsko", "name:sl"=>"Estonija", "name:so"=>"Estoniya", "name:sq"=>"Estonia", "name:sr"=>"Естонија", "name:ss"=>"IWestoniya", "name:st"=>"Estonia", "name:su"=>"Éstonia", "name:sv"=>"Estland", "name:sw"=>"Estonia", "name:ta"=>"எசுத்தோனியா", "name:te"=>"ఎస్టోనియా", "name:tg"=>"Эстония", "name:th"=>"ประเทศเอสโตเนีย", "name:tk"=>"Estoniýa", "name:tl"=>"Estonia", "name:tr"=>"Estonya", "name:tt"=>"Эстония", "name:ug"=>"ئېستونىيە", "name:uk"=>"Естонія", "name:ur"=>"استونیا", "name:uz"=>"Estoniya", "name:ve"=>"Estonia", "name:vi"=>"Estonia", "name:vo"=>"Lestiyän", "name:wo"=>"Estooni", "name:yi"=>"עסטלאנד", "name:yo"=>"Estóníà", "name:zh"=>"爱沙尼亚", "name:zu"=>"I-Estoniya"
-dk     "name"=>"Danmark", "name:af"=>"Denemarke", "name:am"=>"ዴንማርክ", "name:an"=>"Dinamarca", "name:ar"=>"الدنمارك", "name:az"=>"Danimarka", "name:ba"=>"Дания", "name:be"=>"Данія", "name:bg"=>"Дания", "name:bi"=>"Denmark", "name:bn"=>"ডেনমার্ক", "name:bo"=>"དན་མྲག", "name:br"=>"Danmark", "name:bs"=>"Danska", "name:ca"=>"Dinamarca", "name:ce"=>"Дани", "name:co"=>"Danimarca", "name:cs"=>"Dánsko", "name:cu"=>"Данїꙗ", "name:cv"=>"Дани", "name:cy"=>"Denmarc", "name:da"=>"Danmark", "name:de"=>"Dänemark", "name:dv"=>"ޑެންމާކު", "name:dz"=>"ཌེན་མཱཀ་", "name:ee"=>"Denmark", "name:el"=>"Δανία", "name:en"=>"Denmark", "name:eo"=>"Danio", "name:es"=>"Dinamarca", "name:et"=>"Taani", "name:eu"=>"Danimarka", "name:fa"=>"دانمارک", "name:fi"=>"Tanska", "name:fo"=>"Danmark", "name:fr"=>"Danemark", "name:fy"=>"Denemark", "name:ga"=>"An Danmhairg", "name:gd"=>"An Danmhairg", "name:gl"=>"Dinamarca", "name:gn"=>"Ndinamayka", "name:gv"=>"Yn Danvarg", "name:he"=>"דנמרק", "name:hi"=>"डेनमार्क", "name:hr"=>"Danska", "name:ht"=>"Danmak", "name:hu"=>"Dánia", "name:hy"=>"Դանիա", "name:ia"=>"Danmark", "name:id"=>"Denmark", "name:ie"=>"Dania", "name:io"=>"Dania", "name:is"=>"Danmörk", "name:it"=>"Danimarca", "name:ja"=>"デンマーク", "name:jv"=>"Denmark", "name:ka"=>"დანია", "name:kg"=>"Danemark", "name:ki"=>"Denmark", "name:kk"=>"Дания", "name:kl"=>"Danmarki", "name:kn"=>"ಡೆನ್ಮಾರ್ಕ್", "name:ko"=>"덴마크", "name:ku"=>"Danîmarka", "name:kv"=>"Дания", "name:kw"=>"Danmark", "name:ky"=>"Дания", "name:la"=>"Dania", "name:lb"=>"Dänemark", "name:lg"=>"Denimaaka", "name:li"=>"Denemarke", "name:ln"=>"Danemark", "name:lt"=>"Danija", "name:lv"=>"Dānija", "name:mg"=>"Danmarka", "name:mi"=>"Tenemāka", "name:mk"=>"Данска", "name:ml"=>"ഡെന്മാർക്ക്", "name:mn"=>"Дани", "name:mr"=>"डेन्मार्क", "name:ms"=>"Denmark", "name:mt"=>"Danimarka", "name:my"=>"ဒိန်းမတ်နိုင်ငံ", "name:na"=>"Denemark", "name:ne"=>"डेनमार्क", "name:nl"=>"Denemarken", "name:nn"=>"Danmark", "name:no"=>"Danmark", "name:nv"=>"Déinish Dineʼé Bikéyah", "name:oc"=>"Danemarc", "name:or"=>"ଡେନମାର୍କ", "name:os"=>"Дани", "name:pl"=>"Dania", "name:ps"=>"ډېنمارک", "name:pt"=>"Dinamarca", "name:qu"=>"Dansuyu", "name:rm"=>"Danemarc", "name:rn"=>"Danemarke", "name:ro"=>"Danemarca", "name:ru"=>"Дания", "name:rw"=>"Danimarike", "name:sa"=>"डेनमार्क", "name:sc"=>"Danimarca", "name:se"=>"Dánmárku", "name:sh"=>"Danska", "name:si"=>"ඩෙන්මාර්කය", "name:sk"=>"Dánsko", "name:sl"=>"Danska", "name:so"=>"Denmark", "name:sq"=>"Danimarka", "name:sr"=>"Данска", "name:ss"=>"IDenimakhi", "name:st"=>"Denmark", "name:su"=>"Dénmark", "name:sv"=>"Danmark", "name:sw"=>"Denmark", "name:ta"=>"டென்மார்க்", "name:te"=>"డెన్మార్క్", "name:tg"=>"Дания", "name:th"=>"ประเทศเดนมาร์ก", "name:tk"=>"Daniýa", "name:tl"=>"Dinamarka", "name:tr"=>"Danimarka", "name:tt"=>"Дания", "name:ug"=>"دانىيە", "name:uk"=>"Данія", "name:ur"=>"ڈنمارک", "name:uz"=>"Daniya", "name:vi"=>"Đan Mạch", "name:vo"=>"Danän", "name:wo"=>"Danmaark", "name:yi"=>"דענמארק", "name:yo"=>"Dẹ́nmárkì", "name:zh"=>"丹麦", "name:zu"=>"IDenimaki"
-gw     "name"=>"Guiné-Bissau", "name:af"=>"Guinee-Bissau", "name:am"=>"ጊኔ-ቢሳው", "name:an"=>"Guinea-Bissau", "name:ar"=>"غينيا بيساو", "name:az"=>"Qvineya-Bisau", "name:ba"=>"Гвинея-Бисау", "name:be"=>"Гвінея-Бісау", "name:bg"=>"Гвинея-Бисау", "name:bm"=>"Gine Bisau", "name:bn"=>"গিনি-বিসাউ", "name:bo"=>"གི་ནེ་-བི་སའོ།", "name:br"=>"Ginea-Bissau", "name:bs"=>"Gvineja-Bisau", "name:ca"=>"Guinea Bissau", "name:ce"=>"Гвине-Бисау", "name:co"=>"Guinea-Bissau", "name:cs"=>"Guinea-Bissau", "name:cv"=>"Гвиней-Бисау", "name:cy"=>"Guiné-Bissau", "name:da"=>"Guinea-Bissau", "name:de"=>"Guinea-Bissau", "name:dv"=>"ގީނީ-ބިސާއޫ", "name:ee"=>"Guinea-Bissau", "name:el"=>"Γουινέα-Μπισσάου", "name:en"=>"Guinea-Bissau", "name:eo"=>"Gvineo Bisaŭa", "name:es"=>"Guinea-Bisáu", "name:et"=>"Guinea-Bissau", "name:eu"=>"Ginea-Bissau", "name:fa"=>"گینه بیسائو", "name:ff"=>"Gine-Bisaawo", "name:fi"=>"Guinea-Bissau", "name:fo"=>"Guinea-Bissau", "name:fr"=>"Guinée-Bissau", "name:fy"=>"Guinee-Bissau", "name:ga"=>"Guine-Bissau", "name:gd"=>"Gini-Bissau", "name:gl"=>"Guinea-Bisau", "name:gv"=>"Yn Ghuinea-Bissau", "name:he"=>"גינאה ביסאו", "name:hi"=>"गिनी-बिसाऊ", "name:hr"=>"Gvineja Bisau", "name:ht"=>"Gine-Bisao", "name:hu"=>"Bissau-Guinea", "name:hy"=>"Գվինեա Բիսաու", "name:ia"=>"Guinea-Bissau", "name:id"=>"Guinea-Bissau", "name:ie"=>"Guinea-Bissau", "name:io"=>"Guinea Bisau", "name:is"=>"Gínea-Bissá", "name:it"=>"Guinea-Bissau", "name:ja"=>"ギニアビサウ", "name:jv"=>"Guinea-Bissau", "name:ka"=>"გვინეა-ბისაუ", "name:kg"=>"Ginea-Bisau", "name:kk"=>"Гвинея-Бисау", "name:ko"=>"기니비사우", "name:ku"=>"Gîne-Bissau", "name:kw"=>"Gyni-Bissaw", "name:ky"=>"Гвинея-Бисау", "name:la"=>"Guinea Bissaviensis", "name:lb"=>"Guinea-Bissau", "name:li"=>"Guinee-Bissau", "name:ln"=>"Gine-Bisau", "name:lt"=>"Bisau Gvinėja", "name:lv"=>"Gvineja-Bisava", "name:mi"=>"Kini Pihō", "name:mk"=>"Гвинеја-Бисау", "name:ml"=>"ഗിനി-ബിസൗ", "name:mn"=>"Гвиней-Бисау", "name:mr"=>"गिनी-बिसाउ", "name:ms"=>"Guinea-Bissau", "name:my"=>"ဂင်းနီဗစ်ဆောနိုင်ငံ", "name:na"=>"Gini-Bitau", "name:ne"=>"गिनी-बिसाउ", "name:nl"=>"Guinee-Bissau", "name:nn"=>"Guinea-Bissau", "name:no"=>"Guinea-Bissau", "name:nv"=>"Gíní Bisó", "name:oc"=>"Guinèa Bissau", "name:os"=>"Гвиней-Бисау", "name:pa"=>"ਗਿਨੀ-ਬਿਸਾਊ", "name:pl"=>"Gwinea Bissau", "name:pt"=>"Guiné-Bissau", "name:qu"=>"Khiniya-Wisaw", "name:ro"=>"Guineea-Bissau", "name:ru"=>"Гвинея-Бисау", "name:rw"=>"Gineya-Biso", "name:sc"=>"Guinea-Bissau", "name:se"=>"Guinea-Bissau", "name:sg"=>"Ginëe-Bisau", "name:sh"=>"Gvineja Bisau", "name:sk"=>"Guinea-Bissau", "name:sl"=>"Gvineja Bissau", "name:sn"=>"Guinea-Bissau", "name:so"=>"Guinea-Bissau", "name:sq"=>"Guinea Bisau", "name:sr"=>"Гвинеја Бисао", "name:ss"=>"IGiniya-Bhasawu", "name:st"=>"Guinea-Bissau", "name:su"=>"Guinéa-Bissau", "name:sv"=>"Guinea-Bissau", "name:sw"=>"Guinea Bisau", "name:ta"=>"கினி-பிசாவு", "name:tg"=>"Гвинея Бисау", "name:th"=>"ประเทศกินี-บิสเซา", "name:tk"=>"Gwineýa-Bisau", "name:tl"=>"Ginea-Bissau", "name:tr"=>"Gine-Bissau", "name:ts"=>"Guinea-Bissau", "name:tt"=>"Гвинея-Бисау", "name:ug"=>"گۋىنېيە بىسسائۇ", "name:uk"=>"Гвінея-Бісау", "name:ur"=>"گنی بساؤ", "name:uz"=>"Gvineya-Bissau", "name:vi"=>"Guiné-Bissau", "name:vo"=>"Gineyän-Bisauän", "name:wo"=>"Gine Bisaawóo", "name:yi"=>"גינע-ביסאו", "name:yo"=>"Guinea-Bissau", "name:zh"=>"幾內亞比索", "name:zu"=>"IGini Bisawu"
-hu     "name"=>"Magyarország", "name:ab"=>"Мадиартәыла", "name:af"=>"Hongarye", "name:am"=>"ሀንጋሪ", "name:an"=>"Hongría", "name:ar"=>"المجر", "name:ay"=>"Hunkariya", "name:az"=>"Macarıstan", "name:ba"=>"Венгрия", "name:be"=>"Венгрыя", "name:bg"=>"Унгария", "name:bi"=>"Hungary", "name:bn"=>"হাঙ্গেরি", "name:bo"=>"ཧུང་གྷ་རི།", "name:br"=>"Hungaria", "name:bs"=>"Mađarska", "name:ca"=>"Hongria", "name:ce"=>"Венгри", "name:co"=>"Ungheria", "name:cs"=>"Maďarsko", "name:cu"=>"Ѫгри", "name:cv"=>"Венгри", "name:cy"=>"Hwngari", "name:da"=>"Ungarn", "name:de"=>"Ungarn", "name:dv"=>"ހަންގޭރީ", "name:ee"=>"Hungary", "name:el"=>"Ουγγαρία", "name:en"=>"Hungary", "name:eo"=>"Hungario", "name:es"=>"Hungría", "name:et"=>"Ungari", "name:eu"=>"Hungaria", "name:fa"=>"مجارستان", "name:ff"=>"Hunngariya", "name:fi"=>"Unkari", "name:fo"=>"Ungarn", "name:fr"=>"Hongrie", "name:fy"=>"Hongarije", "name:ga"=>"An Ungáir", "name:gd"=>"An Ungair", "name:gl"=>"Hungría", "name:gn"=>"Hungyria", "name:gu"=>"હંગેરી", "name:gv"=>"Yn Ungaar", "name:he"=>"הונגריה", "name:hi"=>"हंगरी", "name:hr"=>"Mađarska", "name:ht"=>"Ongri", "name:hu"=>"Magyarország", "name:hy"=>"Հունգարիա", "name:ia"=>"Hungaria", "name:id"=>"Hongaria", "name:ie"=>"Hungaria", "name:io"=>"Hungaria", "name:is"=>"Ungverjaland", "name:it"=>"Ungheria", "name:ja"=>"ハンガリー", "name:jv"=>"Hongaria", "name:ka"=>"უნგრეთი", "name:kg"=>"Hongrie", "name:ki"=>"Macartsa", "name:kk"=>"Мажарстан", "name:kl"=>"Ungarni", "name:km"=>"ប្រទេសហុងគ្រី", "name:ko"=>"헝가리", "name:ku"=>"Macaristan", "name:kv"=>"Мадьяр Му", "name:kw"=>"Hungari", "name:ky"=>"Мажарстан", "name:la"=>"Hungaria", "name:lb"=>"Ungarn", "name:li"=>"Hongarieë", "name:ln"=>"Ungri", "name:lt"=>"Vengrija", "name:lv"=>"Ungārija", "name:mi"=>"Hanekari", "name:mk"=>"Унгарија", "name:ml"=>"ഹംഗറി", "name:mn"=>"Унгар", "name:mr"=>"हंगेरी", "name:ms"=>"Hungary", "name:mt"=>"Ungerija", "name:my"=>"ဟန်ဂေရီနိုင်ငံ", "name:na"=>"Ungari", "name:ne"=>"हंगेरी", "name:nl"=>"Hongarije", "name:nn"=>"Ungarn", "name:no"=>"Ungern", "name:nv"=>"Hángewii", "name:oc"=>"Ongria", "name:or"=>"ହଙ୍ଗେରୀ", "name:os"=>"Венгри", "name:pa"=>"ਹੰਗਰੀ", "name:pl"=>"Węgry", "name:ps"=>"هنګري", "name:pt"=>"Hungria", "name:qu"=>"Unriya", "name:rm"=>"Ungaria", "name:ro"=>"Ungaria", "name:ru"=>"Венгрия", "name:rw"=>"Hongiriya", "name:sa"=>"हंगरी", "name:se"=>"Ungára", "name:sh"=>"Mađarska", "name:si"=>"හන්ගේරියානු සමුහාණ්ඩුව", "name:sk"=>"Maďarsko", "name:sl"=>"Madžarska", "name:sm"=>"Hungary", "name:sn"=>"Hungary", "name:so"=>"Hungaria", "name:sq"=>"Hungaria", "name:sr"=>"Мађарска", "name:ss"=>"IHangareyi", "name:st"=>"Hungary", "name:su"=>"Hungaria", "name:sv"=>"Ungern", "name:sw"=>"Hungaria", "name:ta"=>"அங்கேரி", "name:te"=>"హంగేరి", "name:tg"=>"Маҷористон", "name:th"=>"ประเทศฮังการี", "name:tk"=>"Wengriýa", "name:tl"=>"Unggarya", "name:tr"=>"Macaristan", "name:ts"=>"Hungary", "name:tt"=>"Маҗарстан", "name:ug"=>"ۋېنگرىيە", "name:uk"=>"Угорщина", "name:ur"=>"مجارستان", "name:uz"=>"Mojariston", "name:vi"=>"Hungary", "name:vo"=>"Macarän", "name:wo"=>"Ongiri", "name:yi"=>"אונגארן", "name:yo"=>"Húngárì", "name:zh"=>"匈牙利"
-hr     "name"=>"Hrvatska", "name:ab"=>"Хорватиа", "name:af"=>"Kroasië", "name:am"=>"ክሮኤሽያ", "name:an"=>"Croacia", "name:ar"=>"كرواتيا", "name:az"=>"Xorvatiya", "name:ba"=>"Хорватия", "name:be"=>"Харватыя", "name:bg"=>"Хърватия", "name:bi"=>"Croatia", "name:bn"=>"ক্রোয়েশিয়া", "name:bo"=>"ཁུརོ་ཤི་ཡ།", "name:br"=>"Kroatia", "name:bs"=>"Hrvatska", "name:ca"=>"Cròacia", "name:ce"=>"Хорвати", "name:cs"=>"Chorvatsko", "name:cu"=>"Хръватьска", "name:cy"=>"Croatia", "name:da"=>"Kroatien", "name:de"=>"Kroatien", "name:dv"=>"ކުރޮއޭޝިއާ", "name:ee"=>"Croatia", "name:el"=>"Κροατία", "name:en"=>"Croatia", "name:eo"=>"Kroatio", "name:es"=>"Croacia", "name:et"=>"Horvaatia", "name:eu"=>"Kroazia", "name:fa"=>"کرواسی", "name:fi"=>"Kroatia", "name:fo"=>"Kroatia", "name:fr"=>"Croatie", "name:fy"=>"Kroaasje", "name:ga"=>"An Chróit", "name:gd"=>"Croàisia", "name:gl"=>"Croacia", "name:gn"=>"Kyoasia", "name:gu"=>"ક્રોએશિયા", "name:gv"=>"Yn Chroit", "name:he"=>"קרואטיה", "name:hi"=>"क्रोएशिया", "name:hr"=>"Hrvatska", "name:ht"=>"Kroasi", "name:hu"=>"Horvátország", "name:hy"=>"Խորվաթիա", "name:ia"=>"Croatia", "name:id"=>"Kroasia", "name:ie"=>"Croatia", "name:io"=>"Kroatia", "name:is"=>"Króatía", "name:it"=>"Croazia", "name:ja"=>"クロアチア", "name:jv"=>"Kroasia", "name:ka"=>"ხორვატია", "name:kg"=>"Kroatia", "name:kk"=>"Хорватия", "name:kl"=>"Kroatia", "name:kn"=>"ಕ್ರೊಯೆಶಿಯ", "name:ko"=>"크로아티아", "name:ku"=>"Kroatya", "name:kv"=>"Хорватия", "name:kw"=>"Kroati", "name:ky"=>"Хорватия", "name:la"=>"Croatia", "name:lb"=>"Kroatien", "name:li"=>"Kroatië", "name:ln"=>"Kroasia", "name:lt"=>"Kroatija", "name:lv"=>"Horvātija", "name:mi"=>"Koroātia", "name:mk"=>"Хрватска", "name:ml"=>"ക്രൊയേഷ്യ", "name:mn"=>"Хорват", "name:mr"=>"क्रोएशिया", "name:ms"=>"Croatia", "name:mt"=>"Kroazja", "name:my"=>"ခရိုအေးရှားနိုင်ငံ", "name:na"=>"Kroaitsiya", "name:ne"=>"क्रोएशिया", "name:nl"=>"Kroatië", "name:nn"=>"Kroatia", "name:no"=>"Kroatia", "name:nv"=>"Kwóóʼad Bikéyah", "name:oc"=>"Croàcia", "name:or"=>"କ୍ରୋଏସିଆ", "name:os"=>"Хорвати", "name:pa"=>"ਕ੍ਰੋਏਸ਼ੀਆ", "name:pl"=>"Chorwacja", "name:ps"=>"کروواسيا", "name:pt"=>"Croácia", "name:qu"=>"Hurwatsuyu", "name:rn"=>"Croacia", "name:ro"=>"Croația", "name:ru"=>"Хорватия", "name:rw"=>"Korowatiya", "name:sa"=>"क्रोएशिया", "name:sc"=>"Croatzia", "name:se"=>"Kroatia", "name:sg"=>"Kroasïi", "name:sh"=>"Hrvatska", "name:sk"=>"Chorvátsko", "name:sl"=>"Hrvaška", "name:sm"=>"Croatia", "name:so"=>"Kroatia", "name:sq"=>"Kroacia", "name:sr"=>"Хрватска", "name:ss"=>"IKhuroshiya", "name:st"=>"Kroatia", "name:su"=>"Kroasia", "name:sv"=>"Kroatien", "name:sw"=>"Kroatia", "name:ta"=>"குரோவாசியா", "name:te"=>"క్రొయేషియా", "name:tg"=>"Хорватия", "name:th"=>"ประเทศโครเอเชีย", "name:tk"=>"Horwatiýa", "name:tl"=>"Kroasya", "name:tr"=>"Hırvatistan", "name:tt"=>"Хорватия", "name:ug"=>"كرودىيە", "name:uk"=>"Хорватія", "name:ur"=>"کروشیا", "name:uz"=>"Xorvatiya", "name:vi"=>"Croatia", "name:vo"=>"Kroasän", "name:wa"=>"Crowaceye", "name:wo"=>"Korwaasi", "name:yi"=>"קראאטיע", "name:yo"=>"Kroatíà", "name:za"=>"Gwzlozdiya", "name:zh"=>"克羅地亞"
-id     "name"=>"Indonesia", "name:af"=>"Indonesië", "name:ak"=>"Indonesia", "name:am"=>"ኢንዶኔዥያ", "name:an"=>"Indonesia", "name:ar"=>"إندونيسيا", "name:ay"=>"Indunisya", "name:az"=>"İndoneziya", "name:ba"=>"Индонезия", "name:be"=>"Інданезія", "name:bg"=>"Индонезия", "name:bi"=>"Indonesia", "name:bn"=>"ইন্দোনেশিয়া", "name:bo"=>"ཨིན་རྡུ་ནི་ཤིས་ཡ།", "name:br"=>"Indonezia", "name:bs"=>"Indonezija", "name:ca"=>"Indonèsia", "name:ce"=>"Индонези", "name:ch"=>"Indonesia", "name:co"=>"Indunesia", "name:cs"=>"Indonésie", "name:cu"=>"Їндонисїꙗ", "name:cv"=>"Индонези", "name:cy"=>"Indonesia", "name:da"=>"Indonesien", "name:de"=>"Indonesien", "name:dv"=>"އިންޑޮނޭޝިޔާ", "name:el"=>"Ινδονησία", "name:en"=>"Indonesia", "name:eo"=>"Indonezio", "name:es"=>"Indonesia", "name:et"=>"Indoneesia", "name:eu"=>"Indonesia", "name:fa"=>"اندونزی", "name:fi"=>"Indonesia", "name:fo"=>"Indonesia", "name:fr"=>"Indonésie", "name:fy"=>"Yndoneezje", "name:ga"=>"An Indinéis", "name:gd"=>"An Innd-Innse", "name:gl"=>"Indonesia", "name:gn"=>"Indonesia", "name:gu"=>"ઈંડોનેશિયા", "name:gv"=>"Yn Indoneesh", "name:he"=>"אינדונזיה", "name:hi"=>"इंडोनेशिया", "name:hr"=>"Indonezija", "name:ht"=>"Endonezi", "name:hu"=>"Indonézia", "name:hy"=>"Ինդոնեզիա", "name:ia"=>"Indonesia", "name:id"=>"Indonesia", "name:ie"=>"Indonesia", "name:io"=>"Indonezia", "name:is"=>"Indónesía", "name:it"=>"Indonesia", "name:iu"=>"ᐄᓅᓯᐊ", "name:ja"=>"インドネシア", "name:jv"=>"Indonésia", "name:ka"=>"ინდონეზია", "name:ki"=>"Indonesia", "name:kk"=>"Индонезия", "name:kl"=>"Indonesia", "name:km"=>"ឥណ្ឌូនេស៊ី", "name:kn"=>"ಇಂಡೋನೇಷ್ಯಾ", "name:ko"=>"인도네시아", "name:ku"=>"Îndonezya", "name:kv"=>"Индонезия", "name:kw"=>"Indonesi", "name:ky"=>"Индонезия", "name:la"=>"Indonesia", "name:lb"=>"Indonesien", "name:li"=>"Indonesië", "name:ln"=>"Indonezí", "name:lt"=>"Indonezija", "name:lv"=>"Indonēzija", "name:mg"=>"Indonezia", "name:mi"=>"Initonīhia", "name:mk"=>"Индонезија", "name:ml"=>"ഇന്തോനേഷ്യ", "name:mn"=>"Индонез", "name:mr"=>"इंडोनेशिया", "name:ms"=>"Indonesia", "name:mt"=>"Indoneżja", "name:my"=>"အင်ဒိုနီးရှားနိုင်ငံ", "name:na"=>"Indonitsiya", "name:ne"=>"इण्डोनेशिया", "name:nl"=>"Indonesië", "name:nn"=>"Indonesia", "name:no"=>"Indonesia", "name:nv"=>"Indoníízha", "name:oc"=>"Indonesia", "name:om"=>"Indoneeshiyaa", "name:or"=>"ଇଣ୍ଡୋନେସିଆ", "name:os"=>"Индонези", "name:pa"=>"ਇੰਡੋਨੇਸ਼ੀਆ", "name:pl"=>"Indonezja", "name:ps"=>"اندونيزيا", "name:pt"=>"Indonésia", "name:qu"=>"Indunisya", "name:rm"=>"Indonesia", "name:ro"=>"Indonezia", "name:ru"=>"Индонезия", "name:rw"=>"Indonesiya", "name:sa"=>"इण्डोनेशिया", "name:se"=>"Indonesia", "name:sg"=>"Ênndonezïi", "name:sh"=>"Indonezija", "name:si"=>"ඉන්දුනීසියාව", "name:sk"=>"Indonézia", "name:sl"=>"Indonezija", "name:sm"=>"Indyunisia", "name:so"=>"Indunisiya", "name:sq"=>"Indonezia", "name:sr"=>"Индонезија", "name:ss"=>"INdonesiya", "name:su"=>"Indonésia", "name:sv"=>"Indonesien", "name:sw"=>"Indonesia", "name:ta"=>"இந்தோனேசியா", "name:te"=>"ఇండోనేషియా", "name:tg"=>"Индонезия", "name:th"=>"ประเทศอินโดนีเซีย", "name:tk"=>"Indoneziýa", "name:tl"=>"Indonesya", "name:tr"=>"Endonezya", "name:tt"=>"Индонезия", "name:ug"=>"ھىندونېزىيە", "name:uk"=>"Індонезія", "name:ur"=>"انڈونیشیا", "name:uz"=>"Indoneziya", "name:vi"=>"Indonesia", "name:vo"=>"Lindäna-Seänuäns", "name:wa"=>"Indonezeye", "name:wo"=>"Endoneesi", "name:yi"=>"אינדאנעזיע", "name:yo"=>"Indonésíà", "name:za"=>"Yindunizsihya", "name:zh"=>"印度尼西亚 / 印度尼西亞"
-il     "name"=>"ישראל", "name:af"=>"Israel", "name:am"=>"እስራኤል", "name:an"=>"Israel", "name:ar"=>"إسرائيل", "name:av"=>"Гlизраил", "name:az"=>"İsrail", "name:ba"=>"Израиль", "name:be"=>"Ізраіль", "name:bg"=>"Израел", "name:bm"=>"Israil", "name:bn"=>"ইসরায়েল", "name:bo"=>"ཨི་སི་ར་ཨེལ།", "name:br"=>"Israel", "name:bs"=>"Izrael", "name:ca"=>"Israel", "name:ce"=>"Израиль", "name:co"=>"Israele", "name:cs"=>"Izrael", "name:cu"=>"Їꙁдраил҄ь", "name:cv"=>"Израиль", "name:cy"=>"Israel", "name:da"=>"Israel", "name:de"=>"Israel", "name:dv"=>"އިސްރާއީލު", "name:dz"=>"ཨིཛ་རཱེལ་", "name:el"=>"Ισραήλ", "name:en"=>"Israel", "name:eo"=>"Israelo", "name:es"=>"Israel", "name:et"=>"Iisrael", "name:eu"=>"Israel", "name:fa"=>"اسرائیل", "name:fi"=>"Israel", "name:fj"=>"Isireli", "name:fo"=>"Ísrael", "name:fr"=>"Israël", "name:fy"=>"Israel", "name:ga"=>"Iosrael", "name:gd"=>"Iosrael", "name:gl"=>"Israel", "name:gn"=>"Israel", "name:gu"=>"ઈઝરાયલ", "name:gv"=>"Israel", "name:ha"=>"Isra'ila", "name:he"=>"ישראל", "name:hi"=>"इज़राइल", "name:hr"=>"Izrael", "name:ht"=>"Izrayèl", "name:hu"=>"Izrael", "name:hy"=>"Իսրայել", "name:ia"=>"Israel", "name:id"=>"Israel", "name:ie"=>"Israel", "name:ig"=>"Israel", "name:io"=>"Israel", "name:is"=>"Ísrael", "name:it"=>"Israele", "name:ja"=>"イスラエル", "name:jv"=>"Israèl", "name:ka"=>"ისრაელი", "name:kg"=>"Israel", "name:kk"=>"Израиль", "name:kl"=>"Israel", "name:kn"=>"ಇಸ್ರೇಲ್", "name:ko"=>"이스라엘", "name:ku"=>"Îsraêl", "name:kv"=>"Израиль", "name:kw"=>"Ysrael", "name:ky"=>"Израиль", "name:la"=>"Israel", "name:lb"=>"Israel", "name:li"=>"Israël", "name:ln"=>"Israel", "name:lt"=>"Izraelis", "name:lv"=>"Izraēla", "name:mi"=>"Iharaira", "name:mk"=>"Израел", "name:ml"=>"ഇസ്രയേൽ", "name:mn"=>"Израйль", "name:mr"=>"इस्रायल", "name:ms"=>"Israel", "name:mt"=>"Iżrael", "name:my"=>"အစ္စရေးနိုင်ငံ", "name:na"=>"Iteraer", "name:ne"=>"इजरायल", "name:nl"=>"Israël", "name:nn"=>"Israel", "name:no"=>"Israel", "name:nv"=>"Ízrel Bikéyah", "name:oc"=>"Israèl", "name:or"=>"ଇସ୍ରାଏଲ", "name:os"=>"Израиль", "name:pa"=>"ਇਜ਼ਰਾਇਲ", "name:pl"=>"Izrael", "name:ps"=>"اسرائيل", "name:pt"=>"Israel", "name:qu"=>"Israyil", "name:ro"=>"Israel", "name:ru"=>"Израиль", "name:rw"=>"Isirayeli", "name:sa"=>"इस्रेल", "name:sc"=>"Israele", "name:se"=>"Israel", "name:sh"=>"Izrael", "name:si"=>"ඊශ්‍රායලය", "name:sk"=>"Izrael", "name:sl"=>"Izrael", "name:sm"=>"Israel", "name:so"=>"Israaiil", "name:sq"=>"Izraeli", "name:sr"=>"Израел", "name:ss"=>"Ka-Israyeli", "name:sv"=>"Israel", "name:sw"=>"Israel", "name:ta"=>"இசுரேல்", "name:te"=>"ఇజ్రాయిల్", "name:tg"=>"Исроил", "name:th"=>"ประเทศอิสราเอล", "name:tk"=>"Ysraýyl", "name:tl"=>"Israel", "name:tr"=>"İsrail", "name:tt"=>"Исраил", "name:ug"=>"ئىسرائىلىيە", "name:uk"=>"Ізраїль", "name:ur"=>"اسرائیل", "name:uz"=>"Isroil", "name:vi"=>"Israel", "name:vo"=>"Yisraelän", "name:wa"=>"Israyel", "name:wo"=>"Israayil", "name:yi"=>"ישראל", "name:yo"=>"Ísráẹ́lì", "name:zh"=>"以色列", "name:zu"=>"Isreyili"
-lt     "name"=>"Lietuva", "name:ab"=>"Литва", "name:af"=>"Litaue", "name:ak"=>"Lituania", "name:am"=>"ሊትዌኒያ", "name:an"=>"Lituania", "name:ar"=>"ليتوانيا", "name:ay"=>"Lituaña", "name:az"=>"Litva", "name:ba"=>"Литва", "name:be"=>"Літва", "name:bg"=>"Литва", "name:bi"=>"Litwania", "name:bn"=>"লিথুয়ানিয়া", "name:bo"=>"ལི་ཐུ་ཨེ་ནི་ཡ།", "name:br"=>"Lituania", "name:bs"=>"Litvanija", "name:ca"=>"Lituània", "name:ce"=>"Литва", "name:ch"=>"Lituania", "name:co"=>"Lituania", "name:cs"=>"Litva", "name:cu"=>"Литъва", "name:cv"=>"Литва", "name:cy"=>"Lithwania", "name:da"=>"Litauen", "name:de"=>"Litauen", "name:dv"=>"ލިތުއޭނިއާ", "name:dz"=>"ལི་ཐུ་ནི་ཡ།", "name:ee"=>"Lithuania", "name:el"=>"Λιθουανία", "name:en"=>"Lithuania", "name:eo"=>"Litovio", "name:es"=>"Lituania", "name:et"=>"Leedu", "name:eu"=>"Lituania", "name:fa"=>"لیتوانی", "name:ff"=>"Lituwaniya", "name:fi"=>"Liettua", "name:fj"=>"Lituani", "name:fo"=>"Litava", "name:fr"=>"Lituanie", "name:fy"=>"Litouwen", "name:ga"=>"An Liotuáin", "name:gd"=>"Liotuàinia", "name:gl"=>"Lituania - Lietuva", "name:gn"=>"Lituaña", "name:gu"=>"લિથુઆનિયા", "name:gv"=>"Yn Litaan", "name:he"=>"ליטא", "name:hi"=>"लिथुआनिया", "name:hr"=>"Litva", "name:ht"=>"Lityani", "name:hu"=>"Litvánia", "name:hy"=>"Լիտվա", "name:ia"=>"Lituania", "name:id"=>"Lituania", "name:ie"=>"Lituania", "name:io"=>"Lituania", "name:is"=>"Litháen", "name:it"=>"Lituania", "name:iu"=>"ᓕᐋᑐᕙ", "name:ja"=>"リトアニア", "name:jv"=>"Lituania", "name:ka"=>"ლიტვა", "name:kg"=>"Lietuva", "name:ki"=>"Lithuania", "name:kk"=>"Литва", "name:kl"=>"Litaueni", "name:ko"=>"리투아니아", "name:ku"=>"Lîtvanya", "name:kv"=>"Литва", "name:kw"=>"Lithouani", "name:ky"=>"Литва", "name:la"=>"Lituania", "name:lb"=>"Litauen", "name:lg"=>"Lithueenia", "name:li"=>"Litauwe", "name:ln"=>"Litwani", "name:lt"=>"Lietuva", "name:lv"=>"Lietuva", "name:mg"=>"Litoania", "name:mi"=>"Rituānia", "name:mk"=>"Литванија", "name:ml"=>"ലിത്വാനിയ", "name:mn"=>"Литва", "name:mr"=>"लिथुएनिया", "name:ms"=>"Lithuania", "name:mt"=>"Litwanja", "name:my"=>"လစ်သူယေးနီးယားနိုင်ငံ", "name:na"=>"Rituainiya", "name:ne"=>"लिथुआनिया", "name:nl"=>"Litouwen", "name:nn"=>"Litauen", "name:no"=>"Litauen", "name:nv"=>"Łitʼoowę́ęya", "name:ny"=>"Lithuania", "name:oc"=>"Lituània", "name:or"=>"ଲିଥୁଆନିଆ", "name:os"=>"Литва", "name:pl"=>"Litwa", "name:ps"=>"لېتوانيا", "name:pt"=>"Lituânia", "name:qu"=>"Lituwa", "name:rm"=>"Lituania", "name:rn"=>"Lituania", "name:ro"=>"Lituania", "name:ru"=>"Литва", "name:rw"=>"Lituwaniya", "name:sa"=>"लेतुवा", "name:sc"=>"Lituània", "name:se"=>"Lietuva", "name:sg"=>"Lituanïi", "name:sh"=>"Litvanija", "name:sk"=>"Litva", "name:sl"=>"Litva", "name:so"=>"Lithuaniya", "name:sq"=>"Lituania", "name:sr"=>"Литванија", "name:ss"=>"Lithuwani", "name:st"=>"Lituania", "name:su"=>"Lituania", "name:sv"=>"Litauen", "name:sw"=>"Lituanya", "name:ta"=>"லித்துவேனியா", "name:te"=>"లిథువేనియా", "name:tg"=>"Литва", "name:th"=>"ประเทศลิทัวเนีย", "name:tk"=>"Litwa", "name:tl"=>"Litwaniya", "name:tr"=>"Litvanya", "name:ts"=>"Lithuania", "name:tt"=>"Литва", "name:ug"=>"لىتۋا", "name:uk"=>"Литва", "name:ur"=>"لتھووینیا", "name:uz"=>"Litva", "name:ve"=>"Lituania", "name:vi"=>"Litva", "name:vo"=>"Lietuvän", "name:wa"=>"Litwaneye", "name:wo"=>"Lituwaani", "name:yi"=>"ליטע", "name:yo"=>"Lituéníà", "name:zh"=>"立陶宛", "name:zu"=>"ILithuwaniya"
-ir     "name"=>"ایران", "name:af"=>"Iran", "name:am"=>"ፋርስ", "name:an"=>"Irán", "name:ar"=>"إیران", "name:az"=>"İran", "name:ba"=>"Иран", "name:be"=>"Іран", "name:bg"=>"Иран", "name:bn"=>"ইরান", "name:bo"=>"ཡི་ལང་།", "name:br"=>"Iran", "name:bs"=>"Iran", "name:ca"=>"Iran", "name:ce"=>"Иран", "name:co"=>"Iranu", "name:cs"=>"Írán", "name:cy"=>"Iran", "name:da"=>"Iran", "name:de"=>"Iran", "name:dv"=>"އީރާން", "name:dz"=>"ཨི་རཱན་", "name:el"=>"Ιράν", "name:en"=>"Iran", "name:eo"=>"Irano", "name:es"=>"Irán", "name:et"=>"Iraan", "name:eu"=>"Iran", "name:fa"=>"ایران", "name:fi"=>"Iran", "name:fo"=>"Iran", "name:fr"=>"Iran", "name:fy"=>"Iran", "name:ga"=>"An Iaráin", "name:gd"=>"Ioràn", "name:gl"=>"Irán - ایران", "name:gn"=>"Irán", "name:gu"=>"ઈરાન", "name:gv"=>"Yn Eeraan", "name:ha"=>"Iran", "name:he"=>"איראן", "name:hi"=>"ईरान", "name:hr"=>"Iran", "name:ht"=>"Iran", "name:hu"=>"Irán", "name:hy"=>"Իրան", "name:ia"=>"Iran", "name:id"=>"Iran", "name:ie"=>"Iran", "name:io"=>"Iran", "name:is"=>"Íran", "name:it"=>"Iran", "name:ja"=>"イラン", "name:jv"=>"Iran", "name:ka"=>"ირანი", "name:kk"=>"Иран", "name:kl"=>"Iran", "name:km"=>"អ៊ីរ៉ង់", "name:kn"=>"ಇರಾನ್", "name:ko"=>"이란", "name:ks"=>"ایٖران", "name:ku"=>"Îran", "name:kv"=>"Иран", "name:kw"=>"Iran", "name:ky"=>"Иран", "name:la"=>"Irania", "name:lb"=>"Iran", "name:li"=>"Iran", "name:ln"=>"Iran", "name:lt"=>"Iranas", "name:lv"=>"Irāna", "name:mg"=>"Iran", "name:mi"=>"Irāna", "name:mk"=>"Иран", "name:ml"=>"ഇറാൻ", "name:mn"=>"Иран", "name:mr"=>"इराण", "name:ms"=>"Iran", "name:mt"=>"Iran", "name:my"=>"အီရန်နိုင်ငံ", "name:na"=>"Iran", "name:ne"=>"इरान", "name:nl"=>"Iran", "name:nn"=>"Iran", "name:no"=>"Iran", "name:nv"=>"Iiwą́ą́", "name:oc"=>"Iran", "name:or"=>"ଇରାନ", "name:os"=>"Иран", "name:pa"=>"ਇਰਾਨ", "name:pl"=>"Iran", "name:ps"=>"ایران", "name:pt"=>"Irão", "name:qu"=>"Iran", "name:rm"=>"Iran", "name:ro"=>"Iran", "name:ru"=>"Иран", "name:rw"=>"Irani", "name:sa"=>"ईरान", "name:sc"=>"Iran", "name:se"=>"Iran", "name:sh"=>"Iran", "name:si"=>"ඉරානය", "name:sk"=>"Irán", "name:sl"=>"Iran", "name:so"=>"Iiraan", "name:sq"=>"Irani", "name:sr"=>"Иран", "name:ss"=>"I-Irani", "name:su"=>"Iran", "name:sv"=>"Iran", "name:sw"=>"Uajemi", "name:ta"=>"ஈரான்", "name:te"=>"ఇరాన్", "name:tg"=>"Эрон", "name:th"=>"ประเทศอิหร่าน", "name:tk"=>"Eýran", "name:tl"=>"Iran", "name:tr"=>"İran", "name:tt"=>"Иран", "name:tw"=>"Iran", "name:ug"=>"ئىران", "name:uk"=>"Іран", "name:ur"=>"ایران", "name:uz"=>"Eron", "name:vi"=>"Iran", "name:vo"=>"Lirän", "name:wa"=>"Iran", "name:wo"=>"Iraan", "name:yi"=>"איראן", "name:yo"=>"Ìránì", "name:za"=>"Iran", "name:zh"=>"伊朗", "name:zu"=>"I-Irani"
-is     "name"=>"Ísland", "name:af"=>"Ysland", "name:am"=>"አይስላንድ", "name:an"=>"Islandia", "name:ar"=>"آيسلندا", "name:az"=>"İslandiya", "name:ba"=>"Исландия", "name:be"=>"Ісландыя", "name:bg"=>"Исландия", "name:bi"=>"Iceland", "name:bm"=>"Aisland", "name:bn"=>"আইসল্যান্ড", "name:bo"=>"ཨཡིསུ་ལེན་ཌ།", "name:br"=>"Island", "name:bs"=>"Island", "name:ca"=>"Islàndia", "name:ce"=>"Исланди", "name:co"=>"Islanda", "name:cs"=>"Island", "name:cu"=>"Исландъ", "name:cv"=>"Исланди", "name:cy"=>"Gwlad yr Iâ", "name:da"=>"Island", "name:de"=>"Island", "name:dv"=>"އައިސްލަންޑަން", "name:dz"=>"ཨའིསི་ལེནཌ་", "name:ee"=>"Iceland", "name:el"=>"Ισλανδία", "name:en"=>"Iceland", "name:eo"=>"Islando", "name:es"=>"Islandia", "name:et"=>"Island", "name:eu"=>"Islandia", "name:fa"=>"ایسلند", "name:ff"=>"Islannda", "name:fi"=>"Islanti", "name:fo"=>"Ísland", "name:fr"=>"Islande", "name:fy"=>"Yslân", "name:ga"=>"An Íoslainn", "name:gd"=>"Innis Tìle", "name:gl"=>"Islandia", "name:gn"=>"Iylanda", "name:gu"=>"આઈસલેંડ", "name:gv"=>"Yn Eeslynn", "name:he"=>"איסלנד", "name:hi"=>"आइसलैण्ड", "name:hr"=>"Island", "name:ht"=>"Islann", "name:hu"=>"Izland", "name:hy"=>"Իսլանդիա", "name:ia"=>"Islanda", "name:id"=>"Islandia", "name:ie"=>"Island", "name:io"=>"Islando", "name:is"=>"Ísland", "name:it"=>"Islanda", "name:ja"=>"アイスランド", "name:jv"=>"Islandia", "name:ka"=>"ისლანდია", "name:kg"=>"Islande", "name:kk"=>"Исландия", "name:kl"=>"Islandi", "name:km"=>"ប្រទេសអាយឡែន", "name:kn"=>"ಐಸ್‍ಲ್ಯಾಂಡ್", "name:ko"=>"아이슬란드", "name:ku"=>"Îslenda", "name:kv"=>"Исландия", "name:kw"=>"Island", "name:ky"=>"Исландия", "name:la"=>"Islandia", "name:lb"=>"Island", "name:lg"=>"Isilandi", "name:li"=>"Iesland", "name:ln"=>"Islandi", "name:lo"=>"ອິດສະລັງ", "name:lt"=>"Islandija", "name:lv"=>"Islande", "name:mi"=>"Tiorangi", "name:mk"=>"Исланд", "name:ml"=>"ഐസ്‌ലാന്റ്", "name:mn"=>"Исланд", "name:mr"=>"आइसलँड", "name:ms"=>"Iceland", "name:mt"=>"Iżlanda", "name:my"=>"အိုက်စလန်နိုင်ငံ", "name:na"=>"Aiterand", "name:nb"=>"Island", "name:ne"=>"आइसल्याण्ड", "name:nl"=>"IJsland", "name:nn"=>"Island", "name:no"=>"Island", "name:nv"=>"Tin Bikéyah", "name:oc"=>"Islàndia", "name:or"=>"ଆଇସଲ୍ୟାଣ୍ଡ", "name:os"=>"Исланди", "name:pa"=>"ਆਈਸਲੈਂਡ", "name:pl"=>"Islandia", "name:ps"=>"آيسلېنډ", "name:pt"=>"Islândia", "name:qu"=>"Islandya", "name:rm"=>"Islanda", "name:ro"=>"Islanda", "name:ru"=>"Исландия", "name:rw"=>"Isilande", "name:sa"=>"आइसलैंड", "name:sc"=>"Islanda", "name:se"=>"Islánda", "name:sg"=>"Islânde", "name:sh"=>"Island", "name:si"=>"අයිස්ලන්තය", "name:sk"=>"Island", "name:sl"=>"Islandija", "name:sm"=>"Aiselani", "name:so"=>"Island", "name:sq"=>"Islanda", "name:sr"=>"Исланд", "name:ss"=>"Echweni", "name:st"=>"Iceland", "name:su"=>"Islandia", "name:sv"=>"Island", "name:sw"=>"Iceland", "name:ta"=>"ஐசுலாந்து", "name:te"=>"ఐస్‌లాండ్", "name:tg"=>"Исландия", "name:th"=>"ประเทศไอซ์แลนด์", "name:tk"=>"Islandiýa", "name:tl"=>"Lupangyelo", "name:tr"=>"İzlanda", "name:tt"=>"Исландия", "name:ug"=>"ئىسلاندىيە", "name:uk"=>"Ісландія", "name:ur"=>"آئس لینڈ", "name:uz"=>"Islandiya", "name:vi"=>"Iceland", "name:vo"=>"Lisladeän", "name:wa"=>"Izlande", "name:wo"=>"Islaand", "name:yi"=>"איסלאנד", "name:yo"=>"Íslándì", "name:zh"=>"冰岛", "name:zu"=>"I-Ayisilandi"
-mm     "name"=>"မြန်မာ", "name:af"=>"Mianmar", "name:am"=>"ምየንማ", "name:an"=>"Myanmar", "name:ar"=>"بورما", "name:az"=>"Myanma", "name:ba"=>"Мьянма", "name:be"=>"М'янма", "name:bg"=>"Мианмар", "name:bi"=>"Burma", "name:bn"=>"মায়ানমার", "name:bo"=>"བྷར་མ།", "name:br"=>"Myanmar", "name:bs"=>"Mijanmar", "name:ca"=>"Myanmar", "name:ce"=>"Мьянма", "name:cs"=>"Myanmar", "name:cv"=>"Мьянма", "name:cy"=>"Myanmar", "name:da"=>"Myanmar", "name:de"=>"Myanmar", "name:dv"=>"ބަރުމާ", "name:dz"=>"མེ་མར་", "name:el"=>"Μιανμάρ", "name:en"=>"Myanmar", "name:eo"=>"Birmo / Mjanmao", "name:es"=>"Myanmar", "name:et"=>"Birma", "name:eu"=>"Myanmar", "name:fa"=>"میانمار", "name:fi"=>"Myanmar", "name:fo"=>"Burma", "name:fr"=>"Birmanie", "name:fy"=>"Birma", "name:ga"=>"Maenmar", "name:gd"=>"Mianmar", "name:gl"=>"Myanmar", "name:gu"=>"બર્મા", "name:gv"=>"Myanmar", "name:he"=>"מיאנמר", "name:hi"=>"म्यान्मार", "name:hr"=>"Mijanmar", "name:ht"=>"Bimani", "name:hu"=>"Mianmar", "name:hy"=>"Մյանմա", "name:ia"=>"Birmania", "name:id"=>"Myanmar", "name:ie"=>"Myanmar", "name:io"=>"Myanmar", "name:is"=>"Búrma", "name:it"=>"Birmania", "name:ja"=>"ミャンマー", "name:jv"=>"Myanmar", "name:ka"=>"მიანმარი", "name:ki"=>"Myanmar", "name:kk"=>"Мианма", "name:km"=>"មីយ៉ាន់ម៉ា", "name:kn"=>"ಮಯನ್ಮಾರ್", "name:ko"=>"미얀마", "name:ku"=>"Myanmar", "name:kv"=>"Мьянма", "name:kw"=>"Byrmani", "name:ky"=>"Мьянма", "name:la"=>"Birmania", "name:lb"=>"Myanmar", "name:li"=>"Myanmar", "name:lo"=>"ປະເທດມຽນມາ", "name:lt"=>"Mianmaras", "name:lv"=>"Mjanma", "name:mg"=>"Myanmara", "name:mi"=>"Pēma", "name:mk"=>"Мјанмар", "name:ml"=>"മ്യാന്മാർ", "name:mn"=>"Мьянмар", "name:mr"=>"म्यानमार", "name:ms"=>"Myanmar", "name:mt"=>"Myanmar", "name:my"=>"မြန်မာ", "name:na"=>"Miyanmar", "name:ne"=>"म्यानमार", "name:nl"=>"Myanmar", "name:nn"=>"Myanmar", "name:no"=>"Myanmar", "name:oc"=>"Birmania", "name:or"=>"ବର୍ମା", "name:os"=>"Мьянмæ", "name:pa"=>"ਮਿਆਂਮਾਰ", "name:pl"=>"Mjanma", "name:ps"=>"ميانمار", "name:pt"=>"Birmânia", "name:qu"=>"Myanmar", "name:ro"=>"Birmania", "name:ru"=>"Мьянма", "name:rw"=>"Mayanimari", "name:sa"=>"म्यान्मार", "name:sc"=>"Birmania", "name:se"=>"Myanmar", "name:sh"=>"Mianmar", "name:si"=>"බුරුමය", "name:sk"=>"Mjanmarsko", "name:sl"=>"Mjanmar", "name:so"=>"Myanmar", "name:sq"=>"Birmania", "name:sr"=>"Мјанмар", "name:ss"=>"IMayanima", "name:su"=>"Myanmar", "name:sv"=>"Myanmar", "name:sw"=>"Myanmar", "name:ta"=>"மியான்மர்", "name:te"=>"మయన్మార్", "name:tg"=>"Мянма", "name:th"=>"ประเทศพม่า", "name:tk"=>"Mýanma", "name:tl"=>"Myanmar", "name:tr"=>"Myanmar", "name:tt"=>"Мьянма", "name:ug"=>"بىرما", "name:uk"=>"М'янма", "name:ur"=>"میانمار", "name:uz"=>"Birma", "name:vi"=>"Myanma", "name:vo"=>"Mianmarän", "name:wo"=>"Miyanmaar", "name:yi"=>"מיאנמאר", "name:yo"=>"Myanmar", "name:za"=>"Mienjdien", "name:zh"=>"缅甸"
-mr     "name"=>"موريتانيا", "name:af"=>"Mauritanië", "name:am"=>"ሞሪታኒያ", "name:an"=>"Mauritania", "name:ar"=>"موريتانيا", "name:az"=>"Mavritaniya", "name:be"=>"Маўрытанія", "name:bg"=>"Мавритания", "name:bm"=>"Moritani", "name:bn"=>"মৌরিতানিয়া", "name:bo"=>"མའུ་རི་ཏ་ནི་ཡ།", "name:br"=>"Maouritania", "name:bs"=>"Mauritanija", "name:ca"=>"Mauritània", "name:ce"=>"Мавритани", "name:cs"=>"Mauritánie", "name:cv"=>"Мавритани", "name:cy"=>"Mauritania", "name:da"=>"Mauretanien", "name:de"=>"Mauretanien", "name:dv"=>"މޮރިޓާނިއާ", "name:ee"=>"Mauritania", "name:el"=>"Μαυριτανία", "name:en"=>"Mauritania", "name:eo"=>"Maŭritanio", "name:es"=>"Mauritania", "name:et"=>"Mauritaania", "name:eu"=>"Mauritania", "name:fa"=>"موریتانی", "name:ff"=>"Muritani", "name:fi"=>"Mauritania", "name:fo"=>"Móritania", "name:fr"=>"Mauritanie", "name:fy"=>"Mauritaanje", "name:ga"=>"An Mháratáin", "name:gd"=>"Moratainia", "name:gl"=>"Mauritania", "name:gv"=>"Yn Varitaan", "name:ha"=>"Muritaniya", "name:he"=>"מאוריטניה", "name:hi"=>"मॉरीतानिया", "name:hr"=>"Mauretanija", "name:ht"=>"Moritani", "name:hu"=>"Mauritánia", "name:hy"=>"Մավրիտանիա", "name:ia"=>"Mauritania", "name:id"=>"Mauritania", "name:ie"=>"Mauritania", "name:io"=>"Mauritania", "name:is"=>"Máritanía", "name:it"=>"Mauritania", "name:ja"=>"モーリタニア", "name:jv"=>"Mauritania", "name:ka"=>"მავრიტანია", "name:kg"=>"Muritania", "name:kk"=>"Мавритания", "name:kn"=>"ಮಾರಿಟಾನಿಯ", "name:ko"=>"모리타니", "name:ku"=>"Morîtanya", "name:kw"=>"Moritani", "name:la"=>"Mauritania", "name:lb"=>"Mauretanien", "name:li"=>"Mauritanië", "name:ln"=>"Moritani", "name:lt"=>"Mauritanija", "name:lv"=>"Mauritānija", "name:mg"=>"Maoritania", "name:mi"=>"Mauritānia", "name:mk"=>"Мавританија", "name:ml"=>"മൗറിത്താനിയ", "name:mn"=>"Мавритан", "name:mr"=>"मॉरिटानिया", "name:ms"=>"Mauritania", "name:mt"=>"Mawritanja", "name:my"=>"မော်ရီတေးနီးယားနိုင်ငံ", "name:nl"=>"Mauritanië", "name:nn"=>"Mauritania", "name:no"=>"Mauritania", "name:nv"=>"Moowitéínya", "name:oc"=>"Mauritània", "name:or"=>"ମୋରିତାନିଆ", "name:os"=>"Мавритани", "name:pa"=>"ਮੌਰੀਤਾਨੀਆ", "name:pl"=>"Mauretania", "name:ps"=>"موریتاني", "name:pt"=>"Mauritânia", "name:qu"=>"Muritanya", "name:ro"=>"Mauritania", "name:ru"=>"Мавритания", "name:rw"=>"Moritaniya", "name:sa"=>"मारिटेनिया", "name:sc"=>"Mauritània", "name:se"=>"Mauritánia", "name:sg"=>"Moritanïi", "name:sk"=>"Mauritánia", "name:sl"=>"Mavretanija", "name:sn"=>"Mauritania", "name:so"=>"Mauritania", "name:sq"=>"Mauritania", "name:sr"=>"Мауританија", "name:ss"=>"IMolithaniya", "name:st"=>"Mauritania", "name:su"=>"Mauritania", "name:sv"=>"Mauretanien", "name:sw"=>"Mauritania", "name:ta"=>"மூரித்தானியா", "name:te"=>"మౌరిటానియ", "name:tg"=>"Мавритания", "name:th"=>"ประเทศมอริเตเนีย", "name:ti"=>"ሞሪታኒያ", "name:tk"=>"Mawritaniýa", "name:tl"=>"Mauritania", "name:tr"=>"Moritanya", "name:ts"=>"Maritana", "name:tt"=>"Мавритания", "name:ug"=>"ماۋرىتانىيە", "name:uk"=>"Мавританія", "name:ur"=>"موریتانیہ", "name:uz"=>"Mavritaniya", "name:vi"=>"Mauritanie", "name:vo"=>"Moritän", "name:wa"=>"Moritanreye", "name:wo"=>"Gànnaar", "name:xh"=>"Mauritania", "name:yi"=>"מאריטאניע", "name:yo"=>"Mauritáníà", "name:zh"=>"毛里塔尼亚", "name:zu"=>"IMoritaniya"
-lv     "name"=>"Latvija", "name:ab"=>"Латвиа", "name:af"=>"Letland", "name:ak"=>"Latvia", "name:am"=>"ላትቪያ", "name:an"=>"Letonia", "name:ar"=>"لاتفيا", "name:av"=>"Латвия", "name:az"=>"Latviya", "name:ba"=>"Латвия", "name:be"=>"Латвія", "name:bg"=>"Латвия", "name:bh"=>"लैटविया", "name:bi"=>"Latvia", "name:bn"=>"লাতভিয়া", "name:bo"=>"ལ་ཊ་ཝིཡ།", "name:br"=>"Latvia", "name:bs"=>"Latvija", "name:ca"=>"Letònia", "name:ce"=>"Латви", "name:ch"=>"Letonia", "name:co"=>"Lettonia", "name:cs"=>"Lotyšsko", "name:cu"=>"Латвїꙗ", "name:cv"=>"Латви", "name:cy"=>"Latfia", "name:da"=>"Letland", "name:de"=>"Lettland", "name:dv"=>"ލެޓުވިއާ", "name:dz"=>"ལེཊི་བི་ཡ།", "name:ee"=>"Latvia", "name:el"=>"Λετονία", "name:en"=>"Latvia", "name:eo"=>"Latvio", "name:es"=>"Letonia", "name:et"=>"Läti", "name:eu"=>"Letonia", "name:fa"=>"لتونی", "name:ff"=>"Latvia", "name:fi"=>"Latvia", "name:fo"=>"Lettland", "name:fr"=>"Lettonie", "name:fy"=>"Letlân", "name:ga"=>"An Laitvia", "name:gd"=>"An Laitbhe", "name:gl"=>"Letonia", "name:gn"=>"Letoña", "name:gu"=>"લાટવિયા", "name:gv"=>"Yn Latvey", "name:ha"=>"Laitfiya", "name:he"=>"לטביה", "name:hi"=>"लातविया", "name:hr"=>"Latvija", "name:ht"=>"Letoni", "name:hu"=>"Lettország", "name:hy"=>"Լատվիա", "name:ia"=>"Latvia", "name:id"=>"Latvia", "name:ie"=>"Latvia", "name:ig"=>"Latvia", "name:io"=>"Latvia", "name:is"=>"Lettland", "name:it"=>"Lettonia", "name:ja"=>"ラトビア", "name:jv"=>"Latvia", "name:ka"=>"ლატვია", "name:kg"=>"Latvia", "name:kk"=>"Латвия", "name:kl"=>"Letlandi", "name:kn"=>"ಲಾಟ್ವಿಯ", "name:ko"=>"라트비아", "name:ku"=>"Letonya", "name:kv"=>"Латвия", "name:kw"=>"Latvi", "name:ky"=>"Латвия", "name:la"=>"Lettonia", "name:lb"=>"Lettland", "name:lg"=>"Latvia", "name:li"=>"Letland", "name:ln"=>"Letoni", "name:lo"=>"ປະເທດລັດເວຍ", "name:lt"=>"Latvija", "name:lv"=>"Latvija", "name:mg"=>"Latvia", "name:mi"=>"Rāwhia", "name:mk"=>"Летонија", "name:ml"=>"ലാത്‌വിയ", "name:mn"=>"Латви", "name:mr"=>"लात्व्हिया", "name:ms"=>"Latvia", "name:mt"=>"Latvja", "name:my"=>"လတ်ဗီယာနိုင်ငံ", "name:na"=>"Ratebiya", "name:ne"=>"लात्भिया", "name:nl"=>"Letland", "name:nn"=>"Latvia", "name:no"=>"Latvia", "name:nv"=>"Létbiiya", "name:oc"=>"Letònia", "name:om"=>"Laativiyaa", "name:or"=>"ଲାଟଭିଆ", "name:os"=>"Латви", "name:pa"=>"ਲਾਤਵੀਆ", "name:pi"=>"लाट्विया", "name:pl"=>"Łotwa", "name:pt"=>"Letónia", "name:qu"=>"Litunya", "name:rm"=>"Lettonia", "name:ro"=>"Letonia", "name:ru"=>"Латвия", "name:rw"=>"Lativiya", "name:sa"=>"लाट्विया", "name:sc"=>"Lettonia", "name:se"=>"Latvia", "name:sh"=>"Letonija", "name:si"=>"ලැට්වියාව", "name:sk"=>"Lotyšsko", "name:sl"=>"Latvija", "name:sm"=>"Lativia", "name:sn"=>"Latvia", "name:so"=>"Latfiya", "name:sq"=>"Letonia", "name:sr"=>"Летонија", "name:ss"=>"ILathiviya", "name:st"=>"Latvia", "name:su"=>"Latvia", "name:sv"=>"Lettland", "name:sw"=>"Latvia", "name:ta"=>"லாத்வியா", "name:te"=>"లాట్వియా", "name:tg"=>"Латвия", "name:th"=>"ประเทศลัตเวีย", "name:tk"=>"Latwiýa", "name:tl"=>"Latbiya", "name:tr"=>"Letonya", "name:ts"=>"Latvia", "name:tt"=>"Латвия", "name:tw"=>"Latvia", "name:ug"=>"لاتۋىيە", "name:uk"=>"Латвія", "name:ur"=>"لٹویا", "name:uz"=>"Latviya", "name:vi"=>"Latvia", "name:vo"=>"Latviyän", "name:wa"=>"Letoneye", "name:wo"=>"Letóoni", "name:yi"=>"לעטלאנד", "name:yo"=>"Látfíà", "name:za"=>"Latvia", "name:zh"=>"拉脫維亞", "name:zu"=>"ILatviya"
-mx     "name"=>"México", "name:af"=>"Meksiko", "name:am"=>"ሜክሲኮ", "name:an"=>"Mexico", "name:ar"=>"المكسيك", "name:ay"=>"Mïxiku", "name:az"=>"Meksika", "name:ba"=>"Мексика", "name:be"=>"Мексіка", "name:bg"=>"Мексико", "name:bi"=>"Mexico", "name:bm"=>"Mɛkisiki", "name:bn"=>"মেক্সিকো", "name:bo"=>"མེག་སི་ཀོ།", "name:br"=>"Mec'hiko", "name:bs"=>"Meksiko", "name:ca"=>"Mèxic", "name:ce"=>"Мексика", "name:co"=>"Messicu", "name:cs"=>"Mexiko", "name:cv"=>"Мексика", "name:cy"=>"Mexico", "name:da"=>"Mexico", "name:de"=>"Mexiko", "name:dv"=>"މެކްސިކޯ", "name:dz"=>"མེཀ་སི་ཀོ", "name:ee"=>"Mexico", "name:el"=>"Μεξικό", "name:en"=>"Mexico", "name:eo"=>"Meksiko", "name:es"=>"México", "name:et"=>"Mehhiko", "name:eu"=>"Mexiko", "name:fa"=>"مکزیک", "name:fi"=>"Meksiko", "name:fo"=>"Meksiko", "name:fr"=>"Mexique", "name:fy"=>"Meksiko", "name:ga"=>"Meicsiceo", "name:gd"=>"Meagsago", "name:gl"=>"México", "name:gn"=>"Méjiko", "name:gu"=>"મેક્સિકો", "name:gv"=>"Meksico", "name:he"=>"מקסיקו", "name:hi"=>"मेक्सिको", "name:hr"=>"Meksiko", "name:ht"=>"Meksik", "name:hu"=>"Mexikó", "name:hy"=>"Մեքսիկա", "name:ia"=>"Mexico", "name:id"=>"Meksiko", "name:ik"=>"Mexiqo", "name:io"=>"Mexikia", "name:is"=>"Mexíkó", "name:it"=>"Messico", "name:iu"=>"ᒦᒃᓰᖂ", "name:ja"=>"メキシコ", "name:jv"=>"Mèksiko", "name:ka"=>"მექსიკა", "name:kk"=>"Мексика", "name:kl"=>"Mexico", "name:km"=>"ម៉ិកស៊ិក", "name:kn"=>"ಮೆಕ್ಸಿಕೋ", "name:ko"=>"멕시코", "name:ku"=>"Meksîk", "name:kv"=>"Мексика", "name:kw"=>"Meksiko", "name:ky"=>"Мексика", "name:la"=>"Mexicum", "name:lb"=>"Mexiko", "name:li"=>"Mexico", "name:ln"=>"Mexiko", "name:lt"=>"Meksika", "name:lv"=>"Meksika", "name:mg"=>"Meksika", "name:mi"=>"Mēhiko", "name:mk"=>"Мексико", "name:ml"=>"മെക്സിക്കോ", "name:mn"=>"Мексик", "name:mr"=>"मेक्सिको", "name:ms"=>"Mexico", "name:mt"=>"Messiku", "name:my"=>"မက္ကဆီကိုနိုင်ငံ", "name:na"=>"Meketiko", "name:ne"=>"मेक्सिको", "name:nl"=>"Mexico", "name:nn"=>"Mexico", "name:no"=>"Mexico", "name:nv"=>"Méhigo", "name:oc"=>"Mexic", "name:or"=>"ମେକ୍ସିକୋ", "name:os"=>"Мексикæ", "name:pa"=>"ਮੈਕਸੀਕੋ", "name:pl"=>"Meksyk", "name:pt"=>"México", "name:qu"=>"Mishiku", "name:rm"=>"Mexico", "name:ro"=>"Mexic", "name:ru"=>"Мексика", "name:rw"=>"Megizike", "name:sc"=>"Mèssico", "name:se"=>"Meksiko", "name:sh"=>"Meksiko", "name:sk"=>"Mexiko", "name:sl"=>"Mehika", "name:sm"=>"Mexico", "name:sn"=>"Mexico", "name:so"=>"Meksiko", "name:sq"=>"Meksika", "name:sr"=>"Мексико", "name:ss"=>"IMekisikho", "name:su"=>"Méksiko", "name:sv"=>"Mexico", "name:sw"=>"Mexiko", "name:ta"=>"மெக்சிக்கோ", "name:te"=>"మెక్సికో", "name:tg"=>"Мексика", "name:th"=>"ประเทศเม็กซิโก", "name:tk"=>"Meksika", "name:tl"=>"Mehiko", "name:tr"=>"Meksika", "name:tt"=>"Мексика", "name:tw"=>"Mexico", "name:ug"=>"مېكسىكا", "name:uk"=>"Мексика", "name:ur"=>"میکسیکو", "name:uz"=>"Meksika", "name:vi"=>"México", "name:vo"=>"Mäxikän", "name:wo"=>"Meksik", "name:yi"=>"מעקסיקא", "name:yo"=>"Mẹ́ksíkò", "name:zh"=>"墨西哥", "name:zu"=>"IMekisiko"
-sr     "name"=>"Suriname", "name:af"=>"Suriname", "name:am"=>"ሱሪናም", "name:an"=>"Surinam", "name:ar"=>"سورينام", "name:ay"=>"Suriname", "name:az"=>"Surinam", "name:ba"=>"Суринам", "name:be"=>"Сурынам", "name:bg"=>"Суринам", "name:bn"=>"সুরিনাম", "name:bo"=>"སུ་རི་ནེམ།", "name:br"=>"Surinam", "name:bs"=>"Surinam", "name:ca"=>"Surinam", "name:ce"=>"Суринам", "name:cs"=>"Surinam", "name:cv"=>"Суринам", "name:cy"=>"Suriname", "name:da"=>"Surinam", "name:de"=>"Suriname", "name:dv"=>"ސުރިނާމް", "name:ee"=>"Suriname", "name:el"=>"Σουρινάμ", "name:en"=>"Suriname", "name:eo"=>"Surinamo", "name:es"=>"Surinam", "name:et"=>"Suriname", "name:eu"=>"Surinam", "name:fa"=>"سورینام", "name:fi"=>"Suriname", "name:fo"=>"Surinam", "name:fr"=>"Suriname", "name:fy"=>"Suriname", "name:ga"=>"Suranam", "name:gd"=>"Suranam", "name:gl"=>"Suriname", "name:gn"=>"Surinam", "name:gu"=>"સુરીનામ", "name:gv"=>"Yn Toorinam", "name:he"=>"סורינאם", "name:hi"=>"सूरीनाम", "name:hr"=>"Surinam", "name:ht"=>"Sirinam", "name:hu"=>"Suriname", "name:hy"=>"Սուրինամ", "name:id"=>"Suriname", "name:ie"=>"Surinam", "name:io"=>"Surinam", "name:is"=>"Súrínam", "name:it"=>"Suriname", "name:ja"=>"スリナム", "name:jv"=>"Suriname", "name:ka"=>"სურინამი", "name:kk"=>"Суринам", "name:kl"=>"Suriname", "name:kn"=>"ಸುರಿನಾಮ್", "name:ko"=>"수리남", "name:ku"=>"Sûrînam", "name:kw"=>"Surinam", "name:la"=>"Surinamia", "name:lb"=>"Surinam", "name:li"=>"Suriname", "name:ln"=>"Suriname", "name:lt"=>"Surinamas", "name:lv"=>"Surinama", "name:mi"=>"Hurināme", "name:mk"=>"Суринам", "name:ml"=>"സുരിനാം", "name:mn"=>"Суринам", "name:mr"=>"सुरिनाम", "name:ms"=>"Suriname", "name:mt"=>"Surinam", "name:my"=>"ဆူရာနမ်နိုင်ငံ", "name:nl"=>"Suriname", "name:nn"=>"Surinam", "name:no"=>"Surinam", "name:nv"=>"Sówinam", "name:oc"=>"Surinam", "name:or"=>"ସରିନମ", "name:os"=>"Суринам", "name:pa"=>"ਸੂਰੀਨਾਮ", "name:pl"=>"Surinam", "name:ps"=>"سورينام", "name:pt"=>"Suriname", "name:qu"=>"Surinam", "name:rm"=>"Suriname", "name:ro"=>"Surinam", "name:ru"=>"Суринам", "name:rw"=>"Surinamu", "name:se"=>"Suriname", "name:sh"=>"Surinam", "name:sk"=>"Surinam", "name:sl"=>"Surinam", "name:so"=>"Surinam", "name:sq"=>"Surinami", "name:sr"=>"Суринам", "name:su"=>"Suriname", "name:sv"=>"Surinam", "name:sw"=>"Surinam", "name:ta"=>"சுரிநாம்", "name:te"=>"సురినామ్", "name:th"=>"ประเทศซูรินาเม", "name:tl"=>"Surinam", "name:tr"=>"Surinam", "name:tt"=>"Суринам", "name:ug"=>"سۇرىنام", "name:uk"=>"Суринам", "name:ur"=>"سرینام", "name:uz"=>"Surinam", "name:vi"=>"Suriname", "name:vo"=>"Surinän", "name:wo"=>"Surinaam", "name:yi"=>"סורינאם", "name:yo"=>"Sùrìnámù", "name:zh"=>"蘇利南"
-pe     "name"=>"Perú", "name:ab"=>"Перу", "name:af"=>"Peru", "name:ak"=>"Peru", "name:am"=>"ፔሩ", "name:an"=>"Perú", "name:ar"=>"بيرو", "name:ay"=>"Piruw", "name:az"=>"Peru", "name:ba"=>"Перу", "name:be"=>"Перу", "name:bg"=>"Перу", "name:bi"=>"Peru", "name:bm"=>"Peru", "name:bn"=>"পেরু", "name:bo"=>"པེ་རུ།", "name:br"=>"Perou", "name:bs"=>"Peru", "name:ca"=>"Perú", "name:ce"=>"Перу", "name:ch"=>"Perú", "name:co"=>"Perù", "name:cs"=>"Peru", "name:cv"=>"Перу", "name:cy"=>"Periw", "name:da"=>"Peru", "name:de"=>"Peru", "name:dv"=>"ޕެރޫ", "name:ee"=>"Peru", "name:el"=>"Περού", "name:en"=>"Peru", "name:eo"=>"Peruo", "name:es"=>"Perú", "name:et"=>"Peruu", "name:eu"=>"Peru", "name:fa"=>"پرو", "name:ff"=>"Peru", "name:fi"=>"Peru", "name:fo"=>"Peru", "name:fr"=>"Pérou", "name:fy"=>"Perû", "name:ga"=>"Peiriú", "name:gd"=>"Pearù", "name:gl"=>"Perú", "name:gn"=>"Perũ", "name:gu"=>"પેરુ", "name:gv"=>"Yn Pheroo", "name:he"=>"פרו", "name:hi"=>"पेरू", "name:hr"=>"Peru", "name:ht"=>"Pewou", "name:hu"=>"Peru", "name:hy"=>"Պերու", "name:ia"=>"Peru", "name:id"=>"Peru", "name:ie"=>"Perú", "name:io"=>"Peru", "name:is"=>"Perú", "name:it"=>"Perù", "name:iu"=>"ᐱᕉ", "name:ja"=>"ペルー", "name:jv"=>"Peru", "name:ka"=>"პერუ", "name:ki"=>"Peru", "name:kk"=>"Перу", "name:kl"=>"Peru", "name:kn"=>"ಪೆರು", "name:ko"=>"페루", "name:ku"=>"Perû", "name:kv"=>"Перу", "name:kw"=>"Perou", "name:ky"=>"Перу", "name:la"=>"Peruvia", "name:lb"=>"Peru", "name:li"=>"Peru", "name:ln"=>"Peru", "name:lt"=>"Peru", "name:lv"=>"Peru", "name:mi"=>"Perū", "name:mk"=>"Перу", "name:ml"=>"പെറു", "name:mn"=>"Перу", "name:mr"=>"पेरू", "name:ms"=>"Peru", "name:mt"=>"Perù", "name:my"=>"ပီရူးနိုင်ငံ", "name:na"=>"Peru", "name:ne"=>"पेरू", "name:nl"=>"Peru", "name:nn"=>"Peru", "name:no"=>"Peru", "name:oc"=>"Peró", "name:or"=>"ପେରୁ", "name:os"=>"Перу", "name:pa"=>"ਪੇਰੂ", "name:pl"=>"Peru", "name:ps"=>"پيرو", "name:pt"=>"Peru", "name:qu"=>"Piruw", "name:rm"=>"Peru", "name:ro"=>"Peru", "name:ru"=>"Перу", "name:rw"=>"Peru", "name:sa"=>"पेरु", "name:se"=>"Peru", "name:sh"=>"Peru", "name:si"=>"පේරූ", "name:sk"=>"Peru", "name:sl"=>"Peru", "name:sn"=>"Peru", "name:so"=>"Peru", "name:sq"=>"Peruja", "name:sr"=>"Перу", "name:ss"=>"IPheru", "name:su"=>"Péru", "name:sv"=>"Peru", "name:sw"=>"Peru", "name:ta"=>"பெரு", "name:te"=>"పెరూ", "name:tg"=>"Перу", "name:th"=>"ประเทศเปรู", "name:tk"=>"Peru", "name:tl"=>"Peru", "name:tr"=>"Peru", "name:tt"=>"Перу", "name:ug"=>"پېرۇ", "name:uk"=>"Перу", "name:ur"=>"پیرو", "name:uz"=>"Peru", "name:vi"=>"Peru", "name:vo"=>"Peruvän", "name:wo"=>"Peru", "name:yi"=>"פערו", "name:yo"=>"Perú", "name:zh"=>"秘鲁", "name:zu"=>"Peru"
-sa     "name"=>"السعودية", "name:af"=>"Saoedi-Arabië", "name:am"=>"ሳዑዲ አረቢያ", "name:an"=>"Arabia Saudí", "name:ar"=>"السعودية", "name:av"=>"СагIудиязул ГIарабия", "name:az"=>"Səudiyyə Ərəbistanı", "name:ba"=>"Сәғүд Ғәрәбстаны", "name:be"=>"Саудаўская Аравія", "name:bg"=>"Саудитска Арабия", "name:bm"=>"Saudia Arabu ka Faamamara", "name:bn"=>"সৌদি আরব", "name:bo"=>"སའུ་དི་ཨ་ར་པི་ཡ།", "name:br"=>"Arabia Saoudat", "name:bs"=>"Saudijska Arabija", "name:ca"=>"Aràbia Saudita", "name:ce"=>"СаӀудийн Ӏаьрбийчоь", "name:cs"=>"Saúdská Arábie", "name:cv"=>"Сауд Аравийĕ", "name:cy"=>"Saudi Arabia", "name:da"=>"Saudi-Arabien", "name:de"=>"Saudi-Arabien", "name:dv"=>"ސައޫދީ އަރަބިއްޔާ", "name:dz"=>"སའུ་དི་ཨེ་ར་སྦི་ཡ་", "name:el"=>"Σαουδική Αραβία", "name:en"=>"Saudi Arabia", "name:eo"=>"Sauda Arabio", "name:es"=>"Arabia Saudita", "name:et"=>"Saudi Araabia", "name:eu"=>"Saudi Arabia", "name:fa"=>"عربستان سعودی", "name:fi"=>"Saudi-Arabia", "name:fo"=>"Saudi-Arabia", "name:fr"=>"Arabie saoudite", "name:fy"=>"Saûdy-Araabje", "name:ga"=>"An Araib Shádach", "name:gd"=>"Aràibia nan Sabhd", "name:gl"=>"Arabia Saudí", "name:gn"=>"Aravia Saudíta", "name:gu"=>"સાઉદી અરેબિયા", "name:gv"=>"Yn Araab Saudi", "name:he"=>"ערב הסעודית", "name:hi"=>"सउदी अरब", "name:hr"=>"Saudijska Arabija", "name:ht"=>"Arabi Sawoudit", "name:hu"=>"Szaúd-Arábia", "name:hy"=>"Սաուդյան Արաբիա", "name:ia"=>"Arabia Saudita", "name:id"=>"Arab Saudi", "name:ie"=>"Saudi Arabia", "name:io"=>"Saudia Arabia", "name:is"=>"Sádí-Arabía", "name:it"=>"Arabia Saudita", "name:ja"=>"サウジアラビア", "name:jv"=>"Arab Saudi", "name:ka"=>"საუდის არაბეთი", "name:kk"=>"Сауд Арабиясы", "name:kl"=>"Saudi Arabia", "name:km"=>"អារ៉ាប៊ីសាអូឌីត", "name:kn"=>"ಸೌದಿ ಅರೆಬಿಯ", "name:ko"=>"사우디아라비아", "name:ku"=>"Erebistana Siyûdî", "name:kv"=>"Саудса Аравия", "name:kw"=>"Arabi Saoudek", "name:ky"=>"Сауд Арабия Падышалыгы", "name:la"=>"Arabia Saudiana", "name:lb"=>"Saudi-Arabien", "name:li"=>"Saoedi-Arabië", "name:ln"=>"Saudi Arabia", "name:lt"=>"Saudo Arabija", "name:lv"=>"Saūda Arābija", "name:mk"=>"Саудиска Арабија", "name:ml"=>"സൗദി അറേബ്യ", "name:mn"=>"Саудын Араб", "name:mr"=>"सौदी अरेबिया", "name:ms"=>"Arab Saudi", "name:mt"=>"Arabja Sawdija", "name:my"=>"ဆော်ဒီအာရေဗျနိုင်ငံ", "name:na"=>"Taudiarabiya", "name:ne"=>"साउदी अरब", "name:nl"=>"Saoedi-Arabië", "name:nn"=>"Saudi-Arabia", "name:no"=>"Saudi-Arabia", "name:nv"=>"Ásáí Bikéyah Saʼoodí", "name:oc"=>"Arabia Saudita", "name:or"=>"ସାଉଦି ଆରବ", "name:os"=>"Сауды Арави", "name:pa"=>"ਸਉਦੀ ਅਰਬ", "name:pl"=>"Arabia Saudyjska", "name:ps"=>"سعودي عربستان", "name:pt"=>"Arábia Saudita", "name:qu"=>"Sawud Arabya", "name:rm"=>"Arabia Saudita", "name:ro"=>"Arabia Saudită", "name:ru"=>"Саудовская Аравия", "name:rw"=>"Arabiya Sawudite", "name:sa"=>"सऊदी अरब", "name:se"=>"Saudi-Arábia", "name:sh"=>"Saudijska Arabija", "name:si"=>"සවුදි අරාබියාව", "name:sk"=>"Saudská Arábia", "name:sl"=>"Saudova Arabija", "name:so"=>"Sacuudi Carabiya", "name:sq"=>"Arabia Saudite", "name:sr"=>"Саудијска Арабија", "name:ss"=>"I-Arabhiya", "name:su"=>"Saudi Arabia", "name:sv"=>"Saudiarabien", "name:sw"=>"Saudia", "name:ta"=>"சவூதி அரேபியா", "name:te"=>"సౌదీ అరేబియా", "name:tg"=>"Арабистони Саудӣ", "name:th"=>"ประเทศซาอุดีอาระเบีย", "name:tk"=>"Saud Arabystany", "name:tl"=>"Arabyang Saudi", "name:tr"=>"Suudi Arabistan", "name:tt"=>"Согуд Гарәбстаны", "name:ug"=>"سەئۇدى ئەرەبىستان", "name:uk"=>"Саудівська Аравія", "name:ur"=>"سعودی عرب", "name:uz"=>"Saudiya Arabistoni", "name:vi"=>"Ả Rập Saudi", "name:vo"=>"Sauda-Larabän", "name:wo"=>"Araabi Sawdit", "name:yi"=>"סאודי אראביע", "name:yo"=>"Sáúdí Arábíà", "name:zh"=>"沙特阿拉伯"
-pl     "name"=>"Polska", "name:ab"=>"Полша", "name:af"=>"Pole", "name:ak"=>"Poland", "name:am"=>"ፖላንድ", "name:an"=>"Polonia", "name:ar"=>"بولندا", "name:ay"=>"Puluña", "name:az"=>"Polşa", "name:ba"=>"Польша", "name:be"=>"Польшча", "name:bg"=>"Полша", "name:bi"=>"Poland", "name:bn"=>"পোল্যান্ড", "name:bo"=>"ཕོ་ལན།", "name:br"=>"Polonia", "name:bs"=>"Poljska", "name:ca"=>"Polònia", "name:ce"=>"Польша", "name:co"=>"Polonia", "name:cs"=>"Polsko", "name:cu"=>"Пол҄ьска", "name:cv"=>"Польша", "name:cy"=>"Gwlad Pwyl", "name:da"=>"Polen", "name:de"=>"Polen", "name:dv"=>"ޕޮލެންޑު", "name:ee"=>"Poland", "name:el"=>"Πολωνία", "name:en"=>"Poland", "name:eo"=>"Pollando", "name:es"=>"Polonia", "name:et"=>"Poola", "name:eu"=>"Polonia", "name:fa"=>"لهستان", "name:ff"=>"Poloonya", "name:fi"=>"Puola", "name:fo"=>"Pólland", "name:fr"=>"Pologne", "name:fy"=>"Poalen", "name:ga"=>"An Pholainn", "name:gd"=>"A' Phòlainn", "name:gl"=>"Polonia", "name:gn"=>"Poloña", "name:gu"=>"પોલેંડ", "name:gv"=>"Yn Pholynn", "name:ha"=>"Poland", "name:he"=>"פולין", "name:hi"=>"पोलैंड", "name:hr"=>"Poljska", "name:ht"=>"Polòy", "name:hu"=>"Lengyelország", "name:hy"=>"Լեհաստան", "name:ia"=>"Polonia", "name:id"=>"Polandia", "name:ie"=>"Polonia", "name:ig"=>"Poland", "name:io"=>"Polonia", "name:is"=>"Pólland", "name:it"=>"Polonia", "name:iu"=>"ᐳᓚᓐᑦ", "name:ja"=>"ポーランド", "name:jv"=>"Polandia", "name:ka"=>"პოლონეთი", "name:kg"=>"Pologne", "name:kk"=>"Польша", "name:kl"=>"Poleni", "name:km"=>"ប្រទេសប៉ូឡូញ", "name:kn"=>"ಪೋಲೆಂಡ್", "name:ko"=>"폴란드", "name:ku"=>"Polonya", "name:kv"=>"Польша", "name:kw"=>"Poloni", "name:ky"=>"Польша", "name:la"=>"Polonia", "name:lb"=>"Polen", "name:lg"=>"Bupoolo", "name:li"=>"Pole", "name:ln"=>"Poloni", "name:lt"=>"Lenkija", "name:lv"=>"Polija", "name:mg"=>"Polonia", "name:mi"=>"Pōrana", "name:mk"=>"Полска", "name:ml"=>"പോളണ്ട്", "name:mn"=>"Польш", "name:mr"=>"पोलंड", "name:ms"=>"Poland", "name:mt"=>"Polonja", "name:my"=>"ပိုလန်နိုင်ငံ", "name:na"=>"Poran", "name:ne"=>"पोल्याण्ड", "name:nl"=>"Polen", "name:nn"=>"Polen", "name:no"=>"Polen", "name:nv"=>"Póolish Dineʼé Bikéyah", "name:oc"=>"Polonha", "name:or"=>"ପୋଲାଣ୍ଡ", "name:os"=>"Польшæ", "name:pa"=>"ਪੋਲੈਂਡ", "name:pl"=>"Polska", "name:ps"=>"پولنډ", "name:pt"=>"Polónia", "name:qu"=>"Pulunya", "name:rm"=>"Pologna", "name:rn"=>"Polonia", "name:ro"=>"Polonia", "name:ru"=>"Польша", "name:rw"=>"Polonye", "name:sa"=>"पोलैंड", "name:sc"=>"Polonia", "name:se"=>"Polska", "name:sg"=>"Pölôni", "name:sh"=>"Poljska", "name:si"=>"පෝලන්තය", "name:sk"=>"Poľsko", "name:sl"=>"Poljska", "name:sm"=>"Polagi", "name:so"=>"Boland", "name:sq"=>"Polonia", "name:sr"=>"Пољска", "name:ss"=>"IPholandi", "name:st"=>"Poland", "name:su"=>"Polandia", "name:sv"=>"Polen", "name:sw"=>"Poland", "name:ta"=>"போலந்து", "name:te"=>"పోలాండ్", "name:tg"=>"Лаҳистон", "name:th"=>"ประเทศโปแลนด์", "name:tk"=>"Polşa", "name:tl"=>"Polonya", "name:tr"=>"Polonya", "name:tt"=>"Польша", "name:ug"=>"پولشا", "name:uk"=>"Польща", "name:ur"=>"پولینڈ", "name:uz"=>"Polsha", "name:vi"=>"Ba Lan", "name:vo"=>"Polän", "name:wa"=>"Pologne", "name:wo"=>"Poloñ", "name:yi"=>"פוילן", "name:yo"=>"Polandi", "name:zh"=>"波兰", "name:zu"=>"IPolandi"
-ss     "name"=>"South Sudan", "name:af"=>"Suid-Soedan", "name:am"=>"ደቡብ ሱዳን", "name:an"=>"Sudán d'o Sud", "name:ar"=>"جنوب السودان", "name:av"=>"Югалъулаб Судан", "name:az"=>"Cənubi Sudan", "name:be"=>"Паўднёвы Судан", "name:bg"=>"Южен Судан", "name:bn"=>"দক্ষিণ সুদান", "name:br"=>"Soudan ar Su", "name:bs"=>"Južni Sudan", "name:ca"=>"Sudan del Sud", "name:cs"=>"Jižní Súdán", "name:cv"=>"Кăнтăр Судан", "name:cy"=>"De Sudan", "name:da"=>"Sydsudan", "name:de"=>"Südsudan", "name:el"=>"Νότιο Σουδάν", "name:en"=>"South Sudan", "name:eo"=>"Suda Sudano", "name:es"=>"Sudán del Sur", "name:et"=>"Lõuna-Sudaan", "name:eu"=>"Hego Sudan", "name:fa"=>"سودان جنوبی", "name:fi"=>"Etelä-Sudan", "name:fo"=>"Suðursudan", "name:fr"=>"Sud-Soudan", "name:fy"=>"Súd-Sûdan", "name:ga"=>"An tSúdáin Theas", "name:gd"=>"Sudàn a Deas", "name:gl"=>"Sudán do Sur", "name:gv"=>"Yn Toodaan Yiass", "name:he"=>"דרום סודאן", "name:hi"=>"दक्षिण सूडान", "name:hr"=>"Južni Sudan", "name:hu"=>"Dél-Szudán", "name:hy"=>"Հարավային Սուդան", "name:ia"=>"Sudan del Sud", "name:id"=>"Sudan Selatan", "name:ie"=>"Sud-Sudan", "name:io"=>"Sud-Sudan", "name:is"=>"Suður-Súdan", "name:it"=>"Sudan del Sud", "name:ja"=>"南部スーダン", "name:jv"=>"Sudan Kidul", "name:ka"=>"სამხრეთი სუდანი", "name:kk"=>"Оңтүстік Судан", "name:ko"=>"남수단", "name:ku"=>"Sûdana Başûr", "name:kv"=>"Лунвыв Судан", "name:kw"=>"Soudan Soth", "name:ky"=>"Түштүк Судан", "name:la"=>"Sudania Australis", "name:lb"=>"Südsudan", "name:li"=>"Zuid-Soedan", "name:lt"=>"Pietų Sudanas", "name:lv"=>"Dienvidsudāna", "name:mk"=>"Јужен Судан", "name:ml"=>"ദക്ഷിണ സുഡാൻ", "name:mr"=>"दक्षिण सुदान", "name:ms"=>"Sudan Selatan", "name:my"=>"တောင်ဆူဒန်နိုင်ငံ", "name:na"=>"South Sudan", "name:nl"=>"Zuid-Soedan", "name:nn"=>"Sør-Sudan", "name:no"=>"Sør-Sudan", "name:nv"=>"Shádiʼááhjí Soodą́ą", "name:oc"=>"Sodan del Sud", "name:or"=>"ଦକ୍ଷିନ ସୁଦାନ", "name:pa"=>"ਦੱਖਣੀ ਸੁਡਾਨ", "name:pl"=>"Sudan Południowy", "name:ps"=>"سوېلي سوډان", "name:pt"=>"Sudão do Sul", "name:qu"=>"Urin Sudan", "name:rm"=>"Sudan dal Sid", "name:ro"=>"Sudanul de Sud", "name:ru"=>"Южный Судан", "name:sc"=>"Sudan Meridionali", "name:se"=>"Lulli-Sudan", "name:sg"=>"Sudäan-Mbongo", "name:sh"=>"Južni Sudan", "name:sk"=>"Južný Sudán", "name:sl"=>"Južni Sudan", "name:sn"=>"South Sudan", "name:so"=>"Koonfur Suudaan", "name:sq"=>"Sudani i Jugut", "name:sr"=>"Јужни Судан", "name:su"=>"Sudan Kidul", "name:sv"=>"Sydsudan", "name:sw"=>"Sudan Kusini", "name:ta"=>"தெற்கு சூடான்", "name:te"=>"దక్షిణ సూడాన్", "name:th"=>"ประเทศเซาท์ซูดาน", "name:tk"=>"Günorta Sudan", "name:tl"=>"Timog Sudan", "name:tr"=>"Güney Sudan", "name:tt"=>"Көньяк Судан", "name:uk"=>"Південний Судан", "name:ur"=>"جنوبی سوڈان", "name:uz"=>"Janubiy Sudan", "name:vi"=>"Nam Sudan", "name:vo"=>"Sulüda-Sudän", "name:yi"=>"דרום סודאן", "name:yo"=>"Gúúsù Sudan", "name:zh"=>"南蘇丹", "name:zu"=>"ISudan yaseNingizimu"
-gr     "name"=>"Ελλάς", "name:ab"=>"Барзентәыла", "name:af"=>"Griekeland", "name:am"=>"ግሪክ", "name:an"=>"Grecia", "name:ar"=>"اليونان", "name:ay"=>"Grisya", "name:az"=>"Yunanıstan", "name:ba"=>"Греция", "name:be"=>"Грэцыя", "name:bg"=>"Гърция", "name:bi"=>"Greece", "name:bn"=>"গ্রিস", "name:bo"=>"ཀེ་རི་སི།", "name:br"=>"Gres", "name:bs"=>"Grčka", "name:ca"=>"Grècia", "name:ce"=>"Греци", "name:co"=>"Grecia", "name:cs"=>"Řecko", "name:cu"=>"Грьци", "name:cv"=>"Греци", "name:cy"=>"Gwlad Groeg", "name:da"=>"Grækenland", "name:de"=>"Griechenland", "name:dv"=>"ޔޫނާން", "name:dz"=>"གྲྀས", "name:ee"=>"Greece", "name:el"=>"Ελλάς", "name:en"=>"Greece", "name:eo"=>"Grekio", "name:es"=>"Grecia", "name:et"=>"Kreeka", "name:eu"=>"Grezia", "name:fa"=>"یونان", "name:fi"=>"Kreikka", "name:fo"=>"Grikkaland", "name:fr"=>"Grèce", "name:fy"=>"Grikelân", "name:ga"=>"An Ghréig", "name:gd"=>"A' Ghrèig", "name:gl"=>"Grecia", "name:gn"=>"Gyresia", "name:gu"=>"ગ્રીસ", "name:gv"=>"Yn Ghreag", "name:he"=>"יוון", "name:hi"=>"यूनान", "name:hr"=>"Grčka", "name:ht"=>"Grès", "name:hu"=>"Görögország", "name:hy"=>"Հունաստան", "name:ia"=>"Grecia", "name:id"=>"Yunani", "name:ie"=>"Grecia", "name:io"=>"Grekia", "name:is"=>"Grikkland", "name:it"=>"Grecia", "name:ja"=>"ギリシャ", "name:jv"=>"Yunani", "name:ka"=>"საბერძნეთი", "name:kg"=>"Gelesi", "name:ki"=>"Ngiriki", "name:kk"=>"Грекия", "name:kl"=>"Grækerit Nunaat", "name:kn"=>"ಗ್ರೀಸ್", "name:ko"=>"그리스", "name:ku"=>"Yewnanistan", "name:kv"=>"Эллада", "name:kw"=>"Pow Grek", "name:ky"=>"Греция", "name:la"=>"Graecia", "name:lb"=>"Griicheland", "name:lg"=>"Buyonaani", "name:li"=>"Griekeland", "name:ln"=>"Gresi", "name:lt"=>"Graikija", "name:lv"=>"Grieķija", "name:mg"=>"Grisy", "name:mi"=>"Kirihi", "name:mk"=>"Грција", "name:ml"=>"ഗ്രീസ്", "name:mn"=>"Грек", "name:mr"=>"ग्रीस", "name:ms"=>"Greece", "name:mt"=>"Greċja", "name:my"=>"ဂရိနိုင်ငံ", "name:na"=>"Grit", "name:ne"=>"ग्रीस", "name:nl"=>"Griekenland", "name:nn"=>"Hellas", "name:no"=>"Hellas", "name:nv"=>"Gwíík Dineʼé Bikéyah", "name:oc"=>"Grècia", "name:or"=>"ଗ୍ରୀସ", "name:os"=>"Грекъ", "name:pa"=>"ਯੂਨਾਨ", "name:pl"=>"Grecja", "name:ps"=>"يونان", "name:pt"=>"Grécia", "name:qu"=>"Grisya", "name:rm"=>"Grezia", "name:rn"=>"Grecia", "name:ro"=>"Grecia", "name:ru"=>"Греция", "name:rw"=>"Ubugereki", "name:sa"=>"यवनदेशः", "name:sc"=>"Grèghia", "name:se"=>"Greika", "name:sh"=>"Grčka", "name:si"=>"ග්‍රීසිය", "name:sk"=>"Grécko", "name:sl"=>"Grčija", "name:sm"=>"Kuliti", "name:so"=>"Giriig", "name:sq"=>"Greqia", "name:sr"=>"Грчка", "name:ss"=>"IGrikhi", "name:su"=>"Yunani", "name:sv"=>"Grekland", "name:sw"=>"Ugiriki", "name:ta"=>"கிரேக்க நாடு", "name:te"=>"గ్రీస్", "name:tg"=>"Юнон", "name:th"=>"ประเทศกรีซ", "name:tk"=>"Gresiýa", "name:tl"=>"Gresya", "name:tr"=>"Yunanistan", "name:tt"=>"Греция", "name:ug"=>"Grétsiye", "name:uk"=>"Греція", "name:ur"=>"یونان", "name:uz"=>"Yunoniston", "name:vi"=>"Hy Lạp", "name:vo"=>"Grikän", "name:wo"=>"Girees", "name:yi"=>"גריכנלאנד", "name:yo"=>"Gríìsì", "name:zh"=>"希腊", "name:zu"=>"IGreki"
-ma     "name"=>"Maroc ⵍⵎⵖⵔⵉⴱ المغرب", "name:af"=>"Marokko", "name:am"=>"ሞሮኮ", "name:an"=>"Marruecos", "name:ar"=>"المغرب", "name:az"=>"Mərakeş", "name:ba"=>"Марокко", "name:be"=>"Марока", "name:bg"=>"Мароко", "name:bm"=>"Maroko", "name:bn"=>"মরোক্কো", "name:bo"=>"མོ་རོ་ཁོ།", "name:br"=>"Maroko", "name:bs"=>"Maroko", "name:ca"=>"Marroc", "name:ce"=>"Марокко", "name:cs"=>"Maroko", "name:cv"=>"Марокко", "name:cy"=>"Moroco", "name:da"=>"Marokko", "name:de"=>"Marokko", "name:dv"=>"މައުރިބު", "name:el"=>"Μαρόκο", "name:en"=>"Morocco", "name:eo"=>"Maroko", "name:es"=>"Marruecos", "name:et"=>"Maroko", "name:eu"=>"Maroko", "name:fa"=>"مراکش", "name:fi"=>"Marokko", "name:fo"=>"Marokko", "name:fr"=>"Maroc", "name:fy"=>"Marokko", "name:ga"=>"Maracó", "name:gd"=>"Maroco", "name:gl"=>"Marrocos", "name:gv"=>"Yn Varoc", "name:he"=>"מרוקו", "name:hi"=>"मोरक्को", "name:hr"=>"Maroko", "name:ht"=>"Mawòk", "name:hu"=>"Marokkó", "name:hy"=>"Մարոկկո", "name:ia"=>"Marocco", "name:id"=>"Maroko", "name:ie"=>"Morocco", "name:io"=>"Maroko", "name:is"=>"Marokkó", "name:it"=>"Marocco", "name:ja"=>"モロッコ", "name:jv"=>"Maroko", "name:ka"=>"მაროკო", "name:kg"=>"Maroko", "name:kk"=>"Мағрибия", "name:kn"=>"ಮೊರಾಕೊ", "name:ko"=>"모로코", "name:ks"=>"मोराको", "name:ku"=>"Maroko", "name:kw"=>"Marokk", "name:ky"=>"Марокко", "name:la"=>"Marocum", "name:lb"=>"Marokko", "name:li"=>"Marokko", "name:ln"=>"Marɔkɛ", "name:lt"=>"Marokas", "name:lv"=>"Maroka", "name:mg"=>"Marôka", "name:mi"=>"Marako", "name:mk"=>"Мароко", "name:ml"=>"മൊറോക്കൊ", "name:mn"=>"Марокко", "name:mr"=>"मोरोक्को", "name:ms"=>"Maghribi", "name:mt"=>"Marokk", "name:my"=>"မော်ရိုကိုနိုင်ငံ", "name:nl"=>"Marokko", "name:nn"=>"Marokko", "name:no"=>"Marokko", "name:nv"=>"Moroko", "name:oc"=>"Marròc", "name:or"=>"ମୋରୋକୋ", "name:os"=>"Марокко", "name:pa"=>"ਮੋਰਾਕੋ", "name:pl"=>"Maroko", "name:ps"=>"مراکش", "name:pt"=>"Marrocos", "name:qu"=>"Maruku", "name:ro"=>"Maroc", "name:ru"=>"Марокко", "name:rw"=>"Maroke", "name:sa"=>"मोराको", "name:sc"=>"Marocco", "name:se"=>"Marokko", "name:sg"=>"Marôko", "name:sh"=>"Maroko", "name:sk"=>"Maroko", "name:sl"=>"Maroko", "name:sn"=>"Morocco", "name:so"=>"Marooko", "name:sq"=>"Maroku", "name:sr"=>"Мароко", "name:ss"=>"IMorokho", "name:su"=>"Maroko", "name:sv"=>"Marocko", "name:sw"=>"Moroko", "name:ta"=>"மொரோக்கோ", "name:te"=>"మొరాకో", "name:tg"=>"Марокаш", "name:th"=>"ประเทศโมร็อกโก", "name:ti"=>"ሞሮኮ", "name:tk"=>"Marokko", "name:tl"=>"Maruekos", "name:tr"=>"Fas", "name:ts"=>"Morocco", "name:tt"=>"Марокко", "name:ug"=>"ماراكەش", "name:uk"=>"Марокко", "name:ur"=>"مراکش", "name:uz"=>"Marokash", "name:vi"=>"Maroc", "name:vo"=>"Marokän", "name:wa"=>"Marok", "name:wo"=>"Marok", "name:yi"=>"מאראקא", "name:yo"=>"Mòrókò", "name:zh"=>"摩洛哥", "name:zu"=>"IMorokho"
-tw     "name"=>"臺灣", "name:af"=>"Taiwan", "name:ak"=>"Taiwan", "name:am"=>"ታይዋን", "name:an"=>"Taiwán", "name:ar"=>"تايوان", "name:as"=>"টাইৱান", "name:az"=>"Tayvan", "name:be"=>"Тайв́ань", "name:bg"=>"Тайван", "name:bh"=>"ताइवान", "name:bm"=>"Tayiwani", "name:bn"=>"তাইওয়ান", "name:bo"=>"ཐེ་ཝན", "name:br"=>"Taiwan", "name:bs"=>"Tajvan", "name:ca"=>"Taiwan", "name:ce"=>"Тайвань", "name:cs"=>"Tchaj-wan", "name:cv"=>"Тайва́нь", "name:cy"=>"Taiwan", "name:da"=>"Taiwan", "name:de"=>"Taiwan", "name:dv"=>"ޖުމްހޫރީ ޗައިނާ", "name:dz"=>"ཏའི་ཝཱན་", "name:ee"=>"Taiwan", "name:el"=>"Ταϊβάν", "name:en"=>"Taiwan", "name:eo"=>"Tajvano", "name:es"=>"Taiwán", "name:et"=>"Taiwan", "name:eu"=>"Taiwan", "name:fa"=>"تایوان", "name:ff"=>"Taywaan", "name:fi"=>"Taiwan", "name:fo"=>"Teivan", "name:fr"=>"Taïwan", "name:fy"=>"Taiwan", "name:ga"=>"an Téaváin", "name:gd"=>"Taidh-Bhàn", "name:gl"=>"Taiwán", "name:gu"=>"તાઇવાન", "name:gv"=>"yn Taiwaan", "name:he"=>"טאיוואן", "name:hi"=>"ताइवान", "name:hr"=>"Tajvan", "name:ht"=>"Taywann", "name:hu"=>"Tajvan", "name:hy"=>"Թայվան", "name:ia"=>"Taiwan", "name:id"=>"Taiwan", "name:ie"=>"Taiwan", "name:io"=>"Taiwan", "name:is"=>"Taívan", "name:it"=>"Taiwan", "name:ja"=>"台湾", "name:jv"=>"Taiwan", "name:ka"=>"ტაივანი", "name:ki"=>"Taiwani", "name:kk"=>"Тайвань", "name:kl"=>"Taiwan", "name:km"=>"តៃវ៉ាន់", "name:kn"=>"ಟೈವಾನ್", "name:ko"=>"타이완", "name:ku"=>"Taywan", "name:kw"=>"Taywan", "name:ky"=>"Тайвань", "name:la"=>"Taivania", "name:lb"=>"Taiwan", "name:lg"=>"Tayiwani", "name:li"=>"Taiwan", "name:ln"=>"Taiwan", "name:lo"=>"ໄຕ້ຫວັນ", "name:lt"=>"Taivanas", "name:lv"=>"Taivāna", "name:mg"=>"Taiwan", "name:mi"=>"Taiwana", "name:mk"=>"Тајван", "name:ml"=>"തായ്വാൻ", "name:mn"=>"Тайвань", "name:mr"=>"तैवान", "name:ms"=>"Taiwan", "name:mt"=>"Tajwan", "name:my"=>"ထိုင်ဝမ်", "name:ne"=>"ताइवान", "name:nl"=>"Taiwan", "name:nn"=>"Taiwan", "name:no"=>"Taiwan", "name:oc"=>"Taiwan", "name:or"=>"ତାଇୱାନ", "name:os"=>"Тайван", "name:pa"=>"ਤਾਈਵਾਨ", "name:pi"=>"तैवान", "name:pl"=>"Tajwan", "name:ps"=>"تایوان", "name:pt"=>"Taiwan", "name:qu"=>"Taiwán", "name:rm"=>"Taiwan", "name:rn"=>"Tayiwani", "name:ro"=>"Taiwan", "name:ru"=>"Тайвань", "name:rw"=>"Tayiwani", "name:sa"=>"तैवान", "name:se"=>"Taiwan", "name:sg"=>"Tâiwâni", "name:sh"=>"Tajvan", "name:si"=>"තායිවානය", "name:sk"=>"Taiwan", "name:sl"=>"Tajvan", "name:sn"=>"Taiwan", "name:so"=>"Taywan", "name:sq"=>"Tajvani", "name:sr"=>"Тајван", "name:ss"=>"iThayiwani", "name:su"=>"Tiongkok", "name:sv"=>"Taiwan", "name:sw"=>"Taiwan", "name:te"=>"తైవాన్", "name:tg"=>"Тайва́н", "name:th"=>"ไต้หวัน", "name:tk"=>"Taýwan", "name:tl"=>"Taiwan", "name:to"=>"Taiuani", "name:tr"=>"Tayvan", "name:tt"=>"Тайва́нь", "name:ug"=>"تەيۋەن", "name:uk"=>"Тайва́нь", "name:ur"=>"تائیوان", "name:uz"=>"Tayvan", "name:vi"=>"Đài Loan", "name:vo"=>"Tayvän", "name:wo"=>"Taaywaan", "name:yi"=>"טייוואַן", "name:yo"=>"Taiwan", "name:za"=>"Daizvanh", "name:zh"=>"臺灣", "name:zu"=>"i-Taiwan"
-ph     "name"=>"Philippines", "name:af"=>"Filippyne", "name:am"=>"ፊሊፒንስ", "name:an"=>"Filipinas", "name:ar"=>"الفلبين", "name:az"=>"Filippin", "name:be"=>"Філіпіны", "name:bg"=>"Филипини", "name:bn"=>"ফিলিপাইন", "name:bo"=>"ཧྥི་ལི་པིན།", "name:br"=>"Filipinez", "name:bs"=>"Filipini", "name:ca"=>"Filipines", "name:ce"=>"Филиппин", "name:cs"=>"Filipíny", "name:cv"=>"Филиппин", "name:cy"=>"Pilipinas", "name:da"=>"Filippinerne", "name:de"=>"Philippinen", "name:dv"=>"ފިލިޕީންސް", "name:el"=>"Φιλιππίνες", "name:en"=>"Philippines", "name:eo"=>"Filipinoj", "name:es"=>"Filipinas", "name:et"=>"Filipiinid", "name:eu"=>"Filipinak", "name:fa"=>"فیلیپین", "name:fi"=>"Filippiinit", "name:fo"=>"Filipsoyggjar", "name:fr"=>"Philippines", "name:fy"=>"Filipinen", "name:ga"=>"Na hOileáin Fhilipíneacha", "name:gd"=>"Na h-Eileanan Filipineach", "name:gl"=>"Filipinas", "name:gn"=>"Filipina", "name:gu"=>"ફીલીપાઈન્સ", "name:gv"=>"Ny h-Ellanyn Philippeenagh", "name:he"=>"הפיליפינים", "name:hi"=>"फ़िलीपीन्स", "name:hr"=>"Filipini", "name:ht"=>"Filipin", "name:hu"=>"Fülöp-szigetek", "name:hy"=>"Ֆիլիպիններ", "name:ia"=>"Philippinas", "name:id"=>"Filipina", "name:ie"=>"Filipines", "name:io"=>"Filipini", "name:is"=>"Filippseyjar", "name:it"=>"Filippine", "name:ja"=>"フィリピン", "name:jv"=>"Filipina", "name:ka"=>"ფილიპინები", "name:kk"=>"Филиппиндер", "name:kl"=>"Philippines", "name:km"=>"ហ្វីលីពីន", "name:kn"=>"ಫಿಲಿಪ್ಪೀನ್ಸ್", "name:ko"=>"필리핀", "name:ku"=>"Filîpîn", "name:kv"=>"Филиппинъяс", "name:kw"=>"Filipinys", "name:la"=>"Philippinae", "name:lb"=>"Philippinen", "name:li"=>"Filipiene", "name:lt"=>"Filipinai", "name:lv"=>"Filipīnas", "name:mg"=>"Filipina", "name:mi"=>"Piripīni", "name:mk"=>"Филипини", "name:ml"=>"ഫിലിപ്പീൻസ്", "name:mn"=>"Филиппин", "name:mr"=>"फिलिपाईन्स", "name:ms"=>"Filipina", "name:my"=>"ဖိလစ်ပိုင်နိုင်ငံ", "name:na"=>"Eben Piripin", "name:ne"=>"फिलिपिन्स", "name:nl"=>"Filipijnen", "name:nn"=>"Filippinane", "name:no"=>"Filippinene", "name:nv"=>"Kéyah Dańlíinii", "name:oc"=>"Filipinas", "name:or"=>"ଫିଲିପାଇନ୍ସ", "name:os"=>"Филиппинтæ", "name:pa"=>"ਫ਼ਿਲਪੀਨਜ਼", "name:pl"=>"Filipiny", "name:ps"=>"فلېپين", "name:pt"=>"Filipinas", "name:qu"=>"Philipinakuna", "name:ro"=>"Filipine", "name:ru"=>"Филиппины", "name:rw"=>"Filipine", "name:sa"=>"कलिंगद्वीप", "name:se"=>"Filippiinnat", "name:sg"=>"Filipîni", "name:sh"=>"Filipini", "name:si"=>"පිලිපීනය", "name:sk"=>"Filipíny", "name:sl"=>"Filipini", "name:sm"=>"Filipaina", "name:so"=>"Filibiin", "name:sq"=>"Filipinet", "name:sr"=>"Филипини", "name:ss"=>"IFiliphayi", "name:su"=>"Pilipina", "name:sv"=>"Filippinerna", "name:sw"=>"Ufilipino", "name:ta"=>"பிலிப்பீன்சு", "name:te"=>"ఫిలిప్పీన్స్", "name:tg"=>"Филиппин", "name:th"=>"ประเทศฟิลิปปินส์", "name:tk"=>"Filippinler", "name:tl"=>"Pilipinas", "name:tr"=>"Filipinler", "name:tt"=>"Филиппиннар", "name:ug"=>"فىلىپپىن", "name:uk"=>"Філіппіни", "name:ur"=>"فلپائن", "name:uz"=>"Filippin", "name:vi"=>"Philippines", "name:vo"=>"Filipuäns", "name:wa"=>"Filipenes", "name:wo"=>"Filipiin", "name:yi"=>"פיליפינען", "name:yo"=>"Filipínì", "name:za"=>"Feihlizbinh", "name:zh"=>"菲律宾 / 菲律賓"
-nz     "name"=>"New Zealand / Aotearoa", "name:af"=>"Nieu-Seeland", "name:am"=>"ኒው ዚላንድ", "name:an"=>"Nueva Zelanda", "name:ar"=>"نيوزيلندا", "name:az"=>"Yeni Zelandiya", "name:ba"=>"Яңы Зеландия", "name:be"=>"Новая Зеландыя", "name:bg"=>"Нова Зеландия", "name:bi"=>"Niu Zilan", "name:bm"=>"New Zealand", "name:bn"=>"নিউজিল্যান্ড", "name:bo"=>"ནིའུ་ཛི་ལེན་ཌི།", "name:br"=>"Zeland-Nevez", "name:bs"=>"Novi Zeland", "name:ca"=>"Nova Zelanda", "name:cs"=>"Nový Zéland", "name:cv"=>"Çĕнĕ Зеланди", "name:cy"=>"Seland Newydd", "name:da"=>"New Zealand", "name:de"=>"Neuseeland", "name:dv"=>"ނިއުޒިލޭންޑު", "name:dz"=>"ནིའུ་ཛི་ལེནཌ་", "name:el"=>"Νέα Ζηλανδία", "name:en"=>"New Zealand", "name:eo"=>"Nov-Zelando", "name:es"=>"Nueva Zelanda", "name:et"=>"Uus-Meremaa", "name:eu"=>"Zeelanda Berria", "name:fa"=>"نیوزیلند", "name:fi"=>"Uusi-Seelanti", "name:fo"=>"Nýsæland", "name:fr"=>"Nouvelle-Zélande", "name:fy"=>"Nij-Seelân", "name:ga"=>"An Nua-Shéalainn", "name:gd"=>"Sealainn Nuadh", "name:gl"=>"Nova Zelandia", "name:gv"=>"Yn Teelynn Noa", "name:he"=>"ניו זילנד", "name:hi"=>"न्यूज़ीलैण्ड", "name:hr"=>"Novi Zeland", "name:ht"=>"Nouvèl Zelann", "name:hu"=>"Új-Zéland", "name:hy"=>"Նոր Զելանդիա", "name:ia"=>"Nove Zelanda", "name:id"=>"Selandia Baru", "name:ie"=>"Nov-Zeland", "name:io"=>"Nova-Zelando", "name:is"=>"Nýja-Sjáland", "name:it"=>"Nuova Zelanda", "name:ja"=>"ニュージーランド", "name:jv"=>"Sélandia Anyar", "name:ka"=>"ახალი ზელანდია", "name:kk"=>"Жаңа Зеландия", "name:kl"=>"New Zealand", "name:km"=>"នូវែលសេឡង់", "name:kn"=>"ನ್ಯೂ ಜೀಲ್ಯಾಂಡ್", "name:ko"=>"뉴질랜드", "name:ku"=>"Nû Zelenda", "name:kv"=>"Выль Зеландия", "name:kw"=>"Mordir Nowydh", "name:la"=>"Nova Zelandia", "name:lb"=>"Neiséiland", "name:li"=>"Nui-Zieland", "name:lo"=>"ປະເທດນູແວນ ເຊລັງ", "name:lt"=>"Naujoji Zelandija", "name:lv"=>"Jaunzēlande", "name:mi"=>"Aotearoa", "name:mk"=>"Нов Зеланд", "name:ml"=>"ന്യൂസീലൻഡ്", "name:mn"=>"Шинэ Зеланд", "name:mr"=>"न्यू झीलँड", "name:ms"=>"New Zealand", "name:mt"=>"New Zealand", "name:my"=>"နယူးဇီလန်နိုင်ငံ", "name:na"=>"Niu Djiran", "name:ne"=>"न्यू जील्याण्ड", "name:nl"=>"Nieuw-Zeeland", "name:nn"=>"New Zealand", "name:no"=>"New Zealand", "name:oc"=>"Nòva Zelanda", "name:or"=>"ନିଉଜିଲ୍ୟାଣ୍ଡ", "name:os"=>"Ног Зеланди", "name:pa"=>"ਨਿਊਜ਼ੀਲੈਂਡ", "name:pl"=>"Nowa Zelandia", "name:pt"=>"Nova Zelândia", "name:qu"=>"Musuq Silanda", "name:rm"=>"Nova Zelanda", "name:ro"=>"Noua Zeelandă", "name:ru"=>"Новая Зеландия", "name:rw"=>"Nuveli Zelande", "name:sa"=>"न्यू-जीलैंड", "name:se"=>"Aotearoa", "name:sh"=>"Novi Zeland", "name:sk"=>"Nový Zéland", "name:sl"=>"Nova Zelandija", "name:sm"=>"Niu Sila", "name:so"=>"New Zealand", "name:sq"=>"Zelanda e Re", "name:sr"=>"Нови Зеланд", "name:su"=>"Selandia Anyar", "name:sv"=>"Nya Zeeland", "name:sw"=>"New Zealand", "name:ta"=>"நியூசிலாந்து", "name:te"=>"న్యూజీలాండ్", "name:tg"=>"Зеландияи Нав", "name:th"=>"ประเทศนิวซีแลนด์", "name:tk"=>"Täze Zelandiýa", "name:tl"=>"New Zealand", "name:tr"=>"Yeni Zelanda", "name:tt"=>"Яңа Зеландия", "name:ty"=>"Aotearoa", "name:ug"=>"يېڭى زېلاندىيە", "name:uk"=>"Нова Зеландія", "name:ur"=>"نیوزی لینڈ", "name:uz"=>"Yangi Zelandiya", "name:vi"=>"New Zealand", "name:vo"=>"Nula-Seleäns", "name:wa"=>"Nouve Zelande", "name:wo"=>"Seland-Gu-Bees", "name:yi"=>"ניו זילאנד", "name:yo"=>"New Zealand", "name:za"=>"Saen Saelanz", "name:zh"=>"新西兰", "name:zu"=>"INyuzilandi"
-it     "name"=>"Italia", "name:ab"=>"Италиа", "name:af"=>"Italië", "name:ak"=>"Italy", "name:am"=>"ጣልያን", "name:an"=>"Italia", "name:ar"=>"إيطاليا", "name:as"=>"ইটালী", "name:ay"=>"Italiya", "name:az"=>"İtaliya", "name:ba"=>"Италия", "name:be"=>"Італія", "name:bg"=>"Италия", "name:bi"=>"Itali", "name:bn"=>"ইতালি", "name:bo"=>"ཨི་ཏ་ལི།", "name:br"=>"Italia", "name:bs"=>"Italija", "name:ca"=>"Itàlia", "name:ce"=>"Итали", "name:co"=>"Italia", "name:cs"=>"Itálie", "name:cu"=>"Италїꙗ", "name:cv"=>"Итали", "name:cy"=>"Yr Eidal", "name:da"=>"Italien", "name:de"=>"Italien", "name:dv"=>"އިޓަލީވިލާތް", "name:dz"=>"ཨྀཊ་ལི་", "name:ee"=>"Italy", "name:el"=>"Ιταλία", "name:en"=>"Italy", "name:eo"=>"Italio", "name:es"=>"Italia", "name:et"=>"Itaalia", "name:eu"=>"Italia", "name:fa"=>"ایتالیا", "name:ff"=>"Italiya", "name:fi"=>"Italia", "name:fo"=>"Italia", "name:fr"=>"Italie", "name:fy"=>"Itaalje", "name:ga"=>"An Iodáil", "name:gd"=>"An Eadailt", "name:gl"=>"Italia", "name:gn"=>"Itália", "name:gu"=>"ઈટલી", "name:gv"=>"Yn Iddaal", "name:he"=>"איטליה", "name:hi"=>"इटली", "name:hr"=>"Italija", "name:ht"=>"Itali", "name:hu"=>"Olaszország", "name:hy"=>"Իտալիա", "name:ia"=>"Italia", "name:id"=>"Italia", "name:ie"=>"Italia", "name:io"=>"Italia", "name:is"=>"Ítalía", "name:it"=>"Italia", "name:ja"=>"イタリア", "name:jv"=>"Italia", "name:ka"=>"იტალია", "name:kg"=>"Italia", "name:ki"=>"Italia", "name:kk"=>"Италия", "name:kl"=>"Italia", "name:km"=>"អ៊ីតាលី", "name:kn"=>"ಇಟಲಿ", "name:ko"=>"이탈리아", "name:ku"=>"Îtalya", "name:kv"=>"Италия", "name:kw"=>"Itali", "name:ky"=>"Италия", "name:la"=>"Italia", "name:lb"=>"Italien", "name:lg"=>"Yitale", "name:li"=>"Italië", "name:ln"=>"Italya", "name:lo"=>"ອິຕາລີ", "name:lt"=>"Italija", "name:lv"=>"Itālija", "name:mg"=>"Italia", "name:mi"=>"Itari", "name:mk"=>"Италија", "name:ml"=>"ഇറ്റലി", "name:mn"=>"Итали", "name:mr"=>"इटली", "name:ms"=>"Itali", "name:mt"=>"Italja", "name:my"=>"အီတလီနိုင်ငံ", "name:na"=>"Itari", "name:ne"=>"इटाली", "name:nl"=>"Italië", "name:nn"=>"Italia", "name:no"=>"Italia", "name:nv"=>"Ídelii", "name:oc"=>"Itàlia", "name:or"=>"ଇଟାଲୀ", "name:os"=>"Итали", "name:pa"=>"ਇਟਲੀ", "name:pl"=>"Włochy", "name:ps"=>"اېټاليا", "name:pt"=>"Itália", "name:qu"=>"Italya", "name:rm"=>"Italia", "name:ro"=>"Italia", "name:ru"=>"Италия", "name:rw"=>"Ubutaliyani", "name:sa"=>"इटली", "name:sc"=>"Itàlia", "name:se"=>"Itália", "name:sg"=>"Italùii", "name:sh"=>"Italija", "name:sk"=>"Taliansko", "name:sl"=>"Italija", "name:sm"=>"Italia", "name:so"=>"Talyaaniga", "name:sq"=>"Italia", "name:sr"=>"Италија", "name:ss"=>"INtaliyane", "name:su"=>"Italia", "name:sv"=>"Italien", "name:sw"=>"Italia", "name:ta"=>"இத்தாலி", "name:te"=>"ఇటలీ", "name:tg"=>"Итолиё", "name:th"=>"ประเทศอิตาลี", "name:tk"=>"Italiýa", "name:tl"=>"Italya", "name:tr"=>"İtalya", "name:tt"=>"Италия", "name:tw"=>"Italy", "name:ty"=>"’Itāria", "name:ug"=>"ئىتالىيە", "name:uk"=>"Італія", "name:ur"=>"اطالیہ", "name:uz"=>"Italiya", "name:ve"=>"Italy", "name:vi"=>"Ý", "name:vo"=>"Litaliyän", "name:wa"=>"Itåleye", "name:wo"=>"Itaali", "name:yi"=>"איטאליע", "name:yo"=>"Itálíà", "name:zh"=>"意大利", "name:zu"=>"ITaliya"
-ar     "name"=>"Argentina", "name:af"=>"Argentinië", "name:ak"=>"Agyɛntina", "name:am"=>"አርጀንቲና", "name:an"=>"Archentina", "name:ar"=>"الأرجنتين", "name:as"=>"আৰ্জেণ্টিনা", "name:av"=>"Аргентина", "name:ay"=>"Arxintina", "name:az"=>"Argentina", "name:ba"=>"Аргенти́на", "name:be"=>"Аргенці́на", "name:bg"=>"Аржентѝна", "name:bh"=>"अर्जेन्टीना", "name:bi"=>"Argentina", "name:bm"=>"Argentina", "name:bn"=>"আর্জেন্টিনা", "name:bo"=>"ཨར་ཇེན་ཊི་ན།", "name:br"=>"Arc'hantina", "name:bs"=>"Argentina", "name:ca"=>"Argentina", "name:ce"=>"Аргенти́на", "name:ch"=>"Argentina", "name:co"=>"Argentina", "name:cs"=>"Argentina", "name:cv"=>"Аргентина", "name:cy"=>"Ariannin", "name:da"=>"Argentina", "name:de"=>"Argentinien", "name:dv"=>"އާޖެންޓީނާ", "name:dz"=>"ཨར་ཇེན་ཊི་ན", "name:ee"=>"Argentina", "name:el"=>"Αργεντινή", "name:en"=>"Argentina", "name:eo"=>"Argentino", "name:es"=>"Argentina", "name:et"=>"Argentina", "name:eu"=>"Argentina", "name:fa"=>"آرژانتین", "name:ff"=>"Arjantiin", "name:fi"=>"Argentiina", "name:fj"=>"Argentina", "name:fo"=>"Argentina", "name:fr"=>"Argentine", "name:fy"=>"Argentynje", "name:ga"=>"an Airgintín", "name:gd"=>"Argentina", "name:gl"=>"Arxentina", "name:gn"=>"Argentina", "name:gu"=>"આર્જેન્ટીના", "name:gv"=>"yn Argenteen", "name:ha"=>"Argentina", "name:he"=>"ארגנטינה", "name:hi"=>"अर्जेण्टीना", "name:hr"=>"Argentina", "name:ht"=>"Ajantin", "name:hu"=>"Argentína", "name:hy"=>"Արգենտինա", "name:ia"=>"Argentina", "name:id"=>"Argentina", "name:ie"=>"Argentina", "name:ig"=>"Argentina", "name:io"=>"Arjentinia", "name:is"=>"Argentína", "name:it"=>"Argentina", "name:ja"=>"アルゼンチン", "name:jv"=>"Argèntina", "name:ka"=>"არგენტინა", "name:kg"=>"Arhentina", "name:ki"=>"Argentina", "name:kk"=>"Аргентина", "name:kl"=>"Argentina", "name:km"=>"អាហ្សង់ទីន", "name:kn"=>"ಅರ್ಜೆಂಟೀನ", "name:ko"=>"아르헨티나", "name:ks"=>"أرجَنٹینا", "name:ku"=>"Arjentîn", "name:kv"=>"Аргентина", "name:kw"=>"Arghantina", "name:ky"=>"Аргентина", "name:la"=>"Argentina", "name:lb"=>"Argentinien", "name:lg"=>"Arigentina", "name:li"=>"Argentinië", "name:ln"=>"Argentina", "name:lo"=>"ອາກຊັງຕີນ", "name:lt"=>"Argentina", "name:lv"=>"Argentīna", "name:mg"=>"Arjentina", "name:mi"=>"Āketina", "name:mk"=>"Аргентина", "name:ml"=>"അർജന്റീന", "name:mn"=>"Аргентин", "name:mr"=>"आर्जेन्टिना", "name:ms"=>"Argentina", "name:mt"=>"Arġentina", "name:my"=>"အာဂျင်တီးနားနိုင်ငံ", "name:na"=>"Ardjentina", "name:ne"=>"अर्जेन्टिना", "name:nl"=>"Argentinië", "name:nn"=>"Argentina", "name:no"=>"Argentina", "name:nv"=>"Béésh Łigaii Bikéyah", "name:oc"=>"Argentina", "name:om"=>"Arjentiinaa", "name:or"=>"ଆର୍ଜେଣ୍ଟିନା", "name:os"=>"Аргентинæ", "name:pa"=>"ਅਰਜਨਟੀਨਾ", "name:pi"=>"अर्जन्टीना", "name:pl"=>"Argentyna", "name:ps"=>"ارجنټاین", "name:pt"=>"Argentina", "name:qu"=>"Arhintina", "name:rm"=>"Argentinia", "name:rn"=>"Argentine", "name:ro"=>"Argentina", "name:ru"=>"Аргентина", "name:rw"=>"Arijantine", "name:sa"=>"अर्जण्टिना", "name:sc"=>"Argentina", "name:se"=>"Argentiinná", "name:sg"=>"Arzantîna", "name:sh"=>"Argentina", "name:si"=>"ආජන්ටිනාව", "name:sk"=>"Argentína", "name:sl"=>"Argentina", "name:sm"=>"Atenitina", "name:sn"=>"Argentina", "name:so"=>"Arjantiina", "name:sq"=>"Argjentina", "name:sr"=>"Аргентина", "name:su"=>"Argéntina", "name:sv"=>"Argentina", "name:sw"=>"Argentina", "name:ta"=>"அர்கெந்தீனா", "name:te"=>"అర్జెంటీనా", "name:tg"=>"Аргенти́на", "name:th"=>"อาร์เจนตินา", "name:ti"=>"አርጀንቲና", "name:tk"=>"Argentina", "name:tl"=>"Arhentina", "name:to"=>"ʻAsenitina", "name:tr"=>"Arjantin", "name:ts"=>"Arjentina", "name:tt"=>"Аргенти́на", "name:tw"=>"Argentina", "name:ty"=>"’Atetina", "name:ug"=>"ئارگېنتىنا", "name:uk"=>"Аргенти́на", "name:ur"=>"ارجنٹائن", "name:uz"=>"Argentina", "name:vi"=>"Argentina", "name:vo"=>"Largäntän", "name:wa"=>"Årdjintene", "name:wo"=>"Arsantin", "name:yi"=>"אַרגענטינע", "name:yo"=>"Argẹntínà", "name:za"=>"Argentina", "name:zh"=>"阿根廷", "name:zu"=>"i-Argentina"
-by     "name"=>"Беларусь", "name:af"=>"Wit-Rusland", "name:am"=>"ቤላሩስ", "name:an"=>"Belarrusia", "name:ar"=>"روسيا البيضاء", "name:az"=>"Belarus", "name:be"=>"Беларусь", "name:bg"=>"Беларус", "name:bi"=>"Belarus", "name:bn"=>"বেলারুশ", "name:bo"=>"བྷེ་ལ་རསུ།", "name:br"=>"Belarus", "name:bs"=>"Bjelorusija", "name:ca"=>"Bielorússia", "name:ce"=>"Белорусси", "name:co"=>"Bielorussia", "name:cs"=>"Bělorusko", "name:cu"=>"Бѣла Роусь", "name:cv"=>"Беларуç", "name:cy"=>"Belarws", "name:da"=>"Hviderusland", "name:de"=>"Belarus", "name:dv"=>"ބެލަރޫސް", "name:dz"=>"བེ་ལ་རུ་སུ།", "name:ee"=>"Belarus", "name:el"=>"Λευκορωσία", "name:en"=>"Belarus", "name:eo"=>"Belorusio", "name:es"=>"Bielorrusia", "name:et"=>"Valgevene", "name:eu"=>"Bielorrusia", "name:fa"=>"بلاروس", "name:ff"=>"Belaruusiya", "name:fi"=>"Valko-Venäjä", "name:fo"=>"Hvítarussland", "name:fr"=>"Biélorussie", "name:fy"=>"Wyt-Ruslân", "name:ga"=>"An Bhealarúis", "name:gd"=>"A' Bhealaruis", "name:gl"=>"Bielorrusia", "name:gn"=>"Vielorrusia", "name:gu"=>"બેલારુસ", "name:gv"=>"Yn Velaroosh", "name:he"=>"בלארוס", "name:hi"=>"बेलारूस", "name:hr"=>"Bjelorusija", "name:ht"=>"Byelorisi", "name:hu"=>"Fehéroroszország", "name:hy"=>"Բելառուս", "name:ia"=>"Bielorussia", "name:id"=>"Belarus", "name:ie"=>"Bielorussia", "name:io"=>"Bielorusia", "name:is"=>"Hvíta-Rússland", "name:it"=>"Bielorussia", "name:ja"=>"ベラルーシ", "name:jv"=>"Bélarus", "name:ka"=>"ბელარუსი", "name:kg"=>"Belarusia", "name:kk"=>"Беларусь", "name:kl"=>"Hvideruslandi", "name:kn"=>"ಬೆಲಾರುಸ್", "name:ko"=>"벨라루스", "name:ku"=>"Belarûs", "name:kv"=>"Беларусь", "name:kw"=>"Belarussi", "name:ky"=>"Беларусия", "name:la"=>"Ruthenia Alba", "name:lb"=>"Wäissrussland", "name:li"=>"Wit-Rusland", "name:ln"=>"Bielorusia", "name:lt"=>"Baltarusija", "name:lv"=>"Baltkrievija", "name:mi"=>"Pērara", "name:mk"=>"Белорусија", "name:ml"=>"ബെലാറുസ്", "name:mn"=>"Беларусь", "name:mr"=>"बेलारूस", "name:ms"=>"Belarus", "name:mt"=>"Belarus", "name:my"=>"ဘီလာရုဇ်နိုင်ငံ", "name:na"=>"Berarut", "name:ne"=>"बेलारुस", "name:nl"=>"Wit-Rusland", "name:nn"=>"Kviterussland", "name:no"=>"Hviterussland", "name:oc"=>"Bielorussia", "name:or"=>"ବେଲାଋଷ", "name:os"=>"Белорусси", "name:pl"=>"Białoruś", "name:ps"=>"بېلاروس", "name:pt"=>"Bielorrússia", "name:qu"=>"Bilarus", "name:rm"=>"Bielorussia", "name:ro"=>"Belarus", "name:ru"=>"Беларусь", "name:rw"=>"Belarusi", "name:sa"=>"बेलारूस", "name:se"=>"Vilges-Ruošša", "name:sh"=>"Belorusija", "name:si"=>"බෙලාරස්", "name:sk"=>"Bielorusko", "name:sl"=>"Belorusija", "name:so"=>"Belarus", "name:sq"=>"Bjellorusia", "name:sr"=>"Белорусија", "name:ss"=>"IBhelalasi", "name:su"=>"Bélarus", "name:sv"=>"Belarus", "name:sw"=>"Belarus", "name:ta"=>"பெலருஸ்", "name:te"=>"బెలారస్", "name:tg"=>"Беларус", "name:th"=>"ประเทศเบลารุส", "name:tk"=>"Belorussiýa", "name:tl"=>"Biyelorusya", "name:tr"=>"Beyaz Rusya", "name:ts"=>"Belarus", "name:tt"=>"Беларусия", "name:ty"=>"Belarus", "name:ug"=>"بېلورۇسسىيە", "name:uk"=>"Білорусь", "name:ur"=>"بیلاروس", "name:uz"=>"Belarus", "name:vi"=>"Belarus", "name:vo"=>"Belarusän", "name:wo"=>"Belaarus", "name:yi"=>"בעלארוס", "name:yo"=>"Bẹ̀lárùs", "name:zh"=>"白罗斯/白羅斯", "name:zu"=>"IBelarusi"
-ck     "name"=>"Kūki 'Āirani", "name:af"=>"Cookeilande", "name:ak"=>"Kook Nsupɔw", "name:am"=>"ኩክ ደሴቶች", "name:an"=>"islas Cook", "name:ar"=>"جزر كوك", "name:az"=>"Kuk adaları", "name:ba"=>"Кук Утрауҙары", "name:be"=>"Астравы Кука", "name:bg"=>"Острови Кук", "name:bm"=>"Kuki Gun", "name:bn"=>"কুক দ্বীপপুঞ্জ", "name:bo"=>"ཀཱུག གླིང་ཕྲེན་རྒྱལ་ཁབ།", "name:br"=>"Inizi Cook", "name:bs"=>"Cookova Ostrva", "name:ca"=>"Illes Cook", "name:cs"=>"Cookovy ostrovy", "name:cy"=>"Ynysoedd Cook", "name:da"=>"Cook-øerne", "name:de"=>"Cookinseln", "name:dv"=>"ކުކް ޖަޒީރާ", "name:dz"=>"ཀུག་གླིང་ཚོམ", "name:ee"=>"Kook ƒudomekpo nutome", "name:el"=>"Νήσοι Κουκ", "name:en"=>"Cook Islands", "name:eo"=>"Kukinsuloj", "name:es"=>"Islas Cook", "name:et"=>"Cooki saared", "name:eu"=>"Cook uharteak", "name:fa"=>"جزایر کوک", "name:ff"=>"Duuɗe Kuuk", "name:fi"=>"Cookinsaaret", "name:fo"=>"Cooksoyggjarnar", "name:fr"=>"Îles Cook", "name:fy"=>"de Cookeilannen", "name:ga"=>"Oileáin Cook", "name:gd"=>"Eileanan Cook", "name:gl"=>"Illas Cook", "name:gu"=>"કુક આઇલેન્ડ્સ", "name:ha"=>"Tsibiran Kuku", "name:he"=>"איי קוּק", "name:hi"=>"कुक द्वीपसमूह", "name:hr"=>"Cookovo Otočje", "name:hu"=>"Cook-szigetek", "name:hy"=>"Կուկի կղզիներ", "name:ia"=>"Insulas Cook", "name:id"=>"Kepulauan Cook", "name:io"=>"Insuli Cook", "name:is"=>"Cooks-eyjar", "name:it"=>"Isole Cook", "name:ja"=>"クック諸島", "name:jv"=>"Kapuloan Cook", "name:ka"=>"კუკის კუნძულები", "name:ki"=>"Visiwa vya Cook", "name:kk"=>"Кук аралдары", "name:kl"=>"Cook qeqertaq", "name:km"=>"កោះ​ខូក", "name:kn"=>"ಕುಕ್ ದ್ವೀಪಗಳು", "name:ko"=>"쿡 제도", "name:ks"=>"کُک جٔزیٖرٕ", "name:ku"=>"Giravên Cook", "name:kw"=>"Ynysow Cook", "name:ky"=>"Кук аралдары", "name:la"=>"Insulae de Cook", "name:lb"=>"Cookinseln", "name:lg"=>"Bizinga bya Kkuki", "name:li"=>"Cookeilenj", "name:ln"=>"Bisanga bya Kookɛ", "name:lo"=>"ຫມູ່ເກາະຄຸກ", "name:lt"=>"Kuko Salos", "name:lv"=>"Kuka Salas", "name:mg"=>"Nosy Kook", "name:mi"=>"Kuki Airani", "name:mk"=>"Кукови Острови", "name:ml"=>"കൂക്ക് ദ്വീപുകൾ", "name:mn"=>"Күүкийн Арлууд", "name:mr"=>"कूक द्वीपसमूह", "name:ms"=>"Kepulauan Cook", "name:mt"=>"Gżejjer Cook", "name:my"=>"ကွတ် ကျွန်းစု", "name:ne"=>"कुक टापु", "name:nl"=>"Cookeilanden", "name:nn"=>"Cookøyane", "name:no"=>"Cookøyene", "name:oc"=>"Illas Cook", "name:or"=>"କୁକ୍ ଆଇସଲ୍ୟାଣ୍ଡ", "name:os"=>"Кучы сакъадæхтæ", "name:pa"=>"ਕੁੱਕ ਟਾਪੂ", "name:pl"=>"Wyspy Cooka", "name:pt"=>"Ilhas Cook", "name:rm"=>"Inslas Cook", "name:rn"=>"Izinga rya Kuku", "name:ro"=>"Insulele Cook", "name:ru"=>"Острова Кука", "name:rw"=>"Ibirwa bya Kuke", "name:se"=>"Cook-sullot", "name:sg"=>"âzûâ Kûku", "name:sh"=>"Kukova Ostrva", "name:si"=>"කුක් දිවයින්", "name:sk"=>"Cookove ostrovy", "name:sl"=>"Cookovi otoki", "name:sn"=>"Zvitsuwa zveCook", "name:so"=>"Jaziiradda Cook", "name:sq"=>"Ishulli Kuk", "name:sr"=>"Кукова Острва", "name:su"=>"Kapuloan Cook", "name:sv"=>"Cooköarna", "name:sw"=>"Visiwa vya Cook", "name:ta"=>"குக் தீவுகள்", "name:te"=>"కుక్ దీవులు", "name:th"=>"หมู่เกาะคุก", "name:ti"=>"ኩክ ደሴቶች", "name:tl"=>"Kapuluang Cook", "name:to"=>"ʻOtumotu Kuki", "name:tr"=>"Cook Adaları", "name:tt"=>"Кук утраулары", "name:ug"=>"Kuk Taqim Aralliri", "name:uk"=>"Острови́ Ку́ка", "name:ur"=>"جزائر کک", "name:uz"=>"Kuk orollari", "name:vi"=>"Quần đảo Cook", "name:wo"=>"Dunu Kook", "name:yo"=>"Orílẹ́ède Etíokun Kùúkù", "name:zh"=>"庫克群島", "name:zu"=>"i-Cook Islands"
-gs     "name"=>"South Georgia and the South Sandwich Islands", "name:af"=>"Suid-Georgië en die Suidelike Sandwich-eilande", "name:ar"=>"جزر جورجيا الجنوبية وساندويتش الجنوبية", "name:az"=>"Cənubi Georgiya və Cənubi Sandviç adaları", "name:be"=>"Паўднёвая Джорджыя і Паўднёвыя Сандвічавы астравы", "name:bg"=>"Южна Джорджия и Южни Сандвичеви острови", "name:br"=>"Inizi Georgia ar Su hag Inizi Sandwich ar Su", "name:bs"=>"Južna Džordžija i Južna Sendvička Ostrva", "name:ca"=>"Illes Geòrgia del Sud i Sandwich del Sud", "name:cs"=>"Jižní Georgie a Jižní Sandwichovy ostrovy", "name:da"=>"South Georgia og South Sandwich Islands", "name:de"=>"Südgeorgien und die Südlichen Sandwichinseln", "name:el"=>"Νήσοι Νότια Γεωργία και Νότιες Σάντουιτς", "name:en"=>"South Georgia and the South Sandwich Islands", "name:eo"=>"Sud-Georgio kaj Sud-Sandviĉinsuloj", "name:es"=>"Islas Georgias del Sur y Sandwich del Sur", "name:et"=>"Lõuna-Georgia ja Lõuna-Sandwichi saared", "name:eu"=>"Hegoaldeko Georgiak eta Hegoaldeko Sandwich uharteak", "name:fa"=>"جزایر جورجیای جنوبی و ساندویچ جنوبی", "name:fi"=>"Etelä-Georgia ja Eteläiset Sandwichsaaret", "name:fo"=>"Suðursandwichoyggjar og Suðurgeorgia", "name:fr"=>"Géorgie du Sud-et-les Îles Sandwich du Sud", "name:fy"=>"Súd-Georgje en de Súdlike Sandwicheilannen", "name:gd"=>"Seòirsia-a-Deas is na h-Eileanan Shandwich-a-Deas", "name:gl"=>"Illas Xeorxia do Sur e Sandwich do Sur", "name:he"=>"איי ג'ורג'יה הדרומית ואיי סנדוויץ' הדרומיים", "name:hi"=>"दक्षिण जॉर्जिया एवं दक्षिण सैंडविच द्वीप समूह", "name:hr"=>"Južna Georgija i Otočje Južni Sandwich", "name:hu"=>"Déli-Georgia és Déli-Sandwich-szigetek", "name:id"=>"Georgia Selatan dan Kepulauan Sandwich Selatan", "name:is"=>"Suður-Georgía og Suður-Sandvíkureyjar", "name:it"=>"Georgia del Sud e Isole Sandwich Australi", "name:ja"=>"サウスジョージア・サウスサンドウィッチ諸島", "name:ko"=>"사우스조지아 사우스샌드위치 제도", "name:kw"=>"Jeorji Dheghow hag Ynysow Sandwich Deghow", "name:lt"=>"Pietų Džordžija ir Pietų Sandvičo salos", "name:lv"=>"Dienviddžordžija un Dienvidsendviču salas", "name:mk"=>"Јужна Џорџија и Јужни Сендвички Острови", "name:mr"=>"साउथ जॉर्जिया व साउथ सँडविच द्वीपसमूह", "name:ms"=>"Georgia Selatan dan Kepulauan Sandwich Selatan", "name:nl"=>"Zuid-Georgia en de Zuidelijke Sandwicheilanden", "name:nn"=>"Sør-Georgia og Sør-Sandwichøyane", "name:no"=>"Sør-Georgia og Sør-Sandwichøyene", "name:os"=>"Хуссар Джорджи æмæ Хуссар Сандвичы сакъадæхтæ", "name:pl"=>"Georgia Południowa i Sandwich Południowy", "name:pt"=>"Ilhas Geórgia do Sul e Sanduíche do Sul", "name:ro"=>"Georgia de Sud şi Insulele Sandwich de Sud", "name:ru"=>"Южная Георгия и Южные Сандвичевы Острова", "name:se"=>"Lulli Georgia ja Lulli Sandwich-sullot", "name:sk"=>"Južná Georgia a Južné Sandwichove ostrovy", "name:sl"=>"Južna Georgija in Južni Sandwichevi otoki", "name:sq"=>"Gjeorgjia Jugore dhe Ishujt Jugorë Sanduiç", "name:sr"=>"Јужна Џорџија и Јужна Сендвичка Острва", "name:sv"=>"Sydgeorgien och Sydsandwichöarna", "name:ta"=>"தெற்கு யோர்சியா மற்றும் தெற்கு சண்ட்விச் தீவுகள்", "name:th"=>"เกาะเซาท์จอร์เจียและหมู่เกาะเซาท์แซนด์วิช", "name:tr"=>"Güney Georgia ve Güney Sandwich Adaları", "name:uk"=>"Південна Джорджія та Південні Сандвічеві острови", "name:vi"=>"Quần đảo Nam Georgia và Nam Sandwich", "name:wo"=>"Jeoorji gu Bëj-saalum ak Duni Islaand yi Bëj-saalum", "name:zh"=>"南喬治亞和南桑威奇群島"
-ie     "name"=>"Éire / Ireland", "name:af"=>"Ierland", "name:ak"=>"Aereland", "name:am"=>"አየርላንድ", "name:an"=>"Irlanda", "name:ar"=>"أيرلندا", "name:ay"=>"Irlandiya", "name:az"=>"İrlandiya", "name:ba"=>"Ирландия", "name:be"=>"Ірландыя", "name:bg"=>"Ирландия", "name:bi"=>"Ireland", "name:bm"=>"Irilandi", "name:bn"=>"আয়ারল্যান্ড", "name:bo"=>"ཨ་ཡར་ལནཌ།", "name:br"=>"Iwerzhon", "name:bs"=>"Irska", "name:ca"=>"Irlanda", "name:ce"=>"Ирланди", "name:co"=>"Irlanda", "name:cs"=>"Irsko", "name:cu"=>"Єирь", "name:cv"=>"Ирланди Республики", "name:cy"=>"Iwerddon", "name:da"=>"Irland", "name:de"=>"Irland", "name:dv"=>"އަޔަލޭންޑުގެ ޖުމްހޫރިއްޔާ", "name:dz"=>"ཨཱ་ཡ་ལེནཌ", "name:ee"=>"Ireland nutome", "name:el"=>"Ιρλανδία", "name:en"=>"Ireland", "name:eo"=>"Irlando", "name:es"=>"Irlanda", "name:et"=>"Iirimaa", "name:eu"=>"Irlanda", "name:fa"=>"ایرلند", "name:ff"=>"Irlannda", "name:fi"=>"Irlanti", "name:fo"=>"Írland", "name:fr"=>"Irlande", "name:fy"=>"Ierlân", "name:ga"=>"Éire", "name:gd"=>"Èirinn", "name:gl"=>"Irlanda", "name:gn"=>"Ilandia", "name:gu"=>"આયર્લેંડ", "name:gv"=>"Nerin", "name:ha"=>"Ayalan", "name:he"=>"אירלנד", "name:hi"=>"आयरलैंड", "name:hr"=>"Irska", "name:ht"=>"Ilann", "name:hu"=>"Írország", "name:hy"=>"Իռլանդիա", "name:ia"=>"Irlanda", "name:id"=>"Irlandia", "name:ie"=>"Irland", "name:io"=>"Irlando", "name:is"=>"Írland", "name:it"=>"Irlanda", "name:ja"=>"アイルランド", "name:jv"=>"Republik Irlandia", "name:ka"=>"ირლანდია", "name:ki"=>"Ayalandi", "name:kk"=>"Ирландия", "name:kl"=>"Irlandi", "name:km"=>"អៀរឡង់", "name:kn"=>"ಐರ್ಲೆಂಡ್", "name:ko"=>"아일랜드", "name:ks"=>"اَیَرلینٛڑ", "name:ku"=>"Îrland", "name:kv"=>"Ирландия", "name:kw"=>"Repoblek Wordhen", "name:ky"=>"Ирландия", "name:la"=>"Hibernia", "name:lb"=>"Irland", "name:lg"=>"Ayalandi", "name:li"=>"Ierland", "name:ln"=>"Irelandɛ", "name:lo"=>"ໄອແລນ", "name:lt"=>"Airija", "name:lv"=>"Īrija", "name:mg"=>"Irlandy", "name:mi"=>"Airangi", "name:mk"=>"Ирска", "name:ml"=>"അയർലാൻഡ്", "name:mn"=>"Ирланд", "name:mr"=>"आयर्लंड", "name:ms"=>"Ireland", "name:mt"=>"Irlanda", "name:my"=>"အိုင်ယာလန်", "name:na"=>"Ripubrikit Airerand", "name:ne"=>"आइरल्याण्ड", "name:nl"=>"Ierland", "name:nn"=>"Irland", "name:no"=>"Irland", "name:nv"=>"Bitsiighaʼ Łichííʼí Bikéyah", "name:oc"=>"Republica d'Irlanda", "name:or"=>"ଆୟରଲ୍ୟାଣ୍ଡ", "name:os"=>"Ирланди", "name:pl"=>"Irlandia", "name:ps"=>"د آيرلېنډ جمهوريت", "name:pt"=>"Irlanda", "name:qu"=>"Ilanda", "name:rm"=>"Irlanda", "name:rn"=>"Irilandi", "name:ro"=>"Irlanda", "name:ru"=>"Ирландия", "name:rw"=>"Irilande", "name:sc"=>"Irlanda", "name:se"=>"Irlánda", "name:sg"=>"Irlânde", "name:sh"=>"Irska", "name:si"=>"අයර්ලන්තය", "name:sk"=>"Írsko", "name:sl"=>"Irska", "name:sn"=>"Ireland", "name:so"=>"Ayrlaand", "name:sq"=>"Irlandë", "name:sr"=>"Ирска", "name:ss"=>"IYalendi", "name:sv"=>"Irland", "name:sw"=>"Ayalandi", "name:ta"=>"அயர்லாந்து", "name:te"=>"ఐర్ లాండ్", "name:tg"=>"Ҷумҳурии Ирландия", "name:th"=>"สาธารณรัฐไอร์แลนด์", "name:ti"=>"አየርላንድ", "name:tk"=>"Irlandiýa", "name:tl"=>"Irlanda", "name:to"=>"ʻAealani", "name:tr"=>"İrlanda", "name:ts"=>"Ireland", "name:tt"=>"Ирландия", "name:uk"=>"Ірландія", "name:ur"=>"آئرلینڈ", "name:uz"=>"Irlandiya", "name:vi"=>"Ireland", "name:vo"=>"Lireyän", "name:wa"=>"Irlande", "name:yi"=>"אירלאנד", "name:yo"=>"Orílẹ́ède Ailandi", "name:za"=>"Aiwjlanz Gunghozgoz", "name:zh"=>"愛爾蘭", "name:zu"=>"i-Ireland"
-km     "name"=>"Comores Komori جزر القمر", "name:af"=>"Komore", "name:ar"=>"جزر القمر", "name:br"=>"Komorez", "name:ca"=>"Comores", "name:cs"=>"Komory", "name:cy"=>"Comoros", "name:da"=>"Comorerne", "name:de"=>"Komoren", "name:el"=>"Κομόρες", "name:en"=>"Comoros", "name:eo"=>"Komoroj", "name:es"=>"Comoras", "name:et"=>"Komoorid", "name:eu"=>"Komoreak", "name:fa"=>"اتحاد قمر", "name:fi"=>"Komorit", "name:fr"=>"Comores", "name:fy"=>"de Komoaren", "name:ga"=>"Oileáin Chomóra", "name:gd"=>"Comòras", "name:he"=>"קומורו", "name:hr"=>"Komori", "name:hu"=>"Comore-szigetek", "name:ia"=>"Comoros", "name:id"=>"Komoro", "name:io"=>"Komori", "name:is"=>"Kómoreyjar", "name:it"=>"Comore", "name:ja"=>"コモロ", "name:la"=>"Insulae Comorianae", "name:lb"=>"Komoren", "name:lt"=>"Komorai", "name:lv"=>"Komoru salas", "name:mk"=>"Комори", "name:mn"=>"Коморын арлууд", "name:nl"=>"Comoren", "name:pl"=>"Komory", "name:ps"=>"قمرټاپوګان", "name:pt"=>"Comores", "name:ru"=>"Коморские острова", "name:se"=>"Komorosullot", "name:sk"=>"Komory", "name:sl"=>"Komori", "name:sr"=>"Комори", "name:sv"=>"Komorerna", "name:ta"=>"கொமொரோசு", "name:th"=>"ประเทศคอโมโรส", "name:tr"=>"Komorlar", "name:ug"=>"كومور ئاراللىرى", "name:uk"=>"Коморські Острови", "name:ur"=>"اتحاد القمری", "name:vi"=>"Comoros", "name:vo"=>"Komoruäns", "name:zh"=>"科摩洛"
-kp     "name"=>"조선민주주의인민공화국", "name:af"=>"Noord-Korea", "name:am"=>"ስሜን ኮርያ", "name:an"=>"Coreya d'o Norte", "name:ar"=>"كوريا الشمالية", "name:as"=>"উত্তৰ কোৰিয়া", "name:az"=>"Koreya Xalq Demokratik Respublikası", "name:ba"=>"Корея Халыҡ-Демократик Республикаһы", "name:be"=>"Карэйская Народна-Дэмакратычная Рэспубліка", "name:bg"=>"Северна Корея", "name:bh"=>"उत्तर कोरिया", "name:bn"=>"উত্তর কোরিয়া", "name:bo"=>"བྱང་ཀོ་རི་ཡ།", "name:br"=>"Republik Poblel ha Demokratel Korea", "name:bs"=>"Sjeverna Koreja", "name:ca"=>"Corea del Nord", "name:ce"=>"Корейн Халкъан-Демократин Республика", "name:cs"=>"Severní Korea", "name:cy"=>"Gogledd Corea", "name:da"=>"Nordkorea", "name:de"=>"Nordkorea", "name:dv"=>"އުތުރު ކޮރެއާ", "name:dz"=>"བྱང་ཀོ་རི་ཡ་", "name:ee"=>"North Korea", "name:el"=>"Βόρεια Κορέα", "name:en"=>"North Korea", "name:eo"=>"Nord-Koreio", "name:es"=>"Corea del Norte", "name:et"=>"Põhja-Korea", "name:eu"=>"Ipar Korea", "name:fa"=>"کره شمالی", "name:fi"=>"Pohjois-Korea", "name:fo"=>"Norðurkorea", "name:fr"=>"Corée du Nord", "name:fy"=>"Noard-Koreä", "name:ga"=>"An Chóiré Thuaidh", "name:gd"=>"Coirèa a Tuath", "name:gl"=>"Corea do Norte", "name:gn"=>"Yvate Koréa", "name:gu"=>"ઉત્તર કોરિયા", "name:gv"=>"Yn Chorea Twoaie", "name:ha"=>"Koriya ta Arewa", "name:he"=>"קוריאה הצפונית", "name:hi"=>"उत्तर कोरिया", "name:hr"=>"Sjeverna Koreja", "name:ht"=>"Kore dinò", "name:hu"=>"Koreai Népi Demokratikus Köztársaság (Észak-Korea)", "name:hy"=>"Կորեայի Ժողովրդա-Դեմոկրատական Հանրապետություն", "name:ia"=>"Corea del Nord", "name:id"=>"Korea Utara", "name:ie"=>"Nord-Korea", "name:ik"=>"Nigiq Korea", "name:io"=>"Nord-Korea", "name:is"=>"Norður-Kórea", "name:it"=>"Corea del Nord", "name:ja"=>"朝鮮民主主義人民共和国", "name:jv"=>"Koréa Lor", "name:ka"=>"კორეის სახალხო დემოკრატიული რესპუბლიკა", "name:kg"=>"Hangu ya Node", "name:ki"=>"North Korea", "name:kk"=>"Корей Халық Демократиялық Республикасы", "name:kl"=>"Korea Avannarleq", "name:km"=>"កូរ៉េខាងជើង", "name:kn"=>"ಉತ್ತರ ಕೊರಿಯಾ", "name:ko"=>"조선민주주의인민공화국", "name:ku"=>"Korêya Bakur", "name:kv"=>"Корея Войтыр Демократия Республика", "name:kw"=>"Korea Gledh", "name:ky"=>"Корей Эл-Демократиялык Республикасы", "name:la"=>"Res publica popularis democratica Coreana", "name:lb"=>"Demokratesch Volleksrepublik Korea", "name:li"=>"Noord-Korea", "name:ln"=>"Koré ya Nola", "name:lo"=>"ປະເທດເກົາຫຼີເໜືອ", "name:lt"=>"Šiaurės Korėja", "name:lv"=>"Ziemeļkoreja", "name:mg"=>"Korea Avaratra", "name:mi"=>"Kōrea-ki-te-raki", "name:mk"=>"Демократска Народна Република Кореја", "name:ml"=>"ഉത്തര കൊറിയ", "name:mn"=>"Умард Солонгос", "name:mr"=>"उत्तर कोरिया", "name:ms"=>"Korea Utara", "name:mt"=>"Korea ta' Fuq", "name:my"=>"ကိုရီးယား ဒီမိုကရက်တစ် ပြည်သူ့သမ္မတနိုင်ငံ", "name:na"=>"Ripubrikit Engame Korea", "name:ne"=>"उत्तर कोरिया", "name:nl"=>"Noord-Korea", "name:nn"=>"Nord-Korea", "name:no"=>"Nord-Korea", "name:nv"=>"Kolíya Bikéyah Náhookǫsjí Siʼánígíí", "name:oc"=>"Corèa del Nòrd", "name:om"=>"Kooriyaa Kaabaa", "name:or"=>"ପୂର୍ବ କୋରିଆ", "name:os"=>"Корейы Адæмон Демократон Республикæ", "name:pa"=>"ਉੱਤਰੀ ਕੋਰੀਆ", "name:pl"=>"Korea Północna", "name:ps"=>"شمالي کوريا", "name:pt"=>"Coreia do Norte", "name:qu"=>"Chusun Runakapaq Runallaqta Republika", "name:ro"=>"Coreea de Nord", "name:ru"=>"Северная Корея", "name:rw"=>"Koreya y’Amajyaruguru", "name:sa"=>"उत्तर कोरिया", "name:sc"=>"Corea de su Norte", "name:sd"=>"اتر ڪوريا", "name:se"=>"Davvi-Korea", "name:sh"=>"Demokratska Narodna Republika Koreja", "name:si"=>"උතුරු කොරියාව", "name:sk"=>"Kórejská ľudovodemokratická republika", "name:sl"=>"Severna Koreja", "name:sn"=>"North Korea", "name:so"=>"Waqooyiga Kuuriya", "name:sq"=>"Koreja e Veriut", "name:sr"=>"Северна Кореја", "name:ss"=>"IKhoriya leseNyakatfo", "name:su"=>"Koréa Kalér", "name:sv"=>"Nordkorea", "name:sw"=>"Korea Kaskazini", "name:ta"=>"வட கொரியா", "name:te"=>"ఉత్తర కొరియా", "name:tg"=>"Кореяи Шимолӣ", "name:th"=>"ประเทศเกาหลีเหนือ", "name:tk"=>"Demirgazyk Koreýa", "name:tl"=>"Hilagang Korea", "name:tr"=>"Kuzey Kore", "name:ts"=>"North Korea", "name:tt"=>"Корея Халык Демократик Җөмһүрияте", "name:ug"=>"شىمالىي چاۋشيەن", "name:uk"=>"Корейська Народно-Демократична Республіка", "name:ur"=>"شمالی کوریا", "name:uz"=>"Koreya Xalq Demokratik Respublikasi", "name:vi"=>"Bắc Triều Tiên", "name:vo"=>"Nolüda-Koreyän", "name:wo"=>"Kore gu Bëj-gànnaar", "name:xh"=>"Coreia do Twoaie", "name:yi"=>"צפון קארעע", "name:yo"=>"Kòréà Àríwá", "name:za"=>"Cauzsenh Minzcujcujyi Yinzminz Gunghozgoz", "name:zh"=>"朝鲜民主主义人民共和国"
-kr     "name"=>"대한민국", "name:af"=>"Suid-Korea", "name:ak"=>"Anaafo Koria", "name:am"=>"ደቡብ ኮርያ", "name:an"=>"Corea d'o Sur", "name:ar"=>"كوريا الجنوبية", "name:as"=>"দক্ষিণ কোৰিয়া", "name:az"=>"Cənubi Koreya", "name:ba"=>"Көньяҡ Корея", "name:be"=>"Паўднёвая Карэя", "name:bg"=>"Южна Корея", "name:bi"=>"Saot Koria", "name:bn"=>"দক্ষিণ কোরিয়া", "name:bo"=>"ལྷོ་ཀོ་རི་ཡ།", "name:br"=>"Korea ar Su", "name:bs"=>"Južna Koreja", "name:ca"=>"Corea del Sud", "name:ce"=>"Къилба Корей", "name:cs"=>"Jižní Korea", "name:cy"=>"De Corea", "name:da"=>"Sydkorea", "name:de"=>"Südkorea", "name:dv"=>"ދެކުނު ކޮރެއާ", "name:dz"=>"ལྷོ་ཀོ་རི་ཡ་", "name:ee"=>"South Korea", "name:el"=>"Νότια Κορέα", "name:en"=>"South Korea", "name:eo"=>"Sud-Koreio", "name:es"=>"Corea del Sur", "name:et"=>"Lõuna-Korea", "name:eu"=>"Hego Korea", "name:fa"=>"کره جنوبی", "name:fi"=>"Etelä-Korea", "name:fo"=>"Suðurkorea", "name:fr"=>"Corée du Sud", "name:fy"=>"Súd-Korea", "name:ga"=>"An Chóiré Theas", "name:gd"=>"Coirea a Deas", "name:gl"=>"Corea do Sur", "name:gn"=>"Yvykorea", "name:gu"=>"દક્ષિણ કોરિયા", "name:gv"=>"Yn Chorea Yiass", "name:he"=>"קוריאה הדרומית", "name:hi"=>"दक्षिण कोरिया", "name:hr"=>"Južna Koreja", "name:ht"=>"Kore disid", "name:hu"=>"Dél-Korea", "name:hy"=>"Հարավային Կորեա", "name:ia"=>"Corea del Sud", "name:id"=>"Korea Selatan", "name:ie"=>"Sud-Korea", "name:io"=>"Sud-Korea", "name:is"=>"Suður-Kórea", "name:it"=>"Corea del Sud", "name:ja"=>"大韓民国", "name:jv"=>"Koréa Kidul", "name:ka"=>"სამხრეთი კორეა", "name:ki"=>"South Korea", "name:kk"=>"Оңтүстік Корея", "name:kl"=>"Korea Kujalleq", "name:km"=>"កូរ៉េខាងត្បូង", "name:kn"=>"ದಕ್ಷಿಣ ಕೊರಿಯಾ", "name:ko"=>"대한민국", "name:ks"=>"दक्षिण कोरिया", "name:ku"=>"Korêya Başûr", "name:kv"=>"Корея Республика", "name:kw"=>"Korea Dhyhow", "name:ky"=>"Корея Республикасы", "name:la"=>"Corea Meridionalis", "name:lb"=>"Südkorea", "name:li"=>"Zuud-Korea", "name:ln"=>"Kore ya Sidi", "name:lo"=>"ປະເທດເກົາຫຼີໃຕ້", "name:lt"=>"Pietų Korėja", "name:lv"=>"Dienvidkoreja", "name:mg"=>"Korea Atsimo", "name:mi"=>"Kōrea-ki-te-tonga", "name:mk"=>"Република Кореја", "name:ml"=>"ദക്ഷിണ കൊറിയ", "name:mn"=>"Өмнөд Солонгос", "name:mr"=>"दक्षिण कोरिया", "name:ms"=>"Korea Selatan", "name:mt"=>"Korea t'Isfel", "name:my"=>"တောင်ကိုရီးယားနိုင်ငံ", "name:na"=>"Ripubrikin Korea", "name:ne"=>"दक्षिण कोरिया", "name:nl"=>"Zuid-Korea", "name:nn"=>"Sør-Korea", "name:no"=>"Sør-Korea", "name:nv"=>"Kolíya Bikéyah Shádiʼááhjí Siʼánígíí", "name:oc"=>"Corèa del Sud", "name:or"=>"ଦକ୍ଷିଣ କୋରିଆ", "name:os"=>"Хуссар Корей", "name:pl"=>"Korea Południowa", "name:ps"=>"سوېلي کوريا", "name:pt"=>"Coreia do Sul", "name:qu"=>"Urin Kuriya", "name:rm"=>"Corea dal sid", "name:ro"=>"Coreea de Sud", "name:ru"=>"Республика Корея", "name:rw"=>"Koreya y’Amajyepfo", "name:sa"=>"दक्षिण कोरिया", "name:sc"=>"Corea de su Sud", "name:se"=>"Lulli-Korea", "name:sg"=>"Korëe tî Mbongo", "name:sh"=>"Južna Koreja", "name:si"=>"දකුණු කොරියාව", "name:sk"=>"Južná Kórea", "name:sl"=>"Južna Koreja", "name:sm"=>"Kolea i Saute", "name:sn"=>"Korea, South", "name:so"=>"Koonfur Kuuriya", "name:sq"=>"Koreja e Jugut", "name:sr"=>"Јужна Кореја", "name:ss"=>"IKhoriya leseNingizimu", "name:su"=>"Koréa Kidul", "name:sv"=>"Sydkorea", "name:sw"=>"Korea Kusini", "name:ta"=>"தென்கொரியா", "name:te"=>"దక్షిణ కొరియా", "name:th"=>"ประเทศเกาหลีใต้", "name:tk"=>"Günorta Koreýa", "name:tl"=>"Timog Korea", "name:tr"=>"Güney Kore", "name:tt"=>"Көньяк Корея", "name:ug"=>"جەنۇبىي چاۋشيەن", "name:uk"=>"Південна Корея", "name:ur"=>"جنوبی کوریا", "name:uz"=>"Janubiy Koreya", "name:vi"=>"Hàn Quốc", "name:vo"=>"Sulüda-Koreyän", "name:wo"=>"Kore gu Bëj-saalum", "name:yi"=>"דרום קארעע", "name:yo"=>"Kòréà Gúúsù", "name:za"=>"Hanzgoz", "name:zh"=>"韩国/南韓"
-ye     "name"=>"اليمن", "name:af"=>"Jemen", "name:am"=>"የመን (አገር)", "name:an"=>"Yemen", "name:ar"=>"اليمن", "name:az"=>"Yəmən", "name:ba"=>"Йемен", "name:be"=>"Емен", "name:bg"=>"Йемен", "name:bn"=>"ইয়েমেন", "name:bo"=>"ཡེ་མེན།", "name:br"=>"Yemen", "name:bs"=>"Jemen", "name:ca"=>"Iemen", "name:ce"=>"Йемен", "name:co"=>"Yemen", "name:cs"=>"Jemen", "name:cv"=>"Йемен", "name:cy"=>"Yemen", "name:da"=>"Yemen", "name:de"=>"Jemen", "name:dv"=>"ޔަމަން", "name:el"=>"Υεμένη", "name:en"=>"Yemen", "name:eo"=>"Jemeno", "name:es"=>"Yemen", "name:et"=>"Jeemen", "name:eu"=>"Yemen", "name:fa"=>"یمن", "name:fi"=>"Jemen", "name:fo"=>"Jemen", "name:fr"=>"Yémen", "name:fy"=>"Jemen", "name:ga"=>"Poblacht Éimin", "name:gd"=>"Iemen", "name:gl"=>"Iemen - اليمن", "name:gn"=>"Jemẽ", "name:gu"=>"યેમેન", "name:gv"=>"Yn Yeaman", "name:he"=>"תימן", "name:hi"=>"यमन", "name:hr"=>"Jemen", "name:ht"=>"Yemèn", "name:hu"=>"Jemen", "name:hy"=>"Եմեն", "name:ia"=>"Yemen", "name:id"=>"Yaman", "name:ie"=>"Yemen", "name:io"=>"Yemen", "name:is"=>"Jemen", "name:it"=>"Yemen", "name:ja"=>"イエメン", "name:jv"=>"Yaman", "name:ka"=>"იემენი", "name:ki"=>"Yemen", "name:kk"=>"Йемен", "name:kl"=>"Yemen", "name:kn"=>"ಯೆಮೆನ್", "name:ko"=>"예멘", "name:ks"=>"یَمَن", "name:ku"=>"Yemen", "name:kv"=>"Йемен", "name:kw"=>"Yemen", "name:ky"=>"Йемен", "name:la"=>"Iemenia", "name:lb"=>"Jemen", "name:li"=>"Jeme", "name:ln"=>"Yeméni", "name:lt"=>"Jemenas", "name:lv"=>"Jemena", "name:mk"=>"Јемен", "name:ml"=>"യെമൻ", "name:mn"=>"Йемен", "name:mr"=>"येमेनचे प्रजासत्ताक", "name:ms"=>"Yaman", "name:mt"=>"Jemen", "name:my"=>"ယီမင်နိုင်ငံ", "name:na"=>"Yemen", "name:ne"=>"गणतन्त्र यमन", "name:nl"=>"Jemen", "name:nn"=>"Jemen", "name:no"=>"Jemen", "name:nv"=>"Shádiʼááhjí Ásáí Bikéyah", "name:oc"=>"Iemèn", "name:or"=>"ୟେମେନ", "name:os"=>"Йемен", "name:pa"=>"ਯਮਨ", "name:pl"=>"Jemen", "name:ps"=>"یمن", "name:pt"=>"Iémen", "name:qu"=>"Yaman", "name:ro"=>"Yemen", "name:ru"=>"Йемен", "name:rw"=>"Yemeni", "name:sa"=>"यमन", "name:sd"=>"يمن", "name:se"=>"Jemen", "name:sh"=>"Jemen", "name:sk"=>"Jemen", "name:sl"=>"Jemen", "name:so"=>"Yemen", "name:sq"=>"Jemeni", "name:sr"=>"Јемен", "name:ss"=>"IYemeni", "name:su"=>"Yaman", "name:sv"=>"Jemen", "name:sw"=>"Yemen", "name:ta"=>"யெமன்", "name:te"=>"యెమన్", "name:tg"=>"Яман", "name:th"=>"ประเทศเยเมน", "name:tk"=>"Ýemen", "name:tl"=>"Yemen", "name:tr"=>"Yemen", "name:tt"=>"Йәмән", "name:ug"=>"يەمەن", "name:uk"=>"Ємен", "name:ur"=>"یمن", "name:uz"=>"Yaman", "name:vi"=>"Yemen", "name:vo"=>"Yämän", "name:wo"=>"Yaman", "name:yi"=>"תימן", "name:yo"=>"Yemen", "name:zh"=>"也门", "name:zu"=>"IYemen"
-gt     "name"=>"Guatemala", "name:af"=>"Guatemala", "name:am"=>"ጓቴማላ", "name:an"=>"Guatemala", "name:ar"=>"غواتيمالا", "name:ay"=>"Watimala", "name:az"=>"Qvatemala", "name:ba"=>"Гватемала", "name:be"=>"Гватэмала", "name:bg"=>"Гватемала", "name:bm"=>"Gatemala", "name:bn"=>"গুয়াতেমালা", "name:bo"=>"གུ་ཝེ་ཐི་མ་ལ།", "name:br"=>"Guatemala", "name:bs"=>"Gvatemala", "name:ca"=>"Guatemala", "name:ce"=>"Гватемала", "name:cs"=>"Guatemala", "name:cy"=>"Guatemala", "name:da"=>"Guatemala", "name:de"=>"Guatemala", "name:dv"=>"ގުއަޓެމާލާ", "name:ee"=>"Guatemala", "name:el"=>"Γουατεμάλα", "name:en"=>"Guatemala", "name:eo"=>"Gvatemalo", "name:es"=>"Guatemala", "name:et"=>"Guatemala", "name:eu"=>"Guatemala", "name:fa"=>"گواتمالا", "name:fi"=>"Guatemala", "name:fo"=>"Guatemala", "name:fr"=>"Guatemala", "name:fy"=>"Gûatemala", "name:ga"=>"Guatamala", "name:gd"=>"Guatamala", "name:gl"=>"Guatemala", "name:gn"=>"Guatemala", "name:gv"=>"Yn Ghuatemaley", "name:he"=>"גואטמלה", "name:hi"=>"ग्वाटेमाला", "name:hr"=>"Gvatemala", "name:ht"=>"Gwatemala", "name:hu"=>"Guatemala", "name:hy"=>"Գվատեմալա", "name:ia"=>"Guatemala", "name:id"=>"Guatemala", "name:ie"=>"Guatemala", "name:io"=>"Guatemala", "name:is"=>"Gvatemala", "name:it"=>"Guatemala", "name:ja"=>"グアテマラ", "name:jv"=>"Guatemala", "name:ka"=>"გვატემალა", "name:kk"=>"Гватемала", "name:km"=>"ហ្គាតេម៉ាឡា", "name:kn"=>"ಗ್ವಾಟೆಮಾಲ", "name:ko"=>"과테말라", "name:ku"=>"Guatemala", "name:kw"=>"Gwatemala", "name:la"=>"Guatimalia", "name:lb"=>"Guatemala", "name:li"=>"Guatemala", "name:ln"=>"Gwatemala", "name:lt"=>"Gvatemala", "name:lv"=>"Gvatemala", "name:mg"=>"Goatemala", "name:mi"=>"Kuatamāra", "name:mk"=>"Гватемала", "name:ml"=>"ഗ്വാട്ടിമാല", "name:mn"=>"Гватемал", "name:mr"=>"ग्वातेमाला", "name:ms"=>"Guatemala", "name:mt"=>"Gwatemala", "name:my"=>"ဂွါတီမာလာနိုင်ငံ", "name:na"=>"Guatemara", "name:ne"=>"ग्वाटेमाला", "name:nl"=>"Guatemala", "name:nn"=>"Guatemala", "name:no"=>"Guatemala", "name:oc"=>"Guatemala", "name:os"=>"Гватемалæ", "name:pa"=>"ਗੁਆਤੇਮਾਲਾ", "name:pl"=>"Gwatemala", "name:ps"=>"ګواتمالا", "name:pt"=>"Guatemala", "name:qu"=>"Watimala", "name:ro"=>"Guatemala", "name:ru"=>"Гватемала", "name:rw"=>"Gwatemala", "name:sa"=>"ग्वाटेमाला", "name:se"=>"Guatemala", "name:sh"=>"Gvatemala", "name:sk"=>"Guatemala", "name:sl"=>"Gvatemala", "name:sm"=>"Tuatemala", "name:so"=>"Guatemala", "name:sq"=>"Guatemala", "name:sr"=>"Гватемала", "name:ss"=>"IGwathamala", "name:su"=>"Guatémala", "name:sv"=>"Guatemala", "name:sw"=>"Guatemala", "name:ta"=>"குவாத்தமாலா", "name:tg"=>"Гуатемала", "name:th"=>"ประเทศกัวเตมาลา", "name:tl"=>"Guwatemala", "name:tr"=>"Guatemala", "name:tt"=>"Гватемала", "name:ug"=>"گۋاتېمالا", "name:uk"=>"Гватемала", "name:ur"=>"گوئٹے مالا", "name:uz"=>"Gvatemala", "name:vi"=>"Guatemala", "name:vo"=>"Gvatemän", "name:wo"=>"Guwaatemala", "name:yi"=>"גוואטעמאלע", "name:yo"=>"Guatẹmálà", "name:zh"=>"危地马拉", "name:zu"=>"Guatemala"
-pg     "name"=>"Papua Niugini", "name:af"=>"Papoea-Nieu-Guinee", "name:am"=>"ፓፑዋ ኒው ጊኒ", "name:an"=>"Papua y Nueva Guinea", "name:ar"=>"بابوا غينيا الجديدة", "name:az"=>"Papua-Yeni Qvineya", "name:ba"=>"Папуа — Яңы Гвинея", "name:be"=>"Папуа — Новая Гвінея", "name:bg"=>"Папуа Нова Гвинея", "name:bi"=>"Papua New Guinea", "name:bn"=>"পাপুয়া নিউ গিনি", "name:bo"=>"པ་པུ་འ་ནིའུ་གི་ནེ།", "name:br"=>"Papoua Ginea-Nevez", "name:bs"=>"Papua Nova Gvineja", "name:ca"=>"Papua Nova Guinea", "name:ce"=>"Папуа — Керла Гвине", "name:cs"=>"Papua Nová Guinea", "name:cu"=>"Папоуа · Нова Гвинєꙗ", "name:cy"=>"Papua Guinea Newydd", "name:da"=>"Papua Ny Guinea", "name:de"=>"Papua-Neuguinea", "name:dv"=>"ޕަޕުއާ ނިއު ގިނީ", "name:el"=>"Παπούα Νέα Γουινέα", "name:en"=>"Papua New Guinea", "name:eo"=>"Papuo-Nov-Gvineo", "name:es"=>"Papua-Nueva Guinea", "name:et"=>"Paapua Uus-Guinea", "name:eu"=>"Papua Ginea Berria", "name:fa"=>"پاپوآ گینه نو", "name:fi"=>"Papua-Uusi-Guinea", "name:fo"=>"Papua Nýguinea", "name:fr"=>"Papouasie-Nouvelle-Guinée", "name:fy"=>"Papoea Nij-Guineä", "name:ga"=>"Nua-Ghuine Phapua", "name:gd"=>"Gini Nuadh Phaputhach", "name:gl"=>"Papúa Nova Guinea", "name:gv"=>"Papooey Guinea Noa", "name:he"=>"פפואה גינאה החדשה", "name:hi"=>"पापुआ न्यू गिनी", "name:hr"=>"Papua Nova Gvineja", "name:ht"=>"Papwazi-Nouvèl-Gine", "name:hu"=>"Pápua Új-Guinea", "name:hy"=>"Պապուա Նոր Գվինեա", "name:ia"=>"Papua Nove Guinea", "name:id"=>"Papua Nugini", "name:io"=>"Papua-Nova-Guinea", "name:is"=>"Papúa Nýja-Gínea", "name:it"=>"Papua Nuova Guinea", "name:ja"=>"パプアニューギニア", "name:jv"=>"Papua Nugini", "name:ka"=>"პაპუა-ახალი გვინეა", "name:kk"=>"Папуа Жаңа Гвинея", "name:kn"=>"ಪಾಪುಅ ನ್ಯೂ ಗಿನಿ", "name:ko"=>"파푸아 뉴기니", "name:ku"=>"Papua Gîneya Nû", "name:ky"=>"Папуа-Жаӊы-Гвинея.", "name:la"=>"Papua Nova Guinea", "name:lb"=>"Papua-Neiguinea", "name:li"=>"Papoea-Nui-Guinea", "name:lt"=>"Papua Naujoji Gvinėja", "name:lv"=>"Papua-Jaungvineja", "name:mi"=>"Papua Nūkini", "name:mk"=>"Папуа Нова Гвинеја", "name:ml"=>"പാപുവ ന്യൂ ഗിനിയ", "name:mn"=>"Папуа-Шинэ Гвиней", "name:mr"=>"पापुआ न्यू गिनी", "name:ms"=>"Papua New Guinea", "name:mt"=>"Papwa Gwinea l-Ġdida", "name:my"=>"ပါပူအာနယူးဂီနီနိုင်ငံ", "name:na"=>"Papua New Guinea", "name:nl"=>"Papoea-Nieuw-Guinea", "name:nn"=>"Papua Ny-Guinea", "name:no"=>"Papua Ny-Guinea", "name:nv"=>"Páápowa Bigíní Ániidí", "name:oc"=>"Papoa-Nòva Guinèa", "name:os"=>"Папуæ — Ног Гвиней", "name:pa"=>"ਪਾਪੂਆ ਨਿਊ ਗਿਨੀ", "name:pl"=>"Papua-Nowa Gwinea", "name:pt"=>"Papua-Nova Guiné", "name:qu"=>"Papwa Ñukini", "name:ro"=>"Papua Noua Guinee", "name:ru"=>"Папуа - Новая Гвинея", "name:rw"=>"Papuwa Nuveli Gineya", "name:sa"=>"पपुवा न्यू गिनी", "name:se"=>"Papua-Ođđa-Guinea", "name:sg"=>"Papû Finî Ginëe", "name:sh"=>"Papua Nova Gvineja", "name:sk"=>"Papua-Nová Guinea", "name:sl"=>"Papua Nova Gvineja", "name:sm"=>"Papua", "name:sq"=>"Papua Guinea e Re", "name:sr"=>"Папуа Нова Гвинеја", "name:su"=>"Papua Nugini", "name:sv"=>"Papua Nya Guinea", "name:sw"=>"Papua Guinea Mpya", "name:ta"=>"பப்புவா நியூ கினி", "name:th"=>"ประเทศปาปัวนิวกินี", "name:tl"=>"Papua Bagong Ginea", "name:tr"=>"Papua Yeni Gine", "name:tt"=>"Папуа — Яңа Гвинея", "name:ug"=>"پاپۇئا يېڭى گۋىنېيە", "name:uk"=>"Папуа Нова Ґвінея", "name:ur"=>"پاپوا نیو گنی", "name:uz"=>"Papua Yangi Gvineya", "name:vi"=>"Papua New Guinea", "name:vo"=>"Papuveän Nula-Gineyän", "name:wo"=>"Papuwaasi-Gine-Gu-Bees", "name:yo"=>"Papua Guinea Titun", "name:zh"=>"巴布亚新几内亚 / 巴布亞紐幾內亞 / 巴布亞新畿內亞"
-lu     "name"=>"Lëtzebuerg", "name:af"=>"Luxemburg", "name:am"=>"ሉክሰምበርግ", "name:an"=>"Luxemburgo", "name:ar"=>"لوكسمبورغ", "name:az"=>"Lüksemburq", "name:ba"=>"Люксембург", "name:be"=>"Люксембург", "name:bg"=>"Люксембург", "name:bi"=>"Luxembourg", "name:bn"=>"লুক্সেমবুর্গ", "name:bo"=>"ལུ་སེམ་བའུརག", "name:br"=>"Luksembourg", "name:bs"=>"Luksemburg", "name:ca"=>"Luxemburg", "name:ce"=>"Люксембург", "name:co"=>"Lussemburgu", "name:cs"=>"Lucembursko", "name:cu"=>"Люѯємбоургъ", "name:cv"=>"Люксембург", "name:cy"=>"Lwcsembwrg", "name:da"=>"Luxembourg", "name:de"=>"Luxemburg", "name:ee"=>"Luxembourg", "name:el"=>"Λουξεμβούργο", "name:en"=>"Luxembourg", "name:eo"=>"Luksemburgio", "name:es"=>"Luxemburgo", "name:et"=>"Luksemburg", "name:eu"=>"Luxenburgo", "name:fa"=>"لوکزامبورگ", "name:fi"=>"Luxemburg", "name:fo"=>"Luksemburg", "name:fr"=>"Luxembourg", "name:fy"=>"Lúksemboarch", "name:ga"=>"Lucsamburg", "name:gd"=>"Lucsamburg", "name:gl"=>"Luxemburgo", "name:gn"=>"Luxemburgo", "name:gu"=>"લક્ઝેમ્બર્ગ", "name:gv"=>"Lucsemburg", "name:he"=>"לוקסמבורג", "name:hi"=>"लक्ज़मबर्ग", "name:hr"=>"Luksemburg", "name:ht"=>"Liksanbou", "name:hu"=>"Luxemburg", "name:hy"=>"Լյուքսեմբուրգ", "name:ia"=>"Luxemburg", "name:id"=>"Luksemburg", "name:ie"=>"Luxemburgia", "name:io"=>"Luxemburgia", "name:is"=>"Lúxemborg", "name:it"=>"Lussemburgo", "name:ja"=>"ルクセンブルク", "name:jv"=>"Luksemburg", "name:ka"=>"ლუქსემბურგი", "name:kg"=>"Luxembourg", "name:kk"=>"Люксембург", "name:kl"=>"Luxembourg", "name:ko"=>"룩셈부르크", "name:ku"=>"Lûksembûrg", "name:kv"=>"Люксембург", "name:kw"=>"Lushaborg", "name:ky"=>"Люксембург", "name:la"=>"Luxemburgum", "name:lb"=>"Lëtzebuerg", "name:li"=>"Luxembörg", "name:ln"=>"Luksamburg", "name:lt"=>"Liuksemburgas", "name:lv"=>"Luksemburga", "name:mg"=>"Loksemborga", "name:mi"=>"Rakapuō", "name:mk"=>"Луксембург", "name:ml"=>"ലക്സംബർഗ്", "name:mn"=>"Люксембург", "name:mr"=>"लक्झेंबर्ग", "name:ms"=>"Luxembourg", "name:mt"=>"Lussemburgu", "name:my"=>"လူဇင်ဘတ်နိုင်ငံ", "name:na"=>"Ruketemburg", "name:ne"=>"लक्जेम्बर्ग", "name:nl"=>"Luxemburg", "name:nn"=>"Luxembourg", "name:no"=>"Luxembourg", "name:nv"=>"Látsębooʼ", "name:oc"=>"Luxemborg", "name:or"=>"ଲକ୍ସମବର୍ଗ", "name:os"=>"Люксембург", "name:pa"=>"ਲਕਸਮਬਰਗ", "name:pl"=>"Luksemburg", "name:ps"=>"لوګزامبورګ", "name:pt"=>"Luxemburgo", "name:qu"=>"Luksimbur", "name:rm"=>"Luxemburg", "name:ro"=>"Luxemburg", "name:ru"=>"Люксембург", "name:rw"=>"Lugizamburu", "name:sa"=>"लक्सम्बर्ग", "name:sc"=>"Lussemburgu", "name:se"=>"Luxemburg", "name:sh"=>"Luksemburg", "name:sk"=>"Luxembursko", "name:sl"=>"Luksemburg", "name:so"=>"Luksemburg", "name:sq"=>"Luksemburgu", "name:sr"=>"Луксембург", "name:ss"=>"Lusembogu", "name:su"=>"Luksemburg", "name:sv"=>"Luxemburg", "name:sw"=>"Luxemburg", "name:ta"=>"லக்சம்பர்க்", "name:tg"=>"Люксембург", "name:th"=>"ประเทศลักเซมเบิร์ก", "name:tk"=>"Lýuksemburg", "name:tl"=>"Luxembourg", "name:tr"=>"Lüksemburg", "name:tt"=>"Люксембург", "name:ug"=>"ليۇكسېمبۇرگ", "name:uk"=>"Люксембург", "name:ur"=>"لکسمبرگ", "name:uz"=>"Luksemburg", "name:vi"=>"Luxembourg", "name:vo"=>"Luxämburgän", "name:wa"=>"Grande-Dutcheye do Lussimbork", "name:wo"=>"Luksambuur", "name:yi"=>"לוקסעמבורג", "name:yo"=>"Lúksẹ́mbọ̀rg", "name:zh"=>"盧森堡"
-vn     "name"=>"Việt Nam", "name:af"=>"Viëtnam", "name:ak"=>"Vietnam", "name:am"=>"ቬት ናም", "name:an"=>"Vietnam", "name:ar"=>"فيتنام", "name:av"=>"Вьетнам", "name:ay"=>"Vietnam", "name:az"=>"Vyetnam", "name:ba"=>"Вьетнам", "name:be"=>"В'етнам", "name:bg"=>"Виетнам", "name:bi"=>"Vietnam", "name:bm"=>"Vietnam", "name:bn"=>"ভিয়েতনাম", "name:bo"=>"ཝི་ཏི་ནམ།", "name:br"=>"Viêt Nam", "name:bs"=>"Vijetnam", "name:ca"=>"Vietnam", "name:ce"=>"Вьетнам", "name:ch"=>"Vietnam", "name:cs"=>"Vietnam", "name:cv"=>"Вьетнам", "name:cy"=>"Fietnam", "name:da"=>"Vietnam", "name:de"=>"Vietnam", "name:dv"=>"ވިއެޓުނާމު", "name:ee"=>"Vietnam", "name:el"=>"Βιετνάμ", "name:en"=>"Vietnam", "name:eo"=>"Vjetnamio", "name:es"=>"Vietnam", "name:et"=>"Vietnam", "name:eu"=>"Vietnam", "name:fa"=>"ویتنام", "name:ff"=>"Vietnam", "name:fi"=>"Vietnam", "name:fo"=>"Vjetnam", "name:fr"=>"Viêt Nam", "name:fy"=>"Fjetnam", "name:ga"=>"Vítneam", "name:gd"=>"Bhiet-Nam", "name:gl"=>"Vietnam", "name:gn"=>"Vietnam", "name:gu"=>"વિયેતનામ", "name:gv"=>"Yn Vietnam", "name:he"=>"וייטנאם", "name:hi"=>"वियतनाम", "name:hr"=>"Vijetnam", "name:ht"=>"Vyetnam", "name:hu"=>"Vietnám", "name:hy"=>"Վիետնամ", "name:ia"=>"Vietnam", "name:id"=>"Vietnam", "name:ie"=>"Viet-Nam", "name:ik"=>"Vietnam", "name:io"=>"Vietnam", "name:is"=>"Víetnam", "name:it"=>"Vietnam", "name:ja"=>"ベトナム", "name:jv"=>"Viètnam", "name:ka"=>"ვიეტნამი", "name:kg"=>"Vietnam", "name:ki"=>"Vietnam", "name:kk"=>"Вьетнам", "name:kl"=>"Vietnam", "name:km"=>"វៀតណាម", "name:kn"=>"ವಿಯೆಟ್ನಾಮ್", "name:ko"=>"베트남", "name:ku"=>"Viyetnam", "name:kv"=>"Вьетнам", "name:kw"=>"Vietnam", "name:ky"=>"Вьетнам", "name:la"=>"Vietnamia", "name:lb"=>"Vietnam", "name:li"=>"Vietnam", "name:ln"=>"Vietnami", "name:lo"=>"ປະເທດຫວຽດນາມ", "name:lt"=>"Vietnamas", "name:lv"=>"Vjetnama", "name:mg"=>"Vietnam", "name:mi"=>"Witināma", "name:mk"=>"Виетнам", "name:ml"=>"വിയറ്റ്നാം", "name:mn"=>"Вьетнам", "name:mr"=>"व्हियेतनाम", "name:ms"=>"Vietnam", "name:mt"=>"Vjetnam", "name:my"=>"ဗီယက်နမ်နိုင်ငံ", "name:na"=>"Bitinam", "name:ne"=>"भियतनाम", "name:nl"=>"Vietnam", "name:nn"=>"Vietnam", "name:no"=>"Vietnam", "name:nv"=>"Biʼednam", "name:oc"=>"Vietnam", "name:om"=>"Veetinaam", "name:or"=>"ଭିଏତନାମ", "name:os"=>"Вьетнам", "name:pa"=>"ਵੀਅਤਨਾਮ", "name:pl"=>"Wietnam", "name:pt"=>"Vietname", "name:qu"=>"Witnam", "name:rm"=>"Vietnam", "name:rn"=>"Vietnam", "name:ro"=>"Vietnam", "name:ru"=>"Вьетнам", "name:rw"=>"Viyetinamu", "name:sa"=>"चम्पादेश", "name:sc"=>"Vietnam", "name:se"=>"Vietnam", "name:sh"=>"Vijetnam", "name:si"=>"වියට්නාමය", "name:sk"=>"Vietnam", "name:sl"=>"Vietnam", "name:sm"=>"Vietnam", "name:sn"=>"Vietnam", "name:so"=>"Fiyetnam", "name:sq"=>"Vietnami", "name:sr"=>"Вијетнам", "name:ss"=>"IViyethina", "name:st"=>"Vietnam", "name:su"=>"Viétnam", "name:sv"=>"Vietnam", "name:sw"=>"Vietnam", "name:ta"=>"வியட்நாம்", "name:te"=>"వియత్నాం", "name:tg"=>"Ветнам", "name:th"=>"ประเทศเวียดนาม", "name:tk"=>"Wýetnam", "name:tl"=>"Vietnam", "name:tr"=>"Vietnam", "name:tt"=>"Вьетнам", "name:tw"=>"Vietnam", "name:ug"=>"ۋيېتنام", "name:uk"=>"В'єтнам", "name:ur"=>"ویتنام", "name:uz"=>"Vyetnam", "name:ve"=>"Viëtnam", "name:vi"=>"Việt Nam", "name:vo"=>"Vietnamän", "name:wa"=>"Vietnam", "name:wo"=>"Wiyetnaam", "name:yi"=>"וויעטנאם", "name:yo"=>"Fiẹtnám", "name:za"=>"Yiednamz", "name:zh"=>"越南", "name:zu"=>"IViyetnami"
-tr     "name"=>"Türkiye", "name:ab"=>"Ҭырқәтәыла", "name:af"=>"Turkye", "name:ak"=>"Turki", "name:am"=>"ቱርክ", "name:an"=>"Turquía", "name:ar"=>"تركيا", "name:av"=>"Туркия", "name:ay"=>"Turkiya", "name:az"=>"Türkiyə", "name:ba"=>"Төркиә", "name:be"=>"Турцыя", "name:bg"=>"Турция", "name:bi"=>"Turkey", "name:bn"=>"তুরস", "name:bo"=>"ཏུར་ཀི།", "name:br"=>"Turkia", "name:bs"=>"Turska", "name:ca"=>"Turquia", "name:ce"=>"Туркойчоь", "name:cs"=>"Turecko", "name:cu"=>"Тѷрци", "name:cv"=>"Турци", "name:cy"=>"Twrci", "name:da"=>"Tyrkiet", "name:de"=>"Türkei", "name:dv"=>"ތުރުކީވިލާތް", "name:ee"=>"Turkey", "name:el"=>"Τουρκία", "name:en"=>"Turkey", "name:eo"=>"Turkio", "name:es"=>"Turquía", "name:et"=>"Türgi", "name:eu"=>"Turkia", "name:fa"=>"ترکیه", "name:fi"=>"Turkki", "name:fo"=>"Turkaland", "name:fr"=>"Turquie", "name:fy"=>"Turkije", "name:ga"=>"An Tuirc", "name:gd"=>"An Tuirc", "name:gl"=>"Turquía", "name:gn"=>"Tuykia", "name:gu"=>"તુર્કસ્તાન", "name:gv"=>"Yn Turkee", "name:ha"=>"Turkiyya", "name:he"=>"טורקיה", "name:hi"=>"तुर्की", "name:hr"=>"Turska", "name:ht"=>"Tiki", "name:hu"=>"Törökország", "name:hy"=>"Թուրքիա", "name:ia"=>"Turchia", "name:id"=>"Turki", "name:ie"=>"Turcia", "name:ik"=>"Turkey", "name:io"=>"Turkia", "name:is"=>"Tyrkland", "name:it"=>"Turchia", "name:ja"=>"トルコ", "name:jv"=>"Turki", "name:ka"=>"თურქეთი", "name:kg"=>"Turki", "name:ki"=>"Turkey", "name:kk"=>"Түркия", "name:kl"=>"Tyrkia", "name:kn"=>"ಟರ್ಕಿ", "name:ko"=>"터키", "name:ku"=>"Tirkiye", "name:kv"=>"Турция", "name:kw"=>"Turki", "name:ky"=>"Түркия Республикасы", "name:la"=>"Turcia", "name:lb"=>"Tierkei", "name:lg"=>"Buturuki", "name:li"=>"Turkije", "name:ln"=>"Turkí", "name:lt"=>"Turkija", "name:lv"=>"Turcija", "name:mg"=>"Torkia", "name:mi"=>"Tākei", "name:mk"=>"Турција", "name:ml"=>"തുർക്കി", "name:mn"=>"Турк", "name:mr"=>"तुर्कस्तान", "name:ms"=>"Turki", "name:mt"=>"Turkija", "name:my"=>"တူရကီနိုင်ငံ", "name:na"=>"Terki", "name:ne"=>"टर्की", "name:nl"=>"Turkije", "name:nn"=>"Tyrkia", "name:no"=>"Tyrkia", "name:nv"=>"Tʼóok Bikéyah", "name:oc"=>"Turquia", "name:or"=>"ତୁର୍କୀ", "name:os"=>"Турк", "name:pa"=>"ਤੁਰਕੀ", "name:pl"=>"Turcja", "name:ps"=>"تورکيه", "name:pt"=>"Turquia", "name:qu"=>"Turkiya", "name:rm"=>"Tirchia", "name:rn"=>"Turukiya", "name:ro"=>"Turcia", "name:ru"=>"Турция", "name:rw"=>"Turukiya", "name:sa"=>"तुर्की", "name:sc"=>"Turkia", "name:se"=>"Durka", "name:sh"=>"Turska", "name:si"=>"තුර්කිය", "name:sk"=>"Turecko", "name:sl"=>"Turčija", "name:so"=>"Turki", "name:sq"=>"Turqia", "name:sr"=>"Турска", "name:ss"=>"IThekhi", "name:su"=>"Turki", "name:sv"=>"Turkiet", "name:sw"=>"Uturuki", "name:ta"=>"துருக்கி", "name:te"=>"టర్కీ", "name:tg"=>"Туркия", "name:th"=>"ประเทศตุรกี", "name:tk"=>"Türkiýe", "name:tl"=>"Turkiya", "name:tr"=>"Türkiye", "name:tt"=>"Төркия", "name:tw"=>"Turkey", "name:ug"=>"تۈركىيە جۇمھۇرىيىتى", "name:uk"=>"Туреччина", "name:ur"=>"ترکی", "name:uz"=>"Turkiya", "name:vi"=>"Thổ Nhĩ Kỳ", "name:vo"=>"Türkän", "name:wa"=>"Tourkeye", "name:wo"=>"Tirki", "name:yi"=>"טערקיי", "name:yo"=>"Túrkì", "name:za"=>"Dujwjgiz", "name:zh"=>"土耳其", "name:zu"=>"ITheki"
-sz     "name"=>"eSwatini", "name:af"=>"Swaziland", "name:am"=>"ስዋዚላንድ", "name:an"=>"Swazilandia", "name:ar"=>"سوازيلاند", "name:ay"=>"Suasïsuiu", "name:az"=>"Svazilend", "name:ba"=>"Свазиленд", "name:be"=>"Эсваціні", "name:bg"=>"Есватини", "name:bm"=>"Swazilandi", "name:bn"=>"সোয়াজিল্যান্ড", "name:bo"=>"སུ་ཝ་ཛི་ལནཌ།", "name:br"=>"Swaziland", "name:bs"=>"Svazilend", "name:ca"=>"Swazilàndia", "name:cs"=>"Svazijsko", "name:cy"=>"Gwlad Swazi", "name:da"=>"Swaziland", "name:de"=>"Eswatini", "name:dv"=>"ސުވާޒިލޭންޑު", "name:dz"=>"སུ་ཝ་ཛི་ལེནཌ", "name:ee"=>"Swaziland", "name:el"=>"Σουαζιλάνδη", "name:en"=>"Eswatini", "name:eo"=>"Svazilando", "name:es"=>"Suazilandia", "name:et"=>"Svaasimaa", "name:eu"=>"Swazilandia", "name:fa"=>"سوازیلند", "name:ff"=>"Swaasilannda", "name:fi"=>"Swazimaa", "name:fo"=>"Svasiland", "name:fr"=>"Swaziland", "name:fy"=>"Swazilân", "name:ga"=>"An tSuasalainn", "name:gd"=>"Dùthaich nan Suasaidh", "name:gl"=>"Suacilandia - Swaziland", "name:gu"=>"સ્વાઝીલેન્ડ", "name:gv"=>"Yn Çheer Swassee", "name:ha"=>"Suwazilan", "name:he"=>"סווזילנד", "name:hi"=>"स्वाज़ीलैण्ड", "name:hr"=>"Svazi", "name:ht"=>"Swazilann", "name:hu"=>"Szváziföld", "name:hy"=>"Սվազիլենդ", "name:ia"=>"Swazilandia", "name:id"=>"Swaziland", "name:ie"=>"Swaziland", "name:io"=>"Swazilando", "name:is"=>"Svasíland", "name:it"=>"Swaziland", "name:ja"=>"スワジランド", "name:jv"=>"Swaziland", "name:ka"=>"სვაზილენდი", "name:kg"=>"Swati", "name:ki"=>"Uswazi", "name:kk"=>"Суазиланд", "name:kl"=>"Swazilandi", "name:km"=>"សូហ្ស៉ីឡង់", "name:kn"=>"ಸ್ವಾಜಿಲ್ಯಾಂಡ್", "name:ko"=>"스와질란드", "name:ks"=>"سُوزِلینٛڑ", "name:ku"=>"Swaziland", "name:kw"=>"Pow Swati", "name:la"=>"Swazia", "name:lb"=>"Swasiland", "name:lg"=>"Swazirandi", "name:li"=>"Swaziland", "name:ln"=>"Swaziland", "name:lo"=>"ສະວາຊິແລນ", "name:lt"=>"Svazilandas", "name:lv"=>"Svazilenda", "name:mg"=>"Soazilandy", "name:mi"=>"Warerangi", "name:mk"=>"Свазиленд", "name:ml"=>"സ്വാസിലാന്റ്", "name:mn"=>"Свазиланд", "name:mr"=>"स्वाझीलँड", "name:ms"=>"Swaziland", "name:mt"=>"Sważiland", "name:my"=>"ဆွာဇီလန်နိုင်ငံ", "name:ne"=>"स्वाजिल्याण्ड", "name:nl"=>"Swaziland", "name:nn"=>"Eswatini", "name:no"=>"Eswatini", "name:nv"=>"Swáazi Dineʼé Bikéyah", "name:oc"=>"Swaziland", "name:or"=>"ସ୍ଵାଜିଲ୍ୟାଣ୍ଡ", "name:os"=>"Свазиленд", "name:pa"=>"ਸਵਾਜ਼ੀਲੈਂਡ", "name:pl"=>"Eswatini", "name:ps"=>"سوازيلانډ", "name:pt"=>"eSwatini", "name:qu"=>"Swasisuyu", "name:rn"=>"Suwazilandi", "name:ro"=>"eSwatini", "name:ru"=>"Эсватини", "name:rw"=>"Swazilande", "name:sa"=>"स्वाजीलैंड", "name:sc"=>"Swaziland", "name:se"=>"Swazieana", "name:sg"=>"Swäzïlânde", "name:sh"=>"Svazilend", "name:si"=>"ස්වාසිලන්තය", "name:sk"=>"Svazijsko", "name:sl"=>"Esvatini", "name:sn"=>"Swaziland", "name:so"=>"Swasiland", "name:sq"=>"Suazilendi", "name:sr"=>"Есватини", "name:ss"=>"eSwatini", "name:su"=>"Swaziland", "name:sv"=>"Swaziland", "name:sw"=>"Uswazi", "name:ta"=>"சுவாசிலாந்து", "name:te"=>"స్వాజీలేండ్", "name:tg"=>"Свазиленд", "name:th"=>"ประเทศสวาซิแลนด์", "name:ti"=>"ስዋዚላንድ", "name:tk"=>"Swazilend", "name:tl"=>"Suwasilandya", "name:to"=>"Suasileni", "name:tr"=>"Esvatini", "name:ts"=>"Swaziland", "name:tt"=>"Свазиленд", "name:ug"=>"سۋازىلېند", "name:uk"=>"Есватіні", "name:ur"=>"سوازی لینڈ", "name:uz"=>"Svazilend", "name:ve"=>"Swazini", "name:vi"=>"Eswatini", "name:vo"=>"Svasiyän", "name:wo"=>"Suwaasilaand", "name:yi"=>"סוואזילאנד", "name:yo"=>"Swásílándì", "name:zh"=>"斯威士兰/斯威士蘭/史瓦濟蘭", "name:zu"=>"ISwazilandi"
-ae     "name"=>"الإمارات العربية المتحدة", "name:af"=>"Verenigde Arabiese Emirate", "name:am"=>"የተባበሩት የዓረብ ግዛቶች", "name:an"=>"Emiratos Arabes Unitos", "name:ar"=>"الإمارات العربية المتحدة", "name:av"=>"ГIарабазул Цолъарал Имаратал", "name:az"=>"Birləşmiş Ərəb Əmirlikləri", "name:be"=>"Аб'яднаныя Арабскія Эміраты", "name:bg"=>"Обединени арабски емирства", "name:bn"=>"সংযুক্ত আরব আমিরাত", "name:bo"=>"ཡི་ནེ་ཁྲེ་ཀྲི་ཨ་རབ་ཨེ་མེ་རེ་ཁྲི།", "name:br"=>"Emirelezhioù Arab Unanet", "name:bs"=>"Ujedinjeni Arapski Emirati", "name:ca"=>"Emirats Àrabs Units", "name:ce"=>"Ӏарбийн Цхьаьнакхетта Эмираташ", "name:cs"=>"Spojené arabské emiráty", "name:cy"=>"Yr Emiradau Arabaidd Unedig", "name:da"=>"Forenede Arabiske Emirater", "name:de"=>"Vereinigte Arabische Emirate", "name:dv"=>"އެކުވެރި ޢަރަބި އިމާރާތު", "name:dz"=>"ཡུ་ནའི་ཊེཊ་ཨ་རབ་ཨེ་མི་རེཊསི་", "name:el"=>"Ηνωμένα Αραβικά Εμιράτα", "name:en"=>"United Arab Emirates", "name:eo"=>"Unuiĝintaj Arabaj Emirlandoj", "name:es"=>"Emiratos Árabes Unidos", "name:et"=>"Araabia Ühendemiraadid", "name:eu"=>"Arabiar Emirerri Batuak", "name:fa"=>"امارات متحده عربی", "name:fi"=>"Yhdistyneet arabiemiirikunnat", "name:fo"=>"Sameindu Emirríkini", "name:fr"=>"Émirats arabes unis", "name:fy"=>"Feriene Arabyske Emiraten", "name:ga"=>"Aontas na nÉimíríochtaí Arabacha", "name:gd"=>"Na h-Iomaratan Arabach Aonaichte", "name:gl"=>"Emiratos Árabes Unidos", "name:gn"=>"Aravia Emiryvy Joaju", "name:gv"=>"Ny h-Emmiraidyn Arabagh Unnaneysit", "name:he"=>"איחוד האמירויות הערביות", "name:hi"=>"संयुक्त अरब अमीरात", "name:hr"=>"Ujedinjeni Arapski Emirati", "name:ht"=>"Emira Arab Ini", "name:hu"=>"Egyesült Arab Emírségek", "name:hy"=>"Արաբական Միացյալ Էմիրություններ", "name:ia"=>"Emiratos Arabe Unite", "name:id"=>"Uni Emirat Arab", "name:ie"=>"Unit Arabic Emiratus", "name:io"=>"Unionita Araba Emirati", "name:is"=>"Sameinuðu arabísku furstadæmin", "name:it"=>"Emirati Arabi Uniti", "name:ja"=>"アラブ首長国連邦", "name:jv"=>"Uni Emirat Arab", "name:ka"=>"არაბთა გაერთიანებული საამიროები", "name:ki"=>"United Arab Emirates", "name:kk"=>"Біріккен Араб Әмірліктері", "name:kl"=>"United Arab Emirates", "name:kn"=>"ಸಂಯುಕ್ತ ಅರಬ ಅಮೀರಾತ", "name:ko"=>"아랍에미리트", "name:ku"=>"Mîrnişînên Erebî yên Yekbûyî", "name:kv"=>"Ӧтувтчӧм Араб Эмиратъяс", "name:kw"=>"Pennternasedh Unys Arabek", "name:ky"=>"Бириккен Араб Эмирликтери", "name:la"=>"Phylarchiarum Arabicarum Confoederatio", "name:lb"=>"Vereenegt Arabesch Emiraten", "name:li"=>"Vereinegde Arabische Emiraote", "name:lt"=>"Jungtiniai Arabų Emyratai", "name:lv"=>"Apvienotie Arābu Emirāti", "name:mi"=>"Te Kotahitanga o ngā Whenua Ārapi", "name:mk"=>"Обединети Арапски Емирати", "name:ml"=>"ഐക്യ അറബ് എമിറേറ്റുകൾ", "name:mn"=>"Арабын Нэгдсэн Эмирт Улс", "name:mr"=>"संयुक्त अरब अमिराती", "name:ms"=>"Emiriah Arab Bersatu", "name:mt"=>"Emirati Għarab Magħquda", "name:my"=>"အာရပ်စော်ဘွားများပြည်ထောင်စုနိုင်ငံ", "name:na"=>"Emireitit Arabiya", "name:ne"=>"संयुक्त अरब इमिरेट्स", "name:nl"=>"Verenigde Arabische Emiraten", "name:nn"=>"Dei sameinte arabiske emirata", "name:no"=>"De forente arabiske emirater", "name:nv"=>"Ásáí Bikéyah Yázhí Ałhidadiidzooígíí", "name:oc"=>"Emirats Arabis Units", "name:or"=>"ୟୁନାଇଟେଡ଼ ଆରବ ଏମିରଟ", "name:os"=>"Араббы Иугонд Эмираттæ", "name:pa"=>"ਸੰਯੁਕਤ ਅਰਬ ਇਮਰਾਤ", "name:pl"=>"Emiraty Arabskie", "name:ps"=>"عربي متحده امارات", "name:pt"=>"Emirados Árabes Unidos", "name:qu"=>"Hukllachasqa Arab Imiratukuna", "name:ro"=>"Emiratele Arabe Unite", "name:ru"=>"Объединённые Арабские Эмираты", "name:rw"=>"Nyarabu Zunze Ubumwe", "name:sd"=>"گڏيل عرب امارات", "name:se"=>"Ovttastuvvan arábaemiráhtat", "name:sh"=>"Ujedinjeni Arapski Emirati", "name:sk"=>"Spojené arabské emiráty", "name:sl"=>"Združeni arabski emirati", "name:so"=>"Imaaraatka Carabta", "name:sq"=>"Emiratet e Bashkuara Arabe", "name:sr"=>"Уједињени Арапски Емирати", "name:ss"=>"Bunye bema-Arabhu", "name:su"=>"Uni Émirat Arab", "name:sv"=>"Förenade Arabemiraten", "name:sw"=>"Falme za Kiarabu", "name:ta"=>"ஐக்கிய அரபு அமீரகம்", "name:te"=>"యునైటెడ్ అరబ్ ఎమిరేట్స్", "name:tg"=>"Аморати Муттаҳидаи Араб", "name:th"=>"สหรัฐอาหรับเอมิเรตส์", "name:tk"=>"Birleşen Arap Emirlikleri", "name:tl"=>"United Arab Emirates", "name:tr"=>"Birleşik Arap Emirlikleri", "name:tt"=>"Берләшкән Гарәп Әмирлекләре", "name:ug"=>"ئەرەب بىرلەشمە خەلىپىلىكى", "name:uk"=>"Об'єднані Арабські Емірати", "name:ur"=>"متحدہ عرب امارات", "name:uz"=>"Birlashgan Arab Amirliklari", "name:vi"=>"Các Tiểu vương quốc Ả Rập Thống nhất", "name:vo"=>"Lemiräns Larabik Pebalöl", "name:wo"=>"Imaaraat yu Araab yu Bennoo yi", "name:yi"=>"פאראייניגטע אראבישע עמיראטן", "name:yo"=>"Àwọn Ẹ́mírétì Árábù Aṣọ̀kan", "name:zh"=>"阿拉伯联合酋长国"
-ao     "name"=>"Angola", "name:af"=>"Angola", "name:am"=>"አንጎላ", "name:an"=>"Angola", "name:ar"=>"أنغولا", "name:az"=>"Anqola", "name:ba"=>"Анго́ла", "name:be"=>"Анго́ла", "name:bg"=>"Ангола", "name:bh"=>"अंगोला", "name:bm"=>"Angola", "name:bn"=>"অ্যাঙ্গোলা", "name:bo"=>"ཨང་གོ་ལ།", "name:br"=>"Angola", "name:bs"=>"Angola", "name:ca"=>"Angola", "name:ce"=>"Анго́ла", "name:co"=>"Angola", "name:cs"=>"Angola", "name:cv"=>"Ангола", "name:cy"=>"Angola", "name:da"=>"Angola", "name:de"=>"Angola", "name:dv"=>"އެންގޯލާ", "name:dz"=>"ཨང་གྷོ་ལ", "name:ee"=>"Aŋgola", "name:el"=>"Ανγκόλα", "name:en"=>"Angola", "name:eo"=>"Angolo", "name:es"=>"Angola", "name:et"=>"Angola", "name:eu"=>"Angola", "name:fa"=>"آنگولا", "name:ff"=>"Anngolaa", "name:fi"=>"Angola", "name:fo"=>"Angola", "name:fr"=>"Angola", "name:fy"=>"Angoala", "name:ga"=>"Angóla", "name:gd"=>"Angola", "name:gl"=>"Angola", "name:gn"=>"Angola", "name:gu"=>"અંગોલા", "name:gv"=>"Angoley", "name:ha"=>"Angola", "name:he"=>"אנגולה", "name:hi"=>"अंगोला", "name:hr"=>"Angola", "name:ht"=>"Angola", "name:hu"=>"Angola", "name:hy"=>"Անգոլա", "name:ia"=>"Angola", "name:id"=>"Angola", "name:ie"=>"Angola", "name:ig"=>"Angola", "name:io"=>"Angola", "name:is"=>"Angóla", "name:it"=>"Angola", "name:ja"=>"アンゴラ", "name:jv"=>"Angola", "name:ka"=>"ანგოლა", "name:kg"=>"Ngola", "name:ki"=>"Angola", "name:kk"=>"Ангола", "name:km"=>"អង់ហ្គោឡា", "name:kn"=>"ಅಂಗೋಲ", "name:ko"=>"앙골라", "name:ks"=>"اینٛگولا", "name:ku"=>"Angola", "name:kw"=>"Angola", "name:ky"=>"Ангола", "name:la"=>"Angolia", "name:lb"=>"Angola", "name:lg"=>"Angola", "name:li"=>"Angola", "name:ln"=>"Angola", "name:lo"=>"ອັງໂກລາ", "name:lt"=>"Angola", "name:lv"=>"Angola", "name:mg"=>"Angola", "name:mi"=>"Anakora", "name:mk"=>"Ангола", "name:ml"=>"അംഗോള", "name:mn"=>"Ангол", "name:mr"=>"अँगोला", "name:ms"=>"Angola", "name:mt"=>"Angola", "name:my"=>"အင်ဂိုလာနိုင်ငံ", "name:na"=>"Angora", "name:ne"=>"अंगोला", "name:nl"=>"Angola", "name:nn"=>"Angola", "name:no"=>"Angola", "name:nv"=>"Angóola", "name:ny"=>"Angola", "name:oc"=>"Angòla", "name:om"=>"Angoolaa", "name:or"=>"ଆଙ୍ଗୋଲା", "name:os"=>"Анголæ", "name:pa"=>"ਅੰਗੋਲਾ", "name:pi"=>"अंगोला", "name:pl"=>"Angola", "name:ps"=>"آنګولا", "name:pt"=>"Angola", "name:qu"=>"Angula", "name:rm"=>"Angola", "name:ro"=>"Angola", "name:ru"=>"Ангола", "name:rw"=>"Angola", "name:sa"=>"अङ्गोला", "name:sc"=>"Angola", "name:se"=>"Angola", "name:sg"=>"Angoläa", "name:sh"=>"Angola", "name:si"=>"ඇන්ගෝලාව", "name:sk"=>"Angola", "name:sl"=>"Angola", "name:sn"=>"Angola", "name:so"=>"Angola", "name:sq"=>"Angola", "name:sr"=>"Ангола", "name:ss"=>"I-Angola", "name:st"=>"Angola", "name:su"=>"Angola", "name:sv"=>"Angola", "name:sw"=>"Angola", "name:ta"=>"அங்கோலா", "name:te"=>"అంగోలా", "name:tg"=>"Ангола", "name:th"=>"ประเทศแองโกลา", "name:ti"=>"ኣንጎላ", "name:tk"=>"Angola", "name:tl"=>"Anggola", "name:to"=>"ʻEnikola", "name:tr"=>"Angola", "name:ts"=>"Angola", "name:tt"=>"Анго́ла", "name:ug"=>"ئانگولا", "name:uk"=>"Анґо́ла", "name:ur"=>"انگولہ", "name:uz"=>"Angola", "name:vi"=>"Angola", "name:vo"=>"Langolän", "name:wo"=>"Angolaa", "name:yi"=>"אַנגאלאַ", "name:yo"=>"Àngólà", "name:za"=>"Angola", "name:zh"=>"安哥拉", "name:zu"=>"I-Angola"
-vg     "name"=>"British Virgin Islands", "name:af"=>"Brits-Maagde-eilande", "name:ar"=>"جزر فيرجن البريطانية", "name:be"=>"Брытанскія Вірджынскія астравы", "name:br"=>"Inizi Gwerc’h Breizhveuriat", "name:ca"=>"Illes Verges Britàniques", "name:cs"=>"Britské Panenské ostrovy", "name:da"=>"Britiske Jomfruøer", "name:de"=>"Britische Jungferninseln", "name:en"=>"British Virgin Islands", "name:eo"=>"Britaj Virgulinsuloj", "name:es"=>"Islas Vírgenes Británicas", "name:et"=>"Briti Neitsisaared", "name:eu"=>"Birjina uharte britainiarrak", "name:fa"=>"جزایر ویرجین بریتانیا", "name:fi"=>"Brittiläiset Neitsytsaaret", "name:fr"=>"Îles Vierges britanniques", "name:ga"=>"Oileáin Bhriotanacha na Maighdean", "name:he"=>"איי הבתולה הבריטיים", "name:hr"=>"Britanski Djevičanski Otoci", "name:hu"=>"Brit Virgin-szigetek", "name:id"=>"Kepulauan Virgin Britania Raya", "name:is"=>"Bresku Jómfrúaeyjar", "name:it"=>"Isole Vergini Britanniche", "name:ja"=>"イギリス領ヴァージン諸島", "name:la"=>"Britannicae Virginis Insulae", "name:lb"=>"Britesch Joffereninselen", "name:lt"=>"Britų Mergelių salos", "name:lv"=>"Britu Virdžīnu salas", "name:mk"=>"Британски Девствени Острови", "name:mn"=>"Виржиний Арлууд, Британийн", "name:nl"=>"Britse Maagdeneilanden", "name:pl"=>"Brytyjskie Wyspy Dziewicze", "name:pt"=>"Ilhas Virgens Britânicas", "name:ru"=>"Британские Виргинские острова", "name:sk"=>"Britské Panenské ostrovy", "name:sl"=>"Britanski Deviški otoki", "name:sr"=>"Британска Девичанска Острва", "name:sv"=>"Brittiska Jungfruöarna", "name:th"=>"หมู่เกาะบริติชเวอร์จิน", "name:tr"=>"Birleşik Krallık Virgin Adaları", "name:uk"=>"Британські Віргінські острови", "name:vi"=>"Quần đảo Virgin thuộc Anh", "name:zh"=>"英属维尔京群岛"
-bt     "name"=>"འབྲུག་ཡུལ་", "name:ab"=>"Бутан", "name:af"=>"Bhoetan", "name:ak"=>"Butan", "name:am"=>"ቡታን", "name:an"=>"Bután", "name:ar"=>"بوتان", "name:as"=>"ভূটান", "name:az"=>"Butan", "name:ba"=>"Бута́н", "name:be"=>"Бута́н", "name:bg"=>"Бутан", "name:bh"=>"भूटान", "name:bi"=>"Bhutan", "name:bn"=>"ভুটান", "name:bo"=>"འབྲུག་ཡུལ།", "name:br"=>"Bhoutan", "name:bs"=>"Butan", "name:ca"=>"Bhutan", "name:ce"=>"Бутан", "name:cs"=>"Bhútán", "name:cv"=>"Бутан", "name:cy"=>"Bhwtan", "name:da"=>"Bhutan", "name:de"=>"Bhutan", "name:dv"=>"ބޫޓާން", "name:dz"=>"འབྲུགཡུལ་", "name:el"=>"Μπουτάν", "name:en"=>"Bhutan", "name:eo"=>"Butano", "name:es"=>"Bután", "name:et"=>"Bhutan", "name:eu"=>"Bhutan", "name:fa"=>"بوتان", "name:ff"=>"Butaan", "name:fi"=>"Bhutan", "name:fo"=>"Butan", "name:fr"=>"Bhoutan", "name:fy"=>"Bûtan", "name:ga"=>"an Bhútáin", "name:gd"=>"Butàn", "name:gl"=>"Bután", "name:gn"=>"Vutã", "name:gu"=>"ભૂતાન", "name:gv"=>"yn Vutaan", "name:ha"=>"Bhutan", "name:he"=>"בהוטן", "name:hi"=>"भूटान", "name:hr"=>"Butan", "name:ht"=>"Boutan", "name:hu"=>"Bhután", "name:hy"=>"Բութան", "name:ia"=>"Bhutan", "name:id"=>"Bhutan", "name:ie"=>"Bhutan", "name:io"=>"Bhutan", "name:is"=>"Bútan", "name:it"=>"Bhutan", "name:ja"=>"ブータン", "name:jv"=>"Bhutan", "name:ka"=>"ბჰუტანი", "name:kg"=>"Bhutan", "name:ki"=>"Bhutan", "name:kk"=>"Бутан", "name:kl"=>"Bhutan", "name:km"=>"ប៊ូតាន", "name:kn"=>"ಭೂತಾನ್", "name:ko"=>"부탄", "name:ks"=>"بوٗٹان", "name:ku"=>"Bûtan", "name:kv"=>"Бутан", "name:kw"=>"Bhoutan", "name:ky"=>"Бутан", "name:la"=>"Butania", "name:lb"=>"Bhutan", "name:lg"=>"Butaani", "name:li"=>"Bhutan", "name:ln"=>"Butáni", "name:lo"=>"ບູຕານ", "name:lt"=>"Butanas", "name:lv"=>"Butāna", "name:mg"=>"Botàna", "name:mi"=>"Putāna", "name:mk"=>"Бутан", "name:ml"=>"ഭൂട്ടാൻ", "name:mn"=>"Бутан", "name:mr"=>"भूतान", "name:ms"=>"Bhutan", "name:mt"=>"Butan", "name:my"=>"ဘူတန်နိုင်ငံ", "name:na"=>"Butan", "name:ne"=>"भूटान", "name:nl"=>"Bhutan", "name:nn"=>"Bhutan", "name:no"=>"Bhutan", "name:nv"=>"Bikéyah", "name:oc"=>"Botan", "name:om"=>"Buutan", "name:or"=>"ଭୁଟାନ", "name:os"=>"Бутан", "name:pa"=>"ਭੂਟਾਨ", "name:pi"=>"भूटान", "name:pl"=>"Bhutan", "name:ps"=>"بوتان", "name:pt"=>"Butão", "name:qu"=>"Butan", "name:rm"=>"Bhutan", "name:rn"=>"Butani", "name:ro"=>"Bhutan", "name:ru"=>"Бутан", "name:rw"=>"Butani", "name:sa"=>"भूटान", "name:se"=>"Bhutan", "name:sg"=>"Butäan", "name:sh"=>"Butan", "name:si"=>"භූතානය", "name:sk"=>"Bhután", "name:sl"=>"Butan", "name:sn"=>"Bhutan", "name:so"=>"Butaan", "name:sq"=>"Butani", "name:sr"=>"Бутан", "name:ss"=>"iBhuthani", "name:su"=>"Butan", "name:sv"=>"Bhutan", "name:sw"=>"Bhutan", "name:ta"=>"பூட்டான்", "name:te"=>"భూటాన్", "name:tg"=>"Бутан", "name:th"=>"ประเทศภูฏาน", "name:ti"=>"ቡህታን", "name:tk"=>"Butan", "name:tl"=>"Butan", "name:to"=>"Pūtani", "name:tr"=>"Bhutan", "name:tt"=>"Бутан", "name:tw"=>"Butan", "name:ug"=>"بۇتان", "name:uk"=>"Бута́н", "name:ur"=>"بھوٹان", "name:uz"=>"Butan", "name:vi"=>"Bhutan", "name:vo"=>"Butän", "name:wo"=>"Butaan", "name:yi"=>"בהוטאן", "name:yo"=>"Bhùtán", "name:za"=>"Budanh", "name:zh"=>"不丹", "name:zu"=>"i-Bhutan"
-sy     "name"=>"سوريا", "name:af"=>"Sirië", "name:am"=>"ሶርያ", "name:an"=>"Siria", "name:ar"=>"سوريا", "name:av"=>"Сирия", "name:az"=>"Suriya", "name:ba"=>"Сирия", "name:be"=>"Сірыя", "name:bg"=>"Сирия", "name:bm"=>"Suriya", "name:bn"=>"সিরিয়া", "name:bo"=>"སི་རི་ཡ།", "name:br"=>"Siria", "name:bs"=>"Sirija", "name:ca"=>"República Àrab Siriana", "name:ce"=>"Шема", "name:cs"=>"Sýrie", "name:cu"=>"Сѷрїꙗ", "name:cv"=>"Сири", "name:cy"=>"Syria", "name:da"=>"Syrien", "name:de"=>"Syrien", "name:dv"=>"ސޫރިޔާ", "name:el"=>"Συρία", "name:en"=>"Syria", "name:eo"=>"Sirio", "name:es"=>"Siria", "name:et"=>"Süüria", "name:eu"=>"Siria", "name:fa"=>"سوریه", "name:fi"=>"Syyria", "name:fo"=>"Sýria", "name:fr"=>"Syrie", "name:fy"=>"Syrje", "name:ga"=>"An tSiria", "name:gd"=>"Siria", "name:gl"=>"Siria - سورية", "name:gu"=>"સિરિયા", "name:gv"=>"Yn Teer", "name:he"=>"סוריה", "name:hi"=>"सीरिया", "name:hr"=>"Sirija", "name:ht"=>"Siri", "name:hu"=>"Szíria", "name:hy"=>"Սիրիա", "name:ia"=>"Syria", "name:id"=>"Suriah", "name:ie"=>"Siria", "name:io"=>"Siria", "name:is"=>"Sýrland", "name:it"=>"Siria", "name:ja"=>"シリア", "name:jv"=>"Suriah", "name:ka"=>"სირია", "name:ki"=>"Syria", "name:kk"=>"Сирия", "name:kl"=>"Syria", "name:kn"=>"ಸಿರಿಯಾ", "name:ko"=>"시리아", "name:ku"=>"Sûrî", "name:kv"=>"Сирия", "name:kw"=>"Syri", "name:ky"=>"Сирия", "name:la"=>"Syria", "name:lb"=>"Syrien", "name:li"=>"Syrië", "name:ln"=>"Sirí", "name:lt"=>"Sirija", "name:lv"=>"Sīrija", "name:mg"=>"Siria", "name:mi"=>"Hiria", "name:mk"=>"Сирија", "name:ml"=>"സിറിയ", "name:mn"=>"Сири", "name:mr"=>"सीरिया", "name:ms"=>"Syria", "name:my"=>"ဆီးရီးယားနိုင်ငံ", "name:na"=>"Syria", "name:ne"=>"सीरिया", "name:nl"=>"Syrië", "name:nn"=>"Syria", "name:no"=>"Syria", "name:nv"=>"Sííwiya", "name:oc"=>"Siria", "name:or"=>"ସିରିଆ", "name:os"=>"Сири", "name:pa"=>"ਸੀਰੀਆ", "name:pl"=>"Syria", "name:ps"=>"سوريه", "name:pt"=>"Síria", "name:qu"=>"Sirya", "name:ro"=>"Siria", "name:ru"=>"Сирия", "name:rw"=>"Siriya", "name:sa"=>"सिरिया", "name:sc"=>"Siria", "name:sd"=>"شام", "name:se"=>"Syria", "name:sh"=>"Sirija", "name:sk"=>"Sýria", "name:sl"=>"Sirija", "name:so"=>"Suuriya", "name:sq"=>"Siria", "name:sr"=>"Сирија", "name:ss"=>"ISiriya", "name:su"=>"Suriah", "name:sv"=>"Syrien", "name:sw"=>"Syria", "name:ta"=>"சிரியா", "name:te"=>"సిరియా", "name:tg"=>"Сурия", "name:th"=>"ประเทศซีเรีย", "name:tk"=>"Siriýa", "name:tl"=>"Sirya", "name:tr"=>"Suriye", "name:tt"=>"Сүрия", "name:ug"=>"سۇرىيە", "name:uk"=>"Сирія", "name:ur"=>"شام", "name:uz"=>"Suriya", "name:vi"=>"Syria", "name:vo"=>"Süriyän", "name:wa"=>"Sireye", "name:wo"=>"Siri", "name:yi"=>"סיריע", "name:yo"=>"Síríà", "name:zh"=>"叙利亚/敘利亞"
-gl     "name"=>"Kalaallit Nunaat", "name:af"=>"Groenland", "name:am"=>"ግሪንላንድ", "name:an"=>"Gronlandia", "name:ar"=>"غرينلاند", "name:az"=>"Qrenlandiya", "name:be"=>"Грэнландыя", "name:bg"=>"Гренландия", "name:bn"=>"গ্রিনল্যান্ড", "name:bo"=>"གེ་རེན་ལ", "name:br"=>"Greunland", "name:bs"=>"Grenland", "name:ca"=>"Grenlàndia", "name:cs"=>"Grónsko", "name:cv"=>"Гренланди", "name:cy"=>"Yr Ynys Las", "name:da"=>"Grønland", "name:de"=>"Grönland", "name:dv"=>"ގުރީންލޭންޑު", "name:el"=>"Γροιλανδία", "name:en"=>"Greenland", "name:eo"=>"Gronlando", "name:es"=>"Groenlandia", "name:et"=>"Gröönimaa", "name:eu"=>"Groenlandia", "name:fa"=>"گرینلند", "name:fi"=>"Grönlanti", "name:fo"=>"Grønland", "name:fr"=>"Groenland", "name:fy"=>"Grienlân", "name:ga"=>"An Ghraonlainn", "name:gd"=>"A' Ghraonlainn", "name:gl"=>"Groenlandia", "name:gn"=>"Kyoẽlándia", "name:gv"=>"Greenlynn", "name:he"=>"גרינלנד", "name:hi"=>"ग्रीनलैण्ड", "name:hr"=>"Grenland", "name:hu"=>"Grönland", "name:hy"=>"Գրենլանդիա", "name:ia"=>"Groenlandia", "name:id"=>"Greenland", "name:ie"=>"Grenland", "name:io"=>"Grenlando", "name:is"=>"Grænland", "name:it"=>"Groenlandia", "name:iu"=>"ᐊᑯᑭᑦᑐᑦ", "name:ja"=>"グリーンランド", "name:jv"=>"Greenland", "name:ka"=>"გრენლანდია", "name:kk"=>"Гренландия", "name:kl"=>"Kalaallit Nunaat", "name:kn"=>"ಗ್ರೀನ್‍ಲ್ಯಾಂಡ್", "name:ko"=>"그린란드", "name:ku"=>"Grînlenda", "name:kv"=>"Гренландия", "name:kw"=>"Greunland", "name:la"=>"Groenlandia", "name:lb"=>"Grönland", "name:li"=>"Greunland", "name:ln"=>"Groenlandi", "name:lt"=>"Grenlandija", "name:lv"=>"Grenlande", "name:mg"=>"Groenlanda", "name:mi"=>"Greenland", "name:mk"=>"Гренланд", "name:ml"=>"ഗ്രീൻലാൻഡ്", "name:mn"=>"Гренланд", "name:mr"=>"ग्रीनलँड", "name:ms"=>"Greenland", "name:my"=>"ဂရင်းလန်ကျွန်း", "name:ne"=>"ग्रीनल्याण्ड", "name:nl"=>"Groenland", "name:nn"=>"Grønland", "name:no"=>"Grønland", "name:nv"=>"Haʼaʼaahjí Hakʼaz Dineʼé Bikéyah", "name:oc"=>"Groenlàndia", "name:or"=>"ଗ୍ରୀନଲାଣ୍ଡ", "name:os"=>"Гренланди", "name:pa"=>"ਗਰੀਨਲੈਂਡ", "name:pl"=>"Grenlandia", "name:pt"=>"Gronelândia", "name:qu"=>"Kalalit Nunat", "name:ro"=>"Groenlanda", "name:ru"=>"Гренландия", "name:rw"=>"Goronulande", "name:se"=>"Kalaallit Nunaat", "name:sh"=>"Grenland", "name:sk"=>"Grónsko", "name:sl"=>"Grenlandija", "name:so"=>"Griinland", "name:sq"=>"Groenlanda", "name:sr"=>"Гренланд", "name:su"=>"Lemah Héjo", "name:sv"=>"Grönland", "name:sw"=>"Greenland", "name:ta"=>"கிறீன்லாந்து", "name:te"=>"గ్రీన్‌లాండ్", "name:tg"=>"Гренландия", "name:th"=>"กรีนแลนด์", "name:tl"=>"Lupanlunti", "name:tr"=>"Grönland", "name:tt"=>"Гренландия", "name:ug"=>"گرېنلاندىيە", "name:uk"=>"Ґренландія", "name:ur"=>"گرین لینڈ", "name:vi"=>"Greenland", "name:vo"=>"Gröneän", "name:wo"=>"Groenlaand", "name:yi"=>"גרינלאנד", "name:yo"=>"Grínlándì", "name:zh"=>"格陵兰"
-se     "name"=>"Sverige", "name:ab"=>"Швециа", "name:af"=>"Swede", "name:ak"=>"Sweden", "name:am"=>"ስዊድን", "name:an"=>"Suecia", "name:ar"=>"السويد", "name:az"=>"İsveç", "name:ba"=>"Швеция", "name:be"=>"Швецыя", "name:bg"=>"Швеция", "name:bi"=>"Sweden", "name:bm"=>"Swedi", "name:bn"=>"সুইডেন", "name:bo"=>"སི་ཝེ་དེན།", "name:br"=>"Sveden", "name:bs"=>"Švedska", "name:ca"=>"Suècia", "name:ce"=>"Швеци", "name:co"=>"Svezia", "name:cs"=>"Švédsko", "name:cu"=>"Свєньско", "name:cv"=>"Швеци", "name:cy"=>"Sweden", "name:da"=>"Sverige", "name:de"=>"Schweden", "name:dv"=>"ސުވިޑަން", "name:dz"=>"སུའི་ཌན་", "name:ee"=>"Sweden", "name:el"=>"Σουηδία", "name:en"=>"Sweden", "name:eo"=>"Svedio", "name:es"=>"Suecia", "name:et"=>"Rootsi", "name:eu"=>"Suedia", "name:fa"=>"سوئد", "name:fi"=>"Ruotsi", "name:fo"=>"Svøríki", "name:fr"=>"Suède", "name:fy"=>"Sweden", "name:ga"=>"An tSualainn", "name:gd"=>"An t-Suain", "name:gl"=>"Suecia", "name:gn"=>"Suesia", "name:gu"=>"સ્વિડન", "name:gv"=>"Yn Toolynn", "name:he"=>"שבדיה", "name:hi"=>"स्वीडन", "name:hr"=>"Švedska", "name:ht"=>"Syèd", "name:hu"=>"Svédország", "name:hy"=>"Շվեդիա", "name:ia"=>"Svedia", "name:id"=>"Swedia", "name:ie"=>"Svedia", "name:io"=>"Suedia", "name:is"=>"Svíþjóð", "name:it"=>"Svezia", "name:iu"=>"ᔅᕗᕆᑭ", "name:ja"=>"スウェーデン", "name:jv"=>"Swédia", "name:ka"=>"შვედეთი", "name:kg"=>"Suedi", "name:ki"=>"Sweden", "name:kk"=>"Швеция", "name:kl"=>"Svenskit Nunaat", "name:km"=>"ស៊ុយអែត", "name:kn"=>"ಸ್ವೀಡನ್", "name:ko"=>"스웨덴", "name:ku"=>"Swêd", "name:kv"=>"Швеция", "name:kw"=>"Swedherwyk", "name:ky"=>"Швеция", "name:la"=>"Suecia", "name:lb"=>"Schweden", "name:lg"=>"Swiiden", "name:li"=>"Zwede", "name:ln"=>"Swédi", "name:lt"=>"Švedija", "name:lv"=>"Zviedrija", "name:mg"=>"Soeda", "name:mi"=>"Huītene", "name:mk"=>"Шведска", "name:ml"=>"സ്വീഡൻ", "name:mn"=>"Швед", "name:mr"=>"स्वीडन", "name:ms"=>"Sweden", "name:mt"=>"Żvezja", "name:my"=>"ဆွီဒင်နိုင်ငံ", "name:na"=>"Widen", "name:ne"=>"स्वीडेन", "name:nl"=>"Zweden", "name:nn"=>"Sverige", "name:no"=>"Sverige", "name:oc"=>"Suècia", "name:or"=>"ସ୍ଵିଡେନ", "name:os"=>"Швеци", "name:pa"=>"ਸਵੀਡਨ", "name:pl"=>"Szwecja", "name:ps"=>"سويډن", "name:pt"=>"Suécia", "name:qu"=>"Suwidsuyu", "name:rm"=>"Svezia", "name:ro"=>"Suedia", "name:ru"=>"Швеция", "name:rw"=>"Suwede", "name:sa"=>"स्वीडन", "name:sc"=>"Isvetzia", "name:se"=>"Ruoŧŧa", "name:sh"=>"Švedska", "name:sk"=>"Švédsko", "name:sl"=>"Švedska", "name:sm"=>"Sweden", "name:so"=>"Iswiidhan", "name:sq"=>"Suedia", "name:sr"=>"Шведска", "name:ss"=>"ISwideni", "name:su"=>"Swédia", "name:sv"=>"Sverige", "name:sw"=>"Uswidi", "name:ta"=>"சுவீடன்", "name:te"=>"స్వీడన్", "name:tg"=>"Шветсия", "name:th"=>"ประเทศสวีเดน", "name:tk"=>"Şwesiýa", "name:tl"=>"Suwesya", "name:tr"=>"İsveç", "name:tt"=>"Швеция", "name:tw"=>"Sweden", "name:ug"=>"شۋېتسىيە", "name:uk"=>"Швеція", "name:ur"=>"سویڈن", "name:uz"=>"Shvetsiya", "name:vi"=>"Thụy Điển", "name:vo"=>"Svedän", "name:wa"=>"Suwedwesse", "name:wo"=>"Suweed", "name:yi"=>"שוועדן", "name:yo"=>"Swídìn", "name:zh"=>"瑞典", "name:zu"=>"ISwidi"
-sk     "name"=>"Slovensko", "name:af"=>"Slowakye", "name:am"=>"ስሎቫኪያ", "name:an"=>"Eslovaquia", "name:ar"=>"سلوفاكيا", "name:az"=>"Slovakiya", "name:ba"=>"Словакия", "name:be"=>"Славакія", "name:bg"=>"Словакия", "name:bi"=>"Slovakia", "name:bn"=>"স্লোভাকিয়া", "name:bo"=>"སི་ལོ་ཕ་ཁེ།", "name:br"=>"Slovakia", "name:bs"=>"Slovačka", "name:ca"=>"Eslovàquia", "name:ce"=>"Словаки", "name:co"=>"Sluvacchia", "name:cs"=>"Slovensko", "name:cu"=>"Словѣньско", "name:cv"=>"Словаки", "name:cy"=>"Slofacia", "name:da"=>"Slovakiet", "name:de"=>"Slowakei", "name:dv"=>"ސުލޮވާކިއާ", "name:ee"=>"Slovakia", "name:el"=>"Σλοβακία", "name:en"=>"Slovakia", "name:eo"=>"Slovakio", "name:es"=>"Eslovaquia", "name:et"=>"Slovakkia", "name:eu"=>"Eslovakia", "name:fa"=>"اسلواکی", "name:fi"=>"Slovakia", "name:fo"=>"Slovakia", "name:fr"=>"Slovaquie", "name:fy"=>"Slowakije", "name:ga"=>"An tSlóvaic", "name:gd"=>"An t-Slòbhac", "name:gl"=>"Eslovaquia", "name:gn"=>"Elovakia", "name:gu"=>"સ્લોવાકિયા", "name:gv"=>"Yn Clovack", "name:he"=>"סלובקיה", "name:hi"=>"स्लोवाकिया", "name:hr"=>"Slovačka", "name:ht"=>"Slovaki", "name:hu"=>"Szlovákia", "name:hy"=>"Սլովակիա", "name:ia"=>"Slovachia", "name:id"=>"Slowakia", "name:ie"=>"Slovacia", "name:io"=>"Slovakia", "name:is"=>"Slóvakía", "name:it"=>"Slovacchia", "name:ja"=>"スロバキア", "name:jv"=>"Slowakia", "name:ka"=>"სლოვაკეთი", "name:kg"=>"Slovakia", "name:kk"=>"Словакия", "name:kl"=>"Slovakia", "name:ko"=>"슬로바키아", "name:ku"=>"Slovakya", "name:kv"=>"Словакия", "name:kw"=>"Slovaki", "name:ky"=>"Словакия", "name:la"=>"Slovacia", "name:lb"=>"Slowakei", "name:li"=>"Slowakieë", "name:ln"=>"Slovakia", "name:lt"=>"Slovakija", "name:lv"=>"Slovākija", "name:mi"=>"Horowākia", "name:mk"=>"Словачка", "name:ml"=>"സ്ലോവാക്യ", "name:mn"=>"Словак", "name:mr"=>"स्लोव्हाकिया", "name:ms"=>"Slovakia", "name:mt"=>"Slovakkja", "name:my"=>"ဆလိုဗားကီးယားနိုင်ငံ", "name:na"=>"Slowakia", "name:ne"=>"स्लोभाकिया", "name:nl"=>"Slowakije", "name:nn"=>"Slovakia", "name:no"=>"Slovakia", "name:nv"=>"Słóbaʼ Bikéyah", "name:oc"=>"Eslovaquia", "name:or"=>"ସ୍ଲୋଭାକିଆ", "name:os"=>"Словаки", "name:pl"=>"Słowacja", "name:ps"=>"سلواکيا", "name:pt"=>"Eslováquia", "name:qu"=>"Isluwakya", "name:rm"=>"Slovachia", "name:ro"=>"Slovacia", "name:ru"=>"Словакия", "name:rw"=>"Silovakiya", "name:sa"=>"स्लोवाकिया", "name:se"=>"Slovakia", "name:sh"=>"Slovačka", "name:sk"=>"Slovensko", "name:sl"=>"Slovaška", "name:so"=>"Islofaakiya", "name:sq"=>"Sllovakia", "name:sr"=>"Словачка", "name:ss"=>"Silovakhi", "name:st"=>"Slovakia", "name:su"=>"Slovakia", "name:sv"=>"Slovakien", "name:sw"=>"Slovakia", "name:ta"=>"சிலோவாக்கியா", "name:tg"=>"Словакия", "name:th"=>"ประเทศสโลวาเกีย", "name:tk"=>"Slowakiýa", "name:tl"=>"Eslobakya", "name:tr"=>"Slovakya", "name:tt"=>"Словакия", "name:ug"=>"سلوۋاكىيە", "name:uk"=>"Словаччина", "name:ur"=>"سلوواکیہ", "name:uz"=>"Slovakiya", "name:vi"=>"Slovakia", "name:vo"=>"Slovakiyän", "name:wo"=>"Eslowaaki", "name:yi"=>"סלאוואקיי", "name:yo"=>"Slofákíà", "name:zh"=>"斯洛伐克", "name:zu"=>"ISlovaki"
-cy     "name"=>"Κύπρος - Kıbrıs", "name:af"=>"Siprus", "name:am"=>"ቆጵሮስ", "name:an"=>"Chipre", "name:ar"=>"قبرص", "name:az"=>"Kipr", "name:be"=>"Кіпр", "name:bg"=>"Кипър", "name:bi"=>"Cyprus", "name:bn"=>"সাইপ্রাস", "name:bo"=>"སེ་པི་རི་སི།", "name:br"=>"Kiprenez", "name:bs"=>"Kipar", "name:ca"=>"Xipre", "name:ce"=>"Кипр", "name:co"=>"Cipru", "name:cs"=>"Kypr", "name:cu"=>"Кѷпръ", "name:cv"=>"Кипр", "name:cy"=>"Cyprus", "name:da"=>"Cypern", "name:de"=>"Zypern", "name:ee"=>"Cyprus", "name:el"=>"Κύπρος", "name:en"=>"Cyprus", "name:eo"=>"Kipro", "name:es"=>"Chipre", "name:et"=>"Küpros", "name:eu"=>"Zipre", "name:fa"=>"قبرس", "name:fi"=>"Kypros", "name:fo"=>"Kýpros", "name:fr"=>"Chypre", "name:fy"=>"Syprus", "name:ga"=>"An Chipir", "name:gd"=>"Cìopras", "name:gl"=>"Chipre", "name:gn"=>"Chipre", "name:gu"=>"સાયપ્રસ", "name:gv"=>"Yn Cheeprey", "name:he"=>"קפריסין", "name:hi"=>"साइप्रस", "name:hr"=>"Cipar", "name:ht"=>"Chip", "name:hu"=>"Ciprus", "name:hy"=>"Կիպրոս", "name:ia"=>"Cypro", "name:id"=>"Siprus", "name:ie"=>"Cypria", "name:io"=>"Chipro", "name:is"=>"Kýpur", "name:it"=>"Cipro", "name:ja"=>"キプロス", "name:jv"=>"Siprus", "name:ka"=>"კვიპროსი", "name:kg"=>"Kipros", "name:kk"=>"Кипр", "name:kl"=>"Cyperni", "name:kn"=>"ಕಿಪ್ರೊಸ್", "name:ko"=>"키프로스", "name:ku"=>"Kîpros", "name:kv"=>"Кипр", "name:kw"=>"Kobros", "name:la"=>"Cyprus", "name:lb"=>"Zypern", "name:li"=>"Cyprus", "name:lt"=>"Kipras", "name:lv"=>"Kipra", "name:mg"=>"Kipra", "name:mi"=>"Haipara", "name:mk"=>"Кипар", "name:ml"=>"സൈപ്രസ്", "name:mn"=>"Кипр", "name:mr"=>"सायप्रस", "name:ms"=>"Cyprus", "name:mt"=>"Ċipru", "name:my"=>"ဆိုက်ပရပ်စ်နိုင်ငံ", "name:na"=>"Taiprus", "name:nb"=>"Kypros", "name:ne"=>"साइप्रस", "name:nl"=>"Cyprus", "name:nn"=>"Kypros", "name:no"=>"Kypros", "name:nv"=>"Béésh Łichíiʼii Bikéyah", "name:oc"=>"Chipre", "name:or"=>"ସାଇପ୍ରସ", "name:os"=>"Кипр", "name:pa"=>"ਸਾਇਪ੍ਰਸ", "name:pl"=>"Cypr", "name:pt"=>"Chipre", "name:qu"=>"Kipru", "name:rm"=>"Cipra", "name:ro"=>"Cipru", "name:ru"=>"Кипр", "name:rw"=>"Shipure", "name:sc"=>"Tzipru", "name:se"=>"Kypros", "name:sh"=>"Cipar", "name:si"=>"සයිප්‍රස්", "name:sk"=>"Cyprus", "name:sl"=>"Ciper", "name:sm"=>"Cyprus", "name:so"=>"Qabrus", "name:sq"=>"Qiproja", "name:sr"=>"Кипар", "name:ss"=>"ISayiphro", "name:su"=>"Siprus", "name:sv"=>"Cypern", "name:sw"=>"Kupro", "name:ta"=>"சைப்பிரஸ்", "name:te"=>"సైప్రస్", "name:tg"=>"Кипр", "name:th"=>"ประเทศไซปรัส", "name:tk"=>"Kipr", "name:tl"=>"Tsipre", "name:tr"=>"Kıbrıs", "name:tt"=>"Кипр", "name:ug"=>"سىپرۇس", "name:uk"=>"Кіпр", "name:ur"=>"قبرص", "name:uz"=>"Qibris", "name:vi"=>"Síp", "name:vo"=>"Sipreän", "name:wo"=>"Ciipër", "name:yi"=>"קיפראס", "name:yo"=>"Kíprù", "name:zh"=>"赛普勒斯/塞浦路斯/塞浦路斯"
-cn     "name"=>"中国", "name:ab"=>"Чынҭ", "name:af"=>"China", "name:ak"=>"China", "name:am"=>"የቻይና", "name:an"=>"China", "name:ar"=>"الصين", "name:as"=>"চীন", "name:av"=>"Чин", "name:ay"=>"China", "name:az"=>"Çin", "name:ba"=>"Ҡытай", "name:be"=>"Кітай", "name:bg"=>"Китай", "name:bh"=>"चीन", "name:bi"=>"Jaena", "name:bm"=>"China", "name:bn"=>"গণচীন", "name:bo"=>"ཀྲུང་གོ།", "name:br"=>"Sina", "name:bs"=>"Kina", "name:ca"=>"Xina", "name:ce"=>"Цийн-мохк", "name:ch"=>"China", "name:co"=>"China", "name:cs"=>"Čína", "name:cu"=>"Срѣдинꙗнє", "name:cv"=>"Китай", "name:cy"=>"Tsieina", "name:da"=>"Kina", "name:de"=>"China", "name:dv"=>"ސީނުކަރަ", "name:dz"=>"རྒྱ་ནག", "name:ee"=>"China", "name:el"=>"Κίνα", "name:en"=>"China", "name:eo"=>"Ĉinio", "name:es"=>"China", "name:et"=>"Hiina", "name:eu"=>"Txina", "name:fa"=>"چین", "name:ff"=>"Ciina", "name:fi"=>"Kiina", "name:fj"=>"Jaina", "name:fo"=>"Kina", "name:fr"=>"Chine", "name:fy"=>"Sina", "name:ga"=>"Síne", "name:gd"=>"Sìona", "name:gl"=>"China", "name:gn"=>"Chína", "name:gu"=>"ચીન", "name:gv"=>"Sheen", "name:ha"=>"Sin", "name:he"=>"סין", "name:hi"=>"चीनी", "name:hr"=>"Kina", "name:ht"=>"Chin", "name:hu"=>"Kína", "name:hy"=>"Չինաստան", "name:ia"=>"China", "name:id"=>"Tiongkok", "name:ie"=>"China", "name:ig"=>"Chaina", "name:ik"=>"China", "name:io"=>"Chinia", "name:is"=>"Kína", "name:it"=>"Cina", "name:iu"=>"ᓴᐃᓇ", "name:ja"=>"中国", "name:jv"=>"Cina", "name:ka"=>"ჩინეთი", "name:kg"=>"Sina", "name:ki"=>"China", "name:kk"=>"Қытай", "name:kl"=>"Kina", "name:km"=>"ចិន", "name:kn"=>"ಚೀನಿ", "name:ko"=>"중국", "name:ks"=>"چیٖن", "name:ku"=>"Çîn", "name:kv"=>"Китай", "name:kw"=>"China", "name:ky"=>"Кытай", "name:la"=>"Sinae", "name:lb"=>"China", "name:lg"=>"Cayina", "name:li"=>"China", "name:ln"=>"Sína", "name:lo"=>"ປະເທດຈີນ", "name:lt"=>"Kinija", "name:lv"=>"Ķīna", "name:mg"=>"Sina", "name:mi"=>"Haina", "name:mk"=>"Кина", "name:ml"=>"ചീന", "name:mn"=>"Хятад", "name:mr"=>"चीन", "name:ms"=>"China", "name:mt"=>"Ċina", "name:my"=>"တရုတ်", "name:na"=>"Tsiene", "name:nb"=>"Kina", "name:ne"=>"चीन", "name:nl"=>"China", "name:nn"=>"Kina", "name:no"=>"Kina", "name:nv"=>"Tsiiʼyishbizhí Dineʼé Bikéyah", "name:ny"=>"China", "name:oc"=>"China", "name:om"=>"Chaayinaan", "name:or"=>"ଚୀନ", "name:os"=>"Китай", "name:pa"=>"ਚੀਨ", "name:pl"=>"Chiny", "name:ps"=>"چين", "name:pt"=>"China", "name:qu"=>"Chunkuk", "name:rm"=>"China", "name:rn"=>"Ubushinwa", "name:ro"=>"China", "name:ru"=>"Китай", "name:rw"=>"Ubushinwa", "name:sc"=>"Cina", "name:sd"=>"چين", "name:se"=>"Kiinná", "name:sg"=>"Sînä", "name:sh"=>"Kina", "name:si"=>"චීනය", "name:sk"=>"Čína", "name:sl"=>"Kitájska", "name:sm"=>"Saina", "name:sn"=>"China", "name:so"=>"Shiinaha", "name:sq"=>"Kina", "name:sr"=>"Кина", "name:ss"=>"iShayina", "name:st"=>"Tjhaena", "name:su"=>"Tiongkok", "name:sv"=>"Kina", "name:sw"=>"China", "name:ta"=>"சீனா", "name:te"=>"చైనా", "name:tg"=>"Хито́й", "name:th"=>"ประเทศจีน", "name:ti"=>"የቻይና", "name:tk"=>"Hytaý", "name:tl"=>"Tsina", "name:tn"=>"China", "name:to"=>"Siaina", "name:tr"=>"Çin", "name:ts"=>"Chayina", "name:tt"=>"Кытай", "name:tw"=>"China", "name:ty"=>"Tinitō", "name:ug"=>"جۇڭخۇا خەلق جۇمھۇرىيىتى", "name:uk"=>"Кита́йська", "name:ur"=>"چین", "name:uz"=>"Xitoy", "name:ve"=>"China", "name:vi"=>"Trung Quốc", "name:vo"=>"Tsyinän", "name:wo"=>"Siin", "name:xh"=>"IShayina", "name:yi"=>"כינע", "name:yo"=>"Ṣáínà", "name:za"=>"Cunghgoz", "name:zh"=>"中国", "name:zu"=>"IShayina"
-kw     "name"=>"الكويت", "name:af"=>"Koeweit", "name:am"=>"ኩዌት", "name:an"=>"Kuwait", "name:ar"=>"الكويت", "name:az"=>"Küveyt", "name:ba"=>"Күвейт", "name:be"=>"Кувейт", "name:bg"=>"Кувейт", "name:bn"=>"কুয়েত", "name:bo"=>"ཁུ་ཝི་ཐི།", "name:br"=>"Koweit", "name:bs"=>"Kuvajt", "name:ca"=>"Kuwait", "name:ce"=>"Кувейт", "name:cs"=>"Kuvajt", "name:cv"=>"Кувейт", "name:cy"=>"Kuwait", "name:da"=>"Kuwait", "name:de"=>"Kuwait", "name:dv"=>"ކުވެއިތު", "name:dz"=>"ཀུ་ཝེཊ་", "name:el"=>"Κουβέιτ", "name:en"=>"Kuwait", "name:eo"=>"Kuvajto", "name:es"=>"Kuwait", "name:et"=>"Kuveit", "name:eu"=>"Kuwait", "name:fa"=>"کویت", "name:fi"=>"Kuwait", "name:fo"=>"Kuveit", "name:fr"=>"Koweït", "name:fy"=>"Koeweit", "name:ga"=>"Cuáit", "name:gd"=>"Cubhait", "name:gl"=>"Kuwait", "name:gu"=>"કુવૈત", "name:gv"=>"Yn Choowait", "name:he"=>"כווית", "name:hi"=>"कुवैत", "name:hr"=>"Kuvajt", "name:ht"=>"Kowet", "name:hu"=>"Kuvait", "name:hy"=>"Քուվեյթ", "name:ia"=>"Kuwait", "name:id"=>"Kuwait", "name:ie"=>"Kuwait", "name:io"=>"Kuwait", "name:is"=>"Kúveit", "name:it"=>"Kuwait", "name:ja"=>"クウェート", "name:jv"=>"Kuwait", "name:ka"=>"ქუვეითი", "name:kk"=>"Кувейт", "name:kl"=>"Kuwait", "name:km"=>"គុយវ៉ែត", "name:kn"=>"ಕುವೈತ್", "name:ko"=>"쿠웨이트", "name:ku"=>"Kuweyt", "name:kv"=>"Кувейт", "name:kw"=>"Koweyt", "name:la"=>"Cuvaitum", "name:lb"=>"Kuwait", "name:li"=>"Koeweit", "name:ln"=>"Koweit", "name:lt"=>"Kuveitas", "name:lv"=>"Kuveita", "name:mk"=>"Кувајт", "name:ml"=>"കുവൈറ്റ്", "name:mn"=>"Кувейт", "name:mr"=>"कुवेत", "name:ms"=>"Kuwait", "name:my"=>"ကူဝိတ်နိုင်ငံ", "name:na"=>"Kuwait", "name:ne"=>"कुवेत", "name:nl"=>"Koeweit", "name:nn"=>"Kuwait", "name:no"=>"Kuwait", "name:nv"=>"Kóóweiʼ", "name:oc"=>"Kowait", "name:or"=>"କୁଏତ", "name:os"=>"Кувейт", "name:pl"=>"Kuwejt", "name:ps"=>"کوېټ", "name:pt"=>"Kuwait", "name:qu"=>"Kuwait", "name:ro"=>"Kuweit", "name:ru"=>"Кувейт", "name:rw"=>"Koweti", "name:sa"=>"कुवैत", "name:se"=>"Kuwait", "name:sh"=>"Kuvajt", "name:sk"=>"Kuvajt", "name:sl"=>"Kuvajt", "name:so"=>"Kuwayt", "name:sq"=>"Kuvajti", "name:sr"=>"Кувајт", "name:ss"=>"IKhuwathi", "name:su"=>"Kuwait", "name:sv"=>"Kuwait", "name:sw"=>"Kuwait", "name:ta"=>"குவைத்", "name:te"=>"కువైట్", "name:tg"=>"Кувайт", "name:th"=>"ประเทศคูเวต", "name:tk"=>"Kuweýt", "name:tl"=>"Kuwait", "name:tr"=>"Kuveyt", "name:tt"=>"Күвәйт", "name:ug"=>"كۇۋەيت", "name:uk"=>"Кувейт", "name:ur"=>"کویت", "name:uz"=>"Quvayt", "name:vi"=>"Kuwait", "name:vo"=>"Kovätän", "name:wo"=>"Kowet", "name:yi"=>"קואווייט", "name:yo"=>"Kuwaiti", "name:zh"=>"科威特"
-ls     "name"=>"Lesotho", "name:af"=>"Lesotho", "name:am"=>"ሌሶቶ", "name:an"=>"Lesoto", "name:ar"=>"ليسوتو", "name:az"=>"Lesoto", "name:ba"=>"Лесото", "name:be"=>"Лесота", "name:bg"=>"Лесото", "name:bm"=>"Lesoto", "name:bn"=>"লেসোথো", "name:bo"=>"ལི་སོ་ཐོ།", "name:br"=>"Lesotho", "name:bs"=>"Lesoto", "name:ca"=>"Lesotho", "name:ce"=>"Лесото", "name:cs"=>"Lesotho", "name:cv"=>"Лесото", "name:cy"=>"Lesotho", "name:da"=>"Lesotho", "name:de"=>"Lesotho", "name:dv"=>"ލެސޯތޯ", "name:ee"=>"Lesotho", "name:el"=>"Λεσότο", "name:en"=>"Lesotho", "name:eo"=>"Lesoto", "name:es"=>"Lesoto", "name:et"=>"Lesotho", "name:eu"=>"Lesotho", "name:fa"=>"لسوتو", "name:fi"=>"Lesotho", "name:fo"=>"Lesoto", "name:fr"=>"Lesotho", "name:fy"=>"Lesoto", "name:ga"=>"Leosóta", "name:gd"=>"Leasoto", "name:gl"=>"Lesoto", "name:gv"=>"Lesoto", "name:he"=>"לסוטו", "name:hi"=>"लेसोथो", "name:hr"=>"Lesoto", "name:ht"=>"Lezoto", "name:hu"=>"Lesotho", "name:hy"=>"Լեսոթո", "name:ia"=>"Lesotho", "name:id"=>"Lesotho", "name:ie"=>"Lesotho", "name:io"=>"Lesotho", "name:is"=>"Lesótó", "name:it"=>"Lesotho", "name:ja"=>"レソト", "name:jv"=>"Lesotho", "name:ka"=>"ლესოთო", "name:kg"=>"Lesotho", "name:kk"=>"Лесото", "name:kn"=>"ಲೆಸೊಥೊ", "name:ko"=>"레소토", "name:ku"=>"Lesoto", "name:kw"=>"Lesotho", "name:la"=>"Lesothum", "name:lb"=>"Lesotho", "name:li"=>"Lesotho", "name:ln"=>"Lesoto", "name:lt"=>"Lesotas", "name:lv"=>"Lesoto", "name:mi"=>"Teroto", "name:mk"=>"Лесото", "name:ml"=>"ലെസോത്തോ", "name:mn"=>"Лесото", "name:mr"=>"लेसोथो", "name:ms"=>"Lesotho", "name:mt"=>"Lesoto", "name:my"=>"လီဆိုသိုနိုင်ငံ", "name:na"=>"Resoto", "name:nl"=>"Lesotho", "name:nn"=>"Lesotho", "name:no"=>"Lesotho", "name:nv"=>"Sotho Dineʼé Bikéyah", "name:oc"=>"Lesotho", "name:or"=>"ଲିସୁଟୁ", "name:os"=>"Лесото", "name:pa"=>"ਲਿਸੋਥੋ", "name:pl"=>"Lesotho", "name:pt"=>"Lesoto", "name:qu"=>"Suthusuyu", "name:ro"=>"Lesotho", "name:ru"=>"Лесото", "name:rw"=>"Lesoto", "name:sa"=>"लेसोथो", "name:se"=>"Lesotho", "name:sg"=>"Lesôtho", "name:sh"=>"Lesoto", "name:sk"=>"Lesotho", "name:sl"=>"Lesoto", "name:sn"=>"Lesotho", "name:so"=>"Lesotho", "name:sq"=>"Lesoto", "name:sr"=>"Лесото", "name:ss"=>"ÉLusûtfu", "name:st"=>"Lesotho", "name:su"=>"Lésotho", "name:sv"=>"Lesotho", "name:sw"=>"Lesotho", "name:ta"=>"லெசோத்தோ", "name:tg"=>"Лесото", "name:th"=>"ประเทศเลโซโท", "name:tk"=>"Lesoto", "name:tl"=>"Lesoto", "name:tn"=>"Lesotho", "name:tr"=>"Lesotho", "name:ts"=>"Lesotho", "name:tt"=>"Лесото", "name:ug"=>"لېسوتو", "name:uk"=>"Лесото", "name:ur"=>"لیسوتھو", "name:uz"=>"Lesoto", "name:ve"=>"Li-Sotho", "name:vi"=>"Lesotho", "name:vo"=>"Lesotän", "name:wo"=>"Lesoto", "name:yi"=>"לעסאטא", "name:yo"=>"Lèsóthò", "name:zh"=>"莱索托/賴索托", "name:zu"=>"OSotho"
-gi     "name"=>"Gibraltar", "name:af"=>"Gibraltar", "name:an"=>"Chibraltar", "name:ar"=>"جبل طارق", "name:az"=>"Cəbəli-Tariq", "name:ba"=>"Гибралтар", "name:be"=>"Гібралтар", "name:bg"=>"Гибралтар", "name:bn"=>"জিব্রাল্টার", "name:br"=>"Jibraltar", "name:bs"=>"Gibraltar", "name:ca"=>"Gibraltar", "name:cs"=>"Gibraltar", "name:cv"=>"Гибралтар", "name:cy"=>"Gibraltar", "name:da"=>"Gibraltar", "name:de"=>"Gibraltar", "name:dv"=>"ޖަބަލްޠާރިޤު", "name:el"=>"Γιβραλτάρ", "name:en"=>"Gibraltar", "name:eo"=>"Ĝibraltaro", "name:es"=>"Gibraltar", "name:et"=>"Gibraltar", "name:eu"=>"Gibraltar", "name:fa"=>"جبل طارق", "name:fi"=>"Gibraltar", "name:fo"=>"Gibraltar", "name:fr"=>"Gibraltar", "name:fy"=>"Gibraltar", "name:ga"=>"Giobráltar", "name:gd"=>"Giobraltair", "name:gl"=>"Xibraltar", "name:gv"=>"Gibraaltar", "name:he"=>"גיברלטר", "name:hi"=>"जिब्राल्टर", "name:hr"=>"Gibraltar", "name:hu"=>"Gibraltár", "name:hy"=>"Ջիբրալթար", "name:ia"=>"Gibraltar", "name:id"=>"Gibraltar", "name:ie"=>"Gibraltar", "name:io"=>"Gibraltar", "name:is"=>"Gíbraltar", "name:it"=>"Gibilterra", "name:ja"=>"ジブラルタル", "name:jv"=>"Gibraltar", "name:ka"=>"გიბრალტარი", "name:kk"=>"Гибралтар", "name:ko"=>"지브롤터", "name:ku"=>"Cîbraltar", "name:kw"=>"Jibraltar", "name:la"=>"Gibraltar", "name:lb"=>"Gibraltar", "name:li"=>"Gibraltar", "name:lt"=>"Gibraltaras", "name:lv"=>"Gibraltārs", "name:mi"=>"Kāmaka", "name:mk"=>"Гибралтар", "name:mn"=>"Гибралтар", "name:mr"=>"जिब्राल्टर", "name:ms"=>"Gibraltar", "name:my"=>"ဂျီဘရော်လ်တာ", "name:ne"=>"गिब्राल्टार", "name:nl"=>"Gibraltar", "name:nn"=>"Gibraltar", "name:no"=>"Gibraltar", "name:oc"=>"Gibartar", "name:or"=>"ଜିବ୍ରାଲେଟର", "name:os"=>"Гибралтар", "name:pa"=>"ਜਿਬਰਾਲਟਰ", "name:pl"=>"Gibraltar", "name:pt"=>"Gibraltar", "name:ro"=>"Gibraltar", "name:ru"=>"Гибралтар", "name:rw"=>"Giburalitari", "name:sh"=>"Gibraltar", "name:sk"=>"Gibraltár", "name:sl"=>"Gibraltar", "name:so"=>"Jibraltaar", "name:sq"=>"Gjibraltari", "name:sr"=>"Гибралтар", "name:su"=>"Gibraltar", "name:sv"=>"Gibraltar", "name:sw"=>"Gibraltar", "name:ta"=>"ஜிப்ரால்ட்டர்", "name:tg"=>"Гибралтар", "name:th"=>"ยิบรอลตาร์", "name:tl"=>"Hibraltar", "name:tr"=>"Cebelitarık", "name:tt"=>"Гибралтар", "name:uk"=>"Гібралтар", "name:ur"=>"جبل الطارق", "name:vi"=>"Gibraltar", "name:wa"=>"Djibraltar", "name:wo"=>"Jibraltaar", "name:yi"=>"גיבראלטאר", "name:yo"=>"Gibraltar", "name:zh"=>"直布罗陀"
-au     "name"=>"Australia", "name:ab"=>"Австралиа", "name:af"=>"Australië", "name:am"=>"አውስትራልያ", "name:an"=>"Australia", "name:ar"=>"أستراليا", "name:as"=>"অষ্ট্ৰেলিয়া", "name:ay"=>"Australla", "name:az"=>"Avstraliya", "name:ba"=>"Австралия", "name:be"=>"Аўстра́лія", "name:bg"=>"Австралия", "name:bh"=>"ऑस्ट्रेलिया", "name:bi"=>"Ostrelia", "name:bm"=>"Ostralia", "name:bn"=>"অস্ট্রেলিয়া", "name:bo"=>"ཨོ་སེ་ཐེ་ལི་ཡ།", "name:br"=>"Aostralia", "name:bs"=>"Australija", "name:ca"=>"Austràlia", "name:ce"=>"Австра́ли", "name:co"=>"Australia", "name:cs"=>"Austrálie", "name:cu"=>"Аѵстралїꙗ", "name:cv"=>"Австрали", "name:cy"=>"Awstralia", "name:da"=>"Australien", "name:de"=>"Australien", "name:dv"=>"އޮސްޓަރުލިޔާ", "name:dz"=>"ཨས་ཊེཡེ་ལི་ཡ", "name:ee"=>"Australia", "name:el"=>"Αυστραλία", "name:en"=>"Australia", "name:eo"=>"Aŭstralio", "name:es"=>"Australia", "name:et"=>"Austraalia", "name:eu"=>"Australia", "name:fa"=>"استرالیا", "name:fi"=>"Australia", "name:fo"=>"Avstralia", "name:fr"=>"Australie", "name:fy"=>"Austraalje", "name:ga"=>"Astráil", "name:gd"=>"Astràilia", "name:gl"=>"Australia", "name:gn"=>"Autaralia", "name:gu"=>"ઑસ્ટ્રેલિયા", "name:gv"=>"Austrail", "name:ha"=>"Asturaliya", "name:he"=>"אוסטרליה", "name:hi"=>"ऑस्ट्रेलिया", "name:hr"=>"Australija", "name:ht"=>"Ostrali", "name:hu"=>"Ausztrália", "name:hy"=>"Ավստրալիա", "name:ia"=>"Australia", "name:id"=>"Australia", "name:ie"=>"Australia", "name:ig"=>"Ostraliya", "name:io"=>"Australia", "name:is"=>"Ástralía", "name:it"=>"Australia", "name:iu"=>"ᐊᔅᑦᕌᓕᐊ", "name:ja"=>"オーストラリア", "name:jv"=>"Ostrali", "name:ka"=>"ავსტრალია", "name:kg"=>"Australia", "name:ki"=>"Australia", "name:kk"=>"Аустралия", "name:kl"=>"Australia", "name:km"=>"អូស្ត្រាលី", "name:kn"=>"ಆಸ್ಟ್ರೇಲಿಯ", "name:ko"=>"오스트레일리아", "name:ku"=>"Awistralya", "name:kv"=>"Австралия", "name:kw"=>"Ostrali", "name:ky"=>"Австралия", "name:la"=>"Australia", "name:lb"=>"Australien", "name:li"=>"Australië", "name:lo"=>"ປະເທດອົດສະຕາລີ", "name:lt"=>"Australija", "name:lv"=>"Austrālija", "name:mg"=>"Aostralia", "name:mi"=>"Ahitereiria", "name:mk"=>"Австралија", "name:ml"=>"ഓസ്ട്രേലിയ", "name:mn"=>"Австрали", "name:mr"=>"ऑस्ट्रेलिया", "name:ms"=>"Australia", "name:mt"=>"Awstralja", "name:my"=>"ဩစတြေးလျနိုင်ငံ", "name:na"=>"Otereiriya", "name:ne"=>"अष्ट्रेलिया", "name:nl"=>"Australië", "name:nn"=>"Australia", "name:no"=>"Australia", "name:nv"=>"Nahatʼeʼiitsoh Bikéyah", "name:oc"=>"Austràlia", "name:om"=>"Awustireliyaa", "name:or"=>"ଅଷ୍ଟ୍ରେଲିଆ", "name:os"=>"Австрали", "name:pa"=>"ਆਸਟ੍ਰੇਲੀਆ", "name:pi"=>"आस्ट्रेलिया", "name:pl"=>"Australia", "name:ps"=>"آسټراليا", "name:pt"=>"Austrália", "name:qu"=>"Awstralya", "name:rm"=>"Australia", "name:rn"=>"Australiya", "name:ro"=>"Australia", "name:ru"=>"Австралия", "name:rw"=>"Ositaraliya", "name:sa"=>"आस्ट्रेलिया", "name:sc"=>"Austràlia", "name:sd"=>"آسٽريليا", "name:se"=>"Australia", "name:sg"=>"Ostralïi", "name:sh"=>"Australija", "name:si"=>"ඕස්ට්‍රේලියාව", "name:sk"=>"Austrália", "name:sl"=>"Avstralija", "name:sm"=>"Ausetalia", "name:sn"=>"Australia", "name:so"=>"Australia", "name:sq"=>"Australia", "name:sr"=>"Аустралија", "name:su"=>"Australia", "name:sv"=>"Australien", "name:sw"=>"Australia", "name:ta"=>"ஆஸ்திரேலியா", "name:te"=>"ఆస్ట్రేలియా", "name:tg"=>"Австралия", "name:th"=>"ออสเตรเลีย", "name:ti"=>"ኣውስትራሊያ", "name:tk"=>"Awstraliýa", "name:tl"=>"Australya", "name:tr"=>"Avustralya", "name:tt"=>"Австралия", "name:tw"=>"Australia", "name:ty"=>"Autereraria", "name:ug"=>"ئاۋستىرالىيە", "name:uk"=>"Австра́лія", "name:ur"=>"آسٹریلیا", "name:uz"=>"Avstraliya", "name:vi"=>"Úc", "name:vo"=>"Laustralän", "name:wa"=>"Ostraleye", "name:wo"=>"Óstraali", "name:yi"=>"אויסטראַליע", "name:yo"=>"Austrálíà", "name:za"=>"Audaihleihya", "name:zh"=>"澳大利亚", "name:zu"=>"I-Ostreliya"
-md     "name"=>"Moldova", "name:ab"=>"Молдова", "name:af"=>"Moldowa", "name:am"=>"ሞልዶቫ", "name:an"=>"Moldavia", "name:ar"=>"مولدوفا", "name:az"=>"Moldova", "name:ba"=>"Молдова", "name:be"=>"Малдова", "name:bg"=>"Молдова", "name:bi"=>"Moldova", "name:bn"=>"মলদোভা", "name:bo"=>"མོལ་དོ་ཝ།", "name:br"=>"Moldova", "name:bs"=>"Moldavija", "name:ca"=>"Moldàvia", "name:ce"=>"Молдави", "name:co"=>"Moldavia", "name:cs"=>"Moldavsko", "name:cu"=>"Молдова", "name:cv"=>"Молдави", "name:cy"=>"Moldofa", "name:da"=>"Moldova", "name:de"=>"Moldawien", "name:dv"=>"މޮލްޑޯވާ", "name:ee"=>"Moldova", "name:el"=>"Μολδαβία", "name:en"=>"Moldova", "name:eo"=>"Moldavio", "name:es"=>"Moldavia", "name:et"=>"Moldova", "name:eu"=>"Moldavia", "name:fa"=>"مولداوی", "name:fi"=>"Moldova", "name:fo"=>"Moldova", "name:fr"=>"Moldavie", "name:fy"=>"Moldaavje", "name:ga"=>"An Mholdóiv", "name:gd"=>"Moldàibhia", "name:gl"=>"Moldavia", "name:gu"=>"મોલ્દોવા", "name:gv"=>"Moldova", "name:he"=>"מולדובה", "name:hi"=>"मॉल्डोवा", "name:hr"=>"Moldova", "name:ht"=>"Moldavi", "name:hu"=>"Moldova", "name:hy"=>"Մոլդովա", "name:ia"=>"Moldova", "name:id"=>"Moldova", "name:ie"=>"Moldavia", "name:io"=>"Moldova", "name:is"=>"Moldóva", "name:it"=>"Moldavia", "name:ja"=>"モルドバ", "name:jv"=>"Moldova", "name:ka"=>"მოლდოვა", "name:kg"=>"Moldova", "name:kk"=>"Молдова", "name:kl"=>"Moldova", "name:kn"=>"ಮಾಲ್ಡೋವ", "name:ko"=>"몰도바", "name:ku"=>"Moldova", "name:kv"=>"Молдова", "name:kw"=>"Moldova", "name:ky"=>"Молдова", "name:la"=>"Moldavia", "name:lb"=>"Moldawien", "name:li"=>"Moldavië", "name:lt"=>"Moldavija", "name:lv"=>"Moldova", "name:mi"=>"Te Whenua o Morotawa", "name:mk"=>"Молдавија", "name:ml"=>"മൊൾഡോവ", "name:mn"=>"Молдав", "name:mo"=>"Мoldova", "name:mr"=>"मोल्दोव्हा", "name:ms"=>"Moldova", "name:mt"=>"Moldova", "name:my"=>"မော်လ်ဒိုဗာနိုင်ငံ", "name:na"=>"Mordowa", "name:ne"=>"मोल्दोवा", "name:nl"=>"Moldavië", "name:nn"=>"Moldova", "name:no"=>"Moldova", "name:oc"=>"Moldàvia", "name:or"=>"ମାଲଡୋଭା", "name:os"=>"Молдави", "name:pa"=>"ਮੋਲਦੋਵਾ", "name:pl"=>"Mołdawia", "name:pt"=>"Moldávia", "name:qu"=>"Mulduwa", "name:ro"=>"Moldova", "name:ru"=>"Молдавия", "name:rw"=>"Molidova", "name:sa"=>"मोल्दोवा", "name:se"=>"Moldova", "name:sh"=>"Moldavija", "name:sk"=>"Moldavsko", "name:sl"=>"Moldavija", "name:so"=>"Moldofa", "name:sq"=>"Moldavia", "name:sr"=>"Молдавија", "name:ss"=>"IMolidiva", "name:st"=>"Moldova", "name:su"=>"Moldova", "name:sv"=>"Moldavien", "name:sw"=>"Moldova", "name:ta"=>"மல்தோவா", "name:te"=>"మోల్డోవా", "name:tg"=>"Молдова", "name:th"=>"ประเทศมอลโดวา", "name:tk"=>"Moldawiýa", "name:tl"=>"Moldavia", "name:tr"=>"Moldova", "name:tt"=>"Молдавия", "name:ug"=>"مولدوۋا", "name:uk"=>"Молдова", "name:ur"=>"مالدووا", "name:uz"=>"Moldova", "name:vi"=>"Moldova", "name:vo"=>"Moldovän", "name:wo"=>"Moldaawi", "name:yi"=>"מאלדאווע", "name:yo"=>"Móldófà", "name:zh"=>"摩尔多瓦"
-tv     "name"=>"Tuvalu", "name:am"=>"ቱቫሉ", "name:ar"=>"توفالو", "name:be"=>"Тувалу", "name:bg"=>"Тувалу", "name:bn"=>"টুভালু", "name:bo"=>"ཐུ་ཝ་ལུ།", "name:br"=>"Tuvalu", "name:ca"=>"Tuvalu", "name:cs"=>"Tuvalu", "name:cy"=>"Twfalw", "name:da"=>"Tuvalu", "name:de"=>"Tuvalu", "name:dz"=>"ཏུ་ཝ་ལུ", "name:ee"=>"Tuvalu nutome", "name:el"=>"Τουβαλού", "name:en"=>"Tuvalu", "name:eo"=>"Tuvalo", "name:es"=>"Tuvalu", "name:fa"=>"تووالو", "name:ff"=>"Tuwaluu", "name:fi"=>"Tuvalu", "name:fr"=>"Tuvalu", "name:fy"=>"Tûvalû", "name:ga"=>"Tuvalu", "name:gd"=>"Tubhalu", "name:gu"=>"તુવાલુ", "name:gv"=>"Tuvalu", "name:ha"=>"Tubalu", "name:he"=>"טובלו", "name:hi"=>"तुवालु", "name:hr"=>"Tuvalu", "name:hu"=>"Tuvalu", "name:hy"=>"Տուվալու", "name:is"=>"Túvalú", "name:ja"=>"ツバル", "name:ka"=>"ტუვალუ", "name:km"=>"ទូវ៉ាលូ", "name:kn"=>"ಟುವಾಲು", "name:ko"=>"투발루", "name:ks"=>"توٗوالوٗ", "name:ku"=>"Tûvalû", "name:lo"=>"ຕູວາລູ", "name:lt"=>"Tuvalu", "name:lv"=>"Tuvalu", "name:mg"=>"Tovalò", "name:mk"=>"Тувалу", "name:ml"=>"തുവാലു", "name:mn"=>"Тувалу", "name:mr"=>"टुवालु", "name:ne"=>"तुभालु", "name:no"=>"Tuvalu", "name:oc"=>"Tuvalu", "name:or"=>"ଟୁଭାଲୁ", "name:pl"=>"Tuvalu", "name:pt"=>"Tuvalu", "name:ru"=>"Тувалу", "name:se"=>"Tuvalu", "name:sg"=>"Tüvalü", "name:si"=>"ටුවාලූ", "name:sk"=>"Tuvalu", "name:sr"=>"Тувалу", "name:sv"=>"Tuvalu", "name:ta"=>"துவாலூ", "name:te"=>"టువాలు", "name:th"=>"ประเทศตูวาลู", "name:ti"=>"ቱቫሉ", "name:to"=>"Tūvalu", "name:uk"=>"Тувалу", "name:ur"=>"ٹووالو", "name:vo"=>"Tuvaluäns", "name:yo"=>"Orílẹ́ède Tufalu", "name:zh"=>"吐瓦鲁", "name:zu"=>"i-Tuvalu"
-bb     "name"=>"Barbados", "name:af"=>"Barbados", "name:am"=>"ባርቤዶስ", "name:an"=>"Barbados", "name:ar"=>"باربادوس", "name:ay"=>"Barbados", "name:az"=>"Barbados", "name:ba"=>"Барба́дос", "name:be"=>"Барба́дас", "name:bg"=>"Барбадос", "name:bn"=>"বার্বাডোস", "name:bo"=>"བར་བ་ཌོ་སི།", "name:br"=>"Barbados", "name:bs"=>"Barbados", "name:ca"=>"Barbados", "name:ce"=>"Барбадос", "name:cs"=>"Barbados", "name:cy"=>"Barbados", "name:da"=>"Barbados", "name:de"=>"Barbados", "name:dv"=>"ބާބަޑޮސް", "name:ee"=>"Barbados", "name:el"=>"Μπαρμπάντος", "name:en"=>"Barbados", "name:eo"=>"Barbado", "name:es"=>"Barbados", "name:et"=>"Barbados", "name:eu"=>"Barbados", "name:fa"=>"باربادوس", "name:fi"=>"Barbados", "name:fo"=>"Barbados", "name:fr"=>"Barbade", "name:fy"=>"Barbados", "name:ga"=>"Barbadós", "name:gd"=>"Barbados", "name:gl"=>"Barbados", "name:gn"=>"Varvado", "name:gv"=>"Barbados", "name:he"=>"ברבדוס", "name:hi"=>"बारबाडोस", "name:hr"=>"Barbados", "name:ht"=>"Lababad", "name:hu"=>"Barbados", "name:hy"=>"Բարբադոսը", "name:ia"=>"Barbados", "name:id"=>"Barbados", "name:ie"=>"Barbados", "name:ig"=>"Barbados", "name:io"=>"Barbados", "name:is"=>"Barbados", "name:it"=>"Barbados", "name:ja"=>"バルバドス", "name:jv"=>"Barbadhos", "name:ka"=>"ბარბადოსი", "name:kk"=>"Барба́дос", "name:kn"=>"ಬಾರ್ಬಡೋಸ್", "name:ko"=>"바베이도스", "name:ku"=>"Barbados", "name:kv"=>"Барбадос", "name:kw"=>"Barbados", "name:ky"=>"Барбадос", "name:la"=>"Barbata", "name:lb"=>"Barbados", "name:li"=>"Barbados", "name:ln"=>"Barbados", "name:lt"=>"Barbadòsas", "name:lv"=>"Barbadosa", "name:mg"=>"Barbady", "name:mk"=>"Барбадос", "name:ml"=>"ബർബാഡോസ്", "name:mn"=>"Барбадос", "name:mr"=>"बार्बाडोस", "name:ms"=>"Barbados", "name:mt"=>"Barbados", "name:my"=>"ဘာဘေးဒိုးစ်နိုင်ငံ", "name:na"=>"Barbadot", "name:ne"=>"बार्बाडोस", "name:nl"=>"Barbados", "name:nn"=>"Barbados", "name:no"=>"Barbados", "name:oc"=>"Barbados", "name:om"=>"Baarbeedoos", "name:or"=>"ବାରବାଡୋସ", "name:os"=>"Барбадос", "name:pa"=>"ਬਾਰਬਾਡੋਸ", "name:pi"=>"बार्बाडोस", "name:pl"=>"Barbados", "name:ps"=>"بارباډوس", "name:pt"=>"Barbados", "name:rm"=>"Barbados", "name:ro"=>"Barbados", "name:ru"=>"Барбадос", "name:rw"=>"Barubadosi", "name:sa"=>"बार्बाडोस", "name:se"=>"Barbados", "name:sh"=>"Barbados", "name:sk"=>"Barbados", "name:sl"=>"Barbados", "name:sn"=>"Barbados", "name:so"=>"Barbados", "name:sq"=>"Barbadosi", "name:sr"=>"Барбадос", "name:ss"=>"iBhadosi", "name:su"=>"Barbados", "name:sv"=>"Barbados", "name:sw"=>"Barbados", "name:ta"=>"பார்படோசு", "name:te"=>"బార్బడోస్", "name:tg"=>"Барбáдос", "name:th"=>"บาร์เบโดส", "name:tl"=>"Barbados", "name:tr"=>"Barbados", "name:tt"=>"Барба́дос", "name:ug"=>"باربادوس", "name:uk"=>"Барба́дос", "name:ur"=>"بارباڈوس", "name:uz"=>"Barbados", "name:vi"=>"Barbados", "name:vo"=>"Barbadeän", "name:wa"=>"Barbåde", "name:wo"=>"Barbados", "name:yi"=>"באַרבאַדאס", "name:yo"=>"Bárbádọ̀s", "name:zh"=>"巴巴多斯"
-bz     "name"=>"Belize", "name:af"=>"Belize", "name:ak"=>"Beliz", "name:am"=>"ቤሊዝ", "name:an"=>"Belize", "name:ar"=>"بليز", "name:ay"=>"Wilisi", "name:az"=>"Beliz", "name:ba"=>"Белиз", "name:be"=>"Белі́з", "name:bg"=>"Белиз", "name:bm"=>"Belizi", "name:bn"=>"বেলিজ", "name:bo"=>"བེ་ལི་ཛི།", "name:br"=>"Belize", "name:bs"=>"Beliz", "name:ca"=>"Belize", "name:ce"=>"Бели́з", "name:cs"=>"Belize", "name:cv"=>"Белиз", "name:cy"=>"Belîs", "name:da"=>"Belize", "name:de"=>"Belize", "name:dv"=>"ބެލީޒު", "name:dz"=>"བེ་ལིཛ།", "name:ee"=>"Belize", "name:el"=>"Μπελίζ", "name:en"=>"Belize", "name:eo"=>"Belizo", "name:es"=>"Belice", "name:et"=>"Belize", "name:eu"=>"Belize", "name:fa"=>"بلیز", "name:ff"=>"Beliise", "name:fi"=>"Belize", "name:fo"=>"Belis", "name:fr"=>"Belize", "name:fy"=>"Belize", "name:ga"=>"an Bheilís", "name:gd"=>"Beilise", "name:gl"=>"Belice", "name:gn"=>"Mbelise", "name:gu"=>"બેલીઝ", "name:gv"=>"yn Veleesh", "name:ha"=>"Beliz", "name:he"=>"בליז", "name:hi"=>"बेलीज़", "name:hr"=>"Belize", "name:ht"=>"Beliz", "name:hu"=>"Belize", "name:hy"=>"Բելիզ", "name:ia"=>"Belize", "name:id"=>"Belize", "name:ie"=>"Belize", "name:io"=>"Belize", "name:is"=>"Belís", "name:it"=>"Belize", "name:ja"=>"ベリーズ", "name:jv"=>"Belize", "name:ka"=>"ბელიზი", "name:kk"=>"Бели́з", "name:km"=>"បេលីហ្ស", "name:kn"=>"ಬೆಲೀಜ್", "name:ko"=>"벨리즈", "name:ks"=>"بیلِج", "name:ku"=>"Belîze", "name:kw"=>"Belisa", "name:ky"=>"Белиз", "name:la"=>"Beliza", "name:lb"=>"Belize", "name:li"=>"Belize", "name:ln"=>"Belize", "name:lo"=>"ເບຊີວ", "name:lt"=>"Belizas", "name:lv"=>"Beliza", "name:mg"=>"Belizy", "name:mk"=>"Белизе", "name:ml"=>"ബെലീസ്", "name:mn"=>"Белиз", "name:mr"=>"बेलिझ", "name:ms"=>"Belize", "name:mt"=>"Beliże", "name:my"=>"ဘလိဇ်", "name:na"=>"Berij", "name:ne"=>"बेलिज", "name:nl"=>"Belize", "name:nn"=>"Belize", "name:no"=>"Belize", "name:oc"=>"Belize", "name:om"=>"Beliiz", "name:or"=>"ବେଲିଜ", "name:os"=>"Белиз", "name:pa"=>"ਬੇਲੀਜ਼", "name:pi"=>"बेलीज", "name:pl"=>"Belize", "name:ps"=>"بېلیز", "name:pt"=>"Belize", "name:qu"=>"Bilisi", "name:rm"=>"Belize", "name:ro"=>"Belize", "name:ru"=>"Белиз", "name:rw"=>"Belize", "name:sa"=>"बेलीज", "name:sc"=>"Belize", "name:se"=>"Belize", "name:sg"=>"Belîzi", "name:sh"=>"Belize", "name:si"=>"බෙලීස්", "name:sk"=>"Belize", "name:sl"=>"Belize", "name:sm"=>"Pelisi", "name:sn"=>"Belize", "name:so"=>"Belise", "name:sq"=>"Beliza", "name:sr"=>"Белизе", "name:ss"=>"iBhelizi", "name:su"=>"Bélis", "name:sv"=>"Belize", "name:sw"=>"Belize", "name:ta"=>"பெலீசு", "name:te"=>"బెలిజ్", "name:tg"=>"Белѝз", "name:th"=>"เบลีซ", "name:ti"=>"ቤሊዘ", "name:tl"=>"Belise", "name:to"=>"Pelise", "name:tr"=>"Belize", "name:tt"=>"Бели́з", "name:ug"=>"بېلىز", "name:uk"=>"Белі́з", "name:ur"=>"بیلیز", "name:uz"=>"Beliz", "name:vi"=>"Belize", "name:vo"=>"Belisän", "name:wo"=>"Beliis", "name:yi"=>"בעליז", "name:yo"=>"Bẹ̀lísè", "name:za"=>"Belize", "name:zh"=>"伯利兹", "name:zu"=>"Belize"
-gh     "name"=>"Ghana", "name:af"=>"Ghana", "name:ak"=>"Ghana", "name:am"=>"ጋና", "name:an"=>"Ghana", "name:ar"=>"غانا", "name:az"=>"Qana", "name:ba"=>"Гана", "name:be"=>"Гана", "name:bg"=>"Гана", "name:bm"=>"Gana", "name:bn"=>"ঘানা", "name:bo"=>"ཀ་ན།", "name:br"=>"Ghana", "name:bs"=>"Gana", "name:ca"=>"Ghana", "name:ce"=>"Гана", "name:co"=>"Ghana", "name:cs"=>"Ghana", "name:cv"=>"Гана", "name:cy"=>"Ghana", "name:da"=>"Ghana", "name:de"=>"Ghana", "name:dv"=>"ގާނާ", "name:ee"=>"Ghana", "name:el"=>"Γκάνα", "name:en"=>"Ghana", "name:eo"=>"Ganao", "name:es"=>"Ghana", "name:et"=>"Ghana", "name:eu"=>"Ghana", "name:fa"=>"غنا", "name:ff"=>"Gana", "name:fi"=>"Ghana", "name:fo"=>"Gana", "name:fr"=>"Ghana", "name:fy"=>"Gana", "name:ga"=>"Gána", "name:gd"=>"Gàna", "name:gl"=>"Gana", "name:gu"=>"ઘાના", "name:gv"=>"Yn Ghaney", "name:he"=>"גאנה", "name:hi"=>"घाना", "name:hr"=>"Gana", "name:ht"=>"Gana", "name:hu"=>"Ghána", "name:hy"=>"Գանա", "name:ia"=>"Ghana", "name:id"=>"Ghana", "name:ie"=>"Ghana", "name:ig"=>"Ghana", "name:io"=>"Ghana", "name:is"=>"Gana", "name:it"=>"Ghana", "name:ja"=>"ガーナ", "name:jv"=>"Ghana", "name:ka"=>"განა", "name:kg"=>"Gana", "name:ki"=>"Ghana", "name:kk"=>"Гана", "name:kn"=>"ಘಾನಾ", "name:ko"=>"가나", "name:ku"=>"Gana", "name:kw"=>"Ghana", "name:ky"=>"Гана", "name:la"=>"Gana", "name:lb"=>"Ghana", "name:li"=>"Ghana", "name:ln"=>"Ghana", "name:lt"=>"Gana", "name:lv"=>"Gana", "name:mg"=>"Ghana", "name:mi"=>"Kāna", "name:mk"=>"Гана", "name:ml"=>"ഘാന", "name:mn"=>"Гана", "name:mr"=>"घाना", "name:ms"=>"Ghana", "name:mt"=>"Gana", "name:my"=>"ဂါနာနိုင်ငံ", "name:na"=>"Gana", "name:ne"=>"घाना", "name:nl"=>"Ghana", "name:nn"=>"Ghana", "name:no"=>"Ghana", "name:nv"=>"Gáana", "name:oc"=>"Ghana", "name:or"=>"ଘାନା", "name:os"=>"Ганæ", "name:pa"=>"ਘਾਨਾ", "name:pl"=>"Ghana", "name:ps"=>"ګانا", "name:pt"=>"Gana", "name:qu"=>"Gana", "name:rm"=>"Ghana", "name:ro"=>"Ghana", "name:ru"=>"Гана", "name:rw"=>"Gana", "name:sa"=>"घाना", "name:sc"=>"Ghana", "name:se"=>"Ghana", "name:sg"=>"Ganäa", "name:sh"=>"Gana", "name:sk"=>"Ghana", "name:sl"=>"Gana", "name:sn"=>"Ghana", "name:so"=>"Gaana", "name:sq"=>"Gana", "name:sr"=>"Гана", "name:ss"=>"IGana", "name:su"=>"Ghana", "name:sv"=>"Ghana", "name:sw"=>"Ghana", "name:ta"=>"கானா", "name:te"=>"ఘనా", "name:tg"=>"Гана", "name:th"=>"ประเทศกานา", "name:tk"=>"Gana", "name:tl"=>"Ghana", "name:tr"=>"Gana", "name:ts"=>"Ghana", "name:tt"=>"Гана", "name:tw"=>"Ghana", "name:ug"=>"گانا جۇمھۇرىيىتى", "name:uk"=>"Гана", "name:ur"=>"گھانا", "name:uz"=>"Gana", "name:vi"=>"Ghana", "name:vo"=>"Ganän", "name:wa"=>"Gana", "name:wo"=>"Gana", "name:yi"=>"גהאנע", "name:yo"=>"Ghánà", "name:zh"=>"加纳", "name:zu"=>"IGana"
-nu     "name"=>"Niuē", "name:ar"=>"نييوي", "name:be"=>"Ніуэ", "name:bg"=>"Ниуе", "name:br"=>"Niue", "name:cs"=>"Niue", "name:da"=>"Niue", "name:de"=>"Niue", "name:dv"=>"ނީއު", "name:el"=>"Νιούε", "name:en"=>"Niue", "name:eo"=>"Niuo", "name:es"=>"Niue", "name:fa"=>"نیووی", "name:fi"=>"Niue", "name:fr"=>"Niue", "name:fy"=>"Niûé", "name:ga"=>"Niue", "name:he"=>"ניואה", "name:hr"=>"Niue", "name:hu"=>"Niue", "name:is"=>"Niue", "name:ja"=>"ニウエ", "name:ka"=>"ნიუე", "name:kk"=>"Ниуе", "name:ko"=>"니우에", "name:ku"=>"Niûe", "name:lt"=>"Niujė", "name:lv"=>"Niue", "name:mk"=>"Ниуе", "name:ml"=>"നിയുവെ", "name:mn"=>"Ниуэ", "name:mr"=>"न्युए", "name:os"=>"Ниуэ", "name:pl"=>"Niue", "name:ru"=>"Ниуэ", "name:rw"=>"Niyuwe", "name:sk"=>"Niue", "name:sr"=>"Нијуе", "name:sv"=>"Niue", "name:ta"=>"நியுவே", "name:th"=>"นีอูเอ", "name:ug"=>"Niué Arili", "name:uk"=>"Ніуе", "name:ur"=>"نیووے", "name:wo"=>"Niwe", "name:zh"=>"紐埃"
-pw     "name"=>"Belau", "name:ar"=>"بالاو", "name:cs"=>"Palau", "name:de"=>"Palau", "name:en"=>"Palau", "name:eo"=>"Palaŭo", "name:fr"=>"Palaos", "name:hr"=>"Palau", "name:ia"=>"Palau", "name:io"=>"Palau", "name:lt"=>"Palau", "name:mi"=>"Pārau", "name:oc"=>"Belau", "name:pl"=>"Palau", "name:ru"=>"Палау", "name:se"=>"Palau", "name:sk"=>"Palau", "name:sl"=>"Palau", "name:sr"=>"Палау", "name:ta"=>"பலாவு", "name:uk"=>"Палау", "name:vi"=>"Palau", "name:vo"=>"Palauäns", "name:zh"=>"帕劳 / 帛琉"
-ag     "name"=>"Antigua and Barbuda", "name:af"=>"Antigua en Barbuda", "name:ak"=>"Antigua ne Baabuda", "name:am"=>"አንቲጋ እና ባርቡዳ", "name:an"=>"Antigua y Barbuda", "name:ar"=>"أنتيغوا وباربودا", "name:as"=>"এণ্টিগুৱা আৰু বাৰ্বুডা", "name:ay"=>"Antiwa wan Barbuda", "name:az"=>"Antiqua və Barbuda", "name:ba"=>"Антигуа һәм Барбуда", "name:be"=>"Антыгуа́ і Барбу́да", "name:bg"=>"Антигуа и Барбуда", "name:bm"=>"Antiga-ni-Barbuda", "name:bn"=>"অ্যান্টিগুয়া ও বার্বুডা", "name:bo"=>"ཨེན་ཊི་གུའ་དང་བར་བུ་ཌ།", "name:br"=>"Antigua ha Barbuda", "name:bs"=>"Antigva i Barbuda", "name:ca"=>"Antigua i Barbuda", "name:ce"=>"Анти́гуа а Барбу́да", "name:cs"=>"Antigua a Barbuda", "name:cy"=>"Antigwa a Barbiwda", "name:da"=>"Antigua og Barbuda", "name:de"=>"Antigua und Barbuda", "name:dv"=>"އެންޓިގުއާ އަދި ބާބިއުޑާ", "name:dz"=>"ཨན་ཊི་གུ་ཝ་ ཨེནཌ་ བྷར་བྷུ་ཌ", "name:ee"=>"Antigua and Barbuda", "name:el"=>"Αντίγκουα και Μπαρμπούντα", "name:en"=>"Antigua and Barbuda", "name:eo"=>"Antigvo-Barbudo", "name:es"=>"Antigua y Barbuda", "name:et"=>"Antigua ja Barbuda", "name:eu"=>"Antigua eta Barbuda", "name:fa"=>"آنتیگوا و باربودا", "name:ff"=>"Antiguwaa e Barbudaa", "name:fi"=>"Antigua ja Barbuda", "name:fo"=>"Antigua og Barbuda", "name:fr"=>"Antigua-et-Barbuda", "name:fy"=>"Antigûa en Barbûda", "name:ga"=>"Antigua agus Barbúda", "name:gd"=>"Antigua agus Barbuda", "name:gl"=>"Antiga e Barbuda", "name:gn"=>"Antigua ha Barbuda", "name:gu"=>"એન્ટીગુઆ અને બરબુડા", "name:gv"=>"Antigua as Barbuda", "name:ha"=>"Antigwa da Barbuba", "name:he"=>"אנטיגואה וברבודה", "name:hi"=>"अण्टीगुआ और बारबूडा", "name:hr"=>"Antigva i Barbuda", "name:ht"=>"Antigwa ak Babouda", "name:hu"=>"Antigua és Barbuda", "name:hy"=>"Անտիգուա և Բարբուդա", "name:ia"=>"Antigua e Barbuda", "name:id"=>"Antigua dan Barbuda", "name:ie"=>"Antigua e Barbuda", "name:io"=>"Antigua e Barbuda", "name:is"=>"Antígva og Barbúda", "name:it"=>"Antigua e Barbuda", "name:ja"=>"アンティグア・バーブーダ", "name:jv"=>"Antigua lan Barbuda", "name:ka"=>"ანტიგუა და ბარბუდა", "name:ki"=>"Antigua na Barbuda", "name:kk"=>"Антигуа және Барбуда", "name:kl"=>"Antigua aamma Barbuda", "name:km"=>"អង់ទីគ័រ និង​បាបុយដា", "name:kn"=>"ಆಂಟಿಗುವ ಮತ್ತು ಬಾರ್ಬುಡ", "name:ko"=>"앤티가 바부다", "name:ks"=>"اٮ۪نٹِگُوا تہٕ باربوڑا", "name:ku"=>"Antîgua û Berbûda", "name:kw"=>"Antiga ha Barbuda", "name:ky"=>"Антигуа жана Барбуда", "name:la"=>"Antiqua et Barbuda", "name:lb"=>"Antigua a Barbuda", "name:lg"=>"Antigwa ne Barabuda", "name:li"=>"Antigua en Barbuda", "name:ln"=>"Antigua mpé Barbuda", "name:lo"=>"ແອນຕີກາວ ແລະ ບາບູດາ", "name:lt"=>"Antigva ir Barbuda", "name:lv"=>"Antigva un Barbuda", "name:mg"=>"Antigua sy Barbuda", "name:mk"=>"Антигва и Барбуда", "name:ml"=>"ആന്റിഗ്വയ ആന്റ് ബാർബൂഡ", "name:mn"=>"Антигуа ба Барбуда", "name:mr"=>"अँटिगा आणि बार्बुडा", "name:ms"=>"Antigua dan Barbuda", "name:mt"=>"Antigwa u Barbuda", "name:my"=>"အင်တီဂွါနှင့် ဘာဘူဒါ", "name:na"=>"Antigua me Barbuda", "name:nb"=>"Antigua og Barbuda", "name:ne"=>"एन्टिगुआ र बर्बुडा", "name:nl"=>"Antigua en Barbuda", "name:nn"=>"Antigua og Barbuda", "name:no"=>"Antigua og Barbuda", "name:nv"=>"Antíígwa dóó Hashkʼaan Bikéyah Yázhí", "name:oc"=>"Antigua e Barbuda", "name:om"=>"Antiiguwaa fi Baarbuudaa", "name:or"=>"ଆଣ୍ଟିଗୁଆ ଓ ବରବୁଡା", "name:os"=>"Антигуæ æмæ Барбудæ", "name:pa"=>"ਐਂਟੀਗੁਆ ਅਤੇ ਬਰਬੂਡਾ", "name:pl"=>"Antigua i Barbuda", "name:pt"=>"Antígua e Barbuda", "name:qu"=>"Antiwa Barbudawan", "name:rm"=>"Antigua e Barbuda", "name:ro"=>"Antigua și Barbuda", "name:ru"=>"Антигуа и Барбуда", "name:rw"=>"Antigwa na Baribuda", "name:sa"=>"अण्टीग्वा", "name:sc"=>"Antigua e Barbuda", "name:se"=>"Antigua ja Barbuda", "name:sh"=>"Antigva i Barbuda", "name:si"=>"ඇන්ටිගුවා සහ බාබියුඩා", "name:sk"=>"Antigua a Barbuda", "name:sl"=>"Antigva in Barbuda", "name:sn"=>"Antigua and Barbuda", "name:so"=>"Antigua iyo Barbuda", "name:sq"=>"Antigua dhe Barbuda", "name:sr"=>"Антигва и Барбуда", "name:ss"=>"iBhabudi ne Anithikhu", "name:su"=>"Antigua jeung Barbuda", "name:sv"=>"Antigua och Barbuda", "name:sw"=>"Antigua na Barbuda", "name:ta"=>"அன்டிகுவா பர்புடா", "name:te"=>"ఆంటిగ్వా మరియు బార్బుడా", "name:tg"=>"Антигуаю Барбуда", "name:th"=>"แอนติกาและบาร์บูดา", "name:ti"=>"አንቲጓ እና ባሩዳ", "name:tl"=>"Antigua at Barbuda", "name:to"=>"Anitikua mo Palaputa", "name:tr"=>"Antigua ve Barbuda", "name:tt"=>"Анти́гуа һәм Барбу́да", "name:ug"=>"ئانتىگۇئا ۋە باربۇدا", "name:uk"=>"Анти́гуа і Барбу́да", "name:ur"=>"اینٹیگوا و باربوڈا", "name:uz"=>"Antigua va Barbuda", "name:vi"=>"Antigua và Barbuda", "name:vo"=>"Lantigeän e Barbudeän", "name:wo"=>"Antigua ak Barbuda", "name:yo"=>"Ántígúà àti Bàrbúdà", "name:za"=>"Antigua caeuq Barbuda", "name:zh"=>"安提瓜和巴布达", "name:zu"=>"i-Antigua and Barbuda"
-bs     "name"=>"The Bahamas", "name:af"=>"Bahamas", "name:ak"=>"Bahama", "name:am"=>"ባሃማስ", "name:an"=>"Bahamas", "name:ar"=>"جزر باهاماس", "name:ay"=>"Bahamas", "name:az"=>"Bahamalar", "name:ba"=>"Багама утрауҙары", "name:be"=>"Бага́мскія Астравы́", "name:bg"=>"Бахамските острови", "name:bm"=>"Bahamasi", "name:bn"=>"বাহামা দ্বীপপুঞ্জ", "name:bo"=>"བ་ཧ་མཱ་སི།", "name:br"=>"Bahamas", "name:bs"=>"Bahami", "name:ca"=>"Bahames", "name:ce"=>"Багама", "name:cs"=>"Bahamy", "name:cv"=>"Пахамсем", "name:cy"=>"Y Bahamas", "name:da"=>"Bahamas", "name:de"=>"Die Bahamas", "name:dv"=>"ބަހާމަސް", "name:dz"=>"བཱ་ཧ་མས྄།", "name:ee"=>"Bahamas", "name:el"=>"Μπαχάμες", "name:en"=>"The Bahamas", "name:eo"=>"La Bahamoj", "name:es"=>"Las Bahamas", "name:et"=>"Bahama", "name:eu"=>"Bahamak", "name:fa"=>"باهاما", "name:ff"=>"Bahamaas", "name:fi"=>"Bahama", "name:fo"=>"Bahamaoyggjar", "name:fr"=>"Les Bahamas", "name:fy"=>"De Bahama's", "name:ga"=>"na Bahámaí", "name:gd"=>"na Bahàmas", "name:gl"=>"Bahamas", "name:gn"=>"Vaamakuéra", "name:gu"=>"બહામાસ", "name:gv"=>"ny Bahamaghyn", "name:he"=>"איי בהאמה", "name:hi"=>"बहामस", "name:hr"=>"Bahami", "name:ht"=>"Il Bahamas", "name:hu"=>"Bahama-szigetek", "name:hy"=>"Բահամները", "name:ia"=>"Bahamas", "name:id"=>"Bahama", "name:io"=>"Bahama", "name:is"=>"Bahamaeyjar", "name:it"=>"Le Bahamas", "name:ja"=>"バハマ", "name:jv"=>"Bahama", "name:ka"=>"ბაჰამის კუნძულები", "name:ki"=>"Bahama", "name:kk"=>"Багам аралдары", "name:km"=>"បាហាម៉ា", "name:kn"=>"ಬಹಾಮಾಸ್", "name:ko"=>"바하마", "name:ks"=>"بَہامَس", "name:ku"=>"Bahama", "name:kw"=>"Ynysow Bahama", "name:ky"=>"Багама аралдары", "name:la"=>"Bahamanae", "name:lb"=>"D'Bahamas", "name:lg"=>"Bahamasi", "name:li"=>"De Bahama's", "name:ln"=>"Bahamasɛ", "name:lo"=>"ບາຮາມມາສ", "name:lt"=>"Bahamos", "name:lv"=>"Bahamas", "name:mg"=>"Bahamasy", "name:mk"=>"Бахами", "name:ml"=>"ബഹാമാസ്", "name:mn"=>"Багамын Арлууд", "name:mr"=>"बहामास", "name:ms"=>"Bahamas", "name:mt"=>"Il-Baħamas", "name:my"=>"ဘဟားမားနိုင်ငံ", "name:na"=>"Bahamat", "name:ne"=>"बहामस", "name:nl"=>"Bahama's", "name:nn"=>"Bahamas", "name:no"=>"Bahamas", "name:oc"=>"Las Bahamas", "name:om"=>"Bahamaas", "name:or"=>"ବାହାମା", "name:os"=>"Багамтæ", "name:pa"=>"ਬਹਾਮਾਸ", "name:pi"=>"बहामास", "name:pl"=>"Bahamy", "name:pt"=>"Bahamas", "name:qu"=>"Bahamakuna", "name:rm"=>"Bahamas", "name:rn"=>"Bahamasi", "name:ro"=>"Bahamas", "name:ru"=>"Багамские Острова", "name:rw"=>"Bahamasi", "name:sa"=>"बहामास", "name:se"=>"Bahamasullot", "name:sg"=>"Bahâmasa", "name:sh"=>"Bahami", "name:si"=>"බහාමාස්", "name:sk"=>"Bahamy", "name:sl"=>"Bahami", "name:sn"=>"The Bahamas", "name:so"=>"Bahamas", "name:sq"=>"Bahamet", "name:sr"=>"Бахаме", "name:ss"=>"iBhahamasi", "name:su"=>"Bahama", "name:sv"=>"Bahamas", "name:sw"=>"Bahamas", "name:ta"=>"பாகாமாசு", "name:te"=>"బహామాస్", "name:tg"=>"Баҳамас", "name:th"=>"ประเทศบาฮามาส", "name:ti"=>"ባሃማስ", "name:tk"=>"Bagama Adalary", "name:tl"=>"Bahamas", "name:to"=>"Pahama", "name:tr"=>"Bahamalar", "name:tt"=>"Багамалар", "name:ug"=>"باھاما", "name:uk"=>"Багамські Острови", "name:ur"=>"بہاماس", "name:uz"=>"Bagam orollari", "name:vi"=>"Bahamas", "name:vo"=>"Bahamuäns", "name:wo"=>"Bahamas", "name:yi"=>"די באַהאַמאַס", "name:yo"=>"Àwọn Bàhámà", "name:za"=>"Bahamas", "name:zh"=>"巴哈马", "name:zu"=>"i-Bahamas"
-eh     "name"=>"الجمهورية العربية الصحراوية الديمقراطية", "name:ar"=>"الجمهورية العربية الصحراوية الديمقراطية", "name:cs"=>"Saharská arabská demokratická republika", "name:de"=>"Demokratische Arabische Republik Sahara", "name:el"=>"Δημοκρατία της Σαχάρας", "name:en"=>"Sahrawi Arab Democratic Republic", "name:es"=>"República Árabe Saharaui Democrática", "name:fa"=>"جمهوری دموکراتیک عربی صحرا", "name:fr"=>"République arabe sahraouie démocratique", "name:it"=>"Repubblica Araba Democratica dei Sahrawi", "name:lt"=>"Sacharos Arabų Demokratinė Respublika", "name:nl"=>"Arabische Democratische Republiek Sahara", "name:pt"=>"República Árabe Saaraui Democrática", "name:ru"=>"Сахарская Арабская Демократическая Республика", "name:ur"=>"صحراوی عرب عوامی جمہوریہ", "name:zh"=>"撒拉威阿拉伯民主共和國"
-sb     "name"=>"Solomon Islands", "name:af"=>"Solomoneilande", "name:am"=>"ሰለሞን ደሴቶች", "name:an"=>"Islas Salomón", "name:ar"=>"جزر سليمان", "name:az"=>"Solomon adaları", "name:be"=>"Саламонавы Астравы", "name:bg"=>"Соломонови острови", "name:bn"=>"সলোমন দ্বীপপুঞ্জ", "name:bo"=>"སོ་ལོ་མོན་གླིང་ཕྲན་ཚོ་ཁག", "name:br"=>"Inizi Solomon", "name:bs"=>"Solomonska Ostrva", "name:ca"=>"Salomó", "name:ce"=>"Соломонан гӀайреш", "name:cs"=>"Šalomounovy ostrovy", "name:cv"=>"Соломон Утравĕсем", "name:cy"=>"Ynysoedd Solomon", "name:da"=>"Salomonøerne", "name:de"=>"Salomonen", "name:dv"=>"ސޮލޮމޮން ޖަޒީރާ", "name:el"=>"Νήσοι Σολομώντα", "name:en"=>"Solomon Islands", "name:eo"=>"Salomonoj", "name:es"=>"Islas Salomón", "name:et"=>"Saalomoni Saared", "name:eu"=>"Salomon Uharteak", "name:fa"=>"جزایر سلیمان", "name:fi"=>"Salomonsaaret", "name:fo"=>"Sálomonoyggjarnar", "name:fr"=>"Salomon", "name:fy"=>"Salomonseilannen", "name:ga"=>"Oileáin Sholamón", "name:gd"=>"Na h-Eileanan Sholaimh", "name:gl"=>"Illas Salomón", "name:gv"=>"Ny h-Ellanyn Holomon", "name:he"=>"איי שלמה", "name:hi"=>"सोलोमन द्वीपसमूह", "name:hr"=>"Solomonski Otoci", "name:ht"=>"Salomon", "name:hu"=>"Salamon-szigetek", "name:hy"=>"Սողոմոնյան Կղզիներ", "name:id"=>"Kepulauan Solomon", "name:io"=>"Salomon Insuli", "name:is"=>"Salómonseyjar", "name:it"=>"Isole Salomone", "name:ja"=>"ソロモン諸島", "name:jv"=>"Kapuloan Solomon", "name:ka"=>"სოლომონის კუნძულები", "name:kk"=>"Соломон Аралдары", "name:kn"=>"ಸಾಲೊಮನ್ ದ್ವೀಪಗಳು", "name:ko"=>"솔로몬 제도", "name:ku"=>"Giravên Salomon", "name:kw"=>"Ynysow Salamon", "name:la"=>"Insulae Salomonis", "name:lb"=>"Salomonen", "name:li"=>"Salomonseilen", "name:lt"=>"Saliamono Salos", "name:lv"=>"Zālamana Salas", "name:mk"=>"Соломонски Острови", "name:ml"=>"സോളമൻ ദ്വീപുകൾ", "name:mr"=>"सॉलोमन द्वीपसमूह", "name:ms"=>"Kepulauan Solomon", "name:mt"=>"Gżejjer Solomon", "name:my"=>"ဆော်လမွန်အိုင်းလန်းနိုင်ငံ", "name:ne"=>"सोलोमन द्धीप", "name:nl"=>"Salomonseilanden", "name:nn"=>"Salomonøyane", "name:no"=>"Salomonøyene", "name:nv"=>"Sólomon Tó Bináhaazyínígíí", "name:oc"=>"Illas Salamon", "name:or"=>"ସୋଲୋମନ ଆୟରଲ୍ୟାଣ୍ଡ", "name:os"=>"Соломоны сакъадæхтæ", "name:pa"=>"ਸੋਲੋਮਨ ਟਾਪੂ", "name:pl"=>"Wyspy Salomona", "name:pt"=>"Ilhas Salomão", "name:qu"=>"Salumun wat'akuna", "name:ro"=>"Insulele Solomon", "name:ru"=>"Соломоновы Острова", "name:rw"=>"Ibirwa bya Solomoni", "name:sa"=>"सोलोमन-द्वीप", "name:se"=>"Salomonsullot", "name:sh"=>"Solomonski Otoci", "name:si"=>"සොලමන් දුපත්", "name:sk"=>"Šalamúnove ostrovy", "name:sl"=>"Salomonovi otoki", "name:sm"=>"Solomon Islands", "name:so"=>"Jasiiradaha Solomon", "name:sq"=>"Ishujt Solomon", "name:sr"=>"Соломонска Острва", "name:su"=>"Kapuloan Solomon", "name:sv"=>"Salomonöarna", "name:sw"=>"Visiwa vya Solomon", "name:ta"=>"சொலமன் தீவுகள்", "name:te"=>"సోలమన్ దీవులు", "name:tg"=>"Ҷазираҳои Соломон", "name:th"=>"หมู่เกาะโซโลมอน", "name:tl"=>"Kapuluang Solomon", "name:tr"=>"Solomon Adaları", "name:ug"=>"سولومون تاقىم ئاراللىرى", "name:uk"=>"Соломонові Острови", "name:ur"=>"جزائر سلیمان", "name:uz"=>"Solomon Orollari", "name:vi"=>"Quần đảo Solomon", "name:vo"=>"Solomonuäns", "name:wo"=>"Duni Solomon", "name:yo"=>"Àwọn Erékùsù Sólómọ́nì", "name:zh"=>"所罗门群岛"
-dm     "name"=>"Dominica", "name:af"=>"Dominika", "name:ar"=>"دومينيكا", "name:be"=>"Дамініка", "name:br"=>"Republik Dominikan", "name:cs"=>"Dominika", "name:de"=>"Dominica", "name:el"=>"Δομινίκα", "name:en"=>"Dominica", "name:eo"=>"Dominiko", "name:es"=>"Dominica", "name:eu"=>"Dominika", "name:fa"=>"دومینیکا", "name:fi"=>"Dominica", "name:fr"=>"Dominique", "name:fy"=>"Dominika", "name:ga"=>"Doiminice", "name:gd"=>"Doiminicia", "name:he"=>"דומיניקה", "name:hr"=>"Dominika", "name:hu"=>"Dominikai Közösség", "name:id"=>"Dominika", "name:is"=>"Dóminíka", "name:it"=>"Dominìca", "name:ja"=>"ドミニカ", "name:lt"=>"Dominika", "name:lv"=>"Dominika", "name:mn"=>"Доминика", "name:nl"=>"Dominica", "name:pl"=>"Dominika", "name:pt"=>"Dominica", "name:ru"=>"Доминика", "name:se"=>"Dominica", "name:sk"=>"Dominika", "name:sl"=>"Dominika", "name:sv"=>"Dominica", "name:th"=>"ประเทศโดมินิกา", "name:tr"=>"Dominika", "name:uk"=>"Домініка", "name:vo"=>"Dominikeän", "name:zh"=>"多米尼克"
-ml     "name"=>"Mali", "name:af"=>"Mali", "name:am"=>"ማሊ", "name:an"=>"Mali", "name:ar"=>"مالي", "name:az"=>"Mali", "name:ba"=>"Мали", "name:be"=>"Малі", "name:bg"=>"Мали", "name:bm"=>"Mali", "name:bn"=>"মালি", "name:bo"=>"མ་ལི།", "name:br"=>"Mali", "name:bs"=>"Mali", "name:ca"=>"Mali", "name:ce"=>"Мали", "name:cs"=>"Mali", "name:cv"=>"Мали", "name:cy"=>"Mali", "name:da"=>"Mali", "name:de"=>"Mali", "name:dv"=>"މާލީ", "name:ee"=>"Mali", "name:el"=>"Μάλι", "name:en"=>"Mali", "name:eo"=>"Malio", "name:es"=>"Malí", "name:et"=>"Mali", "name:eu"=>"Mali", "name:fa"=>"مالی", "name:ff"=>"Maali", "name:fi"=>"Mali", "name:fo"=>"Mali", "name:fr"=>"Mali", "name:fy"=>"Maly", "name:ga"=>"Mailí", "name:gd"=>"Màili", "name:gl"=>"Malí", "name:gv"=>"Malee", "name:ha"=>"Mali", "name:he"=>"מאלי", "name:hi"=>"माली", "name:hr"=>"Mali", "name:ht"=>"Mali", "name:hu"=>"Mali", "name:hy"=>"Մալի", "name:ia"=>"Mali", "name:id"=>"Mali", "name:ie"=>"Mali", "name:io"=>"Mali", "name:is"=>"Malí", "name:it"=>"Mali", "name:ja"=>"マリ共和国", "name:jv"=>"Mali", "name:ka"=>"მალი", "name:kg"=>"Mali", "name:kk"=>"Мали", "name:kn"=>"ಮಾಲಿ", "name:ko"=>"말리", "name:ku"=>"Malî", "name:kw"=>"Mali", "name:la"=>"Malium", "name:lb"=>"Mali", "name:li"=>"Mali", "name:ln"=>"Mali", "name:lt"=>"Malis", "name:lv"=>"Mali", "name:mi"=>"Māri", "name:mk"=>"Мали", "name:ml"=>"മാലി", "name:mn"=>"Мали", "name:mr"=>"माली", "name:ms"=>"Mali", "name:mt"=>"Mali", "name:my"=>"မာလီနိုင်ငံ", "name:nl"=>"Mali", "name:nn"=>"Mali", "name:no"=>"Mali", "name:oc"=>"Mali", "name:or"=>"ମାଲି", "name:os"=>"Мали", "name:pa"=>"ਮਾਲੀ", "name:pl"=>"Mali", "name:ps"=>"مالي", "name:pt"=>"Mali", "name:qu"=>"Mali", "name:ro"=>"Mali", "name:ru"=>"Мали", "name:rw"=>"Mali", "name:sa"=>"माली", "name:sc"=>"Mali", "name:se"=>"Mali", "name:sg"=>"Malïi", "name:sh"=>"Mali", "name:si"=>"මාලි", "name:sk"=>"Mali", "name:sl"=>"Mali", "name:sn"=>"Mali", "name:so"=>"Maali", "name:sq"=>"Mali", "name:sr"=>"Мали", "name:ss"=>"IMali", "name:st"=>"Mali", "name:su"=>"Mali", "name:sv"=>"Mali", "name:sw"=>"Mali", "name:ta"=>"மாலி", "name:tg"=>"Малӣ", "name:th"=>"ประเทศมาลี", "name:ti"=>"ማሊ", "name:tk"=>"Mali", "name:tl"=>"Mali", "name:tr"=>"Mali", "name:ts"=>"Mali", "name:tt"=>"Мали", "name:ug"=>"مالى", "name:uk"=>"Малі", "name:ur"=>"مالی", "name:uz"=>"Mali", "name:vi"=>"Mali", "name:vo"=>"Maliyän", "name:wa"=>"Mali", "name:wo"=>"Mali", "name:yi"=>"מאלי", "name:yo"=>"Málì", "name:zh"=>"马里共和国", "name:zu"=>"IMali"
-mc     "name"=>"Monaco", "name:af"=>"Monaco", "name:ak"=>"Mɔnako", "name:am"=>"ሞናኮ", "name:an"=>"Múnegu", "name:ar"=>"موناكو", "name:az"=>"Monako", "name:ba"=>"Монако", "name:be"=>"Манака", "name:bg"=>"Монако", "name:bi"=>"Monaco", "name:bm"=>"Monako", "name:bn"=>"মোনাকো", "name:bo"=>"མོ་ན་ཁོ།", "name:br"=>"Monako", "name:bs"=>"Monako", "name:ca"=>"Mònaco", "name:ce"=>"Монако", "name:cs"=>"Monako", "name:cu"=>"Монако", "name:cv"=>"Монако", "name:cy"=>"Monaco", "name:da"=>"Monaco", "name:de"=>"Monaco", "name:dv"=>"މޮނާކޯ", "name:dz"=>"མོ་ན་ཀོ", "name:ee"=>"Monaco", "name:el"=>"Μονακό", "name:en"=>"Monaco", "name:eo"=>"Monako", "name:es"=>"Mónaco", "name:et"=>"Monaco", "name:eu"=>"Monako", "name:fa"=>"موناکو", "name:ff"=>"Monaakoo", "name:fi"=>"Monaco", "name:fo"=>"Monako", "name:fr"=>"Monaco", "name:fy"=>"Monako", "name:ga"=>"Monacó", "name:gd"=>"Monaco", "name:gl"=>"Mónaco", "name:gu"=>"મોનૅકો", "name:gv"=>"Monaco", "name:ha"=>"Monako", "name:he"=>"מונקו", "name:hi"=>"मोनैको", "name:hr"=>"Monako", "name:ht"=>"Monako", "name:hu"=>"Monaco", "name:hy"=>"Մոնակո", "name:ia"=>"Monaco", "name:id"=>"Monako", "name:ie"=>"Mónaco", "name:io"=>"Monako", "name:is"=>"Mónakó", "name:it"=>"Monaco", "name:ja"=>"モナコ", "name:jv"=>"Monako", "name:ka"=>"მონაკო", "name:kg"=>"Monako", "name:ki"=>"Monako", "name:kk"=>"Монако", "name:kl"=>"Monaco", "name:km"=>"ម៉ូណាកូ", "name:kn"=>"ಮೊನಾಕೊ", "name:ko"=>"모나코", "name:ks"=>"موناکو", "name:ku"=>"Monako", "name:kv"=>"Монако", "name:kw"=>"Monako", "name:la"=>"Monoecus", "name:lb"=>"Monaco", "name:lg"=>"Monako", "name:li"=>"Monaco", "name:ln"=>"Monaco", "name:lo"=>"ໂມນາໂກ", "name:lt"=>"Monakas", "name:lv"=>"Monako", "name:mg"=>"Mônakô", "name:mi"=>"Manako", "name:mk"=>"Монако", "name:ml"=>"മൊണാക്കോ", "name:mn"=>"Монако", "name:mr"=>"मोनॅको", "name:ms"=>"Monaco", "name:mt"=>"Monako", "name:my"=>"နိုင်ငံ", "name:na"=>"Monako", "name:ne"=>"मोनाको", "name:nl"=>"Monaco", "name:nn"=>"Monaco", "name:no"=>"Monaco", "name:oc"=>"Mónegue", "name:or"=>"ମୋନାକୋ", "name:os"=>"Монако", "name:pa"=>"ਮੋਨਾਕੋ", "name:pl"=>"Monako", "name:pt"=>"Mónaco", "name:qu"=>"Munaku", "name:rm"=>"Monaco", "name:rn"=>"Monako", "name:ro"=>"Monaco", "name:ru"=>"Монако", "name:rw"=>"Monako", "name:sa"=>"मोनाको", "name:se"=>"Monaco", "name:sg"=>"Monaköo", "name:sh"=>"Monako", "name:si"=>"මොනාකෝව", "name:sk"=>"Monako", "name:sl"=>"Monako", "name:so"=>"Monako", "name:sq"=>"Monako", "name:sr"=>"Монако", "name:ss"=>"IMonakho", "name:su"=>"Monako", "name:sv"=>"Monaco", "name:sw"=>"Monako", "name:ta"=>"மொனாக்கோ", "name:te"=>"మొనాకో", "name:tg"=>"Монако", "name:th"=>"ประเทศโมนาโก", "name:ti"=>"ሞናኮ", "name:tk"=>"Monako", "name:tl"=>"Monako", "name:to"=>"Manako", "name:tr"=>"Monako", "name:tt"=>"Монако", "name:tw"=>"Monako", "name:ug"=>"موناكو", "name:uk"=>"Монако", "name:ur"=>"موناکو", "name:uz"=>"Monako", "name:vi"=>"Monaco", "name:vo"=>"Monakän", "name:wo"=>"Monaako", "name:yi"=>"מאנאקא", "name:yo"=>"Mónakò", "name:zh"=>"摩纳哥", "name:zu"=>"i-Monaco"
-tt     "name"=>"Trinidad and Tobago", "name:af"=>"Trinidad en Tobago", "name:ar"=>"ترينيداد وتوباغو", "name:be"=>"Трынідад і Табага", "name:br"=>"Trinidad-ha-Tobago", "name:ca"=>"Trinitat i Tobago", "name:cs"=>"Trinidad a Tobago", "name:cy"=>"Trinidad a Tobago", "name:da"=>"Trinidad og Tobago", "name:de"=>"Trinidad und Tobago", "name:en"=>"Trinidad and Tobago", "name:eo"=>"Trinidado kaj Tobago", "name:es"=>"Trinidad y Tobago", "name:et"=>"Trinidad ja Tobago", "name:fa"=>"ترینیداد و توباگو", "name:fi"=>"Trinidad ja Tobago", "name:fr"=>"Trinité-et-Tobago", "name:fy"=>"Trinidad en Tobago", "name:ga"=>"Oileán na Tríonóide agus Tobága", "name:gd"=>"Trianaid agus Tobago", "name:he"=>"טרינידד וטובגו", "name:hr"=>"Trinidad i Tobago", "name:hu"=>"Trinidad és Tobago", "name:id"=>"Trinidad dan Tobago", "name:is"=>"Trínidad og Tóbagó", "name:it"=>"Trinidad e Tobago", "name:ja"=>"トリニダード・トバゴ", "name:la"=>"Trinitas et Tabacum", "name:lt"=>"Trinidadas ir Tobagas", "name:mn"=>"Тринидад ба Тобаго", "name:nl"=>"Trinidad en Tobago", "name:pl"=>"Trynidad i Tobago", "name:pt"=>"Trindade e Tobago", "name:ru"=>"Тринидад и Тобаго", "name:se"=>"Trinidad ja Tobago", "name:sk"=>"Trinidad a Tobago", "name:sl"=>"Trinidad in Tobago", "name:sv"=>"Trinidad och Tobago", "name:ta"=>"டிரினிடாட் மற்றும் டொபாகோ", "name:th"=>"ประเทศตรินิแดดและโตเบโก", "name:tr"=>"Trinidad ve Tobago", "name:uk"=>"Тринідад і Тобаго", "name:vi"=>"Trinidad và Tobago", "name:vo"=>"Trinidadeän e Tobageäns", "name:zh"=>"特立尼达和多巴哥"
-ca     "name"=>"Canada", "name:ab"=>"Канада", "name:af"=>"Kanada", "name:am"=>"ካናዳ", "name:an"=>"Canadá", "name:ar"=>"كندا", "name:as"=>"কানাডা", "name:av"=>"Канада", "name:ay"=>"Kanada", "name:az"=>"Kanada", "name:ba"=>"Канада", "name:be"=>"Канада", "name:bg"=>"Канада", "name:bi"=>"Kanada", "name:bm"=>"Kanada", "name:bn"=>"কানাডা", "name:bo"=>"ཁ་ན་ཌ།", "name:br"=>"Kanada", "name:bs"=>"Kanada", "name:ca"=>"Canadà", "name:ce"=>"Канада", "name:co"=>"Canadà", "name:cs"=>"Kanada", "name:cu"=>"Канада", "name:cv"=>"Канада", "name:cy"=>"Canada", "name:da"=>"Canada", "name:de"=>"Kanada", "name:dv"=>"ކެނެޑާ", "name:dz"=>"ཀེ་ན་ཌ་", "name:ee"=>"Canada", "name:el"=>"Καναδάς", "name:en"=>"Canada", "name:eo"=>"Kanado", "name:es"=>"Canadá", "name:et"=>"Kanada", "name:eu"=>"Kanada", "name:fa"=>"کانادا", "name:fi"=>"Kanada", "name:fo"=>"Kanada", "name:fr"=>"Canada", "name:fy"=>"Kanada", "name:ga"=>"Ceanada", "name:gd"=>"Canada", "name:gl"=>"Canadá", "name:gn"=>"Kanatã", "name:gu"=>"કેનેડા", "name:gv"=>"Yn Chanadey", "name:ha"=>"Kanada", "name:he"=>"קנדה", "name:hi"=>"कनाडा", "name:hr"=>"Kanada", "name:ht"=>"Kanada", "name:hu"=>"Kanada", "name:hy"=>"Կանադա", "name:ia"=>"Canada", "name:id"=>"Kanada", "name:ie"=>"Canada", "name:ig"=>"Kánada", "name:ik"=>"Kanada", "name:io"=>"Kanada", "name:is"=>"Kanada", "name:it"=>"Canada", "name:iu"=>"ᑲᓇᑕ", "name:ja"=>"カナダ", "name:jv"=>"Kanada", "name:ka"=>"კანადა", "name:ki"=>"Canada", "name:kk"=>"Канада", "name:kl"=>"Canada", "name:km"=>"កាណាដា", "name:kn"=>"ಕೆನಡಾ", "name:ko"=>"캐나다", "name:ku"=>"Kanada", "name:kv"=>"Канада", "name:kw"=>"Kanada", "name:ky"=>"Канада", "name:la"=>"Canada", "name:lb"=>"Kanada", "name:li"=>"Canada", "name:ln"=>"Kanadá", "name:lt"=>"Kanada", "name:lv"=>"Kanāda", "name:mg"=>"Kanada", "name:mi"=>"Kānata", "name:mk"=>"Канада", "name:ml"=>"കാനഡ", "name:mn"=>"Канад", "name:mr"=>"कॅनडा", "name:ms"=>"Kanada", "name:mt"=>"Kanada", "name:my"=>"ကနေဒါနိုင်ငံ", "name:na"=>"Kanada", "name:ne"=>"क्यानाडा", "name:nl"=>"Canada", "name:nn"=>"Canada", "name:no"=>"Canada", "name:nv"=>"Deeteel Bikéyah", "name:oc"=>"Canadà", "name:om"=>"Canada", "name:or"=>"କାନାଡ଼ା", "name:os"=>"Канадæ", "name:pa"=>"ਕੈਨੇਡਾ", "name:pl"=>"Kanada", "name:ps"=>"کاناډا", "name:pt"=>"Canadá", "name:qu"=>"Kanada", "name:rm"=>"Canada", "name:rn"=>"Kanada", "name:ro"=>"Canada", "name:ru"=>"Канада", "name:rw"=>"Kanada", "name:sa"=>"केनडा", "name:sc"=>"Canada", "name:se"=>"Kanáda", "name:sg"=>"Kanadäa", "name:sh"=>"Kanada", "name:sk"=>"Kanada", "name:sl"=>"Kanada", "name:sn"=>"Canada", "name:so"=>"Kanada", "name:sq"=>"Kanadaja", "name:sr"=>"Канада", "name:ss"=>"IKhanada", "name:su"=>"Kanada", "name:sv"=>"Kanada", "name:sw"=>"Kanada", "name:ta"=>"கனடா", "name:te"=>"కెనడా", "name:tg"=>"Канада", "name:th"=>"ประเทศแคนาดา", "name:tk"=>"Kanada", "name:tl"=>"Kanada", "name:tr"=>"Kanada", "name:ts"=>"Canada", "name:tt"=>"Канада", "name:tw"=>"Kanada", "name:ty"=>"Tanata", "name:ug"=>"كانادا", "name:uk"=>"Канада", "name:ur"=>"کینیڈا", "name:uz"=>"Kanada", "name:vi"=>"Canada", "name:vo"=>"Kanadän", "name:wa"=>"Canada", "name:wo"=>"Kanadaa", "name:yi"=>"קאנאדע", "name:yo"=>"Kánádà", "name:zh"=>"加拿大", "name:zu"=>"IKhanada"
-\.
index 3b9a316b191f937c8254d5cbd53c9f204078836a..4fa860ad64fe9b61dc67e305a1830bbc3242114a 100644 (file)
@@ -23,9 +23,9 @@ foreach (src ${DOC_SOURCES})
 endforeach()
 
 ADD_CUSTOM_TARGET(doc
-   COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/bash2md.sh ${PROJECT_SOURCE_DIR}/vagrant/Install-on-Centos-8.sh ${CMAKE_CURRENT_BINARY_DIR}/appendix/Install-on-Centos-8.md
    COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/bash2md.sh ${PROJECT_SOURCE_DIR}/vagrant/Install-on-Ubuntu-18.sh ${CMAKE_CURRENT_BINARY_DIR}/appendix/Install-on-Ubuntu-18.md
    COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/bash2md.sh ${PROJECT_SOURCE_DIR}/vagrant/Install-on-Ubuntu-20.sh ${CMAKE_CURRENT_BINARY_DIR}/appendix/Install-on-Ubuntu-20.md
+   COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/bash2md.sh ${PROJECT_SOURCE_DIR}/vagrant/Install-on-Ubuntu-22.sh ${CMAKE_CURRENT_BINARY_DIR}/appendix/Install-on-Ubuntu-22.md
    COMMAND PYTHONPATH=${PROJECT_SOURCE_DIR} mkdocs build -d ${CMAKE_CURRENT_BINARY_DIR}/../site-html -f ${CMAKE_CURRENT_BINARY_DIR}/../mkdocs.yml
 )
 
index ff267cee28bd45f9d15fdbef4eb4ddc83a1ddaed..08c059841f48df4d40f45f1eef74f629f8b5d91f 100644 (file)
@@ -111,7 +111,7 @@ library.
 
 !!! note
     The external module is only needed when using the legacy tokenizer.
-    If you have choosen the ICU tokenizer, then you can ignore this section
+    If you have chosen the ICU tokenizer, then you can ignore this section
     and follow the standard import documentation.
 
 ### Option 1: Compiling the library on the database server
@@ -198,11 +198,10 @@ target machine.
     of a full database.
 
 Next install Nominatim on the target machine by following the standard installation
-instructions. Again make sure to use the same version as the source machine.
+instructions. Again, make sure to use the same version as the source machine.
 
-You can now copy the project directory from the source machine to the new machine.
-If necessary, edit the `.env` file to point it to the restored database.
-Finally run
+Create a project directory on your destination machine and set up the `.env`
+file to match the configuration on the source machine. Finally run
 
     nominatim refresh --website
 
@@ -210,6 +209,8 @@ to make sure that the local installation of Nominatim will be used.
 
 If you are using the legacy tokenizer you might also have to switch to the
 PostgreSQL module that was compiled on your target machine. If you get errors
-that PostgreSQL cannot find or access `nominatim.so` then copy the installed
-version into the `module` directory of your project directory. The installed
-copy can usually be found under `/usr/local/lib/nominatim/module/nominatim.so`.
+that PostgreSQL cannot find or access `nominatim.so` then rerun
+
+   nominatim refresh --functions
+
+on the target machine to update the the location of the module.
index 7d62df391f40b4bb049ead8bf5f45635fe91a783..5dcbcde96485fdcfbcbe80f1ee95558c3cb63020 100644 (file)
@@ -82,7 +82,7 @@ The website should now be available on `http://localhost/nominatim`.
 
 ### Installing the required packages
 
-Nginx has no built-in PHP interpreter. You need to use php-fpm as a deamon for
+Nginx has no built-in PHP interpreter. You need to use php-fpm as a daemon for
 serving PHP cgi.
 
 On Ubuntu/Debian install nginx and php-fpm with:
@@ -140,3 +140,9 @@ location ~ [^/]\.php(/|$) {
 Restart the nginx and php-fpm services and the website should now be available
 at `http://localhost/`.
 
+## Nominatim with other webservers
+
+Users have created instructions for other webservers:
+
+* [Caddy](https://github.com/osm-search/Nominatim/discussions/2580)
+
index d933a84d468a0fc55440944e56e51b727eae57fd..d17a53edf006d770061d8d37fe8c56dd5a25e8d0 100644 (file)
@@ -79,7 +79,7 @@ When running the import you may get a version mismatch:
 
 pg_config seems to use bad includes sometimes when multiple versions
 of PostgreSQL are available in the system. Make sure you remove the
-server development libraries (`postgresql-server-dev-9.5` on Ubuntu)
+server development libraries (`postgresql-server-dev-13` on Ubuntu)
 and recompile (`cmake .. && make`).
 
 
@@ -160,9 +160,6 @@ by everybody, e.g.
 
 Try `chmod a+r nominatim.so; chmod a+x nominatim.so`.
 
-When running SELinux, make sure that the
-[context is set up correctly](../appendix/Install-on-Centos-8.md#adding-selinux-security-settings).
-
 When you recently updated your operating system, updated PostgreSQL to
 a new version or moved files (e.g. the build directory) you should
 recreate `nominatim.so`. Try
index 7ebebde3559b925970b0557748c61f0d7f13ddac..90294959c334297c805f71510c7224544f99584e 100644 (file)
@@ -150,7 +150,7 @@ database or reuse the space later.
 
 If you only want to use the Nominatim database for reverse lookups or
 if you plan to use the installation only for exports to a
-[photon](https://photon.komoot.de/) database, then you can set up a database
+[photon](https://photon.komoot.io/) database, then you can set up a database
 without search indexes. Add `--reverse-only` to your setup command above.
 
 This saves about 5% of disk space.
index 6b63b0d3cfe62266240d4067ff75cb7315e742e6..bcc4524da6c350784eaa52445ee2dc3b7a93e575 100644 (file)
@@ -4,9 +4,9 @@ This page contains generic installation instructions for Nominatim and its
 prerequisites. There are also step-by-step instructions available for
 the following operating systems:
 
+  * [Ubuntu 22.04](../appendix/Install-on-Ubuntu-22.md)
   * [Ubuntu 20.04](../appendix/Install-on-Ubuntu-20.md)
   * [Ubuntu 18.04](../appendix/Install-on-Ubuntu-18.md)
-  * [CentOS 8](../appendix/Install-on-Centos-8.md)
 
 These OS-specific instructions can also be found in executable form
 in the `vagrant/` directory.
@@ -24,8 +24,9 @@ and can't offer support.
 ### Software
 
 !!! Warning
-    For larger installations you **must have** PostgreSQL 11+ and Postgis 3+
+    For larger installations you **must have** PostgreSQL 11+ and PostGIS 3+
     otherwise import and queries will be slow to the point of being unusable.
+    Query performance has marked improvements with PostgreSQL 13+ and PostGIS 3.2+.
 
 For compiling:
 
@@ -41,7 +42,7 @@ For compiling:
 
 For running Nominatim:
 
-  * [PostgreSQL](https://www.postgresql.org) (9.5+ will work, 11+ strongly recommended)
+  * [PostgreSQL](https://www.postgresql.org) (9.6+ will work, 11+ strongly recommended)
   * [PostGIS](https://postgis.net) (2.2+ will work, 3.0+ strongly recommended)
   * [Python 3](https://www.python.org/) (3.6+)
   * [Psycopg2](https://www.psycopg.org) (2.7+)
@@ -66,10 +67,10 @@ the [Development section](../develop/Development-Environment.md).
 ### Hardware
 
 A minimum of 2GB of RAM is required or installation will fail. For a full
-planet import 64GB of RAM or more are strongly recommended. Do not report
+planet import 128GB of RAM or more are strongly recommended. Do not report
 out of memory problems if you have less than 64GB RAM.
 
-For a full planet install you will need at least 900GB of hard disk space.
+For a full planet install you will need at least 1TB of hard disk space.
 Take into account that the OSM database is growing fast.
 Fast disks are essential. Using NVME disks is recommended.
 
@@ -88,8 +89,7 @@ your `postgresql.conf` file.
     work_mem = (50MB)
     effective_cache_size = (24GB)
     synchronous_commit = off
-    checkpoint_segments = 100 # only for postgresql <= 9.4
-    max_wal_size = 1GB # postgresql > 9.4
+    max_wal_size = 1GB
     checkpoint_timeout = 10min
     checkpoint_completion_target = 0.9
 
@@ -112,7 +112,7 @@ For the initial import, you should also set:
     fsync = off
     full_page_writes = off
 
-Don't forget to reenable them after the initial import or you risk database
+Don't forget to re-enable them after the initial import or you risk database
 corruption.
 
 
@@ -129,7 +129,7 @@ If you want to install latest development version from github, make sure to
 also check out the osm2pgsql subproject:
 
 ```
-git clone --recursive git://github.com/openstreetmap/Nominatim.git
+git clone --recursive https://github.com/openstreetmap/Nominatim.git
 ```
 
 The development version does not include the country grid. Download it separately:
@@ -157,6 +157,17 @@ make
 sudo make install
 ```
 
+!!! warning
+    The default installation no longer compiles the PostgreSQL module that
+    is needed for the legacy tokenizer from older Nominatim versions. If you
+    are upgrading an older database or want to run the
+    [legacy tokenizer](../customize/Tokenizers.md#legacy-tokenizer) for
+    some other reason, you need to enable the PostgreSQL module via
+    cmake: `cmake -DBUILD_MODULE=on ../Nominatim`. To compile the module
+    you need to have the server development headers for PostgreSQL installed.
+    On Ubuntu/Debian run: `sudo apt install postgresql-server-dev-<postgresql version>`
+
+
 Nominatim installs itself into `/usr/local` per default. To choose a different
 installation directory add `-DCMAKE_INSTALL_PREFIX=<install root>` to the
 cmake command. Make sure that the `bin` directory is available in your path
index 782b377cceb6c30584d6d8ca3b5a86074fe04d52..1ee313a997fe658055cf4cc652ebd6f67fd7d854 100644 (file)
@@ -34,6 +34,30 @@ to rerun the statistics computation when adding larger amounts of new data,
 for example, when adding an additional country via `nominatim add-data`.
 
 
+## Forcing recomputation of places and areas
+
+Command: `nominatim refresh --data-object [NWR]<id> --data-area [NWR]<id>`
+
+When running replication updates, Nominatim tries to recompute the search
+and address information for all places that are affected by a change. But it
+needs to restrict the total number of changes to make sure it can keep up
+with the minutely updates. Therefore it will refrain from propagating changes
+that affect a lot of objects.
+
+The administrator may force an update of places in the database.
+`nominatim refresh --data-object` invalidates a single OSM object.
+`nominatim refresh --data-area` invalidates an OSM object and all dependent
+objects. That are usually the places that inside its area or around the
+center of the object. Both commands expect the OSM object as an argument
+of the form OSM type + OSM id. The type must be `N` (node), `W` (way) or
+`R` (relation).
+
+After invalidating the object, indexing must be run again. If continuous
+update are running in the background, the objects will be recomputed together
+with the next round of updates. Otherwise you need to run `nominatim index`
+to finish the recomputation.
+
+
 ## Removing large deleted objects
 
 Nominatim refuses to delete very large areas because often these deletions are
index bc6499183c4b84e63efc2fc7d5778a9353777ee2..9b5b48c37c04f768ed311c92b30395e724c894ba 100644 (file)
@@ -15,6 +15,23 @@ breaking changes. **Please read them before running the migration.**
     If you are migrating from a version <3.6, then you still have to follow
     the manual migration steps up to 3.6.
 
+## 4.0.0 -> 4.1.0
+
+### ICU tokenizer is the new default
+
+Nominatim now installs the [ICU tokenizer](../customize/Tokenizers.md#icu-tokenizer)
+by default. This only has an effect on newly installed databases. When
+updating older databases, it keeps its installed tokenizer. If you still
+run with the legacy tokenizer, make sure to compile Nominatim with the
+PostgreSQL module, see [Installation](Installation.md#building-nominatim).
+
+### geocodejson output changed
+
+The `type` field of the geocodejson output has changed. It now contains
+the address class of the object instead of the value of the OSM tag. If
+your client has used the `type` field, switch them to read `osm_value`
+instead.
+
 ## 3.7.0 -> 4.0.0
 
 ### NOMINATIM_PHRASE_CONFIG removed
index 672dbefdf33d10d3909dbb8e212b1a8ba77b8ded..cab2d2ed92fcbaaaeb611062c44f54fc9da78c25 100644 (file)
@@ -16,12 +16,12 @@ and run it. Grab the latest release from
 [nominatim-ui's Github release page](https://github.com/osm-search/nominatim-ui/releases)
 and unpack it. You can use `nominatim-ui-x.x.x.tar.gz` or `nominatim-ui-x.x.x.zip`.
 
-Next you need to adapt the UI yo your installation. Custom settings need to be
+Next you need to adapt the UI to your installation. Custom settings need to be
 put into `dist/theme/config.theme.js`. At a minimum you need to
 set `Nominatim_API_Endpoint` to point to your Nominatim installation:
 
     cd nominatim-ui
-    echo "Nominatim_Config.Nominatim_API_Endpoint='https:\\myserver.org\nominatim';" > dist/theme/config.theme.js
+    echo "Nominatim_Config.Nominatim_API_Endpoint='https://myserver.org/nominatim/';" > dist/theme/config.theme.js
 
 For the full set of available settings, have a look at `dist/config.defaults.js`.
 
@@ -161,24 +161,16 @@ directory like this:
   # If no endpoint is given, then use search.
   RewriteRule ^(/|$)   "search.php"
 
-  # If format-html is explicity requested, forward to the UI.
+  # If format-html is explicitly requested, forward to the UI.
   RewriteCond %{QUERY_STRING} "format=html"
-  RewriteRule ^([^/]+).php ui/$1.html [R,END]
-  # Same but .php suffix is missing.
-  RewriteCond %{QUERY_STRING} "format=html"
-  RewriteRule ^([^/]+) ui/$1.html [R,END]
+  RewriteRule ^([^/]+)(.php)? ui/$1.html [R,END]
 
   # If no format parameter is there then forward anything
   # but /reverse and /lookup to the UI.
   RewriteCond %{QUERY_STRING} "!format="
   RewriteCond %{REQUEST_URI}  "!/lookup"
   RewriteCond %{REQUEST_URI}  "!/reverse"
-  RewriteRule ^([^/]+).php ui/$1.html [R,END]
-  # Same but .php suffix is missing.
-  RewriteCond %{QUERY_STRING} "!format="
-  RewriteCond %{REQUEST_URI}  "!/lookup"
-  RewriteCond %{REQUEST_URI}  "!/reverse"
-  RewriteRule ^([^/]+) ui/$1.html [R,END]
+  RewriteRule ^([^/]+)(.php)? ui/$1.html [R,END]
 </Directory>
 ```
 
index 9d224b9e101bbefe34a3abf0f8f49d3522a3ae5f..f8c8f767969840ed025e62dc989f31be42b0f4bf 100644 (file)
@@ -70,7 +70,7 @@ The update application keeps running forever and retrieves and applies
 new updates from the server as they are published.
 
 You can run this command as a simple systemd service. Create a service
-description like that in `/etc/systemd/system/nominatim-update.service`:
+description like that in `/etc/systemd/system/nominatim-updates.service`:
 
 ```
 [Unit]
@@ -122,14 +122,71 @@ cd /srv/nominatim
 
 while true; do
   nominatim replication --once
-  if [ -f "/srv/nominatim/schedule-mainenance" ]; then
-    rm /srv/nominatim/schedule-mainenance
+  if [ -f "/srv/nominatim/schedule-maintenance" ]; then
+    rm /srv/nominatim/schedule-maintenance
     nominatim refresh --postcodes
   fi
 done
 ```
 
-A cron job then creates the file `/srv/nominatim/need-mainenance` once per night.
+A cron job then creates the file `/srv/nominatim/schedule-maintenance` once per night.
+
+##### One-time mode with systemd
+
+You can run the one-time mode with a systemd timer & service.
+
+Create a timer description like `/etc/systemd/system/nominatim-updates.timer`:
+
+```
+[Unit]
+Description=Timer to start updates of Nominatim
+
+[Timer]
+OnActiveSec=2
+OnUnitActiveSec=1min
+Unit=nominatim-updates.service
+
+[Install]
+WantedBy=multi-user.target
+```
+
+And then a similar service definition: `/etc/systemd/system/nominatim-updates.service`:
+
+```
+[Unit]
+Description=Single updates of Nominatim
+
+[Service]
+WorkingDirectory=/srv/nominatim
+ExecStart=nominatim replication --once
+StandardOutput=append:/var/log/nominatim-updates.log
+StandardError=append:/var/log/nominatim-updates.error.log
+User=nominatim
+Group=nominatim
+Type=simple
+
+[Install]
+WantedBy=multi-user.target
+```
+
+Replace the `WorkingDirectory` with your project directory. Also adapt user and
+group names as required. `OnUnitActiveSec` defines how often the individual
+update command is run.
+
+Now activate the service and start the updates:
+
+```
+sudo systemctl daemon-reload
+sudo systemctl enable nominatim-updates.timer
+sudo systemctl start nominatim-updates.timer
+```
+
+You can stop future data updates, while allowing any current, in-progress
+update steps to finish, by running `sudo systemctl stop
+nominatim-updates.timer` and waiting until `nominatim-updates.service` isn't
+running (`sudo systemctl is-active nominatim-updates.service`). Current output
+from the update can be seen like above (`systemctl status
+nominatim-updates.service`).
 
 
 #### Catch-up mode
@@ -158,7 +215,7 @@ replication catch-up at whatever interval you desire.
     a replication source with an update frequency that is an order of magnitude
     lower. For example, if you want to update once a day, use an hourly updated
     source. This makes sure that you don't miss an entire day of updates when
-    the source is unexpectely late to publish its update.
+    the source is unexpectedly late to publish its update.
 
     If you want to use the source with the same update frequency (e.g. a daily
     updated source with daily updates), use the
index 937292623f60c58ff1cb45882d09002a64bd08d3..e91c177095a4cd434841f00c34516e57798e1224 100644 (file)
@@ -90,11 +90,11 @@ This overrides the specified machine readable format. (Default: 0)
 
 ##### XML
 
-[https://nominatim.openstreetmap.org/lookup?osm_ids=R146656,W104393803,N240109189](https://nominatim.openstreetmap.org/lookup?osm_ids=R146656,W104393803,N240109189)
+[https://nominatim.openstreetmap.org/lookup?osm_ids=R146656,W104393803,N240109189](https://nominatim.openstreetmap.org/lookup?osm_ids=R146656,W50637691,N240109189)
 
 ```xml
-  <lookupresults timestamp="Mon, 29 Jun 15 18:01:33 +0000" attribution="Data © OpenStreetMap contributors, ODbL 1.0. https://www.openstreetmap.org/copyright" querystring="R146656,W104393803,N240109189" polygon="false">
-    <place place_id="127761056" osm_type="relation" osm_id="146656" place_rank="16" lat="53.4791466" lon="-2.2447445" display_name="Manchester, Greater Manchester, North West England, England, United Kingdom" class="boundary" type="administrative" importance="0.704893333438333">
+  <lookupresults timestamp="Mon, 28 Mar 22 14:38:54 +0000" attribution="Data &#xA9; OpenStreetMap contributors, ODbL 1.0. http://www.openstreetmap.org/copyright" querystring="R146656,W50637691,N240109189" more_url="">
+    <place place_id="282236157" osm_type="relation" osm_id="146656" place_rank="16" address_rank="16" boundingbox="53.3401044,53.5445923,-2.3199185,-2.1468288" lat="53.44246175" lon="-2.2324547359718547" display_name="Manchester, Greater Manchester, North West England, England, United Kingdom" class="boundary" type="administrative" importance="0.35">
       <city>Manchester</city>
       <county>Greater Manchester</county>
       <state_district>North West England</state_district>
@@ -102,21 +102,20 @@ This overrides the specified machine readable format. (Default: 0)
       <country>United Kingdom</country>
       <country_code>gb</country_code>
     </place>
-    <place place_id="77769745" osm_type="way" osm_id="104393803" place_rank="30" lat="52.5162024" lon="13.3777343363579" display_name="Brandenburg Gate, 1, Pariser Platz, Mitte, Berlin, 10117, Germany" class="tourism" type="attraction" importance="0.443472858361592">
-      <attraction>Brandenburg Gate</attraction>
-      <house_number>1</house_number>
-      <pedestrian>Pariser Platz</pedestrian>
-      <suburb>Mitte</suburb>
-      <city_district>Mitte</city_district>
-      <city>Berlin</city>
-      <state>Berlin</state>
-      <postcode>10117</postcode>
+    <place place_id="115462561" osm_type="way" osm_id="50637691" place_rank="30" address_rank="30" boundingbox="52.3994612,52.3996426,13.0479574,13.0481754" lat="52.399550700000006" lon="13.048066846939687" display_name="Brandenburger Tor, Brandenburger Stra&#xDF;e, Historische Innenstadt, Innenstadt, Potsdam, Brandenburg, 14467, Germany" class="tourism" type="attraction" importance="0.29402874005524">
+      <tourism>Brandenburger Tor</tourism>
+      <road>Brandenburger Stra&#xDF;e</road>
+      <suburb>Historische Innenstadt</suburb>
+      <city>Potsdam</city>
+      <state>Brandenburg</state>
+      <postcode>14467</postcode>
       <country>Germany</country>
       <country_code>de</country_code>
     </place>
-    <place place_id="2570600569" osm_type="node" osm_id="240109189" place_rank="15" lat="52.5170365" lon="13.3888599" display_name="Berlin, Germany" class="place" type="city" importance="0.822149797630868">
+    <place place_id="567505" osm_type="node" osm_id="240109189" place_rank="15" address_rank="16" boundingbox="52.3586925,52.6786925,13.2396024,13.5596024" lat="52.5186925" lon="13.3996024" display_name="Berlin, 10178, Germany" class="place" type="city" importance="0.78753902824914">
       <city>Berlin</city>
       <state>Berlin</state>
+      <postcode>10178</postcode>
       <country>Germany</country>
       <country_code>de</country_code>
     </place>
@@ -125,38 +124,50 @@ This overrides the specified machine readable format. (Default: 0)
 
 ##### JSON with extratags
 
-[https://nominatim.openstreetmap.org/lookup?osm_ids=W50637691&format=json](https://nominatim.openstreetmap.org/lookup?osm_ids=W50637691&format=json)
+[https://nominatim.openstreetmap.org/lookup?osm_ids=W50637691&format=json&extratags=1](https://nominatim.openstreetmap.org/lookup?osm_ids=W50637691&format=json&extratags=1)
 
 ```json
 [
-  {
-    "place_id": "84271358",
-    "licence": "Data © OpenStreetMap contributors, ODbL 1.0. https://osm.org/copyright",
-    "osm_type": "way",
-    "osm_id": "50637691",
-    "lat": "52.39955055",
-    "lon": "13.04806574678",
-    "display_name": "Brandenburger Tor, Brandenburger Straße, Nördliche Innenstadt, Innenstadt, Potsdam, Brandenburg, 14467, Germany",
-    "class": "historic",
-    "type": "city_gate",
-    "importance": "0.221233780277011",
-    "address": {
-      "address29": "Brandenburger Tor",
-      "pedestrian": "Brandenburger Straße",
-      "suburb": "Nördliche Innenstadt",
-      "city": "Potsdam",
-      "state": "Brandenburg",
-      "postcode": "14467",
-      "country": "Germany",
-      "country_code": "de"
-    },
-    "extratags": {
-      "image": "http://commons.wikimedia.org/wiki/File:Potsdam_brandenburger_tor.jpg",
-      "wikidata": "Q695045",
-      "wikipedia": "de:Brandenburger Tor (Potsdam)",
-      "wheelchair": "yes",
-      "description": "Kleines Brandenburger Tor in Potsdam"
-    }
-  }
+   {
+      "place_id": 115462561,
+      "licence": "Data © OpenStreetMap contributors, ODbL 1.0. https://osm.org/copyright",
+      "osm_type": "way",
+      "osm_id": 50637691,
+      "boundingbox": [
+        "52.3994612",
+        "52.3996426",
+        "13.0479574",
+        "13.0481754"
+      ],
+      "lat": "52.399550700000006",
+      "lon": "13.048066846939687",
+      "display_name": "Brandenburger Tor, Brandenburger Straße, Historische Innenstadt, Innenstadt, Potsdam, Brandenburg, 14467, Germany",
+      "class": "tourism",
+      "type": "attraction",
+      "importance": 0.2940287400552381,
+      "address": {
+        "tourism": "Brandenburger Tor",
+        "road": "Brandenburger Straße",
+        "suburb": "Historische Innenstadt",
+        "city": "Potsdam",
+        "state": "Brandenburg",
+        "postcode": "14467",
+        "country": "Germany",
+        "country_code": "de"
+      },
+      "extratags": {
+        "image": "http://commons.wikimedia.org/wiki/File:Potsdam_brandenburger_tor.jpg",
+        "heritage": "4",
+        "wikidata": "Q695045",
+        "architect": "Carl von Gontard;Georg Christian Unger",
+        "wikipedia": "de:Brandenburger Tor (Potsdam)",
+        "wheelchair": "yes",
+        "description": "Kleines Brandenburger Tor in Potsdam",
+        "heritage:website": "http://www.bldam-brandenburg.de/images/stories/PDF/DML%202012/04-p-internet-13.pdf",
+        "heritage:operator": "bldam",
+        "architect:wikidata": "Q68768;Q95223",
+        "year_of_construction": "1771"
+      }
+   }
 ]
 ```
index 31dd5b3f5206850e6a64aca67b2110cdaab17874..4f5399f0ddc4c05275b1b3af4d64cdfee2bc4aad 100644 (file)
@@ -28,6 +28,7 @@ a single place (for reverse) of the following format:
       "city": "London",
       "state_district": "Greater London",
       "state": "England",
+      "ISO3166-2-lvl4": "GB-ENG",
       "postcode": "SW1A 2DU",
       "country": "United Kingdom",
       "country_code": "gb"
@@ -97,7 +98,10 @@ The GeocodeJSON format follows the
 The following feature attributes are implemented:
 
  * `osm_type`, `osm_id` - reference to the OSM object (unofficial extension, [see notes](#osm-reference))
- * `type` - value of the main tag of the object (e.g. residential, restaurant, ...)
+ * `type` - the 'address level' of the object ('house', 'street', `district`, `city`,
+            `county`, `state`, `country`, `locality`)
+ * `osm_key`- key of the main tag of the OSM object (e.g. boundary, highway, amenity)
+ * `osm_value` - value of the main tag of the OSM object (e.g. residential, restaurant)
  * `label` - full comma-separated address
  * `name` - localised name of the place
  * `housenumber`, `street`, `locality`, `district`, `postcode`, `city`,
@@ -126,6 +130,7 @@ formats depending on the API call.
   </result>
   <addressparts>
      <state>Bavaria</state>
+     <ISO3166-2-lvl4>DE-BY</ISO3166-2-lvl4>
      <country>Germany</country>
      <country_code>de</country_code>
   </addressparts>
@@ -179,6 +184,7 @@ Additional information requested with `addressdetails=1`, `extratags=1` and
     <city>London</city>
     <state_district>Greater London</state_district>
     <state>England</state>
+    <ISO3166-2-lvl4>GB-ENG</ISO3166-2-lvl4>
     <postcode>SW1A 2DU</postcode>
     <country>United Kingdom</country>
     <country_code>gb</country_code>
@@ -230,7 +236,7 @@ on another server. It may even change its ID on the same server when it is
 removed and reimported while updating the database with fresh OSM data.
 It is thus not useful to treat it as permanent for later use.
 
-The combination `osm_type`+`osm_id` is slighly better but remember in
+The combination `osm_type`+`osm_id` is slightly better but remember in
 OpenStreetMap mappers can delete, split, recreate places (and those
 get a new `osm_id`), there is no link between those old and new ids.
 Places can also change their meaning without changing their `osm_id`,
@@ -279,12 +285,12 @@ with a designation label. Per default the following labels may appear:
 
  * continent
  * country, country_code
- * region, state, state_district, county
+ * region, state, state_district, county, ISO3166-2-lvl<admin_level>
  * municipality, city, town, village
  * city_district, district, borough, suburb, subdivision
  * hamlet, croft, isolated_dwelling
  * neighbourhood, allotments, quarter
- * city_block, residental, farm, farmyard, industrial, commercial, retail
+ * city_block, residential, farm, farmyard, industrial, commercial, retail
  * road
  * house_number, house_name
  * emergency, historic, military, natural, landuse, place, railway,
index 06d7cdea6cf138428b13e395c7ff79483ec9738d..083000aa171322f40e92085e68ba66e8d9c77314 100644 (file)
@@ -27,11 +27,11 @@ The main format of the reverse API is
 https://nominatim.openstreetmap.org/reverse?lat=<value>&lon=<value>&<params>
 ```
 
-where `lat` and `lon` are latitude and longitutde of a coordinate in WGS84
+where `lat` and `lon` are latitude and longitude of a coordinate in WGS84
 projection. The API returns exactly one result or an error when the coordinate
 is in an area with no OSM data coverage.
 
-Additional paramters are accepted as listed below.
+Additional parameters are accepted as listed below.
 
 !!! warning "Deprecation warning"
     The reverse API used to allow address lookup for a single OSM object by
@@ -118,7 +118,7 @@ geometry. Topology is preserved in the result. (Default: 0.0)
 
 * `email=<valid email address>`
 
-If you are making large numbers of request please include an appropriate email
+If you are making a large number of requests, please include an appropriate email
 address to identify your requests. See Nominatim's [Usage Policy](https://operations.osmfoundation.org/policies/nominatim/) for more details.
 
 
index 45606a71a1ddd26fd2abd36a8ff8eda969332e92..ce081cab8a1df4b6879d9f8386b55dfc53b97033 100644 (file)
@@ -51,6 +51,12 @@ Both query forms accept the additional parameters listed below.
 
 See [Place Output Formats](Output.md) for details on each format. (Default: jsonv2)
 
+!!! note
+    The Nominatim service at
+    [https://nominatim.openstreetmap.org](https://nominatim.openstreetmap.org)
+    has a different default behaviour for historical reasons. When the
+    `format` parameter is omitted, the request will be forwarded to the Web UI.
+
 * `json_callback=<string>`
 
 Wrap JSON output in a callback function ([JSONP](https://en.wikipedia.org/wiki/JSONP)) i.e. `<string>(<json>)`.
diff --git a/docs/customize/Country-Settings.md b/docs/customize/Country-Settings.md
new file mode 100644 (file)
index 0000000..6f8f2a9
--- /dev/null
@@ -0,0 +1,149 @@
+# Customizing Per-Country Data
+
+Whenever an OSM is imported into Nominatim, the object is first assigned
+a country. Nominatim can use this information to adapt various aspects of
+the address computation to the local customs of the country. This section
+explains how country assignment works and the principal per-country
+localizations.
+
+## Country assignment
+
+Countries are assigned on the basis of country data from the OpenStreetMap
+input data itself. Countries are expected to be tagged according to the
+[administrative boundary schema](https://wiki.openstreetmap.org/wiki/Tag:boundary%3Dadministrative):
+a OSM relation with `boundary=administrative` and `admin_level=2`. Nominatim
+uses the country code to distinguish the countries.
+
+If there is no country data available for a point, then Nominatim uses the
+fallback data imported from `data/country_osm_grid.sql.gz`. This was computed
+from OSM data as well but is guaranteed to cover all countries.
+
+Some OSM objects may also be located outside any country, for example a buoy
+in the middle of the ocean. These object do not get any country assigned and
+get a default treatment when it comes to localized handling of data.
+
+## Per-country settings
+
+### Global country settings
+
+The main place to configure settings per country is the file
+`settings/country_settings.yaml`. This file has one section per country that
+is recognised by Nominatim. Each section is tagged with the country code
+(in lower case) and contains the different localization information. Only
+countries which are listed in this file are taken into account for computations.
+
+For example, the section for Andorra looks like this:
+
+```
+    partition: 35
+    languages: ca
+    names: !include country-names/ad.yaml
+    postcode:
+      pattern: "(ddd)"
+      output: AD\1
+```
+
+The individual settings are described below.
+
+#### `partition`
+
+Nominatim internally splits the data into multiple tables to improve
+performance. The partition number tells Nominatim into which table to put
+the country. This is purely internal management and has no effect on the
+output data.
+
+The default is to have one partition per country.
+
+#### `languages`
+
+A comma-separated list of ISO-639 language codes of default languages in the
+country. These are the languages used in name tags without a language suffix.
+Note that this is not necessarily the same as the list of official languages
+in the country. There may be officially recognised languages in a country
+which are only ever used in name tags with the appropriate language suffixes.
+Conversely, a non-official language may appear a lot in the name tags, for
+example when used as an unofficial Lingua Franca.
+
+List the languages in order of frequency of appearance with the most frequently
+used language first. It is not recommended to add languages when there are only
+very few occurrences.
+
+If only one language is listed, then Nominatim will 'auto-complete' the
+language of names without an explicit language-suffix.
+
+#### `names`
+
+List of names of the country and its translations. These names are used as
+a baseline. It is always possible to search countries by the given names, no
+matter what other names are in the OSM data. They are also used as a fallback
+when a needed translation is not available.
+
+!!! Note
+    The list of names per country is currently fairly large because Nominatim
+    supports translations in many languages per default. That is why the
+    name lists have been separated out into extra files. You can find the
+    name lists in the file `settings/country-names/<country code>.yaml`.
+    The names section in the main country settings file only refers to these
+    files via the special `!include` directive.
+
+#### `postcode`
+
+Describes the format of the postcode that is in use in the country.
+
+When a country has no official postcodes, set this to no. Example:
+
+```
+ae:
+    postcode: no
+```
+
+When a country has a postcode, you need to state the postcode pattern and
+the default output format. Example:
+
+```
+bm:
+    postcode:
+      pattern: "(ll)[ -]?(dd)"
+      output: \1 \2
+```
+
+The **pattern** is a regular expression that describes the possible formats
+accepted as a postcode. The pattern follows the standard syntax for
+[regular expressions in Python](https://docs.python.org/3/library/re.html#regular-expression-syntax)
+with two extra shortcuts: `d` is a shortcut for a single digit([0-9])
+and `l` for a single ASCII letter ([A-Z]).
+
+Use match groups to indicate groups in the postcode that may optionally be
+separated with a space or a hyphen.
+
+For example, the postcode for Bermuda above always consists of two letters
+and two digits. They may optionally be separated by a space or hyphen. That
+means that Nominatim will consider `AB56`, `AB 56` and `AB-56` spelling variants
+for one and the same postcode.
+
+Never add the country code in front of the postcode pattern. Nominatim will
+automatically accept variants with a country code prefix for all postcodes.
+
+The **output** field is an optional field that describes what the canonical
+spelling of the postcode should be. The format is the
+[regular expression expand syntax](https://docs.python.org/3/library/re.html#re.Match.expand) referring back to the bracket groups in the pattern.
+
+Most simple postcodes only have one spelling variant. In that case, the
+**output** can be omitted. The postcode will simply be used as is.
+
+In the Bermuda example above, the canonical spelling would be to have a space
+between letters and digits.
+
+!!! Warning
+    When your postcode pattern covers multiple variants of the postcode, then
+    you must explicitly state the canonical output or Nominatim will not
+    handle the variations correctly.
+
+### Other country-specific configuration
+
+There are some other configuration files where you can set localized settings
+according to the assigned country. These are:
+
+ * [Place ranking configuration](Ranking.md)
+
+Please see the linked documentation sections for more information.
index 89171a4dbb66817b05da5f76374a70b4462b603d..fcd02ae18e3a92bee7a85403f93406ea031b3a82 100644 (file)
@@ -10,7 +10,7 @@ option. There are a number of default styles, which are explained in detail
 in the [Import section](../admin/Import.md#filtering-imported-data). These
 standard styles may be referenced by their name.
 
-You can also create your own custom syle. Put the style file into your
+You can also create your own custom style. Put the style file into your
 project directory and then set `NOMINATIM_IMPORT_STYLE` to the name of the file.
 It is always recommended to start with one of the standard styles and customize
 those. You find the standard styles under the name `import-<stylename>.style`
index 428ef11cbc05271a8741f222024c6b9c0d03749c..d080dc77b2f77ce5b18c705507ac40664f50a3d6 100644 (file)
@@ -189,7 +189,7 @@ will be used.
 | **Description:**   | Enable searching for Tiger house number data |
 | **Format:**        | boolean |
 | **Default:**       | no |
-| **After Changes:** | run `nominatim --refresh --functions` |
+| **After Changes:** | run `nominatim refresh --functions` |
 
 When this setting is enabled, search and reverse queries also take data
 from [Tiger house number data](Tiger.md) into account.
@@ -202,7 +202,7 @@ from [Tiger house number data](Tiger.md) into account.
 | **Description:**   | Enable searching in external house number tables |
 | **Format:**        | boolean |
 | **Default:**       | no |
-| **After Changes:** | run `nominatim --refresh --functions` |
+| **After Changes:** | run `nominatim refresh --functions` |
 | **Comment:**       | Do not use. |
 
 When this setting is enabled, search queries also take data from external
index 4d5fbb150c8bb02612943a7c0ab02772a4f89f50..c563b20105160e27cb7176ff8b597f0c063c7fab 100644 (file)
@@ -19,7 +19,22 @@ they can be configured.
 
 The legacy tokenizer implements the analysis algorithms of older Nominatim
 versions. It uses a special Postgresql module to normalize names and queries.
-This tokenizer is currently the default.
+This tokenizer is automatically installed and used when upgrading an older
+database. It should not be used for new installations anymore.
+
+### Compiling the PostgreSQL module
+
+The tokeinzer needs a special C module for PostgreSQL which is not compiled
+by default. If you need the legacy tokenizer, compile Nominatim as follows:
+
+```
+mkdir build
+cd build
+cmake -DBUILD_MODULE=on
+make
+```
+
+### Enabling the tokenizer
 
 To enable the tokenizer add the following line to your project configuration:
 
@@ -47,6 +62,7 @@ normalization functions are hard-coded.
 The ICU tokenizer uses the [ICU library](http://site.icu-project.org/) to
 normalize names and queries. It also offers configurable decomposition and
 abbreviation handling.
+This tokenizer is currently the default.
 
 To enable the tokenizer add the following line to your project configuration:
 
@@ -99,6 +115,9 @@ token-analysis:
           - words:
               - road -> rd
               - bridge -> bdge,br,brdg,bri,brg
+      mutations:
+          - pattern: 'ä'
+            replacements: ['ä', 'ae']
 ```
 
 The configuration file contains four sections:
@@ -178,6 +197,21 @@ The following is a list of sanitizers that are shipped with Nominatim.
     rendering:
         heading_level: 6
 
+##### clean-housenumbers
+
+::: nominatim.tokenizer.sanitizers.clean_housenumbers
+    selection:
+        members: False
+    rendering:
+        heading_level: 6
+
+##### clean-postcodes
+
+::: nominatim.tokenizer.sanitizers.clean_postcodes
+    selection:
+        members: False
+    rendering:
+        heading_level: 6
 
 
 #### Token Analysis
@@ -196,21 +230,25 @@ by a sanitizer (see for example the
 The token-analysis section contains the list of configured analyzers. Each
 analyzer must have an `id` parameter that uniquely identifies the analyzer.
 The only exception is the default analyzer that is used when no special
-analyzer was selected.
+analyzer was selected. There are analysers with special ids:
+
+ * '@housenumber'. If an analyzer with that name is present, it is used
+   for normalization of house numbers.
+ * '@potcode'. If an analyzer with that name is present, it is used
+   for normalization of postcodes.
 
 Different analyzer implementations may exist. To select the implementation,
-the `analyzer` parameter must be set. Currently there is only one implementation
-`generic` which is described in the following.
+the `analyzer` parameter must be set. The different implementations are
+described in the following.
 
 ##### Generic token analyzer
 
-The generic analyzer is able to create variants from a list of given
-abbreviation and decomposition replacements. It takes one optional parameter
-`variants` which lists the replacements to apply. If the section is
-omitted, then the generic analyzer becomes a simple analyzer that only
-applies the transliteration.
+The generic analyzer `generic` is able to create variants from a list of given
+abbreviation and decomposition replacements and introduce spelling variations.
+
+###### Variants
 
-The variants section defines lists of replacements which create alternative
+The optional 'variants' section defines lists of replacements which create alternative
 spellings of a name. To create the variants, a name is scanned from left to
 right and the longest matching replacement is applied until the end of the
 string is reached.
@@ -296,6 +334,48 @@ decomposition has an effect here on the source as well. So a rule
 means that for a word like `hauptstrasse` four variants are created:
 `hauptstrasse`, `haupt strasse`, `hauptstr` and `haupt str`.
 
+###### Mutations
+
+The 'mutation' section in the configuration describes an additional set of
+replacements to be applied after the variants have been computed.
+
+Each mutation is described by two parameters: `pattern` and `replacements`.
+The pattern must contain a single regular expression to search for in the
+variant name. The regular expressions need to follow the syntax for
+[Python regular expressions](file:///usr/share/doc/python3-doc/html/library/re.html#regular-expression-syntax).
+Capturing groups are not permitted.
+`replacements` must contain a list of strings that the pattern
+should be replaced with. Each occurrence of the pattern is replaced with
+all given replacements. Be mindful of combinatorial explosion of variants.
+
+###### Modes
+
+The generic analyser supports a special mode `variant-only`. When configured
+then it consumes the input token and emits only variants (if any exist). Enable
+the mode by adding:
+
+```
+  mode: variant-only
+```
+
+to the analyser configuration.
+
+##### Housenumber token analyzer
+
+The analyzer `housenumbers` is purpose-made to analyze house numbers. It
+creates variants with optional spaces between numbers and letters. Thus,
+house numbers of the form '3 a', '3A', '3-A' etc. are all considered equivalent.
+
+The analyzer cannot be customized.
+
+##### Postcode token analyzer
+
+The analyzer `postcodes` is pupose-made to analyze postcodes. It supports
+a 'lookup' varaint of the token, which produces variants with optional
+spaces. Use together with the clean-postcodes sanitizer.
+
+The analyzer cannot be customized.
+
 ### Reconfiguration
 
 Changing the configuration after the import is currently not possible, although
index fcd9c3b36d43fc3f32141252fdaccd3a1852b9b8..98413a0bfa9864dbc5e83673841f68ff31db8df9 100644 (file)
@@ -119,7 +119,7 @@ to compute the address relations between places. These tables are partitioned.
 Each country is assigned a partition number in the country_name table (see
 below) and the data is then split between a set of tables, one for each
 partition. Note that Nominatim still manually manages partitioned tables.
-Native support for partitions in PostgreSQL only became useable with version 13.
+Native support for partitions in PostgreSQL only became usable with version 13.
 It will be a little while before Nominatim drops support for older versions.
 
 ![address tables](address-tables.svg)
@@ -155,9 +155,9 @@ Nominatim also creates a number of static tables at import:
    default languages and saves the assignment of countries to partitions.
  * `country_osm_grid` provides a fallback for country geometries
 
-## Auxilary data tables
+## Auxiliary data tables
 
-Finally there are some table for auxillary data:
+Finally there are some table for auxiliary data:
 
  * `location_property_tiger` - saves housenumber from the Tiger import. Its
    layout is similar to that of `location_propoerty_osmline`.
index eba87c09e68138e20b08fdacb3f9139a8efd1345..c6515d2c5aabef56ecc61c35e5fd52a86b9efd87 100644 (file)
@@ -1,6 +1,6 @@
 # Setting up Nominatim for Development
 
-This chapter gives an overview how to set up Nominatim for developement
+This chapter gives an overview how to set up Nominatim for development
 and how to run tests.
 
 !!! Important
@@ -32,13 +32,16 @@ It has the following additional requirements:
 * [behave test framework](https://behave.readthedocs.io) >= 1.2.6
 * [phpunit](https://phpunit.de) (9.5 is known to work)
 * [PHP CodeSniffer](https://github.com/squizlabs/PHP_CodeSniffer)
-* [Pylint](https://pylint.org/) (2.6.0 is used for the CI)
+* [Pylint](https://pylint.org/) (CI always runs the latest version from pip)
+* [mypy](http://mypy-lang.org/) (plus typing information for external libs)
+* [Python Typing Extensions](https://github.com/python/typing_extensions) (for Python < 3.9)
 * [pytest](https://pytest.org)
 
 The documentation is built with mkdocs:
 
 * [mkdocs](https://www.mkdocs.org/) >= 1.1.2
-* [mkdocstrings](https://mkdocstrings.github.io/)
+* [mkdocstrings](https://mkdocstrings.github.io/) >= 0.16
+* [mkdocstrings-python-legacy](https://mkdocstrings.github.io/python-legacy/)
 
 ### Installing prerequisites on Ubuntu/Debian
 
@@ -50,9 +53,10 @@ To install all necessary packages run:
 
 ```sh
 sudo apt install php-cgi phpunit php-codesniffer \
-                 python3-pip python3-setuptools python3-dev pylint
+                 python3-pip python3-setuptools python3-dev
 
-pip3 install --user behave mkdocs mkdocstrings pytest
+pip3 install --user behave mkdocs mkdocstrings pytest pylint \
+                    mypy types-PyYAML types-jinja2 types-psycopg2 types-psutil
 ```
 
 The `mkdocs` executable will be located in `.local/bin`. You may have to add
diff --git a/docs/develop/ICU-Tokenizer-Modules.md b/docs/develop/ICU-Tokenizer-Modules.md
new file mode 100644 (file)
index 0000000..2cf30a5
--- /dev/null
@@ -0,0 +1,227 @@
+# Writing custom sanitizer and token analysis modules for the ICU tokenizer
+
+The [ICU tokenizer](../customize/Tokenizers.md#icu-tokenizer) provides a
+highly customizable method to pre-process and normalize the name information
+of the input data before it is added to the search index. It comes with a
+selection of sanitizers and token analyzers which you can use to adapt your
+installation to your needs. If the provided modules are not enough, you can
+also provide your own implementations. This section describes the API
+of sanitizers and token analysis.
+
+!!! warning
+    This API is currently in early alpha status. While this API is meant to
+    be a public API on which other sanitizers and token analyzers may be
+    implemented, it is not guaranteed to be stable at the moment.
+
+
+## Using non-standard sanitizers and token analyzers
+
+Sanitizer names (in the `step` property) and token analysis names (in the
+`analyzer`) may refer to externally supplied modules. There are two ways
+to include external modules: through a library or from the project directory.
+
+To include a module from a library, use the absolute import path as name and
+make sure the library can be found in your PYTHONPATH.
+
+To use a custom module without creating a library, you can put the module
+somewhere in your project directory and then use the relative path to the
+file. Include the whole name of the file including the `.py` ending.
+
+## Custom sanitizer modules
+
+A sanitizer module must export a single factory function `create` with the
+following signature:
+
+``` python
+def create(config: SanitizerConfig) -> Callable[[ProcessInfo], None]
+```
+
+The function receives the custom configuration for the sanitizer and must
+return a callable (function or class) that transforms the name and address
+terms of a place. When a place is processed, then a `ProcessInfo` object
+is created from the information that was queried from the database. This
+object is sequentially handed to each configured sanitizer, so that each
+sanitizer receives the result of processing from the previous sanitizer.
+After the last sanitizer is finished, the resulting name and address lists
+are forwarded to the token analysis module.
+
+Sanitizer functions are instantiated once and then called for each place
+that is imported or updated. They don't need to be thread-safe.
+If multi-threading is used, each thread creates their own instance of
+the function.
+
+### Sanitizer configuration
+
+::: nominatim.tokenizer.sanitizers.config.SanitizerConfig
+    rendering:
+        show_source: no
+        heading_level: 6
+
+### The main filter function of the sanitizer
+
+The filter function receives a single object of type `ProcessInfo`
+which has with three members:
+
+ * `place`: read-only information about the place being processed.
+   See PlaceInfo below.
+ * `names`: The current list of names for the place. Each name is a
+   PlaceName object.
+ * `address`: The current list of address names for the place. Each name
+   is a PlaceName object.
+
+While the `place` member is provided for information only, the `names` and
+`address` lists are meant to be manipulated by the sanitizer. It may add and
+remove entries, change information within a single entry (for example by
+adding extra attributes) or completely replace the list with a different one.
+
+#### PlaceInfo - information about the place
+
+::: nominatim.data.place_info.PlaceInfo
+    rendering:
+        show_source: no
+        heading_level: 6
+
+
+#### PlaceName - extended naming information
+
+::: nominatim.data.place_name.PlaceName
+    rendering:
+        show_source: no
+        heading_level: 6
+
+
+### Example: Filter for US street prefixes
+
+The following sanitizer removes the directional prefixes from street names
+in the US:
+
+``` python
+import re
+
+def _filter_function(obj):
+    if obj.place.country_code == 'us' \
+       and obj.place.rank_address >= 26 and obj.place.rank_address <= 27:
+        for name in obj.names:
+            name.name = re.sub(r'^(north|south|west|east) ',
+                               '',
+                               name.name,
+                               flags=re.IGNORECASE)
+
+def create(config):
+    return _filter_function
+```
+
+This is the most simple form of a sanitizer module. If defines a single
+filter function and implements the required `create()` function by returning
+the filter.
+
+The filter function first checks if the object is interesting for the
+sanitizer. Namely it checks if the place is in the US (through `country_code`)
+and it the place is a street (a `rank_address` of 26 or 27). If the
+conditions are met, then it goes through all available names and
+removes any leading directional prefix using a simple regular expression.
+
+Save the source code in a file in your project directory, for example as
+`us_streets.py`. Then you can use the sanitizer in your `icu_tokenizer.yaml`:
+
+``` yaml
+...
+sanitizers:
+    - step: us_streets.py
+...
+```
+
+!!! warning
+    This example is just a simplified show case on how to create a sanitizer.
+    It is not really read for real-world use: while the sanitizer would
+    correcly transform `West 5th Street` into `5th Street`. it would also
+    shorten a simple `North Street` to `Street`.
+
+For more sanitizer examples, have a look at the sanitizers provided by Nominatim.
+They can be found in the directory
+[`nominatim/tokenizer/sanitizers`](https://github.com/osm-search/Nominatim/tree/master/nominatim/tokenizer/sanitizers).
+
+
+## Custom token analysis module
+
+::: nominatim.tokenizer.token_analysis.base.AnalysisModule
+    rendering:
+        show_source: no
+        heading_level: 6
+
+
+::: nominatim.tokenizer.token_analysis.base.Analyzer
+    rendering:
+        show_source: no
+        heading_level: 6
+
+### Example: Creating acronym variants for long names
+
+The following example of a token analysis module creates acronyms from
+very long names and adds them as a variant:
+
+``` python
+class AcronymMaker:
+    """ This class is the actual analyzer.
+    """
+    def __init__(self, norm, trans):
+        self.norm = norm
+        self.trans = trans
+
+
+    def get_canonical_id(self, name):
+        # In simple cases, the normalized name can be used as a canonical id.
+        return self.norm.transliterate(name.name).strip()
+
+
+    def compute_variants(self, name):
+        # The transliterated form of the name always makes up a variant.
+        variants = [self.trans.transliterate(name)]
+
+        # Only create acronyms from very long words.
+        if len(name) > 20:
+            # Take the first letter from each word to form the acronym.
+            acronym = ''.join(w[0] for w in name.split())
+            # If that leds to an acronym with at least three letters,
+            # add the resulting acronym as a variant.
+            if len(acronym) > 2:
+                # Never forget to transliterate the variants before returning them.
+                variants.append(self.trans.transliterate(acronym))
+
+        return variants
+
+# The following two functions are the module interface.
+
+def configure(rules, normalizer, transliterator):
+    # There is no configuration to parse and no data to set up.
+    # Just return an empty configuration.
+    return None
+
+
+def create(normalizer, transliterator, config):
+    # Return a new instance of our token analysis class above.
+    return AcronymMaker(normalizer, transliterator)
+```
+
+Given the name `Trans-Siberian Railway`, the code above would return the full
+name `Trans-Siberian Railway` and the acronym `TSR` as variant, so that
+searching would work for both.
+
+## Sanitizers vs. Token analysis - what to use for variants?
+
+It is not always clear when to implement variations in the sanitizer and
+when to write a token analysis module. Just take the acronym example
+above: it would also have been possible to write a sanitizer which adds the
+acronym as an additional name to the name list. The result would have been
+similar. So which should be used when?
+
+The most important thing to keep in mind is that variants created by the
+token analysis are only saved in the word lookup table. They do not need
+extra space in the search index. If there are many spelling variations, this
+can mean quite a significant amount of space is saved.
+
+When creating additional names with a sanitizer, these names are completely
+independent. In particular, they can be fed into different token analysis
+modules. This gives a much greater flexibility but at the price that the
+additional names increase the size of the search index.
+
index 22959e2218725bf514f70b35f18098b9ce3adb8f..528e8bb235e83df6309d25868d2fc0186d66a479 100644 (file)
@@ -78,7 +78,7 @@ The inheritance is computed in the data preparation step.
 The prepared place information is handed to the tokenizer next. This is a
 Python module responsible for processing the names  from both name and address
 terms and building up the word index from them. The process is explained in
-more detail in the [Tokenizer chapter](Tokenizer.md).
+more detail in the [Tokenizer chapter](Tokenizers.md).
 
 ### Address processing
 
index e2b01b8d6c177a0182f83b6ab0cc56b84c888225..20c9d165214c74c0d7f4dae88eb625b8872a20bc 100644 (file)
@@ -22,8 +22,8 @@ This test directory is sturctured as follows:
   |
   +-   php         PHP unit tests
   +-   python      Python unit tests
-  +-   scenes      Geometry test data
   +-   testdb      Base data for generating API test database
+  +-   testdata    Additional test data used by unit tests
 ```
 
 ## PHP Unit Tests (`test/php`)
index 28d8fd19733140c6db368238014c8adda0722028..273e65e2126381a65b2d27361d71269c2ec439c5 100644 (file)
@@ -93,7 +93,7 @@ for a custom tokenizer implementation.
 
 Nominatim expects two files for a tokenizer:
 
-* `nominiatim/tokenizer/<NAME>_tokenizer.py` containing the Python part of the
+* `nominatim/tokenizer/<NAME>_tokenizer.py` containing the Python part of the
   implementation
 * `lib-php/tokenizer/<NAME>_tokenizer.php` with the PHP part of the
   implementation
@@ -105,7 +105,7 @@ functions. By convention, these should be placed in `lib-sql/tokenizer`.
 If the tokenizer has a default configuration file, this should be saved in
 the `settings/<NAME>_tokenizer.<SUFFIX>`.
 
-### Configuration and Persistance
+### Configuration and Persistence
 
 Tokenizers may define custom settings for their configuration. All settings
 must be prefixed with `NOMINATIM_TOKENIZER_`. Settings may be transient or
@@ -245,11 +245,11 @@ Currently, tokenizers are encouraged to make sure that matching works against
 both the search token list and the match token list.
 
 ```sql
-FUNCTION token_normalized_postcode(postcode TEXT) RETURNS TEXT
+FUNCTION token_get_postcode(info JSONB) RETURNS TEXT
 ```
 
-Return the normalized version of the given postcode. This function must return
-the same value as the Python function `AbstractAnalyzer->normalize_postcode()`.
+Return the postcode for the object, if any exists. The postcode must be in
+the form that should also be presented to the end-user.
 
 ```sql
 FUNCTION token_strip_info(info JSONB) RETURNS JSONB
index bc77da0324e7a04467ecfb9f302935237226e79a..a04fb0389d3e52d5f61aa3dd7db7d65a8ee0434a 100644 (file)
@@ -13,7 +13,7 @@ More details in [osm-search/country-grid-data](https://github.com/osm-search/cou
 
 ## US Census TIGER
 
-For the United States you can choose to import additonal street-level data.
+For the United States you can choose to import additional street-level data.
 The data isn't mixed into OSM data but queried as fallback when no OSM
 result can be found.
 
index 9289c1d39884909c0d6d4c4a0209f8cec1039c97..3aecf2ef750e2eae298708eb7e2b8b20cdc9d8ac 100644 (file)
@@ -14,10 +14,11 @@ th {
     background-color: #eee;
 }
 
-/* Indentation for mkdocstrings.
-div.doc-contents:not(.first) {
-  padding-left: 25px;
-  border-left: 4px solid rgba(230, 230, 230);
-  margin-bottom: 60px;
-}*/
+.doc-object h6 {
+    margin-bottom: 0.8em;
+    font-size: 120%;
+}
 
+.doc-object {
+    margin-bottom: 1.3em;
+}
index c25ae0ad321711d4ff48044ab73323d9ab845aa5..e89c32d577fef165d1768dc4631463ad861f94dc 100644 (file)
@@ -3,7 +3,7 @@ theme: readthedocs
 docs_dir: ${CMAKE_CURRENT_BINARY_DIR}
 site_url: https://nominatim.org
 repo_url: https://github.com/openstreetmap/Nominatim
-pages:
+nav:
     - 'Introduction' : 'index.md'
     - 'API Reference':
         - 'Overview': 'api/Overview.md'
@@ -28,6 +28,7 @@ pages:
         - 'Overview': 'customize/Overview.md'
         - 'Import Styles': 'customize/Import-Styles.md'
         - 'Configuration Settings': 'customize/Settings.md'
+        - 'Per-Country Data': 'customize/Country-Settings.md'
         - 'Place Ranking' : 'customize/Ranking.md'
         - 'Tokenizers' : 'customize/Tokenizers.md'
         - 'Special Phrases': 'customize/Special-Phrases.md'
@@ -38,13 +39,14 @@ pages:
         - 'Database Layout' : 'develop/Database-Layout.md'
         - 'Indexing' : 'develop/Indexing.md'
         - 'Tokenizers' : 'develop/Tokenizers.md'
+        - 'Custom modules for ICU tokenizer': 'develop/ICU-Tokenizer-Modules.md'
         - 'Setup for Development' : 'develop/Development-Environment.md'
         - 'Testing' : 'develop/Testing.md'
         - 'External Data Sources': 'develop/data-sources.md'
     - 'Appendix':
-        - 'Installation on CentOS 8' : 'appendix/Install-on-Centos-8.md'
         - 'Installation on Ubuntu 18' : 'appendix/Install-on-Ubuntu-18.md'
         - 'Installation on Ubuntu 20' : 'appendix/Install-on-Ubuntu-20.md'
+        - 'Installation on Ubuntu 22' : 'appendix/Install-on-Ubuntu-22.md'
 markdown_extensions:
     - codehilite
     - admonition
@@ -56,7 +58,7 @@ plugins:
     - search
     - mkdocstrings:
         handlers:
-          python:
+          python-legacy:
             rendering:
               show_source: false
               show_signature_annotations: false
index 91e3d89fcfac21acf1120aea9aa58d2cf3d1d4a7..cfdd04167c259de142147e00846ff1b9546fd8e7 100644 (file)
@@ -1,4 +1,12 @@
 <?php
+/**
+ * SPDX-License-Identifier: GPL-2.0-only
+ *
+ * This file is part of Nominatim. (https://nominatim.org)
+ *
+ * Copyright (C) 2022 by the Nominatim developer community.
+ * For a full list of authors see the git log.
+ */
 
 namespace Nominatim;
 
@@ -84,6 +92,10 @@ class AddressDetails
                     || $aLine['class'] == 'place')
             ) {
                 $aAddress[$sTypeLabel] = $sName;
+
+                if (!empty($aLine['name'])) {
+                    $this->addSubdivisionCode($aAddress, $aLine['admin_level'], $aLine['name']);
+                }
             }
         }
 
@@ -166,4 +178,14 @@ class AddressDetails
     {
         return $this->aAddressLines;
     }
+
+    private function addSubdivisionCode(&$aAddress, $iAdminLevel, $nameDetails)
+    {
+        if (is_string($nameDetails)) {
+            $nameDetails = json_decode('{' . str_replace('"=>"', '":"', $nameDetails) . '}', true);
+        }
+        if (!empty($nameDetails['ISO3166-2'])) {
+            $aAddress["ISO3166-2-lvl$iAdminLevel"] = $nameDetails['ISO3166-2'];
+        }
+    }
 }
index bb7b0486cb628c687c342faa9faea86a8032ad5c..0561f482e794a62ecef1f86518ea1bbd095981d4 100644 (file)
@@ -1,4 +1,12 @@
 <?php
+/**
+ * SPDX-License-Identifier: GPL-2.0-only
+ *
+ * This file is part of Nominatim. (https://nominatim.org)
+ *
+ * Copyright (C) 2022 by the Nominatim developer community.
+ * For a full list of authors see the git log.
+ */
 
 namespace Nominatim\ClassTypes;
 
index 03ee6f1b8b6c6fc056b3e1a94604578b0f6fc2ed..6b6326b00034739df61d8e7b45e540677cbd8970 100644 (file)
@@ -1,4 +1,12 @@
 <?php
+/**
+ * SPDX-License-Identifier: GPL-2.0-only
+ *
+ * This file is part of Nominatim. (https://nominatim.org)
+ *
+ * Copyright (C) 2022 by the Nominatim developer community.
+ * For a full list of authors see the git log.
+ */
 
 namespace Nominatim;
 
@@ -38,6 +46,9 @@ class DB
 
         $conn->exec("SET DateStyle TO 'sql,european'");
         $conn->exec("SET client_encoding TO 'utf-8'");
+        // Disable JIT and parallel workers. They interfere badly with search SQL.
+        $conn->exec("UPDATE pg_settings SET setting = -1 WHERE name = 'jit_above_cost'");
+        $conn->exec("UPDATE pg_settings SET setting = 0 WHERE name = 'max_parallel_workers_per_gather'");
         $iMaxExecution = ini_get('max_execution_time');
         if ($iMaxExecution > 0) {
             $conn->setAttribute(\PDO::ATTR_TIMEOUT, $iMaxExecution); // seconds
index ec428de1951f8be8bb8976c5fae578892b6cddb4..68f1efe6fdfa5b69d28842ed58f6060722ce8026 100644 (file)
@@ -1,4 +1,12 @@
 <?php
+/**
+ * SPDX-License-Identifier: GPL-2.0-only
+ *
+ * This file is part of Nominatim. (https://nominatim.org)
+ *
+ * Copyright (C) 2022 by the Nominatim developer community.
+ * For a full list of authors see the git log.
+ */
 
 namespace Nominatim;
 
index 19221b435b2f14cdaca2459eabe8ea483f804f8e..0edc081ac43a66f4da025b15c29b03621b93dfec 100644 (file)
@@ -1,4 +1,12 @@
 <?php
+/**
+ * SPDX-License-Identifier: GPL-2.0-only
+ *
+ * This file is part of Nominatim. (https://nominatim.org)
+ *
+ * Copyright (C) 2022 by the Nominatim developer community.
+ * For a full list of authors see the git log.
+ */
 
 namespace Nominatim;
 
index e2d18b2d4afb923a67159bb6746374805410d8f8..818cc0867ae1a1dd77fa323c3ca54428b14eb10b 100644 (file)
@@ -1,4 +1,12 @@
 <?php
+/**
+ * SPDX-License-Identifier: GPL-2.0-only
+ *
+ * This file is part of Nominatim. (https://nominatim.org)
+ *
+ * Copyright (C) 2022 by the Nominatim developer community.
+ * For a full list of authors see the git log.
+ */
 
 namespace Nominatim;
 
index 43d10368eb9292ffcd90d2fcc8103b4a07ded395..ec1fa81da07fdae7b0891608d1fc66de1adfe40b 100644 (file)
@@ -1,4 +1,12 @@
 <?php
+/**
+ * SPDX-License-Identifier: GPL-2.0-only
+ *
+ * This file is part of Nominatim. (https://nominatim.org)
+ *
+ * Copyright (C) 2022 by the Nominatim developer community.
+ * For a full list of authors see the git log.
+ */
 
 namespace Nominatim;
 
@@ -95,7 +103,7 @@ class Geocode
         }
 
         $this->iFinalLimit = $iLimit;
-        $this->iLimit = $iLimit + min($iLimit, 10);
+        $this->iLimit = $iLimit + max($iLimit, 10);
     }
 
     public function setFeatureType($sFeatureType)
@@ -182,7 +190,7 @@ class Geocode
 
         $this->bFallback = $oParams->getBool('fallback', $this->bFallback);
 
-        // List of excluded Place IDs - used for more acurate pageing
+        // List of excluded Place IDs - used for more accurate pageing
         $sExcluded = $oParams->getStringList('exclude_place_ids');
         if ($sExcluded) {
             foreach ($sExcluded as $iExcludedPlaceID) {
@@ -609,16 +617,15 @@ class Geocode
                     }
                     $aReverseGroupedSearches = $this->getGroupedSearches($aSearches, $aPhrases, $oValidTokens);
 
-                    foreach ($aGroupedSearches as $aSearches) {
+                    foreach ($aReverseGroupedSearches as $aSearches) {
                         foreach ($aSearches as $aSearch) {
-                            if (!isset($aReverseGroupedSearches[$aSearch->getRank()])) {
-                                $aReverseGroupedSearches[$aSearch->getRank()] = array();
+                            if (!isset($aGroupedSearches[$aSearch->getRank()])) {
+                                $aGroupedSearches[$aSearch->getRank()] = array();
                             }
-                            $aReverseGroupedSearches[$aSearch->getRank()][] = $aSearch;
+                            $aGroupedSearches[$aSearch->getRank()][] = $aSearch;
                         }
                     }
 
-                    $aGroupedSearches = $aReverseGroupedSearches;
                     ksort($aGroupedSearches);
                 }
             } else {
@@ -836,7 +843,9 @@ class Geocode
                 $aResult['importance'] = 0.001;
                 $aResult['foundorder'] = $aResult['addressimportance'];
             } else {
-                $aResult['importance'] = max(0.001, $aResult['importance']);
+                if ($aResult['importance'] == 0) {
+                    $aResult['importance'] = 0.0001;
+                }
                 $aResult['importance'] *= $this->viewboxImportanceFactor(
                     $aResult['lon'],
                     $aResult['lat']
index d4068aa37c2c938458c5062585d23393b050658a..a4936d376d3cb773e31b9acf5386096fc209fc1a 100644 (file)
@@ -1,4 +1,12 @@
 <?php
+/**
+ * SPDX-License-Identifier: GPL-2.0-only
+ *
+ * This file is part of Nominatim. (https://nominatim.org)
+ *
+ * Copyright (C) 2022 by the Nominatim developer community.
+ * For a full list of authors see the git log.
+ */
 
 namespace Nominatim;
 
@@ -14,7 +22,10 @@ class ParameterParser
 
     public function getBool($sName, $bDefault = false)
     {
-        if (!isset($this->aParams[$sName]) || strlen($this->aParams[$sName]) == 0) {
+        if (!isset($this->aParams[$sName])
+            || !is_string($this->aParams[$sName])
+            || strlen($this->aParams[$sName]) == 0
+        ) {
             return $bDefault;
         }
 
@@ -23,7 +34,7 @@ class ParameterParser
 
     public function getInt($sName, $bDefault = false)
     {
-        if (!isset($this->aParams[$sName])) {
+        if (!isset($this->aParams[$sName]) || is_array($this->aParams[$sName])) {
             return $bDefault;
         }
 
@@ -36,7 +47,7 @@ class ParameterParser
 
     public function getFloat($sName, $bDefault = false)
     {
-        if (!isset($this->aParams[$sName])) {
+        if (!isset($this->aParams[$sName]) || is_array($this->aParams[$sName])) {
             return $bDefault;
         }
 
@@ -49,7 +60,10 @@ class ParameterParser
 
     public function getString($sName, $bDefault = false)
     {
-        if (!isset($this->aParams[$sName]) || strlen($this->aParams[$sName]) == 0) {
+        if (!isset($this->aParams[$sName])
+            || !is_string($this->aParams[$sName])
+            || strlen($this->aParams[$sName]) == 0
+        ) {
             return $bDefault;
         }
 
@@ -58,11 +72,14 @@ class ParameterParser
 
     public function getSet($sName, $aValues, $sDefault = false)
     {
-        if (!isset($this->aParams[$sName]) || strlen($this->aParams[$sName]) == 0) {
+        if (!isset($this->aParams[$sName])
+            || !is_string($this->aParams[$sName])
+            || strlen($this->aParams[$sName]) == 0
+        ) {
             return $sDefault;
         }
 
-        if (!in_array($this->aParams[$sName], $aValues)) {
+        if (!in_array($this->aParams[$sName], $aValues, true)) {
             userError("Parameter '$sName' must be one of: ".join(', ', $aValues));
         }
 
@@ -106,21 +123,27 @@ class ParameterParser
         }
 
         foreach ($aLanguages as $sLanguage => $fLanguagePref) {
-            $aLangPrefOrder['name:'.$sLanguage] = 'name:'.$sLanguage;
+            $this->addNameTag($aLangPrefOrder, 'name:'.$sLanguage);
         }
-        $aLangPrefOrder['name'] = 'name';
-        $aLangPrefOrder['brand'] = 'brand';
+        $this->addNameTag($aLangPrefOrder, 'name');
+        $this->addNameTag($aLangPrefOrder, 'brand');
         foreach ($aLanguages as $sLanguage => $fLanguagePref) {
-            $aLangPrefOrder['official_name:'.$sLanguage] = 'official_name:'.$sLanguage;
-            $aLangPrefOrder['short_name:'.$sLanguage] = 'short_name:'.$sLanguage;
+            $this->addNameTag($aLangPrefOrder, 'official_name:'.$sLanguage);
+            $this->addNameTag($aLangPrefOrder, 'short_name:'.$sLanguage);
         }
-        $aLangPrefOrder['official_name'] = 'official_name';
-        $aLangPrefOrder['short_name'] = 'short_name';
-        $aLangPrefOrder['ref'] = 'ref';
-        $aLangPrefOrder['type'] = 'type';
+        $this->addNameTag($aLangPrefOrder, 'official_name');
+        $this->addNameTag($aLangPrefOrder, 'short_name');
+        $this->addNameTag($aLangPrefOrder, 'ref');
+        $this->addNameTag($aLangPrefOrder, 'type');
         return $aLangPrefOrder;
     }
 
+    private function addNameTag(&$aLangPrefOrder, $sTag)
+    {
+        $aLangPrefOrder[$sTag] = $sTag;
+        $aLangPrefOrder['_place_'.$sTag] = '_place_'.$sTag;
+    }
+
     public function hasSetAny($aParamNames)
     {
         foreach ($aParamNames as $sName) {
index 4307a23022c640760fb08f92acddb3d01e8d70a0..4ed4d402f68c7c4e1c8dff5abd808087ef7ccfaa 100644 (file)
@@ -1,4 +1,12 @@
 <?php
+/**
+ * SPDX-License-Identifier: GPL-2.0-only
+ *
+ * This file is part of Nominatim. (https://nominatim.org)
+ *
+ * Copyright (C) 2022 by the Nominatim developer community.
+ * For a full list of authors see the git log.
+ */
 
 namespace Nominatim;
 
@@ -24,7 +32,7 @@ class Phrase
     }
 
     /**
-     * Get the orginal phrase of the string.
+     * Get the original phrase of the string.
      */
     public function getPhrase()
     {
index 7e78d536eab8cc53b3788ff5264b2c9f812d663f..33156537459b87019ba3fe269d1d07a3f58d8032 100644 (file)
@@ -1,4 +1,12 @@
 <?php
+/**
+ * SPDX-License-Identifier: GPL-2.0-only
+ *
+ * This file is part of Nominatim. (https://nominatim.org)
+ *
+ * Copyright (C) 2022 by the Nominatim developer community.
+ * For a full list of authors see the git log.
+ */
 
 namespace Nominatim;
 
@@ -340,7 +348,9 @@ class PlaceLookup
                     $sSQL .= '     null::text AS extra_place ';
                     $sSQL .= ' FROM (';
                     $sSQL .= '     SELECT place_id, ';    // interpolate the Tiger housenumbers here
-                    $sSQL .= '         ST_LineInterpolatePoint(linegeo, (housenumber_for_place-startnumber::float)/(endnumber-startnumber)::float) AS centroid, ';
+                    $sSQL .= '         CASE WHEN startnumber != endnumber';
+                    $sSQL .= '              THEN ST_LineInterpolatePoint(linegeo, (housenumber_for_place-startnumber::float)/(endnumber-startnumber)::float)';
+                    $sSQL .= '              ELSE ST_LineInterpolatePoint(linegeo, 0.5) END AS centroid, ';
                     $sSQL .= '         parent_place_id, ';
                     $sSQL .= '         housenumber_for_place';
                     $sSQL .= '     FROM (';
@@ -397,7 +407,7 @@ class PlaceLookup
                 $sSQL .= '         CASE ';             // interpolate the housenumbers here
                 $sSQL .= '           WHEN startnumber != endnumber ';
                 $sSQL .= '           THEN ST_LineInterpolatePoint(linegeo, (housenumber_for_place-startnumber::float)/(endnumber-startnumber)::float) ';
-                $sSQL .= '           ELSE ST_LineInterpolatePoint(linegeo, 0.5) ';
+                $sSQL .= '           ELSE linegeo ';
                 $sSQL .= '         END as centroid, ';
                 $sSQL .= '         parent_place_id, ';
                 $sSQL .= '         housenumber_for_place ';
@@ -435,18 +445,14 @@ class PlaceLookup
 
             if ($this->bExtraTags) {
                 if ($aPlace['extra']) {
-                    $aPlace['sExtraTags'] = json_decode($aPlace['extra']);
+                    $aPlace['sExtraTags'] = json_decode($aPlace['extra'], true);
                 } else {
                     $aPlace['sExtraTags'] = (object) array();
                 }
             }
 
             if ($this->bNameDetails) {
-                if ($aPlace['names']) {
-                    $aPlace['sNameDetails'] = json_decode($aPlace['names']);
-                } else {
-                    $aPlace['sNameDetails'] = (object) array();
-                }
+                $aPlace['sNameDetails'] = $this->extractNames($aPlace['names']);
             }
 
             $aPlace['addresstype'] = ClassTypes\getLabelTag(
@@ -469,6 +475,33 @@ class PlaceLookup
         return $aResults;
     }
 
+
+    private function extractNames($sNames)
+    {
+        if (!$sNames) {
+            return (object) array();
+        }
+
+        $aFullNames = json_decode($sNames, true);
+        $aNames = array();
+
+        foreach ($aFullNames as $sKey => $sValue) {
+            if (strpos($sKey, '_place_') === 0) {
+                $sSubKey = substr($sKey, 7);
+                if (array_key_exists($sSubKey, $aFullNames)) {
+                    $aNames[$sKey] = $sValue;
+                } else {
+                    $aNames[$sSubKey] = $sValue;
+                }
+            } else {
+                $aNames[$sKey] = $sValue;
+            }
+        }
+
+        return $aNames;
+    }
+
+
     /* returns an array which will contain the keys
      *   aBoundingBox
      * and may also contain one or more of the keys
@@ -479,8 +512,6 @@ class PlaceLookup
      *   lat
      *   lon
      */
-
-
     public function getOutlines($iPlaceID, $fLon = null, $fLat = null, $fRadius = null, $fLonReverse = null, $fLatReverse = null)
     {
 
index 774b7ca60b4c0a9ea51c913638d39c42c3cd5fc5..4b244d1d2d888508e6310a99cd57a95be96e4482 100644 (file)
@@ -1,4 +1,12 @@
 <?php
+/**
+ * SPDX-License-Identifier: GPL-2.0-only
+ *
+ * This file is part of Nominatim. (https://nominatim.org)
+ *
+ * Copyright (C) 2022 by the Nominatim developer community.
+ * For a full list of authors see the git log.
+ */
 
 namespace Nominatim;
 
index a670c623e363d31510f0df4ab743ba31de2678b5..77c16a5b09fe05b5ca5e9add4d06cb1dfbaba173 100644 (file)
@@ -1,4 +1,12 @@
 <?php
+/**
+ * SPDX-License-Identifier: GPL-2.0-only
+ *
+ * This file is part of Nominatim. (https://nominatim.org)
+ *
+ * Copyright (C) 2022 by the Nominatim developer community.
+ * For a full list of authors see the git log.
+ */
 
 namespace Nominatim;
 
@@ -56,8 +64,10 @@ class ReverseGeocode
     {
         Debug::newFunction('lookupInterpolation');
         $sSQL = 'SELECT place_id, parent_place_id, 30 as rank_search,';
-        $sSQL .= '  ST_LineLocatePoint(linegeo,'.$sPointSQL.') as fraction,';
-        $sSQL .= '  startnumber, endnumber, interpolationtype,';
+        $sSQL .= '  (CASE WHEN endnumber != startnumber';
+        $sSQL .= '        THEN (endnumber - startnumber) * ST_LineLocatePoint(linegeo,'.$sPointSQL.')';
+        $sSQL .= '        ELSE startnumber END) as fhnr,';
+        $sSQL .= '  startnumber, endnumber, step,';
         $sSQL .= '  ST_Distance(linegeo,'.$sPointSQL.') as distance';
         $sSQL .= ' FROM location_property_osmline';
         $sSQL .= ' WHERE ST_DWithin('.$sPointSQL.', linegeo, '.$fSearchDiam.')';
@@ -255,7 +265,7 @@ class ReverseGeocode
             // starts if the search is on POI or street level,
             // searches for the nearest POI or street,
             // if a street is found and a POI is searched for,
-            // the nearest POI which the found street is a parent of is choosen.
+            // the nearest POI which the found street is a parent of is chosen.
             $sSQL = 'select place_id,parent_place_id,rank_address,country_code,';
             $sSQL .= ' ST_distance('.$sPointSQL.', geometry) as distance';
             $sSQL .= ' FROM ';
@@ -319,9 +329,9 @@ class ReverseGeocode
                     && $this->iMaxRank >= 28
                 ) {
                     $sSQL = 'SELECT place_id,parent_place_id,30 as rank_search,';
-                    $sSQL .= 'ST_LineLocatePoint(linegeo,'.$sPointSQL.') as fraction,';
-                    $sSQL .= 'ST_distance('.$sPointSQL.', linegeo) as distance,';
-                    $sSQL .= 'startnumber,endnumber,interpolationtype';
+                    $sSQL .= '      (endnumber - startnumber) * ST_LineLocatePoint(linegeo,'.$sPointSQL.') as fhnr,';
+                    $sSQL .= '      startnumber, endnumber, step,';
+                    $sSQL .= '      ST_Distance('.$sPointSQL.', linegeo) as distance';
                     $sSQL .= ' FROM location_property_tiger WHERE parent_place_id = '.$oResult->iId;
                     $sSQL .= ' AND ST_DWithin('.$sPointSQL.', linegeo, 0.001)';
                     $sSQL .= ' ORDER BY distance ASC limit 1';
@@ -333,7 +343,11 @@ class ReverseGeocode
                     if ($aPlaceTiger) {
                         $aPlace = $aPlaceTiger;
                         $oResult = new Result($aPlaceTiger['place_id'], Result::TABLE_TIGER);
-                        $oResult->iHouseNumber = closestHouseNumber($aPlaceTiger);
+                        $iRndNum = max(0, round($aPlaceTiger['fhnr'] / $aPlaceTiger['step']) * $aPlaceTiger['step']);
+                        $oResult->iHouseNumber = $aPlaceTiger['startnumber'] + $iRndNum;
+                        if ($oResult->iHouseNumber > $aPlaceTiger['endnumber']) {
+                            $oResult->iHouseNumber = $aPlaceTiger['endnumber'];
+                        }
                         $iRankAddress = 30;
                     }
                 }
@@ -345,7 +359,7 @@ class ReverseGeocode
                     // We can't reliably go from the closest street to an
                     // interpolation line because the closest interpolation
                     // may have a different street segments as a parent.
-                    // Therefore allow an interpolation line to take precendence
+                    // Therefore allow an interpolation line to take precedence
                     // even when the street is closer.
                     $fDistance = $iRankAddress < 28 ? 0.001 : $aPlace['distance'];
                 }
@@ -355,7 +369,11 @@ class ReverseGeocode
 
                 if ($aHouse) {
                     $oResult = new Result($aHouse['place_id'], Result::TABLE_OSMLINE);
-                    $oResult->iHouseNumber = closestHouseNumber($aHouse);
+                    $iRndNum = max(0, round($aHouse['fhnr'] / $aHouse['step']) * $aHouse['step']);
+                    $oResult->iHouseNumber = $aHouse['startnumber'] + $iRndNum;
+                    if ($oResult->iHouseNumber > $aHouse['endnumber']) {
+                        $oResult->iHouseNumber = $aHouse['endnumber'];
+                    }
                     $aPlace = $aHouse;
                 }
             }
index 3b512ecb11434455f78c6aa7918caf7fc792fcae..3223b5c99ee298dd1fa8af91d60a25f6f400bf13 100644 (file)
@@ -1,4 +1,12 @@
 <?php
+/**
+ * SPDX-License-Identifier: GPL-2.0-only
+ *
+ * This file is part of Nominatim. (https://nominatim.org)
+ *
+ * Copyright (C) 2022 by the Nominatim developer community.
+ * For a full list of authors see the git log.
+ */
 
 namespace Nominatim;
 
index be5623afcd3170ec58662b7e7c9ea6f8258adb83..5d2caf0057b4585ec86dba94381526ad9afce07f 100644 (file)
@@ -1,4 +1,12 @@
 <?php
+/**
+ * SPDX-License-Identifier: GPL-2.0-only
+ *
+ * This file is part of Nominatim. (https://nominatim.org)
+ *
+ * Copyright (C) 2022 by the Nominatim developer community.
+ * For a full list of authors see the git log.
+ */
 
 namespace Nominatim;
 
@@ -228,7 +236,7 @@ class SearchDescription
      * Add the given full-word token to the list of terms to search for in the
      * name.
      *
-     * @param interger iId    ID of term to add.
+     * @param integer iId    ID of term to add.
      * @param bool bRareName  True if the term is infrequent enough to not
      *                        require other constraints for efficient search.
      */
@@ -256,6 +264,8 @@ class SearchDescription
     {
         if (empty($this->aName)) {
             $this->bNameNeedsAddress = $bNeedsAddress;
+        } elseif ($bSearchable && count($this->aName) >= 2) {
+            $this->bNameNeedsAddress = false;
         } else {
             $this->bNameNeedsAddress &= $bNeedsAddress;
         }
@@ -377,7 +387,7 @@ class SearchDescription
      *
      * @return mixed[] An array with two fields: IDs contains the list of
      *                 matching place IDs and houseNumber the houseNumber
-     *                 if appicable or -1 if not.
+     *                 if applicable or -1 if not.
      */
     public function query(&$oDB, $iMinRank, $iMaxRank, $iLimit)
     {
@@ -412,28 +422,6 @@ class SearchDescription
                 $iLimit
             );
 
-            // Now search for housenumber, if housenumber provided. Can be zero.
-            if (($this->sHouseNumber || $this->sHouseNumber === '0') && !empty($aResults)) {
-                $aHnResults = $this->queryHouseNumber($oDB, $aResults);
-
-                // Downgrade the rank of the street results, they are missing
-                // the housenumber. Also drop POI places (rank 30) here, they
-                // cannot be a parent place and therefore must not be shown
-                // as a result for a search with a missing housenumber.
-                foreach ($aResults as $oRes) {
-                    if ($oRes->iAddressRank < 28) {
-                        if ($oRes->iAddressRank >= 26) {
-                            $oRes->iResultRank++;
-                        } else {
-                            $oRes->iResultRank += 2;
-                        }
-                        $aHnResults[$oRes->iId] = $oRes;
-                    }
-                }
-
-                $aResults = $aHnResults;
-            }
-
             // finally get POIs if requested
             if ($this->sClass && !empty($aResults)) {
                 $aResults = $this->queryPoiByOperator($oDB, $aResults, $iLimit);
@@ -579,44 +567,6 @@ class SearchDescription
         $aTerms = array();
         $aOrder = array();
 
-        // Sort by existence of the requested house number but only if not
-        // too many results are expected for the street, i.e. if the result
-        // will be narrowed down by an address. Remember that with ordering
-        // every single result has to be checked.
-        if ($this->sHouseNumber && ($this->bRareName || !empty($this->aAddress) || $this->sPostcode)) {
-            $sHouseNumberRegex = $oDB->getDBQuoted('\\\\m'.$this->sHouseNumber.'\\\\M');
-
-            // Housenumbers on streets and places.
-            $sChildHnr = 'SELECT * FROM placex WHERE parent_place_id = search_name.place_id';
-            $sChildHnr .= '    AND housenumber ~* E'.$sHouseNumberRegex;
-            // Interpolations on streets and places.
-            if (preg_match('/^[0-9]+$/', $this->sHouseNumber)) {
-                $sIpolHnr = 'WHERE parent_place_id = search_name.place_id ';
-                $sIpolHnr .= '  AND startnumber is not NULL';
-                $sIpolHnr .= '    AND '.$this->sHouseNumber.'>=startnumber ';
-                $sIpolHnr .= '    AND '.$this->sHouseNumber.'<=endnumber ';
-            } else {
-                $sIpolHnr = false;
-            }
-            // Housenumbers on the object iteself for unlisted places.
-            $sSelfHnr = 'SELECT * FROM placex WHERE place_id = search_name.place_id';
-            $sSelfHnr .= '    AND housenumber ~* E'.$sHouseNumberRegex;
-
-            $sSql = '(CASE WHEN address_rank = 30 THEN EXISTS('.$sSelfHnr.') ';
-            $sSql .= ' ELSE EXISTS('.$sChildHnr.') ';
-            if ($sIpolHnr) {
-                $sSql .= 'OR EXISTS(SELECT * FROM location_property_osmline '.$sIpolHnr.') ';
-                if (CONST_Use_US_Tiger_Data) {
-                    $sSql .= "OR (country_code = 'us' AND ";
-                    $sSql .= '    EXISTS(SELECT * FROM location_property_tiger '.$sIpolHnr.')) ';
-                }
-            }
-            $sSql .= 'END) DESC';
-
-
-            $aOrder[] = $sSql;
-        }
-
         if (!empty($this->aName)) {
             $aTerms[] = 'name_vector @> '.$oDB->getArraySQL($this->aName);
         }
@@ -662,10 +612,6 @@ class SearchDescription
             $aTerms[] = 'centroid && '.$this->oContext->sqlViewboxSmall;
         }
 
-        if ($this->oContext->hasNearPoint()) {
-            $aOrder[] = $this->oContext->distanceSQL('centroid');
-        }
-
         if ($this->sHouseNumber) {
             $sImportanceSQL = '- abs(26 - address_rank) + 3';
         } else {
@@ -688,122 +634,128 @@ class SearchDescription
             $sExactMatchSQL = '0::int as exactmatch';
         }
 
-        if ($this->sHouseNumber || $this->sClass) {
-            $iLimit = 40;
+        if (empty($aTerms)) {
+            return array();
         }
 
-        $aResults = array();
-
-        if (!empty($aTerms)) {
-            $sSQL = 'SELECT place_id, address_rank,'.$sExactMatchSQL;
-            $sSQL .= ' FROM search_name';
-            $sSQL .= ' WHERE '.join(' and ', $aTerms);
-            $sSQL .= ' ORDER BY '.join(', ', $aOrder);
-            $sSQL .= ' LIMIT '.$iLimit;
+        if ($this->hasHousenumber()) {
+            $sHouseNumberRegex = $oDB->getDBQuoted('\\\\m'.$this->sHouseNumber.'\\\\M');
 
-            Debug::printSQL($sSQL);
+            // Housenumbers on streets and places.
+            $sPlacexSql = 'SELECT array_agg(place_id) FROM placex';
+            $sPlacexSql .= ' WHERE parent_place_id = sin.place_id AND sin.address_rank < 30';
+            $sPlacexSql .= $this->oContext->excludeSQL(' AND place_id');
+            $sPlacexSql .= '       and housenumber ~* E'.$sHouseNumberRegex;
 
-            $aDBResults = $oDB->getAll($sSQL, null, 'Could not get places for search terms.');
+            // Interpolations on streets and places.
+            $sInterpolSql = 'null';
+            $sTigerSql = 'null';
+            if (preg_match('/^[0-9]+$/', $this->sHouseNumber)) {
+                $sIpolHnr = 'WHERE parent_place_id = sin.place_id ';
+                $sIpolHnr .= '  AND startnumber is not NULL AND sin.address_rank < 30';
+                $sIpolHnr .= '  AND '.$this->sHouseNumber.' between startnumber and endnumber';
+                $sIpolHnr .= '  AND ('.$this->sHouseNumber.' - startnumber) % step = 0';
 
-            foreach ($aDBResults as $aResult) {
-                $oResult = new Result($aResult['place_id']);
-                $oResult->iExactMatches = $aResult['exactmatch'];
-                $oResult->iAddressRank = $aResult['address_rank'];
-                $aResults[$aResult['place_id']] = $oResult;
+                $sInterpolSql = 'SELECT array_agg(place_id) FROM location_property_osmline '.$sIpolHnr;
+                if (CONST_Use_US_Tiger_Data) {
+                    $sTigerSql = 'SELECT array_agg(place_id) FROM location_property_tiger '.$sIpolHnr;
+                    $sTigerSql .= "      and sin.country_code = 'us'";
+                }
             }
-        }
 
-        return $aResults;
-    }
+            if ($this->sClass) {
+                $iLimit = 40;
+            }
 
-    private function queryHouseNumber(&$oDB, $aRoadPlaceIDs)
-    {
-        $aResults = array();
-        $sRoadPlaceIDs = Result::joinIdsByTableMaxRank(
-            $aRoadPlaceIDs,
-            Result::TABLE_PLACEX,
-            27
-        );
-        $sPOIPlaceIDs = Result::joinIdsByTableMinRank(
-            $aRoadPlaceIDs,
-            Result::TABLE_PLACEX,
-            30
-        );
+            $sSelfHnr = 'SELECT * FROM placex WHERE place_id = search_name.place_id';
+            $sSelfHnr .= '    AND housenumber ~* E'.$sHouseNumberRegex;
 
-        $aIDCondition = array();
-        if ($sRoadPlaceIDs) {
-            $aIDCondition[] = 'parent_place_id in ('.$sRoadPlaceIDs.')';
-        }
-        if ($sPOIPlaceIDs) {
-            $aIDCondition[] = 'place_id in ('.$sPOIPlaceIDs.')';
-        }
+            $aTerms[] = '(address_rank < 30 or exists('.$sSelfHnr.'))';
+
+
+            $sSQL = 'SELECT sin.*, ';
+            $sSQL .=        '('.$sPlacexSql.') as placex_hnr, ';
+            $sSQL .=        '('.$sInterpolSql.') as interpol_hnr, ';
+            $sSQL .=        '('.$sTigerSql.') as tiger_hnr ';
+            $sSQL .= ' FROM (';
+            $sSQL .= '    SELECT place_id, address_rank, country_code,'.$sExactMatchSQL.',';
+            $sSQL .= '            CASE WHEN importance = 0 OR importance IS NULL';
+            $sSQL .= '               THEN 0.75001-(search_rank::float/40) ELSE importance END as importance';
+            $sSQL .= '     FROM search_name';
+            $sSQL .= '     WHERE '.join(' and ', $aTerms);
+            $sSQL .= '     ORDER BY '.join(', ', $aOrder);
+            $sSQL .= '     LIMIT 40000';
+            $sSQL .= ') as sin';
+            $sSQL .= ' ORDER BY address_rank = 30 desc, placex_hnr, interpol_hnr, tiger_hnr,';
+            $sSQL .= '          importance';
+            $sSQL .= ' LIMIT '.$iLimit;
+        } else {
+            if ($this->sClass) {
+                $iLimit = 40;
+            }
 
-        if (empty($aIDCondition)) {
-            return $aResults;
+            $sSQL = 'SELECT place_id, address_rank, '.$sExactMatchSQL;
+            $sSQL .= ' FROM search_name';
+            $sSQL .= ' WHERE '.join(' and ', $aTerms);
+            $sSQL .= ' ORDER BY '.join(', ', $aOrder);
+            $sSQL .= ' LIMIT '.$iLimit;
         }
 
-        $sHouseNumberRegex = $oDB->getDBQuoted('\\\\m'.$this->sHouseNumber.'\\\\M');
-        $sSQL = 'SELECT place_id FROM placex WHERE';
-        $sSQL .= '  housenumber ~* E'.$sHouseNumberRegex;
-        $sSQL .= ' AND ('.join(' OR ', $aIDCondition).')';
-        $sSQL .= $this->oContext->excludeSQL(' AND place_id');
-
         Debug::printSQL($sSQL);
 
-        // XXX should inherit the exactMatches from its parent
-        foreach ($oDB->getCol($sSQL) as $iPlaceId) {
-            $aResults[$iPlaceId] = new Result($iPlaceId);
-        }
+        $aDBResults = $oDB->getAll($sSQL, null, 'Could not get places for search terms.');
 
-        $bIsIntHouseNumber= (bool) preg_match('/[0-9]+/', $this->sHouseNumber);
-        $iHousenumber = intval($this->sHouseNumber);
-        if ($bIsIntHouseNumber && $sRoadPlaceIDs && empty($aResults)) {
-            // if nothing found, search in the interpolation line table
-            $sSQL = 'SELECT distinct place_id FROM location_property_osmline';
-            $sSQL .= ' WHERE startnumber is not NULL';
-            $sSQL .= '  AND parent_place_id in ('.$sRoadPlaceIDs.') AND (';
-            if ($iHousenumber % 2 == 0) {
-                // If housenumber is even, look for housenumber in streets
-                // with interpolationtype even or all.
-                $sSQL .= "interpolationtype='even'";
-            } else {
-                // Else look for housenumber with interpolationtype odd or all.
-                $sSQL .= "interpolationtype='odd'";
-            }
-            $sSQL .= " or interpolationtype='all') and ";
-            $sSQL .= $iHousenumber.'>=startnumber and ';
-            $sSQL .= $iHousenumber.'<=endnumber';
-            $sSQL .= $this->oContext->excludeSQL(' AND place_id');
-
-            Debug::printSQL($sSQL);
+        $aResults = array();
 
-            foreach ($oDB->getCol($sSQL) as $iPlaceId) {
-                $oResult = new Result($iPlaceId, Result::TABLE_OSMLINE);
-                $oResult->iHouseNumber = $iHousenumber;
-                $aResults[$iPlaceId] = $oResult;
-            }
-        }
+        foreach ($aDBResults as $aResult) {
+            $oResult = new Result($aResult['place_id']);
+            $oResult->iExactMatches = $aResult['exactmatch'];
+            $oResult->iAddressRank = $aResult['address_rank'];
+
+            $bNeedResult = true;
+            if ($this->hasHousenumber() && $aResult['address_rank'] < 30) {
+                if ($aResult['placex_hnr']) {
+                    foreach (explode(',', substr($aResult['placex_hnr'], 1, -1)) as $sPlaceID) {
+                        $iPlaceID = intval($sPlaceID);
+                        $oHnrResult = new Result($iPlaceID);
+                        $oHnrResult->iExactMatches = $aResult['exactmatch'];
+                        $oHnrResult->iAddressRank = 30;
+                        $aResults[$iPlaceID] = $oHnrResult;
+                        $bNeedResult = false;
+                    }
+                }
+                if ($aResult['interpol_hnr']) {
+                    foreach (explode(',', substr($aResult['interpol_hnr'], 1, -1)) as $sPlaceID) {
+                        $iPlaceID = intval($sPlaceID);
+                        $oHnrResult = new Result($iPlaceID, Result::TABLE_OSMLINE);
+                        $oHnrResult->iExactMatches = $aResult['exactmatch'];
+                        $oHnrResult->iAddressRank = 30;
+                        $oHnrResult->iHouseNumber = intval($this->sHouseNumber);
+                        $aResults[$iPlaceID] = $oHnrResult;
+                        $bNeedResult = false;
+                    }
+                }
+                if ($aResult['tiger_hnr']) {
+                    foreach (explode(',', substr($aResult['tiger_hnr'], 1, -1)) as $sPlaceID) {
+                        $iPlaceID = intval($sPlaceID);
+                        $oHnrResult = new Result($iPlaceID, Result::TABLE_TIGER);
+                        $oHnrResult->iExactMatches = $aResult['exactmatch'];
+                        $oHnrResult->iAddressRank = 30;
+                        $oHnrResult->iHouseNumber = intval($this->sHouseNumber);
+                        $aResults[$iPlaceID] = $oHnrResult;
+                        $bNeedResult = false;
+                    }
+                }
 
-        // If nothing found then search in Tiger data (location_property_tiger)
-        if (CONST_Use_US_Tiger_Data && $sRoadPlaceIDs && $bIsIntHouseNumber && empty($aResults)) {
-            $sSQL = 'SELECT place_id FROM location_property_tiger';
-            $sSQL .= ' WHERE parent_place_id in ('.$sRoadPlaceIDs.') and (';
-            if ($iHousenumber % 2 == 0) {
-                $sSQL .= "interpolationtype='even'";
-            } else {
-                $sSQL .= "interpolationtype='odd'";
+                if ($aResult['address_rank'] < 26) {
+                    $oResult->iResultRank += 2;
+                } else {
+                    $oResult->iResultRank++;
+                }
             }
-            $sSQL .= " or interpolationtype='all') and ";
-            $sSQL .= $iHousenumber.'>=startnumber and ';
-            $sSQL .= $iHousenumber.'<=endnumber';
-            $sSQL .= $this->oContext->excludeSQL(' AND place_id');
-
-            Debug::printSQL($sSQL);
 
-            foreach ($oDB->getCol($sSQL) as $iPlaceId) {
-                $oResult = new Result($iPlaceId, Result::TABLE_TIGER);
-                $oResult->iHouseNumber = $iHousenumber;
-                $aResults[$iPlaceId] = $oResult;
+            if ($bNeedResult) {
+                $aResults[$aResult['place_id']] = $oResult;
             }
         }
 
@@ -855,6 +807,7 @@ class SearchDescription
                 $sSQL = 'SELECT geometry FROM placex';
                 $sSQL .= " WHERE place_id in ($sPlaceIDs)";
                 $sSQL .= "   AND rank_search < $iMaxRank + 5";
+                $sSQL .= '   AND ST_Area(Box2d(geometry)) < 20';
                 $sSQL .= "   AND ST_GeometryType(geometry) in ('ST_Polygon','ST_MultiPolygon')";
                 $sSQL .= ' ORDER BY rank_search ASC ';
                 $sSQL .= ' LIMIT 1';
index e4260bf20f2c5749009a440c0fe2ca6fcb12e1a2..aeeeb2c33f45aab8086f9a95f47445769fd9b5cd 100644 (file)
@@ -1,4 +1,12 @@
 <?php
+/**
+ * SPDX-License-Identifier: GPL-2.0-only
+ *
+ * This file is part of Nominatim. (https://nominatim.org)
+ *
+ * Copyright (C) 2022 by the Nominatim developer community.
+ * For a full list of authors see the git log.
+ */
 
 namespace Nominatim;
 
index 4bec20e9c35af04d6e6bfe17615e4eaf2a786cea..4be13235ebd3d73ab9bcd44ec6207bce9bf72b3a 100644 (file)
@@ -1,4 +1,12 @@
 <?php
+/**
+ * SPDX-License-Identifier: GPL-2.0-only
+ *
+ * This file is part of Nominatim. (https://nominatim.org)
+ *
+ * Copyright (C) 2022 by the Nominatim developer community.
+ * For a full list of authors see the git log.
+ */
 
 namespace Nominatim;
 
index 3dd9bda12c6758a9041a98073574b121e81cba58..7009d370f9bb0e992f49eb47547ce5ef950b0f5b 100644 (file)
@@ -1,4 +1,12 @@
 <?php
+/**
+ * SPDX-License-Identifier: GPL-2.0-only
+ *
+ * This file is part of Nominatim. (https://nominatim.org)
+ *
+ * Copyright (C) 2022 by the Nominatim developer community.
+ * For a full list of authors see the git log.
+ */
 
 namespace Nominatim;
 
@@ -112,13 +120,18 @@ class SimpleWordList
         return array_slice($aWordSets, 0, SimpleWordList::MAX_WORDSETS);
     }
 
+    /**
+     * Custom search routine which takes two arrays. The array with the fewest
+     * items wins. If same number of items then the one with the longest first
+     * element wins.
+     */
     public static function cmpByArraylen($aA, $aB)
     {
         $iALen = count($aA);
         $iBLen = count($aB);
 
         if ($iALen == $iBLen) {
-            return 0;
+            return strlen($aB[0]) <=> strlen($aA[0]);
         }
 
         return ($iALen < $iBLen) ? -1 : 1;
index a0ec23e13eed8979179804d50b9f85a4bfce4899..94df59ea2b392dbffbac539975da7a55304c4fd7 100644 (file)
@@ -1,4 +1,12 @@
 <?php
+/**
+ * SPDX-License-Identifier: GPL-2.0-only
+ *
+ * This file is part of Nominatim. (https://nominatim.org)
+ *
+ * Copyright (C) 2022 by the Nominatim developer community.
+ * For a full list of authors see the git log.
+ */
 
 namespace Nominatim;
 
index 4a8f559226ca669b1c0c5b883c7d5be07daf6ca6..4f1555cdb341e24b93c78fec565a0efa80677016 100644 (file)
@@ -1,4 +1,12 @@
 <?php
+/**
+ * SPDX-License-Identifier: GPL-2.0-only
+ *
+ * This file is part of Nominatim. (https://nominatim.org)
+ *
+ * Copyright (C) 2022 by the Nominatim developer community.
+ * For a full list of authors see the git log.
+ */
 
 namespace Nominatim;
 
index ab84c388edf00e9269de3dce040505b08eb6b51a..3f93f45e0fe8e5ef18ca990bcf007492e2a45370 100644 (file)
@@ -1,4 +1,12 @@
 <?php
+/**
+ * SPDX-License-Identifier: GPL-2.0-only
+ *
+ * This file is part of Nominatim. (https://nominatim.org)
+ *
+ * Copyright (C) 2022 by the Nominatim developer community.
+ * For a full list of authors see the git log.
+ */
 
 namespace Nominatim\Token;
 
index ea7a052e5e65f51ab3f003e8cb75cee58fc134dc..62c2a624a6e4d7bed6fe55dae4afe8a88c5ba076 100644 (file)
@@ -1,4 +1,12 @@
 <?php
+/**
+ * SPDX-License-Identifier: GPL-2.0-only
+ *
+ * This file is part of Nominatim. (https://nominatim.org)
+ *
+ * Copyright (C) 2022 by the Nominatim developer community.
+ * For a full list of authors see the git log.
+ */
 
 namespace Nominatim\Token;
 
index a599648c21acdb48191c684f4f94c41950e2ae8c..9a3950a162c9cee85e519601e11c5e6f5f42212e 100644 (file)
@@ -1,4 +1,12 @@
 <?php
+/**
+ * SPDX-License-Identifier: GPL-2.0-only
+ *
+ * This file is part of Nominatim. (https://nominatim.org)
+ *
+ * Copyright (C) 2022 by the Nominatim developer community.
+ * For a full list of authors see the git log.
+ */
 
 namespace Nominatim;
 
index 112154b2cf59526cf8432be726a4471ceb772b9c..3dc6f308a9e3c1f41e4e236163ccfc448973da48 100644 (file)
@@ -1,4 +1,12 @@
 <?php
+/**
+ * SPDX-License-Identifier: GPL-2.0-only
+ *
+ * This file is part of Nominatim. (https://nominatim.org)
+ *
+ * Copyright (C) 2022 by the Nominatim developer community.
+ * For a full list of authors see the git log.
+ */
 
 namespace Nominatim\Token;
 
index c0b42fad5ae3fab4b4360f153806e4365f20b357..0ff92929cb58f2b496275fe23d016ac0d4dfdef2 100644 (file)
@@ -1,4 +1,12 @@
 <?php
+/**
+ * SPDX-License-Identifier: GPL-2.0-only
+ *
+ * This file is part of Nominatim. (https://nominatim.org)
+ *
+ * Copyright (C) 2022 by the Nominatim developer community.
+ * For a full list of authors see the git log.
+ */
 
 namespace Nominatim\Token;
 
@@ -9,7 +17,7 @@ class Postcode
 {
     /// Database word id, if available.
     private $iId;
-    /// Full nomralized postcode (upper cased).
+    /// Full normalized postcode (upper cased).
     private $sPostcode;
     // Optional country code the postcode belongs to (currently unused).
     private $sCountryCode;
@@ -17,7 +25,12 @@ class Postcode
     public function __construct($iId, $sPostcode, $sCountryCode = '')
     {
         $this->iId = $iId;
-        $this->sPostcode = $sPostcode;
+        $iSplitPos = strpos($sPostcode, '@');
+        if ($iSplitPos === false) {
+            $this->sPostcode = $sPostcode;
+        } else {
+            $this->sPostcode = substr($sPostcode, 0, $iSplitPos);
+        }
         $this->sCountryCode = empty($sCountryCode) ? '' : $sCountryCode;
     }
 
index 6eb2ede341a21b2a51da6646431a8c5fd41c16f1..cdd04e6c41dccf6ae8646816849244a1b39b50e0 100644 (file)
@@ -1,4 +1,12 @@
 <?php
+/**
+ * SPDX-License-Identifier: GPL-2.0-only
+ *
+ * This file is part of Nominatim. (https://nominatim.org)
+ *
+ * Copyright (C) 2022 by the Nominatim developer community.
+ * For a full list of authors see the git log.
+ */
 
 namespace Nominatim\Token;
 
index 59456e35aaef3d309b8d2da23aca21df2d546b9f..a7557d38b51c8c97a2cf12baf1c7776cb5bc25c8 100644 (file)
@@ -1,4 +1,12 @@
 <?php
+/**
+ * SPDX-License-Identifier: GPL-2.0-only
+ *
+ * This file is part of Nominatim. (https://nominatim.org)
+ *
+ * Copyright (C) 2022 by the Nominatim developer community.
+ * For a full list of authors see the git log.
+ */
 
 namespace Nominatim\Token;
 
@@ -54,7 +62,7 @@ class Word
     public function extendSearch($oSearch, $oPosition)
     {
         // Full words can only be a name if they appear at the beginning
-        // of the phrase. In structured search the name must forcably in
+        // of the phrase. In structured search the name must forcibly in
         // the first phrase. In unstructured search it may be in a later
         // phrase when the first phrase is a house number.
         if ($oSearch->hasName()
index 9f205de7a8fe064f1dc9d40be4ee762548bf921f..887b4bebb6c7cab443bf7fa09f4ccd6c16847c37 100644 (file)
@@ -1,4 +1,12 @@
 <?php
+/**
+ * SPDX-License-Identifier: GPL-2.0-only
+ *
+ * This file is part of Nominatim. (https://nominatim.org)
+ *
+ * Copyright (C) 2022 by the Nominatim developer community.
+ * For a full list of authors see the git log.
+ */
     @define('CONST_LibDir', dirname(dirname(__FILE__)));
     // Script to extract structured city and street data
     // from a running nominatim instance as CSV data
index 338ec2da64f6668d03caee6e450637186561e804..5cbae89846f52bc9034f9c36d0ed352260b98fd3 100644 (file)
@@ -1,4 +1,12 @@
 <?php
+/**
+ * SPDX-License-Identifier: GPL-2.0-only
+ *
+ * This file is part of Nominatim. (https://nominatim.org)
+ *
+ * Copyright (C) 2022 by the Nominatim developer community.
+ * For a full list of authors see the git log.
+ */
 @define('CONST_LibDir', dirname(dirname(__FILE__)));
 
 require_once(CONST_LibDir.'/init-cmd.php');
index a52e8fcee0c6563c971733dd002139ed92958070..6f1299dd16b8549f6b473adfbb77af851bb111f6 100644 (file)
@@ -1,4 +1,12 @@
 <?php
+/**
+ * SPDX-License-Identifier: GPL-2.0-only
+ *
+ * This file is part of Nominatim. (https://nominatim.org)
+ *
+ * Copyright (C) 2022 by the Nominatim developer community.
+ * For a full list of authors see the git log.
+ */
 
 require_once(CONST_LibDir.'/Shell.php');
 
@@ -98,7 +106,7 @@ function getCmdOpt($aArg, $aSpec, &$aResult, $bExitOnError = false, $bExitOnUnkn
                 showUsage($aSpec, $bExitOnError, 'Option \''.$aLine[0].'\' is missing');
             }
             if ($aCounts[$aLine[0]] > $aLine[3]) {
-                showUsage($aSpec, $bExitOnError, 'Option \''.$aLine[0].'\' is pressent too many times');
+                showUsage($aSpec, $bExitOnError, 'Option \''.$aLine[0].'\' is present too many times');
             }
             if ($aLine[6] == 'bool' && !array_key_exists($aLine[0], $aResult)) {
                 $aResult[$aLine[0]] = false;
index 35471fdc4aecbd74d725f71690f1beb8191eaa6e..bcddf008b0ed05ee80b54d65940dabbeb68608cd 100644 (file)
@@ -1,4 +1,12 @@
 <?php
+/**
+ * SPDX-License-Identifier: GPL-2.0-only
+ *
+ * This file is part of Nominatim. (https://nominatim.org)
+ *
+ * Copyright (C) 2022 by the Nominatim developer community.
+ * For a full list of authors see the git log.
+ */
 
 require('Symfony/Component/Dotenv/autoload.php');
 
index b7645cd553ff9e68b69d259116f7bac63473fcf1..44e7adb2ef91e02fdefbfe7c164dc15ff274486c 100644 (file)
@@ -1,4 +1,12 @@
 <?php
+/**
+ * SPDX-License-Identifier: GPL-2.0-only
+ *
+ * This file is part of Nominatim. (https://nominatim.org)
+ *
+ * Copyright (C) 2022 by the Nominatim developer community.
+ * For a full list of authors see the git log.
+ */
 
 require_once('init.php');
 require_once('cmd.php');
index 6f3b55453f29939ed7e3c9144a4f1e090a6b086b..60367503a9bd787aa236d540163f21f6a311d58e 100644 (file)
@@ -1,4 +1,12 @@
 <?php
+/**
+ * SPDX-License-Identifier: GPL-2.0-only
+ *
+ * This file is part of Nominatim. (https://nominatim.org)
+ *
+ * Copyright (C) 2022 by the Nominatim developer community.
+ * For a full list of authors see the git log.
+ */
 
 require_once('init.php');
 require_once('ParameterParser.php');
@@ -18,7 +26,7 @@ function userError($sMsg)
 
 function exception_handler_json($exception)
 {
-    http_response_code($exception->getCode());
+    http_response_code($exception->getCode() == 0 ? 500 : $exception->getCode());
     header('Content-type: application/json; charset=utf-8');
     include(CONST_LibDir.'/template/error-json.php');
     exit();
@@ -26,7 +34,7 @@ function exception_handler_json($exception)
 
 function exception_handler_xml($exception)
 {
-    http_response_code($exception->getCode());
+    http_response_code($exception->getCode() == 0 ? 500 : $exception->getCode());
     header('Content-type: text/xml; charset=utf-8');
     echo '<?xml version="1.0" encoding="UTF-8" ?>'."\n";
     include(CONST_LibDir.'/template/error-xml.php');
index cc50aaf340102854c3090297d9dc4c37e51ea79a..9e71a761d6a155559056181e653fad567b0b2f02 100644 (file)
@@ -1,4 +1,12 @@
 <?php
+/**
+ * SPDX-License-Identifier: GPL-2.0-only
+ *
+ * This file is part of Nominatim. (https://nominatim.org)
+ *
+ * Copyright (C) 2022 by the Nominatim developer community.
+ * For a full list of authors see the git log.
+ */
 
 require_once(CONST_LibDir.'/lib.php');
 require_once(CONST_LibDir.'/DB.php');
index d95ad4eef7b274bdb420378f840991f5857752c9..f7c6e55e3c115ef7e1b3daf2fb694bb168d4a5fa 100644 (file)
@@ -1,9 +1,17 @@
 <?php
+/**
+ * SPDX-License-Identifier: GPL-2.0-only
+ *
+ * This file is part of Nominatim. (https://nominatim.org)
+ *
+ * Copyright (C) 2022 by the Nominatim developer community.
+ * For a full list of authors see the git log.
+ */
 
 function loadSettings($sProjectDir)
 {
     @define('CONST_InstallDir', $sProjectDir);
-    // Temporary hack to set the direcory via environment instead of
+    // Temporary hack to set the directory via environment instead of
     // the installed scripts. Neither setting is part of the official
     // set of settings.
     defined('CONST_ConfigDir') or define('CONST_ConfigDir', $_SERVER['NOMINATIM_CONFIGDIR']);
@@ -198,24 +206,34 @@ function parseLatLon($sQuery)
     return array($sFound, $fQueryLat, $fQueryLon);
 }
 
-function closestHouseNumber($aRow)
+function addressRankToGeocodeJsonType($iAddressRank)
 {
-    $fHouse = $aRow['startnumber']
-                + ($aRow['endnumber'] - $aRow['startnumber']) * $aRow['fraction'];
-
-    switch ($aRow['interpolationtype']) {
-        case 'odd':
-            $iHn = (int)($fHouse/2) * 2 + 1;
-            break;
-        case 'even':
-            $iHn = (int)(round($fHouse/2)) * 2;
-            break;
-        default:
-            $iHn = (int)(round($fHouse));
-            break;
-    }
-
-    return max(min($aRow['endnumber'], $iHn), $aRow['startnumber']);
+    if ($iAddressRank >= 29 && $iAddressRank <= 30) {
+        return 'house';
+    }
+    if ($iAddressRank >= 26 && $iAddressRank < 28) {
+        return 'street';
+    }
+    if ($iAddressRank >= 22 && $iAddressRank < 26) {
+        return 'locality';
+    }
+    if ($iAddressRank >= 17 && $iAddressRank < 22) {
+        return 'district';
+    }
+    if ($iAddressRank >= 13 && $iAddressRank < 17) {
+        return 'city';
+    }
+    if ($iAddressRank >= 10 && $iAddressRank < 13) {
+        return 'county';
+    }
+    if ($iAddressRank >= 5 && $iAddressRank < 10) {
+        return 'state';
+    }
+    if ($iAddressRank >= 4 && $iAddressRank < 5) {
+        return 'country';
+    }
+
+    return 'locality';
 }
 
 if (!function_exists('array_key_last')) {
index d7e1493263a4ec9f475b81125156a74540cf28f9..1d567733938d5afdbf783442c75ac9c5ccf5cf08 100644 (file)
@@ -1,4 +1,12 @@
 <?php
+/**
+ * SPDX-License-Identifier: GPL-2.0-only
+ *
+ * This file is part of Nominatim. (https://nominatim.org)
+ *
+ * Copyright (C) 2022 by the Nominatim developer community.
+ * For a full list of authors see the git log.
+ */
 
 
 function logStart(&$oDB, $sType = '', $sQuery = '', $aLanguageList = array())
@@ -70,7 +78,7 @@ function logEnd(&$oDB, $hLog, $iNumResults)
 
     if (CONST_Log_DB) {
         $aEndTime = explode('.', $fEndTime);
-        if (!$aEndTime[1]) {
+        if (!isset($aEndTime[1])) {
             $aEndTime[1] = '0';
         }
         $sEndTime = date('Y-m-d H:i:s', $aEndTime[0]).'.'.$aEndTime[1];
index ee1db44ccfbe33d71d83d2af0cb8b47a26477efa..44c4dde853d8a7a5fb6e97ee0190b9a5a9fda2cb 100644 (file)
@@ -1,4 +1,12 @@
 <?php
+/**
+ * SPDX-License-Identifier: GPL-2.0-only
+ *
+ * This file is part of Nominatim. (https://nominatim.org)
+ *
+ * Copyright (C) 2022 by the Nominatim developer community.
+ * For a full list of authors see the git log.
+ */
 
 
 function formatOSMType($sType, $bIncludeExternal = true)
index 179b0159a85b43cb2c58c72145b9f124185fa54e..400834dd28b8e27e6f0f57b60b7588ed1539800c 100755 (executable)
@@ -1,4 +1,12 @@
 <?php
+/**
+ * SPDX-License-Identifier: GPL-2.0-only
+ *
+ * This file is part of Nominatim. (https://nominatim.org)
+ *
+ * Copyright (C) 2022 by the Nominatim developer community.
+ * For a full list of authors see the git log.
+ */
 
 function getOsm2pgsqlBinary()
 {
index 927f3861778b40c56947927d705a82f9f5527210..d54aef4005b26f843d890641f68e74aac5774bd7 100644 (file)
@@ -1,4 +1,12 @@
 <?php
+/**
+ * SPDX-License-Identifier: GPL-2.0-only
+ *
+ * This file is part of Nominatim. (https://nominatim.org)
+ *
+ * Copyright (C) 2022 by the Nominatim developer community.
+ * For a full list of authors see the git log.
+ */
 
 // https://github.com/geocoders/geocodejson-spec/
 
@@ -28,7 +36,7 @@ if (empty($aPlace)) {
         $aFilteredPlaces['properties']['geocoding']['osm_id'] = $aPlace['osm_id'];
     }
 
-    $aFilteredPlaces['properties']['geocoding']['type'] = $aPlace['type'];
+    $aFilteredPlaces['properties']['geocoding']['type'] = addressRankToGeocodeJsonType($aPlace['rank_address']);
 
     $aFilteredPlaces['properties']['geocoding']['accuracy'] = (int) $fDistance;
 
@@ -48,7 +56,7 @@ if (empty($aPlace)) {
     }
 
     if (isset($aPlace['asgeojson'])) {
-        $aFilteredPlaces['geometry'] = json_decode($aPlace['asgeojson']);
+        $aFilteredPlaces['geometry'] = json_decode($aPlace['asgeojson'], true);
     } else {
         $aFilteredPlaces['geometry'] = array(
                                         'type' => 'Point',
index 0dd96f212727963598f3a7d36e1bf567b194bac2..dc3c3832af7ce09fc32be88df4d5ab9d02256d4b 100644 (file)
@@ -1,4 +1,12 @@
 <?php
+/**
+ * SPDX-License-Identifier: GPL-2.0-only
+ *
+ * This file is part of Nominatim. (https://nominatim.org)
+ *
+ * Copyright (C) 2022 by the Nominatim developer community.
+ * For a full list of authors see the git log.
+ */
 
 $aFilteredPlaces = array();
 
@@ -57,7 +65,7 @@ if (empty($aPlace)) {
     }
 
     if (isset($aPlace['asgeojson'])) {
-        $aFilteredPlaces['geometry'] = json_decode($aPlace['asgeojson']);
+        $aFilteredPlaces['geometry'] = json_decode($aPlace['asgeojson'], true);
     } else {
         $aFilteredPlaces['geometry'] = array(
                                         'type' => 'Point',
index 513d312e36435fe9d95ed46c5b7ab36af12db247..0766eaf4a992a643501dfa7dde2f3ea5ca1bacb0 100644 (file)
@@ -1,4 +1,12 @@
 <?php
+/**
+ * SPDX-License-Identifier: GPL-2.0-only
+ *
+ * This file is part of Nominatim. (https://nominatim.org)
+ *
+ * Copyright (C) 2022 by the Nominatim developer community.
+ * For a full list of authors see the git log.
+ */
 
 $aFilteredPlaces = array();
 
@@ -55,7 +63,7 @@ if (empty($aPlace)) {
     }
 
     if (isset($aPlace['asgeojson'])) {
-        $aFilteredPlaces['geojson'] = json_decode($aPlace['asgeojson']);
+        $aFilteredPlaces['geojson'] = json_decode($aPlace['asgeojson'], true);
     }
 
     if (isset($aPlace['assvg'])) {
index cf045ab9b825c5a5bff35eaeb2ce597e46ca4b4e..c418a4c496c0e886128e86513cab6823f04f53ae 100644 (file)
@@ -1,4 +1,12 @@
 <?php
+/**
+ * SPDX-License-Identifier: GPL-2.0-only
+ *
+ * This file is part of Nominatim. (https://nominatim.org)
+ *
+ * Copyright (C) 2022 by the Nominatim developer community.
+ * For a full list of authors see the git log.
+ */
 header('content-type: text/xml; charset=UTF-8');
 
 echo '<';
index 4edddca30f7f5c3897c3fbb17eaf1b14cecb08bd..ae80a85b262a205b108c5d58526a920213200b61 100644 (file)
@@ -1,4 +1,12 @@
 <?php
+/**
+ * SPDX-License-Identifier: GPL-2.0-only
+ *
+ * This file is part of Nominatim. (https://nominatim.org)
+ *
+ * Copyright (C) 2022 by the Nominatim developer community.
+ * For a full list of authors see the git log.
+ */
 
 $aPlaceDetails = array();
 
@@ -40,7 +48,7 @@ $aPlaceDetails['centroid'] = array(
                               'coordinates' => array( (float) $aPointDetails['lon'], (float) $aPointDetails['lat'] )
                              );
 
-$aPlaceDetails['geometry'] = json_decode($aPointDetails['asgeojson']);
+$aPlaceDetails['geometry'] = json_decode($aPointDetails['asgeojson'], true);
 
 $funcMapAddressLine = function ($aFull) {
     return array(
index 73717ff35ac4a8e94c5616f2f7ee80e0e89409a0..fea7d5c52b772f7643c043a37f661a93a2c9a51e 100644 (file)
@@ -1,4 +1,12 @@
 <?php
+/**
+ * SPDX-License-Identifier: GPL-2.0-only
+ *
+ * This file is part of Nominatim. (https://nominatim.org)
+ *
+ * Copyright (C) 2022 by the Nominatim developer community.
+ * For a full list of authors see the git log.
+ */
     $error = array(
               'code' => $exception->getCode(),
               'message' => $exception->getMessage()
index cc017564718e3efafd9c0d212fc6f340f2dc7052..430237a294a5d33782323fab3d789f5932730436 100644 (file)
@@ -1,4 +1,12 @@
 <?php
+/**
+ * SPDX-License-Identifier: GPL-2.0-only
+ *
+ * This file is part of Nominatim. (https://nominatim.org)
+ *
+ * Copyright (C) 2022 by the Nominatim developer community.
+ * For a full list of authors see the git log.
+ */
 
 $aOutput = array();
 $aOutput['licence'] = 'Data © OpenStreetMap contributors, ODbL 1.0. https://osm.org/copyright';
@@ -52,7 +60,7 @@ foreach ($aBatchResults as $aSearchResults) {
         }
 
         if (isset($aPointDetails['asgeojson'])) {
-            $aPlace['geojson'] = json_decode($aPointDetails['asgeojson']);
+            $aPlace['geojson'] = json_decode($aPointDetails['asgeojson'], true);
         }
 
         if (isset($aPointDetails['assvg'])) {
index 336731a2de6b1ff836ae44222a428c1980aea7c5..bba41a0d2210532c30afe3f7c0e34ddde0b4df68 100644 (file)
@@ -1,4 +1,12 @@
 <?php
+/**
+ * SPDX-License-Identifier: GPL-2.0-only
+ *
+ * This file is part of Nominatim. (https://nominatim.org)
+ *
+ * Copyright (C) 2022 by the Nominatim developer community.
+ * For a full list of authors see the git log.
+ */
 
 $aFilteredPlaces = array();
 foreach ($aSearchResults as $iResNum => $aPointDetails) {
@@ -17,8 +25,10 @@ foreach ($aSearchResults as $iResNum => $aPointDetails) {
         $aPlace['properties']['geocoding']['osm_type'] = $sOSMType;
         $aPlace['properties']['geocoding']['osm_id'] = $aPointDetails['osm_id'];
     }
+    $aPlace['properties']['geocoding']['osm_key'] = $aPointDetails['class'];
+    $aPlace['properties']['geocoding']['osm_value'] = $aPointDetails['type'];
 
-    $aPlace['properties']['geocoding']['type'] = $aPointDetails['type'];
+    $aPlace['properties']['geocoding']['type'] = addressRankToGeocodeJsonType($aPointDetails['rank_address']);
 
     $aPlace['properties']['geocoding']['label'] = $aPointDetails['langaddress'];
 
@@ -36,7 +46,7 @@ foreach ($aSearchResults as $iResNum => $aPointDetails) {
     }
 
     if (isset($aPointDetails['asgeojson'])) {
-        $aPlace['geometry'] = json_decode($aPointDetails['asgeojson']);
+        $aPlace['geometry'] = json_decode($aPointDetails['asgeojson'], true);
     } else {
         $aPlace['geometry'] = array(
                                'type' => 'Point',
index c0ca625cfe3a5b4afb79874c437eb55ee33a9cc5..7665700dff47b08995f517432a74de506521fdfc 100644 (file)
@@ -1,4 +1,12 @@
 <?php
+/**
+ * SPDX-License-Identifier: GPL-2.0-only
+ *
+ * This file is part of Nominatim. (https://nominatim.org)
+ *
+ * Copyright (C) 2022 by the Nominatim developer community.
+ * For a full list of authors see the git log.
+ */
 
 $aFilteredPlaces = array();
 foreach ($aSearchResults as $iResNum => $aPointDetails) {
@@ -46,7 +54,7 @@ foreach ($aSearchResults as $iResNum => $aPointDetails) {
     }
 
     if (isset($aPointDetails['asgeojson'])) {
-        $aPlace['geometry'] = json_decode($aPointDetails['asgeojson']);
+        $aPlace['geometry'] = json_decode($aPointDetails['asgeojson'], true);
     } else {
         $aPlace['geometry'] = array(
                                'type' => 'Point',
index 6f729c2982119bb8e468b2377f025cd720a890d5..5fb1302080ac4ced5cebb5523a1257755b04ccbe 100644 (file)
@@ -1,4 +1,12 @@
 <?php
+/**
+ * SPDX-License-Identifier: GPL-2.0-only
+ *
+ * This file is part of Nominatim. (https://nominatim.org)
+ *
+ * Copyright (C) 2022 by the Nominatim developer community.
+ * For a full list of authors see the git log.
+ */
 
 $aFilteredPlaces = array();
 foreach ($aSearchResults as $iResNum => $aPointDetails) {
@@ -45,7 +53,7 @@ foreach ($aSearchResults as $iResNum => $aPointDetails) {
     }
 
     if (isset($aPointDetails['asgeojson'])) {
-        $aPlace['geojson'] = json_decode($aPointDetails['asgeojson']);
+        $aPlace['geojson'] = json_decode($aPointDetails['asgeojson'], true);
     }
 
     if (isset($aPointDetails['assvg'])) {
index 59b352ca2ea0bbd5f5ef75bee014504cc7e6a824..8dda65e2a1bb9646868f2252b8916e71ef64afe1 100644 (file)
@@ -1,4 +1,12 @@
 <?php
+/**
+ * SPDX-License-Identifier: GPL-2.0-only
+ *
+ * This file is part of Nominatim. (https://nominatim.org)
+ *
+ * Copyright (C) 2022 by the Nominatim developer community.
+ * For a full list of authors see the git log.
+ */
 header('content-type: text/xml; charset=UTF-8');
 
 echo '<';
index f4dd3aebd4db2a4e853df13037e75ecb64b3f47a..e45d07654843b9c1c6127f40f3d064441ea4bc79 100644 (file)
@@ -1,4 +1,12 @@
 <?php
+/**
+ * SPDX-License-Identifier: GPL-2.0-only
+ *
+ * This file is part of Nominatim. (https://nominatim.org)
+ *
+ * Copyright (C) 2022 by the Nominatim developer community.
+ * For a full list of authors see the git log.
+ */
 
 namespace Nominatim;
 
@@ -149,7 +157,8 @@ class Tokenizer
         $sSQL = 'SELECT word_id, word_token, type, word,';
         $sSQL .= "      info->>'op' as operator,";
         $sSQL .= "      info->>'class' as class, info->>'type' as ctype,";
-        $sSQL .= "      info->>'count' as count";
+        $sSQL .= "      info->>'count' as count,";
+        $sSQL .= "      info->>'lookup' as lookup";
         $sSQL .= ' FROM word WHERE word_token in (';
         $sSQL .= join(',', $this->oDB->getDBQuotedList($aTokens)).')';
 
@@ -171,7 +180,8 @@ class Tokenizer
                     }
                     break;
                 case 'H':  // house number tokens
-                    $oValidTokens->addToken($sTok, new Token\HouseNumber($iId, $aWord['word_token']));
+                    $sLookup = $aWord['lookup'] ?? $aWord['word_token'];
+                    $oValidTokens->addToken($sTok, new Token\HouseNumber($iId, $sLookup));
                     break;
                 case 'P':  // postcode tokens
                     // Postcodes are not normalized, so they may have content
@@ -180,13 +190,17 @@ class Tokenizer
                     if ($aWord['word'] !== null
                         && pg_escape_string($aWord['word']) == $aWord['word']
                     ) {
-                        $sNormPostcode = $this->normalizeString($aWord['word']);
-                        if (strpos($sNormQuery, $sNormPostcode) !== false) {
-                            $oValidTokens->addToken(
-                                $sTok,
-                                new Token\Postcode($iId, $aWord['word'], null)
-                            );
+                        $iSplitPos = strpos($aWord['word'], '@');
+                        if ($iSplitPos === false) {
+                            $sPostcode = $aWord['word'];
+                        } else {
+                            $sPostcode = substr($aWord['word'], 0, $iSplitPos);
                         }
+
+                        $oValidTokens->addToken(
+                            $sTok,
+                            new Token\Postcode($iId, $sPostcode, null)
+                        );
                     }
                     break;
                 case 'S':  // tokens for classification terms (special phrases)
index d5686f6464eaddf0c4a8aa8cd2f6bc0024d4b887..6f3d23043f47071c4995c76545cba98073b6de7b 100644 (file)
@@ -1,4 +1,12 @@
 <?php
+/**
+ * SPDX-License-Identifier: GPL-2.0-only
+ *
+ * This file is part of Nominatim. (https://nominatim.org)
+ *
+ * Copyright (C) 2022 by the Nominatim developer community.
+ * For a full list of authors see the git log.
+ */
 
 namespace Nominatim;
 
index 81fb4f99d35eeefb13ef16bd19f25708f1de0ad3..ffb202fd4248b65c36a0a7184a57a41e73231a40 100644 (file)
@@ -1,4 +1,12 @@
 <?php
+/**
+ * SPDX-License-Identifier: GPL-2.0-only
+ *
+ * This file is part of Nominatim. (https://nominatim.org)
+ *
+ * Copyright (C) 2022 by the Nominatim developer community.
+ * For a full list of authors see the git log.
+ */
 
 require_once(CONST_LibDir.'/init-website.php');
 require_once(CONST_LibDir.'/log.php');
index 0d67ec83d7a18bb9cb3906f7981b8cd26f614612..99307bbd9fb229a09e01b278872839f6b7512198 100644 (file)
@@ -1,4 +1,12 @@
 <?php
+/**
+ * SPDX-License-Identifier: GPL-2.0-only
+ *
+ * This file is part of Nominatim. (https://nominatim.org)
+ *
+ * Copyright (C) 2022 by the Nominatim developer community.
+ * For a full list of authors see the git log.
+ */
 
 require_once(CONST_LibDir.'/init-website.php');
 require_once(CONST_LibDir.'/log.php');
@@ -198,7 +206,7 @@ if ($bIncludeLinkedPlaces) {
     $aLinkedLines = $oDB->getAll($sSQL);
 }
 
-// All places this is an imediate parent of
+// All places this is an immediate parent of
 $aHierarchyLines = false;
 if ($bIncludeHierarchy) {
     $sSQL = 'SELECT obj.place_id, osm_type, osm_id, class, type, housenumber,';
index eb3705fc9401e81e5c43ded80c67da0298c49e4a..3a7ddb85377b0f9e6fdf398aad8334408cd00550 100644 (file)
@@ -1,4 +1,12 @@
 <?php
+/**
+ * SPDX-License-Identifier: GPL-2.0-only
+ *
+ * This file is part of Nominatim. (https://nominatim.org)
+ *
+ * Copyright (C) 2022 by the Nominatim developer community.
+ * For a full list of authors see the git log.
+ */
 
 require_once(CONST_LibDir.'/init-website.php');
 require_once(CONST_LibDir.'/log.php');
index c1382dbff49b5c687375848690bf053ec761ffcb..5a90abe5990fe55e7f4e94959801e76a2a76bdc5 100644 (file)
@@ -1,4 +1,12 @@
 <?php
+/**
+ * SPDX-License-Identifier: GPL-2.0-only
+ *
+ * This file is part of Nominatim. (https://nominatim.org)
+ *
+ * Copyright (C) 2022 by the Nominatim developer community.
+ * For a full list of authors see the git log.
+ */
 
 require_once(CONST_LibDir.'/init-website.php');
 require_once(CONST_LibDir.'/log.php');
index 719f10013a17f6bc904626e1a8227bcbe318164b..43cbd265f8a169135820a315bffe1fa9c431235b 100644 (file)
@@ -1,4 +1,12 @@
 <?php
+/**
+ * SPDX-License-Identifier: GPL-2.0-only
+ *
+ * This file is part of Nominatim. (https://nominatim.org)
+ *
+ * Copyright (C) 2022 by the Nominatim developer community.
+ * For a full list of authors see the git log.
+ */
 
 require_once(CONST_LibDir.'/init-website.php');
 require_once(CONST_LibDir.'/ParameterParser.php');
index 553c2692381a2161505388ab103ccc0d74f5d79c..f24c655a4088ff93ad65ad2e5726991a6f8760cf 100644 (file)
@@ -1,4 +1,12 @@
 <?php
+/**
+ * SPDX-License-Identifier: GPL-2.0-only
+ *
+ * This file is part of Nominatim. (https://nominatim.org)
+ *
+ * Copyright (C) 2022 by the Nominatim developer community.
+ * For a full list of authors see the git log.
+ */
 
 require_once(CONST_LibDir.'/init-website.php');
 require_once(CONST_LibDir.'/log.php');
index b3a0fe83a32c5c89ca1e354abe4411d8260199d2..e8f239839835164fd98b6a54f67df0d4f13ab3f8 100644 (file)
@@ -1,4 +1,12 @@
 <?php
+/**
+ * SPDX-License-Identifier: GPL-2.0-only
+ *
+ * This file is part of Nominatim. (https://nominatim.org)
+ *
+ * Copyright (C) 2022 by the Nominatim developer community.
+ * For a full list of authors see the git log.
+ */
 
 require_once(CONST_LibDir.'/init-website.php');
 require_once(CONST_LibDir.'/log.php');
index 03e56f655439aa6b13aeb132b92dcb247de190a6..2839f72a6c1dcfc68156376098855330866559c3 100644 (file)
@@ -1,4 +1,12 @@
 <?php
+/**
+ * SPDX-License-Identifier: GPL-2.0-only
+ *
+ * This file is part of Nominatim. (https://nominatim.org)
+ *
+ * Copyright (C) 2022 by the Nominatim developer community.
+ * For a full list of authors see the git log.
+ */
 
 require_once(CONST_LibDir.'/init-website.php');
 require_once(CONST_LibDir.'/ParameterParser.php');
index e9419ca2ea92947a2a3f5fe34379092022a8dc51..158969d95e124878884d05c72a3b491fb3a7606c 100644 (file)
@@ -1,3 +1,10 @@
+-- SPDX-License-Identifier: GPL-2.0-only
+--
+-- This file is part of Nominatim. (https://nominatim.org)
+--
+-- Copyright (C) 2022 by the Nominatim developer community.
+-- For a full list of authors see the git log.
+
 {% include('functions/utils.sql') %}
 {% include('functions/ranking.sql') %}
 {% include('functions/importance.sql') %}
index b6adfdc37253703f4896204d085946be683f5745..2bbfcd5c03c6296ff06191a00571c7b11f5da25a 100644 (file)
@@ -1,3 +1,10 @@
+-- SPDX-License-Identifier: GPL-2.0-only
+--
+-- This file is part of Nominatim. (https://nominatim.org)
+--
+-- Copyright (C) 2022 by the Nominatim developer community.
+-- For a full list of authors see the git log.
+
 -- Functions for returning address information for a place.
 
 DROP TYPE IF EXISTS addressline CASCADE;
@@ -36,8 +43,8 @@ BEGIN
     END IF;
   END LOOP;
 
-  -- anything will do as a fallback - just take the first name type thing there is
-  RETURN trim((avals(name))[1]);
+  -- as a fallback - take the last element since it is the default name
+  RETURN trim((avals(name))[array_length(avals(name), 1)]);
 END;
 $$
 LANGUAGE plpgsql IMMUTABLE;
@@ -101,6 +108,7 @@ CREATE OR REPLACE FUNCTION get_addressdata(in_place_id BIGINT, in_housenumber IN
 DECLARE
   place addressdata_place;
   location RECORD;
+  country RECORD;
   current_rank_address INTEGER;
   location_isaddress BOOLEAN;
 BEGIN
@@ -191,6 +199,16 @@ BEGIN
       WHERE place_id = place.place_id
   LOOP
 --RAISE WARNING '%',location;
+    -- mix in default names for countries
+    IF location.rank_address = 4 and place.country_code is not NULL THEN
+      FOR country IN
+        SELECT coalesce(name, ''::hstore) as name FROM country_name
+          WHERE country_code = place.country_code LIMIT 1
+      LOOP
+        place.name := country.name || place.name;
+      END LOOP;
+    END IF;
+
     IF location.rank_address < 4 THEN
       -- no country locations for ranks higher than country
       place.country_code := NULL::varchar(2);
@@ -265,7 +283,8 @@ BEGIN
   -- If no country was included yet, add the name information from country_name.
   IF current_rank_address > 4 THEN
     FOR location IN
-      SELECT name FROM country_name WHERE country_code = place.country_code LIMIT 1
+      SELECT name || coalesce(derived_name, ''::hstore) as name FROM country_name
+        WHERE country_code = place.country_code LIMIT 1
     LOOP
 --RAISE WARNING '% % %',current_rank_address,searchcountrycode,countryname;
       RETURN NEXT ROW(null, null, null, location.name, 'place', 'country', NULL,
@@ -301,6 +320,11 @@ BEGIN
     location := ROW(null, null, null, hstore('ref', place.postcode), 'place',
                     'postcode', null, null, false, true, 5, 0)::addressline;
     RETURN NEXT location;
+  ELSEIF place.address is not null and place.address ? 'postcode'
+         and not place.address->'postcode' SIMILAR TO '%(,|;)%' THEN
+    location := ROW(null, null, null, hstore('ref', place.address->'postcode'), 'place',
+                    'postcode', null, null, false, true, 5, 0)::addressline;
+    RETURN NEXT location;
   END IF;
 
   RETURN;
index 0837f80f097f8d599cc86755e851daf208eb6bdb..ac3aa7f856cbae355f7111fdd12490a003e99a57 100644 (file)
@@ -1,3 +1,10 @@
+-- SPDX-License-Identifier: GPL-2.0-only
+--
+-- This file is part of Nominatim. (https://nominatim.org)
+--
+-- Copyright (C) 2022 by the Nominatim developer community.
+-- For a full list of authors see the git log.
+
 -- Functions for interpreting wkipedia/wikidata tags and computing importance.
 
 DROP TYPE IF EXISTS wikipedia_article_match CASCADE;
index 4ef36f4f635e50b821eb0105b803f67302f9570e..3a99471101d0c9140967934812494bbed48135ed 100644 (file)
@@ -1,15 +1,11 @@
--- Functions for address interpolation objects in location_property_osmline.
+-- SPDX-License-Identifier: GPL-2.0-only
+--
+-- This file is part of Nominatim. (https://nominatim.org)
+--
+-- Copyright (C) 2022 by the Nominatim developer community.
+-- For a full list of authors see the git log.
 
--- Splits the line at the given point and returns the two parts
--- in a multilinestring.
-CREATE OR REPLACE FUNCTION split_line_on_node(line GEOMETRY, point GEOMETRY)
-RETURNS GEOMETRY
-  AS $$
-BEGIN
-  RETURN ST_Split(ST_Snap(line, point, 0.0005), point);
-END;
-$$
-LANGUAGE plpgsql IMMUTABLE;
+-- Functions for address interpolation objects in location_property_osmline.
 
 
 CREATE OR REPLACE FUNCTION get_interpolation_address(in_address HSTORE, wayid BIGINT)
@@ -57,9 +53,13 @@ BEGIN
   IF parent_place_id is null THEN
     FOR location IN SELECT place_id FROM placex
         WHERE ST_DWithin(geom, placex.geometry, 0.001) and placex.rank_search = 26
-        ORDER BY (ST_distance(placex.geometry, ST_LineInterpolatePoint(geom,0))+
+        ORDER BY CASE WHEN ST_GeometryType(geom) = 'ST_Line' THEN
+                  (ST_distance(placex.geometry, ST_LineInterpolatePoint(geom,0))+
                   ST_distance(placex.geometry, ST_LineInterpolatePoint(geom,0.5))+
-                  ST_distance(placex.geometry, ST_LineInterpolatePoint(geom,1))) ASC limit 1
+                  ST_distance(placex.geometry, ST_LineInterpolatePoint(geom,1)))
+                 ELSE ST_distance(placex.geometry, geom) END
+              ASC
+        LIMIT 1
     LOOP
       parent_place_id := location.place_id;
     END LOOP;
@@ -75,24 +75,38 @@ $$
 LANGUAGE plpgsql STABLE;
 
 
-CREATE OR REPLACE FUNCTION osmline_reinsert(node_id BIGINT, geom GEOMETRY)
-  RETURNS BOOLEAN
+CREATE OR REPLACE FUNCTION reinsert_interpolation(way_id BIGINT, addr HSTORE,
+                                                  geom GEOMETRY)
+  RETURNS INT
   AS $$
 DECLARE
-  existingline RECORD;
+  existing BIGINT[];
 BEGIN
-   SELECT w.id FROM planet_osm_ways w, location_property_osmline p
-     WHERE p.linegeo && geom and p.osm_id = w.id and p.indexed_status = 0
-           and node_id = any(w.nodes) INTO existingline;
-
-   IF existingline.id is not NULL THEN
-       DELETE FROM location_property_osmline WHERE osm_id = existingline.id;
-       INSERT INTO location_property_osmline (osm_id, address, linegeo)
-         SELECT osm_id, address, geometry FROM place
-           WHERE osm_type = 'W' and osm_id = existingline.id;
-   END IF;
-
-   RETURN true;
+  -- Get the existing entry from the interpolation table.
+  SELECT array_agg(place_id) INTO existing
+    FROM location_property_osmline WHERE osm_id = way_id;
+
+  IF existing IS NULL or array_length(existing, 1) = 0 THEN
+    INSERT INTO location_property_osmline (osm_id, address, linegeo)
+      VALUES (way_id, addr, geom);
+  ELSE
+    -- Update the interpolation table:
+    --   The first entry gets the original data, all other entries
+    --   are removed and will be recreated on indexing.
+    --   (An interpolation can be split up, if it has more than 2 address nodes)
+    UPDATE location_property_osmline
+      SET address = addr,
+          linegeo = geom,
+          startnumber = null,
+          indexed_status = 1
+      WHERE place_id = existing[1];
+    IF array_length(existing, 1) > 1 THEN
+      DELETE FROM location_property_osmline
+        WHERE place_id = any(existing[2:]);
+    END IF;
+  END IF;
+
+  RETURN 1;
 END;
 $$
 LANGUAGE plpgsql;
@@ -107,8 +121,10 @@ BEGIN
 
   IF NEW.indexed_status IS NULL THEN
       IF NEW.address is NULL OR NOT NEW.address ? 'interpolation'
-         OR NEW.address->'interpolation' NOT IN ('odd', 'even', 'all') THEN
-          -- other interpolation types than odd/even/all (e.g. numeric ones) are not supported
+         OR NOT (NEW.address->'interpolation' in ('odd', 'even', 'all')
+                 or NEW.address->'interpolation' similar to '[1-9]')
+      THEN
+          -- alphabetic interpolation is not supported
           RETURN NULL;
       END IF;
 
@@ -129,18 +145,19 @@ CREATE OR REPLACE FUNCTION osmline_update()
   RETURNS TRIGGER
   AS $$
 DECLARE
-  place_centroid GEOMETRY;
   waynodes BIGINT[];
   prevnode RECORD;
   nextnode RECORD;
   startnumber INTEGER;
   endnumber INTEGER;
-  housenum INTEGER;
+  newstart INTEGER;
+  newend INTEGER;
+  moddiff SMALLINT;
   linegeo GEOMETRY;
   splitline GEOMETRY;
   sectiongeo GEOMETRY;
-  interpol_postcode TEXT;
   postcode TEXT;
+  stepmod SMALLINT;
 BEGIN
   -- deferred delete
   IF OLD.indexed_status = 100 THEN
@@ -152,107 +169,139 @@ BEGIN
     RETURN NEW;
   END IF;
 
-  NEW.interpolationtype = NEW.address->'interpolation';
-
-  place_centroid := ST_PointOnSurface(NEW.linegeo);
-  NEW.parent_place_id = get_interpolation_parent(NEW.token_info, NEW.partition,
-                                                 place_centroid, NEW.linegeo);
-
-  interpol_postcode := token_normalized_postcode(NEW.address->'postcode');
+  NEW.parent_place_id := get_interpolation_parent(NEW.token_info, NEW.partition,
+                                                 ST_PointOnSurface(NEW.linegeo),
+                                                 NEW.linegeo);
 
   NEW.token_info := token_strip_info(NEW.token_info);
   IF NEW.address ? '_inherited' THEN
-    NEW.address := hstore('interpolation', NEW.interpolationtype);
+    NEW.address := hstore('interpolation', NEW.address->'interpolation');
   END IF;
 
-  -- if the line was newly inserted, split the line as necessary
+  -- If the line was newly inserted, split the line as necessary.
   IF OLD.indexed_status = 1 THEN
-      select nodes from planet_osm_ways where id = NEW.osm_id INTO waynodes;
-
-      IF array_upper(waynodes, 1) IS NULL THEN
-        RETURN NEW;
+    IF NEW.address->'interpolation' in ('odd', 'even') THEN
+      NEW.step := 2;
+      stepmod := CASE WHEN NEW.address->'interpolation' = 'odd' THEN 1 ELSE 0 END;
+    ELSE
+      NEW.step := CASE WHEN NEW.address->'interpolation' = 'all'
+                       THEN 1
+                       ELSE (NEW.address->'interpolation')::SMALLINT END;
+      stepmod := NULL;
+    END IF;
+
+    SELECT nodes INTO waynodes
+      FROM planet_osm_ways WHERE id = NEW.osm_id;
+
+    IF array_upper(waynodes, 1) IS NULL THEN
+      RETURN NEW;
+    END IF;
+
+    linegeo := null;
+    SELECT null::integer as hnr INTO prevnode;
+
+    -- Go through all nodes on the interpolation line that have a housenumber.
+    FOR nextnode IN
+      SELECT DISTINCT ON (nodeidpos)
+          osm_id, address, geometry,
+          -- Take the postcode from the node only if it has a housenumber itself.
+          -- Note that there is a corner-case where the node has a wrongly
+          -- formatted postcode and therefore 'postcode' contains a derived
+          -- variant.
+          CASE WHEN address ? 'postcode' THEN placex.postcode ELSE NULL::text END as postcode,
+          substring(address->'housenumber','[0-9]+')::integer as hnr
+        FROM placex, generate_series(1, array_upper(waynodes, 1)) nodeidpos
+        WHERE osm_type = 'N' and osm_id = waynodes[nodeidpos]::BIGINT
+              and address is not NULL and address ? 'housenumber'
+        ORDER BY nodeidpos
+    LOOP
+      {% if debug %}RAISE WARNING 'processing point % (%)', nextnode.hnr, ST_AsText(nextnode.geometry);{% endif %}
+      IF linegeo is null THEN
+        linegeo := NEW.linegeo;
+      ELSE
+        splitline := ST_Split(ST_Snap(linegeo, nextnode.geometry, 0.0005), nextnode.geometry);
+        sectiongeo := ST_GeometryN(splitline, 1);
+        linegeo := ST_GeometryN(splitline, 2);
       END IF;
 
-      linegeo := NEW.linegeo;
-      startnumber := NULL;
-
-      FOR nodeidpos in 1..array_upper(waynodes, 1) LOOP
-
-        select osm_id, address, geometry
-          from place where osm_type = 'N' and osm_id = waynodes[nodeidpos]::BIGINT
-                           and address is not NULL and address ? 'housenumber' limit 1 INTO nextnode;
-        --RAISE NOTICE 'Nextnode.place_id: %s', nextnode.place_id;
-        IF nextnode.osm_id IS NOT NULL THEN
-          --RAISE NOTICE 'place_id is not null';
-          IF nodeidpos > 1 and nodeidpos < array_upper(waynodes, 1) THEN
-            -- Make sure that the point is actually on the line. That might
-            -- be a bit paranoid but ensures that the algorithm still works
-            -- should osm2pgsql attempt to repair geometries.
-            splitline := split_line_on_node(linegeo, nextnode.geometry);
-            sectiongeo := ST_GeometryN(splitline, 1);
-            linegeo := ST_GeometryN(splitline, 2);
+      IF prevnode.hnr is not null
+         -- Check if there are housenumbers to interpolate between the
+         -- regularly mapped housenumbers.
+         -- (Conveniently also fails if one of the house numbers is not a number.)
+         and abs(prevnode.hnr - nextnode.hnr) > NEW.step
+      THEN
+        IF prevnode.hnr < nextnode.hnr THEN
+          startnumber := prevnode.hnr;
+          endnumber := nextnode.hnr;
+        ELSE
+          startnumber := nextnode.hnr;
+          endnumber := prevnode.hnr;
+          sectiongeo := ST_Reverse(sectiongeo);
+        END IF;
+
+        -- Adjust the interpolation, so that only inner housenumbers
+        -- are taken into account.
+        IF stepmod is null THEN
+          newstart := startnumber + NEW.step;
+        ELSE
+          newstart := startnumber + 1;
+          moddiff := newstart % NEW.step - stepmod;
+          IF moddiff < 0 THEN
+            newstart := newstart + (NEW.step + moddiff);
           ELSE
-            sectiongeo = linegeo;
-          END IF;
-          endnumber := substring(nextnode.address->'housenumber','[0-9]+')::integer;
-
-          IF startnumber IS NOT NULL AND endnumber IS NOT NULL
-             AND startnumber != endnumber
-             AND ST_GeometryType(sectiongeo) = 'ST_LineString' THEN
-
-            IF (startnumber > endnumber) THEN
-              housenum := endnumber;
-              endnumber := startnumber;
-              startnumber := housenum;
-              sectiongeo := ST_Reverse(sectiongeo);
-            END IF;
-
-            -- determine postcode
-            postcode := coalesce(interpol_postcode,
-                                 token_normalized_postcode(prevnode.address->'postcode'),
-                                 token_normalized_postcode(nextnode.address->'postcode'),
-                                 postcode);
-
-            IF postcode is NULL THEN
-                SELECT token_normalized_postcode(placex.postcode)
-                  FROM placex WHERE place_id = NEW.parent_place_id INTO postcode;
-            END IF;
-            IF postcode is NULL THEN
-                postcode := get_nearest_postcode(NEW.country_code, nextnode.geometry);
-            END IF;
-
-            IF NEW.startnumber IS NULL THEN
-                NEW.startnumber := startnumber;
-                NEW.endnumber := endnumber;
-                NEW.linegeo := sectiongeo;
-                NEW.postcode := postcode;
-             ELSE
-              insert into location_property_osmline
-                     (linegeo, partition, osm_id, parent_place_id,
-                      startnumber, endnumber, interpolationtype,
-                      address, postcode, country_code,
-                      geometry_sector, indexed_status)
-              values (sectiongeo, NEW.partition, NEW.osm_id, NEW.parent_place_id,
-                      startnumber, endnumber, NEW.interpolationtype,
-                      NEW.address, postcode,
-                      NEW.country_code, NEW.geometry_sector, 0);
-             END IF;
+            newstart := newstart + moddiff;
           END IF;
+        END IF;
+        newend := newstart + ((endnumber - 1 - newstart) / NEW.step) * NEW.step;
+
+        -- If newstart and newend are the same, then this returns a point.
+        sectiongeo := ST_LineSubstring(sectiongeo,
+                              (newstart - startnumber)::float / (endnumber - startnumber)::float,
+                              (newend - startnumber)::float / (endnumber - startnumber)::float);
+        startnumber := newstart;
+        endnumber := newend;
+
+        -- determine postcode
+        postcode := coalesce(prevnode.postcode, nextnode.postcode, postcode);
+        IF postcode is NULL and NEW.parent_place_id > 0 THEN
+            SELECT placex.postcode FROM placex
+              WHERE place_id = NEW.parent_place_id INTO postcode;
+        END IF;
+        IF postcode is NULL THEN
+            postcode := get_nearest_postcode(NEW.country_code, nextnode.geometry);
+        END IF;
 
-          -- early break if we are out of line string,
-          -- might happen when a line string loops back on itself
-          IF ST_GeometryType(linegeo) != 'ST_LineString' THEN
-              RETURN NEW;
-          END IF;
+        -- Add the interpolation. If this is the first segment, just modify
+        -- the interpolation to be inserted, otherwise add an additional one
+        -- (marking it indexed already).
+        IF NEW.startnumber IS NULL THEN
+            NEW.startnumber := startnumber;
+            NEW.endnumber := endnumber;
+            NEW.linegeo := sectiongeo;
+            NEW.postcode := postcode;
+        ELSE
+          INSERT INTO location_property_osmline
+                 (linegeo, partition, osm_id, parent_place_id,
+                  startnumber, endnumber, step,
+                  address, postcode, country_code,
+                  geometry_sector, indexed_status)
+          VALUES (sectiongeo, NEW.partition, NEW.osm_id, NEW.parent_place_id,
+                  startnumber, endnumber, NEW.step,
+                  NEW.address, postcode,
+                  NEW.country_code, NEW.geometry_sector, 0);
+        END IF;
 
-          startnumber := substring(nextnode.address->'housenumber','[0-9]+')::integer;
-          prevnode := nextnode;
+        -- early break if we are out of line string,
+        -- might happen when a line string loops back on itself
+        IF ST_GeometryType(linegeo) != 'ST_LineString' THEN
+            RETURN NEW;
         END IF;
-      END LOOP;
+      END IF;
+
+      prevnode := nextnode;
+    END LOOP;
   END IF;
 
-  -- marking descendants for reparenting is not needed, because there are
-  -- actually no descendants for interpolation lines
   RETURN NEW;
 END;
 $$
index 97afec1560f8d6f6de2ab5091aaf083eaf482ca8..20ec3da6bb6853ec38c334ec483f784320e7dc0b 100644 (file)
@@ -1,3 +1,10 @@
+-- SPDX-License-Identifier: GPL-2.0-only
+--
+-- This file is part of Nominatim. (https://nominatim.org)
+--
+-- Copyright (C) 2022 by the Nominatim developer community.
+-- For a full list of authors see the git log.
+
 DROP TYPE IF EXISTS nearfeaturecentr CASCADE;
 CREATE TYPE nearfeaturecentr AS (
   place_id BIGINT,
@@ -10,7 +17,7 @@ CREATE TYPE nearfeaturecentr AS (
   centroid GEOMETRY
 );
 
--- feature intersects geoemtry
+-- feature intersects geometry
 -- for areas and linestrings they must touch at least along a line
 CREATE OR REPLACE FUNCTION is_relevant_geometry(de9im TEXT, geom_type TEXT)
 RETURNS BOOLEAN
@@ -32,7 +39,10 @@ BEGIN
 END
 $$ LANGUAGE plpgsql IMMUTABLE;
 
-create or replace function getNearFeatures(in_partition INTEGER, feature GEOMETRY, maxrank INTEGER) RETURNS setof nearfeaturecentr AS $$
+CREATE OR REPLACE function getNearFeatures(in_partition INTEGER, feature GEOMETRY,
+                                           feature_centroid GEOMETRY,
+                                           maxrank INTEGER)
+RETURNS setof nearfeaturecentr AS $$
 DECLARE
   r nearfeaturecentr%rowtype;
 BEGIN
@@ -41,7 +51,11 @@ BEGIN
   IF in_partition = {{ partition }} THEN
     FOR r IN
       SELECT place_id, keywords, rank_address, rank_search,
-             min(ST_Distance(feature, centroid)) as distance,
+             CASE WHEN isguess THEN ST_Distance(feature, centroid)
+                  ELSE min(ST_Distance(feature_centroid, geometry))
+                       -- tie breaker when distance is the same (i.e. way is on boundary)
+                       + 0.00001 * ST_Distance(feature, centroid)
+             END as distance,
              isguess, postcode, centroid
       FROM location_area_large_{{ partition }}
       WHERE geometry && feature
@@ -82,7 +96,7 @@ BEGIN
               AND rank_address between from_rank and to_rank
               AND token_matches_address(token_info, key, keywords)
         GROUP BY place_id, keywords, rank_address, rank_search, isguess, postcode, centroid
-        ORDER BY bool_or(ST_Intersects(geometry, feature)), distance LIMIT 1;
+        ORDER BY bool_or(ST_Intersects(geometry, feature)) DESC, distance LIMIT 1;
       RETURN r;
   END IF;
 {% endfor %}
index ca16871a89fa4d4acb41fb67d9abd61ea6a2602c..9b968c3e035921995356223f2a04308e0097801b 100644 (file)
+-- SPDX-License-Identifier: GPL-2.0-only
+--
+-- This file is part of Nominatim. (https://nominatim.org)
+--
+-- Copyright (C) 2022 by the Nominatim developer community.
+-- For a full list of authors see the git log.
+
 CREATE OR REPLACE FUNCTION place_insert()
   RETURNS TRIGGER
   AS $$
 DECLARE
   i INTEGER;
+  country RECORD;
   existing RECORD;
   existingplacex RECORD;
-  existingline RECORD;
-  existinggeometry GEOMETRY;
-  existingplace_id BIGINT;
-  result BOOLEAN;
-  partition INTEGER;
+  existingline BIGINT[];
+  interpol RECORD;
 BEGIN
-
   {% if debug %}
-    RAISE WARNING '-----------------------------------------------------------------------------------';
     RAISE WARNING 'place_insert: % % % % %',NEW.osm_type,NEW.osm_id,NEW.class,NEW.type,st_area(NEW.geometry);
   {% endif %}
-  -- filter wrong tupels
-  IF ST_IsEmpty(NEW.geometry) OR NOT ST_IsValid(NEW.geometry) OR ST_X(ST_Centroid(NEW.geometry))::text in ('NaN','Infinity','-Infinity') OR ST_Y(ST_Centroid(NEW.geometry))::text in ('NaN','Infinity','-Infinity') THEN  
-    INSERT INTO import_polygon_error (osm_type, osm_id, class, type, name, country_code, updated, errormessage, prevgeometry, newgeometry)
-      VALUES (NEW.osm_type, NEW.osm_id, NEW.class, NEW.type, NEW.name, NEW.address->'country', now(), ST_IsValidReason(NEW.geometry), null, NEW.geometry);
---    RAISE WARNING 'Invalid Geometry: % % % %',NEW.osm_type,NEW.osm_id,NEW.class,NEW.type;
+
+  -- Filter tuples with bad geometries.
+  IF ST_IsEmpty(NEW.geometry) OR NOT ST_IsValid(NEW.geometry) THEN
+    INSERT INTO import_polygon_error (osm_type, osm_id, class, type, name,
+                                      country_code, updated, errormessage,
+                                      prevgeometry, newgeometry)
+      VALUES (NEW.osm_type, NEW.osm_id, NEW.class, NEW.type, NEW.name,
+              NEW.address->'country', now(), ST_IsValidReason(NEW.geometry),
+              null, NEW.geometry);
+    {% if debug %}
+      RAISE WARNING 'Invalid Geometry: % % % %',NEW.osm_type,NEW.osm_id,NEW.class,NEW.type;
+    {% endif %}
     RETURN null;
   END IF;
 
-  -- decide, whether it is an osm interpolation line => insert intoosmline, or else just placex
-  IF NEW.class='place' and NEW.type='houses' and NEW.osm_type='W' and ST_GeometryType(NEW.geometry) = 'ST_LineString' THEN
-    -- Have we already done this place?
-    select * from place where osm_type = NEW.osm_type and osm_id = NEW.osm_id and class = NEW.class and type = NEW.type INTO existing;
-
-    -- Get the existing place_id
-    select * from location_property_osmline where osm_id = NEW.osm_id INTO existingline;
-
-    -- Handle a place changing type by removing the old data (this trigger is executed BEFORE INSERT of the NEW tupel)
-    IF existing.osm_type IS NULL THEN
-      DELETE FROM place where osm_type = NEW.osm_type and osm_id = NEW.osm_id and class = NEW.class;
-    END IF;
-
-    DELETE from import_polygon_error where osm_type = NEW.osm_type and osm_id = NEW.osm_id;
-    DELETE from import_polygon_delete where osm_type = NEW.osm_type and osm_id = NEW.osm_id;
+  -- Have we already done this place?
+  SELECT * INTO existing
+    FROM place
+    WHERE osm_type = NEW.osm_type and osm_id = NEW.osm_id
+          and class = NEW.class and type = NEW.type;
 
-    -- update method for interpolation lines: delete all old interpolation lines with same osm_id (update on place) and insert the new one(s) (they can be split up, if they have > 2 nodes)
-    IF existingline.osm_id IS NOT NULL THEN
-      delete from location_property_osmline where osm_id = NEW.osm_id;
-    END IF;
+  {% if debug %}RAISE WARNING 'Existing: %',existing.osm_id;{% endif %}
 
-    -- for interpolations invalidate all nodes on the line
-    update placex p set indexed_status = 2
-      from planet_osm_ways w
-      where w.id = NEW.osm_id and p.osm_type = 'N' and p.osm_id = any(w.nodes);
+  -- Handle a place changing type by removing the old data.
+  -- (This trigger is executed BEFORE INSERT of the NEW tuple.)
+  IF existing.osm_type IS NULL THEN
+    DELETE FROM place where osm_type = NEW.osm_type and osm_id = NEW.osm_id and class = NEW.class;
+  END IF;
 
+  -- Remove any old logged data.
+  DELETE from import_polygon_error where osm_type = NEW.osm_type and osm_id = NEW.osm_id;
+  DELETE from import_polygon_delete where osm_type = NEW.osm_type and osm_id = NEW.osm_id;
 
-    INSERT INTO location_property_osmline (osm_id, address, linegeo)
-      VALUES (NEW.osm_id, NEW.address, NEW.geometry);
+  -- ---- Interpolation Lines
 
+  IF NEW.class='place' and NEW.type='houses'
+     and NEW.osm_type='W' and ST_GeometryType(NEW.geometry) = 'ST_LineString'
+  THEN
+    PERFORM reinsert_interpolation(NEW.osm_id, NEW.address, NEW.geometry);
 
-    IF existing.osm_type IS NULL THEN
-      return NEW;
-    END IF;
+    -- Now invalidate all address nodes on the line.
+    -- They get their parent from the interpolation.
+    UPDATE placex p SET indexed_status = 2
+      FROM planet_osm_ways w
+      WHERE w.id = NEW.osm_id and p.osm_type = 'N' and p.osm_id = any(w.nodes);
 
-    IF coalesce(existing.address, ''::hstore) != coalesce(NEW.address, ''::hstore)
-       OR (coalesce(existing.extratags, ''::hstore) != coalesce(NEW.extratags, ''::hstore))
-       OR existing.geometry::text != NEW.geometry::text
-       THEN
-
-      update place set 
-        name = NEW.name,
-        address = NEW.address,
-        extratags = NEW.extratags,
-        admin_level = NEW.admin_level,
-        geometry = NEW.geometry
-        where osm_type = NEW.osm_type and osm_id = NEW.osm_id and class = NEW.class and type = NEW.type;
+    -- If there is already an entry in place, just update that, if necessary.
+    IF existing.osm_type is not null THEN
+      IF coalesce(existing.address, ''::hstore) != coalesce(NEW.address, ''::hstore)
+         OR existing.geometry::text != NEW.geometry::text
+      THEN
+        UPDATE place
+          SET name = NEW.name,
+              address = NEW.address,
+              extratags = NEW.extratags,
+              admin_level = NEW.admin_level,
+              geometry = NEW.geometry
+          WHERE osm_type = NEW.osm_type and osm_id = NEW.osm_id
+                and class = NEW.class and type = NEW.type;
+       END IF;
+
+       RETURN NULL;
     END IF;
 
-    RETURN NULL;
+    RETURN NEW;
+  END IF;
 
-  ELSE -- insert to placex
-
-    -- Patch in additional country names
-    IF NEW.admin_level = 2 AND NEW.type = 'administrative'
-          AND NEW.address is not NULL AND NEW.address ? 'country' THEN
-        SELECT name FROM country_name WHERE country_code = lower(NEW.address->'country') INTO existing;
-        IF existing.name IS NOT NULL THEN
-            NEW.name = existing.name || NEW.name;
-        END IF;
-    END IF;
-      
-    -- Have we already done this place?
-    select * from place where osm_type = NEW.osm_type and osm_id = NEW.osm_id and class = NEW.class and type = NEW.type INTO existing;
-
-    -- Get the existing place_id
-    select * from placex where osm_type = NEW.osm_type and osm_id = NEW.osm_id and class = NEW.class and type = NEW.type INTO existingplacex;
-
-    -- Handle a place changing type by removing the old data
-    -- My generated 'place' types are causing havok because they overlap with real keys
-    -- TODO: move them to their own special purpose key/class to avoid collisions
-    IF existing.osm_type IS NULL THEN
-      DELETE FROM place where osm_type = NEW.osm_type and osm_id = NEW.osm_id and class = NEW.class;
-    END IF;
+  -- ---- Postcode points.
 
+  IF NEW.class = 'place' AND NEW.type = 'postcode' THEN
     -- Pure postcodes are never queried from placex so we don't add them.
     -- location_postcodes is filled from the place table directly.
-    IF NEW.class = 'place' AND NEW.type = 'postcode' THEN
-      -- Remove old placex entry.
-      DELETE FROM placex where osm_type = NEW.osm_type and osm_id = NEW.osm_id;
-
-      IF existing.osm_type IS NOT NULL THEN
-        IF coalesce(existing.address, ''::hstore) != coalesce(NEW.address, ''::hstore)
-           OR existing.geometry::text != NEW.geometry::text
-        THEN
 
-          update place set address = NEW.address, geometry = NEW.geometry
-            where osm_type = NEW.osm_type and osm_id = NEW.osm_id and class = NEW.class and type = NEW.type;
-        END IF;
+    -- Remove any old placex entry.
+    DELETE FROM placex WHERE osm_type = NEW.osm_type and osm_id = NEW.osm_id;
 
-        RETURN NULL;
+    IF existing.osm_type IS NOT NULL THEN
+      IF coalesce(existing.address, ''::hstore) != coalesce(NEW.address, ''::hstore)
+         OR existing.geometry::text != NEW.geometry::text
+      THEN
+        UPDATE place
+          SET name = NEW.name,
+              address = NEW.address,
+              extratags = NEW.extratags,
+              admin_level = NEW.admin_level,
+              geometry = NEW.geometry
+          WHERE osm_type = NEW.osm_type and osm_id = NEW.osm_id
+                and class = NEW.class and type = NEW.type;
       END IF;
 
-      RETURN NEW;
+      RETURN NULL;
     END IF;
 
-    {% if debug %}RAISE WARNING 'Existing: %',existing.osm_id;{% endif %}
-    {% if debug %}RAISE WARNING 'Existing PlaceX: %',existingplacex.place_id;{% endif %}
-
-    -- Log and discard 
-    IF existing.geometry is not null AND st_isvalid(existing.geometry) 
-      AND st_area(existing.geometry) > 0.02
-      AND ST_GeometryType(NEW.geometry) in ('ST_Polygon','ST_MultiPolygon')
-      AND st_area(NEW.geometry) < st_area(existing.geometry)*0.5
-      THEN
-      INSERT INTO import_polygon_error (osm_type, osm_id, class, type, name, country_code, updated, errormessage, prevgeometry, newgeometry)
-        VALUES (NEW.osm_type, NEW.osm_id, NEW.class, NEW.type, NEW.name, NEW.address->'country', now(), 
-        'Area reduced from '||st_area(existing.geometry)||' to '||st_area(NEW.geometry), existing.geometry, NEW.geometry);
-      RETURN null;
-    END IF;
+    RETURN NEW;
+  END IF;
 
-    DELETE from import_polygon_error where osm_type = NEW.osm_type and osm_id = NEW.osm_id;
-    DELETE from import_polygon_delete where osm_type = NEW.osm_type and osm_id = NEW.osm_id;
+  -- ---- All other place types.
+
+  -- When an area is changed from large to small: log and discard change
+  IF existing.geometry is not null AND ST_IsValid(existing.geometry)
+    AND ST_Area(existing.geometry) > 0.02
+    AND ST_GeometryType(NEW.geometry) in ('ST_Polygon','ST_MultiPolygon')
+    AND ST_Area(NEW.geometry) < ST_Area(existing.geometry) * 0.5
+  THEN
+    INSERT INTO import_polygon_error (osm_type, osm_id, class, type, name,
+                                      country_code, updated, errormessage,
+                                      prevgeometry, newgeometry)
+      VALUES (NEW.osm_type, NEW.osm_id, NEW.class, NEW.type, NEW.name,
+              NEW.address->'country', now(),
+              'Area reduced from '||st_area(existing.geometry)||' to '||st_area(NEW.geometry),
+              existing.geometry, NEW.geometry);
 
-    -- To paraphrase, if there isn't an existing item, OR if the admin level has changed
-    IF existingplacex.osm_type IS NULL OR
-        (existingplacex.class = 'boundary' AND
-          ((coalesce(existingplacex.admin_level, 15) != coalesce(NEW.admin_level, 15) AND existingplacex.type = 'administrative') OR
-          (existingplacex.type != NEW.type)))
-    THEN
+    RETURN null;
+  END IF;
 
-      {% if config.get_bool('LIMIT_REINDEXING') %}
-      IF existingplacex.osm_type IS NOT NULL THEN
-        -- sanity check: ignore admin_level changes on places with too many active children
-        -- or we end up reindexing entire countries because somebody accidentally deleted admin_level
-        SELECT count(*) INTO i FROM
-          (SELECT 'a' FROM placex, place_addressline 
-            WHERE address_place_id = existingplacex.place_id
-                  and placex.place_id = place_addressline.place_id
-                  and indexed_status = 0 and place_addressline.isaddress LIMIT 100001) sub;
-        IF i > 100000 THEN
-          RETURN null;
-        END IF;
-      END IF;
-      {% endif %}
+  -- If an address node is part of a interpolation line and changes or is
+  -- newly inserted (happens when the node already existed but now gets address
+  -- information), then mark the interpolation line for reparenting.
+  -- (Already here, because interpolation lines are reindexed before nodes,
+  --  so in the second call it would be too late.)
+  IF NEW.osm_type='N'
+     and coalesce(existing.address, ''::hstore) != coalesce(NEW.address, ''::hstore)
+  THEN
+      FOR interpol IN
+        SELECT DISTINCT osm_id, address, geometry FROM place, planet_osm_ways w
+        WHERE NEW.geometry && place.geometry
+              and place.osm_type = 'W'
+              and place.address ? 'interpolation'
+              and exists (SELECT * FROM location_property_osmline
+                          WHERE osm_id = place.osm_id
+                                and indexed_status in (0, 2))
+              and w.id = place.osm_id and NEW.osm_id = any (w.nodes)
+      LOOP
+        PERFORM reinsert_interpolation(interpol.osm_id, interpol.address,
+                                       interpol.geometry);
+      END LOOP;
+  END IF;
 
-      IF existing.osm_type IS NOT NULL THEN
-        -- pathological case caused by the triggerless copy into place during initial import
-        -- force delete even for large areas, it will be reinserted later
-        UPDATE place set geometry = ST_SetSRID(ST_Point(0,0), 4326) where osm_type = NEW.osm_type and osm_id = NEW.osm_id and class = NEW.class and type = NEW.type;
-        DELETE from place where osm_type = NEW.osm_type and osm_id = NEW.osm_id and class = NEW.class and type = NEW.type;
+  -- Get the existing placex entry.
+  SELECT * INTO existingplacex
+    FROM placex
+    WHERE osm_type = NEW.osm_type and osm_id = NEW.osm_id
+          and class = NEW.class and type = NEW.type;
+
+  {% if debug %}RAISE WARNING 'Existing PlaceX: %',existingplacex.place_id;{% endif %}
+
+  -- To paraphrase: if there isn't an existing item, OR if the admin level has changed
+  IF existingplacex.osm_type IS NULL
+     or (existingplacex.class = 'boundary'
+         and ((coalesce(existingplacex.admin_level, 15) != coalesce(NEW.admin_level, 15)
+               and existingplacex.type = 'administrative')
+              or existingplacex.type != NEW.type))
+  THEN
+    {% if config.get_bool('LIMIT_REINDEXING') %}
+    -- sanity check: ignore admin_level changes on places with too many active children
+    -- or we end up reindexing entire countries because somebody accidentally deleted admin_level
+    IF existingplacex.osm_type IS NOT NULL THEN
+      SELECT count(*) INTO i FROM
+        (SELECT 'a' FROM placex, place_addressline
+          WHERE address_place_id = existingplacex.place_id
+                and placex.place_id = place_addressline.place_id
+                and indexed_status = 0 and place_addressline.isaddress LIMIT 100001) sub;
+      IF i > 100000 THEN
+        RETURN null;
       END IF;
-
-      -- No - process it as a new insertion (hopefully of low rank or it will be slow)
-      insert into placex (osm_type, osm_id, class, type, name,
-                          admin_level, address, extratags, geometry)
-        values (NEW.osm_type, NEW.osm_id, NEW.class, NEW.type, NEW.name,
-                NEW.admin_level, NEW.address, NEW.extratags, NEW.geometry);
-
-      {% if debug %}RAISE WARNING 'insert done % % % % %',NEW.osm_type,NEW.osm_id,NEW.class,NEW.type,NEW.name;{% endif %}
-
-      RETURN NEW;
+    END IF;
+    {% endif %}
+
+    IF existing.osm_type IS NOT NULL THEN
+      -- Pathological case caused by the triggerless copy into place during initial import
+      -- force delete even for large areas, it will be reinserted later
+      UPDATE place SET geometry = ST_SetSRID(ST_Point(0,0), 4326)
+        WHERE osm_type = NEW.osm_type and osm_id = NEW.osm_id
+              and class = NEW.class and type = NEW.type;
+      DELETE FROM place
+        WHERE osm_type = NEW.osm_type and osm_id = NEW.osm_id
+              and class = NEW.class and type = NEW.type;
     END IF;
 
-    -- Special case for polygon shape changes because they tend to be large and we can be a bit clever about how we handle them
-    IF existing.geometry::text != NEW.geometry::text 
-       AND ST_GeometryType(existing.geometry) in ('ST_Polygon','ST_MultiPolygon')
-       AND ST_GeometryType(NEW.geometry) in ('ST_Polygon','ST_MultiPolygon') 
-       THEN 
-
-      -- Get the version of the geometry actually used (in placex table)
-      select geometry from placex where osm_type = NEW.osm_type and osm_id = NEW.osm_id and class = NEW.class and type = NEW.type into existinggeometry;
-
-      -- Performance limit
-      IF st_area(NEW.geometry) < 0.000000001 AND st_area(existinggeometry) < 1 THEN
-
-        -- re-index points that have moved in / out of the polygon, could be done as a single query but postgres gets the index usage wrong
-        update placex set indexed_status = 2 where indexed_status = 0
-            AND ST_Intersects(NEW.geometry, placex.geometry)
-            AND NOT ST_Intersects(existinggeometry, placex.geometry)
-            AND rank_search > existingplacex.rank_search AND (rank_search < 28 or name is not null);
+    -- Process it as a new insertion
+    INSERT INTO placex (osm_type, osm_id, class, type, name,
+                        admin_level, address, extratags, geometry)
+      VALUES (NEW.osm_type, NEW.osm_id, NEW.class, NEW.type, NEW.name,
+              NEW.admin_level, NEW.address, NEW.extratags, NEW.geometry);
 
-        update placex set indexed_status = 2 where indexed_status = 0
-            AND ST_Intersects(existinggeometry, placex.geometry)
-            AND NOT ST_Intersects(NEW.geometry, placex.geometry)
-            AND rank_search > existingplacex.rank_search AND (rank_search < 28 or name is not null);
+    {% if debug %}RAISE WARNING 'insert done % % % % %',NEW.osm_type,NEW.osm_id,NEW.class,NEW.type,NEW.name;{% endif %}
 
-      END IF;
+    RETURN NEW;
+  END IF;
 
+  -- Special case for polygon shape changes because they tend to be large
+  -- and we can be a bit clever about how we handle them
+  IF existing.geometry::text != NEW.geometry::text
+     AND ST_GeometryType(existing.geometry) in ('ST_Polygon','ST_MultiPolygon')
+     AND ST_GeometryType(NEW.geometry) in ('ST_Polygon','ST_MultiPolygon')
+  THEN
+    -- Performance limit
+    IF ST_Area(NEW.geometry) < 0.000000001 AND ST_Area(existingplacex.geometry) < 1
+    THEN
+      -- re-index points that have moved in / out of the polygon.
+      -- Could be done as a single query but postgres gets the index usage wrong.
+      update placex set indexed_status = 2 where indexed_status = 0
+          AND ST_Intersects(NEW.geometry, placex.geometry)
+          AND NOT ST_Intersects(existingplacex.geometry, placex.geometry)
+          AND rank_search > existingplacex.rank_search AND (rank_search < 28 or name is not null);
+
+      update placex set indexed_status = 2 where indexed_status = 0
+          AND ST_Intersects(existingplacex.geometry, placex.geometry)
+          AND NOT ST_Intersects(NEW.geometry, placex.geometry)
+          AND rank_search > existingplacex.rank_search AND (rank_search < 28 or name is not null);
     END IF;
+  END IF;
 
 
-    IF coalesce(existing.name::text, '') != coalesce(NEW.name::text, '')
-       OR coalesce(existing.extratags::text, '') != coalesce(NEW.extratags::text, '')
-       OR coalesce(existing.address, ''::hstore) != coalesce(NEW.address, ''::hstore)
-       OR coalesce(existing.admin_level, 15) != coalesce(NEW.admin_level, 15)
-       OR existing.geometry::text != NEW.geometry::text
-       THEN
-
-      update place set 
-        name = NEW.name,
-        address = NEW.address,
-        extratags = NEW.extratags,
-        admin_level = NEW.admin_level,
-        geometry = NEW.geometry
-        where osm_type = NEW.osm_type and osm_id = NEW.osm_id and class = NEW.class and type = NEW.type;
-
-
-      IF NEW.class = 'boundary' AND NEW.type = 'postal_code' THEN
-          IF NEW.address is NULL OR NOT NEW.address ? 'postcode' THEN
-              -- postcode was deleted, no longer retain in placex
-              DELETE FROM placex where place_id = existingplacex.place_id;
-              RETURN NULL;
-          END IF;
-
-          NEW.name := hstore('ref', NEW.address->'postcode');
+  -- Has something relevant changed?
+  IF coalesce(existing.name::text, '') != coalesce(NEW.name::text, '')
+     OR coalesce(existing.extratags::text, '') != coalesce(NEW.extratags::text, '')
+     OR coalesce(existing.address, ''::hstore) != coalesce(NEW.address, ''::hstore)
+     OR coalesce(existing.admin_level, 15) != coalesce(NEW.admin_level, 15)
+     OR existing.geometry::text != NEW.geometry::text
+  THEN
+    UPDATE place
+      SET name = NEW.name,
+          address = NEW.address,
+          extratags = NEW.extratags,
+          admin_level = NEW.admin_level,
+          geometry = NEW.geometry
+      WHERE osm_type = NEW.osm_type and osm_id = NEW.osm_id
+            and class = NEW.class and type = NEW.type;
+
+    -- Postcode areas are only kept, when there is an actual postcode assigned.
+    IF NEW.class = 'boundary' AND NEW.type = 'postal_code' THEN
+      IF NEW.address is NULL OR NOT NEW.address ? 'postcode' THEN
+        -- postcode was deleted, no longer retain in placex
+        DELETE FROM placex where place_id = existingplacex.place_id;
+        RETURN NULL;
       END IF;
 
-      IF NEW.class in ('boundary')
-         AND ST_GeometryType(NEW.geometry) not in ('ST_Polygon','ST_MultiPolygon') THEN
-          DELETE FROM placex where place_id = existingplacex.place_id;
-          RETURN NULL;
-      END IF;
+      NEW.name := hstore('ref', NEW.address->'postcode');
+    END IF;
 
-      update placex set 
-        name = NEW.name,
-        address = NEW.address,
-        parent_place_id = null,
-        extratags = NEW.extratags,
-        admin_level = NEW.admin_level,
-        indexed_status = 2,
-        geometry = NEW.geometry
-        where place_id = existingplacex.place_id;
-
-      -- if a node(=>house), which is part of a interpolation line, changes (e.g. the street attribute) => mark this line for reparenting 
-      -- (already here, because interpolation lines are reindexed before nodes, so in the second call it would be too late)
-      IF NEW.osm_type='N'
-         and (coalesce(existing.address, ''::hstore) != coalesce(NEW.address, ''::hstore)
-             or existing.geometry::text != NEW.geometry::text)
-      THEN
-          result:= osmline_reinsert(NEW.osm_id, NEW.geometry);
-      END IF;
+    -- Boundaries must be areas.
+    IF NEW.class in ('boundary')
+       AND ST_GeometryType(NEW.geometry) not in ('ST_Polygon','ST_MultiPolygon')
+    THEN
+      DELETE FROM placex where place_id = existingplacex.place_id;
+      RETURN NULL;
+    END IF;
 
-      -- linked places should get potential new naming and addresses
-      IF existingplacex.linked_place_id is not NULL THEN
-        update placex x set
-          name = p.name,
-          extratags = p.extratags,
-          indexed_status = 2
-        from place p
-        where x.place_id = existingplacex.linked_place_id
+    -- Update the placex entry in-place.
+    UPDATE placex
+      SET name = NEW.name,
+          address = NEW.address,
+          parent_place_id = null,
+          extratags = NEW.extratags,
+          admin_level = NEW.admin_level,
+          indexed_status = 2,
+          geometry = NEW.geometry
+      WHERE place_id = existingplacex.place_id;
+
+    -- Invalidate linked places: they potentially get a new name and addresses.
+    IF existingplacex.linked_place_id is not NULL THEN
+      UPDATE placex x
+        SET name = p.name,
+            extratags = p.extratags,
+            indexed_status = 2
+        FROM place p
+        WHERE x.place_id = existingplacex.linked_place_id
               and x.indexed_status = 0
               and x.osm_type = p.osm_type
               and x.osm_id = p.osm_id
               and x.class = p.class;
-      END IF;
+    END IF;
 
-      IF coalesce(existing.name::text, '') != coalesce(NEW.name::text, '')
-      THEN
-        IF existingplacex.rank_address between 26 and 27 THEN
-          -- When streets change their name, this may have an effect on POI objects
-          -- with addr:street tags.
-          UPDATE placex SET indexed_status = 2
+    -- Invalidate dependent objects effected by name changes
+    IF coalesce(existing.name::text, '') != coalesce(NEW.name::text, '')
+    THEN
+      IF existingplacex.rank_address between 26 and 27 THEN
+        -- When streets change their name, this may have an effect on POI objects
+        -- with addr:street tags.
+        UPDATE placex SET indexed_status = 2
           WHERE indexed_status = 0 and address ? 'street'
                 and parent_place_id = existingplacex.place_id;
-          UPDATE placex SET indexed_status = 2
+        UPDATE placex SET indexed_status = 2
           WHERE indexed_status = 0 and rank_search = 30 and address ? 'street'
                 and ST_DWithin(NEW.geometry, geometry, 0.002);
-        ELSEIF existingplacex.rank_address between 16 and 25 THEN
-          -- When places change their name, this may have an effect on POI objects
-          -- with addr:place tags.
-          UPDATE placex SET indexed_status = 2
+      ELSEIF existingplacex.rank_address between 16 and 25 THEN
+        -- When places change their name, this may have an effect on POI objects
+        -- with addr:place tags.
+        UPDATE placex SET indexed_status = 2
           WHERE indexed_status = 0 and address ? 'place' and rank_search = 30
                 and parent_place_id = existingplacex.place_id;
-          -- No update of surrounding objects, potentially too expensive.
-        END IF;
+        -- No update of surrounding objects, potentially too expensive.
       END IF;
     END IF;
-
-    -- Abort the add (we modified the existing place instead)
-    RETURN NULL;
   END IF;
 
+  -- Abort the insertion (we modified the existing place instead)
+  RETURN NULL;
 END;
 $$ LANGUAGE plpgsql;
 
index 8ae8cf39c0d9fb2e54649ffc821164c26e5de0e6..bb34883a44fe5b9482e91ae89c1c59bfa3af6b41 100644 (file)
@@ -1,3 +1,10 @@
+-- SPDX-License-Identifier: GPL-2.0-only
+--
+-- This file is part of Nominatim. (https://nominatim.org)
+--
+-- Copyright (C) 2022 by the Nominatim developer community.
+-- For a full list of authors see the git log.
+
 -- Trigger functions for the placex table.
 
 -- Information returned by update preparation.
@@ -9,7 +16,9 @@ CREATE TYPE prepare_update_info AS (
   country_code TEXT,
   class TEXT,
   type TEXT,
-  linked_place_id BIGINT
+  linked_place_id BIGINT,
+  centroid_x float,
+  centroid_y float
 );
 
 -- Retrieve the data needed by the indexer for updating the place.
@@ -19,30 +28,53 @@ CREATE OR REPLACE FUNCTION placex_indexing_prepare(p placex)
 DECLARE
   location RECORD;
   result prepare_update_info;
+  extra_names HSTORE;
 BEGIN
+  IF not p.address ? '_inherited' THEN
+    result.address := p.address;
+  END IF;
+
   -- For POI nodes, check if the address should be derived from a surrounding
   -- building.
-  IF p.rank_search < 30 OR p.osm_type != 'N' OR p.address is not null THEN
-    result.address := p.address;
-  ELSE
-    -- The additional && condition works around the misguided query
-    -- planner of postgis 3.0.
-    SELECT placex.address || hstore('_inherited', '') INTO result.address
-      FROM placex
-     WHERE ST_Covers(geometry, p.centroid)
-           and geometry && p.centroid
-           and placex.address is not null
-           and (placex.address ? 'housenumber' or placex.address ? 'street' or placex.address ? 'place')
-           and rank_search = 30 AND ST_GeometryType(geometry) in ('ST_Polygon','ST_MultiPolygon')
-     LIMIT 1;
+  IF p.rank_search = 30 AND p.osm_type = 'N' THEN
+    IF p.address is null THEN
+        -- The additional && condition works around the misguided query
+        -- planner of postgis 3.0.
+        SELECT placex.address || hstore('_inherited', '') INTO result.address
+          FROM placex
+         WHERE ST_Covers(geometry, p.centroid)
+               and geometry && p.centroid
+               and placex.address is not null
+               and (placex.address ? 'housenumber' or placex.address ? 'street' or placex.address ? 'place')
+               and rank_search = 30 AND ST_GeometryType(geometry) in ('ST_Polygon','ST_MultiPolygon')
+         LIMIT 1;
+    ELSE
+      -- See if we can inherit additional address tags from an interpolation.
+      -- These will become permanent.
+      FOR location IN
+        SELECT (address - 'interpolation'::text - 'housenumber'::text) as address
+          FROM place, planet_osm_ways w
+          WHERE place.osm_type = 'W' and place.address ? 'interpolation'
+                and place.geometry && p.geometry
+                and place.osm_id = w.id
+                and p.osm_id = any(w.nodes)
+      LOOP
+        result.address := location.address || result.address;
+      END LOOP;
+    END IF;
   END IF;
 
+  -- remove internal and derived names
   result.address := result.address - '_unlisted_place'::TEXT;
-  result.name := p.name;
+  SELECT hstore(array_agg(key), array_agg(value)) INTO result.name
+    FROM each(p.name) WHERE key not like '\_%';
+
   result.class := p.class;
   result.type := p.type;
   result.country_code := p.country_code;
   result.rank_address := p.rank_address;
+  result.centroid_x := ST_X(p.centroid);
+  result.centroid_y := ST_Y(p.centroid);
 
   -- Names of linked places need to be merged in, so search for a linkable
   -- place already here.
@@ -51,8 +83,20 @@ BEGIN
   IF location.place_id is not NULL THEN
     result.linked_place_id := location.place_id;
 
-    IF NOT location.name IS NULL THEN
-      result.name := location.name || result.name;
+    IF location.name is not NULL THEN
+      {% if debug %}RAISE WARNING 'Names original: %, location: %', result.name, location.name;{% endif %}
+      -- Add all names from the place nodes that deviate from the name
+      -- in the relation with the prefix '_place_'. Deviation means that
+      -- either the value is different or a given key is missing completely
+      SELECT hstore(array_agg('_place_' || key), array_agg(value)) INTO extra_names
+        FROM each(location.name - result.name);
+      {% if debug %}RAISE WARNING 'Extra names: %', extra_names;{% endif %}
+
+      IF extra_names is not null THEN
+          result.name := result.name || extra_names;
+      END IF;
+
+      {% if debug %}RAISE WARNING 'Final names: %', result.name;{% endif %}
     END IF;
   END IF;
 
@@ -80,7 +124,8 @@ BEGIN
       IF location.members[i+1] = 'street' THEN
         FOR parent IN
           SELECT place_id from placex
-           WHERE osm_type = 'W' and osm_id = substring(location.members[i],2)::bigint
+           WHERE osm_type = upper(substring(location.members[i], 1, 1))::char(1)
+                 and osm_id = substring(location.members[i], 2)::bigint
                  and name is not null
                  and rank_search between 26 and 27
         LOOP
@@ -124,18 +169,6 @@ BEGIN
   END IF;
 
   IF parent_place_id is null and poi_osm_type = 'N' THEN
-    -- Is this node part of an interpolation?
-    FOR location IN
-      SELECT q.parent_place_id
-        FROM location_property_osmline q, planet_osm_ways x
-       WHERE q.linegeo && bbox and x.id = q.osm_id
-             and poi_osm_id = any(x.nodes)
-       LIMIT 1
-    LOOP
-      {% if debug %}RAISE WARNING 'Get parent from interpolation: %', location.parent_place_id;{% endif %}
-      RETURN location.parent_place_id;
-    END LOOP;
-
     FOR location IN
       SELECT p.place_id, p.osm_id, p.rank_search, p.address,
              coalesce(p.centroid, ST_Centroid(p.geometry)) as centroid
@@ -249,7 +282,7 @@ BEGIN
              OR position(bnd_name in lower(name->'name')) > 0)
         AND placex.class = 'place' AND placex.type = bnd.extratags->'place'
         AND placex.osm_type = 'N'
-        AND placex.linked_place_id is null
+        AND (placex.linked_place_id is null or placex.linked_place_id = bnd.place_id)
         AND placex.rank_search < 26 -- needed to select the right index
         AND placex.type != 'postcode'
         AND ST_Covers(bnd.geometry, placex.geometry)
@@ -265,7 +298,7 @@ BEGIN
       WHERE placex.class = 'place' AND placex.osm_type = 'N'
         AND placex.extratags ? 'wikidata' -- needed to select right index
         AND placex.extratags->'wikidata' = bnd.extratags->'wikidata'
-        AND placex.linked_place_id is null
+        AND (placex.linked_place_id is null or placex.linked_place_id = bnd.place_id)
         AND placex.rank_search < 26
         AND _st_covers(bnd.geometry, placex.geometry)
       ORDER BY lower(name->'name') = bnd_name desc
@@ -289,7 +322,7 @@ BEGIN
              OR (bnd.rank_address = 0 and placex.rank_search = bnd.rank_search))
         AND placex.osm_type = 'N'
         AND placex.class = 'place'
-        AND placex.linked_place_id is null
+        AND (placex.linked_place_id is null or placex.linked_place_id = bnd.place_id)
         AND placex.rank_search < 26 -- needed to select the right index
         AND placex.type != 'postcode'
         AND ST_Covers(bnd.geometry, placex.geometry)
@@ -333,9 +366,10 @@ BEGIN
     WHERE s.place_id = parent_place_id;
 
   FOR addr_item IN
-    SELECT (get_addr_tag_rank(key, country)).*, key,
+    SELECT ranks.*, key,
            token_get_address_search_tokens(token_info, key) as search_tokens
-      FROM token_get_address_keys(token_info) as key
+      FROM token_get_address_keys(token_info) as key,
+           LATERAL get_addr_tag_rank(key, country) as ranks
       WHERE not token_get_address_search_tokens(token_info, key) <@ parent_address_vector
   LOOP
     addr_place := get_address_place(in_partition, geometry,
@@ -423,6 +457,7 @@ CREATE OR REPLACE FUNCTION insert_addresslines(obj_place_id BIGINT,
                                                maxrank SMALLINT,
                                                token_info JSONB,
                                                geometry GEOMETRY,
+                                               centroid GEOMETRY,
                                                country TEXT,
                                                OUT parent_place_id BIGINT,
                                                OUT postcode TEXT,
@@ -447,10 +482,12 @@ BEGIN
   address_havelevel := array_fill(false, ARRAY[maxrank]);
 
   FOR location IN
-    SELECT (get_address_place(partition, geometry, from_rank, to_rank,
-                              extent, token_info, key)).*, key
-      FROM (SELECT (get_addr_tag_rank(key, country)).*, key
-              FROM token_get_address_keys(token_info) as key) x
+    SELECT apl.*, key
+      FROM (SELECT extra.*, key
+              FROM token_get_address_keys(token_info) as key,
+                   LATERAL get_addr_tag_rank(key, country) as extra) x,
+           LATERAL get_address_place(partition, geometry, from_rank, to_rank,
+                              extent, token_info, key) as apl
       ORDER BY rank_address, distance, isguess desc
   LOOP
     IF location.place_id is null THEN
@@ -483,7 +520,7 @@ BEGIN
   END LOOP;
 
   FOR location IN
-    SELECT * FROM getNearFeatures(partition, geometry, maxrank)
+    SELECT * FROM getNearFeatures(partition, geometry, centroid, maxrank)
     WHERE not addr_place_ids @> ARRAY[place_id]
     ORDER BY rank_address, isguess asc,
              distance *
@@ -619,10 +656,7 @@ BEGIN
 {% if not disable_diff_updates %}
   -- The following is not needed until doing diff updates, and slows the main index process down
 
-  IF NEW.osm_type = 'N' and NEW.rank_search > 28 THEN
-      -- might be part of an interpolation
-      result := osmline_reinsert(NEW.osm_id, NEW.geometry);
-  ELSEIF NEW.rank_address > 0 THEN
+  IF NEW.rank_address > 0 THEN
     IF (ST_GeometryType(NEW.geometry) in ('ST_Polygon','ST_MultiPolygon') AND ST_IsValid(NEW.geometry)) THEN
       -- Performance: We just can't handle re-indexing for country level changes
       IF st_area(NEW.geometry) < 1 THEN
@@ -649,7 +683,7 @@ BEGIN
           -- roads may cause reparenting for >27 rank places
           update placex set indexed_status = 2 where indexed_status = 0 and rank_search > NEW.rank_search and ST_DWithin(placex.geometry, NEW.geometry, diameter);
           -- reparenting also for OSM Interpolation Lines (and for Tiger?)
-          update location_property_osmline set indexed_status = 2 where indexed_status = 0 and ST_DWithin(location_property_osmline.linegeo, NEW.geometry, diameter);
+          update location_property_osmline set indexed_status = 2 where indexed_status = 0 and startnumber is not null and ST_DWithin(location_property_osmline.linegeo, NEW.geometry, diameter);
         ELSEIF NEW.rank_search >= 16 THEN
           -- up to rank 16, street-less addresses may need reparenting
           update placex set indexed_status = 2 where indexed_status = 0 and rank_search > NEW.rank_search and ST_DWithin(placex.geometry, NEW.geometry, diameter) and (rank_search < 28 or name is not null or address ? 'place');
@@ -729,9 +763,6 @@ BEGIN
   DELETE FROM place_addressline WHERE place_id = NEW.place_id;
   result := deleteRoad(NEW.partition, NEW.place_id);
   result := deleteLocationArea(NEW.partition, NEW.place_id, NEW.rank_search);
-  UPDATE placex set linked_place_id = null, indexed_status = 2
-         where linked_place_id = NEW.place_id;
-  -- update not necessary for osmline, cause linked_place_id does not exist
 
   NEW.extratags := NEW.extratags - 'linked_place'::TEXT;
 
@@ -740,11 +771,11 @@ BEGIN
   linked_place := NEW.linked_place_id;
   NEW.linked_place_id := OLD.linked_place_id;
 
-  IF NEW.linked_place_id is not null THEN
-    NEW.token_info := null;
-    {% if debug %}RAISE WARNING 'place already linked to %', OLD.linked_place_id;{% endif %}
-    RETURN NEW;
-  END IF;
+  -- Remove linkage, if we have computed a different new linkee.
+  UPDATE placex SET linked_place_id = null, indexed_status = 2
+    WHERE linked_place_id = NEW.place_id
+          and (linked_place is null or linked_place_id != linked_place);
+  -- update not necessary for osmline, cause linked_place_id does not exist
 
   -- Postcodes are just here to compute the centroids. They are not searchable
   -- unless they are a boundary=postal_code.
@@ -790,6 +821,16 @@ BEGIN
                             NEW.class, NEW.type, NEW.admin_level,
                             (NEW.extratags->'capital') = 'yes',
                             NEW.address->'postcode');
+
+  -- Short-cut out for linked places. Note that this must happen after the
+  -- address rank has been recomputed. The linking might nullify a shift in
+  -- address rank.
+  IF NEW.linked_place_id is not null THEN
+    NEW.token_info := null;
+    {% if debug %}RAISE WARNING 'place already linked to %', OLD.linked_place_id;{% endif %}
+    RETURN NEW;
+  END IF;
+
   -- We must always increase the address level relative to the admin boundary.
   IF NEW.class = 'boundary' and NEW.type = 'administrative'
      and NEW.osm_type = 'R' and NEW.rank_address > 0
@@ -827,29 +868,56 @@ BEGIN
 
     IF NEW.rank_address > 9 THEN
         -- Second check that the boundary is not completely contained in a
-        -- place area with a higher address rank
+        -- place area with a equal or higher address rank.
         FOR location IN
-          SELECT rank_address FROM placex
+          SELECT rank_address
+          FROM placex,
+               LATERAL compute_place_rank(country_code, 'A', class, type,
+                                          admin_level, False, null) prank
           WHERE class = 'place' and rank_address < 24
-                and rank_address > NEW.rank_address
+                and prank.address_rank >= NEW.rank_address
                 and geometry && NEW.geometry
                 and geometry ~ NEW.geometry -- needed because ST_Relate does not do bbox cover test
                 and ST_Relate(geometry, NEW.geometry, 'T*T***FF*') -- contains but not equal
-          ORDER BY rank_address desc LIMIT 1
+          ORDER BY prank.address_rank desc LIMIT 1
         LOOP
           NEW.rank_address := location.rank_address + 2;
         END LOOP;
     END IF;
+  ELSEIF NEW.class = 'place'
+         and ST_GeometryType(NEW.geometry) in ('ST_Polygon', 'ST_MultiPolygon')
+         and NEW.rank_address between 16 and 23
+  THEN
+    -- For place areas make sure they are not completely contained in an area
+    -- with a equal or higher address rank.
+    FOR location IN
+          SELECT rank_address
+          FROM placex,
+               LATERAL compute_place_rank(country_code, 'A', class, type,
+                                          admin_level, False, null) prank
+          WHERE prank.address_rank < 24
+                and prank.address_rank >= NEW.rank_address
+                and geometry && NEW.geometry
+                and geometry ~ NEW.geometry -- needed because ST_Relate does not do bbox cover test
+                and ST_Relate(geometry, NEW.geometry, 'T*T***FF*') -- contains but not equal
+          ORDER BY prank.address_rank desc LIMIT 1
+        LOOP
+          NEW.rank_address := location.rank_address + 2;
+        END LOOP;
   ELSEIF NEW.class = 'place' and NEW.osm_type = 'N'
-     and NEW.rank_address between 16 and 23
+         and NEW.rank_address between 16 and 23
   THEN
-    -- If a place node is contained in a admin boundary with the same address level
-    -- and has not been linked, then make the node a subpart by increasing the
-    -- address rank (city level and above).
+    -- If a place node is contained in an admin or place boundary with the same
+    -- address level and has not been linked, then make the node a subpart
+    -- by increasing the address rank (city level and above).
     FOR location IN
-        SELECT rank_address FROM placex
-        WHERE osm_type = 'R' and class = 'boundary' and type = 'administrative'
-              and rank_address = NEW.rank_address
+        SELECT rank_address
+        FROM placex,
+             LATERAL compute_place_rank(country_code, 'A', class, type,
+                                        admin_level, False, null) prank
+        WHERE osm_type = 'R'
+              and ((class = 'place' and prank.address_rank = NEW.rank_address)
+                   or (class = 'boundary' and rank_address = NEW.rank_address))
               and geometry && NEW.centroid and _ST_Covers(geometry, NEW.centroid)
         LIMIT 1
     LOOP
@@ -929,7 +997,7 @@ BEGIN
       {% if debug %}RAISE WARNING 'Got parent details from search name';{% endif %}
 
       -- determine postcode
-      NEW.postcode := coalesce(token_normalized_postcode(NEW.address->'postcode'),
+      NEW.postcode := coalesce(token_get_postcode(NEW.token_info),
                                location.postcode,
                                get_nearest_postcode(NEW.country_code, NEW.centroid));
 
@@ -958,15 +1026,6 @@ BEGIN
       {% endif %}
 
       NEW.token_info := token_strip_info(NEW.token_info);
-      -- If the address was inherited from a surrounding building,
-      -- do not add it permanently to the table.
-      IF NEW.address ? '_inherited' THEN
-        IF NEW.address ? '_unlisted_place' THEN
-          NEW.address := hstore('_unlisted_place', NEW.address->'_unlisted_place');
-        ELSE
-          NEW.address := null;
-        END IF;
-      END IF;
 
       RETURN NEW;
     END IF;
@@ -977,7 +1036,14 @@ BEGIN
   -- Full indexing
   {% if debug %}RAISE WARNING 'Using full index mode for % %', NEW.osm_type, NEW.osm_id;{% endif %}
   IF linked_place is not null THEN
-    SELECT * INTO location FROM placex WHERE place_id = linked_place;
+    -- Recompute the ranks here as the ones from the linked place might
+    -- have been shifted to accommodate surrounding boundaries.
+    SELECT place_id, osm_id, class, type, extratags,
+           centroid, geometry,
+           (compute_place_rank(country_code, osm_type, class, type, admin_level,
+                              (extratags->'capital') = 'yes', null)).*
+      INTO location
+      FROM placex WHERE place_id = linked_place;
 
     {% if debug %}RAISE WARNING 'Linked %', location;{% endif %}
 
@@ -988,11 +1054,11 @@ BEGIN
         NEW.centroid := geom;
     END IF;
 
-    {% if debug %}RAISE WARNING 'parent address: % rank address: %', parent_address_level, location.rank_address;{% endif %}
-    IF location.rank_address > parent_address_level
-       and location.rank_address < 26
+    {% if debug %}RAISE WARNING 'parent address: % rank address: %', parent_address_level, location.address_rank;{% endif %}
+    IF location.address_rank > parent_address_level
+       and location.address_rank < 26
     THEN
-      NEW.rank_address := location.rank_address;
+      NEW.rank_address := location.address_rank;
     END IF;
 
     -- merge in extra tags
@@ -1001,7 +1067,9 @@ BEGIN
                      || coalesce(NEW.extratags, ''::hstore);
 
     -- mark the linked place (excludes from search results)
-    UPDATE placex set linked_place_id = NEW.place_id
+    -- Force reindexing to remove any traces from the search indexes and
+    -- reset the address rank if necessary.
+    UPDATE placex set linked_place_id = NEW.place_id, indexed_status = 2
       WHERE place_id = location.place_id;
     -- ensure that those places are not found anymore
     {% if 'search_name' in db.tables %}
@@ -1034,20 +1102,35 @@ BEGIN
     END IF;
   END IF;
 
+  {% if not disable_diff_updates %}
+  IF OLD.rank_address != NEW.rank_address THEN
+    -- After a rank shift all addresses containing us must be updated.
+    UPDATE placex p SET indexed_status = 2 FROM place_addressline pa
+      WHERE pa.address_place_id = NEW.place_id and p.place_id = pa.place_id
+            and p.indexed_status = 0 and p.rank_address between 4 and 25;
+  END IF;
+  {% endif %}
+
   IF NEW.admin_level = 2
      AND NEW.class = 'boundary' AND NEW.type = 'administrative'
      AND NEW.country_code IS NOT NULL AND NEW.osm_type = 'R'
   THEN
-    -- Update the list of country names. Adding an additional sanity
-    -- check here: make sure the country does overlap with the area where
-    -- we expect it to be as per static country grid.
+    -- Update the list of country names.
+    -- Only take the name from the largest area for the given country code
+    -- in the hope that this is the authoritative one.
+    -- Also replace any old names so that all mapping mistakes can
+    -- be fixed through regular OSM updates.
     FOR location IN
-      SELECT country_code FROM country_osm_grid
-       WHERE ST_Covers(geometry, NEW.centroid) and country_code = NEW.country_code
+      SELECT osm_id FROM placex
+       WHERE rank_search = 4 and osm_type = 'R'
+             and country_code = NEW.country_code
+       ORDER BY ST_Area(geometry) desc
        LIMIT 1
     LOOP
-      {% if debug %}RAISE WARNING 'Updating names for country '%' with: %', NEW.country_code, NEW.name;{% endif %}
-      UPDATE country_name SET name = name || NEW.name WHERE country_code = NEW.country_code;
+      IF location.osm_id = NEW.osm_id THEN
+        {% if debug %}RAISE WARNING 'Updating names for country '%' with: %', NEW.country_code, NEW.name;{% endif %}
+        UPDATE country_name SET derived_name = NEW.name WHERE country_code = NEW.country_code;
+      END IF;
     END LOOP;
   END IF;
 
@@ -1075,13 +1158,13 @@ BEGIN
   END IF;
 
   SELECT * FROM insert_addresslines(NEW.place_id, NEW.partition, max_rank,
-                                    NEW.token_info, geom, NEW.country_code)
+                                    NEW.token_info, geom, NEW.centroid,
+                                    NEW.country_code)
     INTO NEW.parent_place_id, NEW.postcode, nameaddress_vector;
 
   {% if debug %}RAISE WARNING 'RETURN insert_addresslines: %, %, %', NEW.parent_place_id, NEW.postcode, nameaddress_vector;{% endif %}
 
-  NEW.postcode := coalesce(token_normalized_postcode(NEW.address->'postcode'),
-                           NEW.postcode);
+  NEW.postcode := coalesce(token_get_postcode(NEW.token_info), NEW.postcode);
 
   -- if we have a name add this to the name search table
   IF NEW.name IS NOT NULL THEN
@@ -1122,7 +1205,7 @@ BEGIN
     NEW.postcode := get_nearest_postcode(NEW.country_code, NEW.geometry);
   END IF;
 
-  {% if debug %}RAISE WARNING 'place update % % finsihed.', NEW.osm_type, NEW.osm_id;{% endif %}
+  {% if debug %}RAISE WARNING 'place update % % finished.', NEW.osm_type, NEW.osm_id;{% endif %}
 
   NEW.token_info := token_strip_info(NEW.token_info);
   RETURN NEW;
index 515b76664ad4cf6de31f52c7fed1f121485e849f..3465e775cea5d1e49747cddd5c9856ba91785948 100644 (file)
@@ -1,3 +1,10 @@
+-- SPDX-License-Identifier: GPL-2.0-only
+--
+-- This file is part of Nominatim. (https://nominatim.org)
+--
+-- Copyright (C) 2022 by the Nominatim developer community.
+-- For a full list of authors see the git log.
+
 -- Trigger functions for location_postcode table.
 
 
@@ -27,7 +34,7 @@ BEGIN
     NEW.parent_place_id = 0;
     FOR location IN
       SELECT place_id
-        FROM getNearFeatures(partition, NEW.geometry, NEW.rank_search)
+        FROM getNearFeatures(partition, NEW.geometry, NEW.geometry, NEW.rank_search)
         WHERE NOT isguess ORDER BY rank_address DESC, distance asc LIMIT 1
     LOOP
         NEW.parent_place_id = location.place_id;
index 1f2362114c322077a281f4d59f029181341e3913..af23335a862cbbb511f133937c149aa6fecd4e85 100644 (file)
@@ -1,3 +1,10 @@
+-- SPDX-License-Identifier: GPL-2.0-only
+--
+-- This file is part of Nominatim. (https://nominatim.org)
+--
+-- Copyright (C) 2022 by the Nominatim developer community.
+-- For a full list of authors see the git log.
+
 -- Functions related to search and address ranks
 
 -- Return an approximate search radius according to the search rank.
index f7d2093c9f6c8c32f4b79f1334a3b0e81f68628b..ad262670092760521bfa677ba9a40ac4d1353037 100644 (file)
@@ -1,3 +1,10 @@
+-- SPDX-License-Identifier: GPL-2.0-only
+--
+-- This file is part of Nominatim. (https://nominatim.org)
+--
+-- Copyright (C) 2022 by the Nominatim developer community.
+-- For a full list of authors see the git log.
+
 -- Assorted helper functions for the triggers.
 
 CREATE OR REPLACE FUNCTION geometry_sector(partition INTEGER, place geometry)
@@ -163,15 +170,6 @@ BEGIN
 
 -- RAISE WARNING 'near osm fallback: %', ST_AsText(place_centre);
 
-  -- 
-  FOR nearcountry IN
-    SELECT country_code from country_osm_grid
-    WHERE st_dwithin(geometry, place_centre, 0.5)
-    ORDER BY st_distance(geometry, place_centre) asc, area asc limit 1
-  LOOP
-    RETURN nearcountry.country_code;
-  END LOOP;
-
   RETURN NULL;
 END;
 $$
index 62bae94c7120917b90e495e8f4915d2f314ed6e6..9bbc7527fdf65b89f667a228c9b950002970c922 100644 (file)
@@ -1,3 +1,10 @@
+-- SPDX-License-Identifier: GPL-2.0-only
+--
+-- This file is part of Nominatim. (https://nominatim.org)
+--
+-- Copyright (C) 2022 by the Nominatim developer community.
+-- For a full list of authors see the git log.
+
 -- Indices used only during search and update.
 -- These indices are created only after the indexing process is done.
 
@@ -21,7 +28,8 @@ CREATE INDEX IF NOT EXISTS idx_placex_geometry_reverse_lookupPolygon
     AND name is not null AND indexed_status = 0 AND linked_place_id is null;
 
 CREATE INDEX IF NOT EXISTS idx_osmline_parent_place_id
-  ON location_property_osmline USING BTREE (parent_place_id) {{db.tablespace.search_index}};
+  ON location_property_osmline USING BTREE (parent_place_id) {{db.tablespace.search_index}}
+  WHERE parent_place_id is not null;
 
 CREATE INDEX IF NOT EXISTS idx_osmline_parent_osm_id
   ON location_property_osmline USING BTREE (osm_id) {{db.tablespace.search_index}};
@@ -55,8 +63,12 @@ CREATE INDEX IF NOT EXISTS idx_postcode_postcode
 
   {% if postgres.has_index_non_key_column %}
     CREATE INDEX IF NOT EXISTS idx_placex_housenumber
-      ON placex USING btree (parent_place_id) INCLUDE (housenumber) WHERE housenumber is not null;
+      ON placex USING btree (parent_place_id)
+      INCLUDE (housenumber) {{db.tablespace.search_index}}
+      WHERE housenumber is not null;
     CREATE INDEX IF NOT EXISTS idx_osmline_parent_osm_id_with_hnr
-      ON location_property_osmline USING btree(parent_place_id) INCLUDE (startnumber, endnumber);
+      ON location_property_osmline USING btree(parent_place_id)
+      INCLUDE (startnumber, endnumber) {{db.tablespace.search_index}}
+      WHERE startnumber is not null;
   {% endif %}
 {% endif %}
index 98ab98742699674fc55297dc34d399f4793d700e..937060a074bfc383ec692cd1ff9ad6e5b167664b 100644 (file)
@@ -1,3 +1,10 @@
+-- SPDX-License-Identifier: GPL-2.0-only
+--
+-- This file is part of Nominatim. (https://nominatim.org)
+--
+-- Copyright (C) 2022 by the Nominatim developer community.
+-- For a full list of authors see the git log.
+
 drop table IF EXISTS search_name_blank CASCADE;
 CREATE TABLE search_name_blank (
   place_id BIGINT,
index c445d6aff0f775c6cf67ec824e9893125f0a56ee..fe292ca413034f17d3399df0c52b380bac7571c9 100644 (file)
@@ -1,3 +1,9 @@
+-- SPDX-License-Identifier: GPL-2.0-only
+--
+-- This file is part of Nominatim. (https://nominatim.org)
+--
+-- Copyright (C) 2022 by the Nominatim developer community.
+-- For a full list of authors see the git log.
 DROP TABLE IF EXISTS gb_postcode;
 CREATE TABLE gb_postcode (
     id integer,
index 5bf895a1586026323a711ffe4258df8f4f432e75..d1a373161f083851f9ace237be21abf7900900aa 100644 (file)
@@ -1,3 +1,10 @@
+-- SPDX-License-Identifier: GPL-2.0-only
+--
+-- This file is part of Nominatim. (https://nominatim.org)
+--
+-- Copyright (C) 2022 by the Nominatim developer community.
+-- For a full list of authors see the git log.
+
 -- insert creates the location tables, creates location indexes if indexed == true
 CREATE TRIGGER placex_before_insert BEFORE INSERT ON placex
     FOR EACH ROW EXECUTE PROCEDURE placex_insert();
index 5008091b3e96f7b28a776a012115b24b4a8ffe51..03431d95ac7bbb78c2b15688d72fe07b66cc52ff 100644 (file)
@@ -1,3 +1,10 @@
+-- SPDX-License-Identifier: GPL-2.0-only
+--
+-- This file is part of Nominatim. (https://nominatim.org)
+--
+-- Copyright (C) 2022 by the Nominatim developer community.
+-- For a full list of authors see the git log.
+
 drop table if exists import_status;
 CREATE TABLE import_status (
   lastimportdate timestamp with time zone NOT NULL,
@@ -38,7 +45,7 @@ GRANT SELECT ON TABLE country_name TO "{{config.DATABASE_WEBUSER}}";
 
 DROP TABLE IF EXISTS nominatim_properties;
 CREATE TABLE nominatim_properties (
-    property TEXT,
+    property TEXT NOT NULL,
     value TEXT
 );
 GRANT SELECT ON TABLE nominatim_properties TO "{{config.DATABASE_WEBUSER}}";
@@ -73,9 +80,9 @@ CREATE TABLE location_property_tiger (
   parent_place_id BIGINT,
   startnumber INTEGER,
   endnumber INTEGER,
+  step SMALLINT,
   partition SMALLINT,
   linegeo GEOMETRY,
-  interpolationtype TEXT,
   postcode TEXT);
 GRANT SELECT ON location_property_tiger TO "{{config.DATABASE_WEBUSER}}";
 
@@ -88,10 +95,10 @@ CREATE TABLE location_property_osmline (
     indexed_date TIMESTAMP,
     startnumber INTEGER,
     endnumber INTEGER,
+    step SMALLINT,
     partition SMALLINT,
     indexed_status SMALLINT,
     linegeo GEOMETRY,
-    interpolationtype TEXT,
     address HSTORE,
     token_info JSONB, -- custom column for tokenizer use only
     postcode TEXT,
@@ -99,7 +106,8 @@ CREATE TABLE location_property_osmline (
   ){{db.tablespace.search_data}};
 CREATE UNIQUE INDEX idx_osmline_place_id ON location_property_osmline USING BTREE (place_id) {{db.tablespace.search_index}};
 CREATE INDEX idx_osmline_geometry_sector ON location_property_osmline USING BTREE (geometry_sector) {{db.tablespace.address_index}};
-CREATE INDEX idx_osmline_linegeo ON location_property_osmline USING GIST (linegeo) {{db.tablespace.search_index}};
+CREATE INDEX idx_osmline_linegeo ON location_property_osmline USING GIST (linegeo) {{db.tablespace.search_index}}
+  WHERE startnumber is not null;
 GRANT SELECT ON location_property_osmline TO "{{config.DATABASE_WEBUSER}}";
 
 drop table IF EXISTS search_name;
@@ -248,4 +256,9 @@ ALTER TABLE ONLY wikipedia_redirect ADD CONSTRAINT wikipedia_redirect_pkey PRIMA
 -- Add one for lookup of associated street relations.
 CREATE INDEX planet_osm_rels_parts_associated_idx ON planet_osm_rels USING gin(parts) WHERE tags @> ARRAY['associatedStreet'];
 
+-- Needed for lookups if a node is part of an interpolation.
+CREATE INDEX IF NOT EXISTS idx_place_interpolations
+    ON place USING gist(geometry) {{db.tablespace.address_index}}
+    WHERE osm_type = 'W' and address ? 'interpolation';
+
 GRANT SELECT ON table country_osm_grid to "{{config.DATABASE_WEBUSER}}";
index fb76477c3db83ac9ecd480b8362dcdbba3899663..c02ce2a3d79cc396c5bb9c33de4cdf38295847b6 100644 (file)
@@ -1,8 +1,15 @@
+-- SPDX-License-Identifier: GPL-2.0-only
+--
+-- This file is part of Nominatim. (https://nominatim.org)
+--
+-- Copyright (C) 2022 by the Nominatim developer community.
+-- For a full list of authors see the git log.
+
 --index only on parent_place_id
 CREATE INDEX IF NOT EXISTS idx_location_property_tiger_parent_place_id_imp
   ON location_property_tiger_import (parent_place_id)
 {% if postgres.has_index_non_key_column %}
-  INCLUDE (startnumber, endnumber)
+  INCLUDE (startnumber, endnumber, step)
 {% endif %}
   {{db.tablespace.aux_index}};
 CREATE UNIQUE INDEX IF NOT EXISTS idx_location_property_tiger_place_id_imp
index f344e1745ac8da95a86fd3d8013a8916671f2f91..0ff534368d0929f6c58eb7b2fb6b2b6ab9d5402a 100644 (file)
@@ -1,5 +1,19 @@
+-- SPDX-License-Identifier: GPL-2.0-only
+--
+-- This file is part of Nominatim. (https://nominatim.org)
+--
+-- Copyright (C) 2022 by the Nominatim developer community.
+-- For a full list of authors see the git log.
 DROP TABLE IF EXISTS location_property_tiger_import;
-CREATE TABLE location_property_tiger_import (linegeo GEOMETRY, place_id BIGINT, partition INTEGER, parent_place_id BIGINT, startnumber INTEGER, endnumber INTEGER, interpolationtype TEXT, postcode TEXT);
+CREATE TABLE location_property_tiger_import (
+  linegeo GEOMETRY,
+  place_id BIGINT,
+  partition INTEGER,
+  parent_place_id BIGINT,
+  startnumber INTEGER,
+  endnumber INTEGER,
+  step SMALLINT,
+  postcode TEXT);
 
 CREATE OR REPLACE FUNCTION tiger_line_import(linegeo GEOMETRY, in_startnumber INTEGER,
                                              in_endnumber INTEGER, interpolationtype TEXT,
@@ -18,11 +32,12 @@ DECLARE
 BEGIN
 
   IF in_endnumber > in_startnumber THEN
-    startnumber = in_startnumber;
-    endnumber = in_endnumber;
+    startnumber := in_startnumber;
+    endnumber := in_endnumber;
   ELSE
-    startnumber = in_endnumber;
-    endnumber = in_startnumber;
+    startnumber := in_endnumber;
+    endnumber := in_startnumber;
+    linegeo := ST_Reverse(linegeo);
   END IF;
 
   IF startnumber < 0 THEN
@@ -44,8 +59,10 @@ BEGIN
   END IF;
 
   -- Filter out really broken tiger data
-  IF numberrange > 0 AND (numberrange::float/stepsize::float > 500)
-                    AND ST_length(linegeo)/(numberrange::float/stepsize::float) < 0.000001 THEN
+  IF numberrange > 0
+     and numberrange::float/stepsize::float > 500
+     and ST_length(linegeo)/(numberrange::float/stepsize::float) < 0.000001
+  THEN
     RAISE WARNING 'Road too short for number range % to % (%)',startnumber,endnumber,
                   ST_length(linegeo)/(numberrange::float/stepsize::float);
     RETURN 0;
@@ -68,8 +85,12 @@ BEGIN
   END IF;
 
 --insert street(line) into import table
-insert into location_property_tiger_import (linegeo, place_id, partition, parent_place_id, startnumber, endnumber, interpolationtype, postcode)
-values (linegeo, nextval('seq_place'), out_partition, out_parent_place_id, startnumber, endnumber, interpolationtype, in_postcode);
+insert into location_property_tiger_import (linegeo, place_id, partition,
+                                            parent_place_id, startnumber, endnumber,
+                                            step, postcode)
+values (linegeo, nextval('seq_place'), out_partition,
+        out_parent_place_id, startnumber, endnumber,
+        stepsize, in_postcode);
 
   RETURN 1;
 END;
index 6092319a0578d338915b6890902d71df7ec90b1f..599d0eb089eaeff6b5be795734e3a9b139b97117 100644 (file)
@@ -1,3 +1,10 @@
+-- SPDX-License-Identifier: GPL-2.0-only
+--
+-- This file is part of Nominatim. (https://nominatim.org)
+--
+-- Copyright (C) 2022 by the Nominatim developer community.
+-- For a full list of authors see the git log.
+
 -- Get tokens used for searching the given place.
 --
 -- These are the tokens that will be saved in the search_name table.
@@ -51,7 +58,7 @@ $$ LANGUAGE SQL IMMUTABLE;
 CREATE OR REPLACE FUNCTION token_matches_street(info JSONB, street_tokens INTEGER[])
   RETURNS BOOLEAN
 AS $$
-  SELECT (info->>'street')::INTEGER[] <@ street_tokens
+  SELECT (info->>'street')::INTEGER[] && street_tokens
 $$ LANGUAGE SQL IMMUTABLE STRICT;
 
 
@@ -90,10 +97,10 @@ AS $$
 $$ LANGUAGE SQL IMMUTABLE STRICT;
 
 
-CREATE OR REPLACE FUNCTION token_normalized_postcode(postcode TEXT)
+CREATE OR REPLACE FUNCTION token_get_postcode(info JSONB)
   RETURNS TEXT
 AS $$
-  SELECT CASE WHEN postcode SIMILAR TO '%(,|;)%' THEN NULL ELSE upper(trim(postcode))END;
+  SELECT info->>'postcode';
 $$ LANGUAGE SQL IMMUTABLE STRICT;
 
 
@@ -193,3 +200,49 @@ BEGIN
 END;
 $$
 LANGUAGE plpgsql;
+
+
+CREATE OR REPLACE FUNCTION create_analyzed_hnr_id(norm_term TEXT, lookup_terms TEXT[])
+  RETURNS INTEGER
+  AS $$
+DECLARE
+  return_id INTEGER;
+BEGIN
+  SELECT min(word_id) INTO return_id
+    FROM word WHERE word = norm_term and type = 'H';
+
+  IF return_id IS NULL THEN
+    return_id := nextval('seq_word');
+    INSERT INTO word (word_id, word_token, type, word, info)
+      SELECT return_id, lookup_term, 'H', norm_term,
+             json_build_object('lookup', lookup_terms[1])
+        FROM unnest(lookup_terms) as lookup_term;
+  END IF;
+
+  RETURN return_id;
+END;
+$$
+LANGUAGE plpgsql;
+
+CREATE OR REPLACE FUNCTION create_postcode_word(postcode TEXT, lookup_terms TEXT[])
+  RETURNS BOOLEAN
+  AS $$
+DECLARE
+  existing INTEGER;
+BEGIN
+  SELECT count(*) INTO existing
+    FROM word WHERE word = postcode and type = 'P';
+
+  IF existing > 0 THEN
+    RETURN TRUE;
+  END IF;
+
+  -- postcodes don't need word ids
+  INSERT INTO word (word_token, type, word)
+    SELECT lookup_term, 'P', postcode FROM unnest(lookup_terms) as lookup_term;
+
+  RETURN FALSE;
+END;
+$$
+LANGUAGE plpgsql;
+
index 7ec3c6f891c958d5eb43de3df91faba6ea30a37c..509f6f65d9d6e5dd659c3d95ad2e3220b4209bb5 100644 (file)
@@ -1,3 +1,10 @@
+-- SPDX-License-Identifier: GPL-2.0-only
+--
+-- This file is part of Nominatim. (https://nominatim.org)
+--
+-- Copyright (C) 2022 by the Nominatim developer community.
+-- For a full list of authors see the git log.
+
 DROP TABLE IF EXISTS word;
 CREATE TABLE word (
   word_id INTEGER,
@@ -21,6 +28,10 @@ CREATE INDEX idx_word_postcodes ON word
 CREATE INDEX idx_word_full_word ON word
     USING btree(word) {{db.tablespace.address_index}}
     WHERE type = 'W';
+-- Used when inserting analyzed housenumbers (exclude old-style entries).
+CREATE INDEX idx_word_housenumbers ON word
+    USING btree(word) {{db.tablespace.address_index}}
+    WHERE type = 'H' and word is not null;
 
 GRANT SELECT ON word TO "{{config.DATABASE_WEBUSER}}";
 
index 2b734e6f2a95a5cfe97243e81e3b4c47485a3d92..5826f74ac25392b3bff857c1c71f054028839ba2 100644 (file)
@@ -1,3 +1,10 @@
+-- SPDX-License-Identifier: GPL-2.0-only
+--
+-- This file is part of Nominatim. (https://nominatim.org)
+--
+-- Copyright (C) 2022 by the Nominatim developer community.
+-- For a full list of authors see the git log.
+
 -- Get tokens used for searching the given place.
 --
 -- These are the tokens that will be saved in the search_name table.
@@ -90,10 +97,10 @@ AS $$
 $$ LANGUAGE SQL IMMUTABLE STRICT;
 
 
-CREATE OR REPLACE FUNCTION token_normalized_postcode(postcode TEXT)
+CREATE OR REPLACE FUNCTION token_get_postcode(info JSONB)
   RETURNS TEXT
 AS $$
-  SELECT CASE WHEN postcode SIMILAR TO '%(,|;)%' THEN NULL ELSE upper(trim(postcode))END;
+  SELECT info->>'postcode';
 $$ LANGUAGE SQL IMMUTABLE STRICT;
 
 
index d653a26dfa84c356996cd9adbf051e1d99b1f07a..016c518a65b2de9c1c9d409c7d983ee3d3a641de 100644 (file)
@@ -1,3 +1,10 @@
+-- SPDX-License-Identifier: GPL-2.0-only
+--
+-- This file is part of Nominatim. (https://nominatim.org)
+--
+-- Copyright (C) 2022 by the Nominatim developer community.
+-- For a full list of authors see the git log.
+
 -- Required for details lookup.
 CREATE INDEX IF NOT EXISTS idx_word_word_id
   ON word USING BTREE (word_id) {{db.tablespace.search_index}};
index 937eaaa297f32c0304fbd2958331204ad013d378..7969f1ca549290eb3289cb797e0492949d0b5120 100644 (file)
@@ -1,3 +1,10 @@
+-- SPDX-License-Identifier: GPL-2.0-only
+--
+-- This file is part of Nominatim. (https://nominatim.org)
+--
+-- Copyright (C) 2022 by the Nominatim developer community.
+-- For a full list of authors see the git log.
+
 DROP TABLE IF EXISTS word;
 CREATE TABLE word (
   word_id INTEGER,
index 6aef6a5acfb12ad4d9bfc3f664f55701c21ef266..9684a8172ef0fdf7fc7de08564b99e3cb634a695 100644 (file)
@@ -1,6 +1,6 @@
 # just use the pgxs makefile
 
-foreach(suffix ${PostgreSQL_ADDITIONAL_VERSIONS} "13" "12" "11" "10" "9.6" "9.5" "9.4" "9.3")
+foreach(suffix ${PostgreSQL_ADDITIONAL_VERSIONS} "14" "13" "12" "11" "10" "9.6")
     list(APPEND PG_CONFIG_HINTS
          "/usr/pgsql-${suffix}/bin")
 endforeach()
index 73bf16c8df487eac4d462621fe566534e6476621..9d43c22f28e89da594ad20e39d9947dff2da7e23 100644 (file)
@@ -1,3 +1,11 @@
+/**
+ * SPDX-License-Identifier: GPL-2.0-only
+ *
+ * This file is part of Nominatim. (https://nominatim.org)
+ *
+ * Copyright (C) 2022 by the Nominatim developer community.
+ * For a full list of authors see the git log.
+ */
 #include "postgres.h"
 #include "fmgr.h"
 #include "mb/pg_wchar.h"
index 77519c0ca0c2719d55e9636535dcd3971236256e..9f4975abb215387845c50f11c4a93435b6bb3185 100644 (file)
@@ -1,3 +1,11 @@
+/**
+ * SPDX-License-Identifier: GPL-2.0-only
+ *
+ * This file is part of Nominatim. (https://nominatim.org)
+ *
+ * Copyright (C) 2022 by the Nominatim developer community.
+ * For a full list of authors see the git log.
+ */
        str_replace(buffer, &len, &changes, " national wildlife refuge area ", 31, " nwra ", 6, 0);
        str_replace(buffer, &len, &changes, " national recreation area ", 26, " nra ", 5, 0);
        str_replace(buffer, &len, &changes, " air national guard base ", 25, " angb ", 6, 0);
index 15c34c751b2a8025784c9bf39d83e2dd57cd8dff..a099ed6ba913177a1fc0c96fb47f34507591a9cc 100644 (file)
@@ -1,2 +1,10 @@
+/**
+ * SPDX-License-Identifier: GPL-2.0-only
+ *
+ * This file is part of Nominatim. (https://nominatim.org)
+ *
+ * Copyright (C) 2022 by the Nominatim developer community.
+ * For a full list of authors see the git log.
+ */
 #define UTFASCII " \x00""\x01"" \x01""0\x01""1\x01""2\x01""3\x01""4\x01""5\x01""6\x01""7\x01""8\x01""9\x01""a\x01""b\x01""c\x01""d\x01""e\x01""f\x01""g\x01""h\x01""i\x01""j\x01""k\x01""l\x01""m\x01""n\x01""o\x01""p\x01""q\x01""r\x01""s\x01""t\x01""u\x01""v\x01""w\x01""x\x01""y\x01""z\x02""ps\x02""ss\x03""deg\x01""-\x02""14\x02""12\x02""34\x02""ae\x02""th\x02""ij\x02""ng\x02""oe\x02""hv\x02""oi\x02""yr\x02""sh\x02""zh\x02""ts\x02""dz\x02""lj\x02""nj\x02""ou\x02""db\x02""qp\x04""stop\x02""lz\x02""tc\x02""fn\x02""ls\x02""ww\x0a""extra-high\x04""high\x03""mid\x04""tone\x09""extra-low\x03""yin\x04""yang\x04""down\x02""up\x04""left\x05""right\x04""ring\x06""middle\x05""tilde\x06""raised\x05""begin\x03""end\x05""shelf\x05""below\x04""heta\x05""sampi\x0a""pamphylian\x02""ks\x02""ph\x02""kh\x05""koppa\x02""st\x02""sp\x02""ch\x02""ti\x03""sho\x03""san\x02""ie\x02""io\x02""dj\x02""gj\x02""yi\x03""tsh\x02""kj\x03""dzh\x04""shch\x04""hard\x02""iu\x02""ia\x02""gh\x02""ot\x04""1000\x06""100000\x07""1000000\x03""tts\x02""el\x02""en\x02""em\x08""palochka\x03""ghe\x02""ha\x02""de\x03""dje\x03""zje\x04""dzje\x03""lje\x03""nje\x03""sje\x03""tje\x02""ze\x03""lha\x03""rha\x03""yae\x02""qa\x02""we\x05""aleut\x02""rh\x02""ew\x04""alef\x04""ayin\x02""oy\x05""sanah\x05""safha\x05""misra\x0b""sallallahou\x06""alayhe\x0b""rahmatullah\x04""radi\x09""takhallus\x05""hamza\x03""teh\x02""dh\x03""ain\x05""keheh\x05""farsi\x02""an\x02""un\x02""in\x05""small\x03""dot\x03""beh\x03""qaf\x02""tt\x03""tth\x02""bh\x03""hah\x02""ny\x02""dy\x03""cch\x02""dd\x02""dt\x03""ddh\x02""rr\x02""hy\x02""yu\x03""yeh\x03""sad\x03""dal\x03""reh\x06""sindhi\x03""heh\x05""alaph\x02""yh\x07""persian\x07""sogdian\x04""seen\x03""feh\x04""meem\x04""noon\x03""lam\x03""waw\x03""kaf\x05""alifu\x02""hh\x04""ainu\x02""aa\x02""ee\x02""oo\x02""ey\x02""oa\x03""naa\x0a""dagbasinna\x02""ba\x02""pa\x02""ta\x02""ja\x03""cha\x02""da\x02""ra\x03""rra\x02""sa\x03""gba\x02""fa\x02""ka\x02""la\x02""na\x02""ma\x03""nya\x02""wa\x02""ya\x04""jona\x0b""candrabindu\x08""anusvara\x07""visarga\x02""ii\x02""uu\x06""candra\x02""ai\x02""au\x03""kha\x02""ga\x03""gha\x03""nga\x02""ca\x03""jha\x03""tta\x04""ttha\x03""dda\x04""ddha\x03""nna\x03""tha\x03""dha\x04""nnna\x03""pha\x03""bha\x03""lla\x04""llla\x02""va\x03""sha\x03""ssa\x05""nukta\x08""avagraha\x06""virama\x06""udatta\x08""anudatta\x04""khha\x04""ghha\x02""za\x05""dddha\x03""yya\x02""ll\x03""gga\x03""jja\x04""ddda\x03""bba\x06""khanda\x02""on\x02""jh\x02""nn\x03""nnn\x03""lll\x03""aum\x05""udaat\x03""khh\x03""ghh\x04""dddh\x02""yy\x06""yakash\x02""rs\x02""bb\x03""geo\x03""tsa\x03""dza\x05""tuumu\x0b""jihvamuliya\x0b""upadhmaniya\x06""chillu\x08""iruyanna\x06""eyanna\x0a""alpapraana\x07""yayanna\x07""rayanna\x07""dantaja\x09""muurdhaja\x0a""aela-pilla\x05""ketti\x04""diga\x0c""gaetta-pilla\x07""kombuva\x05""kombu\x0b""gayanukitta\x02""ko\x03""kho\x02""yo\x03""tho\x02""so\x07""phinthu\x0b""lakkhangyao\x03""mai\x08""nikhahit\x08""yamakkan\x07""fongman\x0a""angkhankhu\x06""khomut\x03""aae\x02""no\x03""nng\x03""jny\x03""nyj\x04""nndd\x02""nd\x02""mb\x02""lo\x02""om\x04""half\x02""am\x02""ue\x03""uue\x03""yar\x02""ao\x04""tsha\x04""dzha\x03""zha\x02""-a\x04""kssa\x0a""fixed-form\x03""kka\x04""rjes\x04""rnam\x03""sna\x03""lci\x04""mchu\x03""gru\x02""ei\x02""ay\x04""rdel\x02""hn\x02""hm\x04""nnya\x04""shan\x03""mon\x04""tall\x04""asat\x06""medial\x05""great\x03""ssh\x03""kss\x07""western\x07""eastern\x05""rumai\x03""rae\x04""char\x04""jhan\x03""hae\x02""he\x03""hie\x03""har\x03""hoe\x03""ban\x03""gan\x03""don\x03""vin\x03""zen\x03""tan\x03""kan\x03""las\x03""man\x03""nar\x03""par\x04""zhar\x03""tar\x04""phar\x04""khar\x04""ghan\x03""qar\x04""shin\x04""chin\x03""can\x03""jil\x03""cil\x03""xan\x02""fi\x02""yn\x05""elifi\x08""georgian\x03""nny\x06""filler\x02""eo\x03""yeo\x02""ye\x03""wae\x03""weo\x02""wi\x02""eu\x03""a-o\x03""a-u\x04""ya-o\x05""ya-yo\x04""eo-o\x04""eo-u\x05""eo-eu\x05""yeo-o\x05""yeo-u\x04""o-eo\x03""o-e\x04""o-ye\x03""o-o\x03""o-u\x05""yo-ya\x06""yo-yae\x06""yo-yeo\x04""yo-o\x04""yo-i\x03""u-a\x04""u-ae\x07""u-eo-eu\x04""u-ye\x03""u-u\x04""yu-a\x05""yu-eo\x04""yu-e\x06""yu-yeo\x05""yu-ye\x04""yu-u\x04""yu-i\x04""eu-u\x05""eu-eu\x04""yi-u\x03""i-a\x04""i-ya\x03""i-o\x03""i-u\x04""i-eu\x07""i-araea\x05""araea\x08""araea-eo\x02""xh\x0c""nieun-tikeut\x0a""nieun-sios\x0d""nieun-pansios\x0d""nieun-thieuth\x0d""tikeut-kiyeok\x0c""tikeut-rieul\x11""rieul-kiyeok-sios\x0b""rieul-nieun\x0c""rieul-tikeut\x12""rieul-tikeut-hieuh\x0b""hieuh-mieum\x0b""hieuh-pieup\x0b""yeorinhieuh\x02""gg\x03""laa\x02""jj\x02""nb\x02""dg\x02""rn\x02""mn\x02""bg\x02""bn\x03""sza\x02""bs\x03""bsg\x03""bst\x03""bsb\x03""bss\x03""bsj\x02""bj\x02""bc\x02""bt\x02""bp\x03""bbn\x02""sg\x02""sn\x02""sd\x02""sr\x02""sm\x02""sb\x03""sbg\x03""sss\x02""sj\x02""sc\x02""sk\x04""shee\x03""she\x04""shwa\x03""qoa\x03""qha\x03""qhu\x02""ck\x04""qhee\x03""qhe\x02""pb\x02""pn\x04""qhwi\x05""qhwaa\x05""qhwee\x04""qhwe\x04""u-eo\x03""u-i\x02""gs\x02""nh\x02""lg\x02""lm\x02""lb\x02""lt\x02""lp\x02""lh\x02""gl\x03""gsg\x02""ns\x02""nz\x02""nt\x02""tl\x03""lgs\x02""ln\x02""ld\x03""lth\x03""lmg\x03""lms\x03""lbs\x03""lbh\x03""rnp\x03""lss\x02""lk\x02""lq\x02""mg\x02""ml\x02""ms\x03""mss\x02""mz\x02""mc\x02""mh\x02""bl\x02""sl\x02""hl\x02""hb\x03""ddi\x04""ddaa\x04""ddee\x03""dde\x03""ddo\x04""ddwa\x02""hu\x02""hi\x03""haa\x03""hee\x02""ho\x03""jwa\x02""lu\x02""li\x03""lee\x02""le\x03""lwa\x03""hha\x03""hhu\x03""hhi\x04""hhaa\x04""hhee\x03""hhe\x03""hho\x04""hhwa\x02""mu\x02""mi\x03""maa\x03""mee\x02""me\x02""mo\x03""mwa\x03""szu\x03""szi\x04""szaa\x04""szee\x03""sze\x03""szo\x04""szwa\x02""ru\x02""ri\x03""raa\x03""ree\x02""re\x02""ro\x03""rwa\x02""su\x02""si\x03""saa\x03""see\x02""se\x03""swa\x03""shu\x03""shi\x04""shaa\x02""qu\x02""qi\x03""qaa\x03""qee\x02""qe\x02""qo\x04""tzoa\x03""qwa\x02""fu\x03""qwi\x04""qwaa\x04""qwee\x03""qwe\x02""fo\x03""fwa\x03""qhi\x04""qhaa\x03""qho\x03""pwa\x04""qhwa\x03""mya\x02""bu\x02""bi\x03""baa\x03""bee\x02""be\x02""bo\x03""bwa\x02""vu\x02""vi\x03""vaa\x03""vee\x02""ve\x02""vo\x03""vwa\x02""tu\x03""taa\x03""tee\x02""te\x02""to\x03""twa\x02""cu\x02""ci\x03""caa\x03""cee\x02""ce\x02""co\x03""cwa\x02""xa\x02""xu\x02""xi\x03""xaa\x03""xee\x02""xe\x02""xo\x03""bwe\x03""xwa\x03""fwi\x03""xwi\x04""xwaa\x04""xwee\x03""xwe\x04""pwee\x03""pwe\x02""nu\x02""ni\x03""nee\x02""ne\x03""nwa\x03""nyu\x03""nyi\x04""nyaa\x04""nyee\x03""nye\x03""nyo\x04""nywa\x02""ku\x02""ki\x03""kaa\x03""kee\x02""ke\x03""kwa\x03""kwi\x04""kwaa\x04""kwee\x03""kwe\x03""kxa\x03""kxu\x03""kxi\x04""kxaa\x04""kxee\x03""kxe\x03""kxo\x03""hna\x04""kxwa\x04""kxwi\x05""kxwaa\x05""kxwee\x04""kxwe\x03""qua\x03""que\x02""wu\x03""waa\x03""wee\x02""wo\x02""sv\x02""di\x02""zu\x02""zi\x03""zaa\x03""zee\x02""zo\x03""zwa\x03""zhu\x03""zhi\x04""zhaa\x04""zhee\x03""zhe\x03""zho\x04""zhwa\x03""yaa\x03""yee\x02""du\x03""daa\x03""dee\x02""do\x03""dwa\x03""ddu\x02""ju\x02""ji\x03""jaa\x03""jee\x02""je\x02""jo\x02""gu\x02""gi\x03""gaa\x03""gee\x02""ge\x02""go\x03""gwa\x03""gwi\x04""gwaa\x04""gwee\x03""gwe\x03""ggu\x03""ggi\x04""ggaa\x04""ggee\x03""gge\x03""ggo\x03""thu\x03""thi\x04""thaa\x04""thee\x03""the\x04""thwa\x03""chu\x03""chi\x04""chaa\x04""chee\x03""che\x03""cho\x04""chwa\x03""phu\x03""phi\x04""phaa\x04""phee\x03""phe\x03""pho\x04""phwa\x03""tsu\x03""tsi\x04""tsaa\x04""tsee\x03""tse\x03""tso\x04""tswa\x03""tza\x03""tzu\x03""tzi\x04""tzaa\x04""tzee\x03""tze\x03""tzo\x03""faa\x03""fee\x02""fe\x02""pu\x02""pi\x03""paa\x03""pee\x02""pe\x02""po\x03""rya\x03""fya\x02""gv\x02""lv\x03""nah\x02""nv\x03""qui\x03""quo\x03""quu\x03""quv\x02""dv\x03""dla\x03""tla\x03""tle\x03""tli\x03""tlo\x03""tlu\x03""tlv\x03""tsv\x02""wv\x02""yv\x03""aai\x03""wii\x03""woo\x04""paai\x03""pii\x03""poo\x03""pwi\x04""pwii\x03""pwo\x04""pwoo\x04""pwaa\x04""taai\x03""tii\x03""too\x03""twe\x03""twi\x04""twii\x03""two\x04""twoo\x04""twaa\x03""tte\x03""tti\x03""tto\x04""kaai\x03""kii\x03""koo\x04""kwii\x03""kwo\x04""kwoo\x02""kw\x03""keh\x03""kih\x03""koh\x03""kah\x04""caai\x03""cii\x03""coo\x03""cwe\x03""cwi\x04""cwii\x03""cwo\x04""cwoo\x04""cwaa\x04""maai\x03""mii\x03""moo\x03""mwe\x03""mwi\x04""mwii\x03""mwo\x04""mwoo\x04""mwaa\x04""naai\x03""nii\x03""noo\x03""nwe\x04""nwaa\x04""laai\x03""lii\x03""loo\x03""lwe\x03""lwi\x04""lwii\x03""lwo\x04""lwoo\x04""lwaa\x04""saai\x03""sii\x03""soo\x03""swe\x03""swi\x04""swii\x03""swo\x04""swoo\x04""swaa\x02""sw\x03""skw\x04""spwa\x04""stwa\x04""skwa\x04""scwa\x04""shii\x04""shoo\x04""shwe\x04""shwi\x05""shwii\x04""shwo\x05""shwoo\x05""shwaa\x04""yaai\x03""yii\x03""yoo\x03""ywe\x03""ywi\x04""ywii\x03""ywo\x04""ywoo\x03""ywa\x04""ywaa\x04""raai\x03""rii\x03""roo\x04""rwaa\x04""faai\x03""fii\x03""foo\x04""fwaa\x04""thii\x04""thoo\x05""thwaa\x04""tthe\x04""tthi\x04""ttho\x03""tye\x03""tyi\x03""tyo\x03""tya\x03""hii\x03""hoo\x02""hk\x04""qaai\x03""qii\x03""qoo\x04""tlhe\x04""tlhi\x04""tlho\x04""tlha\x05""ngaai\x03""ngi\x04""ngii\x03""ngo\x04""ngoo\x04""ngaa\x03""lhi\x04""lhii\x03""lho\x04""lhoo\x04""lhaa\x03""ghu\x03""gho\x04""ghee\x03""ghi\x03""hwu\x03""hwo\x03""hwe\x04""hwee\x03""hwi\x03""hwa\x03""ttu\x04""ttee\x03""khu\x03""khe\x04""khee\x03""khi\x03""kku\x03""kko\x03""kke\x04""kkee\x03""kki\x02""kk\x03""jju\x03""jjo\x03""jje\x04""jjee\x03""jji\x03""dlu\x03""dlo\x03""dle\x04""dlee\x03""dli\x03""lhu\x03""lhe\x04""lhee\x04""tlhu\x05""tlhee\x04""tlee\x03""dzu\x03""dzo\x03""dze\x04""dzee\x03""dzi\x04""ttsu\x04""ttso\x04""ttse\x05""ttsee\x04""ttsi\x04""ttsa\x03""qai\x04""ngai\x04""nngi\x05""nngii\x04""nngo\x05""nngoo\x04""nnga\x05""nngaa\x03""sso\x02""ac\x03""ear\x03""ior\x08""boundary\x03""ang\x03""zra\x04""todo\x04""sibe\x06""manchu\x02""uk\x03""uuv\x02""ry\x03""ryy\x02""ly\x03""lyy\x02""ua\x02""kr\x03""yan\x09""mukphreng\x09""kemphreng\x04""sa-i\x02""eh\x03""aue\x05""tone-\x03""kva\x03""xva\x05""vowel\x03""aay\x02""uy\x03""oay\x03""uey\x02""iy\x05""final\x03""lae\x04""laev\x04""ngka\x03""mpa\x03""nra\x04""nyca\x03""ulu\x05""cecek\x06""surang\x05""bisah\x05""akara\x05""ikara\x05""ukara\x05""ekara\x06""aikara\x05""okara\x07""rerekan\x06""tedung\x04""suku\x06""taling\x05""pepet\x04""khot\x04""tzir\x02""ef\x03""zal\x06""asyura\x08""panyecek\x09""panglayar\x09""pangwisad\x09""pamingkal\x08""panyakra\x07""panyiku\x08""panghulu\x07""panyuku\x0a""panaelaeng\x08""panolong\x07""pamepet\x0a""paneuleung\x07""pamaaeh\x03""sya\x03""kla\x03""gla\x03""pla\x03""fla\x03""bla\x03""mla\x03""hla\x07""nyin-do\x04""kang\x03""ran\x02""at\x02""ag\x02""al\x03""aak\x03""aaj\x03""aam\x03""aaw\x02""is\x02""ih\x03""iny\x02""ir\x02""uc\x02""ud\x03""unn\x02""ep\x03""edd\x03""err\x03""ott\x02""ob\x02""ov\x02""oh\x07""capital\x04""open\x08""sideways\x03""top\x06""bottom\x06""voiced\x06""turned\x05""alpha\x05""schwa\x03""eng\x04""beta\x05""greek\x05""delta\x05""gamma\x03""rho\x08""cyrillic\x07""insular\x04""iota\x07""upsilon\x03""esh\x03""ezh\x03""eth\x08""reversed\x07""dotless\x06""script\x06""barred\x05""theta\x09""flattened\x02""av\x02""zr\x02""jy\x02""cy\x0c""middle-welsh\x07""epsilon\x03""eta\x07""omicron\x05""omega\x03"" ha\x03"" ga\x03"" zi\x04"" pai\x05"" yong\x05"" bing\x03""tie\x02""et\x03"" xi\x06"" zheng\x06"" chong\x05"" ping\x05"" shan\x06""shapes\x05"" xian\x04"" qia\x05"" jiao\x04"" jue\x04"" hui\x03"" li\x03"" mo\x04"" jin\x05"" zhuo\x04"" shu\x03"" ji\x03"" lu\x03"" le\x04"" you\x04"" sui\x04"" lan\x05"" peng\x03"" bi\x04"" nen\x04"" xia\x04"" zao\x03"" ti\x04"" jie\x04"" nao\x04"" shi\x04"" hua\x05"" lian\x05"" jian\x05"" beng\x06"" jiang\x05"" xing\x04"" bie\x04"" zai\x05"" chou\x04"" sou\x05"" niao\x04"" die\x06"" huang\x04"" dun\x03"" yi\x04"" tuo\x05"" jing\x04"" dai\x04"" cha\x04"" fen\x02""pp\x04"" wan\x04"" sao\x04"" xiu\x04"" gao\x04"" xue\x05"" weng\x03""ecu\x02""cl\x02""cr\x02""ff\x03""mil\x03""pts\x02""dr\x03"" fu\x04"" kou\x04"" chu\x04"" zhe\x03""iii\x02""iv\x03""vii\x04""viii\x02""ix\x03""xii\x05"" tian\x04"" suo\x04"" she\x06"" zhuan\x05"" tang\x06"" zhuai\x04"" yao\x03"" tu\x03"" mi\x05"" zhen\x04"" xie\x04"" lei\x04"" gai\x05"" juan\x05""above\x04"" qiu\x05"" ding\x04"" que\x03""and\x03"" ao\x04"" mei\x03"" ge\x04""with\x03"" qu\x04"" hou\x03""azu\x04""buky\x04""vede\x07""glagoli\x05""dobro\x05""yestu\x07""zhivete\x05""dzelo\x06""zemlja\x04""izhe\x07""initial\x06""djervi\x04""kako\x07""ljudije\x07""myslite\x05""nashi\x03""onu\x06""pokoji\x05""ritsi\x05""slovo\x06""tvrido\x03""uku\x05""fritu\x04""heru\x03""otu\x04""shta\x06""chrivi\x04""yeru\x04""yeri\x04""yati\x07""spidery\x03""yus\x07""iotated\x03""big\x04""fita\x07""izhitsa\x07""shtapic\x0a""trokutasti\x08""latinate\x08""tailless\x04""alfa\x04""vida\x05""dalda\x03""eie\x03""sou\x04""zata\x04""hate\x06""thethe\x05""iauda\x04""kapa\x05""laula\x03""ksi\x04""sima\x03""tau\x03""psi\x03""oou\x09""dialect-p\x03""old\x0d""cryptogrammic\x07""crossed\x08""akhmimic\x08""l-shaped\x03""yab\x04""yabh\x03""yag\x05""yaghh\x06""berber\x03""yaj\x03""yad\x04""yadh\x04""yadd\x05""yaddh\x03""yey\x03""yaf\x03""yak\x06""tuareg\x05""yakhh\x03""yah\x04""yahh\x04""yakh\x03""yaq\x04""yazh\x07""ahaggar\x03""yal\x03""yam\x03""yap\x04""yarr\x04""yagh\x04""ayer\x03""yas\x04""yass\x04""yash\x03""yat\x04""yath\x04""yach\x04""yatt\x03""yav\x03""yaw\x03""yay\x03""yaz\x0a""tawellemet\x04""yazz\x0d""labialization\x03""loa\x03""moa\x03""roa\x03""soa\x04""shoa\x03""boa\x03""toa\x03""coa\x03""noa\x04""nyoa\x03""zoa\x03""doa\x04""ddoa\x03""joa\x04""thoa\x04""choa\x04""phoa\x03""poa\x04""ggwa\x04""ggwi\x05""ggwee\x04""ggwe\x03""ssu\x03""ssi\x04""ssaa\x04""ssee\x03""sse\x03""cca\x03""ccu\x03""cci\x04""ccaa\x04""ccee\x03""cce\x03""cco\x03""zza\x03""zzu\x03""zzi\x04""zzaa\x04""zzee\x03""zze\x03""zzo\x04""ccha\x04""cchu\x04""cchi\x05""cchaa\x05""cchee\x04""cche\x04""ccho\x03""qya\x03""qyu\x03""qyi\x04""qyaa\x04""qyee\x03""qye\x03""qyo\x03""kya\x03""kyu\x03""kyi\x04""kyaa\x04""kyee\x03""kye\x03""kyo\x03""xya\x03""xyu\x03""xyi\x04""xyaa\x04""xyee\x03""xye\x03""xyo\x03""gya\x03""gyu\x03""gyi\x04""gyaa\x04""gyee\x03""gye\x03""gyo\x02""er\x02""es\x05""shcha\x05""es-te\x05""djerv\x09""monograph\x08""iotified\x06""little\x04""full\x08""surround\x08""overlaid\x02""gn\x06""kiyeok\x0b""ssangkiyeok\x0b""kiyeok-sios\x05""nieun\x0b""nieun-cieuc\x0b""nieun-hieuh\x06""tikeut\x0b""ssangtikeut\x05""rieul\x0c""rieul-kiyeok\x0b""rieul-mieum\x0b""rieul-pieup\x0a""rieul-sios\x0d""rieul-thieuth\x0d""rieul-phieuph\x0b""rieul-hieuh\x05""mieum\x05""pieup\x0a""ssangpieup\x0a""pieup-sios\x04""sios\x09""ssangsios\x05""ieung\x05""cieuc\x0a""ssangcieuc\x07""chieuch\x07""khieukh\x07""thieuth\x07""phieuph\x05""hieuh\x0a""ssangnieun\x10""rieul-pieup-sios\x0d""rieul-pansios\x11""rieul-yeorinhieuh\x0b""mieum-pieup\x0a""mieum-sios\x0d""mieum-pansios\x0d""kapyeounmieum\x0c""pieup-kiyeok\x0c""pieup-tikeut\x11""pieup-sios-kiyeok\x11""pieup-sios-tikeut\x0b""pieup-cieuc\x0d""pieup-thieuth\x0d""kapyeounpieup\x12""kapyeounssangpieup\x0b""sios-kiyeok\x0a""sios-nieun\x0b""sios-tikeut\x0a""sios-pieup\x0a""sios-cieuc\x07""pansios\x0a""ssangieung\x08""yesieung\x0d""yesieung-sios\x10""yesieung-pansios\x0f""kapyeounphieuph\x0a""ssanghieuh\x06""araeae\x03""enn\x03""onn\x03""ann\x03""inn\x02""im\x03""ngg\x04""ainn\x04""aunn\x03""ong\x04""innn\x05""ojeon\x06""chamko\x05""jueui\x04"" kua\x03"" wu\x04"" yin\x03"" si\x03"" ye\x04"" nuo\x03"" xu\x06"" xiong\x04"" liu\x04"" lin\x06"" xiang\x04"" xin\x04"" pan\x03"" ma\x05"" qian\x06"" zhong\x02"" n\x06"" cheng\x05"" fang\x04"" zuo\x05"" zhou\x05"" dong\x03"" su\x06"" jiong\x05"" wang\x04"" zhu\x05"" long\x05"" ying\x05"" miao\x03"" yu\x04"" luo\x05"" chai\x04"" hun\x04"" rao\x04"" han\x04"" tai\x03"" ai\x04"" jun\x02"" l\x05"" xiao\x05"" tiao\x04"" zha\x03"" ku\x03"" er\x05"" nang\x03"" qi\x04"" chi\x03"" mu\x03"" se\x06"" qiong\x03"" sa\x03"" pu\x03"" ta\x03"" ou\x05"" mian\x04"" wen\x05"" diao\x04"" mie\x05"" quan\x04"" cai\x06"" liang\x03"" gu\x04"" mao\x04"" gua\x04"" man\x05"" chui\x05"" huan\x05"" gong\x04"" nan\x05"" dian\x04"" yan\x03"" ci\x05"" lang\x03"" he\x04"" tou\x05"" pian\x02"" e\x04"" qie\x04"" rui\x05"" chan\x04"" dan\x04"" duo\x04"" fei\x05"" bang\x03"" ba\x05"" kuai\x05"" shen\x03"" pi\x05"" yang\x04"" bei\x04"" che\x05"" suan\x05"" heng\x04"" gui\x04"" lou\x04"" sun\x04"" zou\x04"" zhi\x04"" jia\x03"" hu\x03"" la\x03"" ke\x04"" wei\x05"" zhao\x04"" kui\x04"" fan\x06"" zhang\x05"" song\x04"" nei\x05"" chen\x04"" guo\x03"" ng\x03"" fa\x04"" hao\x04"" pou\x05"" hong\x04"" tun\x03"" bo\x04"" nie\x04"" wai\x05"" shou\x05"" ling\x04"" lun\x05"" chun\x04"" rou\x03"" ze\x06"" sheng\x04"" bai\x04"" gou\x03"" na\x03"" cu\x04"" kuo\x04"" lao\x04"" huo\x04"" sai\x05"" rong\x03"" ju\x04"" pao\x04"" can\x05"" nian\x05"" xuan\x04"" qin\x03"" bu\x05"" zang\x05"" mang\x04"" dui\x04"" bao\x06"" chang\x04"" gun\x05"" liao\x03"" da\x05"" meng\x05"" qiao\x05"" rang\x04"" yun\x04"" tao\x04"" lai\x04"" ban\x05"" chuo\x03"" nu\x04"" ran\x04"" sha\x04"" dou\x03"" po\x05"" tong\x06"" qiang\x04"" xun\x05"" pang\x04"" cao\x03"" an\x04"" mai\x04"" yue\x05"" huai\x04"" zan\x04"" hai\x05"" luan\x05"" ning\x03"" ya\x05"" ming\x04"" zui\x04"" cui\x03"" de\x05"" bian\x04"" nou\x04"" tui\x05"" zhan\x04"" cen\x04"" min\x03"" zu\x03"" ni\x04"" cuo\x04"" pei\x05"" gang\x05"" yuan\x05"" biao\x04"" dao\x04"" jiu\x04"" run\x03"" wo\x05"" cuan\x04"" ren\x04"" kai\x04"" men\x07"" chuang\x05"" feng\x05"" zhai\x03"" di\x04"" ben\x05"" zong\x05"" ceng\x05"" hang\x04"" nin\x05"" kong\x04"" lie\x06"" kuang\x04"" san\x03"" te\x05"" shun\x03"" ce\x04"" ang\x03"" ru\x07"" shuang\x05"" guai\x03"" wa\x05"" shai\x05"" tuan\x05"" piao\x04"" kun\x04"" qun\x06"" chuai\x05"" shao\x05"" duan\x04"" gen\x06"" guang\x04"" cou\x05"" nuan\x05"" reng\x04"" mou\x04"" nai\x05"" guan\x04"" hen\x06"" chuan\x05"" kuan\x05"" qing\x04"" pin\x05"" kang\x03"" du\x05"" neng\x04"" tan\x05"" cang\x05"" chao\x05"" nong\x04"" kan\x04"" ken\x05"" ting\x04"" gan\x04"" niu\x05"" ruan\x05"" cong\x05"" zeng\x05"" shui\x05"" geng\x05"" shuo\x05"" zuan\x05"" zhui\x03"" en\x05"" leng\x04"" cun\x03"" ne\x04"" bin\x04"" ruo\x04"" kao\x05"" dang\x05"" teng\x03"" ri\x05"" deng\x03"" za\x06"" niang\x03"" ca\x05"" sang\x05"" keng\x06"" shuai\x04"" pie\x04"" tie\x06"" shuan\x05"" chua\x04"" zen\x06"" shang\x03"" pa\x04"" fou\x04"" diu\x03"" fo\x03"" ka\x04"" lia\x04"" zun\x05"" seng\x05"" zhun\x06"" zhuen\x05"" shua\x02"" a\x04"" pen\x02"" m\x04"" gem\x03"" yo\x03"" re\x04"" dia\x04""inch\x06""gallon\x04""giga\x06""guinea\x08""kilogram\x08""kilowatt\x07""gramton\x06""koruna\x08""shilling\x05""dozen\x04""desi\x06""dollar\x07""percent\x08""building\x05""farad\x05""franc\x07""hectare\x04""peso\x07""pfennig\x05""point\x03""hon\x05""micro\x04""mile\x04""mark\x06""micron\x05""rupee\x05""ruble\x03""rem\x08""roentgen\x05""meiji\x02""gb\x03""cal\x02""pf\x09""microgram\x02""hz\x03""khz\x02""mm\x03""ms2\x03""kpa\x03""gpa\x05""rads2\x02""mv\x02""nw\x02""cc\x02""cd\x02""gy\x03""mol\x07"" zhuang\x04"" zei\x02"" t\x05"" zhua\x04"" sen\x04"" hei\x04"" hal\x06"" ppwun\x04"" nay\x04"" yai\x06"" sasou\x04"" kes\x05"" saai\x05"" haai\x03"" so\x07"" akutsu\x05"" gake\x05"" gomi\x04"" ama\x04"" sho\x04"" ten\x04"" gei\x03"" ki\x04"" lue\x04"" miu\x05"" moku\x06"" tochi\x06"" kasei\x07"" kunugi\x06"" hazou\x08"" katsura\x05"" tamo\x0a"" shitamizu\x07"" shibui\x05"" tani\x05"" suei\x05"" diou\x08"" oozutsu\x0d"" tsumekanmuri\x04"" swu\x0c"" deshiguramu\x0b"" miriguramu\x0b"" hekutogura\x07"" tatamu\x04"" nue\x07"" utsubo\x02"" o\x04"" sik\x07"" sasara\x05"" yana\x03""bup\x05"" hata\x03""pap\x04""purx\x05"" kuji\x08"" shinshi\x04""nbap\x05"" kume\x04""nbyx\x09"" nukamiso\x03"" ro\x04""hmyx\x05""hmyrx\x07"" sukumo\x06"" kouji\x05"" kinu\x05"" wata\x04"" sok\x05"" kase\x06"" yingl\x07"" kasuri\x05"" nawa\x07"" odoshi\x05"" horo\x04"" sem\x05"" jung\x03"" un\x04""zzyr\x08"" kaakeru\x04""ssyt\x04""zhux\x09"" yashinau\x03""jyt\x03""qie\x04""njup\x04""nyuo\x08"" shikato\x03""xie\x0a"" tsuraneru\x03""een\x04""ween\x04""bhee\x04""mbee\x04""kpee\x05""mgbee\x04""gbee\x04""dhee\x05""dhhee\x04""ndee\x04""njee\x05""nggee\x03""hin\x03""win\x03""bhi\x03""mbi\x03""kpi\x04""mgbi\x03""gbi\x03""dhi\x04""dhhi\x03""ndi\x03""nji\x04""nggi\x04""ngan\x03""han\x03""wan\x03""mba\x04""kpan\x04""mgba\x04""dhha\x03""nda\x03""nja\x04""ngga\x03""oon\x04""woon\x04""bhoo\x03""boo\x04""mboo\x04""kpoo\x05""mgboo\x04""gboo\x03""voo\x04""dhoo\x05""dhhoo\x03""doo\x04""ndoo\x03""zoo\x04""zhoo\x03""joo\x04""njoo\x05""nggoo\x03""goo\x04""nyoo\x03""hun\x03""wun\x03""bhu\x03""mbu\x03""kpu\x04""mgbu\x03""gbu\x03""dhu\x04""dhhu\x03""ndu\x03""nju\x04""nggu\x04""ngon\x03""won\x03""bho\x03""mbo\x03""kpo\x04""mgbo\x03""gbo\x04""gbon\x03""dho\x04""dhho\x03""ndo\x03""njo\x04""nggo\x04""ngen\x03""hen\x03""wen\x03""bhe\x03""mbe\x03""kpe\x04""kpen\x04""mgbe\x03""gbe\x04""gben\x03""dhe\x04""dhhe\x03""nde\x04""ngge\x05""nggen\x03""gen\x0a""lengthener\x05""ndole\x06""zemlya\x05""broad\x07""neutral\x06""closed\x07""blended\x04""soft\x09""monocular\x09""binocular\x06""double\x0b""multiocular\x03""dwe\x04""dzwe\x04""zhwe\x04""dzze\x04""tswe\x04""tsse\x04""tche\x07""chinese\x06""dotted\x09""left-stem\x05""lower\x08""inverted\x06""stress\x0d""egyptological\x04""heng\x02""tz\x08""tresillo\x09""cuatrillo\x06""broken\x03""rum\x02""vy\x0a""visigothic\x05""thorn\x04""vend\x03""con\x02""us\x03""dum\x03""lum\x03""mum\x03""num\x03""tum\x02""um\x0a""circumflex\x05""colon\x06""equals\x08""saltillo\x08""dvisvara\x07""hasanta\x03""jho\x04""ddho\x03""rro\x09""alternate\x09""voiceless\x09""aspirated\x05""haaru\x03""hta\x04""shya\x04""nyja\x02""ea\x04""ngue\x04""chha\x04""nhue\x03""nha\x04""nhja\x03""nue\x03""ppa\x03""mue\x0b"" obiyaakasu\x04"" noy\x05"" tara\x07"" yadoru\x07"" hesaki\x04""gyon\x05"" sori\x07"" yofune\x05"" susa\x06"" usagi\x04"" nuc\x0b"" kutabireru\x05"" yaji\x07"" sonoko\x04"" hie\x04""nyan\x05"" hagi\x04"" ebi\x09"" kamakiri\x03""dab\x0a"" kamishimo\x05"" yuki\x04"" ena\x06"" hitoe\x08"" chihaya\x07"" tasuki\x08"" yasashi\x03""ren\x03""roe\x07"" segare\x06"" nerau\x07"" utsuke\x03""rim\x09"" shitsuke\x07"" yagate\x07"" suberu\x04"" sip\x03"" ip\x07"" totemo\x04"" kep\x05"" sako\x07"" appare\x06"" otoko\x0b"" sakenomoto\x09"" ishiyumi\x07"" habaki\x06"" irori\x06"" ngaak\x08"" kasugai\x06"" pyeng\x04""byun\x07"" kazari\x05"" yari\x05"" yuru\x07"" phwung\x04""song\x05"" tomo\x07"" kohaze\x03"" on\x07"" oroshi\x05"" shuu\x04"" eri\x07"" namazu\x05"" todo\x07"" kajika\x03""yon\x05"" bora\x05"" mate\x05"" gori\x05"" ugui\x06"" asari\x0a"" subashiri\x09"" kazunoko\x07"" shachi\x06"" dojou\x08"" sukesou\x08"" muroaji\x07"" haraka\x02"" z\x09"" hatahata\x04"" eso\x05"" kyou\x07"" shiira\x06"" mutsu\x04"" nio\x05"" yiao\x06"" shigi\x08"" chidori\x05"" toki\x08"" ikaruga\x07"" kakesu\x06"" isuka\x0c"" kikuitadaki\x08"" tsugumi\x04""jjog\x04""jjon\x04""jjol\x04""jjom\x04""jjob\x04""jjos\x05""jjong\x04""jjoc\x04""jjwa\x05""jjwag\x05""jjwal\x06""jjwass\x05""jjwae\x02""it\x02""ip\x03""iet\x03""iex\x03""iep\x02""ax\x02""ap\x03""uox\x02""uo\x03""uop\x02""ox\x02""op\x02""ex\x03""bit\x03""bix\x03""bip\x04""biet\x04""biex\x03""bie\x04""biep\x03""bat\x03""bax\x03""bap\x04""buox\x03""buo\x04""buop\x03""bot\x03""box\x03""bop\x03""bex\x03""bep\x03""but\x03""bux\x04""burx\x03""bur\x03""byt\x03""byx\x02""by\x03""byp\x04""byrx\x03""byr\x03""pit\x03""pix\x03""pip\x04""piex\x03""pie\x04""piep\x03""pat\x03""pax\x04""puox\x03""puo\x04""puop\x03""pot\x03""pox\x03""pop\x03""put\x03""pux\x03""pup\x03""pur\x03""pyt\x03""pyx\x02""py\x03""pyp\x04""pyrx\x03""pyr\x04""bbit\x04""bbix\x03""bbi\x04""bbip\x05""bbiet\x05""bbiex\x04""bbie\x05""bbiep\x04""bbat\x04""bbax\x04""bbap\x05""bbuox\x04""bbuo\x05""bbuop\x04""bbot\x04""bbox\x03""bbo\x04""bbop\x04""bbex\x03""bbe\x04""bbep\x04""bbut\x04""bbux\x03""bbu\x04""bbup\x05""bburx\x04""bbur\x04""bbyt\x04""bbyx\x03""bby\x04""bbyp\x04""nbit\x04""nbix\x03""nbi\x04""nbip\x05""nbiex\x04""nbie\x05""nbiep\x04""nbat\x04""nbax\x03""nba\x04""nbot\x04""nbox\x03""nbo\x04""nbop\x04""nbut\x04""nbux\x03""nbu\x04""nbup\x05""nburx\x04""nbur\x04""nbyt\x03""nby\x04""nbyp\x05""nbyrx\x04""nbyr\x04""hmit\x04""hmix\x03""hmi\x04""hmip\x05""hmiex\x04""hmie\x05""hmiep\x04""hmat\x04""hmax\x03""hma\x04""hmap\x05""hmuox\x04""hmuo\x05""hmuop\x04""hmot\x04""hmox\x03""hmo\x04""hmop\x04""hmut\x04""hmux\x03""hmu\x04""hmup\x05""hmurx\x04""hmur\x03""hmy\x04""hmyp\x04""hmyr\x03""mit\x03""mix\x03""mip\x04""miex\x03""mie\x04""miep\x03""mat\x03""max\x03""map\x04""muot\x04""muox\x03""muo\x04""muop\x03""mot\x03""mox\x03""mop\x03""mex\x03""mut\x03""mux\x03""mup\x04""murx\x03""mur\x03""myt\x03""myx\x02""my\x03""myp\x03""fit\x03""fix\x03""fip\x03""fat\x03""fax\x03""fap\x03""fox\x03""fop\x03""fut\x03""fux\x03""fup\x04""furx\x03""fur\x03""fyt\x03""fyx\x02""fy\x03""fyp\x03""vit\x03""vix\x03""vip\x04""viet\x04""viex\x03""vie\x04""viep\x03""vat\x03""vax\x03""vap\x03""vot\x03""vox\x03""vop\x03""vex\x03""vep\x03""vut\x03""vux\x03""vup\x04""vurx\x03""vur\x03""vyt\x03""vyx\x03""vyp\x04""vyrx\x03""vyr\x03""dit\x03""dix\x03""dip\x04""diex\x03""die\x04""diep\x03""dat\x03""dax\x03""dap\x04""duox\x03""duo\x03""dox\x03""dop\x03""dex\x03""dep\x03""dut\x03""dux\x03""dup\x04""durx\x03""dur\x03""tit\x03""tix\x03""tip\x04""tiex\x04""tiep\x03""tat\x03""tax\x03""tap\x04""tuot\x04""tuox\x03""tuo\x04""tuop\x03""tot\x03""tox\x03""tex\x03""tep\x03""tut\x03""tux\x03""tup\x04""turx\x03""tur\x04""ddit\x04""ddix\x04""ddip\x05""ddiex\x04""ddie\x05""ddiep\x04""ddat\x04""ddax\x04""ddap\x05""dduox\x04""dduo\x05""dduop\x04""ddot\x04""ddox\x04""ddop\x04""ddex\x04""ddep\x04""ddut\x04""ddux\x04""ddup\x05""ddurx\x04""ddur\x04""ndit\x04""ndix\x04""ndip\x05""ndiex\x04""ndie\x04""ndat\x04""ndax\x04""ndap\x04""ndot\x04""ndox\x04""ndop\x04""ndex\x04""ndep\x04""ndut\x04""ndux\x04""ndup\x05""ndurx\x04""ndur\x04""hnit\x04""hnix\x03""hni\x04""hnip\x05""hniet\x05""hniex\x04""hnie\x05""hniep\x04""hnat\x04""hnax\x04""hnap\x05""hnuox\x04""hnuo\x04""hnot\x04""hnox\x04""hnop\x04""hnex\x03""hne\x04""hnep\x04""hnut\x03""nit\x03""nix\x03""nip\x04""niex\x03""nie\x04""niep\x03""nax\x03""nap\x04""nuox\x03""nuo\x04""nuop\x03""not\x03""nox\x03""nop\x03""nex\x03""nep\x03""nut\x03""nux\x03""nup\x04""nurx\x03""nur\x04""hlit\x04""hlix\x03""hli\x04""hlip\x05""hliex\x04""hlie\x05""hliep\x04""hlat\x04""hlax\x04""hlap\x05""hluox\x04""hluo\x05""hluop\x04""hlox\x03""hlo\x04""hlop\x04""hlex\x03""hle\x04""hlep\x04""hlut\x04""hlux\x03""hlu\x04""hlup\x05""hlurx\x04""hlur\x04""hlyt\x04""hlyx\x03""hly\x04""hlyp\x05""hlyrx\x04""hlyr\x03""lit\x03""lix\x03""lip\x04""liet\x04""liex\x03""lie\x04""liep\x03""lat\x03""lax\x03""lap\x04""luot\x04""luox\x03""luo\x04""luop\x03""lot\x03""lox\x03""lop\x03""lex\x03""lep\x03""lut\x03""lux\x03""lup\x04""lurx\x03""lur\x03""lyt\x03""lyx\x03""lyp\x04""lyrx\x03""lyr\x03""git\x03""gix\x03""gip\x04""giet\x04""giex\x03""gie\x04""giep\x03""gat\x03""gax\x03""gap\x04""guot\x04""guox\x03""guo\x04""guop\x03""got\x03""gox\x03""gop\x03""get\x03""gex\x03""gep\x03""gut\x03""gux\x03""gup\x04""gurx\x03""gur\x03""kit\x03""kix\x03""kip\x04""kiex\x03""kie\x04""kiep\x03""kat\x03""kax\x03""kap\x04""kuox\x03""kuo\x04""kuop\x03""kot\x03""kox\x03""kop\x03""ket\x03""kex\x03""kep\x03""kut\x03""kux\x03""kup\x04""kurx\x03""kur\x04""ggit\x04""ggix\x05""ggiex\x04""ggie\x05""ggiep\x04""ggat\x04""ggax\x04""ggap\x05""gguot\x05""gguox\x04""gguo\x05""gguop\x04""ggot\x04""ggox\x04""ggop\x04""gget\x04""ggex\x04""ggep\x04""ggut\x04""ggux\x04""ggup\x05""ggurx\x04""ggur\x05""mgiex\x04""mgie\x04""mgat\x04""mgax\x03""mga\x04""mgap\x05""mguox\x04""mguo\x05""mguop\x04""mgot\x04""mgox\x03""mgo\x04""mgop\x04""mgex\x03""mge\x04""mgep\x04""mgut\x04""mgux\x03""mgu\x04""mgup\x05""mgurx\x04""mgur\x04""hxit\x04""hxix\x03""hxi\x04""hxip\x05""hxiet\x05""hxiex\x04""hxie\x05""hxiep\x04""hxat\x04""hxax\x03""hxa\x04""hxap\x05""hxuot\x05""hxuox\x04""hxuo\x05""hxuop\x04""hxot\x04""hxox\x03""hxo\x04""hxop\x04""hxex\x03""hxe\x04""hxep\x05""ngiex\x04""ngie\x05""ngiep\x04""ngat\x04""ngax\x04""ngap\x05""nguot\x05""nguox\x04""nguo\x04""ngot\x04""ngox\x04""ngop\x04""ngex\x03""nge\x04""ngep\x03""hit\x04""hiex\x03""hat\x03""hax\x03""hap\x04""huot\x04""huox\x03""huo\x04""huop\x03""hot\x03""hox\x03""hop\x03""hex\x03""hep\x03""wat\x03""wax\x03""wap\x04""wuox\x03""wuo\x04""wuop\x03""wox\x03""wop\x03""wex\x03""wep\x03""zit\x03""zix\x03""zip\x04""ziex\x03""zie\x04""ziep\x03""zat\x03""zax\x03""zap\x04""zuox\x03""zuo\x04""zuop\x03""zot\x03""zox\x03""zop\x03""zex\x03""zep\x03""zut\x03""zux\x03""zup\x04""zurx\x03""zur\x03""zyt\x03""zyx\x02""zy\x03""zyp\x04""zyrx\x03""zyr\x03""cit\x03""cix\x03""cip\x04""ciet\x04""ciex\x03""cie\x04""ciep\x03""cat\x03""cax\x03""cap\x04""cuox\x03""cuo\x04""cuop\x03""cot\x03""cox\x03""cop\x03""cex\x03""cep\x03""cut\x03""cux\x03""cup\x04""curx\x03""cur\x03""cyt\x03""cyx\x03""cyp\x04""cyrx\x03""cyr\x04""zzit\x04""zzix\x04""zzip\x05""zziet\x05""zziex\x04""zzie\x05""zziep\x04""zzat\x04""zzax\x04""zzap\x04""zzox\x04""zzop\x04""zzex\x04""zzep\x04""zzux\x04""zzup\x05""zzurx\x04""zzur\x04""zzyt\x04""zzyx\x03""zzy\x04""zzyp\x05""zzyrx\x04""nzit\x04""nzix\x03""nzi\x04""nzip\x05""nziex\x04""nzie\x05""nziep\x04""nzat\x04""nzax\x03""nza\x04""nzap\x05""nzuox\x04""nzuo\x04""nzox\x04""nzop\x04""nzex\x03""nze\x04""nzux\x03""nzu\x04""nzup\x05""nzurx\x04""nzur\x04""nzyt\x04""nzyx\x03""nzy\x04""nzyp\x05""nzyrx\x04""nzyr\x03""sit\x03""six\x03""sip\x04""siex\x03""sie\x04""siep\x03""sat\x03""sax\x03""sap\x04""suox\x03""suo\x04""suop\x03""sot\x03""sox\x03""sop\x03""sex\x03""sep\x03""sut\x03""sux\x03""sup\x04""surx\x03""sur\x03""syt\x03""syx\x02""sy\x03""syp\x04""syrx\x03""syr\x04""ssit\x04""ssix\x04""ssip\x05""ssiex\x04""ssie\x05""ssiep\x04""ssat\x04""ssax\x04""ssap\x04""ssot\x04""ssox\x04""ssop\x04""ssex\x04""ssep\x04""ssut\x04""ssux\x04""ssup\x04""ssyx\x03""ssy\x04""ssyp\x05""ssyrx\x04""ssyr\x04""zhat\x04""zhax\x04""zhap\x05""zhuox\x04""zhuo\x05""zhuop\x04""zhot\x04""zhox\x04""zhop\x04""zhet\x04""zhex\x04""zhep\x04""zhut\x04""zhup\x05""zhurx\x04""zhur\x04""zhyt\x04""zhyx\x03""zhy\x04""zhyp\x05""zhyrx\x04""zhyr\x04""chat\x04""chax\x04""chap\x05""chuot\x05""chuox\x04""chuo\x05""chuop\x04""chot\x04""chox\x04""chop\x04""chet\x04""chex\x04""chep\x04""chux\x04""chup\x05""churx\x04""chur\x04""chyt\x04""chyx\x03""chy\x04""chyp\x05""chyrx\x04""chyr\x04""rrax\x05""rruox\x04""rruo\x04""rrot\x04""rrox\x04""rrop\x04""rret\x04""rrex\x03""rre\x04""rrep\x04""rrut\x04""rrux\x03""rru\x04""rrup\x05""rrurx\x04""rrur\x04""rryt\x04""rryx\x03""rry\x04""rryp\x05""rryrx\x04""rryr\x04""nrat\x04""nrax\x04""nrap\x04""nrox\x03""nro\x04""nrop\x04""nret\x04""nrex\x03""nre\x04""nrep\x04""nrut\x04""nrux\x03""nru\x04""nrup\x05""nrurx\x04""nrur\x04""nryt\x04""nryx\x03""nry\x04""nryp\x05""nryrx\x04""nryr\x04""shat\x04""shax\x04""shap\x05""shuox\x04""shuo\x05""shuop\x04""shot\x04""shox\x04""shop\x04""shet\x04""shex\x04""shep\x04""shut\x04""shux\x04""shup\x05""shurx\x04""shur\x04""shyt\x04""shyx\x03""shy\x04""shyp\x05""shyrx\x04""shyr\x03""rat\x03""rax\x03""rap\x04""ruox\x03""ruo\x04""ruop\x03""rot\x03""rox\x03""rop\x03""rex\x03""rep\x03""rut\x03""rux\x03""rup\x04""rurx\x03""rur\x03""ryt\x03""ryx\x03""ryp\x04""ryrx\x03""ryr\x03""jit\x03""jix\x03""jip\x04""jiet\x04""jiex\x03""jie\x04""jiep\x04""juot\x04""juox\x03""juo\x04""juop\x03""jot\x03""jox\x03""jop\x03""jut\x03""jux\x03""jup\x04""jurx\x03""jur\x03""jyx\x03""jyp\x04""jyrx\x03""jyr\x03""qit\x03""qix\x03""qip\x04""qiet\x04""qiex\x04""qiep\x04""quot\x04""quox\x04""quop\x03""qot\x03""qox\x03""qop\x03""qut\x03""qux\x03""qup\x04""qurx\x03""qur\x03""qyt\x03""qyx\x02""qy\x03""qyp\x04""qyrx\x03""qyr\x04""jjit\x04""jjix\x04""jjip\x05""jjiet\x05""jjiex\x04""jjie\x05""jjiep\x05""jjuox\x04""jjuo\x05""jjuop\x04""jjot\x04""jjox\x04""jjop\x04""jjut\x04""jjux\x04""jjup\x05""jjurx\x04""jjur\x04""jjyt\x04""jjyx\x03""jjy\x04""jjyp\x04""njit\x04""njix\x04""njip\x05""njiet\x05""njiex\x04""njie\x05""njiep\x05""njuox\x04""njuo\x04""njot\x04""njox\x04""njop\x04""njux\x05""njurx\x04""njur\x04""njyt\x04""njyx\x03""njy\x04""njyp\x05""njyrx\x04""njyr\x04""nyit\x04""nyix\x04""nyip\x05""nyiet\x05""nyiex\x04""nyie\x05""nyiep\x05""nyuox\x05""nyuop\x04""nyot\x04""nyox\x04""nyop\x04""nyut\x04""nyux\x04""nyup\x03""xit\x03""xix\x03""xip\x04""xiet\x04""xiex\x04""xiep\x04""xuox\x03""xuo\x03""xot\x03""xox\x03""xop\x03""xyt\x03""xyx\x02""xy\x03""xyp\x04""xyrx\x03""xyr\x03""yit\x03""yix\x03""yip\x04""yiet\x04""yiex\x03""yie\x04""yiep\x04""yuot\x04""yuox\x03""yuo\x04""yuop\x03""yot\x03""yox\x03""yop\x03""yut\x03""yux\x03""yup\x04""yurx\x03""yur\x03""yyt\x03""yyx\x03""yyp\x04""yyrx\x03""yyr\x03""kug\x03""kun\x03""kul\x03""kum\x03""kub\x03""kus\x04""kung\x04""kweo\x05""kweon\x05""kweol\x06""kweong\x05""kweng\x04""kwig\x04""kwin\x04""kwil\x04""kwim\x04""kwib\x04""kwis\x05""kwing\x04""kyun\x04""kyul\x04""kyum\x03""keu\x04""keug\x04""keun\x04""keul\x04""keum\x04""keub\x05""keung\x03""kig\x03""kin\x03""kil\x03""kim\x03""kib\x03""kis\x04""king\x03""tag\x03""tal\x04""talg\x03""tam\x03""tab\x03""tas\x04""tass\x04""tang\x03""tae\x04""taeg\x04""taen\x04""tael\x04""taem\x04""taeb\x04""taes\x05""taess\x05""taeng\x05""tyang\x03""teo\x04""teog\x04""teon\x04""teol\x05""teolm\x04""teom\x04""teob\x04""teos\x05""teoss\x05""teong\x03""teg\x03""ten\x03""tel\x03""tem\x03""teb\x03""tes\x04""teng\x04""tyeo\x05""tyeon\x06""tyeoss\x04""tyen\x03""tog\x03""ton\x03""tol\x03""tom\x03""tob\x03""tos\x04""tong\x04""twan\x04""twae\x03""toe\x04""toen\x04""toes\x05""toeng\x03""tug\x03""tun\x03""tul\x03""tub\x03""tus\x04""tung\x04""tweo\x06""tweoss\x04""twig\x04""twin\x04""twil\x04""twim\x04""twib\x05""twing\x03""tyu\x04""tyun\x04""tyul\x04""tyum\x05""tyung\x03""teu\x04""teug\x04""teun\x04""teud\x04""teul\x05""teulm\x04""teum\x04""teub\x04""teus\x04""tyin\x04""tyil\x04""tyim\x04""tyib\x03""tig\x03""tin\x03""til\x03""tim\x03""tib\x03""tis\x04""ting\x03""pag\x04""pagg\x03""pan\x03""pal\x04""palm\x03""pam\x03""pab\x03""pas\x04""pass\x04""pang\x03""pae\x04""paeg\x04""paen\x04""pael\x04""paem\x04""paeb\x04""paes\x05""paess\x05""paeng\x03""pya\x04""pyag\x03""peo\x04""peog\x04""peon\x04""peol\x04""peom\x04""peob\x04""peos\x05""peoss\x05""peong\x03""peg\x03""pen\x03""pel\x03""pem\x03""peb\x03""pes\x04""peng\x04""pyeo\x05""pyeon\x05""pyeol\x05""pyeom\x05""pyeob\x06""pyeoss\x06""pyeong\x03""pye\x04""pyel\x04""pyeb\x04""pyes\x03""pog\x03""pon\x03""pol\x03""pom\x03""pob\x03""pos\x04""pong\x05""pwang\x03""poe\x04""poen\x03""pyo\x04""pyon\x04""pyol\x04""pyob\x04""pyos\x03""pug\x03""pun\x03""pud\x03""pul\x04""pulm\x03""pum\x03""pub\x03""pus\x04""pung\x04""pweo\x06""pweong\x04""pwin\x04""pwil\x04""pwim\x04""pwis\x03""pyu\x04""pyun\x04""pyul\x04""pyum\x04""pyus\x05""pyung\x03""peu\x04""peun\x04""peul\x04""peum\x04""peub\x04""peus\x03""pig\x03""pin\x03""pil\x03""pim\x03""pib\x03""pis\x04""ping\x03""hag\x03""hal\x04""halt\x03""ham\x03""hab\x03""has\x04""hang\x04""haeg\x04""haen\x04""hael\x04""haem\x04""haeb\x04""haes\x05""haess\x05""haeng\x03""hya\x05""hyang\x03""heo\x04""heog\x04""heon\x04""heol\x05""heolm\x04""heom\x04""heob\x04""heos\x05""heong\x03""heg\x03""hel\x03""hem\x03""heb\x03""hes\x04""hyeo\x05""hyeog\x05""hyeon\x05""hyeol\x05""hyeom\x05""hyeob\x05""hyeos\x06""hyeoss\x06""hyeong\x03""hye\x04""hyen\x04""hyel\x04""hyeb\x03""hog\x03""hol\x04""holt\x03""hom\x03""hob\x03""hos\x04""hong\x04""hwag\x04""hwan\x04""hwal\x04""hwas\x05""hwang\x04""hwae\x05""hwaeg\x05""hwaen\x05""hwaes\x06""hwaeng\x04""hoeg\x04""hoen\x04""hoel\x04""hoeb\x04""hoes\x05""hoeng\x03""hyo\x04""hyon\x04""hyol\x04""hyob\x04""hyos\x03""hug\x03""hul\x04""hult\x03""hum\x03""hus\x04""hung\x04""hweo\x05""hweon\x05""hweol\x05""hweom\x06""hweong\x04""hweg\x03""gag\x04""gagg\x04""gags\x04""ganj\x04""ganh\x03""gad\x03""gal\x04""galg\x04""galm\x04""galb\x04""gals\x04""galt\x04""galp\x04""galh\x03""gam\x03""gab\x04""gabs\x03""gas\x04""gass\x04""gang\x03""gaj\x03""gac\x03""gak\x03""gah\x03""gae\x04""gaeg\x05""gaegg\x05""gaegs\x04""gaen\x05""gaenj\x05""gaenh\x04""gaed\x04""gael\x05""gaelg\x05""gaelm\x05""gaelb\x05""gaels\x05""gaelt\x05""gaelp\x05""gaelh\x04""gaem\x04""gaeb\x05""gaebs\x04""gaes\x05""gaess\x05""gaeng\x04""gaej\x04""gaec\x04""gaek\x04""gaet\x04""gaep\x04""gaeh\x04""gyag\x05""gyagg\x05""gyags\x04""gyan\x05""gyanj\x05""gyanh\x04""gyad\x04""gyal\x05""gyalg\x05""gyalm\x05""gyalb\x05""gyals\x05""gyalt\x05""gyalp\x05""gyalh\x04""gyam\x04""gyab\x05""gyabs\x04""gyas\x05""gyass\x05""gyang\x04""gyaj\x04""gyac\x04""gyak\x04""gyat\x04""gyap\x04""gyah\x04""gyae\x05""gyaeg\x06""gyaegg\x06""gyaegs\x05""gyaen\x06""gyaenj\x06""gyaenh\x05""gyaed\x05""gyael\x06""gyaelg\x06""gyaelm\x06""gyaelb\x06""gyaels\x06""gyaelt\x06""gyaelp\x06""gyaelh\x05""gyaem\x05""gyaeb\x06""gyaebs\x05""gyaes\x06""gyaess\x06""gyaeng\x05""gyaej\x05""gyaec\x05""gyaek\x05""gyaet\x05""gyaep\x05""gyaeh\x04""geog\x05""geogg\x05""geogs\x04""geon\x05""geonj\x05""geonh\x04""geod\x04""geol\x05""geolg\x05""geolm\x05""geolb\x05""geols\x05""geolt\x05""geolp\x05""geolh\x04""geom\x04""geob\x05""geobs\x04""geos\x05""geoss\x05""geong\x04""geoj\x04""geoc\x04""geok\x04""geot\x04""geop\x04""geoh\x03""geg\x04""gegg\x04""gegs\x04""genj\x04""genh\x03""ged\x03""gel\x04""gelg\x04""gelm\x04""gelb\x04""gels\x04""gelt\x04""gelp\x04""gelh\x03""gem\x03""geb\x04""gebs\x03""ges\x04""gess\x04""geng\x03""gej\x03""gec\x03""gek\x03""geh\x04""gyeo\x05""gyeog\x06""gyeogg\x06""gyeogs\x05""gyeon\x06""gyeonj\x06""gyeonh\x05""gyeod\x05""gyeol\x06""gyeolg\x06""gyeolm\x06""gyeolb\x06""gyeols\x06""gyeolt\x06""gyeolp\x06""gyeolh\x05""gyeom\x05""gyeob\x06""gyeobs\x05""gyeos\x06""gyeoss\x06""gyeong\x05""gyeoj\x05""gyeoc\x05""gyeok\x05""gyeot\x05""gyeop\x05""gyeoh\x04""gyeg\x05""gyegg\x05""gyegs\x04""gyen\x05""gyenj\x05""gyenh\x04""gyed\x04""gyel\x05""gyelg\x05""gyelm\x05""gyelb\x05""gyels\x05""gyelt\x05""gyelp\x05""gyelh\x04""gyem\x04""gyeb\x05""gyebs\x04""gyes\x05""gyess\x05""gyeng\x04""gyej\x04""gyec\x04""gyek\x04""gyet\x04""gyep\x04""gyeh\x03""gog\x04""gogg\x04""gogs\x03""gon\x04""gonj\x04""gonh\x03""god\x03""gol\x04""golg\x04""golm\x04""golb\x04""gols\x04""golt\x04""golp\x04""golh\x03""gom\x03""gob\x04""gobs\x03""gos\x04""goss\x04""gong\x03""goj\x03""goc\x03""gok\x03""goh\x04""gwag\x05""gwagg\x05""gwags\x04""gwan\x05""gwanj\x05""gwanh\x04""gwad\x04""gwal\x05""gwalg\x05""gwalm\x05""gwalb\x05""gwals\x05""gwalt\x05""gwalp\x05""gwalh\x04""gwam\x04""gwab\x05""gwabs\x04""gwas\x05""gwass\x05""gwang\x04""gwaj\x04""gwac\x04""gwak\x04""gwat\x04""gwap\x04""gwah\x04""gwae\x05""gwaeg\x06""gwaegg\x06""gwaegs\x05""gwaen\x06""gwaenj\x06""gwaenh\x05""gwaed\x05""gwael\x06""gwaelg\x06""gwaelm\x06""gwaelb\x06""gwaels\x06""gwaelt\x06""gwaelp\x06""gwaelh\x05""gwaem\x05""gwaeb\x06""gwaebs\x05""gwaes\x06""gwaess\x06""gwaeng\x05""gwaej\x05""gwaec\x05""gwaek\x05""gwaet\x05""gwaep\x05""gwaeh\x03""goe\x04""goeg\x05""goegg\x05""goegs\x04""goen\x05""goenj\x05""goenh\x04""goed\x04""goel\x05""goelg\x05""goelm\x05""goelb\x05""goels\x05""goelt\x05""goelp\x05""goelh\x04""goem\x04""goeb\x05""goebs\x04""goes\x05""goess\x05""goeng\x04""goej\x04""goec\x04""goek\x04""goet\x04""goep\x04""goeh\x04""gyog\x05""gyogg\x05""gyogs\x05""gyonj\x05""gyonh\x04""gyod\x04""gyol\x05""gyolg\x05""gyolm\x05""gyolb\x05""gyols\x05""gyolt\x05""gyolp\x05""gyolh\x04""gyom\x04""gyob\x05""gyobs\x04""gyos\x05""gyoss\x05""gyong\x04""gyoj\x04""gyoc\x04""gyok\x04""gyot\x04""gyop\x04""gyoh\x03""gug\x04""gugg\x04""gugs\x03""gun\x04""gunj\x04""gunh\x03""gud\x03""gul\x04""gulg\x04""gulm\x04""gulb\x04""guls\x04""gult\x04""gulp\x04""gulh\x03""gum\x03""gub\x04""gubs\x03""gus\x04""guss\x04""gung\x03""guj\x03""guc\x03""guk\x03""guh\x04""gweo\x05""gweog\x06""gweogg\x06""gweogs\x05""gweon\x06""gweonj\x06""gweonh\x05""gweod\x05""gweol\x06""gweolg\x06""gweolm\x06""gweolb\x06""gweols\x06""gweolt\x06""gweolp\x06""gweolh\x05""gweom\x05""gweob\x06""gweobs\x05""gweos\x06""gweoss\x06""gweong\x05""gweoj\x05""gweoc\x05""gweok\x05""gweot\x05""gweop\x05""gweoh\x04""gweg\x05""gwegg\x05""gwegs\x04""gwen\x05""gwenj\x05""gwenh\x04""gwed\x04""gwel\x05""gwelg\x05""gwelm\x05""gwelb\x05""gwels\x05""gwelt\x05""gwelp\x05""gwelh\x04""gwem\x04""gweb\x05""gwebs\x04""gwes\x05""gwess\x05""gweng\x04""gwej\x04""gwec\x04""gwek\x04""gwet\x04""gwep\x04""gweh\x04""gwig\x05""gwigg\x05""gwigs\x04""gwin\x05""gwinj\x05""gwinh\x04""gwid\x04""gwil\x05""gwilg\x05""gwilm\x05""gwilb\x05""gwils\x05""gwilt\x05""gwilp\x05""gwilh\x04""gwim\x04""gwib\x05""gwibs\x04""gwis\x05""gwiss\x05""gwing\x04""gwij\x04""gwic\x04""gwik\x04""gwit\x04""gwip\x04""gwih\x04""gyug\x05""gyugg\x05""gyugs\x04""gyun\x05""gyunj\x05""gyunh\x04""gyud\x04""gyul\x05""gyulg\x05""gyulm\x05""gyulb\x05""gyuls\x05""gyult\x05""gyulp\x05""gyulh\x04""gyum\x04""gyub\x05""gyubs\x04""gyus\x05""gyuss\x05""gyung\x04""gyuj\x04""gyuc\x04""gyuk\x04""gyut\x04""gyup\x04""gyuh\x03""geu\x04""geug\x05""geugg\x05""geugs\x04""geun\x05""geunj\x05""geunh\x04""geud\x04""geul\x05""geulg\x05""geulm\x05""geulb\x05""geuls\x05""geult\x05""geulp\x05""geulh\x04""geum\x04""geub\x05""geubs\x04""geus\x04""geuj\x04""geuc\x04""geuk\x04""geut\x04""geup\x04""geuh\x04""gyig\x05""gyigg\x05""gyigs\x04""gyin\x05""gyinj\x05""gyinh\x04""gyid\x04""gyil\x05""gyilg\x05""gyilm\x05""gyilb\x05""gyils\x05""gyilt\x05""gyilp\x05""gyilh\x04""gyim\x04""gyib\x05""gyibs\x04""gyis\x05""gyiss\x05""gying\x04""gyij\x04""gyic\x04""gyik\x04""gyit\x04""gyip\x04""gyih\x03""gig\x04""gigg\x04""gigs\x03""gin\x04""ginj\x04""ginh\x03""gid\x03""gil\x04""gilg\x04""gilm\x04""gilb\x04""gils\x04""gilt\x04""gilp\x04""gilh\x03""gim\x03""gib\x04""gibs\x03""gis\x04""giss\x04""ging\x03""gij\x03""gic\x03""gik\x03""gih\x04""ggag\x05""ggagg\x05""ggags\x04""ggan\x05""gganj\x05""gganh\x04""ggad\x04""ggal\x05""ggalg\x05""ggalm\x05""ggalb\x05""ggals\x05""ggalt\x05""ggalp\x05""ggalh\x04""ggam\x04""ggab\x05""ggabs\x04""ggas\x05""ggass\x05""ggang\x04""ggaj\x04""ggac\x04""ggak\x04""ggah\x04""ggae\x05""ggaeg\x06""ggaegg\x06""ggaegs\x05""ggaen\x06""ggaenj\x06""ggaenh\x05""ggaed\x05""ggael\x06""ggaelg\x06""ggaelm\x06""ggaelb\x06""ggaels\x06""ggaelt\x06""ggaelp\x06""ggaelh\x05""ggaem\x05""ggaeb\x06""ggaebs\x05""ggaes\x06""ggaess\x06""ggaeng\x05""ggaej\x05""ggaec\x05""ggaek\x05""ggaet\x05""ggaep\x05""ggaeh\x04""ggya\x05""ggyag\x06""ggyagg\x06""ggyags\x05""ggyan\x06""ggyanj\x06""ggyanh\x05""ggyad\x05""ggyal\x06""ggyalg\x06""ggyalm\x06""ggyalb\x06""ggyals\x06""ggyalt\x06""ggyalp\x06""ggyalh\x05""ggyam\x05""ggyab\x06""ggyabs\x05""ggyas\x06""ggyass\x06""ggyang\x05""ggyaj\x05""ggyac\x05""ggyak\x05""ggyat\x05""ggyap\x05""ggyah\x05""ggyae\x06""ggyaeg\x07""ggyaegg\x07""ggyaegs\x06""ggyaen\x07""ggyaenj\x07""ggyaenh\x06""ggyaed\x06""ggyael\x07""ggyaelg\x07""ggyaelm\x07""ggyaelb\x07""ggyaels\x07""ggyaelt\x07""ggyaelp\x07""ggyaelh\x06""ggyaem\x06""ggyaeb\x07""ggyaebs\x06""ggyaes\x07""ggyaess\x07""ggyaeng\x06""ggyaej\x06""ggyaec\x06""ggyaek\x06""ggyaet\x06""ggyaep\x06""ggyaeh\x04""ggeo\x05""ggeog\x06""ggeogg\x06""ggeogs\x05""ggeon\x06""ggeonj\x06""ggeonh\x05""ggeod\x05""ggeol\x06""ggeolg\x06""ggeolm\x06""ggeolb\x06""ggeols\x06""ggeolt\x06""ggeolp\x06""ggeolh\x05""ggeom\x05""ggeob\x06""ggeobs\x05""ggeos\x06""ggeoss\x06""ggeong\x05""ggeoj\x05""ggeoc\x05""ggeok\x05""ggeot\x05""ggeop\x05""ggeoh\x04""ggeg\x05""ggegg\x05""ggegs\x04""ggen\x05""ggenj\x05""ggenh\x04""gged\x04""ggel\x05""ggelg\x05""ggelm\x05""ggelb\x05""ggels\x05""ggelt\x05""ggelp\x05""ggelh\x04""ggem\x04""ggeb\x05""ggebs\x04""gges\x05""ggess\x05""ggeng\x04""ggej\x04""ggec\x04""ggek\x04""ggeh\x05""ggyeo\x06""ggyeog\x07""ggyeogg\x07""ggyeogs\x06""ggyeon\x07""ggyeonj\x07""ggyeonh\x06""ggyeod\x06""ggyeol\x07""ggyeolg\x07""ggyeolm\x07""ggyeolb\x07""ggyeols\x07""ggyeolt\x07""ggyeolp\x07""ggyeolh\x06""ggyeom\x06""ggyeob\x07""ggyeobs\x06""ggyeos\x07""ggyeoss\x07""ggyeong\x06""ggyeoj\x06""ggyeoc\x06""ggyeok\x06""ggyeot\x06""ggyeop\x06""ggyeoh\x04""ggye\x05""ggyeg\x06""ggyegg\x06""ggyegs\x05""ggyen\x06""ggyenj\x06""ggyenh\x05""ggyed\x05""ggyel\x06""ggyelg\x06""ggyelm\x06""ggyelb\x06""ggyels\x06""ggyelt\x06""ggyelp\x06""ggyelh\x05""ggyem\x05""ggyeb\x06""ggyebs\x05""ggyes\x06""ggyess\x06""ggyeng\x05""ggyej\x05""ggyec\x05""ggyek\x05""ggyet\x05""ggyep\x05""ggyeh\x04""ggog\x05""ggogg\x05""ggogs\x04""ggon\x05""ggonj\x05""ggonh\x04""ggod\x04""ggol\x05""ggolg\x05""ggolm\x05""ggolb\x05""ggols\x05""ggolt\x05""ggolp\x05""ggolh\x04""ggom\x04""ggob\x05""ggobs\x04""ggos\x05""ggoss\x05""ggong\x04""ggoj\x04""ggoc\x04""ggok\x04""ggoh\x05""ggwag\x06""ggwagg\x06""ggwags\x05""ggwan\x06""ggwanj\x06""ggwanh\x05""ggwad\x05""ggwal\x06""ggwalg\x06""ggwalm\x06""ggwalb\x06""ggwals\x06""ggwalt\x06""ggwalp\x06""ggwalh\x05""ggwam\x05""ggwab\x06""ggwabs\x05""ggwas\x06""ggwass\x06""ggwang\x05""ggwaj\x05""ggwac\x05""ggwak\x05""ggwat\x05""ggwap\x05""ggwah\x05""ggwae\x06""ggwaeg\x07""ggwaegg\x07""ggwaegs\x06""ggwaen\x07""ggwaenj\x07""ggwaenh\x06""ggwaed\x06""ggwael\x07""ggwaelg\x07""ggwaelm\x07""ggwaelb\x07""ggwaels\x07""ggwaelt\x07""ggwaelp\x07""ggwaelh\x06""ggwaem\x06""ggwaeb\x07""ggwaebs\x06""ggwaes\x07""ggwaess\x07""ggwaeng\x06""ggwaej\x06""ggwaec\x06""ggwaek\x06""ggwaet\x06""ggwaep\x06""ggwaeh\x04""ggoe\x05""ggoeg\x06""ggoegg\x06""ggoegs\x05""ggoen\x06""ggoenj\x06""ggoenh\x05""ggoed\x05""ggoel\x06""ggoelg\x06""ggoelm\x06""ggoelb\x06""ggoels\x06""ggoelt\x06""ggoelp\x06""ggoelh\x05""ggoem\x05""ggoeb\x06""ggoebs\x05""ggoes\x06""ggoess\x06""ggoeng\x05""ggoej\x05""ggoec\x05""ggoek\x05""ggoet\x05""ggoep\x05""ggoeh\x04""ggyo\x05""ggyog\x06""ggyogg\x06""ggyogs\x05""ggyon\x06""ggyonj\x06""ggyonh\x05""ggyod\x05""ggyol\x06""ggyolg\x06""ggyolm\x06""ggyolb\x06""ggyols\x06""ggyolt\x06""ggyolp\x06""ggyolh\x05""ggyom\x05""ggyob\x06""ggyobs\x05""ggyos\x06""ggyoss\x06""ggyong\x05""ggyoj\x05""ggyoc\x05""ggyok\x05""ggyot\x05""ggyop\x05""ggyoh\x04""ggug\x05""ggugg\x05""ggugs\x04""ggun\x05""ggunj\x05""ggunh\x04""ggud\x04""ggul\x05""ggulg\x05""ggulm\x05""ggulb\x05""gguls\x05""ggult\x05""ggulp\x05""ggulh\x04""ggum\x04""ggub\x05""ggubs\x04""ggus\x05""gguss\x05""ggung\x04""gguj\x04""gguc\x04""gguk\x04""gguh\x05""ggweo\x06""ggweog\x07""ggweogg\x07""ggweogs\x06""ggweon\x07""ggweonj\x07""ggweonh\x06""ggweod\x06""ggweol\x07""ggweolg\x07""ggweolm\x07""ggweolb\x07""ggweols\x07""ggweolt\x07""ggweolp\x07""ggweolh\x06""ggweom\x06""ggweob\x07""ggweobs\x06""ggweos\x07""ggweoss\x07""ggweong\x06""ggweoj\x06""ggweoc\x06""ggweok\x06""ggweot\x06""ggweop\x06""ggweoh\x05""ggweg\x06""ggwegg\x06""ggwegs\x05""ggwen\x06""ggwenj\x06""ggwenh\x05""ggwed\x05""ggwel\x06""ggwelg\x06""ggwelm\x06""ggwelb\x06""ggwels\x06""ggwelt\x06""ggwelp\x06""ggwelh\x05""ggwem\x05""ggweb\x06""ggwebs\x05""ggwes\x06""ggwess\x06""ggweng\x05""ggwej\x05""ggwec\x05""ggwek\x05""ggwet\x05""ggwep\x05""ggweh\x05""ggwig\x06""ggwigg\x06""ggwigs\x05""ggwin\x06""ggwinj\x06""ggwinh\x05""ggwid\x05""ggwil\x06""ggwilg\x06""ggwilm\x06""ggwilb\x06""ggwils\x06""ggwilt\x06""ggwilp\x06""ggwilh\x05""ggwim\x05""ggwib\x06""ggwibs\x05""ggwis\x06""ggwiss\x06""ggwing\x05""ggwij\x05""ggwic\x05""ggwik\x05""ggwit\x05""ggwip\x05""ggwih\x04""ggyu\x05""ggyug\x06""ggyugg\x06""ggyugs\x05""ggyun\x06""ggyunj\x06""ggyunh\x05""ggyud\x05""ggyul\x06""ggyulg\x06""ggyulm\x06""ggyulb\x06""ggyuls\x06""ggyult\x06""ggyulp\x06""ggyulh\x05""ggyum\x05""ggyub\x06""ggyubs\x05""ggyus\x06""ggyuss\x06""ggyung\x05""ggyuj\x05""ggyuc\x05""ggyuk\x05""ggyut\x05""ggyup\x05""ggyuh\x04""ggeu\x05""ggeug\x06""ggeugg\x06""ggeugs\x05""ggeun\x06""ggeunj\x06""ggeunh\x05""ggeud\x05""ggeul\x06""ggeulg\x06""ggeulm\x06""ggeulb\x06""ggeuls\x06""ggeult\x06""ggeulp\x06""ggeulh\x05""ggeum\x05""ggeub\x06""ggeubs\x05""ggeus\x06""ggeuss\x06""ggeung\x05""ggeuj\x05""ggeuc\x05""ggeuk\x05""ggeut\x05""ggeup\x05""ggeuh\x04""ggyi\x05""ggyig\x06""ggyigg\x06""ggyigs\x05""ggyin\x06""ggyinj\x06""ggyinh\x05""ggyid\x05""ggyil\x06""ggyilg\x06""ggyilm\x06""ggyilb\x06""ggyils\x06""ggyilt\x06""ggyilp\x06""ggyilh\x05""ggyim\x05""ggyib\x06""ggyibs\x05""ggyis\x06""ggyiss\x06""ggying\x05""ggyij\x05""ggyic\x05""ggyik\x05""ggyit\x05""ggyip\x05""ggyih\x04""ggig\x05""ggigg\x05""ggigs\x04""ggin\x05""gginj\x05""gginh\x04""ggid\x04""ggil\x05""ggilg\x05""ggilm\x05""ggilb\x05""ggils\x05""ggilt\x05""ggilp\x05""ggilh\x04""ggim\x04""ggib\x05""ggibs\x04""ggis\x05""ggiss\x05""gging\x04""ggij\x04""ggic\x04""ggik\x04""ggip\x04""ggih\x03""nag\x04""nagg\x04""nags\x03""nan\x04""nanj\x04""nanh\x03""nad\x03""nal\x04""nalg\x04""nalm\x04""nalb\x04""nals\x04""nalt\x04""nalp\x04""nalh\x03""nam\x03""nab\x04""nabs\x03""nas\x04""nass\x04""nang\x03""naj\x03""nac\x03""nak\x03""nat\x03""nae\x04""naeg\x05""naegg\x05""naegs\x04""naen\x05""naenj\x05""naenh\x04""naed\x04""nael\x05""naelg\x05""naelm\x05""naelb\x05""naels\x05""naelt\x05""naelp\x05""naelh\x04""naem\x04""naeb\x05""naebs\x04""naes\x05""naess\x05""naeng\x04""naej\x04""naec\x04""naek\x04""naet\x04""naep\x04""naeh\x04""nyag\x05""nyagg\x05""nyags\x05""nyanj\x05""nyanh\x04""nyad\x04""nyal\x05""nyalg\x05""nyalm\x05""nyalb\x05""nyals\x05""nyalt\x05""nyalp\x05""nyalh\x04""nyam\x04""nyab\x05""nyabs\x04""nyas\x05""nyass\x05""nyang\x04""nyaj\x04""nyac\x04""nyak\x04""nyat\x04""nyap\x04""nyah\x04""nyae\x05""nyaeg\x06""nyaegg\x06""nyaegs\x05""nyaen\x06""nyaenj\x06""nyaenh\x05""nyaed\x05""nyael\x06""nyaelg\x06""nyaelm\x06""nyaelb\x06""nyaels\x06""nyaelt\x06""nyaelp\x06""nyaelh\x05""nyaem\x05""nyaeb\x06""nyaebs\x05""nyaes\x06""nyaess\x06""nyaeng\x05""nyaej\x05""nyaec\x05""nyaek\x05""nyaet\x05""nyaep\x05""nyaeh\x03""neo\x04""neog\x05""neogg\x05""neogs\x04""neon\x05""neonj\x05""neonh\x04""neod\x04""neol\x05""neolg\x05""neolm\x05""neolb\x05""neols\x05""neolt\x05""neolp\x05""neolh\x04""neom\x04""neob\x05""neobs\x04""neos\x05""neoss\x05""neong\x04""neoj\x04""neoc\x04""neok\x04""neot\x04""neop\x04""neoh\x03""neg\x04""negg\x04""negs\x03""nen\x04""nenj\x04""nenh\x03""ned\x03""nel\x04""nelg\x04""nelm\x04""nelb\x04""nels\x04""nelt\x04""nelp\x04""nelh\x03""nem\x03""neb\x04""nebs\x03""nes\x04""ness\x04""neng\x03""nej\x03""nec\x03""nek\x03""net\x03""neh\x04""nyeo\x05""nyeog\x06""nyeogg\x06""nyeogs\x05""nyeon\x06""nyeonj\x06""nyeonh\x05""nyeod\x05""nyeol\x06""nyeolg\x06""nyeolm\x06""nyeolb\x06""nyeols\x06""nyeolt\x06""nyeolp\x06""nyeolh\x05""nyeom\x05""nyeob\x06""nyeobs\x05""nyeos\x06""nyeoss\x06""nyeong\x05""nyeoj\x05""nyeoc\x05""nyeok\x05""nyeot\x05""nyeop\x05""nyeoh\x04""nyeg\x05""nyegg\x05""nyegs\x04""nyen\x05""nyenj\x05""nyenh\x04""nyed\x04""nyel\x05""nyelg\x05""nyelm\x05""nyelb\x05""nyels\x05""nyelt\x05""nyelp\x05""nyelh\x04""nyem\x04""nyeb\x05""nyebs\x04""nyes\x05""nyess\x05""nyeng\x04""nyej\x04""nyec\x04""nyek\x04""nyet\x04""nyep\x04""nyeh\x03""nog\x04""nogg\x04""nogs\x03""non\x04""nonj\x04""nonh\x03""nod\x03""nol\x04""nolg\x04""nolm\x04""nolb\x04""nols\x04""nolt\x04""nolp\x04""nolh\x03""nom\x03""nob\x04""nobs\x03""nos\x04""noss\x04""nong\x03""noj\x03""noc\x03""nok\x03""noh\x04""nwag\x05""nwagg\x05""nwags\x04""nwan\x05""nwanj\x05""nwanh\x04""nwad\x04""nwal\x05""nwalg\x05""nwalm\x05""nwalb\x05""nwals\x05""nwalt\x05""nwalp\x05""nwalh\x04""nwam\x04""nwab\x05""nwabs\x04""nwas\x05""nwass\x05""nwang\x04""nwaj\x04""nwac\x04""nwak\x04""nwat\x04""nwap\x04""nwah\x04""nwae\x05""nwaeg\x06""nwaegg\x06""nwaegs\x05""nwaen\x06""nwaenj\x06""nwaenh\x05""nwaed\x05""nwael\x06""nwaelg\x06""nwaelm\x06""nwaelb\x06""nwaels\x06""nwaelt\x06""nwaelp\x06""nwaelh\x05""nwaem\x05""nwaeb\x06""nwaebs\x05""nwaes\x06""nwaess\x06""nwaeng\x05""nwaej\x05""nwaec\x05""nwaek\x05""nwaet\x05""nwaep\x05""nwaeh\x03""noe\x04""noeg\x05""noegg\x05""noegs\x04""noen\x05""noenj\x05""noenh\x04""noed\x04""noel\x05""noelg\x05""noelm\x05""noelb\x05""noels\x05""noelt\x05""noelp\x05""noelh\x04""noem\x04""noeb\x05""noebs\x04""noes\x05""noess\x05""noeng\x04""noej\x04""noec\x04""noek\x04""noet\x04""noep\x04""noeh\x04""nyog\x05""nyogg\x05""nyogs\x04""nyon\x05""nyonj\x05""nyonh\x04""nyod\x04""nyol\x05""nyolg\x05""nyolm\x05""nyolb\x05""nyols\x05""nyolt\x05""nyolp\x05""nyolh\x04""nyom\x04""nyob\x05""nyobs\x04""nyos\x05""nyoss\x05""nyong\x04""nyoj\x04""nyoc\x04""nyok\x04""nyoh\x03""nug\x04""nugg\x04""nugs\x03""nun\x04""nunj\x04""nunh\x03""nud\x03""nul\x04""nulg\x04""nulm\x04""nulb\x04""nuls\x04""nult\x04""nulp\x04""nulh\x03""nub\x04""nubs\x03""nus\x04""nuss\x04""nung\x03""nuj\x03""nuc\x03""nuk\x03""nuh\x04""nweo\x05""nweog\x06""nweogg\x06""nweogs\x05""nweon\x06""nweonj\x06""nweonh\x05""nweod\x05""nweol\x06""nweolg\x06""nweolm\x06""nweolb\x06""nweols\x06""nweolt\x06""nweolp\x06""nweolh\x05""nweom\x05""nweob\x06""nweobs\x05""nweos\x06""nweoss\x06""nweong\x05""nweoj\x05""nweoc\x05""nweok\x05""nweot\x05""nweop\x05""nweoh\x04""nweg\x05""nwegg\x05""nwegs\x04""nwen\x05""nwenj\x05""nwenh\x04""nwed\x04""nwel\x05""nwelg\x05""nwelm\x05""nwelb\x05""nwels\x05""nwelt\x05""nwelp\x05""nwelh\x04""nwem\x04""nweb\x05""nwebs\x04""nwes\x05""nwess\x05""nweng\x04""nwej\x04""nwec\x04""nwek\x04""nwet\x04""nwep\x04""nweh\x03""nwi\x04""nwig\x05""nwigg\x05""nwigs\x04""nwin\x05""nwinj\x05""nwinh\x04""nwid\x04""nwil\x05""nwilg\x05""nwilm\x05""nwilb\x05""nwils\x05""nwilt\x05""nwilp\x05""nwilh\x04""nwim\x04""nwib\x05""nwibs\x04""nwis\x05""nwiss\x05""nwing\x04""nwij\x04""nwic\x04""nwik\x04""nwit\x04""nwip\x04""nwih\x04""nyug\x05""nyugg\x05""nyugs\x04""nyun\x05""nyunj\x05""nyunh\x04""nyud\x04""nyul\x05""nyulg\x05""nyulm\x05""nyulb\x05""nyuls\x05""nyult\x05""nyulp\x05""nyulh\x04""nyum\x04""nyub\x05""nyubs\x04""nyus\x05""nyuss\x05""nyung\x04""nyuj\x04""nyuc\x04""nyuk\x04""nyuh\x03""neu\x04""neug\x05""neugg\x05""neugs\x04""neun\x05""neunj\x05""neunh\x04""neud\x04""neul\x05""neulg\x05""neulm\x05""neulb\x05""neuls\x05""neult\x05""neulp\x05""neulh\x04""neum\x04""neub\x05""neubs\x04""neus\x05""neuss\x05""neung\x04""neuj\x04""neuc\x04""neuk\x04""neut\x04""neup\x04""neuh\x04""nyig\x05""nyigg\x05""nyigs\x04""nyin\x05""nyinj\x05""nyinh\x04""nyid\x04""nyil\x05""nyilg\x05""nyilm\x05""nyilb\x05""nyils\x05""nyilt\x05""nyilp\x05""nyilh\x04""nyim\x04""nyib\x05""nyibs\x04""nyis\x05""nyiss\x05""nying\x04""nyij\x04""nyic\x04""nyik\x04""nyih\x03""nig\x04""nigg\x04""nigs\x03""nin\x04""ninj\x04""ninh\x03""nid\x03""nil\x04""nilg\x04""nilm\x04""nilb\x04""nils\x04""nilt\x04""nilp\x04""nilh\x03""nim\x03""nib\x04""nibs\x03""nis\x04""niss\x04""ning\x03""nij\x03""nic\x03""nik\x03""nih\x03""dag\x04""dagg\x04""dags\x03""dan\x04""danj\x04""danh\x03""dad\x04""dalg\x04""dalm\x04""dalb\x04""dals\x04""dalt\x04""dalp\x04""dalh\x03""dam\x04""dabs\x03""das\x04""dass\x04""dang\x03""daj\x03""dac\x03""dak\x03""dah\x03""dae\x04""daeg\x05""daegg\x05""daegs\x04""daen\x05""daenj\x05""daenh\x04""daed\x04""dael\x05""daelg\x05""daelm\x05""daelb\x05""daels\x05""daelt\x05""daelp\x05""daelh\x04""daem\x04""daeb\x05""daebs\x04""daes\x05""daess\x05""daeng\x04""daej\x04""daec\x04""daek\x04""daet\x04""daep\x04""daeh\x03""dya\x04""dyag\x05""dyagg\x05""dyags\x04""dyan\x05""dyanj\x05""dyanh\x04""dyad\x04""dyal\x05""dyalg\x05""dyalm\x05""dyalb\x05""dyals\x05""dyalt\x05""dyalp\x05""dyalh\x04""dyam\x04""dyab\x05""dyabs\x04""dyas\x05""dyass\x05""dyang\x04""dyaj\x04""dyac\x04""dyak\x04""dyat\x04""dyap\x04""dyah\x04""dyae\x05""dyaeg\x06""dyaegg\x06""dyaegs\x05""dyaen\x06""dyaenj\x06""dyaenh\x05""dyaed\x05""dyael\x06""dyaelg\x06""dyaelm\x06""dyaelb\x06""dyaels\x06""dyaelt\x06""dyaelp\x06""dyaelh\x05""dyaem\x05""dyaeb\x06""dyaebs\x05""dyaes\x06""dyaess\x06""dyaeng\x05""dyaej\x05""dyaec\x05""dyaek\x05""dyaet\x05""dyaep\x05""dyaeh\x03""deo\x04""deog\x05""deogg\x05""deogs\x04""deon\x05""deonj\x05""deonh\x04""deod\x04""deol\x05""deolg\x05""deolm\x05""deolb\x05""deols\x05""deolt\x05""deolp\x05""deolh\x04""deom\x04""deob\x05""deobs\x04""deos\x05""deoss\x05""deong\x04""deoj\x04""deoc\x04""deok\x04""deot\x04""deop\x04""deoh\x04""degg\x04""degs\x03""den\x04""denj\x04""denh\x03""ded\x03""del\x04""delg\x04""delm\x04""delb\x04""dels\x04""delt\x04""delp\x04""delh\x03""dem\x03""deb\x04""debs\x03""des\x04""dess\x04""deng\x03""dej\x03""dec\x03""dek\x03""det\x03""deh\x04""dyeo\x05""dyeog\x06""dyeogg\x06""dyeogs\x05""dyeon\x06""dyeonj\x06""dyeonh\x05""dyeod\x05""dyeol\x06""dyeolg\x06""dyeolm\x06""dyeolb\x06""dyeols\x06""dyeolt\x06""dyeolp\x06""dyeolh\x05""dyeom\x05""dyeob\x06""dyeobs\x05""dyeos\x06""dyeoss\x06""dyeong\x05""dyeoj\x05""dyeoc\x05""dyeok\x05""dyeot\x05""dyeop\x05""dyeoh\x03""dye\x04""dyeg\x05""dyegg\x05""dyegs\x04""dyen\x05""dyenj\x05""dyenh\x04""dyed\x04""dyel\x05""dyelg\x05""dyelm\x05""dyelb\x05""dyels\x05""dyelt\x05""dyelp\x05""dyelh\x04""dyem\x04""dyeb\x05""dyebs\x04""dyes\x05""dyess\x05""dyeng\x04""dyej\x04""dyec\x04""dyek\x04""dyet\x04""dyep\x04""dyeh\x03""dog\x04""dogg\x04""dogs\x04""donj\x04""donh\x03""dod\x03""dol\x04""dolg\x04""dolm\x04""dolb\x04""dols\x04""dolt\x04""dolp\x04""dolh\x03""dom\x03""dob\x04""dobs\x03""dos\x04""doss\x04""dong\x03""doj\x03""doc\x03""dok\x03""doh\x04""dwag\x05""dwagg\x05""dwags\x04""dwan\x05""dwanj\x05""dwanh\x04""dwad\x04""dwal\x05""dwalg\x05""dwalm\x05""dwalb\x05""dwals\x05""dwalt\x05""dwalp\x05""dwalh\x04""dwam\x04""dwab\x05""dwabs\x04""dwas\x05""dwass\x05""dwang\x04""dwaj\x04""dwac\x04""dwak\x04""dwat\x04""dwap\x04""dwah\x04""dwae\x05""dwaeg\x06""dwaegg\x06""dwaegs"
 #define UTFASCIILOOKUP {1,1,1,1,1,1,1,1,1,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,2,1,2,2,1,1,2,2,2,2,4,6,8,10,12,14,16,18,20,22,2,2,1,1,1,1,1,24,26,28,30,32,34,36,38,40,42,44,46,48,50,52,54,56,58,60,62,64,66,68,70,72,74,1,2,1,1,1,1,24,26,28,30,32,34,36,38,40,42,44,46,48,50,52,54,56,58,60,62,64,66,68,70,72,74,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,28,76,1,72,1,79,1,28,24,1,1,2,58,2,82,86,8,10,1,64,54,1,2,6,52,1,88,91,94,1,24,24,24,24,24,24,97,28,32,32,32,32,40,40,40,40,30,50,52,52,52,52,52,70,52,64,64,64,64,64,100,79,24,24,24,24,24,24,97,28,32,32,32,32,40,40,40,40,30,50,52,52,52,52,52,2,52,64,64,64,64,72,100,72,24,24,24,24,24,24,28,28,28,28,28,28,28,28,30,30,30,30,32,32,32,32,32,32,32,32,32,32,36,36,36,36,36,36,36,36,38,38,38,38,40,40,40,40,40,40,40,40,40,40,103,103,42,42,44,44,44,46,46,46,46,46,46,46,46,46,46,50,50,50,50,50,50,50,106,106,52,52,52,52,52,52,109,109,58,58,58,58,58,58,60,60,60,60,60,60,60,60,62,62,62,62,62,62,64,64,64,64,64,64,64,64,64,64,64,64,68,68,72,72,72,74,74,74,74,74,74,60,26,26,26,26,16,16,52,28,28,30,30,30,30,30,10,1,32,34,34,36,36,112,40,40,44,44,46,46,68,50,50,52,52,52,115,115,54,54,118,8,8,121,121,62,62,62,62,64,64,72,66,72,72,74,74,124,124,124,124,8,14,14,127,68,1,1,1,1,130,130,130,133,133,133,136,136,136,24,24,40,40,52,52,64,64,64,64,64,64,64,64,64,64,1,24,24,24,24,97,97,36,36,36,36,44,44,52,52,52,52,124,124,42,130,30,130,36,36,112,68,50,50,24,24,97,97,52,52,24,24,24,24,32,32,32,32,40,40,40,40,52,52,52,52,58,58,58,58,64,64,64,64,60,60,62,62,72,72,38,38,50,30,139,139,74,74,24,24,32,32,52,52,52,52,52,52,52,52,72,72,46,50,62,42,142,145,24,28,28,46,62,60,74,148,148,26,64,66,32,32,42,42,56,56,58,58,72,72,24,24,24,26,52,28,30,30,32,1,1,32,32,32,32,42,36,36,36,36,64,72,38,38,40,40,40,46,46,46,153,68,68,48,50,50,50,52,109,52,34,58,58,58,58,58,58,58,58,58,60,60,42,60,60,62,62,64,64,66,1,68,72,72,74,74,74,74,1,1,1,28,1,26,32,36,38,42,44,46,56,1,1,130,130,130,127,127,156,159,162,153,165,1,38,38,44,38,42,58,58,58,58,68,72,1,1,1,1,1,1,1,1,1,1,1,1,66,1,66,1,2,2,2,2,1,2,2,2,2,1,1,1,66,1,2,66,2,1,2,1,1,58,70,36,46,60,70,1,168,179,184,188,193,203,207,66,1,1,212,217,220,225,231,236,236,236,243,249,256,262,256,262,266,266,220,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,272,272,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,272,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,24,32,40,52,64,28,30,38,48,58,62,66,70,278,278,283,283,1,2,289,289,0,0,1,0,0,0,1,0,0,0,0,0,1,1,24,2,32,32,40,0,52,0,64,52,40,24,26,36,30,32,74,32,100,40,44,46,48,50,300,52,54,58,0,60,62,64,303,306,76,52,40,64,24,32,32,40,64,24,26,36,30,32,74,32,100,40,44,46,48,50,70,52,54,58,60,60,62,64,303,306,76,52,40,64,52,64,52,0,26,100,64,64,64,303,54,2,309,309,315,315,68,68,56,56,318,318,121,121,34,34,306,306,38,38,36,36,321,321,324,324,44,58,28,42,0,0,0,327,327,0,331,331,0,0,0,0,335,338,341,344,335,130,40,347,42,133,136,350,354,40,64,357,24,26,66,36,30,335,124,74,40,40,44,46,48,50,52,54,58,60,62,64,34,306,127,321,121,361,366,72,1,32,371,374,24,26,66,36,30,335,124,74,40,40,44,46,48,50,52,54,58,60,62,64,34,306,127,321,121,361,366,72,1,32,371,374,335,338,341,344,335,130,40,347,42,133,136,350,354,40,64,357,52,52,32,32,335,335,32,32,335,335,52,52,338,338,300,300,76,76,34,34,72,72,72,72,64,64,52,52,52,52,380,380,56,56,383,1,1,1,1,0,388,395,40,40,1,1,58,58,36,36,36,36,36,36,124,124,74,74,44,44,44,44,44,44,44,44,50,50,106,106,54,54,306,306,60,60,62,62,64,64,64,64,306,306,403,403,321,321,321,321,38,38,321,321,321,321,1,124,124,44,44,407,407,50,50,410,410,321,321,413,413,416,24,24,24,24,97,97,335,335,1,1,1,1,124,124,74,74,130,130,40,40,40,40,52,52,52,52,52,52,32,32,64,64,64,64,64,64,321,321,425,425,72,72,425,425,429,429,429,429,432,432,435,435,439,439,443,443,448,448,452,452,456,456,460,460,464,464,407,407,467,467,471,471,475,475,479,479,482,482,485,485,407,407,410,410,0,0,0,0,0,0,0,0,0,0,0,0,0,24,26,36,30,32,74,32,32,62,124,40,46,306,127,44,38,130,377,321,48,72,50,121,52,321,54,42,491,60,66,62,58,127,68,54,44,52,34,0,0,220,0,0,0,0,0,0,0,24,26,36,30,32,74,32,32,62,124,40,46,306,127,44,38,130,377,321,48,72,50,121,52,321,54,42,491,60,66,62,58,127,68,54,44,52,34,494,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,24,52,40,32,32,24,24,52,0,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,497,26,36,30,38,66,74,306,62,72,44,44,46,48,48,50,50,60,502,54,54,127,127,56,58,121,62,0,0,0,0,0,66,507,40,0,0,0,0,0,0,0,0,0,0,0,0,0,0,510,0,516,0,0,0,0,0,0,0,0,0,0,0,522,528,540,547,559,564,0,497,0,0,0,0,0,0,0,0,0,0,574,24,497,68,497,72,497,26,580,62,100,42,38,306,30,584,58,74,60,121,60,30,62,74,587,36,591,591,597,597,597,0,34,56,44,46,48,50,38,68,497,72,603,606,609,24,64,40,68,0,0,0,0,0,0,0,0,66,612,618,0,0,0,0,6,8,10,12,14,16,18,20,22,0,0,0,0,622,626,497,497,497,497,179,179,179,64,179,630,633,26,62,62,54,100,637,640,38,644,647,38,321,650,654,30,30,657,584,660,30,30,30,664,58,58,58,58,58,58,42,58,60,60,60,60,60,62,377,34,34,34,66,34,303,56,56,306,44,44,44,106,44,36,36,50,36,36,36,46,46,46,46,50,50,50,50,50,38,321,667,38,38,580,68,109,109,64,670,670,68,66,72,72,72,68,32,673,72,72,0,97,677,626,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,681,685,0,6,8,10,12,14,16,18,20,22,121,30,377,689,689,696,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,700,700,26,36,36,30,30,38,68,74,38,62,62,72,706,44,46,48,50,60,60,32,54,54,60,56,58,121,62,709,709,709,24,24,24,24,24,24,32,32,32,32,40,40,64,64,64,52,0,0,0,0,0,70,56,0,0,0,0,0,0,717,717,717,622,622,622,622,622,622,622,640,640,681,681,685,725,587,587,587,730,730,591,591,591,734,734,739,739,739,744,685,685,725,640,640,725,685,640,497,497,597,597,597,748,748,673,673,640,725,725,752,38,121,50,58,26,46,44,756,66,48,34,584,100,46,36,644,60,30,74,62,72,54,42,321,630,762,306,100,74,121,60,30,62,74,765,377,56,68,24,770,40,773,64,776,32,779,52,782,0,785,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,8,10,12,14,16,18,20,22,24,773,40,32,64,776,52,789,50,800,803,806,809,812,816,819,822,826,829,833,836,839,842,845,848,842,429,852,855,848,858,858,858,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,863,875,884,24,24,770,40,892,64,895,58,46,898,32,32,905,898,52,52,908,836,911,915,918,922,926,812,809,929,848,933,937,942,946,951,806,955,816,959,842,963,803,968,800,972,845,855,819,822,839,976,980,985,988,992,826,429,0,0,996,1002,770,40,892,64,895,58,664,898,32,32,905,898,52,52,908,1011,0,0,0,1018,1025,0,0,0,0,0,479,1034,1039,1044,1047,471,833,1053,664,1057,46,1057,0,0,0,6,8,10,12,14,16,18,20,22,0,179,898,0,0,0,0,0,0,0,0,1060,1064,148,1068,1073,0,863,875,884,0,24,770,40,892,64,895,58,46,0,0,32,905,0,0,52,908,836,911,915,918,922,926,812,809,929,848,933,937,942,946,951,806,955,816,959,842,0,803,968,800,972,845,855,819,0,839,0,0,0,988,992,826,429,0,0,996,1002,770,40,892,64,895,58,664,0,0,32,905,0,0,52,908,1011,1077,0,0,0,0,0,0,0,0,0,0,0,0,0,822,471,0,1053,664,1057,46,1057,0,0,0,6,8,10,12,14,16,18,20,22,819,819,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,50,50,38,0,24,770,40,892,64,895,58,46,410,32,32,905,1084,52,52,908,44,306,36,377,106,28,321,42,1087,644,630,633,654,660,1090,62,100,30,584,50,1093,54,303,26,637,48,72,58,664,46,46,1097,66,121,79,60,38,0,0,996,0,770,40,892,64,895,58,664,410,32,32,905,1084,52,52,908,1011,0,0,1101,1105,0,0,0,0,0,0,56,1111,1115,74,1119,491,34,1124,664,1057,46,1057,0,0,0,6,8,10,12,14,16,18,20,22,0,0,0,0,0,1127,0,0,0,0,0,0,0,0,0,0,0,50,50,38,0,24,770,40,892,64,895,58,664,0,0,32,905,0,0,52,908,44,306,36,377,106,28,321,42,1087,644,630,633,654,660,1090,62,100,30,584,50,0,54,303,26,637,48,72,58,0,46,976,0,985,121,79,60,38,0,0,996,1002,770,40,892,64,895,58,664,898,0,32,905,898,0,52,908,1011,0,0,0,0,0,0,0,0,0,0,0,0,0,0,664,491,0,1124,664,1057,46,1057,0,0,0,6,8,10,12,14,16,18,20,22,58,58,1134,1134,0,0,0,0,0,0,0,0,0,0,0,0,0,863,50,884,0,24,770,40,892,64,895,58,46,0,0,773,905,0,0,776,908,44,306,36,377,106,28,321,42,1087,644,630,633,654,660,1090,62,100,30,584,50,0,54,303,26,1137,48,72,58,0,46,1057,0,66,121,992,60,38,0,0,996,1002,770,40,892,64,895,58,664,0,0,773,905,0,0,776,908,1011,0,0,0,0,0,0,0,0,0,0,0,1111,1115,74,664,471,34,1053,664,1057,46,1057,0,0,0,6,8,10,12,14,16,18,20,22,50,38,0,0,1140,0,0,0,0,0,0,0,0,0,0,0,0,50,50,38,0,24,770,40,892,64,895,58,0,410,32,32,905,1084,52,52,908,44,306,36,377,106,28,321,42,1087,644,630,633,654,660,1090,62,100,30,584,50,963,54,303,26,637,48,855,58,822,46,1057,980,66,121,79,60,38,0,0,0,0,770,40,892,64,895,58,664,410,32,32,905,1084,52,52,908,1011,0,0,1101,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,664,0,0,0,0,0,0,6,8,10,12,14,16,18,20,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,50,50,38,0,24,770,40,892,64,895,58,46,0,32,32,905,0,52,52,908,44,306,36,377,106,28,321,42,1087,644,630,633,654,660,1090,62,100,30,584,50,0,54,303,26,637,48,72,58,822,46,1057,0,985,121,79,60,38,0,0,0,1002,770,40,892,64,895,58,664,0,32,32,905,0,52,52,908,1011,0,0,0,0,0,0,0,0,0,0,1144,1148,0,0,664,491,0,1124,664,1057,46,1057,0,0,0,6,8,10,12,14,16,18,20,22,0,0,0,0,0,0,0,0,0,6,8,10,6,8,10,1152,0,0,50,38,0,24,770,40,892,64,895,58,46,0,32,773,905,0,52,776,908,44,911,915,918,106,28,812,42,929,644,630,937,942,946,1090,62,955,816,959,50,1093,54,968,800,972,48,72,58,664,46,1057,1097,66,988,79,60,38,0,0,996,1002,770,40,892,64,895,58,664,0,32,773,905,0,52,776,908,1011,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,833,0,664,1057,46,1057,0,0,0,6,8,10,12,14,16,18,20,22,0,1158,1170,0,0,0,0,0,0,0,0,0,0,0,0,0,0,50,50,38,0,24,770,40,892,64,895,58,46,0,32,773,905,0,52,776,908,44,306,36,377,106,28,321,42,1087,644,630,633,654,660,1090,62,100,30,584,50,0,54,303,26,637,48,72,58,664,46,1057,980,66,121,79,60,38,0,0,0,1002,770,40,892,64,895,58,664,0,32,773,905,0,52,776,908,1011,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,664,1057,46,1057,0,0,0,6,8,10,12,14,16,18,20,22,0,0,0,0,0,0,0,0,0,0,1182,1182,1182,1182,1182,1182,0,0,50,38,0,24,770,40,892,64,895,58,46,1189,32,773,905,1198,52,776,908,44,306,36,377,106,28,321,42,1087,644,630,633,654,660,1090,62,100,30,584,50,1205,54,303,26,637,48,72,58,664,46,1057,1205,66,121,79,60,38,1216,1224,0,1232,770,40,892,64,895,58,664,1240,32,773,905,0,52,776,908,0,0,1250,1261,1267,1261,1267,1261,0,1267,0,1272,1285,1267,1293,1285,1285,1097,1299,664,1057,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1267,1267,0,0,0,0,0,0,0,0,0,0,0,0,0,1311,50,38,1314,24,770,40,892,64,895,58,46,1318,32,773,905,1321,52,776,908,44,306,36,377,106,28,321,42,1087,644,630,633,654,660,1090,62,100,30,584,50,1325,54,303,26,637,48,72,58,664,46,1057,1097,66,121,79,60,38,1328,0,0,0,770,40,892,64,895,58,905,1336,32,773,905,1348,52,776,908,1352,1361,1370,0,6,8,10,12,14,16,18,20,22,1378,1389,0,0,0,0,664,1057,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1311,50,38,1314,24,770,97,1396,40,892,64,895,58,664,46,1057,32,773,905,52,776,908,1321,0,1400,44,306,36,377,106,1403,28,321,42,1087,644,1407,1411,630,633,654,660,1090,1415,62,100,30,584,50,770,1420,54,303,26,637,48,1423,72,58,1426,46,0,0,66,121,79,60,38,1057,34,0,0,0,0,0,0,0,0,770,97,1396,40,892,64,14,895,18,58,32,773,905,52,776,908,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,664,1057,0,0,0,0,0,0,0,0,0,0,0,0,1429,44,306,306,306,306,306,106,650,321,321,321,321,72,30,62,100,100,100,50,30,62,100,100,100,50,26,54,303,34,303,34,303,48,72,58,58,46,46,68,60,60,60,38,46,1432,38,1432,24,24,770,1437,40,892,1440,1443,64,895,0,0,0,0,1447,637,32,97,52,905,905,1451,812,809,0,848,933,937,942,48,951,806,955,816,959,842,803,968,800,972,845,1144,1454,1148,1459,852,1464,1044,1468,855,819,839,988,992,826,429,24,1471,1476,1487,822,0,0,0,0,770,40,892,64,895,58,664,46,1057,32,773,52,776,1491,1496,40,44,306,1501,306,0,1505,106,321,1509,60,1514,0,644,0,0,836,911,915,918,30,38,100,100,0,50,26,54,303,34,303,34,955,48,72,58,803,46,800,68,845,1144,60,38,1459,852,1464,1044,24,855,770,1437,40,892,72,1124,64,895,1476,52,46,644,0,0,32,1518,52,1521,905,0,0,0,0,0,0,0,0,48,1524,1524,0,0,0,0,0,0,0,0,0,0,0,0,1529,1532,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1101,911,915,918,922,926,812,809,929,848,1535,933,937,942,946,951,806,955,816,959,842,803,968,800,972,845,855,819,839,852,826,429,976,24,1540,40,892,64,895,32,1545,52,908,1549,770,40,892,64,895,32,905,1545,1545,32,875,618,884,1011,1554,1559,1559,1559,1559,1566,44,306,36,377,106,28,321,42,20,644,630,633,654,660,1090,62,100,30,584,50,54,303,26,637,48,127,350,130,357,68,124,74,1545,72,58,46,121,1572,60,38,24,1576,58,1580,1580,1580,1588,1588,1588,770,40,892,64,895,58,664,46,1057,32,773,52,776,48,38,40,892,1540,1540,1540,1540,1540,1540,1540,1540,1540,1540,1540,1540,1596,1596,44,306,36,377,106,28,321,42,20,644,630,633,654,660,1090,62,100,30,584,50,54,303,26,637,48,127,350,130,357,68,124,74,1602,72,58,46,121,79,60,38,24,1576,68,72,58,1606,70,1611,1616,1620,1623,482,1627,1631,0,0,0,0,0,0,0,0,0,0,603,1635,1639,1643,410,1647,1651,1655,609,1659,1663,1667,1671,1084,1675,1679,1602,331,1684,606,1688,1693,1698,1703,1707,1712,1717,1721,1725,1606,1729,1611,1616,1620,1623,482,1627,1631,1733,1736,1739,1639,587,0,1745,0,0,0,44,306,36,377,106,28,321,42,1087,644,1754,630,633,654,660,1090,630,100,30,584,50,54,303,26,637,48,72,58,46,68,60,38,1057,24,0,40,892,64,895,32,0,52,908,0,770,40,892,64,895,32,905,0,0,0,50,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,50,58,46,32,121,79,58,664,46,1057,58,664,46,1057,0,0,0,0,0,0,1758,24,97,855,475,1765,32,1768,1772,52,852,1775,109,1318,64,1779,482,1783,670,1786,347,40,1789,1793,1797,1802,1808,1813,1818,1824,1830,1836,1841,1845,1850,1854,1858,1864,1871,1878,1883,1888,1892,1897,1905,1910,1914,1919,1925,1930,1937,1943,1948,1953,1958,1964,1969,1973,1978,1982,1986,1991,1999,2005,24,26,36,30,32,66,74,62,40,44,46,48,50,52,54,124,58,60,62,64,54,44,36,56,121,321,28,74,28,321,70,42,38,32,72,68,2014,109,2017,2030,2041,2055,2069,2083,2096,2114,2126,2139,24,26,36,30,32,66,74,62,40,44,46,48,50,52,54,124,58,60,62,64,54,44,36,56,121,321,28,74,28,321,70,42,38,32,72,68,2014,109,34,2158,2170,2182,0,0,0,0,0,0,36,2194,50,30,654,58,48,26,1137,60,79,2197,42,2201,28,44,62,54,38,106,1090,1420,2204,2207,2210,664,491,2210,1423,2213,2216,2219,2222,2226,2229,2233,2237,2241,2245,2249,2252,2255,2258,2219,2261,2265,2268,2271,2274,2277,2280,2283,2287,60,2291,2294,2297,315,318,121,2300,2305,327,2309,74,36,30,48,26,60,74,2314,42,28,62,54,50,42,0,0,2318,2322,2326,321,2329,2334,2338,2341,762,56,2344,2349,2355,2361,0,0,800,24,97,855,475,1765,32,1768,1772,52,852,1775,109,1318,64,1779,482,1783,670,1786,347,40,1789,1793,1797,1802,1808,1813,1818,1824,1830,1836,1841,1845,1850,1854,1858,1864,1871,1878,1883,1888,1892,1897,1905,1910,1914,1919,1925,1930,1937,1943,1948,1953,1958,1964,1969,1973,1978,1982,1986,1982,64,2366,1910,2371,895,770,773,32,52,852,36,2194,2375,50,136,2378,30,46,2381,2384,2387,162,2390,2393,2396,48,26,2226,60,79,106,42,28,44,62,54,38,2399,2402,106,1420,2406,2409,2412,2207,2415,2418,2422,2425,2428,1057,2432,2436,2440,2444,2448,2452,153,2456,2459,2462,2465,1423,2468,2471,2475,2478,2481,2213,2484,2258,303,2341,2265,2271,2487,2280,74,36,79,1318,306,50,2406,2409,2338,2341,1529,2490,1532,2493,56,2496,2500,2505,2510,2514,2518,429,2523,2526,2529,2533,1620,2537,2540,839,2544,2547,2197,2550,2554,1426,2557,2561,2565,2569,2573,2578,2583,2587,2591,845,2596,2599,2602,2606,2610,2613,2616,2222,2620,2624,2628,2633,2638,2642,2646,819,2651,2654,2657,2661,2665,2668,2671,826,2675,2678,2681,2685,2689,1325,2692,988,2696,2700,2704,2300,2305,327,2309,479,2709,2712,2715,2719,2723,2726,2729,2734,2738,2741,2745,2750,2755,2759,2762,2318,2322,2766,2770,2329,2334,2775,2779,2783,2788,2344,2349,2355,2361,0,0,800,2792,2795,2798,2802,2806,2809,2812,985,2816,2819,2822,2826,2830,2833,2836,806,2840,324,2843,2847,2851,2854,2857,926,2861,2864,2867,2871,2875,2878,2881,2885,2888,2891,2894,2898,2902,2905,2908,2912,2916,2920,2924,2929,2934,2938,2943,842,2947,2950,785,2953,2957,1400,2960,848,2964,2968,2972,2977,2982,2986,2990,24,32,40,52,64,66,915,836,836,2995,2998,3001,3005,3009,1311,2526,3012,2523,3016,3020,3025,3030,1426,2544,3034,3038,3042,3046,3051,3056,3060,3064,3068,2957,3073,3078,3084,3090,3095,3099,852,3103,1783,3106,3110,482,3114,2678,1325,2675,3117,816,806,432,2851,3120,1044,3123,3126,3129,3133,464,3137,3140,1464,3144,3148,3152,3157,3162,3166,3170,855,670,347,3175,3179,1772,1318,855,816,3183,3120,3186,3190,432,3194,3197,942,3201,2496,2500,2505,2510,2514,2518,809,3205,3208,3211,3215,3219,3222,2540,915,3225,3228,3231,3235,3239,3242,0,3245,0,3249,3253,3258,3263,0,0,1060,3267,3271,3275,3280,3285,3289,0,955,3293,3297,3301,3306,3311,1321,3315,812,3320,3324,3328,3333,3338,3342,3346,968,3351,3355,3359,3364,3369,3373,3377,1144,3382,3386,3390,3395,3400,3404,3408,3413,3417,3421,3425,3430,3435,3439,0,833,2738,1733,3443,3447,3451,2759,2762,803,3454,3457,3460,3464,3468,3471,2779,3474,2788,3478,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,24,32,40,52,64,66,915,836,3239,3228,3242,3225,3482,429,1620,2526,2537,2523,112,839,2554,2547,1426,2544,3485,845,2610,2599,2613,2596,842,3064,3488,2957,2950,1400,2947,3492,3095,3099,3495,3499,3503,3507,826,60,2689,2678,1325,2675,3117,816,806,432,2851,3120,324,3194,3183,3511,3514,3518,3522,3526,3530,3534,3538,1144,3400,3386,3404,3382,3542,852,482,1783,3114,3103,3546,855,1772,347,1318,670,3549,0,0,0,0,0,0,0,0,0,0,0,0,32,3552,40,892,52,776,776,773,40,24,770,482,482,1783,1783,3556,3556,3114,3114,3560,3560,3560,852,852,3106,3106,3106,905,68,0,62,44,121,60,50,68,50,0,68,28,0,46,410,609,1084,603,3468,3564,3457,3569,3471,3573,3573,2533,2526,803,3460,2943,2943,3577,3577,3581,3581,3586,3586,3590,3590,2779,2779,3595,3595,3595,54,54,38,2851,3600,324,3605,2854,3609,3609,3190,3120,806,2843,3613,3613,3617,3617,3621,3621,3626,3626,3630,3630,2857,2857,3635,3635,3635,62,3640,3644,3648,933,3009,3652,2998,3657,1311,3661,3661,836,3001,3030,3030,3016,3016,3665,3665,3670,3670,3674,3674,3012,3012,3020,3020,3020,44,3679,3682,3686,3690,3694,2875,3698,2864,3703,2878,3707,3707,926,2867,3711,3711,3715,3715,3719,3719,3724,3724,3728,3728,2881,2881,3733,3733,3733,28,100,2610,3738,2599,3743,2613,3747,3747,845,2602,3751,3751,3755,3755,3759,3759,3764,3764,3768,3768,2616,2616,3773,3773,3773,48,48,2481,48,48,2957,3778,2950,3783,1400,3787,3787,842,785,3791,3791,2960,2960,3795,3795,3795,50,106,2378,2554,3800,2547,3805,1426,3809,3809,839,2197,3813,3813,3817,3817,3821,3821,3826,3826,3830,3830,2557,2557,3835,3835,46,46,46,2689,3840,2678,3845,1325,3849,3849,826,2681,3853,3853,3857,3857,3861,3861,3866,3866,3870,3870,2692,2692,3875,3875,3875,60,60,3880,60,2297,3883,3880,3887,3892,3897,3902,2305,2700,3907,327,3912,988,2704,3917,3917,3922,3922,3927,3927,3933,3933,3938,3938,2309,2309,3944,3944,121,1772,3950,347,3955,1318,3959,3959,855,3175,3963,3963,3967,3967,3971,3971,3976,3976,3980,3980,3985,3985,3989,3989,3989,72,72,72,347,2665,2665,2554,3994,2654,3999,2668,4003,1426,819,2657,839,4007,4007,58,58,58,3451,4012,1733,4017,2759,4021,833,3443,4025,4025,34,3311,3311,3297,3297,4030,4030,1321,4035,955,3301,4040,4040,100,4046,4051,4056,937,633,4061,4065,4069,4073,1620,2526,4077,2537,4081,429,2529,38,38,4085,4088,2712,4093,2726,4097,479,2715,56,4101,4106,4111,4116,2665,2654,2668,819,4121,4127,4131,4136,4140,922,4145,106,1403,2305,2700,327,988,3311,3297,1321,955,100,4150,4154,4159,4163,467,4168,2396,3311,3297,4030,1321,4035,955,3301,100,26,32,40,52,24,482,1783,3114,852,2957,2950,1400,842,3009,2998,1311,836,1620,2526,2537,429,4173,4177,425,4181,4186,918,2651,2668,2665,2661,2654,819,3103,3114,482,3110,1783,852,4190,4194,4198,4202,4207,4211,3293,1321,3311,3306,3297,955,4215,3648,3640,4219,3644,933,3454,3471,3468,3464,3457,803,54,3225,3242,3239,3235,3228,915,4224,1314,4228,4232,4237,911,4241,4245,4249,4253,4258,1487,4262,2947,1400,2957,2953,2950,842,2596,2613,2610,2606,2599,845,670,1318,1772,3179,347,855,3205,3205,3222,3219,3215,3208,3208,809,4265,4269,4273,4277,4282,1064,2544,1426,2554,2550,2547,839,4286,4290,4294,4298,4303,3514,4307,4159,4311,4315,4150,467,4320,4111,4101,4325,4106,4116,3534,3530,3522,4331,3526,3518,3123,3137,464,3133,3126,1044,74,74,4336,4340,4344,4348,4353,1148,2675,1325,2689,2685,2678,826,2696,327,2305,2300,2700,988,121,3382,3404,3400,3395,3386,1144,3320,3342,3338,3333,3324,812,4357,4362,4367,4372,4378,4383,70,839,4388,4392,4397,4402,4408,4413,4419,4424,0,0,0,0,0,0,0,0,0,836,26,46,34,60,50,38,30,62,28,56,48,36,106,74,58,24,52,64,32,40,321,100,303,54,70,54,1426,2833,988,4430,826,34,66,64,118,72,68,100,100,24,52,4434,97,52,52,52,109,1084,58,44,28,44,36,106,36,36,68,38,38,38,38,50,50,50,40,32,42,36,97,24,1765,54,74,60,60,60,28,74,62,62,30,26,26,54,54,32,48,48,48,46,46,106,106,30,52,4437,4441,2709,2709,2709,60,118,118,118,56,70,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,4445,0,0,0,0,0,0,0,0,0,6,8,10,12,14,16,18,20,22,0,0,0,0,0,0,24,32,40,52,64,109,1440,773,842,4454,800,803,479,915,845,839,826,988,806,816,812,809,855,819,852,833,836,911,1144,1044,2529,4458,467,3148,3324,4462,4462,4462,4462,4462,4462,4462,4462,4462,4462,4462,4462,4462,4462,4462,4462,4462,4462,4462,4462,4462,4462,4462,4462,4462,4462,4467,4467,4467,4467,4467,4467,4467,4467,4467,4467,4467,4467,4467,4467,4467,4467,4467,4467,4467,4467,4467,4467,4472,4472,4472,4472,4472,0,0,0,0,0,0,0,0,44,306,36,377,106,28,321,42,1087,644,62,633,30,660,1090,62,100,30,584,50,54,303,26,637,48,72,58,46,66,121,79,60,38,46,56,24,770,40,892,64,4479,895,4482,4486,4489,4493,4496,32,905,776,776,908,24,770,770,40,892,72,1124,64,895,4500,109,855,335,32,97,905,776,908,48,38,24,0,0,0,58,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4503,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,836,911,915,918,922,926,812,809,929,4506,806,955,816,959,842,803,968,800,972,845,855,819,839,852,988,992,826,429,0,0,0,24,40,64,773,905,776,908,32,52,855,819,852,0,0,0,0,836,922,875,806,842,803,845,819,839,4510,4520,4530,0,0,0,0,3809,0,0,0,0,0,0,6,8,10,12,14,16,18,20,22,836,2885,922,1144,826,855,806,955,839,803,968,845,833,985,429,479,911,1454,842,24,40,773,4535,64,776,52,1440,32,4538,905,0,0,4542,4542,4542,4542,4542,0,0,0,0,0,0,0,0,0,0,0,179,479,179,179,179,836,2885,922,179,179,179,1144,826,855,179,179,179,806,955,842,179,179,179,803,968,845,179,179,179,833,985,839,179,179,179,429,816,800,179,179,4548,4552,0,0,0,0,0,0,4556,770,892,64,895,32,97,52,782,1440,1521,4562,4566,507,4569,4573,4577,4580,4580,4580,4580,4580,4580,4580,0,0,0,0,0,0,0,0,0,6,8,10,12,14,16,18,20,22,0,0,0,0,4586,4590,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,836,915,922,4595,803,800,845,4600,806,816,842,4604,926,809,848,4608,855,819,839,985,826,24,429,40,64,32,52,97,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4613,4613,4617,4623,4630,4636,4636,4642,4642,4648,4648,819,819,839,839,4654,4660,4667,4667,836,836,915,915,922,926,926,809,809,848,806,806,816,816,842,806,806,816,816,842,803,803,800,800,845,855,819,839,852,826,826,826,429,4673,4681,4613,4613,4688,4688,819,819,839,839,4693,4693,4693,4693,4700,4700,0,752,4706,4711,4716,2830,4719,4723,0,0,0,0,0,6,8,10,12,14,16,18,20,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4730,4739,4749,24,40,64,97,52,32,1786,836,479,915,922,926,809,1044,848,806,816,842,803,833,985,800,845,855,819,839,852,826,2885,429,4759,4769,4778,4786,4795,4803,4814,4823,4831,4842,0,0,0,911,4850,0,6,8,10,12,14,16,18,20,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,836,4854,911,915,4858,922,926,812,809,848,806,955,816,842,803,4862,968,833,4866,800,4870,845,4874,1144,1454,1148,855,819,839,429,4878,985,826,988,852,24,855,819,770,40,52,776,64,895,32,44,48,46,50,54,58,62,4882,4890,4895,996,0,0,0,0,0,0,0,0,0,6,8,10,12,14,16,18,20,22,0,0,0,933,937,942,0,6,8,10,12,14,16,18,20,22,839,4899,4902,4454,4905,2197,4908,4912,4916,4920,2547,4924,4927,4930,4934,2544,4937,4940,4943,4566,2554,4947,4950,410,4954,1426,4958,4962,4965,4968,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4971,4971,97,4971,4971,4971,4971,4971,4979,40,4971,4971,4971,4971,4971,4971,4971,4984,4984,4984,109,4971,4993,4997,4971,4971,4971,4971,4971,4984,4984,4984,4971,4971,4971,4971,5004,587,4971,4971,4971,4971,4971,4971,4971,4971,4971,4971,4971,4971,4971,4971,4971,4971,4971,4971,4971,4971,4971,4971,4971,4971,4971,4971,4971,4971,4971,24,5011,5018,5011,26,30,32,5024,4979,5011,36,5011,44,48,5030,52,4979,4993,4997,54,62,64,4984,5011,66,587,5034,5039,5045,5039,3324,40,58,64,66,5034,5051,5057,3355,3324,1440,26,30,34,48,50,54,58,58,60,62,74,36,5061,5070,100,40,5078,54,64,5083,26,30,34,36,44,46,48,50,54,58,60,5091,66,70,74,24,5018,30,32,32,4979,5024,40,52,5091,64,5095,5011,28,28,5099,5103,34,5112,5120,5011,40,5078,4971,4971,42,46,46,4971,48,5011,50,50,4971,5127,3355,60,5091,62,64,5083,4971,66,5011,74,74,74,5095,5134,0,0,0,0,0,0,0,0,0,0,58,0,0,0,0,0,0,0,0,5140,97,1451,5150,28,5070,5099,36,4971,44,46,4971,4971,50,4971,4971,58,60,60,74,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,24,24,26,26,26,26,26,26,28,28,30,30,30,30,30,30,30,30,30,30,32,32,32,32,32,32,32,32,32,32,34,34,24,32,40,52,64,52,64,773,50,106,26,54,56,36,48,46,60,121,62,30,321,42,72,58,68,34,44,911,127,74,38,5153,2396,124,321,48,32,40,52,64,52,64,106,26,54,56,36,48,62,30,321,42,127,72,68,44,36,38,5156,644,130,32,40,4577,64,64,106,44,36,38,54,121,62,30,42,34,36,38,127,74,58,321,124,40,44,58,34,124,64,64,64,64,66,66,66,66,68,38,70,68,48,68,68,24,40,44,106,28,630,633,654,1090,62,30,54,303,79,124,74,24,62,124,377,106,28,1087,933,660,62,584,79,5159,124,74,64,72,637,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,40,40,40,40,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,64,64,64,64,64,64,64,64,64,64,64,64,64,64,72,72,72,72,72,72,72,72,5162,5162,5162,5162,72,72,5018,5018,5018,5018,5018,5018,5018,5018,5018,5018,5018,5018,5018,5018,5018,5018,5175,5175,5175,5175,5175,5175,0,0,5175,5175,5175,5175,5175,5175,0,0,5183,5183,5183,5183,5183,5183,5183,5183,5183,5183,5183,5183,5183,5183,5183,5183,5078,5078,5078,5078,5078,5078,5078,5078,5078,5078,5078,5078,5078,5078,5078,5078,5187,5187,5187,5187,5187,5187,0,0,5187,5187,5187,5187,5187,5187,0,0,5083,5083,5083,5083,5083,5083,5083,5083,0,5083,0,5083,0,5083,0,5083,5195,5195,5195,5195,5195,5195,5195,5195,5195,5195,5195,5195,5195,5195,5195,5195,5018,5018,5175,5175,5183,5183,5078,5078,5187,5187,5083,5083,5195,5195,0,0,5018,5018,5018,5018,5018,5018,5018,5018,5018,5018,5018,5018,5018,5018,5018,5018,5183,5183,5183,5183,5183,5183,5183,5183,5183,5183,5183,5183,5183,5183,5183,5183,5195,5195,5195,5195,5195,5195,5195,5195,5195,5195,5195,5195,5195,5195,5195,5195,5018,5018,5018,5018,5018,0,5018,5018,5018,5018,5018,5018,5018,0,0,0,0,0,5183,5183,5183,0,5183,5183,5175,5175,5183,5183,5183,0,0,0,5078,5078,5078,5078,0,0,5078,5078,5078,5078,5078,5078,0,0,0,0,5083,5083,5083,5083,5057,5057,5083,5083,5083,5083,5083,5083,5057,0,0,0,0,0,5195,5195,5195,0,5195,5195,5187,5187,5195,5195,5195,0,0,0,5201,0,2,2,2,2,5205,2,2,5209,5213,2,2,2,2,2,2,2,2,2,2,0,0,0,5218,1,1,1,1,1,1,1,1,1,1,1,0,0,0,2,0,0,5224,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,5230,0,0,2,0,0,0,0,0,0,5234,0,1,1,0,0,5237,0,0,5241,0,0,0,0,0,0,5248,0,0,0,5255,2,2,0,0,0,0,0,0,0,0,0,0,5261,0,0,5267,5267,5274,40,0,5280,0,0,0,0,0,0,0,5285,0,0,0,50,0,0,0,0,0,0,0,0,0,0,5291,0,0,0,0,0,24,32,52,70,5024,0,0,0,0,0,0,0,0,0,5296,0,0,0,0,0,0,0,0,5301,0,0,0,0,0,0,0,0,0,5305,0,5309,0,0,0,5314,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5320,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5325,0,0,0,0,0,0,0,0,0,0,0,0,0,5329,0,0,0,0,0,0,0,0,0,0,4971,5333,0,0,0,4971,0,0,0,0,2,0,0,0,0,0,4971,0,0,0,0,5337,2,0,0,0,0,0,4971,5078,0,0,0,4971,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5342,0,0,5347,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5352,0,0,0,0,0,0,0,0,0,0,5358,0,0,0,0,0,0,0,0,0,0,5325,0,0,0,0,0,0,0,5362,0,0,0,0,0,0,0,0,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5367,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5372,0,0,0,0,0,0,0,0,0,5320,0,0,0,0,5377,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5381,0,0,0,0,0,0,0,5386,0,0,0,0,0,0,0,0,0,5391,0,0,0,0,0,0,0,0,0,5396,5401,5401,0,0,0,5407,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5413,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5419,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5426,5386,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5432,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5248,0,0,5437,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5442,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5448,0,0,0,0,0,0,0,0,0,0,0,0,0,5453,5459,0,0,0,0,0,0,0,5453,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5248,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5464,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5471,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5476,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5325,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,24,24,26,26,26,26,26,26,28,28,30,30,30,30,30,30,30,30,30,30,32,32,32,32,32,32,32,32,32,32,34,34,36,36,38,38,38,38,38,38,38,38,38,38,40,40,40,40,44,44,44,44,44,44,46,46,46,46,46,46,46,46,48,48,48,48,48,48,50,50,50,50,50,50,50,50,52,52,52,52,52,52,52,52,54,54,54,54,58,58,58,58,58,58,58,58,60,60,60,60,60,60,60,60,60,60,62,62,62,62,62,62,62,62,64,64,64,64,64,64,64,64,64,64,66,66,66,66,68,68,68,68,68,68,68,68,68,68,70,70,70,70,72,72,74,74,74,74,74,74,38,62,68,72,24,60,24,26,28,30,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,40,40,40,40,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,64,64,64,64,64,64,64,64,64,64,64,64,64,64,72,72,72,72,72,72,72,72,16,18,20,22,0,0,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,32,32,32,32,32,32,0,0,32,32,32,32,32,32,0,0,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,52,52,52,52,52,52,5386,0,52,52,52,52,52,52,2,5480,64,64,64,64,64,64,64,64,0,64,0,64,0,64,0,64,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,24,24,32,32,32,32,40,40,52,52,64,64,52,52,0,0,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,52,24,24,24,24,24,0,24,24,24,24,24,24,24,0,40,0,0,0,32,32,32,0,32,32,32,32,32,32,32,0,0,0,40,40,40,40,0,0,40,40,40,40,40,40,0,0,0,0,64,64,64,64,58,58,64,64,64,64,64,64,58,0,0,0,0,0,52,52,52,0,52,52,52,52,52,52,52,0,0,0,5485,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5491,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,5496,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5501,0,0,0,0,0,0,0,0,0,0,5506,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5509,0,5255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5514,0,0,0,5519,50,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5524,0,0,0,0,0,5529,0,0,0,0,0,5534,0,0,0,5540,5544,5547,5550,46,5553,50,5557,1134,68,2406,30,1786,44,62,5561,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5564,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5568,0,5573,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5578,0,0,0,0,5564,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,40,892,5583,5587,66,2819,5590,5594,5599,70,2891,5602,46,28,30,48,40,892,5583,5587,66,2819,5590,5594,5599,70,2891,5602,46,28,30,48,6,30,10,12,14,16,18,20,22,0,6,8,10,12,14,16,18,20,22,0,0,0,0,0,0,0,0,0,0,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66,0,0,66,0,0,0,0,0,5606,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5612,0,0,0,0,5617,0,0,0,0,0,0,0,0,0,5622,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5629,0,0,0,0,5291,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5635,0,0,0,5629,0,0,0,0,5642,0,0,0,0,0,0,0,0,0,0,0,0,0,5647,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5651,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5325,5655,0,0,0,0,0,0,0,0,5285,0,0,0,5367,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5661,5661,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5666,0,0,0,0,5671,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,0,0,5676,5682,0,0,0,0,5688,0,0,0,0,0,0,0,0,0,0,5693,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5699,0,0,0,0,0,0,5291,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5476,5704,5704,0,0,0,0,0,0,0,0,0,0,0,5708,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5712,0,0,5717,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5721,5721,5721,5721,5721,5721,5721,5721,5721,5721,5721,609,609,0,5721,5721,0,0,609,609,5721,5726,0,609,609,609,0,5464,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5693,0,0,0,0,0,0,0,0,5730,0,0,2,2,0,0,0,0,0,0,0,0,5721,0,0,0,0,0,0,0,0,0,0,5682,5682,5682,0,0,0,5721,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5721,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,272,272,272,272,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,5682,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5735,5739,5744,5749,5757,5763,5769,5777,5783,5790,5795,40,5803,5810,5815,5823,5831,5837,5841,5848,5854,5860,5867,5871,5877,5882,3468,5886,3386,5891,988,5898,5903,5908,5913,670,5921,5921,1318,5925,5933,5925,5937,5942,5950,5958,5969,0,5735,5739,5744,5749,5757,5763,5769,5777,5783,5790,5795,40,5803,5810,5815,5823,5831,5837,5841,5848,5854,5860,5867,5871,5877,5882,3468,5886,3386,5891,988,5898,5903,5908,5913,670,5921,5921,1318,5925,5933,5925,5937,5942,5950,5958,5969,0,46,46,46,54,58,24,62,38,38,44,44,74,74,5018,48,24,0,66,68,68,66,1432,1432,5978,32,58,52,4971,42,4971,0,0,5987,5987,5992,5992,5051,5051,5997,5997,6003,6003,6007,6007,6011,6011,6016,6016,6021,6021,6028,6028,6034,6034,6039,6039,2599,2599,2950,2950,6045,6045,52,52,3457,3457,2668,2668,6049,6049,6054,6054,4500,4500,1733,1733,4237,4237,6058,6058,6062,6062,6066,6066,6076,6076,6080,6080,6066,6066,6066,6066,6080,6080,6076,6076,283,283,6094,6094,6076,6076,6076,6076,6102,6102,6066,6066,6076,6076,6076,6076,6111,6111,6076,6076,6076,6076,6076,6076,6076,6076,6076,6076,6076,6076,6076,6076,6076,6076,6076,6076,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,603,1635,1639,1643,410,1647,1651,1655,609,1659,1663,1667,1671,1084,1675,1679,1602,331,1684,606,1688,1693,1698,1703,1707,1712,1717,1721,1725,1606,1729,1611,1616,1620,1623,482,1627,1631,0,0,0,0,0,0,0,0,0,0,855,6120,6124,6129,6133,6139,6146,6150,6154,6159,6164,6170,6174,6178,6182,6189,6195,6139,6182,6199,3175,6204,6182,6209,6182,347,6213,6218,6182,6226,6230,4506,6182,6182,6234,670,1447,6238,6243,6182,6248,6253,6257,6262,6267,6271,6276,6281,6286,6290,6294,6298,6302,6313,0,0,0,0,0,0,0,0,0,6318,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6332,6336,6340,6344,6348,6353,6357,6361,6365,6369,782,6374,6378,6382,6387,6391,6396,6401,6406,6410,6415,6420,6426,0,0,0,0,0,0,0,0,0,992,6431,6435,6439,6444,6449,4430,0,6453,6457,6461,6465,6470,6475,6479,0,6483,6487,6491,6495,6500,6505,6509,0,6513,6518,6523,6528,6534,6540,6545,0,6550,6554,6558,6562,6567,6572,6576,0,6580,6584,6588,6592,6597,6602,6606,0,6610,6614,6618,6622,6627,6632,6636,0,6640,6644,6648,6652,6657,6662,6666,0,2806,2830,425,432,3162,464,836,407,413,410,52,3468,6670,6673,2851,429,3400,3338,988,6676,5937,6682,24,335,6688,6694,6267,670,6704,6713,5933,6704,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,220,5682,220,5682,6720,6725,6725,6725,6725,6725,6725,6734,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,24,24,40,40,64,64,32,32,52,52,836,915,2998,3228,2995,3225,3009,3239,1311,3242,826,1044,2678,3126,2675,3123,2689,464,1325,3137,806,816,324,3120,2840,2840,3183,2851,432,2854,3194,842,2950,2947,2957,1400,429,800,803,2526,70,3457,2523,2792,3454,1620,2806,3468,2537,2809,3471,845,2599,2596,2610,2613,855,855,670,670,1318,1318,819,2654,2651,2665,2668,852,852,1783,482,3114,50,2816,836,3009,0,0,0,0,0,0,0,0,0,2,24,24,40,40,64,64,32,32,52,52,836,915,2998,3228,2995,3225,3009,3239,1311,3242,826,1044,2678,3126,2675,3123,2689,66,66,66,66,816,324,3120,2840,2840,3183,2851,432,2854,3194,842,2950,2947,2957,1400,429,800,803,2526,2795,3457,2523,2792,3454,1620,2806,3468,2537,2809,3471,845,2599,2596,2610,2613,855,855,670,670,1318,1318,819,2654,2651,2665,2668,852,52,1783,482,3114,50,2816,836,3009,985,2819,2830,2833,0,0,0,0,0,0,0,0,0,0,26,54,48,34,30,62,50,46,36,44,38,42,56,70,124,321,121,58,74,28,60,24,52,32,4535,905,1518,908,139,603,410,4454,5030,6670,40,64,371,66,106,6743,4927,0,0,0,6746,6753,6765,6777,6783,6795,6807,6814,6826,6832,6845,6857,6869,6880,6894,6908,6920,6926,6932,6943,6954,6959,6969,6975,6981,6992,7000,7008,7016,7024,24,97,855,475,1765,32,1768,1772,52,852,1775,109,1318,64,1779,482,1783,670,1786,347,40,0,7030,2017,2030,2041,2096,2126,7041,7058,7072,7090,7102,7113,7127,7141,7154,7167,7185,7203,7215,7229,7243,7262,7274,7285,7297,7308,7319,7327,7338,7347,7361,7378,7394,2182,1858,1864,1883,1930,1937,1948,1999,7405,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2792,3126,3208,3225,773,7412,776,7416,4934,7420,7424,4943,7428,7431,7435,7440,1437,1429,7445,7449,54,62,44,38,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2995,2678,2675,2854,2947,429,2526,2523,1620,2537,2596,819,2654,2651,2665,2668,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7454,52,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7460,7467,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,24,0,26,0,44,0,46,0,28,40,34,0,48,60,54,0,32,0,38,0,52,0,58,0,30,42,36,0,50,62,56,0,0,0,0,0,64,0,66,0,0,0,0,0,70,0,0,0,0,0,0,0,74,0,0,0,0,68,0,0,72,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5688,5606,0,0,7473,7478,7482,0,0,0,0,0,7487,0,0,0,0,0,0,0,0,0,7491,0,0,0,0,0,5442,0,0,0,0,7495,0,0,5688,0,0,0,7500,5426,0,7504,7511,7516,7521,5218,7528,5655,5491,7478,7533,0,0,7538,7542,5476,7548,7555,7558,0,0,0,0,5314,7565,5708,7478,7571,0,7576,7582,7588,5476,7592,7599,5666,5386,7605,0,0,0,0,7500,0,0,0,5381,5459,7495,7588,5476,7610,7616,5413,0,0,0,5347,7622,5476,5301,5325,7628,7632,7637,0,0,0,7643,7500,5296,7648,0,7576,0,7653,5237,7658,7663,5296,7667,7538,7672,5629,7675,7681,7687,7628,7692,7696,7700,7706,7710,7715,7653,5629,7719,0,7723,5666,7730,0,0,5296,7734,7738,5320,0,7742,7658,0,7746,7752,7757,7628,7763,7667,5453,5661,5337,0,0,5617,0,5666,5301,0,7632,0,5325,0,0,0,0,7768,0,7774,7779,7786,7790,0,7795,5342,0,0,7790,7800,0,5391,5301,0,7599,5568,7805,5655,0,0,0,5224,7811,7582,7817,0,0,5401,7592,5329,5426,0,7823,5661,0,5358,5381,7588,0,0,0,5337,5426,7706,0,7828,5564,7632,5280,5381,0,0,7834,7839,0,7843,0,0,7849,0,5301,5396,7853,7858,0,7667,7864,7867,5476,5291,7872,5407,0,7710,5248,7710,0,7672,0,7516,5291,7588,7675,7877,0,0,7605,7883,5407,7576,7888,5661,5301,0,7710,5237,5407,0,5325,0,7893,5573,7898,5568,0,7904,7779,7908,0,7849,0,5291,5666,7914,7920,7924,7672,7930,7864,5329,0,0,7935,7495,7940,7946,7628,0,7952,5476,5274,7817,7957,0,5333,5391,0,7962,5642,5381,7967,0,5699,7482,0,7972,7977,7982,7986,5730,7990,0,5485,7663,0,7864,5573,5661,5573,7994,0,0,7811,7588,5337,0,7667,7999,7500,5391,0,0,8005,0,7849,5671,7834,5688,5476,5396,0,8010,8015,7883,7565,8022,5708,5564,8028,7849,5337,5396,0,8033,8039,8044,5396,5301,8048,8052,8057,0,7487,0,0,5333,7516,5476,5730,0,7500,5726,7696,0,0,0,0,0,0,0,8028,7994,5661,5377,8062,8068,8073,8077,7482,0,0,0,0,0,0,8082,8087,7904,7491,5325,7853,7653,7592,7582,7752,5329,5448,8039,8093,0,5606,8099,0,0,0,0,0,0,0,7491,5391,5529,5501,8104,8110,7888,8115,7864,5661,0,7864,8119,7752,7800,7982,5717,5367,7800,5358,5325,5730,7972,0,0,0,0,8126,7663,0,0,8131,7883,8126,8073,8136,5301,7675,5519,0,0,0,0,0,7582,5377,8140,8144,8149,7972,7663,5237,0,7867,0,0,0,0,5573,5325,8154,7738,7834,7500,0,8159,0,0,0,0,7491,7521,0,5367,7571,5476,7839,0,0,5274,7658,8164,5476,7972,5476,5274,8170,5325,7653,0,8174,5301,0,5347,8179,7653,7834,0,0,7834,7653,0,7710,8184,8154,0,5358,5367,5534,8190,0,5337,8196,7500,8028,5358,8052,5485,5708,5708,0,0,0,0,8170,0,7571,8201,5381,7663,8205,7839,8048,0,0,0,0,8077,7511,8211,8217,0,5358,8222,0,5573,7653,5606,8227,0,0,0,0,5564,7888,7628,7491,8005,7653,7908,0,7908,0,7610,0,8201,7710,5661,8077,7843,5476,0,7800,8015,5367,8234,0,0,5325,8239,7491,5325,7482,0,8245,5476,5661,8052,5218,7653,7877,7658,5629,7972,8222,8249,7952,7877,5666,0,5237,0,0,8255,8261,8267,0,7610,5564,0,0,7786,0,0,5396,8039,0,5524,8272,0,5261,8277,8077,5564,5524,7867,8282,0,0,5237,7500,8005,8249,8287,0,5325,8293,7675,5476,7628,5476,7834,0,8297,8052,8302,0,5337,0,7528,5358,0,7828,0,8201,0,7487,7696,0,7790,8267,0,0,8255,0,8174,0,0,7495,5381,0,7696,7888,0,0,0,7888,0,0,7867,0,7742,5448,8179,8307,0,5352,5476,0,7571,8312,7867,8316,7528,5337,7930,7610,0,0,0,0,0,0,7738,5347,7800,8322,7576,7834,0,5329,0,5514,7746,0,7872,8048,5496,5386,0,5442,0,5320,7858,0,8005,8302,0,5274,7972,0,0,0,5401,8329,7500,5651,5296,7715,0,8334,5476,8131,5629,7706,8267,5320,5564,5476,8245,0,5401,8340,8179,8170,5329,7588,5362,5708,8345,7542,0,0,0,0,8297,7914,8349,7653,8354,7696,5708,5274,7538,0,0,5347,0,8354,7582,5534,8359,8249,5453,5509,5651,8077,5726,8365,5401,7972,5209,8370,7500,8052,8329,7972,8010,8104,8131,0,8104,8375,7605,8087,8239,5381,5661,5693,5381,8164,8211,0,5717,5642,8381,5476,7843,5218,7482,0,7588,0,7516,8387,7790,8391,8397,7628,7491,8131,5651,7667,7752,0,0,7828,7610,0,5426,8402,8255,7746,8249,8196,0,5509,8407,7663,0,8411,8417,5401,5309,0,7805,7571,8073,0,5642,8422,5325,0,8039,5325,7994,0,0,7500,8184,8267,0,7904,5578,8170,7994,5237,7706,5476,5661,7839,5688,8068,5453,7706,5325,0,0,0,7828,8149,8427,0,0,7482,8433,5325,5296,5437,5347,5386,8170,8196,5491,0,5381,7500,0,5218,8307,7710,0,8438,5464,5342,7990,8443,8052,7558,5529,8447,7710,5401,8345,7710,0,7521,7924,5396,8451,5688,8149,5564,8217,8211,7843,5480,7653,8211,8073,0,7706,7653,0,7610,0,7681,8149,7706,8365,5651,8456,8427,7521,8461,0,7706,0,5329,0,8267,7864,7768,8438,7994,7768,5320,8438,0,0,8391,5642,5291,5301,7908,8461,8467,8245,0,8149,7957,7542,5708,8473,0,8211,8479,0,5708,0,5237,5564,0,8484,8489,8316,5726,7864,0,5325,5325,5396,5285,8397,8473,8249,8126,7994,5325,5708,7628,8052,8217,8494,8447,8498,0,5301,5329,5453,5396,8277,0,7672,0,5651,7628,0,8170,0,0,8427,0,5476,0,5325,5358,0,8504,0,8010,5717,7692,5381,7622,0,0,8316,0,7839,5358,8509,5301,0,7962,7495,0,5325,8514,5274,5280,7864,7790,0,0,7853,0,8255,0,0,7478,0,8519,5377,5401,5358,0,8211,5529,8527,5666,0,5241,5573,7800,7610,0,7482,0,5241,7542,8375,8077,5476,0,5325,5325,8533,7628,8484,7811,8539,0,8093,5325,8543,7687,7839,7883,8239,5476,7999,5274,7710,7839,7710,7834,7843,8307,7610,7877,0,8422,5496,7663,7710,0,7616,5496,7853,0,8422,5496,5642,8548,0,0,8255,5401,8196,5329,7834,0,0,5476,7877,7592,5419,0,5485,0,7582,0,5676,7653,8539,0,0,8062,0,7710,8438,5358,0,8329,5329,0,5617,5358,0,5358,0,5274,7994,5432,7696,5676,0,5655,7930,5476,7628,5726,8365,5651,8447,7487,0,0,0,5261,7658,7715,5485,8411,8164,8554,8179,0,0,0,0,0,8539,8316,7738,5426,0,7888,5237,8316,0,5377,5261,5407,7972,0,7482,0,0,7811,7548,7706,0,0,5661,5661,8115,7994,0,0,7738,8427,8381,0,0,0,5476,8504,5320,5496,5314,0,7746,5325,7565,8456,7663,8010,5708,8196,5280,7675,0,0,8255,0,8316,0,5337,0,8543,5564,5573,7605,0,5573,0,8560,8566,5291,0,5496,8571,8577,5301,7500,0,7628,8370,5301,5730,7817,7990,8467,8407,5296,0,8582,7592,8365,5564,7867,7930,5237,7839,8334,0,5237,5688,5464,0,0,5442,8589,0,8407,8407,8594,8514,8093,8087,7828,8179,5459,7935,5352,0,8170,5325,8277,5606,8467,0,7774,7706,7628,5401,0,0,0,0,7628,5325,7994,5651,8402,5661,7500,5237,5688,5296,0,7628,7867,8598,7805,7888,7957,0,8334,7658,7576,7482,0,7893,7914,8467,5476,7643,7719,7491,8438,5501,7849,0,7482,8604,8447,5708,8527,5401,8227,7877,7538,8539,0,5329,0,5476,5396,0,8422,7864,5396,7962,8447,5401,5301,5274,7834,7610,8514,5407,0,0,8411,7628,8154,7622,5442,8370,0,5333,5381,7994,5476,7811,7849,8179,5347,7482,5661,0,7632,8093,7542,8154,0,8494,0,0,5717,0,5459,5218,5325,8608,8613,5237,8617,7500,5476,7982,5325,5726,5606,0,7542,7715,0,7790,7482,5671,7904,5274,7790,7565,8387,0,8022,7994,5529,0,8625,8484,7864,5209,8402,5358,8631,0,8577,0,0,7908,0,8370,0,7605,5248,5274,8190,0,5688,8456,7952,7696,7817,7723,0,8149,5301,8033,8589,8073,8494,8057,0,7888,0,8594,7738,7972,8473,7786,0,0,5224,7972,7582,7558,7999,8028,7516,8312,5325,8438,7994,7935,8131,0,8613,0,8201,0,8005,8149,7653,7616,7972,5381,5426,5661,8329,5261,7542,5661,7588,8370,5651,7643,0,0,5296,8136,8022,8543,7511,5381,5464,5347,0,7982,8307,8154,5717,5642,8604,7952,5407,5407,5442,5309,7538,5296,8514,8179,7672,7920,7924,8170,8170,5699,0,0,8635,0,8484,5396,5274,5661,0,7588,7893,8604,7491,0,0,0,8196,5296,8068,0,8322,5237,5476,0,8249,8641,5347,8052,7839,8533,8647,7632,5651,0,0,0,5661,8073,5296,7706,5661,0,0,8073,7542,8282,5285,5291,8653,8022,8170,7864,8077,0,5459,5459,0,7952,0,7706,7805,0,7628,8196,0,7990,5564,0,8539,5274,7952,7849,8658,7653,8316,8073,5261,5358,5329,7491,8447,8663,8589,7757,5329,7853,5401,7990,8589,5655,8663,5401,7790,0,7542,7990,8670,8255,5358,0,7482,0,5261,7588,7730,7872,5314,5329,8093,5496,0,7811,0,0,7977,8282,7982,8307,0,7957,0,5676,7990,5612,5717,5578,5693,8676,7605,7834,8334,5496,0,0,0,0,5476,0,0,5337,8234,5642,5642,5391,7817,7706,8682,0,0,5730,5651,5564,7982,8687,7883,0,0,7834,0,0,5726,0,8227,8391,0,8222,0,0,0,5274,0,0,0,7790,7843,7823,8456,8033,0,0,8694,0,7867,5491,0,8653,5459,5329,0,0,0,0,7628,7658,7877,7800,7746,7811,0,8699,7811,5730,5485,8073,5274,5301,5309,0,8211,8647,8052,7924,0,5274,7588,7994,7935,0,5309,8554,7849,0,8635,8093,0,8217,0,7734,8354,8073,0,5296,5459,7834,8170,5285,7908,8577,7628,5377,0,7478,8062,7675,8052,0,0,0,0,5464,5564,0,0,5471,0,8705,5285,0,7528,0,0,8467,5291,5396,0,7898,8711,0,0,7994,0,5712,7487,8411,5329,0,0,0,7849,5617,7672,5213,8164,5688,8577,7817,5274,5237,0,0,5453,0,0,0,5661,5666,0,8498,5314,7893,7571,5459,5325,7849,5325,0,0,0,0,0,5647,5274,7834,5629,7738,8539,5291,8608,7653,5642,8170,7872,7898,0,8077,5606,8716,0,0,5337,7746,0,0,8716,5426,7706,0,8682,8316,7696,7977,8196,7790,7864,5301,7710,0,7849,5381,5325,0,8721,5730,5671,0,5501,7719,0,5325,0,7723,7849,0,5274,5381,5396,5358,0,0,5655,0,0,5391,0,8022,7972,8543,0,0,0,7843,5358,5274,7898,5491,0,0,7920,7877,5358,7588,8154,8727,7616,8732,5419,5362,7786,7565,0,0,7738,8402,0,8407,8297,8739,7935,8245,7982,8402,5329,5676,5329,7542,8174,5655,0,5301,8340,7706,0,0,5377,8093,5726,5401,5329,5320,7817,5578,8473,5309,8745,0,0,8548,7734,5309,8473,5407,8234,0,0,0,8577,5301,7632,7914,7746,5407,8539,7930,0,5401,0,8329,8751,5699,7610,8397,0,5291,0,5617,0,5661,0,5347,8140,5476,7495,5301,8354,0,5476,0,5325,8756,5661,0,5209,7990,5296,5726,0,0,0,8631,0,8329,0,7914,5568,7867,8302,7500,8387,8312,8443,5337,5209,5401,5309,5367,5476,7867,5651,5285,0,7710,5391,0,7482,5305,5476,0,7719,5309,7491,0,5699,7935,8375,0,5241,0,0,0,0,0,0,8402,0,8345,5519,8179,8732,7687,0,5325,8073,0,0,7843,8422,0,8093,7864,8494,5401,8762,8514,5347,7994,8676,7908,7663,5437,5296,5476,5305,5209,8543,5413,0,5358,5301,5329,7632,0,7883,0,5699,8033,0,7558,8484,5568,5325,8093,0,8670,8509,7872,8287,8766,0,7957,8222,0,0,8222,8164,0,5666,0,0,5726,0,0,7972,8772,8164,8443,7616,7790,8716,8411,0,0,5629,7653,5372,8164,0,0,7734,0,8772,0,8297,8381,8577,5459,5459,7548,0,7672,7883,0,7952,5325,8447,5476,8184,7628,7599,8039,8115,7834,8402,5274,5285,5320,5564,8456,0,0,0,0,8201,8411,7710,7730,5476,8411,0,8217,5347,0,7637,0,8190,7628,7628,0,0,0,0,7738,0,0,0,0,8170,5661,5237,5407,0,7533,7738,8190,5274,5453,0,0,0,0,0,5651,5325,8131,7752,0,7599,5337,8115,5358,5651,0,5661,8010,5476,0,5666,7616,0,5309,5617,7482,5325,0,7588,0,0,0,7599,7746,7588,5476,5437,7719,5325,7632,0,7790,7687,5342,7972,8411,5301,0,0,0,0,0,0,0,8255,8721,0,5655,0,8077,7667,5661,5642,5661,0,8766,0,0,7610,8033,5651,5699,0,8136,0,0,0,7588,5661,8073,5693,8498,0,8519,7935,7653,7883,8052,0,0,0,7914,5651,7877,8514,7653,8402,5291,7849,7893,5391,7935,7914,7555,5564,7800,0,0,0,0,5476,5442,0,0,8222,5666,7990,7828,5358,5342,5717,5358,5476,5274,8447,7616,7605,8104,8527,7500,8647,7478,8239,8777,7967,0,8411,5642,7811,5213,5448,0,8217,5485,5237,0,8039,0,0,7834,5529,5573,7946,7616,0,0,0,5401,5274,7811,0,0,5401,5261,8777,7930,5407,5320,8010,7828,0,7904,7628,0,0,7700,5666,5476,5491,0,7877,8783,0,5309,5362,0,0,0,8239,5712,8484,0,7511,7653,0,5218,5309,7710,8504,8789,0,0,8062,5606,0,0,0,0,8073,7723,0,5320,8402,5296,8783,8307,8625,7864,7994,5501,8772,0,8099,7849,5218,5296,0,7628,8548,7834,5688,7999,7592,7658,0,0,0,0,0,0,8422,7516,7592,7687,0,7849,0,7500,0,0,0,8402,8745,5305,0,0,5413,5301,0,0,7834,5717,5305,7930,5676,5459,8670,0,7478,7834,0,5291,0,7658,7653,0,7828,5325,5381,0,0,0,5661,7986,8010,8154,5237,8077,5651,8297,8498,7482,5651,0,5291,0,8316,5509,0,5301,8670,8571,8795,8282,0,7681,0,7930,7491,7858,7877,7982,8800,0,8345,8104,7542,7930,0,5501,0,5480,5480,7571,8093,0,7952,0,5391,5730,8577,0,7487,0,7930,8504,8762,8073,7779,7839,5358,5325,8548,0,7849,5301,8467,8354,0,7877,8539,5666,5309,5248,7487,7734,5476,0,0,7811,8272,8613,7616,7616,7648,7482,5391,7482,5291,8068,8190,0,0,7867,7605,0,0,5337,0,0,5237,5391,5476,5305,0,0,7982,7675,7478,0,5485,8805,5391,8447,0,7738,0,5573,7877,8647,7757,5386,5386,8811,8131,7628,5730,0,0,0,7982,7924,0,5274,0,8164,7957,7999,8179,8239,8647,8370,8010,7653,7883,8427,0,7738,7605,8282,5407,7628,5314,5337,5301,0,0,0,7877,5401,0,0,8484,7734,5688,7817,5209,7628,0,0,8705,8816,5712,0,8484,0,7500,5255,8411,7790,0,0,0,0,5476,5337,0,5255,0,8222,5296,0,0,0,8201,8211,7986,5647,7478,5301,8093,0,5325,7667,0,7888,5291,5491,7930,0,0,0,0,0,7986,8411,5342,5647,5459,0,0,0,0,0,7888,0,0,5342,5358,5647,7719,8179,5647,7746,0,7672,0,0,8427,5358,5325,8433,0,5301,0,0,5342,0,5320,0,0,7864,0,0,0,0,7723,7632,7482,8068,7786,7628,5666,7930,8028,7858,5401,5688,5401,0,0,5301,5693,8631,7576,0,5426,8608,8010,5352,8126,5480,0,7864,8126,7706,5573,7817,8316,7653,7558,7977,7811,5426,7828,8349,7582,7864,8821,8577,8119,7742,8539,7628,8732,8164,0,5629,8827,8647,8617,5329,8316,5241,5301,7730,0,0,0,0,8625,5476,7653,5661,7632,7511,0,7883,0,0,8772,0,0,0,5337,7823,0,8461,7667,7710,5568,5509,5301,7511,8577,5367,0,8345,7628,8170,8110,8329,0,8451,8179,8833,5218,5564,8821,0,5237,5320,5285,5285,7653,8015,0,0,8839,8033,8010,5325,0,0,7786,7478,0,7867,5320,0,5480,8762,7487,8297,7715,5564,8093,5325,5519,8190,8716,0,5381,5301,8245,5325,0,7672,7914,5301,7843,8845,7482,0,8196,7867,7935,5337,8201,5464,5699,8277,0,0,7500,7898,7990,7706,0,8119,0,0,7576,5464,8422,7982,7930,0,0,0,5325,7786,0,5524,7637,7538,7605,8422,8422,5401,7843,0,0,0,5491,7663,5274,0,5237,0,8422,8179,5514,0,5381,5501,8658,0,5642,8479,7977,5666,7834,5329,8422,7616,7920,7632,5301,5432,0,7790,8126,0,0,5642,7849,8104,7982,8381,5442,5301,5629,7811,5358,0,7935,7924,8245,5708,5529,0,0,0,8297,0,5372,5509,7738,8222,0,7834,0,7605,8387,8010,5337,0,8422,8249,5617,5309,7786,7706,8255,5285,7834,0,8795,7746,5274,8589,8136,0,7811,8816,7558,0,5291,5237,7706,8608,5712,7786,0,0,8010,5726,7877,8598,5358,7790,8851,7786,8062,7811,7632,8560,7977,7768,0,8211,8201,7786,0,7715,7663,7616,8598,7843,5381,8539,7977,0,8751,8504,7834,8762,8539,0,7843,5274,0,5426,7930,8345,5651,7706,7706,8494,5617,7628,7977,7558,5642,7616,7924,5325,5381,7653,8438,7957,8509,5642,7834,7962,7952,5464,7616,8119,5496,5401,0,8190,8732,7935,8447,5726,7622,8154,7628,7823,7982,8554,0,7542,5617,5419,5708,8349,8211,8427,8411,5285,5291,8789,5358,5391,5301,5305,8577,7763,5305,5237,7877,5726,5285,8154,0,7500,7700,8316,5730,7628,0,0,8073,8857,0,8287,0,5381,0,5426,5296,5391,0,0,0,5642,7628,7898,5381,5578,0,5617,8539,7582,7839,5564,8438,5655,5655,0,7834,7757,8062,7817,0,7672,8625,7986,8402,8048,8451,7834,0,5381,0,8039,5612,5509,5241,8077,7757,8277,7738,8402,0,8234,0,0,0,0,7746,0,8438,8170,7628,0,7999,8115,0,0,7533,7849,8131,8062,8149,7478,8287,0,5329,8140,5401,0,8255,5320,0,0,8433,0,5296,7588,8519,0,7610,0,5386,8772,7883,7994,8811,8245,5301,0,5274,7533,7986,0,5453,8359,7616,5274,5347,5305,7904,0,5564,5358,0,8154,5476,7511,0,0,5676,8154,7558,8307,7864,0,7834,8863,8762,7706,7628,7768,8154,8077,7946,8170,5617,0,0,5352,8391,8340,7957,5301,8104,0,8402,5261,0,7706,0,8277,8093,8239,8705,7628,5386,8287,7706,5476,8184,0,5407,8387,0,7805,0,0,0,5358,7883,8312,8184,7972,8783,5606,5606,8110,5476,8577,8345,7849,7723,5301,0,5209,7588,8467,8387,8762,5509,0,7582,5337,5296,5407,7872,8211,8170,0,0,8345,5342,8277,7643,8322,0,7888,0,8136,8179,5377,7500,8484,5464,7706,5381,7790,7834,0,7972,8422,0,7663,8334,8777,5629,8869,7643,7706,5573,5612,5314,8417,5647,8443,7957,7622,5301,7800,7786,8433,5396,5712,0,5401,8479,5261,7839,0,0,7972,7904,8402,5688,0,7610,0,7893,8039,7558,8484,7864,0,5291,8062,5285,8498,5642,8316,5496,5337,5320,5642,5717,7811,7843,5291,8033,0,0,7914,0,8391,8391,0,8519,8267,0,5309,8287,0,8772,0,7723,0,7558,0,7628,7558,8316,0,8255,0,8170,5347,5476,8164,0,0,7487,0,8048,0,8249,7952,0,0,8370,8255,8287,5699,8217,5301,7904,5381,0,7632,0,8267,0,7982,7482,0,7972,5401,0,8811,5407,7576,7605,7692,8136,8217,8115,7924,7605,7817,5476,0,0,8519,8149,8504,8164,0,8136,8604,0,0,5476,5291,5358,7558,7667,5442,5296,7710,7972,7834,0,0,8099,5224,7999,7653,7628,5491,7999,7893,8302,8093,7738,0,8211,7491,8222,8005,7795,7823,5717,0,7710,0,5612,7839,7576,7658,7908,8196,0,8762,8604,7811,0,8159,5241,7542,0,0,7994,0,0,5237,8136,7734,8359,8170,0,0,0,7533,7738,7542,0,8164,7632,7982,5448,0,7734,7763,0,8851,8349,5320,8093,5666,5419,8873,7972,7757,0,8589,7982,8010,5712,5342,5407,5629,5661,0,5305,8010,5666,0,8554,8093,0,8827,8267,8249,7628,7972,7706,7883,8154,7994,8772,7719,5661,5448,8022,0,7511,5476,0,5666,5301,7893,8577,7516,5274,5642,0,5432,5274,8261,5622,0,7883,8411,8093,8062,7706,8239,8282,5651,7982,7982,0,8604,8456,7723,8391,8484,8201,5712,8589,5712,0,0,5301,7768,0,8869,7521,0,5391,0,0,5347,5464,8484,7834,0,7730,8641,5661,5578,8514,5237,7800,0,5464,8772,7675,8387,5358,7632,8010,5301,8402,5496,5442,8539,8582,5573,0,7877,5651,7542,5688,5655,0,0,0,7786,7834,7710,8625,7715,8073,7473,8845,5642,7790,7599,0,0,0,8613,5291,0,8438,5419,0,8427,7571,8354,5224,0,7576,5358,8504,7628,0,8287,7696,5476,5651,8745,0,7599,5325,8201,0,5432,8010,5642,5301,8010,5726,5564,7696,0,0,0,8154,5309,7706,8170,8277,7935,7930,8816,5476,7500,7511,8329,5564,0,8566,8805,5413,7687,0,0,0,7742,8851,8845,5629,7952,5296,7738,0,5642,0,7706,7653,7672,5651,5651,0,5329,8010,7742,5651,5381,5564,5651,5464,7588,5642,8077,5309,5401,5358,8745,5377,8093,8857,7972,7482,8479,5442,7774,5651,7834,5347,5248,0,0,8721,5617,7632,0,0,7632,7605,0,5442,5676,7592,7696,5476,7872,7774,8504,5564,5347,5342,7628,5642,7828,8093,7605,7738,5255,7542,5291,7805,8201,7786,8879,0,7653,7653,8711,7982,8062,8539,5564,8190,5651,5712,7843,7786,7999,7738,7628,8548,5301,8239,7478,5666,5325,5666,5301,0,8073,8608,8005,5480,0,0,7999,7952,0,7500,8716,8287,7888,0,7582,7952,8073,0,7811,8190,8179,5301,8422,5464,5529,7982,8222,8297,7681,5564,8239,0,5476,5320,8312,7849,8140,0,8136,8345,8783,5329,8427,7738,0,0,0,8255,7588,0,8721,0,0,5573,0,7696,7696,8699,7706,7487,5573,0,7834,7898,8345,0,8884,8519,7904,0,5377,7653,7571,7904,5578,8631,8119,5358,7696,7605,7478,7752,7972,7576,5329,7752,8234,5688,7986,5437,5448,7746,7972,7706,8340,8647,5401,0,7610,7588,7706,8467,8527,0,5291,8539,7858,8721,8816,8504,5655,5671,7920,8772,8783,8104,0,8104,5305,5432,7706,5391,5358,5291,7487,0,5396,8136,5296,0,7696,0,8711,0,5237,7972,8504,8170,5459,5578,8670,8249,5358,7653,7628,5274,0,8766,8179,8201,0,7706,5325,5453,5329,7592,7653,5476,7774,8104,7972,5209,8245,0,5606,7576,0,8104,0,5578,0,8110,8888,5325,5476,8762,5291,5717,5325,0,0,5612,8893,7521,5464,7706,7605,8451,7710,5534,0,8898,7786,8509,8010,0,8340,7972,7877,5666,0,0,5578,7628,7952,5464,5309,0,8039,5514,8772,0,5237,7800,7888,5708,7920,7478,7663,8249,7920,8249,7924,7972,8073,7616,7994,5386,5347,7834,7877,7768,5655,7734,0,7658,7893,5320,0,8903,5496,8297,5606,7710,7738,7977,8598,5464,8239,0,0,0,5309,7864,0,5564,7888,0,7864,0,5642,8539,0,8539,8201,7800,7935,8099,7706,7715,8179,0,0,0,0,5337,0,8245,0,7588,5564,5325,5419,8340,8073,8909,7935,5564,8201,7478,0,7924,8391,8334,8211,0,8249,8340,7681,8509,8126,7675,7528,7706,0,0,8670,7946,8816,7675,8033,0,8010,7482,8608,8297,8915,8048,8010,5726,5391,7849,8411,5491,5305,8919,0,0,0,0,5496,7888,5337,8052,0,0,5274,5666,5309,7706,0,5712,0,0,0,0,7834,5476,7482,7706,5578,5237,5476,7491,7864,0,7972,7653,8287,0,8104,5224,7908,5442,0,5480,7723,0,8484,0,8140,5564,0,8249,5301,8577,7738,0,7786,7779,0,7986,7828,7839,0,0,0,5325,0,5496,7790,8762,0,7637,7872,8727,8821,0,8277,5426,0,5476,5712,0,7849,5325,0,7653,0,5301,5209,8443,5642,0,5301,7706,8811,5301,0,0,0,0,7588,5442,0,5661,7930,7500,5485,7734,8093,7521,7571,7757,8104,8745,7823,0,7672,7710,8670,7628,5396,5301,0,0,0,5301,0,0,8217,0,5476,8381,0,7982,5564,0,7558,7823,8604,0,5377,8196,8473,5342,7994,0,7719,7663,7864,5381,8739,7893,0,7482,0,5514,8307,5296,5661,8115,8772,8227,7972,5476,5564,7864,0,7667,0,5496,5274,7800,0,5358,8093,5381,8005,7977,0,0,7843,0,7893,5329,7687,7849,0,8447,7616,7675,8909,8149,8115,8005,0,7542,8170,8647,8282,8307,7516,5651,5314,5661,7982,5651,0,8925,8827,5717,7823,7605,7834,7653,0,5476,8375,8354,8297,8093,8929,7628,7555,0,5476,7555,8196,7542,5367,5573,5309,5651,0,8136,7653,8443,5367,7834,5647,0,0,5612,7482,5248,7576,8211,8467,7555,7622,5514,5509,5301,0,8136,5391,5358,7839,7898,0,5676,7521,7952,5213,0,8329,7687,5642,0,0,0,7864,7924,7681,5337,5291,5301,0,5301,0,5325,7982,8427,5564,8227,8721,8170,8249,0,7558,8711,0,5301,0,0,0,5476,5224,0,5730,5509,7710,0,5717,7653,8073,0,7511,8179,8179,5476,8190,7834,5612,5524,5218,0,0,0,7628,0,5578,7538,0,0,8617,5309,8721,7734,7516,0,8805,0,7986,5476,0,7839,7834,5381,0,7994,5274,8381,5564,5717,0,5305,5564,8716,5274,7752,5301,8179,7763,0,8447,7637,0,7500,7555,8349,0,8795,0,8560,0,0,7628,7994,7605,0,0,5476,0,0,5564,5358,7605,5209,5320,5367,8447,0,5285,8190,0,8417,8164,5459,7730,0,0,7628,0,0,0,5329,7653,0,5476,8397,8427,7588,5509,8447,8721,5291,5413,8179,0,7888,7706,5642,7952,8699,5730,8329,5661,0,5296,0,5661,8073,7990,0,7500,8126,0,5573,0,5377,5573,7710,5453,8721,8527,5661,0,7888,5291,5296,8833,7730,7888,8093,8249,0,8039,8249,7610,0,7616,0,8721,8140,5301,8762,0,7864,0,0,0,8407,8407,5419,5401,0,8670,5237,0,7994,0,0,7849,5337,5329,8277,7742,8119,5676,7706,0,8267,0,7706,0,8873,5325,8349,8519,8184,0,5301,8093,0,8033,0,5274,7982,0,8443,5491,5491,7643,0,7935,5377,0,7495,7972,7511,7893,5285,0,5708,7516,0,8705,8272,7920,7528,5261,5661,8631,8272,0,5237,5661,7920,5642,5642,7555,8052,8566,7482,8010,7823,7710,7599,8467,5367,7576,8467,5391,5651,0,5717,8174,7893,7982,8447,7839,5651,8411,0,8136,7628,7864,7972,8566,7500,7672,5296,8329,5386,7653,7977,8307,5396,0,0,8140,5237,8022,5651,7528,7478,7723,5241,5442,5426,8484,8170,7643,5377,7800,5407,7706,8087,5666,5509,7935,8179,5381,5337,5296,7687,7588,5717,5386,5237,0,0,7710,7994,5305,8234,0,0,5372,5296,8375,8239,8149,0,0,5280,5708,8077,5342,8349,8772,7528,5485,8345,7738,7877,7994,8641,5325,8033,7935,7500,5274,7528,0,0,0,5386,0,7834,5688,8062,8022,7667,8239,8170,0,7800,8577,0,5573,7710,7521,0,5712,5320,8604,7710,7786,7628,0,0,8239,8149,5320,5578,0,0,0,0,7864,0,8302,8548,5291,7667,0,7957,7994,0,7605,7986,0,5578,7999,0,5476,0,8447,0,0,5476,8052,8387,7811,7800,7800,5726,8149,8052,0,8514,5274,5655,5320,7571,7605,8131,8190,5476,5377,0,5309,8179,0,8201,7779,7972,5325,5509,8721,0,8745,7663,5564,7952,8131,5274,8821,7972,8473,5476,5612,5459,7952,8119,8329,8033,5617,8745,0,0,8104,8062,7582,7558,7994,5459,5320,0,5325,8925,7706,0,5564,5708,5564,8312,0,8772,7687,7935,5726,5337,7849,5730,7952,7864,5419,8267,7853,5688,0,5564,7571,7982,0,8073,0,5291,8539,5291,5564,5464,0,5218,7805,5612,7710,0,0,0,7800,8936,7706,5407,5358,0,7972,7605,5726,8427,5325,7828,0,5301,5301,7986,7768,0,5564,5496,5629,5391,8560,7867,7706,8073,8136,7853,5573,8140,8354,8539,8033,5573,5358,8211,7904,5606,8438,8577,8527,0,5688,7681,5564,8144,5407,0,0,0,5655,5688,8451,7710,8005,8577,7898,8762,7478,0,5291,5329,8227,0,5573,7779,5606,8653,8227,5291,5647,5396,7893,5358,0,5280,8494,5325,5726,8005,7982,8140,5342,0,0,5688,7920,7930,8631,5285,8164,0,8140,5459,7710,8451,8249,8190,7888,5432,5578,5573,7877,7952,8676,7967,8919,8277,8909,8354,7768,5320,8093,0,8196,5564,5617,7681,0,7663,0,7723,7757,8370,5261,8082,8427,7610,8484,5301,0,8438,8164,8354,5291,8756,8010,7706,8062,5564,5329,8062,5480,8438,5606,5676,7706,5241,5485,7817,5606,7843,7790,7482,5329,8267,8170,7920,0,5661,8411,0,0,8164,8940,7478,5496,7786,7877,5352,7800,0,0,8617,8946,5622,7877,0,8519,5342,7930,8509,0,7972,7994,8438,8093,0,8028,8093,7706,8354,0,5476,5237,8033,0,8164,8033,8789,5337,5325,8073,7565,0,0,8140,8539,0,7628,5717,7500,7672,7849,0,8126,7817,7592,0,8387,8293,5337,8022,5661,8777,5642,5320,7834,8952,8239,0,7628,8073,5342,0,7834,5666,7516,7658,8762,8354,5325,0,8267,0,0,0,8170,0,8033,0,7521,5274,0,7952,7628,5666,0,5647,8033,5426,5688,8560,0,8903,7774,8539,7834,0,0,0,7877,0,5301,5612,7538,7538,0,5629,8456,7957,0,8451,5647,7864,8179,5381,5377,5325,8903,5285,5358,5666,5476,8104,8104,8312,5301,5437,7658,8312,5606,8170,7500,8010,0,7500,7696,8154,0,8297,8048,0,0,7779,5377,5651,0,0,8433,5712,7482,7746,5647,8005,0,0,5651,8164,8039,0,5651,8170,7920,5309,7599,5325,8249,5407,5529,8222,8811,7877,5301,5301,5688,5471,7616,8267,8033,5325,8297,0,7672,0,7952,8354,5296,7920,5496,7888,7877,0,8739,5617,5426,5534,5391,7710,7491,7653,7893,7491,7834,8857,0,7482,7888,5274,0,0,7867,7877,7653,8249,8354,8140,7542,5309,5261,7715,0,0,0,5241,7972,8104,7628,8711,5509,5442,0,7588,8959,5606,8739,8140,5342,0,5381,5407,5708,5285,7491,0,7491,7610,5372,8222,5401,0,7811,7672,7994,5274,8964,8073,5241,7605,7904,8249,5661,0,0,0,7675,5301,7687,5651,0,7491,0,0,0,5661,0,0,0,5261,0,0,5261,5291,5325,7565,0,5453,5708,5573,7478,8721,5661,8805,5661,8903,0,8772,0,5367,7500,5358,7487,8154,5241,7478,0,8489,8663,5391,7811,8144,5564,8663,5274,8196,7867,5347,0,8387,0,5699,0,8104,7972,0,8005,7542,8560,5476,8447,5241,8663,0,5391,0,7839,5291,7500,8267,0,0,5573,8479,7828,5717,5377,8062,8447,0,5301,0,5274,0,5237,8190,0,0,0,8277,0,7715,7558,5407,5358,7706,8093,8052,7898,5629,8539,5564,5274,8969,0,0,0,7734,5296,7994,5476,7491,0,7935,8052,0,0,5274,7877,7643,0,7653,7839,0,7706,8005,8110,0,0,7504,0,7982,8402,0,5699,8539,7935,0,0,7834,8239,5358,0,0,0,0,7555,8222,7616,8062,7839,5280,5377,7628,5666,8222,0,5325,5564,5274,8433,0,7719,0,0,7628,0,7663,7653,7883,5717,8539,7982,8334,0,0,8093,8349,8349,5401,0,5529,5655,8312,5564,8417,5237,8217,7883,8267,5274,7482,0,8217,5413,7982,7893,7893,7542,7930,0,0,5391,5606,8427,5407,0,5296,5564,5509,5305,8255,8239,0,7763,5717,8062,7628,7706,7888,8608,0,7904,8539,8190,8539,5358,7576,8174,8184,5476,0,7977,8245,7888,5237,7883,7681,5661,8227,8467,8721,7779,5413,0,5329,5325,8190,5320,0,5320,7982,8267,7877,0,8164,7864,0,7904,8527,0,5578,5501,8721,8201,5717,0,5464,8762,5377,8073,7542,7986,7610,7994,8427,5347,0,8136,5358,5480,5285,0,8201,8170,8312,5367,7994,5564,7849,8010,7877,7982,8925,0,0,0,0,0,8010,5459,8062,7710,8222,7482,0,0,8073,8821,5442,7616,0,5671,0,8267,5655,8387,0,5730,8438,8456,5717,8411,0,8052,5651,8119,8682,5358,7888,8104,8976,8589,7558,8297,8982,7790,8073,8422,7920,5564,0,0,7516,0,8514,7478,7706,7972,8033,5367,7849,8940,0,5730,0,5564,7648,7643,8456,7542,0,5237,8391,8005,5717,0,5708,8589,8617,7957,5655,5296,8179,0,7516,8136,7653,8762,5309,7746,8010,7864,5386,8062,8062,5529,5529,0,5358,0,5337,5476,5529,7730,7628,5301,5301,8467,8217,8052,7867,8873,0,0,8039,8201,7994,7994,0,8345,7500,8987,7946,7924,0,5642,0,5358,0,7946,8272,7511,0,7605,0,7706,8783,5476,8307,8467,8140,0,8073,8179,7924,0,5476,8184,8670,8543,0,8282,5305,7663,8869,5617,0,7972,7924,5407,8467,8217,5377,7994,8329,7972,5476,8504,5391,7982,8884,5476,5407,5342,7616,8222,7982,7982,5661,0,7924,5401,0,8869,0,5407,7605,7616,7834,5309,8519,7883,0,7908,5476,7491,5407,8869,8381,7839,7542,5529,8073,5651,8839,5651,7779,7706,7706,8087,5358,8073,5413,5432,8447,7994,7811,8010,7706,7511,5564,8608,8608,0,7706,8658,5480,5476,8073,7858,8073,0,8190,0,0,7628,7710,5329,5476,5301,0,5453,5237,7478,0,5666,0,7999,8397,8287,0,8345,7696,7628,8873,5564,8302,7811,5573,5448,0,5358,5459,0,8539,5301,0,7653,5437,7786,7558,7957,5305,5651,8349,5708,7883,7605,5464,8010,8919,8316,0,8762,7982,7994,5325,7710,7516,0,8334,5407,8077,7632,5325,0,0,8077,5476,0,5509,8387,5280,8073,0,8093,8811,8154,8370,0,7946,8005,8433,0,7843,5358,7811,8312,7742,5407,5377,5342,0,8217,5708,5407,5305,7952,7908,8345,7538,8745,5501,0,8898,8052,7888,0,8716,0,5381,5564,8994,0,8227,8077,7800,0,7839,0,8144,0,8539,5564,7681,8443,8494,7893,7774,5352,5391,0,8110,7706,5496,7533,8073,7800,8548,7839,7952,5325,5347,0,8249,7746,7533,5329,8498,0,7511,5476,7752,5301,5301,8833,7605,7643,7914,7710,5426,7599,0,8154,7920,0,5712,7935,5712,8783,8170,8417,0,8447,8613,8093,8387,0,7706,0,0,7898,0,8115,5381,7628,7528,7930,7904,5480,0,8255,5337,8539,5381,5305,8119,5261,7706,5261,5651,7883,5476,8845,8845,7853,0,5529,5476,8805,7681,8711,7511,0,5301,0,5329,7500,8451,7904,7511,8170,8427,8170,0,8443,5274,7972,0,0,7972,0,0,7986,0,8845,7864,7715,7548,8539,7834,0,8845,0,7843,7628,0,8136,8370,5396,8427,0,7957,7877,5459,7994,8190,5372,8438,0,0,0,0,0,5480,8433,8739,8909,8028,8149,5329,5476,5661,7834,8745,7734,5442,5274,8721,5381,8277,8249,7491,0,5301,7482,0,0,8909,7628,0,0,5496,8762,8062,0,5237,0,7706,0,8467,5325,8267,7565,0,8560,5655,7982,0,0,5381,8456,8811,8190,0,8479,8255,7839,5459,7904,7681,5509,7839,7972,8126,7478,8222,7883,7904,8316,0,0,8484,7952,7839,5337,8467,8149,8484,8998,8028,7864,7864,5426,7849,7834,5647,8201,5413,5568,7805,0,7706,8467,0,0,0,5730,5464,0,5676,8005,7864,5325,5305,5248,8222,7478,5655,7500,8245,7710,0,8827,7538,5568,7834,8179,0,7849,0,5347,8316,7628,8560,5386,5301,5501,7734,8093,5708,8190,5476,8190,8249,0,5666,7834,8222,5459,8093,5391,5285,8577,5485,8170,5377,7920,8461,5285,8359,8201,8539,7811,5642,5301,5651,0,0,0,8504,0,0,8647,5329,8093,5476,7774,5261,0,5320,5480,5305,7849,8964,5224,5352,7643,0,8039,8201,5301,7877,8126,8451,8249,5612,8322,7972,8582,5358,5708,8249,5274,0,7853,0,7994,0,0,0,8149,7877,8447,8447,5301,7582,8170,5407,5564,8302,7687,8272,5407,8789,8387,5485,8811,8539,5407,5712,8245,5407,5617,5661,5437,8211,5301,8234,7628,7738,5578,7924,8641,0,7849,7757,7994,8267,7687,5726,0,0,0,8805,7786,0,8936,5564,8964,7738,7738,5314,7653,5255,7849,0,7576,8073,7511,7555,0,8174,8539,8302,5377,7908,5377,7706,5325,7710,8994,5309,7990,5301,8170,5726,7986,7786,5280,7706,5274,5407,5391,5274,7663,5396,8170,8115,5642,0,5325,5496,8795,0,0,7834,0,0,8316,7823,8354,0,7710,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5476,5693,8898,7706,8987,5367,0,5305,8015,8589,8987,5367,5325,8201,7628,7746,5671,5442,5442,5622,7867,7920,5391,5391,5688,5224,7491,8827,7582,7487,7558,9003,5688,7779,9003,5337,7779,7834,5224,8940,8234,8484,5717,8387,8322,7548,5325,5381,8527,8721,8732,7877,7516,5314,7605,0,5509,7883,7994,7605,5485,5301,8170,8959,5564,5476,5476,8716,0,8484,8484,5578,5642,5476,0,7972,7478,7687,7982,8048,5333,7548,5255,8334,8255,7982,8625,7558,7558,5476,7482,0,7763,8484,7706,7491,5237,7521,5671,8484,0,0,5320,0,5391,5325,7700,7977,0,5391,0,0,8349,8375,0,8613,5529,7834,5564,8302,8136,8811,0,0,0,0,8811,7710,7952,8811,8375,7516,5476,5291,5333,0,7628,5241,5391,5391,7696,5573,7628,7628,7628,8267,7982,7706,7478,5485,7487,5342,8682,8682,8387,5661,8387,7706,8387,5325,7853,7599,8756,7738,5285,8370,5476,7877,7946,7715,0,7521,5485,8805,7779,7521,5485,7491,8196,8073,5337,5661,7883,5401,7888,7994,8504,8504,5325,0,7599,5476,5391,8504,5333,5693,8115,5309,7734,5442,7904,8015,5309,5381,5224,8705,8827,9008,8589,8099,0,8777,5209,5391,7738,8015,5564,5274,5274,5480,8062,8316,8504,7542,8811,5476,8539,5491,8093,5476,8783,8227,7730,8987,5476,7715,8514,8504,7977,8783,7924,7542,7548,7920,5509,7478,5407,5381,5642,8527,8777,8504,7599,5501,8539,7565,7548,7706,8456,7628,7757,5471,7752,5476,7528,8756,5476,5325,7663,7478,5325,5564,8048,5519,5309,7930,7883,5564,5629,7548,5337,8154,5296,7628,8402,8732,8589,7994,8732,7935,8387,5274,8987,8227,8099,8777,8329,7528,7994,7605,7710,8190,8293,8073,7786,8447,8447,5661,8282,7500,8093,7576,7914,5726,7487,5413,7487,7977,7920,5476,7487,7663,5241,7828,7653,8349,7883,7605,8201,5726,5358,8670,7839,7994,8539,7605,7571,5337,7924,5377,8427,7849,5358,5480,5617,7628,5476,9008,7571,5568,8381,8316,8447,8190,5726,5218,8631,7542,0,9012,0,8456,8359,7849,8149,7521,5717,7924,8126,8048,8391,7977,7696,5224,5325,8727,8154,7952,7768,7681,5285,7839,5476,5391,5426,7914,5480,8795,7972,5671,8277,5476,7710,7473,8687,5301,7482,5391,5651,7605,7500,5337,8345,5329,8711,7696,8099,8316,5496,7710,8329,7817,7576,5476,8613,5407,5367,7977,5437,5329,0,5285,5655,8604,8255,7908,7637,8381,8789,5309,7478,5730,7592,7558,5655,7571,5442,8196,5329,8170,5320,8805,7914,5480,8073,7823,8052,8411,8422,7628,5237,8140,7864,5688,7500,8582,7692,7478,7667,5476,5564,7843,8443,8255,5301,5218,7643,5485,5274,8589,5213,7588,5564,5237,5301,5564,5255,8222,7628,7487,5367,7528,5519,7628,5377,7935,5442,0,7834,9016,5301,8277,7487,5407,5519,5564,7849,8170,7675,5213,5407,8473,5573,7893,8527,8387,8345,7930,7628,7528,5358,5407,8227,7710,5224,8365,5642,8402,9016,5509,8277,8777,8548,5717,8721,7930,5606,5320,5320,8514,8479,8772,5291,7805,5426,5352,5629,5730,5476,7706,5377,8811,5485,5381,5342,8227,5381,7565,7972,8571,5676,8548,8170,7542,8447,8099,5314,7994,7632,8022,8873,7643,7582,5209,8543,7478,8170,8716,7774,5407,8533,7491,7972,8302,8745,0,7616,7558,5407,7834,8699,7548,8104,7977,5381,7994,7628,5224,8893,5377,7994,7858,7834,8527,5629,8494,7864,5661,7935,8119,8795,8539,7571,5496,8805,7930,7491,5464,5642,8427,5442,7834,5337,5407,7500,7687,7839,5564,5358,7972,8548,7746,5325,5476,5661,8329,7487,8676,8604,5655,7742,7853,7853,7930,8925,5329,5381,7994,5501,8227,7952,5448,7972,7588,5367,5564,8467,8164,5301,8613,8267,8131,7538,7898,7828,5629,8052,5381,5237,5261,7542,5291,8777,5573,8589,7930,7675,5218,5642,8772,5612,7924,8048,5224,7977,5491,5437,5629,0,8888,5573,7495,8179,5666,8402,5218,5372,8548,5352,8022,5708,8732,7628,8533,8694,8987,8322,5485,7710,8302,7653,8015,8745,7834,8539,5237,5329,7930,8647,5309,5401,5329,7800,7542,5274,8772,7616,7582,5622,7521,5261,8255,7592,8422,9021,7734,5237,8149,8227,8687,8239,7706,8919,7877,7994,5325,8010,5296,8732,5407,7883,5285,8484,9026,5501,5274,5291,7864,5285,5407,8316,7516,8073,7786,0,7588,5274,5419,8438,7491,5309,7977,8255,7920,8527,7576,7663,8159,5476,7667,8789,7877,5476,8903,5485,8190,7908,5407,5573,7883,5285,8302,5437,0,8888,8345,8613,7658,5442,7637,5347,8447,5309,7542,8249,7478,8381,7723,8447,8227,8577,5666,5329,8582,8222,8762,8473,8365,7972,7487,5337,8052,8033,8033,5301,8909,7994,7610,5573,7877,8261,5320,5296,5301,7632,8365,7495,5629,7834,5666,7700,7696,7478,8267,8365,8467,7504,5248,7999,7504,5274,8687,8217,7990,8217,7746,5647,8227,7696,8217,7696,7528,5647,7487,7834,7834,5391,5391,8903,7542,8307,5501,7790,7914,8307,8126,5485,5301,5464,8613,7599,8028,7768,7779,7628,7904,7817,7511,5237,0,5347,7817,5606,8721,5426,5224,7706,8170,7828,5209,0,7924,5407,8087,5325,5476,5325,7877,7592,0,8297,8028,8467,7790,8461,8297,8604,7592,8604,5437,7795,7592,7790,7576,8711,8131,7500,7746,5651,8164,7482,5661,8795,7667,8789,5476,5651,5391,8721,8249,7548,8170,8467,8391,5568,0,5564,5661,5651,5224,7582,7658,8461,8527,5224,7982,5248,5291,7982,8582,7491,8873,7533,5564,8438,7582,5274,8577,5367,5407,5485,5320,5712,5647,7706,7786,9032,8022,5485,7779,8745,7757,8093,7582,8811,5407,7482,8694,5476,5301,8777,8391,9038,8402,7487,7888,5309,7516,7516,8381,5237,8762,5325,8010,8010,8010,8527,8170,5573,0,8527,0,0,5564,8527,5255,8527,8509,5464,8509,8811,8919,5255,5726,7504,7908,5647,5708,5573,5325,8903,7653,7653,5372,8479,7757,8479,8504,8504,8519,5501,7867,5476,5325,8795,7542,8879,5573,7752,5325,7883,5426,5396,5509,5291,5301,8354,8577,7511,8115,8461,8519,5564,5573,5726,8170,5261,8438,8093,7548,7533,5432,5381,5381,8222,5301,5261,5432,7877,5485,7795,8682,8479,8519,8005,7692,7888,7696,7972,9045,7768,5496,7839,7990,5381,7952,7839,7952,8509,7888,5325,5377,5485,7957,8682,8115,8467,8451,5529,7990,7986,7542,5496,8519,7795,5407,8451,5301,5377,7893,8057,7877,7706,8519,5209,8461,5509,8073,5325,7888,8745,7834,5314,5407,5325,8073,7834,8170,8154,8119,5407,7888,8676,7478,7795,5564,8119,5407,5717,7687,8509,8519,5676,7877,8641,5329,5301,8998,5261,8647,5568,5285,7795,8255,5291,5396,7687,5314,5401,8170,7920,7511,7952,5285,7952,5407,5407,5629,8154,5325,5407,5476,5407,7972,7877,8498,5305,5301,7605,5301,8387,7768,8282,7817,7977,7478,8349,8577,5309,8946,5661,7972,7582,7605,8293,5381,5726,8670,5476,7605,7622,5301,5485,8149,8149,5676,5568,7924,8631,7675,8711,8582,5381,8577,7849,5391,7990,5485,8052,8073,8438,7710,7843,5218,5218,7746,7990,8329,5676,8745,5329,8057,8249,8277,5333,8509,7746,7582,7500,7500,8795,7478,5476,8329,5534,8119,8149,7715,5329,8647,5391,5325,8196,8322,5285,7768,7924,5476,5291,8010,5676,8316,8170,7883,5661,8349,8329,8329,5329,5301,7935,8261,7768,8222,8670,8267,8484,8222,8131,7478,8267,0,0,5671,5671,8222,8827,0,7504,5352,8170,8272,5717,7734,8345,8174,5564,7817,8245,8484,7723,5358,5396,7930,5386,7710,7565,8484,5476,8925,5419,8756,5419,8582,7982,5367,5726,8411,7952,7867,8205,8582,7893,7982,7853,7952,7952,5296,7883,7952,5401,5401,7940,8762,8484,5726,5237,7920,5726,5476,5280,7834,8411,8447,5726,5391,7528,7542,8184,7730,8443,8119,7478,5296,8282,5391,5237,5509,5396,5661,5509,7930,8443,5314,5661,7883,8349,7823,7883,5325,8073,8952,8201,8582,8411,8201,8427,5280,5329,5337,5329,5237,7795,8494,5661,5381,5381,7994,8608,7723,7972,7790,7482,7994,8670,5325,5699,8375,5391,5676,5661,7500,5309,5699,7478,5325,7864,8745,5237,0,7653,8427,7864,8805,5301,5578,7653,5301,8387,8387,7834,5617,7972,7687,8334,0,7849,8387,7972,8604,8334,5377,5301,5617,5730,8805,8397,8451,7893,8467,8604,8467,7521,7834,5301,5291,8302,7828,5573,8484,8196,5708,7952,7834,7487,5301,8227,5347,5301,7834,7834,8467,7487,7817,7516,5688,5726,5726,0,5666,8762,5274,5622,8589,8179,8179,8179,8179,7663,5491,5337,5496,5325,5337,8617,8010,8087,8625,7904,8048,8893,5391,5320,5314,5726,8087,8411,7500,7977,7533,5448,5524,7994,5448,5459,7872,8827,5568,7786,8170,8093,7795,8272,5568,7972,5285,7999,7904,5693,7990,7658,7710,5391,5337,5688,8312,5661,8052,7487,8772,7710,5333,7757,5325,0,8062,7763,7500,8211,7710,5717,8190,5642,5209,7849,5325,7757,8879,8316,8391,5730,5301,5647,7521,7687,5367,7491,5329,9051,7538,7742,5529,5476,7667,5442,7516,8068,7482,7893,5358,8196,8196,5381,8201,8998,7904,5471,5501,7864,7653,8805,8560,8598,7706,8062,7972,7914,7478,7478,8783,8884,5529,5237,7805,8307,7752,5730,7742,7478,5524,8387,7667,5329,7864,40,5712,7663,7706,7558,7478,5524,5564,915,2998,7710,8119,8884,8068,5564,5476,5491,7742,5301,8126,8467,7908,3123,8322,7478,1325,3137,7768,9054,7752,8447,9059,8093,8297,5337,8539,7576,3194,7576,8964,5237,2957,1400,5255,5209,7786,5209,7994,7500,7849,5386,5367,8456,2806,7675,7914,7982,8391,8245,5726,8170,9062,8925,855,7888,670,8174,5358,5564,819,2654,7687,7849,8370,8484,5218,5564,5699,7576,50,9012,7786,9012,7571,8201,7610,7582,8381,0,7487,5274,8154,7706,7696,7864,8687,7687,5237,5476,8577,5209,7763,5651,7972,5642,5325,7576,5717,8952,8365,7675,7990,5296,826,8359,8272,5274,2675,8190,5519,8082,7834,8149,5476,7663,8751,7914,8316,8062,7504,7710,8631,5201,5437,842,2950,5213,7521,7663,8727,8582,8387,8245,7675,5358,8354,2792,5396,1620,7908,7888,2537,5325,8789,8711,9067,8052,8467,7610,855,8211,5717,7864,7710,8670,5301,8136,8443,2665,7692,7675,852,1783,8073,5578,7687,2816,836,3009,5333,5342,2830,8201,7653,7946,8845,8851,5717,5337,7834,7786,7786,8126,7653,5612,8104,5476,7663,7977,5647,5274,36,5301,5237,5629,7571,5688,124,7478,121,8387,8307,28,60,8196,7538,32,4535,905,1518,8149,139,5612,5372,7811,5030,8302,5325,64,371,8527,106,7982,7706,8087,7994,9045,8227,7696,5301,8322,8345,5381,9067,8184,7628,2381,8277,8302,162,5480,7982,7663,7576,26,8800,5314,5314,8987,8539,7946,5347,9051,7675,7521,8068,7478,7752,8402,8302,7982,7706,32,8272,7883,7883,852,1775,109,1318,8287,7849,8387,7706,670,8456,7779,5274,7920,8302,7986,8115,2409,2418,8994,2440,7719,5622,8077,2468,2475,2213,2216,7768,2229,8073,5693,7843,7675,2261,2265,7710,5377,8345,8484,7883,7990,5218,7994,7823,5261,762,56,7986,5381,5730,7653,5459,7576,7637,8082,9071,7628,7482,8365,5642,8494,7746,7982,8267,8732,5296,7811,7811,5237,7849,5325,8005,2792,7994,8302,7500,5464,8762,8077,8190,7779,7628,8940,7710,8255,7834,7883,7440,8179,5301,9067,7687,54,7622,7616,9054,0,8005,5237,7628,5381,7957,7692,5514,8154,5377,5642,7849,9051,5519,8322,7719,5218,7588,8062,5661,5476,5612,7538,5496,8370,7990,7738,8940,5606,8613,5448,8631,5325,8334,7478,5274,5391,5717,5209,5381,7632,5534,8631,7487,7710,8052,5612,7977,8370,5612,8196,8077,7849,0,8159,8044,5717,8136,9075,7663,0,8316,5358,5708,5708,5401,8402,5578,5305,5448,5448,8772,8539,7706,5285,5248,5285,8509,8772,8589,8340,7977,7663,7675,8647,7957,5205,7786,7675,7982,5296,8039,7742,5274,8115,8227,7500,8312,8407,7538,7538,7982,5666,8762,5205,5629,7491,5413,7616,0,5285,5651,7675,5396,8349,8297,7571,5352,8149,7675,5325,7605,8783,8005,8397,7675,7487,8052,5564,8239,8255,5237,5519,8772,8772,5305,8329,7864,9021,8010,7710,5296,8365,8519,8140,7883,7628,8068,7558,5285,7491,5237,7706,8052,5401,7500,8919,5296,7482,7734,5291,8196,8329,8077,5329,7487,7834,7616,8245,7883,7628,7576,5309,8789,8354,5296,7706,7864,5372,5476,5391,5285,8467,7663,5218,5291,7908,7628,9054,8479,5717,7528,5471,8903,0,8159,7920,7920,7482,8397,8381,8539,5347,7738,8154,8613,8052,5367,8387,7888,5237,5442,5325,5309,8052,5377,8227,0,0,8936,5377,5329,5296,8073,5337,8077,7482,7982,5305,5464,5578,5301,7511,0,7700,7675,5305,7834,5301,5329,7610,5564,7883,8033,8751,7920,7521,8154,5305,5237,7888,7692,7834,7877,7616,8261,7828,7986,7738,7675,5285,8287,7811,8154,5622,8077,7675,8936,5301,7877,7637,5301,5476,7632,7700,8365,7588,5237,0,5407,24,7605,64,8077,7700,836,2998,7994,5296,1311,5688,7487,2675,5407,5296,7528,7482,7823,8641,8641,5471,8756,2947,7592,1400,429,8827,7982,1620,8467,5337,2599,8653,8827,7994,5647,7994,8099,819,8658,2651,8093,7786,852,1783,8039,5647,5337,8039,7482,7643,7734,7628,9080,8467,8099,7768,7628,8745,8039,8732,7994,9085,7768,9092,9097,8467,8467,7864,9104,5647,9113,8641,9122,5296,5476,8467,9130,8375,5647,8387,9137,8805,8119,9146,9152,9157,8387,5437,7994,5717,9164,7478,7952,7920,5476,8539,9172,9181,5655,5314,9187,9193,9201,9206,8582,8227,7706,5034,9214,5325,9220,7972,7972,8282,9224,9230,8196,9235,7667,9240,8068,7565,5501,8543,8772,8795,7920,7571,8946,5358,9247,9253,9259,9263,7908,8539,5485,5407,8772,5301,7904,7478,5501,8863,8312,7533,5629,8653,5726,8772,7972,5480,8811,5255,7828,7795,8447,7658,7920,7592,7924,9008,5708,7511,5688,7715,7990,8131,5529,7904,7710,7935,8093,9272,5564,7982,842,7805,7986,7610,7610,5329,9278,9281,8174,9285,5426,7582,9288,2462,5329,9298,9301,5666,5671,7482,5730,2465,7999,5564,8687,5642,7888,9305,7952,5496,7924,7482,8048,8131,8467,5459,5661,8800,7592,9308,7864,9312,7828,9316,7478,7473,9320,76,2406,8509,2468,5386,8345,5426,9326,7811,7898,8456,9329,5476,7482,3679,7500,7805,8433,8845,7663,9332,9335,5699,5218,142,9338,429,8349,7843,4262,7558,7834,5309,2422,5666,8577,8201,7558,9341,303,5391,8329,8039,2274,7491,8184,8539,7628,8201,8387,5676,5342,7920,7558,5509,8170,8099,5241,8571,5248,7582,5491,8772,8345,7774,5320,5413,8795,7972,7888,5476,7972,5476,8456,5325,9032,7706,5514,8170,8447,7692,7990,5629,8653,8447,5407,8217,5309,8461,7628,7864,5352,7786,5647,8873,0,8387,7542,0,8345,0,7888,5386,5647,7558,7482,7643,5358,5401,8039,5459,5622,5730,8222,8222,7628,8539,7790,5381,8821,7864,8845,8795,8548,7628,5464,7864,5642,7834,8222,5325,5712,8227,8762,5480,7482,8527,7548,5381,5655,8527,8461,8732,5407,0,0,7521,5464,8873,8676,0,8190,5325,5325,7908,7616,7738,7558,5218,8509,7588,7588,5391,5651,7738,5534,7558,5647,5629,5699,7548,5301,5352,7898,8159,8205,8217,5606,7478,7558,8329,5717,5655,7663,7817,7834,8795,5606,8467,7752,5661,7511,0,7843,8227,5352,5413,8033,8140,5329,7742,7542,5712,5305,5622,8617,5320,7957,7710,7800,8473,5485,7706,5320,8539,8015,8795,5218,7828,8033,7972,5237,8039,8322,5309,8539,8987,7715,8402,7834,7738,8833,7706,8322,7779,0,8863,8255,8833,7500,5261,5261,7904,7734,7908,7582,8010,5699,5305,5471,5471,5471,8539,8119,7888,7888,8772,8919,7478,5501,5464,8772,8245,7491,0,0,7628,8322,5325,8255,8800,5476,7920,5358,7828,5419,7491,5218,8073,8772,5347,8170,8359,8903,8261,7542,8329,5347,5237,7849,7663,8387,8479,8052,8821,0,5666,8582,5329,7834,8772,7994,8359,7610,7610,7872,5301,7516,8261,0,8329,7834,5666,7904,0,5391,8504,0,9345,9345,8119,5476,8349,7990,7605,9345,7982,7982,8653,5476,7982,7500,8653,8087,8211,9021,8087,5476,7972,7786,5573,5419,8527,7930,0,8411,5342,8658,8093,5564,7571,5367,7504,0,5386,5367,8005,5237,8082,8467,7790,7588,7888,7888,7491,8745,0,8131,8131,7706,8249,8249,7482,8154,8033,8245,8115,5606,7658,5564,8625,5642,7924,8560,5524,5391,8543,7658,7853,7834,5358,5476,7473,7977,7888,0,8582,8267,7977,8994,8869,5401,7811,8539,7834,8174,7768,7706,8716,8527,5661,5501,7828,0,8005,7967,7811,7706,8509,7687,8543,5476,5419,8272,8205,8543,5237,7521,7893,7757,8329,8946,7828,5708,5617,5534,7533,5708,7478,5708,5419,5401,7888,8267,5419,5391,5501,8154,5358,5401,7888,8293,8293,5693,8716,7542,5407,7738,8484,7823,5496,8052,5274,8010,5325,8851,8613,7893,7599,8062,9345,5564,7538,7883,8504,5564,5485,7834,5661,7752,7548,8994,8762,5325,8946,7548,5642,5309,8267,7622,8456,0,8354,9345,8816,7834,8136,7528,5501,5358,7628,5480,8527,8467,7565,7478,7628,7952,8762,7904,8447,7576,5314,7999,8245,8716,8467,7853,8190,7972,7864,5712,5305,7706,5358,7914,7867,7864,7849,7500,8048,5241,8438,8282,7715,5564,8093,5209,5209,5391,8297,5261,7924,7800,5381,7786,7487,5426,7994,5209,8170,5261,8751,8504,5642,8316,5419,5320,5325,5671,8987,8144,5676,5285,8131,7715,5407,5407,5476,8184,7972,5325,5325,5274,7946,8687,7667,7473,7834,8391,8577,8456,7834,5337,7834,5496,7914,7482,7710,7952,7768,5209,8022,7994,8062,8631,7957,8387,7648,5285,8375,5255,5274,8670,5301,7558,7675,8211,0,5612,7478,7994,7990,8277,8287,5693,8929,5426,7823,7628,7495,8456,8028,5676,7914,7972,7653,8539,9345,7864,8751,8422,7653,7746,7478,7834,7478,5237,7834,7628,7487,7628,8631,0,5274,8170,5726,8839,7706,5274,8863,7582,8227,5329,7663,7864,7864,7957,7746,8827,8057,8170,8312,7774,5693,5509,8473,7675,5320,7706,5296,5564,7864,8494,8772,7893,0,5381,5606,8447,7768,5485,7643,5485,7542,7828,5426,7982,8631,8277,5358,7482,5442,8287,5564,5485,8099,7834,5347,8653,7482,8387,0,5301,7828,5274,0,5396,7616,7877,7914,8805,8903,5642,7478,7823,8893,7977,7853,7500,7628,7994,5377,8110,5712,7883,8821,8196,0,7478,7542,8104,7790,5564,5381,8676,5237,7548,5712,5464,7746,8345,7616,8190,0,7994,5712,8467,5655,5688,5377,5661,5480,5401,7790,8297,7487,7858,7994,8631,8484,7982,5708,0,0,7500,7853,7952,7967,5642,7920,5237,8467,7616,8164,8613,7710,7511,5712,7533,5708,7538,8131,8005,8196,7977,5514,5655,8467,5496,5218,8391,7616,5325,7588,5453,5274,8272,8334,7843,5386,8222,7663,7920,8751,5476,8647,7628,5666,8190,7800,5476,8015,8756,5218,8447,5301,8539,7952,7834,5309,5622,8227,8604,7653,5362,8149,5305,5578,7982,7982,5708,5362,8322,0,8959,7786,7478,5285,5480,8427,7790,5274,5274,5305,8239,5401,5396,7952,8919,7972,7500,0,5396,5237,5296,7648,5237,7834,7877,5285,5712,8010,8010,5274,5476,7994,5285,5564,5391,5358,5261,5342,8322,5401,7811,0,5453,7582,5476,8179,7663,8929,8766,7538,7681,5442,5309,7839,7628,8751,0,7500,8716,7834,7658,7616,8179,5453,0,7616,7746,0,7538,7914,5426,8447,8762,7511,8467,5347,7834,8617,8093,5285,8929,5347,5274,7616,8617,8952,7768,5651,5301,8375,7834,7605,5347,5209,5381,5291,5291,8571,8267,5209,5209,8879,7962,5564,7930,5209,7675,7528,8249,7487,7658,8222,5325,7786,8293,5529,0,5622,8370,8375,7962,8359,7763,8827,7542,5320,7877,8387,5209,8447,5564,5209,5301,5529,8073,8613,8277,8077,8077,7616,8375,7746,7605,8164,7738,7952,8533,7723,7628,8087,8345,5647,8022,5509,8110,5642,8062,5476,5485,9032,5651,7605,8903,8062,8548,8721,7576,5693,5509,5476,8222,5391,5391,5248,7914,7990,8190,5391,5337,7811,5476,7681,5391,5274,7817,7558,8658,7817,7675,5437,7687,8222,8370,7834,7675,7977,7914,8033,8164,5464,5651,5568,8739,8888,7588,7774,8365,5325,8467,5325,7482,5651,5568,8745,5699,5655,5407,5564,8381,5224,7811,5712,8196,7653,7628,5391,8381,8196,8381,7972,7628,8222,8739,8381,8196,5305,5496,8170,7795,8196,7982,7478,8239,5391,7605,8533,7914,7994,5661,8739,5296,8239,7667,7811,5476,5476,8222,8196,5248,8222,8527,8879,8217,7487,8329,8479,7672,8217,8087,8312,8527,5622,5564,5617,7990,5419,5419,5622,7994,9021,8329,5320,8217,8479,7675,5325,8670,7696,7696,7696,5205,5407,5320,8033,8987,8987,0,5205,8227,8239,5274,5274,0,7599,7599,5337,8239,8239,5642,8211,7599,7599,7599,5205,5642,7888,8005,7548,8484,8811,7786,8811,8422,8811,8811,5391,7482,7710,8898,8447,5309,7994,5453,8170,7920,8554,5237,5358,8170,5381,5606,5726,5377,5381,7478,7757,5391,5391,5255,5325,5661,8033,5237,8447,8427,5237,0,7800,7864,7957,5255,5377,7893,5320,5661,5647,5329,5329,5237,8554,5329,8170,5661,8170,5291,8239,5291,5320,5237,7935,8068,8447,5261,0,5274,5301,5529,0,0,7610,5476,7706,8504,7478,7653,7914,7628,5573,5342,7706,0,8354,8282,5642,8608,8387,7478,5381,7864,5325,7542,5501,8467,7706,8433,7542,7706,5496,5381,5726,8461,5274,5708,5347,8479,7904,7571,7571,7924,8170,8461,7990,8131,5529,7930,5301,7681,8170,7834,5564,5519,7977,8093,5480,8456,5337,5491,8582,8354,5726,7982,8312,8438,8345,7681,8093,7710,0,7582,0,8005,5519,7790,8316,5529,5476,0,7849,7990,7632,7864,5564,8329,5459,5329,8345,7696,5671,7768,8316,5476,7715,5391,8345,7994,7982,7972,5651,5301,5325,8316,7994,5337,0,5367,5301,5642,5285,5241,8375,5285,7864,7864,7628,7491,8201,8255,8658,8527,8527,5386,5301,5337,5274,8062,8479,7914,7558,5647,8845,7667,8052,5367,7482,7628,7843,8795,8149,8277,5274,5699,8571,5248,5248,7738,0,5396,8170,8277,7706,8438,8653,8653,8443,7786,8402,8387,8387,8461,8099,8099,8873,5291,7888,5241,8039,7482,7582,7653,5241,7994,5642,7920,7834,8022,5381,5413,8443,5291,7582,8427,7786,7482,0,8115,5464,7628,7994,7924,8527,5688,5471,5377,5476,7972,5391,5437,5642,7864,7605,8795,5329,7834,5712,8811,5325,5325,7811,8805,8119,5712,7542,7478,7628,8548,5347,5291,7834,7834,7994,8548,5496,5342,8164,0,8196,7628,0,7957,5647,8217,5237,5534,8777,8903,8062,5381,7663,7511,7478,8022,8255,5209,7994,5413,7828,8451,7542,5218,8077,8451,5325,0,0,8022,8548,5419,8239,0,7877,5459,8433,5693,5647,7957,8015,8427,8427,5708,8340,5726,8322,8397,8397,8479,8479,5237,7628,8073,7610,7521,8554,8073,8196,5285,7834,8149,8427,7516,8239,8239,5309,8919,7888,9021,5285,7952,5642,8255,5642,5291,8427,5476,5529,5386,7491,7491,5476,7864,5274,5325,5661,7990,5237,8539,5708,8397,0,8447,8164,8479,8093,8925,7628,8354,7482,0,5381,5301,5342,7610,7610,7828,7616,5237,8170,7877,7616,8005,7834,7994,5386,7768,8783,8498,8375,7828,7828,0,7834,7834,7834,5386,7834,8732,7952,8732,7576,5464,5485,8329,8783,8783,8577,7817,7571,8255,8170,7817,0,7478,0,0,7637,5688,5688,5325,5476,7487,7904,7972,7999,7521,5476,5309,8329,5676,0,8329,5309,5564,8925,5358,5391,8201,5693,8952,8010,8077,5391,5501,8994,7972,5237,7982,7883,7994,8015,5629,5491,7538,8456,8994,8964,5564,5401,7972,7576,8073,7972,8539,5305,5476,5476,5255,5280,5676,8613,8952,5491,5241,8839,8255,5655,5391,8658,5237,7898,5491,7952,5442,5255,8015,8302,5509,5491,7994,8227,8302,7706,8115,8039,7790,8762,5730,5241,7500,5651,7994,8494,5564,5476,7898,5255,0,7817,7533,5464,8479,5651,7977,8909,5296,7548,5261,7800,7715,8473,8039,8115,7715,7898,8015,7592,7877,5564,7972,7982,8010,8519,5358,0,0,5651,8255,7877,5501,8249,7898,5442,7763,5573,5381,5274,5347,8811,5255,8184,7542,5224,5224,5426,8811,5642,7811,5337,5337,5325,7834,7920,8805,8115,8687,9345,5305,8745,5358,8196,5471,8519,7952,8387,8126,5381,7500,5329,7478,0,7692,7616,8539,8174,7828,8387,7622,8845,7839,5564,8316,8334,7893,7521,5476,7972,7681,7972,5519,8762,7571,7675,5647,7952,7692,8334,8805,5337,8201,5693,7558,8277,7930,5325,8345,5320,8756,5218,5480,8022,5320,8745,7628,7628,7622,5448,8604,7521,7893,8484,7849,5296,7511,8302,5401,7843,5448,5407,8057,8745,8484,8484,8196,5708,8144,7957,7482,8239,5491,5329,5476,5573,7877,5647,7487,7528,7622,8227,7478,7893,8687,0,7908,5358,8322,5661,7516,7516,8239,5329,0,7616,5274,8805,5218,5301,8805,7482,8329,7834,8805,8539,8312,5407,5296,8716,5296,7817,8184,8509,8411,5476,7706,8789,5501,8170,7834,5476,8205,5358,5476,5476,7696,8589,5391,7696,5391,5391,7817,7757,7482,7982,5564,8062,7478,8422,7710,5419,7904,7914,8539,8015,5291,8272,5564,8539,5651,5274,7982,8783,8293,5485,5655,5476,5651,7768,5509,8670,8893,8190,5485,5471,8015,5419,8322,5352,7883,8322,5358,5358,5617,7883,5407,8131,0,8048,5358,5568,0,5432,7675,7883,8144,8322,8062,5651,8144,5509,5291,5325,5325,7952,8903,5329,5329,8641,5296,7972,5296,5296,5476,5476,5476,5476,8154,8154,5261,5426,7752,8316,7834,7834,7628,7710,7774,8473,7757,8888,5352,5218,8647,8015,7616,7710,7710,5314,5480,5325,8334,7548,5476,7599,7935,5358,7710,8093,5564,7599,5241,8140,7599,5485,5491,5237,8329,8727,7924,8359,5329,5730,8631,7558,7972,7500,5485,5647,8827,0,8277,8827,8407,5213,5237,0,7706,8227,7972,8827,7576,8277,7628,5661,5381,5407,7710,7977,8411,5464,5564,8329,7994,8334,5642,7994,5237,5241,8647,7710,8407,5241,5241,5432,8407,5248,7935,5285,7994,5285,5296,5712,7610,7521,8222,5726,7528,5320,5358,5476,5333,8504,8479,5693,5671,5325,8504,8504,7877,8772,8594,8594,8811,7706,5391,8879,7972,7599,8211,5237,8010,7616,5606,8438,8438,7548,5248,7478,5325,7478,5237,7491,5337,5509,8827,7548,7908,7628,8411,7972,7706,8402,8033,7658,8068,7542,8184,7643,7504,8816,7599,5274,7528,8756,7982,8509,5501,8359,7658,8022,7478,7742,8227,8519,8170,5476,8222,8783,8438,8456,7571,8982,7924,5568,8282,8293,5386,5241,8994,8201,8964,7786,7982,8170,8245,5401,7487,5442,8539,5491,5476,5647,5337,5564,5325,5352,5426,8467,8447,8625,5564,5237,5358,5337,7867,8190,8827,5224,5464,7500,5573,7920,5237,5237,8772,0,8548,8217,0,0,5476,7710,8504,8329,5391,5237,8149,7946,8582,7715,7972,5661,5401,7681,5464,5459,8052,8571,7952,7946,5237,7675,5320,0,7473,5688,7924,5296,5296,7710,7977,5476,7504,8625,7516,5296,5209,7500,7710,7521,8293,8727,8869,7990,8316,5606,7817,7768,5237,5280,8354,5352,8800,8407,5296,7864,0,8316,7834,8509,8604,5386,8267,8211,5218,5218,8467,7920,8653,8255,8354,7628,7628,5381,5237,5578,7516,5377,7653,8052,7867,5377,8201,5476,7542,5296,5237,7930,7800,5476,7946,8022,7768,7558,5296,7478,7478,5337,5301,7779,7811,8827,5476,8354,5301,8566,5386,7864,5699,8190,7542,7478,8438,8827,7893,7930,7888,8402,8227,8514,5301,5325,8721,8721,5426,8479,7706,8571,5606,8099,5237,8795,8653,8447,8745,5442,5471,8039,7877,7779,5509,8467,5309,5325,7516,7628,8154,7849,7768,8772,5377,5377,8077,7599,8287,8201,7643,5237,5629,7528,7994,5296,7864,7872,8548,5407,5218,7828,8170,8179,7558,8407,7930,7867,8179,7883,8721,7888,5386,8267,7521,8863,5459,5464,8104,7723,9071,5426,8604,8411,7643,8548,5377,8255,5442,7930,8190,7994,5717,7542,7994,7628,7628,5358,8190,7811,8438,5358,5476,7746,5218,8509,8903,7482,7864,8033,8711,7990,7990,7628,7663,7867,7834,7495,8811,8267,8548,8159,8873,5501,0,8005,8005,5699,7817,8267,7588,7588,7706,5642,8022,5464,5325,7786,8170,8519,8447,5661,8509,5241,5218,8340,7962,7914,8073,8509,8467,5661,7643,5218,7924,5301,5514,8272,7482,7839,7500,7542,7658,5464,8267,7914,8391,0,5617,8827,8647,5305,7715,8039,7710,8179,8179,8179,8402,8438,8594,8015,8316,5708,8617,7800,8721,5699,5372,8484,5296,8509,5401,7742,8022,5309,7482,5329,8987,7994,8641,7800,7542,5617,5218,8745,8756,8539,7972,7957,5676,7706,7706,7628,5255,8239,8827,5337,5248,7972,8316,7558,7706,5726,5352,7930,5432,8104,5285,8833,7710,5401,5255,8005,5296,8255,7558,7482,7482,5237,5237,7883,8772,7888,8217,8217,7588,5291,8604,7675,8010,5501,8149,8149,5248,7653,7706,5274,8438,5485,8239,7478,8179,5291,8140,5274,8772,8119,7920,5476,5573,5274,5386,7883,8772,5485,8022,7653,5285,8082,7811,7582,8196,8196,5726,8340,8800,5661,7616,5708,7790,5476,7516,7719,7667,8359,8514,5347,7663,7516,7834,7795,5367,7710,7628,7482,5491,8249,7663,8249,8217,7706,5305,5347,8514,5442,7972,7495,7495,7834,7924,8073,7972,8582,8582,5337,5564,7511,7763,7558,0,7877,8249,5347,8359,8190,8261,7877,5325,8170,7811,5617,5476,5401,7823,5651,5629,5291,8461,8461,8461,5717,8354,7478,5407,7500,5320,8164,5237,7558,8494,5381,5717,5407,8322,8154,8322,8427,7582,7706,7977,5459,9353,7977,5325,5391,8795,5325,8005,5671,8919,8427,8519,5717,5407,5381,7628,5407,7834,5329,5237,8427,5237,5237,8287,5491,5726,7982,7982,7982,7864,5391,5301,7790,7982,5301,7565,5612,8411,7828,7592,8987,5476,5476,5261,7982,7893,7834,8087,9358,7774,7687,5688,5333,8201,7904,8245,8705,5564,0,5437,5480,8015,7757,8756,7628,7692,7653,7914,5496,5476,7786,5568,7478,5480,7542,7972,8504,8144,8514,5514,7924,8816,8282,7935,7648,5237,7542,8282,7977,7628,5564,5708,5237,7920,7972,5209,7864,5471,7999,7558,5325,7834,8582,8411,8783,8170,7752,7982,8354,5291,7904,8196,5655,5241,8267,5509,8293,5476,5320,9361,8057,7853,8307,8756,5578,8057,5564,8174,7904,5708,8115,8641,5568,8099,8322,0,7982,8222,5224,7972,5352,8772,7734,7920,7658,5642,5655,7687,7924,8222,7849,8447,5476,8539,7710,7920,8925,5305,5712,7914,8387,5442,5726,8438,5573,7977,5564,8427,7605,7883,7637,7715,8184,7986,5564,8174,8282,5213,8093,8136,8625,7542,8170,5480,7904,5480,5480,5708,8170,5314,7533,7999,8126,8126,8539,8447,8170,8144,7610,5407,0,5218,5347,8381,8073,8115,7542,8727,7795,5391,5381,5241,8566,7817,7817,7768,8969,8879,8365,8898,7710,5661,8604,5296,8751,5635,5391,8136,8073,7710,7795,7972,8144,7888,7888,7972,7867,8345,8789,5655,5717,5285,7692,7582,8613,7681,8577,7687,5329,5459,8631,5291,0,8170,7972,8375,8387,9361,7738,5661,5386,8903,5285,5241,5325,5296,8329,0,7663,5480,7495,8451,8073,8845,5377,5655,7558,5612,5612,8946,5712,7610,8170,5352,5407,5476,8805,5261,7495,5509,5661,5496,8527,5285,7478,7667,8484,8316,8653,8154,5647,5314,8057,5333,7904,7653,8670,8077,5676,8115,8022,7491,5291,8201,7811,8201,9021,5476,8533,7672,5448,5480,8149,7962,7898,5407,7811,8479,0,5509,8196,5352,5617,8577,8438,8514,5564,8126,8170,8479,8494,7663,5676,8354,8548,8033,7805,5381,5647,8543,8136,8184,7495,8443,8494,5237,5274,7558,7828,5514,8099,8745,8461,7888,8087,7757,8057,8539,8015,8234,5325,8272,5280,7706,5213,5320,7542,8093,5476,8387,5291,5241,7779,7795,5476,8154,5261,5241,5329,7774,8772,7935,5224,5381,5377,8571,8422,7834,8451,7967,8170,5606,7542,8800,8126,8087,5381,5329,8039,0,0,7972,7883,0,5274,5514,8721,5352,8467,7495,5407,5655,8484,5407,7628,7834,8005,7823,8062,8110,7920,7994,8159,7967,8190,7622,5377,8077,5496,5391,8548,5655,5476,8598,7946,8411,7924,7811,7834,8857,8345,7500,8387,8494,7990,8663,5325,5377,7986,7986,7558,8509,8484,8484,5647,5381,5296,8845,5248,8851,5617,5661,8467,7542,7491,5496,7687,7930,5642,0,0,5347,7752,8196,7877,5717,7957,8548,8845,5285,8131,8196,5218,5699,5442,7710,8427,7962,7962,8073,5573,8164,5413,8451,5514,7990,5642,8479,7972,8293,5661,5407,5448,5688,5524,5274,8851,8940,5309,7763,7864,7805,7495,5261,7738,5381,5629,7533,8282,8245,5301,8272,7982,7972,8631,5367,7542,7752,8322,5606,5655,7864,5237,7495,7768,5496,7687,5717,7478,8869,5617,8756,5617,5320,8126,5642,8888,5448,8772,7730,7877,5612,8239,5248,8519,8039,5224,8527,8952,8539,7706,0,8533,5401,5629,7710,8721,5329,7632,7957,8548,5671,7982,7687,8519,5629,5396,8402,8716,5305,5419,7952,7616,7972,5708,7972,8077,7800,5261,5568,5320,5612,8641,5285,5305,5305,5578,5274,8946,8647,5419,7482,8131,7542,5329,5325,7616,5291,8959,8959,8149,5471,5274,8821,8005,8365,5476,8329,7558,7558,7730,5386,7946,7487,7542,5464,8245,9021,8184,7516,5241,5296,9345,5285,5325,8340,7883,7883,7935,8073,7935,5291,7675,8239,8543,5564,8255,8073,8451,5314,5622,5480,7734,8196,5471,8184,0,5661,5329,5285,8498,7738,7653,8255,9361,5407,8811,5218,5666,8144,5329,5261,5314,8115,7734,8287,5325,8903,5612,8340,8745,5485,7811,5381,8196,7908,7883,5237,5717,7920,8073,5708,8170,7491,0,0,5448,5651,5325,7658,5314,8479,5426,5347,8936,8170,7491,8613,7491,7491,8447,7982,5325,8888,8381,5717,7972,5381,8144,5305,5407,5661,8577,8772,8126,5448,5329,5329,7648,7972,7533,7924,5666,7730,5320,8365,8184,5274,7667,8154,5301,7986,7653,7616,5329,7610,7542,7542,8365,7542,5347,8589,7616,5712,8261,7877,0,8498,5237,5617,7632,7667,5651,5301,8365,5329,8772,8857,5301,7828,8631,8903,5285,5291,5347,5301,7700,7972,7952,7952,7706,7528,7734,5342,8087,8898,5337,5671,5476,7817,8811,8282,7565,5241,8073,7828,5568,8438,7478,7786,7849,8604,7675,5651,5573,5717,8539,7500,5285,8438,8033,8484,5655,7888,7628,7710,5708,8126,7500,5285,7888,5401,8077,5358,8227,7828,7888,5476,8811,8589,7990,7834,5471,7706,8307,7675,7888,5285,5485,7924,5367,8438,5320,7663,8255,7663,5241,8539,5655,5564,5320,8239,5726,7504,5237,5285,0,5285,5314,5476,5401,5358,5301,7675,7675,7752,5529,7706,7706,8533,8888,5291,8533,0,7893,8282,8282,5347,7628,5347,7994,8307,8119,8239,7977,7982,5661,7977,7628,5655,5285,8494,7853,5573,5309,7710,7482,5564,8322,8427,5726,5314,8427,8676,5314,7487,7528,5314,5314,8196,7516,5314,5573,8676,7605,7565,5661,8560,7628,5391,8456,5337,0,8334,7706,8427,7790,5329,8456,7920,7511,5564,7565,8190,5485,5485,8447,8443,7999,5476,7511,8670,5407,0,5476,7706,7972,8010,8647,8010,8427,8625,5342,7628,7478,5325,5325,5325,8154,8915,7883,8484,7972,5372,5661,7681,8329,7500,7500,7500,8811,7653,7658,8539,7500,7877,5391,8582,7924,5391,7599,8438,8438,8068,8104,7478,8267,7930,8608,8115,8282,5381,8653,8119,7982,7565,8052,7952,8227,8190,8391,7643,5501,8196,7982,5476,5237,7528,7834,8115,7565,8772,7914,8170,7924,8365,5224,5426,7616,8190,8456,5655,8093,8104,8052,5712,7571,5305,8411,7500,7643,7999,8548,5391,5391,7628,7893,5459,7790,8447,8227,7752,7582,7663,5224,8608,7576,7610,5274,8582,7681,8783,5391,5464,5464,8190,8005,7500,5285,5309,7972,5309,8987,8316,8062,7834,5671,7521,8635,7675,7491,8267,5296,7653,7653,7667,5509,5274,8653,7576,5237,7558,8119,8201,5578,5578,7478,7653,5296,8052,8033,5509,5606,5314,8397,7576,7734,5485,5237,5261,5476,5237,8745,7706,5485,7952,5655,5476,7972,8345,5509,7516,7779,8227,7599,7675,8365,0,8190,8190,5476,5367,8267,5296,5564,8438,8005,7849,7616,8762,7994,5320,8745,7790,7823,5407,8699,8345,7924,8104,5642,5612,5309,8391,5285,8509,5524,5534,8227,7706,8052,7834,5301,7663,5325,7952,8514,8365,5661,8052,7715,5305,8827,8447,8015,5296,8222,7653,8190,8732,8239,5274,7883,5485,8959,7516,8068,5237,5476,5325,5464,7658,7491,7491,5301,8772,8316,7675,7893,8196,7999,8052,5476,7521,5426,9367,5285,8222,5485,7834,7663,7491,8613,5320,8249,8329,5642,7734,5301,8033,8582,5459,0,7834,8154,5329,5237,8164,7610,7700,7632,8375,8635,5629,7834,5573,8354,8354,5726,5476,8845,7491,7982,7849,5320,8340,8340,0,7800,8554,8554,5377,8397,8179,7500,5296,7482,7867,5501,7920,8354,5337,8821,5352,8282,5564,8093,7893,5726,0,8293,7681,8851,5655,7843,7843,5676,8391,5464,7599,8068,7999,5325,7706,7616,8548,7599,8316,7843,0,8249,7610,7715,8919,7994,5305,8543,7687,7605,7605,0,7605,8504,7904,8312,7888,7888,8479,5301,5688,5325,8484,5358,5519,8805,7839,8302,0,8925,7768,7542,7628,8811,7478,5496,5261,8329,8010,7478,5209,5301,5426,7774,8879,8504,8670,5480,8539,8015,8211,7710,5476,7786,7817,8762,5476,7706,5320,8461,7681,0,0,0,8277,0,8211,7924,7538,7622,7487,8467,8560,7893,7930,5381,7582,5524,5642,5274,5573,8658,8994,5320,5396,7528,5442,7605,5442,8022,8282,8022,5325,8354,5309,8131,5325,7790,7920,5358,7599,8608,7565,5501,5476,5564,7823,5237,7982,8387,8307,8329,5655,5642,7516,7872,7864,5712,7999,8039,7972,8827,8267,0,8307,5320,5372,0,5301,0,5407,7558,0,8322,8527,7823,7675,5274,7692,5255,5476,5237,7972,8625,7675,7977,7977,8131,5564,5305,5476,7491,7491,5391,8077,5358,7888,5476,8093,5224,8447,7986,7849,7533,8010,7548,5491,7839,7924,5564,8073,8711,8811,7706,8297,8110,7790,7999,8022,5578,5367,5337,7914,8170,5480,7571,7823,8381,5218,8539,7972,7687,5496,7883,7786,0,8484,5708,5564,5407,8073,7888,7990,8716,7605,5358,7511,7637,7687,7487,7605,8456,5391,8625,5496,5642,5291,8484,5391,7972,7511,5712,0,8164,7687,0,8473,8427,5381,7610,7582,5329,0,5301,5347,5218,5320,8329,8969,7706,5655,7706,5301,5476,7521,5655,5301,7588,7795,8795,5224,8504,7675,8073,8504,5224,5209,5442,5476,5381,7500,7605,5407,8397,7696,7696,5337,8048,7817,8898,8149,8427,5301,0,7924,7849,8682,7972,7710,5717,5437,8375,5564,5381,8560,7952,8272,8687,7994,8582,8613,8345,8345,5676,5476,5314,7692,7972,7723,8316,8940,8940,7811,5381,8484,5529,7888,8863,7628,8365,0,7616,0,0,8427,8387,5386,5655,8903,7706,8255,5396,7908,5419,9345,8329,5612,8302,5655,7930,8805,7795,5485,8073,8543,5564,7872,8316,5291,5237,7843,7511,8527,7706,7752,7667,8811,8140,7779,5688,8805,5337,5712,7898,7610,5352,9345,8539,8190,5647,5372,5708,7786,5358,8539,7653,5209,7972,8504,7930,8845,5407,7811,5509,7495,7977,7681,5325,7675,5329,7811,8670,8433,5501,8022,8249,7478,5301,5301,8307,8433,7616,5612,8170,5377,5381,8653,5314,5320,7877,8010,7994,5485,5301,5224,0,0,8272,7972,8277,5401,5407,5314,8093,5301,7706,5224,9032,8827,7542,7746,7706,7706,7774,8234,7877,8594,7893,5213,7898,8057,7643,8548,7558,5372,5325,5301,5352,7628,7628,7786,7643,7582,5629,8461,7599,8539,5237,8010,7558,8427,7706,8467,7834,7628,7768,5476,9367,8504,7805,8873,7706,5314,5564,7990,8277,7967,7967,5314,8721,5501,5501,8033,7723,8077,5509,8039,5329,8052,5381,5476,5442,8170,8170,7558,7571,7779,8322,7972,8863,8387,8170,7930,5285,5314,5209,8888,5352,5693,5573,0,0,0,5407,7952,5237,8762,7542,0,0,0,7632,7972,0,0,0,0,5352,8427,0,5480,9367,7888,7491,8998,7994,7994,8676,7977,8548,5407,5476,7914,5237,7834,7834,8732,8427,8104,7628,7849,7687,8494,7858,5358,5642,8154,7500,8893,7924,7986,7834,8543,7643,8005,5381,8005,7487,8527,5661,5480,7972,5407,7715,7790,5573,7982,7982,5401,8873,8805,7823,7628,5337,5712,8022,8190,8190,7616,5655,7858,7491,5325,5381,7491,5573,8598,7628,8694,7994,5712,8539,5325,5381,8509,5688,7616,8110,7946,7957,5333,0,0,8751,0,5671,8772,5347,8267,7628,8033,5329,8170,0,0,0,5661,7977,5476,8427,5564,8716,5651,7843,8164,7786,5407,8170,7738,5642,5655,7898,8302,8467,5209,8391,7588,7977,5642,5381,5464,8811,7893,7687,7542,7538,7962,8467,5661,8164,5391,7972,8402,8267,8805,7511,8164,5629,5699,8533,7487,8119,7738,7990,5237,7786,7706,8898,5524,7962,7533,8272,5717,8329,7828,8417,5325,8851,8131,7805,8322,5496,7542,8359,5712,7500,8461,5524,5314,5480,0,7924,7828,7977,5407,8397,0,0,8888,7605,0,5237,7706,5401,5296,5218,7542,8039,5671,5671,8641,5396,8140,9367,8402,5413,5337,7982,5419,7982,7811,8005,5476,8077,5524,8756,7952,7952,8340,7800,5309,8539,9345,5333,7843,8033,8827,5301,5519,8745,8617,8010,8316,8721,5325,5612,5666,5329,7779,5651,7957,8783,7588,7990,5320,5629,8473,5329,8484,5320,7687,5320,8015,8514,5305,5453,7924,7681,5352,7605,8302,5237,7768,7946,5407,8827,0,0,8322,0,7616,7696,7528,7972,8255,8397,8827,7734,5320,5396,8005,5655,9021,8354,8427,5237,8329,7828,8048,8811,5305,7478,8255,5386,7516,7511,8255,5274,8489,8010,8427,5480,8149,8267,8598,8422,7558,5629,8249,8170,7558,7588,5291,5291,8772,5296,5325,7495,7521,5480,8381,7872,7605,8519,8833,5501,7723,8297,7946,8433,7786,7511,8149,5524,5573,0,0,0,0,5325,8307,0,5329,0,0,8467,7738,5320,5419,8772,7516,8789,7482,5237,5342,5261,8397,8190,7558,8811,8170,8397,5476,8196,7734,7834,5666,8527,5296,8903,5325,5342,8073,5358,5693,5573,9361,7908,5325,5381,7977,8745,5578,5407,8322,8479,5476,8473,8022,5617,7516,0,5496,8249,7482,8272,7658,7746,7706,0,8888,8154,5325,7542,5651,8381,5476,5524,5407,7482,7696,8745,7834,7706,5651,7999,7952,8104,5325,8005,8312,8919,5573,0,7746,5337,7972,8687,7542,5666,5666,7730,5329,5301,8498,7672,7763,5296,7742,5329,5381,5524,8762,8467,5301,7893,5314,5448,5401,0,5573,0,7605,5329,7834,5301,7605,8033,5381,7864,7588,8359,8077,7628,7610,8277,0,5274,0,8170,7675,8093,7616,5407,7482,5337,7616,7521,8789,8073,7877,5347,8170,8617,5617,7994,8827,7768,5726,0,0,7628,7632,5301,8365,8375,8903,5291,0,5347,5347,7605,5666,5301,7904,7700,7628,8093,0,7542,7839,7811,7528,7628,7628,7542,7742,7500,8783,5573,7710,8509,5476,5291,5237,7500,5367,7628,7908,7843,8739,8851,5237,7663,5476,7706,7982,7710,8196,8739,8795,8739,8795,8732,8302,0,7482,7528,5661,7628,7542,7675,5476,5717,7478,8772,5309,7742,7982,5377,7811,7500,9054,5237,7675,7500,5237,0,5401,5573,5476,8795,7628,8287,7811,7972,5241,7839,8201,7478,7706,8201,8201,8082,8170,7542,7710,7719,7710,7719,7548,5342,5342,5301,8451,7628,5301,7952,5491,5491,7487,5407,5578,5305,5305,5642,5305,8140,7924,5606,8119,5491,8987,7500,8329,5320,8179,5291,8647,5280,5688,7588,8745,8267,5401,5476,8998,7972,7491,8179,7643,7883,5325,7491,0,8267,7752,5442,8888,5377,5309,8987,7482,7757,8140,5296,8498,5476,7883,8762,5419,5401,8888,8762,0,5407,5320,7742,8676,7605,7482,8745,5476,8302,5699,7990,5642,7667,7828,5296,5296,7786,5699,5325,5476,7742,5296,8676,5476,7675,7478,8721,7715,5712,5712,7663,7571,8762,7628,5358,5358,5358,7920,7920,5358,7877,7790,0,0,7734,0,7977,8427,8159,7715,5480,8329,7696,8164,5274,8170,7715,8052,5688,8307,0,8772,8456,8170,7888,8402,5358,8589,0,7790,5342,7628,7628,5480,7849,5407,7738,8589,5329,7715,5301,8316,8164,8227,7734,7632,8427,5514,8427,8249,7632,5726,5459,5391,8539,8438,5291,8211,7706,8959,8716,7706,8479,5274,8732,5501,8915,8028,0,5564,7914,7582,8745,7706,7482,5237,8370,7924,8345,8387,7990,8745,8387,7582,7883,5329,8745,7924,8267,8267,8839,8589,5241,5224,5218,8903,0,5333,8447,8068,8010,7952,8805,7972,5688,8888,8115,7746,8498,5296,7757,5476,5496,5314,8732,5509,8010,5491,5237,5480,8211,5688,7706,5261,5213,7653,7542,7478,7478,8329,7487,8613,7817,5419,7710,7478,0,0,5629,7972,7710,7542,5651,7628,7599,8745,5485,7872,7667,8062,7658,7768,5325,8411,8411,8811,7752,7548,7565,7504,5291,8560,0,7706,5501,7500,7500,8196,5476,8494,8267,8467,8560,7834,8033,8033,7883,5337,5471,7982,8154,7867,7715,8110,5712,7738,7746,7478,5248,5606,5358,8302,7972,8456,7533,8863,8925,8131,7511,5712,8115,8527,7742,5301,8099,8777,8527,7994,7982,5305,5712,5320,8170,8365,5480,5480,5480,7849,5301,5651,5476,8048,7893,5337,5606,7972,7999,7786,8427,7834,7487,8582,7592,8170,5661,5688,5476,7977,7548,7768,8073,5296,5651,8543,5314,5573,5333,5337,7786,8062,8811,8048,7790,7487,7982,5255,7839,8010,7710,7588,8381,7558,8093,8174,8073,7706,7487,8447,8170,8354,7605,8119,5666,8190,5529,5564,7533,8438,7658,7924,5325,5218,8721,5413,5529,7610,5329,0,8073,5661,8312,8115,5485,7482,7576,5325,5476,5296,5296,8397,7558,7482,7994,5730,5407,7924,8577,7487,5325,7696,5426,5564,7730,5612,7972,7482,7478,5237,8898,7605,5419,7632,0,8345,7582,5476,8711,5666,5476,5651,7768,5309,5305,7994,7675,5661,8062,7500,8851,8582,8272,7867,8170,7696,7576,8613,5255,8329,7504,7972,8687,7811,8391,8154,8631,5280,5213,7478,5726,7511,5476,7977,5485,7542,5419,5285,7558,5391,5314,8604,0,7908,5325,7511,7877,7643,7982,8789,8329,5309,8577,5688,7994,5578,7667,7653,7898,8211,5314,5337,5237,8073,8307,5509,8062,5476,7734,7616,5347,8052,7843,7653,5301,8845,5564,7478,5401,8104,8527,5476,7628,8316,8149,8370,5309,7977,5248,5534,5712,5342,7558,8456,5274,7914,5647,8653,8751,8077,7653,5485,7675,5617,8184,5647,5218,7675,5274,8805,7864,7588,8068,5676,8433,5377,5301,8839,7487,5666,8839,8272,8762,8149,8277,5401,7994,8494,8267,7811,8539,0,8489,5407,8015,7719,5564,8721,5426,8087,8969,8387,8287,8015,7491,8571,8494,7653,5480,7582,7849,8494,8170,8811,7779,7643,7738,5314,7828,7867,8407,5676,5209,5237,5642,7706,7786,8039,7653,7516,5629,7576,5352,8052,8227,5320,7706,7565,7710,5329,5386,8170,8272,8827,5666,7972,5352,7893,8022,5606,7920,7883,7628,8447,7628,5329,8811,5651,5485,8093,8099,7482,8402,5726,8359,7628,8184,7914,8647,8104,8631,8467,8277,7643,8745,7834,7542,5606,7622,7972,7482,5651,8543,8467,7752,9071,7893,8745,8467,7990,5325,5617,8467,0,5329,5209,8762,0,5407,8438,7920,0,7628,8467,7914,7914,8110,7811,7605,5407,8699,7628,5688,8805,5726,8762,8527,7687,8073,8494,8494,8539,7994,7752,8613,5661,8604,7994,5717,8461,7834,8062,8190,5651,7990,7790,7616,7834,5337,8062,7622,5426,5712,5437,7643,8716,8005,5391,7864,5213,5712,5401,7706,7706,5712,5606,8694,7994,8179,8641,7746,5296,5305,7500,5325,9054,5407,5407,7982,8527,7521,5476,7482,8427,5391,5381,7558,5464,8772,7628,5358,8438,5391,5647,8119,5218,5726,7548,0,8484,5285,0,7482,5629,7610,8154,8467,7823,8282,5337,7768,7805,7779,7877,7834,8104,8077,5209,5509,5391,7800,7616,0,8005,0,5407,7500,7672,7952,5671,0,0,8312,5309,7952,5629,8467,5612,8467,5401,5642,8249,9032,8119,7990,7658,8245,8631,7511,8131,5514,8391,7687,5391,5476,8099,7538,7734,7994,5301,7774,7478,5237,7752,8322,8115,5391,7588,5476,5655,5448,8267,5519,7482,8164,7643,7588,7588,8447,7738,5391,8613,7994,7533,5573,5573,8334,5534,8777,7763,7849,7828,8052,5464,5237,5209,8539,7972,7616,5564,5381,5396,5717,5209,8272,8909,5342,5358,5285,5296,8234,7482,5524,7610,7972,7834,5617,7800,7616,8104,5329,5347,8375,0,8888,8772,7628,5448,7982,5358,8473,7972,5419,5568,7914,8987,8539,5651,5708,5329,7982,7982,5337,7877,8010,5218,8234,7800,8745,7628,8647,5325,8387,5285,7706,5237,5325,5329,5329,7610,5309,8039,8827,7957,7972,5671,8322,5301,7834,8340,5285,8827,8658,8641,7742,8909,7491,5237,5651,5629,5305,8987,7653,5401,5347,8631,5301,7542,8527,8190,5476,7800,5209,8211,8756,5666,5352,5320,8015,8015,5248,7500,7811,8144,5407,7834,8519,8239,8402,5377,7924,5419,8827,7616,8062,8329,5320,8721,7616,7675,0,0,7500,5401,7972,7994,7920,5291,5285,8312,8903,5296,5381,7478,8994,5325,7533,7952,7675,7542,7542,5237,5329,5237,8190,5471,5464,8438,8489,7588,8239,5655,7548,5476,8539,5509,7883,8772,8783,8329,8005,0,8670,5647,7605,8589,9372,5358,5261,7877,7877,5320,8316,7734,7516,7994,7719,7719,7558,7592,7558,5396,5285,8149,7935,8811,8879,7946,7487,5320,5352,7653,8267,7511,8062,5564,8052,7849,5274,5407,5261,5237,0,0,5347,0,7628,7516,8438,5372,8903,5509,8115,5661,7628,5301,5391,5529,8093,7800,5209,5218,7908,8179,5401,7828,7491,5708,7811,5655,7877,7800,7883,7883,5476,5342,7920,8170,7738,8196,5325,5314,5401,8789,8039,5309,5501,7719,5325,5342,5296,5573,7738,8022,5693,0,7605,8277,8888,5401,5651,5391,5320,5651,8381,7616,7616,8249,5309,7706,7920,5325,8052,8613,8397,8494,8272,7482,7482,8217,7839,8154,5485,5347,7667,7663,7734,5314,7994,8888,7786,7542,5426,0,8144,7893,0,0,5407,7994,7632,8365,5329,5301,5337,7924,5329,7487,5381,7616,8762,7599,5296,5661,7533,7914,8473,7877,5305,7511,5407,7734,7719,7558,7786,8888,8154,5274,5329,8196,7653,7616,5218,5301,5485,7675,7616,5342,7994,5661,8359,8052,7605,7610,8277,8217,8010,7982,8277,0,0,7616,5651,5325,5401,5407,7616,5501,7516,5476,5407,8354,7877,5491,8261,5407,5347,8010,8617,8467,5314,8527,5617,5666,5347,8827,5726,5218,7542,8048,8721,5699,7834,8052,0,7730,8365,8375,7834,5301,5651,5261,8772,8903,5285,7877,0,8052,7904,7605,5347,5347,7700,5509,8375,8329,5274,7834,8811,7834,7628,8154,7487,7763,8687,8919,5296,7675,7675,0,8062,8093,5372,5622,8484,7687,5661,7710,5314,5437,5437,8179,7924,7706,7548,5501,8816,7592,7752,8312,5476,5329,7805,7920,8509,7533,7834,8509,8334,7715,8783,8239,7952,8756,8068,8687,7528,7972,8687,8687,7994,8322,0,8245,5367,5241,7605,7990,7999,5564,7904,7888,7888,8093,5314,8190,8170,8772,8174,7592,8174,7658,7658,5224,7924,8316,7653,7605,7687,7828,7994,5391,5401,7710,5464,0,7982,8851,5347,5485,5285,7500,5426,7768,8577,7811,7924,7675,5519,5274,7482,7478,7576,5642,5391,7994,8316,5529,5437,8509,8062,7632,5367,7605,8190,5241,8312,7834,5296,8687,5578,5296,8898,0,8010,8670,7491,5296,0,5629,5309,9071,0,5237,5564,7592,7935,7734,5485,5314,8805,5509,8370,5352,7843,5261,7982,8527,7710,8164,7982,0,5320,7849,8329,7692,5291,7675,5237,7834,7653,9345,7667,8539,5661,5325,7478,0,0,7653,7834,7811,8514,8170,5442,7930,5501,7516,8653,7643,8068,5237,8402,7478,8062,8170,5564,8494,5285,8827,8527,5255,7723,8893,5237,7723,7528,5314,7834,7834,5476,5291,7628,8461,8297,7920,7786,0,8119,8227,8670,0,0,0,0,8033,7849,8005,7548,8676,5367,5296,8527,5401,8190,5426,5464,5285,5407,5358,7616,7605,7994,8641,5606,5237,8699,8699,7877,7834,7592,7592,7628,5712,8302,7994,7491,7528,7723,8110,5712,7811,7500,7999,7994,8010,5688,5342,7924,8577,7605,0,5524,7795,8222,7982,8267,5367,0,0,8411,8131,8422,5629,8783,5261,8869,8073,5464,5661,5237,7478,5237,8267,7849,7849,5237,8267,7504,8716,5261,0,5642,8329,5651,5401,7616,7478,8164,0,0,8322,7511,5237,5358,8473,8548,5329,5407,8087,5476,7957,8527,5342,5476,8316,5291,8548,8267,7982,5476,7972,5708,7994,8239,7653,7742,9071,7592,7800,0,8987,8498,8833,5407,5237,5237,5237,5476,7675,7710,5464,7877,7491,7542,8297,7834,5274,8255,9021,8919,5471,7914,5285,5501,7487,8239,7628,7516,8316,8670,5501,8010,7834,8329,5347,5712,5629,5476,5485,8514,0,0,7616,7628,5476,5529,5347,7658,5372,8179,5342,5237,5699,8827,5401,5296,7605,5661,8093,7994,5476,5661,7999,5296,0,0,5347,8613,5274,8898,8329,5309,5442,5442,5642,7849,5347,8473,8164,8987,5305,8222,8893,8015,8589,5708,5367,8582,8851,7628,7746,5329,5442,5442,7834,5237,7920,5391,5391,5688,8261,8354,5347,7582,5291,8316,8721,5688,7779,5651,5629,7779,7834,5224,8093,8498,7628,9361,8387,8994,5241,5325,5381,8467,7663,7994,7877,7516,5291,5564,7491,7904,5459,7491,5642,8443,8617,7696,8322,8519,5717,8205,8716,8322,8484,8322,7858,8282,7533,8670,5407,5213,8762,7982,7853,5333,7548,5459,7898,8255,7982,5337,7558,8762,8387,7558,8816,7763,8751,8484,8711,5480,7715,8149,8504,9377,7565,7790,7715,5391,7478,7834,7977,7930,5391,5407,7786,5337,8375,8119,7715,8539,7542,7768,7768,5209,8594,5237,8211,8946,7542,7478,7786,5237,5301,5301,7516,5325,8461,7972,8543,7768,8489,8762,8170,7977,5407,8527,7858,7990,8170,8898,5573,7478,7930,7632,5381,7538,8682,7994,5301,8387,8316,8387,5419,7853,5301,8762,8577,7920,8647,8222,5237,5442,7994,8005,7521,7768,8010,7904,8010,5688,7491,7774,8073,8345,5381,9345,8687,7538,5337,8756,8504,5325,8387,7599,7811,9345,8267,8582,8816,8539,8745,7548,5442,7930,7920,8170,8447,8119,8174,5367,9008,7982,8093,7893,8777,8447,5391,5337,8131,8354,8170,7883,8312,7786,8316,8381,7811,8727,5285,7849,7999,5325,5476,5261,8227,8164,8087,8316,8149,8762,5367,5391,5396,5241,7628,7962,7628,5358,7478,5237,5676,5301,5367,7482,7940,7843,7930,7972,7834,8302,5301,8456,5274,7757,5471,7752,5642,7904,8756,8447,8473,7482,7478,5237,5407,8048,8653,7834,8039,7883,5651,8227,5476,7972,5241,5296,8249,7774,8140,5617,7994,8732,7632,7982,8548,8987,7994,8527,8494,8329,5426,7605,7790,7994,8467,5274,8641,8387,5386,5661,7977,5730,8411,5337,5337,5712,7687,5642,7962,8073,7977,5396,8467,5448,7663,8467,5491,7628,5391,7883,7605,8201,5655,8519,8670,7800,5485,5419,7715,8015,7877,5708,5377,8427,7849,5358,5291,5358,5358,5464,7734,7571,7628,8316,5642,8239,8851,7675,5218,8631,5237,5717,5676,8762,5296,7908,5274,5661,7738,5274,8329,8381,8048,8154,8417,7696,8577,5386,8687,8087,7952,7738,5274,5651,8261,7811,5386,7632,5274,7706,5291,8190,7622,5209,5329,5329,7628,7588,7599,7482,5391,5693,7605,7500,5325,8062,8539,7768,8811,8484,7628,5496,7710,8329,7538,7576,7478,8613,7752,5381,8387,5501,5329,5413,8354,5291,8604,5291,5509,7637,5712,7883,7920,7994,7811,5274,7558,8093,5491,5476,8345,5255,7828,5564,8190,5237,8073,7839,7823,7977,8670,8312,7628,7990,8297,7864,7914,5476,8443,7977,8438,5261,7511,5358,5655,5655,5291,8048,7610,5309,5285,5407,8589,8687,5274,7576,7817,7834,5519,7924,7500,7632,7487,7605,7528,5519,8329,5377,7696,5442,5642,5367,7946,7952,5248,7500,8282,8456,5564,7849,8170,7643,5213,7864,7558,5377,7893,7478,8387,7667,7930,7930,8805,5274,8287,7653,8190,5224,5688,7768,7843,5301,5519,5564,7511,7491,5237,8093,5301,5606,5401,5612,8514,8479,8772,5291,7805,8427,5352,5629,5730,8170,8033,5377,7752,5485,5381,7828,5573,5314,8456,7558,7982,7706,8548,8653,8227,7706,5413,5509,5329,8827,8721,7834,7757,7930,7516,8196,7920,8994,8716,7774,5407,8048,7491,7723,8302,8745,7643,7628,7790,5712,7834,8190,7548,5426,7977,5381,7994,5655,7994,8893,7811,5381,8732,5407,5622,7924,8494,7768,5367,7935,8467,8795,5386,7982,7616,7628,7930,7872,7719,7511,8427,8164,5612,5642,5407,7500,5309,7839,7616,7538,7972,8548,5629,5301,7843,7952,5655,8322,8451,8604,7999,5642,7663,7853,5647,8925,5329,5622,8827,5309,5476,8402,8827,7972,5301,5367,5612,5688,8190,5708,5401,7800,8015,7538,7898,7616,5629,5329,5381,8919,5261,8833,8329,8777,8903,7516,7930,7723,5218,5464,8772,7734,5485,8010,5309,7511,5325,5437,5485,7663,5358,8179,5726,5372,8903,8402,8234,5372,5296,7811,7719,5342,8732,7628,7628,5309,5329,8888,5485,7752,8397,7653,5237,5325,8190,8821,8154,5671,5666,8647,5301,5401,5329,7800,7542,7723,5578,7616,7582,5622,7610,5261,8255,8365,8422,7616,5651,7521,5237,8721,8479,8365,7811,7795,8073,5459,8222,7982,7972,8647,8282,8261,5301,8631,9026,5419,7542,5291,7864,7565,5407,5534,7742,8073,7786,0,7588,8093,5476,5255,7839,5309,7977,8255,7710,8527,8903,8249,8057,8863,7667,8411,7576,5655,8903,5485,7616,7706,5407,5573,8539,7742,8249,5622,5352,7516,8833,7478,7920,7883,5534,7616,7834,8811,5491,7914,7478,5606,7653,8227,8119,8577,8119,7877,7877,8222,8119,7588,8365,5218,8952,5329,5564,5218,5413,8527,8381,5606,5337,7977,7914,8261,7828,5296,7823,7828,5255,8805,5396,8805,7768,5209,8249,5358,8267,8365,8467,7511,8227,7715,8267,8010,5564,8845,5606,5381,5381,7768,7994,7696,5606,7696,7528,7533,7487,7834,7834,5391,7511,8543,5655,5573,7715,7790,8604,8307,8126,5358,8245,7972,5329,7706,5329,7768,7779,8010,5396,7628,7628,5237,7667,5476,7817,7628,5459,5442,5224,8903,8287,5325,5509,9382,7924,5407,8641,5666,5325,5496,7877,7592,8641,7516,8028,5419,5442,8461,5459,5459,7920,8077,5437,5320,5320,7972,5476,8519,8131,5693,5358,5381,8239,7817,5717,8484,7667,8789,5261,5651,8293,5301,7924,8033,5337,7904,5381,5568,7972,5564,5661,5358,5476,5301,7658,8519,8527,7605,8174,7920,8811,7990,7839,5661,8873,7883,5655,8048,7972,8909,8170,5325,7893,5726,7828,7977,5274,5496,5224,9032,5241,5218,5485,7768,5248,8316,5476,8509,7994,5296,7888,7924,5301,7972,8727,8387,5712,8307,5485,7675,8316,7516,8211,7920,7675,7940,7734,5301,7972,8451,8170,7478,8302,8149,8087,7811,5274,8527,5352,8527,8721,8772,7893,7538,7516,7710,5325,7828,8345,7710,5358,7930,8438,7786,8217,7864,7994,7628,8402,8479,7605,8504,7883,5501,7867,5325,7628,5730,8527,7986,7924,7752,5647,7628,7795,5396,7811,7692,7977,7482,5476,5329,5514,5291,7710,5237,8721,5476,7752,5325,8519,8282,5666,7511,7637,8087,8293,7828,8245,8959,8772,7877,8473,7795,8140,7632,5476,8548,5442,8015,8533,7972,9045,5699,5496,7957,5329,5305,5309,7482,7616,5464,7888,8239,7610,5485,7957,8149,5274,7893,7883,5529,7990,7834,8282,5496,8519,8625,5407,7628,7994,5476,7893,7920,5666,5301,5320,7883,8461,7828,8073,8277,8959,5325,7710,7924,5274,5381,5241,7834,5301,8154,8277,5407,7828,5274,7616,7482,5726,5218,8772,7828,7687,8509,8375,8073,7877,7952,8312,8048,8919,8048,8126,8126,7867,5358,5372,5372,7790,8407,5314,5381,5464,7952,7839,8093,5524,7952,5407,5285,5352,5524,7663,7864,8052,5407,5358,5509,8498,5305,5237,7663,7592,8052,5464,8052,7817,7977,7478,8349,8577,8312,8946,5285,7972,7582,7605,5301,8647,5726,5285,7920,8811,8174,7576,7667,8149,8879,5699,5568,7786,7667,7667,7576,7687,5381,8427,8762,8438,7990,5485,7628,7930,7999,7548,9054,5218,7616,7849,5476,8329,5676,7849,8608,8427,7834,5407,7849,7628,8005,7582,5671,8479,7533,7478,5688,8119,8479,5329,8427,8249,5329,5309,5391,5407,7533,8721,8345,5329,7924,7576,8903,8010,7786,5301,7715,7558,8811,7500,8211,8211,7972,7706,7935,5606,7521,5471,7528,5237,7533,8222,5471,7478,8267,8119,9389,8267,7746,7533,8827,7622,7883,5712,7790,8795,5274,7742,8345,8174,5241,5642,7914,8154,7723,5655,5396,7930,5386,7710,8119,5712,5476,7605,5655,5655,7746,8582,8467,5459,5476,5209,5209,8783,7687,8190,7893,7982,7853,5342,7952,5651,7883,5476,7696,8391,8190,7710,8582,5676,8711,5655,7681,7924,7834,5305,7548,8447,7999,5241,7528,7667,8670,7653,7811,8539,7478,5296,5676,7864,5509,5274,5237,8653,8277,5407,5261,5314,7643,5509,8093,7823,7883,8577,9394,5485,5241,8582,8277,5342,5676,8839,5342,8762,5329,5358,7715,7643,8447,5329,5476,5381,7774,7576,7628,7643,7482,7994,8670,5325,5699,8375,5391,5676,5661,8762,5309,5699,5377,8005,5524,7872,8711,7500,8048,7752,7622,5442,5301,5651,5534,5568,8387,8033,7990,5448,5367,7723,8334,8391,7800,8387,7972,8015,8334,7757,5301,5305,8598,8827,7957,7710,7800,8647,7558,5325,8249,7834,5301,8959,8302,8255,7734,7605,8919,7914,8598,8239,7487,5301,8795,7491,7500,8316,8711,7516,8005,5274,7516,7663,5296,8427,5407,7786,8762,5726,5622,8589,5514,8179,8329,8179,7663,8249,5337,8888,7746,5337,8582,5291,8190,7746,8154,8048,8893,7610,8721,7800,5726,5573,5629,8795,7605,7790,5309,5524,7628,5448,8604,7872,5391,5476,7786,7972,8093,7914,7616,8170,7972,5285,8451,8676,7663,5285,8833,8154,8126,5391,5688,8312,5325,5209,8811,7478,5480,7692,8322,5237,8010,8582,8903,7538,8302,7883,5717,5301,5564,5209,7849,8154,7757,8879,7706,8795,5381,5501,7864,8387,7920,5578,7834,5342,5622,7935,5471,5529,7834,7667,8527,8048,8068,7687,5726,7628,7632,5480,5381,8539,8533,5655,7663,7893,7715,7605,5301,8411,8293,5255,5352,8093,8174,5333,8312,8073,8884,7914,8925,7495,5301,7610,8316,7742,5301,5524,5573,7667,5329,7605,5717,8154,7663,5386,7977,5329,7994,5564,7632,8800,5426,8119,8316,8068,5237,5476,5491,8851,5367,8255,8467,7908,8255,8322,8946,7675,5699,7768,7843,7752,7628,9059,5367,8211,5337,8539,7935,7935,7864,7511,7616,8211,5699,7834,8302,8653,7628,7994,7500,7849,5386,5407,8456,8022,7675,8946,5352,8391,8863,8571,8554,7706,8925,8745,7516,7667,8073,5693,5564,7757,7849,7687,5329,7663,5342,5699,5564,7930,7576,8217,7478,7706,8099,5509,7828,8461,8456,7706,8033,7487,7834,5459,5693,8762,5480,5381,7616,8411,5476,5358,7994,8851,5655,8676,5367,8903,7576,5386,5352,5407,8539,8772,5496,7473,8359,8272,5274,8190,5699,5699,7538,7834,8184,5476,7663,7839,7914,7487,5629,7898,5396,8631,7994,8940,5666,8451,5655,5367,7706,5401,7533,7994,8245,7675,5578,7990,7986,5396,9399,8234,5622,7877,5325,5708,5352,5329,5329,8795,8322,8033,8211,5666,7864,7706,5305,7706,8402,8443,8745,8287,7675,5325,8149,8073,5726,8833,8919,7904,7763,7516,5342,7828,5464,7533,8925,8255,8539,5301,5337,5285,7786,7786,8255,5471,5612,7628,5476,7849,7977,5647,5666,7811,5573,5237,5699,8903,5476,5419,7920,5372,8387,8751,7706,7663,8196,5407,7628,8821,8249,9406,8149,7779,5612,7763,8936,5274,8582,5666,5666,7972,5301,5301,8010,5699,8087,7616,9045,7610,7696,5301,8073,8617,5381,9067,8365,7834,5391,5391,5301,8705,5617,8354,7487,7706,7738,8800,5661,5274,5274,7972,7706,7972,5413,8217,7548,8068,7478,5391,5337,7972,7681,5564,5564,5651,8443,7972,7491,5209,7571,5726,7982,7605,7914,5342,7839,7637,5651,5329,7628,7521,7986,7681,8647,7605,7952,5367,7719,5325,8077,5655,5524,7834,5309,8033,5671,8073,5693,8479,8154,8272,7706,7710,8721,8397,8484,5329,5224,5309,8479,7823,5329,5261,5578,7986,5296,5730,5237,7482,7576,8154,5655,5564,8467,7482,5274,7924,5377,5476,5712,7487,8539,5296,5314,5655,5218,5325,5325,8005,7487,7538,7738,7500,8190,8762,7628,5237,5325,7628,7877,8772,7908,5342,5301,9054,8447,8479,5301,8261,8354,7622,8365,5666,8110,7628,7628,7710,5381,8196,7849,5647,5519,7487,5642,5647,9051,5496,8811,7719,5274,5224,8062,5688,5476,5248,5501,8052,8370,7990,7622,8940,5606,5358,7972,8631,5651,8334,7478,5274,8447,5301,5337,8443,7920,7904,8631,5305,7558,8052,8196,7924,8370,7972,7972,5320,8170,5209,8154,5325,7558,8136,9075,7663,7849,8316,5209,7972,5381,5401,8762,5476,5305,5296,5448,8772,5237,7706,7843,5564,8115,8839,5329,8589,8811,7977,5377,7558,5647,8670,8839,7786,8099,5329,7786,7571,8504,9032,8115,8126,5325,7972,7972,8653,8873,7982,7990,5224,5442,5629,7628,7588,7616,9411,5476,5651,8411,5396,8349,5358,7571,5352,7548,8548,7500,7558,8479,7752,8397,7675,7487,5325,5564,5655,8255,8479,7977,5325,5524,5524,7786,7864,5342,8010,5325,5296,7715,5261,8514,7972,5325,5329,7588,5325,7616,7752,5688,7719,5401,7500,5464,5296,5325,5342,7675,8196,5285,5314,8316,7487,7834,5342,8789,7719,5296,8261,5309,8789,8354,5325,8422,7752,5372,8154,7817,5329,8473,7663,8261,5314,7908,7628,5529,8631,8484,7723,5237,7723,8571,7628,7920,5485,5642,8732,9032,5647,5347,7867,8533,5642,8411,8222,5642,5224,8631,7605,5285,8255,8052,7478,7952,5642,7972,8519,5642,7681,5285,8519,7592,7675,7482,7982,8498,8494,7883,7692,7990,9417,7500,7588,5305,8005,8307,5329,7482,8494,8631,8387,7628,8170,7723,5642,5642,7681,8783,7628,5606,7757,8170,8239,5237,7986,8005,7675,5285,8287,8739,7610,7558,8402,7675,5372,8498,8255,7637,8307,5372,7632,7867,5301,7588,5391,9423,7542,8925,8062,7706,7542,7700,5391,5320,7994,8170,8427,7605,7487,7610,5224,5485,5485,8015,5476,7487,7667,8062,8316,8022,7592,7858,8267,5320,5485,5296,5381,5255,8676,8670,8827,7994,5647,7994,8099,5485,8795,5485,7605,7605,5333,7658,7628,5647,8811,8211,7605,7643,8762,5325,7675,7904,8099,5325,5655,7999,7962,8732,7994,8467,7982,8461,7675,8433,7920,5358,5407,5647,5647,5261,8119,5367,8539,8467,8136,7710,5647,5301,5647,8438,8222,7681,7487,5564,8387,8543,7994,8245,5209,8539,8093,8115,8293,5564,8131,8010,7977,5717,8010,5391,9427,8312,8582,5407,7723,7610,5305,8411,7977,7952,7972,8282,8329,5642,5274,5358,7723,7795,8919,5285,5309,7768,7962,8613,8048,8582,7605,8316,5426,8245,5485,8604,7908,5568,5485,5358,8635,5301,5241,7478,5501,8267,5647,8994,5301,7843,8170,8721,5407,5480,8316,5255,7828,7558,7940,5391,7920,7571,7675,8670,8805,8604,7834,5524,7908,8811,5442,7904,8461,7935,8093,7542,5564,5407,7972,8277,7986,5358,5358,5358,5717,7710,8174,7628,5407,7999,7786,7710,5241,5485,8302,7576,5671,8073,5325,7516,7940,7667,5564,7687,7786,8571,7542,5496,7667,7805,8721,8467,8467,8170,5661,8115,7867,5480,7632,7883,7675,8893,5407,7473,8411,8272,7521,8509,9435,5655,8119,5426,5391,7605,8354,8456,7904,5476,7482,7675,7500,5381,5464,8845,7663,8010,7565,5622,7858,8329,7605,8062,7867,5730,8190,7622,7542,5309,8005,5666,7957,8267,7849,9441,8201,5442,5524,7893,8893,5241,8131,8077,7542,7675,8498,7817,8334,8762,5301,5358,5314,5573,8635,7710,7605,7582,7610,5347,8345,8201,5301,5296,5358,8539,7888,7834,5352,9367,5622,5325,8647,8307,7628,7763,5622,8115,5237,8039,5476,8447,7877,5568,8140,8461,5442,5325,7952,7588,7957,7687,5329,8184,5612,8498,8345,5612,7888,8676,5647,7558,8073,7643,5358,8903,8239,7883,7828,5564,5407,8438,8005,8539,8255,8919,5464,7962,8149,8365,7675,8762,5391,7864,5642,5213,8222,5325,8811,8227,8762,5480,7834,8073,8903,5381,7990,7610,7542,5401,8073,7576,8277,7521,5347,8873,7628,8354,8052,5655,7658,5377,7616,5442,5325,5218,8509,8909,7588,5391,8010,5448,5534,7558,5314,8909,5329,5329,5407,5480,7898,8159,8277,7610,5606,7478,5347,7542,8354,7548,5726,7817,8411,8676,8857,5301,7752,7632,7616,9447,7843,7500,5651,8539,8010,8140,5329,7914,8293,5661,5666,5274,5209,8447,8879,7710,7542,8473,5358,8282,7478,8539,8015,8110,5501,5358,8402,7972,5301,8039,8322,5309,7904,5301,7715,8170,8312,5305,8140,8184,8322,7779,7588,7681,5301,7706,7588,5261,8316,5209,8604,8354,7576,8010,9345,8126,5471,5501,5471,8539,8119,7779,5274,8772,7779,8179,8845,5301,8354,8245,7491,9452,8402,8126,8015,7516,8548,5485,8039,7920,8589,8589,5419,7491,8110,8073,5730,7500,8170,7982,5407,8365,7839,5301,5347,5564,8447,7930,8387,5519,5524,5629,5688,5666,8340,5329,7834,5651,8589,5501,5372,8756,7872,5305,7516,8261,9457,8329,7779,5419,7904,8073,5391,8504,8548,5274,7495,8641,8077,5301,7990,8539,9345,7681,5347,5651,5476,8484,5237,8653,5241,8484,9021,5325,5496,7576,8329,8354,8062,7628,7849,5509,8504,7752,7752,5688,8136,5209,7853,8816,8998,5381,5320,8104,7920,7482,8302,8062,7972,5325,5501,8267,8504,7883,5309,7588,7565,5612,8249,7482,8154,8033,5309,5564,7972,7658,5209,5442,5642,7687,5666,5237,5564,5661,7914,7853,7605,5726,5476,7605,8670,8811,7924,5564,5480,5655,5491,5314,5391,7548,5274,8443,7592,8282,8170,8716,8527,8397,5501,5485,8504,7946,5661,5381,7605,5442,7795,8126,5291,8582,8272,7839,8543,5237,8272,5661,7757,5285,7768,7828,7632,8190,5224,7533,5708,9462,8316,8164,7681,7482,5666,5419,7768,7500,5329,5459,8316,7487,5419,8293,5296,5291,7972,5407,5676,7710,7746,5655,5329,5274,5688,5320,7898,8613,7675,5509,8196,8845,5564,5377,5519,8504,5564,5237,5564,8805,5342,7548,8653,5564,5485,7982,7548,7834,5309,8267,5325,8456,5391,8548,7516,7888,5301,5329,7779,5442,7768,7628,5480,7706,9032,7565,5509,7542,5274,8087,7994,7706,8272,5509,8461,7599,8716,8863,7774,8190,8402,8099,7511,7706,8427,7930,8287,8093,7746,7706,7867,8772,5241,8234,7967,5476,5209,8093,7779,5309,7893,7872,5261,7628,8548,5381,5329,7500,5426,7994,5209,8170,7521,5407,7990,5274,8821,7746,7706,8676,7548,8539,8438,5676,8467,5661,7715,7487,5688,8411,7811,8845,5325,7746,5274,5564,7994,7628,8131,7622,5661,5401,8456,8411,8267,7834,5377,7795,7972,7710,7952,7768,5209,8022,8467,8062,7500,7957,8387,7648,5285,7616,5309,5476,8863,8447,7898,7786,7533,7576,5407,8451,7768,8617,8267,5367,8952,8929,5426,8272,5564,8267,5655,5524,8613,7982,5437,8909,5274,7588,5655,8548,8422,7653,7774,5358,8527,7478,5301,5612,7482,5237,8548,5666,5622,7542,7800,7972,5329,5305,8647,5401,5651,8190,8548,5325,5261,5342,8010,8952,5413,5476,5514,8711,7576,8322,7643,8473,5237,5320,5519,5296,5564,5296,8255,8833,7571,7972,5261,8589,7516,7628,8010,8239,5485,9021,5407,7648,7877,7872,5519,5296,5396,5442,8287,8322,5485,8245,8119,5296,5237,7482,5407,8170,7811,5372,5274,5381,5285,8073,7877,5476,5386,5342,5476,8635,7500,5325,8888,7542,5347,7734,8329,8857,7706,5712,7883,5305,5666,5661,8857,8582,5337,7500,5666,5274,7877,5237,5329,7877,7616,7774,7521,5274,8397,8857,7632,5237,8479,5347,5688,5377,7487,8484,7628,8062,7576,5274,7849,8354,5325,5509,8582,5325,8504,7994,8267,7853,8104,7920,8302,8461,8136,8467,8548,8099,5501,7972,7752,7565,7533,5708,8816,5320,5274,8811,5661,5564,5401,8443,7914,5237,7972,7548,7576,8282,5564,5314,8670,5476,5485,5491,7898,8164,5381,7692,7648,8647,7946,5296,9462,8190,5419,7632,5291,5285,8316,8845,7675,5676,5519,5309,5342,8272,5325,5377,5325,7500,8093,5578,7500,7706,7893,8287,8015,8234,8119,7994,7746,8087,5413,5442,7790,7511,7768,8548,8427,5509,5329,8863,5209,7990,7521,5407,7746,5347,5377,7622,7706,7834,5296,7487,7888,8676,8411,5274,8131,8863,7811,8539,5329,8411,8438,8467,5309,5564,8613,5655,8527,7582,5524,7877,5301,5476,5407,8888,8647,7800,5666,7616,5612,8711,5514,5661,8239,5261,8833,5419,7542,5372,7811,5285,8857,8998,7538,8461,8998,5699,8762,7511,8073,5255,5730,8617,8093,7616,7616,8745,5367,7616,8617,8772,7768,7706,5534,7616,5666,8772,5329,8721,7599,5291,5291,7599,7653,5209,7632,5564,7962,8048,7786,7605,8170,7790,7786,8438,8461,7904,7795,7786,5676,5564,7516,7834,7999,8397,7795,5314,7628,7972,7542,8048,7823,5320,7487,7920,7538,7511,7904,8048,5301,8783,7994,5358,5325,8833,8316,7746,5325,5676,5651,7952,7632,7920,5325,5325,8375,7924,7763,8322,7738,5712,8062,5476,5337,5501,5651,5524,7924,7786,8548,8721,7576,8093,5476,7605,8539,5519,7542,5476,5274,8164,8658,8658,7542,7811,8397,5274,5476,5274,7817,5274,7628,8845,5381,5629,8467,5237,8010,7834,5501,5261,5401,5666,8845,8417,8322,7877,7628,7817,5476,5248,5534,5501,8062,5325,7710,8402,5564,8745,9054,5476,7986,5476,7920,8093,7511,7972,5726,5237,7628,7521,5237,8196,7706,8255,7628,8222,7675,7719,8196,5419,8539,8402,7893,8272,8302,7478,7605,5407,7605,5391,7858,8548,5509,5296,5730,7849,7849,7653,5708,8647,5476,5401,5726,8222,7516,9054,8255,7487,8010,5476,5296,8190,8479,5642,8149,5622,8898,7790,5578,7706,8131,5622,7994,9021,5459,7696,9045,8821,7696,8716,5622,5666,7696,5209,8845,8783,8052,8267,8994,8987,7710,7487,8227,7977,8170,7849,5573,8149,7599,5325,5629,7742,7957,8417,8131,8334,7599,7957,5642,7888,8005,5337,5305,8811,7696,5578,8805,7491,8245,8022,8196,7710,7710,8447,7883,8062,8845,8170,7920,8077,7883,5358,8170,8093,5241,5337,5377,8239,7610,7972,8381,5391,7696,8387,5459,7795,5237,5401,8427,8119,8577,8751,7864,8170,5255,8539,8039,7752,7500,5647,8827,5329,5237,8805,5329,8170,8005,8170,8005,8827,5291,5534,5237,7935,5401,8827,5708,8119,8022,8805,8005,8077,7972,7883,8381,7706,8504,7478,8805,7610,7628,7628,5342,7487,7588,5476,7588,7487,7999,8387,8110,5476,5333,5325,7542,5501,8340,5717,8433,7811,5464,5496,8504,7675,8461,7576,8467,8762,8461,8164,8811,7571,8494,8227,7786,7972,7653,5564,7893,5301,7681,8170,5407,7565,9032,5337,8136,8560,8800,5337,7817,7628,8354,5642,5309,8312,7542,5237,7681,7893,7710,5485,7658,7914,7548,8015,5661,7914,7994,7576,5459,7883,7893,7904,8073,5726,8329,7930,7795,7658,5209,7692,7972,8316,5476,5209,5564,8334,5655,5274,7571,8456,7977,8119,7972,8222,5337,5726,7982,5301,5476,7482,7500,7924,7610,7582,9012,5329,5485,8293,7834,8658,7473,5476,8687,5671,5717,7582,7972,7675,7914,7504,7696,7864,5426,7858,8766,5209,7628,7558,7681,7972,8277,5274,5661,8402,5661,5305,8349,5325,5396,8170,7908,7730,8205,7706,5386,5651,8789,8375,5509,8073,8461,8721,5688,5285,5485,7888,7946,8451,8577,7582,8805,5712,8104,7914,5661,7834,8397,5381,5519,8443,5480,8174,7558,7786,5564,8307,5480,5453,7628,7994,7924,7795,5688,5401,8015,8402,7972,5391,7576,7920,7864,7605,8795,5329,8005,7805,8811,5606,8028,5485,8805,7986,5476,8345,8504,7914,8287,5564,5564,8170,7893,8322,5509,5496,5342,8164,8548,5693,7478,5712,7957,5622,7972,8694,7795,7742,8903,8345,5426,5386,7628,7478,7823,8255,7548,7994,7864,8159,5647,5642,5407,7994,5285,7628,7977,8676,5358,8227,5564,5274,8447,7746,8631,8909,8422,7898,7957,5329,8631,8427,5708,7588,8863,5717,5476,8073,8239,5325,7920,7628,5524,7610,8888,8554,8227,8196,8039,7834,8663,8647,5419,5564,5629,5305,5237,5622,5329,5285,7952,5329,7972,5642,5291,5401,8316,5352,8447,7687,8239,8402,7864,7675,5325,8010,7972,5285,5261,7478,8402,8489,7521,5342,5501,7616,8772,9361,7883,7908,8789,8068,5401,5358,5218,5291,5573,5476,5676,7986,5401,5514,8005,7786,7706,5386,8888,8329,8613,8154,8205,7828,8473,7834,8739,7986,7834,5329,8154,7952,7632,5726,8205,8375,8447,8205,8033,8577,8494,8687,8205,7516,8687,5209,7478,8077,5442,5325,5688,5688,5325,8077,7972,7972,7972,7999,5459,7972,5519,7658,5655,8484,8329,7628,5496,5642,7628,5248,8201,5237,8484,7628,7628,5426,8170,8484,7528,5617,5617,7883,7994,5391,8772,5320,7538,5606,7883,7734,7734,8721,7972,7576,8732,8598,5367,7478,7576,8479,8461,5261,5476,8613,8994,5491,5241,8282,8732,8560,7565,8282,5699,7898,7548,5407,8777,8093,7605,8115,7888,8073,5274,5717,8732,7977,5329,8062,8334,5237,5730,5564,7500,8527,7994,8670,7628,5476,8805,5255,7994,7817,8249,5464,8479,5464,8087,8548,8411,7790,5459,7800,7898,5496,5476,5514,8777,8340,7957,5491,7877,5642,8316,7982,8903,8772,5329,5476,5381,5407,8255,8249,7706,5329,5329,7877,8617,8682,7779,5407,5407,7719,7834,5564,5255,7834,7834,8340,8340,5476,7811,8805,5688,7663,8716,7681,8805,5381,5352,5509,5476,8745,5358,7763,5471,7542,7628,8387,8851,7723,5647,5367,7706,8211,5209,5296,8539,8174,7521,5358,5564,8068,7994,7478,7972,7706,5261,7752,7542,8504,8998,5568,5381,5329,7500,5325,8196,7706,8467,5501,7904,7872,7528,5325,5396,8277,7565,7478,5291,8131,7972,8267,8196,5708,5573,7790,8387,7893,7622,8560,8827,7482,5337,8411,5476,5296,7994,5301,5401,7864,5274,8227,8777,8249,7588,8484,8467,8297,8093,7658,7681,8539,7622,7723,5301,5573,7990,7715,7487,8222,8131,8438,5476,7893,8170,7920,8893,7692,7605,8447,7516,5224,5261,5688,5642,7616,8543,8062,7616,7687,7582,8170,5459,8077,8811,8539,5255,5712,5564,8716,5296,5358,8184,5564,5314,7790,8010,7867,7790,7790,7904,5209,5305,5358,5476,7710,5325,5485,7610,7696,5453,5391,7817,7616,7723,5717,8391,5301,8164,7482,8682,7542,7904,8033,8539,5519,5291,8577,7478,5325,8005,8604,5248,7839,8131,8687,8211,7710,5285,7768,5564,8670,7605,5209,5419,5296,7482,5496,8048,8164,8613,5248,8211,8316,5617,7883,7605,8329,7811,7473,7768,5671,8245,5485,5426,7768,8340,5485,7696,8345,8087,7710,8504,5407,5377,5464,5255,5301,5329,8149,5296,9345,5296,7977,7648,5358,5476,8255,5296,7706,8903,5426,8164,7643,7616,7632,7616,8329,5309,7962,7482,8349,8062,7576,5642,8015,7616,7710,8307,5564,8504,7482,7849,5358,5476,8267,8539,5647,5342,5342,7558,7599,7478,8140,5237,5485,5301,5564,7605,5305,5301,9345,5325,7888,5688,8302,5612,8033,5485,8170,5712,8249,5426,5485,7935,7528,7667,7834,8805,7757,8451,5509,7653,5337,7628,7977,7599,5337,8816,8670,5274,7843,5564,7864,5305,8334,5642,7823,7715,8795,8277,5401,5391,8494,5241,5401,8154,5337,7616,7616,7994,8104,8211,5712,7839,5509,5485,8539,5726,7582,5407,7967,7786,7986,5329,8170,7994,7667,8504,8653,7849,8772,5209,8594,8039,5564,8099,8227,5442,8022,7805,5237,8514,7774,7904,5301,5647,8073,7653,8222,8196,5676,5237,7491,8539,5381,7734,8903,5309,7999,8411,8845,5396,7786,8093,7893,5309,8345,7599,5413,7576,7834,8170,5407,7516,8772,5320,5606,8479,8359,7706,8022,8402,8272,8227,7930,8227,5476,7893,8277,7706,8249,5255,7994,7883,8302,7811,7834,5476,5241,8994,8201,8964,8716,7982,8170,8484,8964,7632,5442,8539,8249,5476,5647,5337,7616,7616,7616,7675,7730,5688,7990,7521,5509,7628,5337,5564,5401,8190,8467,7823,8115,8494,8104,7675,7628,7858,7790,8345,7864,7632,9467,8154,7795,8504,7746,7571,7571,8170,8222,8110,7715,5661,5661,5726,5407,5564,5329,8052,9054,8527,8062,5237,5730,5320,5647,7605,5688,7521,7914,5717,5381,5485,5651,5464,7914,7734,5671,7582,7500,7542,7994,8073,7994,8994,7990,7982,8205,7977,8676,5642,7667,8827,5352,7994,5274,8005,8805,7643,5237,5391,7706,8604,5386,5642,8467,5218,5218,8467,8539,8653,8721,8354,5529,7877,8509,8005,5578,5419,7957,7994,5213,7867,5448,7482,5476,7542,5391,5237,7930,7843,8293,8249,7849,5699,7940,8467,5301,8170,5237,8334,5573,7811,5647,5476,8354,5655,7542,8443,8312,8451,8467,5573,7628,7908,7533,7734,7734,7888,8851,8227,5501,5301,5241,5407,5325,8893,8777,8869,8571,8052,7962,5655,8391,8653,7500,7511,5237,7786,8039,8164,5534,5671,8451,5391,5629,7632,8613,5612,5274,7930,5642,5377,5358,8548,7599,8287,5519,8604,5237,5347,7528,5325,5301,7864,7872,7628,5407,7616,5305,7757,7681,7790,8316,7605,5352,8179,5401,8827,5237,5255,5688,5309,8104,5459,7994,8422,7723,7628,5476,5325,8239,5358,5329,7588,8201,5442,7632,8190,7994,5717,8093,5325,8647,8234,7653,8539,7588,5329,5617,8987,7746,7763,8329,7800,8073,8539,8451,5578,9367,8190,7994,7663,5708,5651,7957,8140,7548,7774,8159,5419,5651,8827,5453,5296,7667,7482,5407,7834,5320,7482,8005,8033,7982,8302,7786,8170,8519,8205,5661,8322,8307,5401,7516,5568,7663,5358,5301,8467,5325,8329,5218,8010,8249,7742,7877,7828,8329,5285,7872,7872,5464,7628,8255,8391,5396,5407,8827,8267,8222,5337,5726,5329,7648,5296,7864,8909,8438,5291,8397,8316,8613,5501,8005,8598,7872,8387,7500,5564,5291,8903,7478,8316,7487,7675,5237,8987,7994,8641,7706,7542,8267,7962,8093,7628,5367,5218,5325,8062,7487,7706,5666,5255,8267,7628,5237,8052,8073,8052,7663,7994,5296,7994,5325,7839,7521,8375,7763,5476,8873,5419,8005,5296,8322,5401,7990,8467,8245,5377,5629,5661,5358,8427,7962,5401,8010,5693,5381,7786,5661,8149,5407,8898,8062,7730,7528,8329,5642,8239,5448,5320,8329,8217,5274,7994,8766,5442,8349,8613,8647,7658,7706,8772,5485,5655,7696,8447,7616,5524,8827,7675,7706,8048,5407,7500,8005,5381,5708,7757,5476,5347,5309,8777,7622,7723,7867,5274,7516,7742,7795,7588,5329,5476,7500,5491,5301,5476,7986,5666,7706,8539,7972,7930,8909,5642,5305,7495,8647,8010,5448,8772,8422,7723,5337,7994,7511,5296,7558,5524,7877,8249,5301,5320,5573,7663,7516,5372,8170,8033,8277,8154,5480,7478,7872,5629,7706,7946,5329,7588,5717,8211,8267,8751,7628,5320,8164,5237,7558,5305,5381,7588,5407,8322,8077,8073,8261,5476,5274,7628,8170,9353,5401,7482,8322,7616,7610,8316,7994,8354,8093,5726,5717,8010,5651,7628,8005,5347,5325,8903,8427,5666,5666,5396,8527,7972,7994,7982,8427,8359,5301,5325,5651,7982,8359,7632,5325,8411,7828,5407,8987,5476,5666,7768,7675,7893,7834,8514,5432,7982,7982,5329,8293,5329,7487,7675,7542,5573,7982,5437,5480,5564,7500,7500,5329,7692,7628,8052,5496,8170,8039,8222,7834,8427,7542,8005,8282,5237,5320,5248,5688,7757,5325,5688,7558,5391,7542,8539,5578,7628,5564,8811,5237,8062,5296,8249,5717,5342,5367,7637,5391,5476,7538,8411,8783,7864,8994,7710,8354,5291,7752,7872,7898,5358,8354,5509,7667,7706,5320,7482,7706,5606,8467,5291,5296,8196,7706,8174,8387,7839,7715,8641,5568,5501,8560,7817,5372,5564,5224,5381,5564,7710,8307,8647,5274,5642,5655,5688,5337,7687,7849,7710,5337,7849,7653,8170,5301,5564,8297,7687,8131,7920,8073,5274,7605,7757,5432,5224,7786,8297,5726,5617,8964,8093,7786,7883,7786,7616,5301,7558,5726,8711,8170,7839,5296,5480,8211,5564,7924,8631,8577,7605,5476,5274,8144,5285,8170,8144,5255,5325,5201,5218,5476,8381,5305,7723,7867,7952,7817,7972,7800,5241,7972,7977,7648,7487,7706,5426,8577,5688,8670,5218,7977,8839,8751,5635,7864,8136,5320,8190,8527,7914,5655,5564,5274,5578,7478,5564,5301,7843,5358,5573,8467,7582,8613,7883,7834,8805,5329,8839,8631,7795,7972,8022,7893,8170,5651,9361,7706,5661,7667,7687,8249,8322,7487,5237,8099,5301,5459,7681,8272,8451,8811,7653,7628,5655,7893,7920,7994,5471,5476,8467,8170,7768,7542,5476,8447,8745,7994,5509,8039,5509,7582,7864,8282,8539,8484,8316,7924,7616,8039,7877,8057,7986,7990,5325,7849,8805,8349,7500,7746,7628,5381,5391,8190,5464,7834,8411,8110,7994,5564,8467,5712,7994,5564,8821,5661,5337,5688,7790,5367,7616,5391,5248,5629,7605,8548,5377,5564,8467,5296,7663,5676,8762,7982,5688,5459,5301,7795,8267,8170,7823,7957,8658,8164,7616,5274,7558,7843,8334,7487,5237,8461,5237,8467,5534,8057,5448,8015,8164,5325,5325,7478,5688,7653,8196,5476,8093,5396,5629,5476,5241,8716,7849,7982,5296,7538,8391,9471,7774,7616,8909,7628,5381,5377,8571,7800,7834,8987,5578,8340,7710,8539,5708,5329,8087,7972,5629,8033,8647,5726,7920,7628,5407,7632,7957,8196,7548,7482,5419,8952,5655,5285,5509,7972,5578,7538,7538,8039,7511,7790,5237,8827,7967,8190,7622,5377,8015,8211,7521,5305,5655,5476,5688,8594,7972,7924,5352,5285,5726,5432,8239,7533,7952,5237,5325,5622,5464,7893,8149,5291,8509,5296,7482,7877,5285,5261,7648,5248,8851,5248,8329,7487,7542,7558,8903,7687,5661,5261,5476,5485,5347,7877,7706,7839,7521,5617,7632,8845,7616,7637,8196,8115,8190,5401,7605,8115,5661,8211,5661,7706,8164,5413,8249,8052,8821,8154,5314,7972,8888,5661,7763,8010,5666,5524,7986,5651,5301,8104,5301,5688,8077,5329,8762,7675,7605,7610,5301,7610,8245,7491,5413,8987,7786,5676,7616,7542,5237,8179,5726,7768,8762,5237,7800,5291,5381,7605,7687,5661,5464,8816,8456,8293,7528,7548,5642,7696,5448,7763,5237,5426,7834,8795,5248,8519,8039,8190,5320,5274,8316,7610,5381,8533,8387,7982,7994,8721,5248,7994,7957,8548,7946,5726,5476,5476,8201,5396,7628,8473,5496,5476,5261,8033,5564,8234,5501,8952,5381,8136,5568,7883,8915,7548,7548,5305,7706,5578,5274,7972,8504,8196,5309,7667,8467,5712,7637,5708,5453,8959,8959,7977,5480,5274,5491,8222,8174,5642,8329,7558,8670,8772,8170,7946,5320,5519,5655,5476,8994,8073,8539,8631,5296,8234,7972,5325,8297,7533,7883,7790,8073,7935,5568,5274,8239,5726,7930,8234,5237,8451,5314,5622,5564,5476,8196,7692,8504,5419,7977,8879,5305,5381,7738,7632,8613,7605,7952,7482,7774,8577,8144,5329,9345,8903,8115,7734,8800,5453,5320,7977,8653,7558,5301,5676,5381,8057,7908,5476,7628,5655,7511,5688,8658,5325,5476,8201,9345,8839,8302,5325,5301,5401,5401,7692,5407,8936,7877,5358,8613,7491,8467,8093,7982,8227,5442,7888,8473,7779,8227,8456,5305,7893,8467,7632,8039,7834,8762,5237,7972,8170,7972,7533,7972,7795,7730,5320,5377,5377,5564,7667,5661,8411,5459,8653,7616,5519,7610,7849,8467,8222,8222,5564,7628,8641,7834,5296,7930,5573,5329,5237,5617,8267,8245,5651,8245,8359,8164,8772,8613,8716,7592,8631,8282,8068,7710,8940,5453,7616,5381,7542,8359,7692,5401,8222,5301,5578,5391,5329,5671,5476,5661,5274,7994,8473,5241,8073,5419,9367,8222,7521,7786,7734,8604,7675,5407,5573,5325,7883,8925,5285,8073,7521,7528,5432,7648,7628,7710,5708,7888,7952,8340,5342,8789,7877,5401,5358,5309,8903,5320,8772,5358,5347,7834,8613,7706,8307,5320,8631,5391,8126,5661,8073,8033,5320,7610,5237,5274,5347,8539,5491,5564,5320,5391,5407,7533,5476,5285,8387,5237,5314,5642,8527,8772,5301,8473,5564,7904,7849,7706,5325,5407,8888,5291,8533,7952,7893,8282,8282,5651,7628,7763,5391,7487,8427,8239,5291,5651,7681,5401,5642,7972,5285,5237,5261,7994,5237,7710,7628,5347,8322,8762,8196,5314,5325,8391,7616,8131,7528,5314,5309,8721,7516,5314,7632,5726,7605,7994,5291,8560,7628,5347,7914,8539,8721,5407,8721,8427,7952,5651,5391,8427,5347,5291,5325,5237,8539,5485,7628,8131,5309,5726,5285,8484,5309,8140,5291,7706,7972,5325,7786,7883,8397,8539,8987,5396,7768,5717,7710,5381,7952,7817,8062,5381,7643,5688,5661,7588,8447,5325,7500,7972,7687,5358,5426,7982,8987,7877,7972,5529,5573,5391,5476,5329,5291,8068,7834,5237,7834,7930,5693,5564,5688,5381,8653,8062,5325,7565,8329,7952,8062,8190,8272,7500,5381,5476,8504,8329,5237,5261,7706,5480,5325,8772,7914,7864,7924,8387,5642,8022,7616,8190,7528,5291,8093,8884,8052,5337,7571,5305,7565,7500,8783,5617,8548,5391,8068,7500,7893,5476,7588,8447,7849,7752,7582,7500,5655,7605,5241,7610,5209,5209,8427,7786,5391,5464,5459,8093,8539,7500,5301,5309,7533,5309,8811,5476,8170,5708,7687,5480,5476,7675,7999,5255,5358,7504,5726,7904,5509,8443,8653,7576,7839,7558,5218,7500,8329,5476,7478,7653,5391,8052,5285,5391,5606,5496,8131,7952,7768,5485,5381,5396,5671,7521,7994,7914,5442,8316,5655,8427,8391,7864,5296,7516,7779,7795,7599,5413,7681,7710,5666,7605,8582,7473,8267,7628,8909,5325,7972,8504,7616,7843,7994,8582,7864,5391,7823,7883,8073,8345,5337,7946,8255,5612,5309,8391,7628,8509,7558,5381,8227,7478,7478,5524,8022,7734,5296,7952,8851,5655,8851,8762,7715,5305,8839,8447,7990,5296,8222,7653,5342,8732,8190,7893,7710,7738,5476,8136,7482,7757,7920,5325,7877,8033,9032,5325,7706,8772,8863,7994,7893,8745,5407,5241,5476,7967,5426,5314,7779,5407,7605,8052,8099,7914,8473,8359,7858,7628,5459,7500,7858,5391,8190,5391,7643,7834,7864,5329,8539,5661,5564,7700,7632,5407,8635,7628,5209,8732,5237,5296,7482,8345,5274,7823,8033,8527,7605,8340,7834,7946,8190,8554,7495,7706,8711,7491,7994,5296,8909,7967,5261,5407,8073,5337,5464,8154,5717,7616,5651,7675,5651,5237,8322,8033,8293,5377,7588,7898,7710,7542,5391,5419,8467,5661,5529,7706,5642,5642,7599,7628,8473,8827,8745,5301,5305,8919,8987,5578,9476,7687,8115,5381,5401,7957,8504,7742,8312,5237,5314,5708,5301,5309,5578,5476,7982,5419,7800,7839,7653,5396,7877,7768,7542,7719,5237,5617,8217,5241,5386,5347,7864,5209,5291,5325,9021,5285,8073,5296,5622,7715,8982,7687,5391,8255,8772,8982,7734,8119,7706,5372,8772,7681,9481,7542,9487,5285,5485,5401,8417,7538,7663,8427,7920,5296,7893,5476,5476,5261,8261,5642,7542,5573,8658,7982,7576,8052,7491,7616,7605,7628,5407,5296,8762,5325,8190,8365,5666,7914,7994,7920,5301,7599,8411,5578,7834,5476,5442,7823,5442,7982,7877,8261,7482,5347,8033,7516,5578,7811,8365,7999,8903,7972,7834,8762,7834,5325,5693,5564,8504,5325,5381,8062,8272,8261,5261,7706,7823,8329,5476,8329,5325,5476,5419,5296,7742,8170,8387,8884,7500,7864,8099,5476,8022,8527,5617,7565,5291,5241,7786,7849,5255,8443,5391,7849,7687,7588,5655,8539,7967,7839,5726,7999,8711,5476,5476,8582,5666,5391,7795,5391,5381,5296,7558,7605,7914,5396,7883,8131,7768,7952,8329,5476,5241,5671,7521,5496,7643,7500,5708,5381,7478,7628,8255,7478,5524,5337,5296,8582,8851,8022,7663,8745,7605,7967,7495,8762,5314,7893,7990,7994,7628,8839,7914,7757,7877,7779,9032,5342,8772,5381,5476,8711,8033,5459,5464,5407,5661,8293,7491,7994,7864,7628,8190,7877,5209,8345,7834,8539,5651,7858,8795,5305,8903,7588,5661,5642,7898,5391,7542,5651,5309,7800,5578,5407,9476,8772,8982,8255,5347,7734,5291,7834,7542,8427,8033,7786,7849,8062,5367,5291,8062,7653,8062,5237,5381,8154,8239,7653,8687,7610,8307,5419,7706,5391,5301,8919,5509,5358,5320,5274,8527,8940,8940,7811,7834,5391,5573,5296,8863,7628,8068,9494,5407,7904,5730,7864,8387,7521,7811,8903,8800,5671,5726,7908,5237,8888,8052,7628,7605,7977,7930,5237,8073,7752,7811,8888,5564,8548,5501,5476,7972,8222,7637,7653,7920,8136,7667,8811,8136,5337,7757,8805,7487,5519,7811,7610,5352,7849,5305,8190,7790,5301,8447,5358,7628,7977,8641,7790,7920,5237,7930,8170,5305,5573,8772,7495,5291,7930,5655,7675,5564,7774,7817,8594,5476,8560,8249,8751,8154,8010,8772,8721,8115,7972,7696,7605,5391,8653,5209,7696,7952,7858,8411,8349,5491,8119,8582,7893,8964,5476,7710,7790,7849,5358,5329,8504,5296,5671,9032,5209,7977,7746,9353,7706,5671,8205,5407,7616,7893,5655,5617,8888,7643,5688,7558,8732,5325,7576,8277,8365,7487,8033,8987,5606,8456,8845,5274,8349,5407,5342,5564,8772,8827,8467,7972,7628,8015,8762,5309,8504,8598,8267,7706,5437,8277,8527,8277,7967,8119,7663,5622,5564,8131,8159,8115,8077,7994,8039,8033,8052,7972,8863,8473,8267,8833,8772,8365,7834,8322,5261,8863,7616,5309,7930,5285,8205,5358,8762,5320,7834,5573,8190,9501,8811,5407,7930,5655,5564,7542,7817,7774,8115,5274,8126,8015,8154,7972,8010,8772,8751,8411,8131,7605,8721,7696,5407,5358,5391,8964,7952,8582,5491,7790,7893,7849,5476,9353,7972,7977,5296,5209,8504,5329,8205,5209,5671,5309,5688,5655,8277,5617,5564,8762,5325,5320,8987,7487,8005,7487,8845,8456,8772,8277,5407,8863,5564,5622,8159,8115,7834,8365,8805,8833,5261,7616,8811,7710,8190,5617,7823,7504,5237,7491,7849,7558,5578,5367,5629,7967,7967,5301,8484,5564,7999,8811,7706,5261,7723,8110,5274,7957,5291,9509,9516,7839,8033,5671,8772,8170,8783,7628,8033,5329,7605,8354,5726,5381,7710,5573,7795,5529,7839,7681,7888,8577,8811,5612,5407,8170,7999,5642,7482,8170,8302,8467,5629,8287,8402,7977,5726,5381,5688,8811,5377,5726,7542,5464,8255,8255,5642,5372,5377,7972,8365,8365,8443,8994,8222,7692,7990,5471,5291,5564,7738,5407,5237,7972,7730,8898,8994,7706,8354,8322,5480,7658,5476,8184,5325,8851,7904,5459,7692,5480,7977,7839,8174,7500,7605,5524,5459,7972,5564,7533,8170,5261,8073,8447,8170,5301,8682,5476,5325,5491,5274,5285,5296,7605,5622,7473,5635,7952,7723,8005,8140,7710,5329,5413,7972,7977,7681,7774,5407,8005,8255,5358,5274,7888,5325,8170,5325,5320,5647,5573,9345,8077,7675,8073,7710,8658,8711,5320,7843,5218,8316,5442,8255,5612,7738,5407,7706,8494,7994,5314,5381,5325,8077,8170,8170,8099,5329,8873,8359,8170,7710,5509,7768,5377,8073,8443,7867,5325,8140,5237,7774,8548,5352,7972,5241,7828,7972,7628,7888,7696,8104,5218,7548,8539,8827,8033,8663,5407,8005,5629,8170,5564,8443,5459,7858,8110,8048,5377,5496,7478,5407,8479,8451,5237,7738,8322,8427,7828,8427,5325,8077,7800,7511,8427,5358,5248,5329,8170,8140,5629,5491,5612,5237,8005,5325,7972,8322,8539,7800,8548,5401,5413,5372,5501,5432,8422,7946,8919,8554,7511,8010,5573,5573,5471,8073,8140,8589,5291,8307,7516,5329,8255,8255,7734,7738,5320,8498,8772,5372,7738,7482,5358,7605,8170,5573,8255,5471,5442,5325,7478,8354,8184,7516,8577,7972,5301,7972,7877,5573,8676,7994,7610,7516,5274,9361,8857,5347,5661,8261,5661,8077,5407,5726,5381,8498,8857,8022,8005,5291,7516,7914,7817,7482,8272,5726,5377,7888,7888,8888,8154,5325,7542,5651,8381,5476,5629,5407,7482,7834,8745,7834,5726,5651,8149,7952,8104,5325,5377,8312,8919,7628,7935,8387,7952,7667,7994,8354,5666,8539,8190,8010,8504,8498,5329,5320,8068,7742,5329,7864,8136,7706,7790,8821,8504,8010,5622,8062,9525,5726,5464,8539,8093,5491,5301,5655,8010,5381,8608,5352,8359,7786,7628,7610,7605,8164,7864,7904,7576,7972,5642,7990,5476,8745,5391,5255,7696,7723,8170,5285,5347,5329,8509,7768,7576,5437,7972,5617,7779,7628,8670,7632,7811,8267,5578,5509,5564,8745,7576,8447,8093,5578,8427,7779,5209,5296,7599,8287,8039,7839,7811,5352,7542,8234,8184,7742,7500,7930,8099,7710,7779,5476,8110,5325,7500,5367,8732,8694,8658,5717,5337,8062,5320,5564,7706,5564,7710,8196,8427,7628,7752,8795,7786,5655,5367,8467,5329,8484,8783,5622,7675,7643,5717,7935,5285,8427,7734,8149,5501,8010,7516,5717,7719,8795,7811,5476,5325,8217,7696,7628,5274,8062,5666,8456,5301,5301,5329,8201,7935,8387,7952,8190,8082,8504,5622,7864,8099,8821,8062,7692,7990,5329,7576,7972,5476,7982,5655,5301,5642,8745,5391,5437,7972,5285,5642,7768,5329,5285,5578,5564,7779,8184,7930,5296,8234,7599,5291,8287,5209,8694,5564,5325,8267,5320,8456,8467,5367,8427,5329,7935,7516,7528,7786,5655,7839,7920,5442,8888,5377,7986,8987,7482,8282,8411,8411,8411,5476,8411,8762,7839,8411,8411,8033,8613,8789,5320,5655,8676,8287,7482,8745,8411,8411,5699,7990,8239,8245,7877,5296,7542,7628,5699,7706,8329,5476,8039,8349,7706,7675,7599,8721,9032,7616,5712,8267,5309,8560,8387,8010,7478,8245,7864,7811,5578,7877,5309,8467,7994,5401,7710,7935,8447,7681,7972,5476,7592,7977,8164,5491,7696,8539,8312,5688,5459,8115,8272,5320,8170,7888,5485,5296,8316,5337,5651,5413,5325,8716,5476,5381,8863,8577,8329,8422,8022,7795,8272,8334,5730,8447,7632,8427,8190,8329,8201,5337,7675,5688,7853,7605,5688,8539,8539,5647,5485,5377,8307,8479,5578,8316,8687,7478,5391,7558,7588,5372,8658,8527,5401,5612,5237,5301,7924,8345,8387,7990,8745,8387,7811,5491,5329,8745,7576,5309,8267,8287,8005,7994,5224,5476,8245,9531,7632,5358,7495,7628,8903,8805,5471,5342,8888,8732,7710,8498,7628,7757,5655,5337,8267,8732,8411,8039,7864,5367,5464,5688,8479,8245,7994,5213,5476,8131,5642,7478,7511,8329,7738,8539,5419,8467,7588,7738,7542,5629,5642,7710,8015,5708,5391,7599,7710,5485,5372,5578,5471,8539,7768,7710,8451,7516,9021,7648,7542,8190,7628,5476,7478,8239,8170,5391,5358,5642,8349,5661,5342,7811,8427,8909,7696,7622,8411,8411,7986,5471,8467,8154,7632,5301,5476,5712,8919,7706,5218,5248,7653,7628,8211,7972,7723,7533,8582,5564,8756,8888,7565,5426,8136,7742,7914,7898,8467,8879,7994,5661,5305,7478,5320,5337,7653,7658,5688,5358,8456,5224,8670,7930,8048,8539,7967,7491,7516,7999,7952,7605,5391,7487,7628,7592,5717,5237,7972,5476,8329,5730,7768,5285,5237,5651,8543,7843,7977,7908,5241,7786,8267,7834,7558,8307,7710,5329,5564,7478,5564,5524,8052,8381,7977,8845,7667,7616,8073,5237,7930,5301,8267,8201,7675,7706,7920,8745,8039,7533,8772,7967,5255,8277,8447,8033,5337,5529,7521,7883,8170,5218,8255,5476,8762,7834,5712,8893,7930,7864,7628,5676,7628,8267,5730,8005,7521,5407,5448,8577,8391,5237,8613,5573,5209,7967,5612,7478,7482,8267,8052,5218,5358,5305,8783,5564,8239,7482,5622,7982,8255,7834,8015,8010,5309,7500,8919,5358,7528,5358,8554,7994,5241,7790,5261,7516,8312,7883,8249,7491,8340,7908,7972,8249,7967,8582,5401,8631,5280,5337,7706,7834,7877,5476,8093,7811,5237,8527,8365,5301,5337,5693,5688,5314,8456,7576,5476,8560,7643,8484,7834,8397,7790,7883,7500,7853,5578,5501,7653,7898,8267,7658,5606,5280,5480,7571,7653,7786,7588,7734,7616,5437,8391,7632,7653,5442,8845,8316,7972,5274,5419,7558,7482,5647,7675,5712,7692,7940,5666,7734,5534,5712,7834,5237,8929,7994,5329,5347,7834,8272,8456,8427,8104,7675,8397,8287,8140,8653,5377,5274,8762,7982,7500,5426,8772,8433,5377,5301,8312,7487,5448,5651,7768,5442,8451,8267,5218,8608,7687,8370,5629,5419,8647,8489,7628,5301,7719,8149,5476,5419,7734,5285,5237,8772,8312,8789,5476,5301,8170,5480,5476,8929,8613,8329,8811,7834,8093,5651,5314,8929,7528,5285,5237,5209,7834,8411,7774,5391,5337,5391,5391,5301,7548,7491,7779,5301,5309,7706,5688,5476,7757,8479,7999,5693,8312,5688,7849,5564,5655,8022,7904,7920,5564,8716,7757,5261,5329,5568,8732,5209,8010,7628,5396,7653,7817,7706,7628,8184,8539,8647,5237,5476,7637,5391,5647,5237,8293,7542,5606,5407,7920,7482,7482,7904,7565,8033,5426,7853,8354,7834,5564,5325,8136,7528,9542,5291,5471,8131,7482,7542,8282,5325,9550,8783,8816,5501,8267,8110,8196,7920,5407,8062,7628,7667,8805,5726,8762,8527,5671,8915,8154,7658,8756,7994,7752,8613,5661,7888,5209,8447,8461,5391,8438,7786,7864,8093,7790,5476,7786,7904,7920,7628,5426,5712,8201,5337,7828,7977,5391,7864,5213,8964,8170,8427,7706,5617,8190,7999,8222,7849,5358,8119,5573,5391,8073,7605,7710,8925,5407,8316,7542,7521,5476,7511,7542,5391,5381,8354,5464,7924,8282,8073,5381,8131,5320,5241,7715,5726,7548,9556,8484,7715,7883,7482,5476,7487,8582,9012,7823,5407,5337,5426,7805,5285,7710,7696,5717,5224,5391,8711,7977,7482,7616,7576,5248,8987,8316,5305,5666,5325,5671,7500,8504,9021,7972,7723,5629,8467,5274,8467,7768,7920,8964,7605,5730,8391,7473,5642,5274,5274,5519,5514,8391,8149,5325,7920,8613,5651,5476,7482,8687,8345,9562,5337,7719,8898,7542,8375,7588,5476,5655,7653,7872,5391,8946,5688,7675,7588,5519,8447,5377,8451,8613,7994,7533,8307,5329,5712,7843,5509,7528,8267,7930,7478,7588,7628,7877,8805,8073,7653,7977,8062,8498,8527,7877,8272,7972,5342,8190,7478,7478,8234,7482,5524,5329,5426,7542,7914,7653,7616,8104,5573,5347,8170,5274,8964,8211,7734,5448,7982,7872,7558,5524,5301,8594,7914,7605,8539,5651,5708,8397,8170,8227,8467,5407,8461,5218,8272,8227,8099,7473,8093,5325,5329,5285,8322,5237,5676,8438,5329,5352,8345,7920,5274,8387,8863,5671,9051,8571,7738,8653,8762,8827,7805,5209,5241,8543,7491,8827,8658,8772,5693,7706,7542,5314,7706,7628,5309,8721,7790,8227,5606,5237,5401,8272,7786,8451,5352,5320,5329,8249,5329,5396,8473,8144,8277,8800,8519,8239,8716,5377,8365,5419,8827,7616,8062,8329,7779,8721,8514,8509,7616,8539,5401,8039,5274,8762,5647,7994,8827,5564,8110,5296,7864,8110,8033,5377,7687,8062,7924,8676,5367,5237,8946,5237,5464,7994,5464,7999,5496,7867,8239,8062,7548,5476,8711,5509,8255,5730,7853,8329,7811,7491,8670,5647,7605,5407,8022,8005,5261,8190,7888,5381,5655,7734,7548,7994,5519,7719,5712,5213,7558,5396,5285,8149,8287,7738,7898,7946,5401,5612,5237,7511,8267,7491,8417,5564,8164,5629,5612,8322,5717,8851,7805,8073,5347,7730,5358,8940,8438,5209,7478,7616,5464,7681,7511,8509,7962,8302,5448,7800,8052,5655,5655,7632,5476,8467,5629,8077,5237,7977,7877,7538,7883,7883,5476,5342,7920,8170,7738,8196,5329,5314,7742,8443,8641,5309,5501,8190,5401,5342,5708,5573,5305,7632,5358,7994,7511,8539,8255,5401,5476,5329,5708,8946,8322,8402,7706,8249,5629,7800,5218,7877,8052,5485,8473,5320,7957,5519,8827,7610,8365,8154,5485,5347,5367,7663,8756,5314,7994,8888,7786,7542,5426,5396,5325,7734,5296,8322,8312,7516,5612,5519,8589,7558,8005,7924,5329,5386,5381,7616,5342,8010,5296,7768,7924,5629,7521,5291,5285,9021,8239,5381,8149,8217,8772,8365,5325,5274,7548,8919,8387,7616,5218,5301,5485,7675,7734,8964,7994,5661,8359,8052,7605,7610,7893,5342,5329,5676,5296,7628,5401,7616,8255,7542,5314,5666,7616,8964,7811,7491,7888,8039,8903,8170,5501,8245,7930,5476,7663,8548,5314,8527,7605,7946,8863,5325,8077,7738,8154,8745,8888,5699,7834,8381,7500,5407,5407,8375,7834,7972,5651,5301,8772,8903,8857,8582,8987,5352,7986,7605,8851,5347,5329,8473,8222,8329,5274,7834,7610,7864,5329,7528,7487,5347,8073,5407,5642,7877,7521,5407,5237,8721,8777,8077,5666,7687,5661,7710,7632,8857,8375,5372,8077,5291,5629,5320,8816,5309,5688,5476,5655,5693,7999,8312,7757,5647,7542,8732,5261,7715,8010,7757,8514,8293,8068,7637,7528,5671,8201,7658,8170,5471,8783,7548,8136,7930,8461,8282,7542,5642,8196,7667,7478,8131,8756,7565,8154,7853,8816,7904,7628,7542,5241,7542,7786,8073,7864,8312,8201,7904,8354,8857,7715,7883,7977,7828,5337,8964,8073,8093,8851,7542,7511,7768,5391,8190,5617,5358,8447,7920,7888,7478,8898,8149,7696,7994,8316,5337,7558,7977,7491,5386,5367,8903,8316,5329,7757,7482,8509,7687,7605,5274,8805,9003,8010,5396,7768,8302,7977,5642,5717,8391,5241,7719,5285,5476,7877,5248,5629,8345,7482,8613,7605,8149,7734,5261,8277,8594,5401,8946,7675,5612,5301,5241,5573,8039,5524,8964,5519,8451,5329,8527,7528,7511,8509,5407,7872,5377,7843,7542,8170,9051,8322,7888,5606,8451,7790,8543,8653,8407,7473,8653,8402,5237,7786,7632,7805,8863,5309,8827,5274,5676,8154,8057,8772,5693,5407,8170,8249,5209,7867,5291,8509,8322,8022,7864,5496,8255,7548,8676,5448,5464,7811,7663,8762,5712,7957,8005,7893,5712,5305,5655,8527,5717,8077,5426,5676,8077,8136,7511,8052,7898,5476,7977,8888,5237,8473,5629,7800,7632,7592,5218,5485,8539,8443,8190,7491,8772,5291,8239,7734,5329,8217,5347,7734,8498,8322,8919,8154,5666,7605,5314,5401,5476,5496,8473,8267,5367,7521,8227,8411,8131,5708,5459,5726,8239,7555,8227,8514,5661,8969,5261,5237,8267,7834,5358,7653,5358,7504,8509,8756,5413,8062,8489,8589,5274,5274,5407,8438,9568,0,8322,7687,5386,5358,5352,5367,5329,8411,5358,8489,7849,8721,5717,5717,8048,5291,8062,7952,8438,5476,8653,7843,5329,8805,7653,8170,8354,8354,7800,5726,7516,8227,8635,5407,7834,8438,7834,7864,7643,7628,7752,7521,7491,7542,5726,7834,7752,8282,8345,7994,7482,8144,5699,5347,8762,8239,7628,5606,8077,7738,8509,7849,5699,8519,5347,8307,5629,8005,5629,8721,8647,8795,5237,5296,7877,7920,8903,7811,7738,8179,5342,8514,8969,5261,7834,5296,5358,7752,8519,8489,7994,5274,8062,5407,8438,8756,8514,7687,5386,7952,7752,7738,8438,5329,5642,8048,5717,7849,8653,8484,8354,7843,8893,7628,7834,8227,5237,7752,7643,7834,7864,7877,5347,5726,7834,8144,5699,5717,5606,7738,5699,8795,5347,5564,5564,5333,8217,7528,7542,7478,5476,5480,7605,7924,8093,7864,7628,8282,9577,8946,8267,8821,7972,7920,5485,7565,7924,7482,5655,5381,7491,7904,5726,8539,8443,7571,7828,7696,9051,5480,5717,8312,5224,5564,5325,5329,7610,8033,5426,7888,7957,5305,5419,5320,7888,5274,7696,5459,7628,5671,5261,5337,8255,5426,8387,7558,5358,5367,5261,8119,7972,5480,8307,8467,5655,5573,5274,7790,8077,8267,5274,8456,8456,7967,5476,5407,8099,7482,8170,7805,8033,7920,8093,8272,5274,5329,8594,5274,8211,7605,7924,8705,7786,5248,5301,5301,7628,5377,7628,7610,7994,7994,8077,8217,5342,7977,5464,5381,5342,7482,5671,7834,5296,5717,8267,7632,7994,7663,5237,7994,5325,8015,8316,5708,5419,7482,5301,7648,7516,8422,8647,8222,5342,5342,7628,5274,5442,8447,8010,5325,8010,5237,7482,7864,5296,7610,5381,5301,5301,5301,8863,8756,7972,9032,7667,7823,5476,5699,7834,7542,8387,7504,8387,5325,7786,7811,7972,8131,7667,7839,5218,8170,5573,7982,8925,7632,7628,5442,7757,5342,7653,8154,8617,8721,5573,8925,5218,5325,5237,5442,7511,5301,7823,5325,8925,5261,7738,7628,7628,5529,8136,8762,5367,5391,7752,5501,8334,8267,5301,5358,8608,8093,5666,8345,8222,8249,7828,7843,5426,7478,7999,7500,5325,7715,5274,7675,7687,8805,5655,8456,5712,8093,7706,7482,8154,8302,7893,5534,8427,7482,8447,8548,5651,7516,5476,7582,7616,8387,8249,8617,8093,5367,8062,7482,7632,8349,8267,7511,8249,8888,7478,7994,8154,7482,5237,5476,7663,7883,8919,5274,5386,5329,7977,5730,5325,5337,5337,7904,7920,7994,7962,8073,5325,8349,8249,5448,7538,5301,8154,7663,5391,5491,7610,8093,7663,8519,5301,7800,5485,5419,7715,8015,7877,8745,5485,8052,8402,5485,5291,8745,5485,5485,7828,5485,7628,7893,5642,8898,5651,7746,9591,8174,7491,5606,5676,7491,5717,5693,5496,5407,8504,8539,8329,7478,8504,8196,5309,5529,8577,7904,7482,7730,8136,5305,8443,8245,8282,5476,5642,8272,5480,7977,8062,8174,7924,5209,5329,7977,7628,5325,5661,5688,8345,8727,7817,7904,8245,8255,8539,5509,8811,8484,7681,8255,8190,8571,7538,7738,8015,5224,7752,8170,7986,5661,8110,7898,5476,5688,8267,7849,5509,7715,8170,5407,8411,8539,5407,5274,8322,8131,7738,7930,8345,7533,5717,5564,8144,5237,7957,7839,8131,7977,5325,8312,5419,7990,8245,8154,5274,7542,8762,8631,5407,5261,7994,8504,5564,5712,5676,5717,7610,5309,7653,8227,5301,8110,8329,5617,7994,7834,5519,8272,8131,8267,7588,7605,7994,8800,8762,8222,8762,7994,8504,5367,7653,7994,8267,8272,8484,8484,5274,5661,5274,5325,7482,7864,8267,8670,7478,5352,7946,7616,8267,7930,7482,7482,7521,7982,7491,5693,8745,7533,7521,8598,7653,7500,7511,7500,5237,8022,8005,7706,8560,7628,5509,8282,5471,7828,8751,7533,8312,8093,7628,5485,5666,7849,8255,7864,7994,7994,5381,5314,8456,5476,7982,8370,8217,7858,5255,7706,5564,7977,7853,8827,8005,7977,7757,5606,7516,7616,7667,8994,7653,5485,8422,8048,8751,8277,8422,5381,7643,7628,5693,5712,7834,7653,5407,7990,5491,7592,8196,5476,8159,5377,7864,7864,7834,7643,8795,5218,5622,7834,5274,8676,5476,8467,8940,7982,7828,5419,7692,5666,8239,8647,5391,7800,7706,7648,8052,7478,7786,5309,7542,5296,8427,7511,5629,5301,5274,8751,5329,5347,8077,7768,7491,5693,8745,7653,7521,8598,7500,7500,5509,7786,5471,7706,8282,8022,8560,7628,5329,8093,8312,5485,5381,7977,8015,7653,7616,7616,8370,5476,8751,8919,8422,7653,8329,7616,7990,5377,8239,7864,5622,7834,7864,8077,7800,7828,8940,8052,5325,8427,8613,8751,7768,8527,8473,5372,8903,5367,8427,8473,7730,7811,7658,8577,7795,8190,7628,8170,5329,7487,8087,7924,5642,5448,8509,5514,8010,7511,5237,8239,8647,8647,5301,8473,8110,5301,8239,7723,7719,8527,5342,8527,7610,5329,8473,7730,8170,7616,5448,7521,5237,8647,8473,8473,7893,8010,8073,7893,5391,7982,7972,5325,5693,8261,5480,8631,7962,7521,8068,8504,7628,7565,7710,7482,8010,9596,9609,7482,7982,5476,5476,5358,7839,9621,7511,7839,7710,7487,8222,5391,8057,8370,5255,5606,5285,5655,5224,7839,8316,7839,7521,7924,8539,7696,7834,5622,5352,8179,8073,8028,7864,8201,7667,8307,7588,7628,5491,5642,7643,5606,5391,5407,8863,5224,5274,7877,7877,8772,7893,7588,7994,8721,7864,8699,7643,7982,5464,8964,5296,5407,5730,7849,5426,7687,7994,5564,7823,7828,5255,8073,5396,5237,8005,7511,5448,5358,7491,8267,5305,7511,7800,7715,7628,5519,5309,8845,8005,5622,5381,7710,7994,5476,5325,7648,7558,5218,8272,5296,7521,8427,5501,8543,8249,7834,7715,7877,7521,8433,8857,5358,5391,7972,5325,7706,5426,8068,5237,8504,7628,7710,8010,7482,5407,5391,8222,7487,5459,5476,7696,7648,7521,5325,5509,5285,8119,5224,8073,5666,7864,7628,8028,9633,8641,7643,5274,8721,5496,8005,5459,5448,7877,8077,5305,5320,7511,5519,5309,7800,8589,5622,7700,8087,8005,8039,7521,8484,7576,8447,5358,8073,9641,5301,7893,8033,8345,7904,5564,5274,7752,7528,8402,5358,5426,7538,7628,8527,7653,8539,5480,5480,7710,8329,7605,5661,7706,7883,8915,7730,7482,7752,7972,5325,7893,5726,8073,8222,7908,5480,5476,5726,5241,5726,7592,7768,7999,8467,5352,7576,8170,7605,8293,8170,7920,8205,7977,8093,5655,7658,5564,7675,5391,5358,5480,7920,7487,7940,7734,7858,8272,7972,8164,7478,7582,8149,7768,7914,5274,7696,8370,8073,8721,7482,7632,7538,7516,5661,5325,8170,8022,8196,8211,7779,7653,5647,8190,8422,7667,7628,7558,7528,7663,5329,8863,7576,5617,5325,8653,8272,8277,7986,7990,7706,7706,7628,7893,5514,7834,5381,5642,7478,5476,5329,7858,7542,7893,5464,5407,8154,7752,5377,8519,5367,8548,8005,8110,8087,7795,5480,8005,5448,7542,7558,7972,7511,8140,8909,5237,8340,5442,7834,8467,7967,5514,5261,5301,7972,5329,5305,5237,7632,8015,5305,5708,8179,8647,8827,5726,5358,5274,7628,7500,5396,7849,7588,7675,7516,7877,5471,8789,5480,8833,8772,5285,8964,7834,5301,8427,5485,5476,7828,7516,8888,7967,7834,7710,5329,5274,7521,5325,8617,8170,5237,7811,5301,8473,7538,7628,5480,8329,7710,5726,7828,8073,5329,8205,5391,7487,5564,8170,7967,7605,5480,8293,7977,5476,7658,7675,7538,7790,5285,5396,7632,8370,7858,7839,5301,7558,7834,5325,5285,7667,7706,7706,7990,8863,7653,5358,8179,7858,7972,5237,5514,7478,5708,7511,7542,5261,8647,7632,8827,7877,7967,5325,5285,7521,7786,5464,5301,7994,7849,8811,7920,8608,7853,5661,7667,5358,7710,5699,8539,7692,8370,8255,8131,7473,5717,8427,8845,7858,5358,7990,9012,7930,5342,7957,8073,7675,7616,7849,7839,8739,8888,5305,8608,7957,5386,8762,8205,5342,5377,8888,8739,8479,5524,5564,5688,8119,8255,5329,5372,8473,5301,8653,5377,7565,7533,8721,7790,7883,5320,7576,8048,7681,5352,5209,8048,8297,8811,8174,7920,7790,5564,7706,8164,5726,7521,5519,7795,5325,5352,9361,8670,8438,8391,5301,5391,8548,5377,5352,8022,7622,7768,5712,8598,5407,7888,7982,7986,8484,7706,5401,5655,8888,8245,5305,8589,7800,7800,9026,7500,5712,5305,7605,8789,7811,7908,8539,8888,8577,8261,8307,5209,5386,8062,5237,8307,7653,7610,5342,8484,8227,5459,7628,5301,5676,8190,7542,8582,8548,8711,5655,8987,7628,7952,5305,5325,7706,7999,8005,7643,7904,8312,5712,7500,7834,7675,7779,7628,8422,7706,7599,7779,7994,8277,7710,8647,5606,5305,5325,7500,5391,7834,8427,7628,8479,5241,5301,8277,7817,5480,7757,5342,8762,7864,5358,8302,8560,8068,5329,5476,5381,8010,7576,7628,5329,7752,7982,5426,5237,7565,5501,8136,5337,5712,8762,7849,5367,5726,7653,7920,7872,5480,7500,5688,5255,7622,5358,5325,7994,8170,5568,8903,8033,7990,5448,8184,7723,7658,8222,5564,7687,8115,7786,5476,7757,7742,5305,5381,5320,7957,7710,7696,8345,7994,7681,7605,7482,8577,7632,8316,8255,7706,7605,7994,5285,8598,7952,5274,5717,8795,7491,7500,8316,8711,7888,7667,5274,7800,7675,5296,8427,5407,7628,7999,5578,8234,8845,5514,7478,5688,5642,5564,5509,5337,5301,8302,5301,8582,5291,8190,7746,8154,5329,5218,8447,5209,7706,8745,7521,5629,8104,5325,7757,7867,7516,7576,8851,8277,7893,8447,5476,8653,5329,8484,8227,5485,8170,8093,7967,5301,8676,7663,5285,8184,8154,8126,5391,5693,7914,5325,5391,5730,7478,5480,7692,8322,5325,8010,8582,8903,7538,8302,7883,7994,7628,8658,8110,5459,5464,5401,7834,5688,5688,5407,5501,7864,8387,5564,8159,5407,5367,5622,7982,5471,7533,7834,7752,5407,8052,5305,7687,5726,7511,7632,5391,5391,7482,8533,5655,7738,5642,7715,8164,7542,7706,7752,8893,5352,5401,5708,5333,5296,8073,5325,7681,8925,5407,5514,7800,5237,5688,8473,5325,5325,7605,7768,7605,5622,8154,8015,8756,5529,5432,5291,5726,7521,8073,5285,7834,7588,5352,9021,5261,5261,8010,5291,7516,8329,7622,5237,0,8946,7675,8721,5730,7908,8062,5514,8427,5367,8211,8119,5301,8227,7935,7864,7511,7616,5325,7500,7834,8302,5301,7628,5301,7763,5655,7521,7864,5329,8721,5301,8946,7628,7834,8863,5337,8554,5329,7565,8745,7516,8073,5255,8184,5329,7757,5407,5564,5329,8222,5730,5699,7658,7952,5381,8217,7994,7696,8099,5509,7828,8461,5325,5285,5274,8821,7521,8329,8845,5301,5401,5407,5301,5391,7681,8234,8302,5509,5655,5325,5367,8745,8093,5386,7967,7893,8653,8227,7786,8447,8184,7757,5485,8190,5391,5209,5501,5459,8184,7588,7864,7839,7511,8159,7864,5688,5564,5464,7994,8940,8411,5514,5708,7706,7738,7482,5642,7994,8267,5333,8473,5529,5432,7800,8438,5218,5622,7877,5291,5261,7516,9021,5329,8795,5301,8033,7482,5453,5476,5564,5305,8484,8201,7834,5564,7757,5325,5325,5261,8811,5391,8527,8391,8222,8467,7972,5693,8196,5564,5501,7752,5407,8539,7628,8998,5285,5291,5291,7920,7811,5655,8222,7834,8387,8154,8533,5666,7990,7742,5325,7977,8903,8093,5419,5564,5480,7628,5301,8411,7972,8509,8467,7628,5726,7675,7972,7883,8170,5337,7786,8936,7628,7924,5666,8387,8964,7628,5301,7616,8863,7478,7696,7795,7663,7610,7834,8073,8617,5325,8577,7605,7834,5391,8062,5301,8613,8711,5717,8504,5285,5519,7576,7972,7632,5274,7972,7706,7972,7977,5325,7628,7811,5476,8201,7478,5676,7628,8073,8329,5651,5358,5237,7667,8170,5647,5485,5377,7864,7864,8582,7982,7478,5651,5329,7628,7521,7478,5255,5320,5564,8345,7999,5352,5325,5524,7930,7757,5329,5699,5407,8170,5647,8539,8467,7706,5301,7491,8863,8721,8863,8093,8119,7706,5485,5476,7972,5485,5209,8277,7582,7706,8104,8845,8170,5726,8154,5655,5325,5320,7478,7710,7924,8110,5476,5688,5377,7982,5377,7864,5381,7790,5564,8104,5647,7834,7849,8467,7858,8267,7706,7982,7616,5471,7715,8170,8772,8777,7565,5301,7616,8447,8190,5534,5391,7849,5573,5629,5367,8893,7511,5325,7786,5407,8196,7653,5209,5519,8447,5642,7834,5325,5301,5606,5568,5377,5224,8447,5647,7538,5285,5524,5606,8033,5301,5622,5578,8845,5642,5476,7742,7710,7972,8239,8164,7957,5358,8617,5314,7920,7478,5291,7482,7768,7487,5285,7924,5396,5358,7972,7588,5464,8010,5285,8239,7834,8316,8484,5274,5274,5647,8349,9021,7628,7616,5329,8641,7605,5529,5476,7920,5320,7632,7706,5476,5325,5578,7628,8427,8811,7924,5377,8381,5647,5651,8839,8249,8539,8354,7628,5666,8222,5329,7898,7610,5325,8354,7616,8721,8873,5301,8375,5453,8484,5325,8467,8391,9471,7742,8387,5237,8222,5655,7786,7582,5329,8387,7548,7924,7500,7972,5726,8467,5401,5480,7487,7972,7696,7795,5519,8479,7977,5717,8375,8062,7786,8073,5301,5676,7982,7864,7628,5274,5377,7478,5699,7622,8345,5325,7930,5352,5688,8104,8845,5476,5464,7982,5325,7864,7786,7734,5209,5712,7715,8159,5642,5342,8789,7719,5296,5407,7849,7628,7616,5578,8239,8239,5285,8484,7628,5329,8473,8427,7616,8154,5301,8721,5529,5329,8484,7723,5407,5274,8451,7628,5407,7834,8451,5329,5337,8140,5325,8473,8533,5642,7605,7667,7605,5407,5651,5651,7478,7511,8033,7478,7952,8447,7706,5329,8484,7667,5285,5301,7592,7834,7977,5651,5301,5617,7883,7516,5485,5325,7500,7588,8140,8349,8349,5717,7482,5564,7746,8387,7628,8174,5726,5642,8711,7681,8783,7628,5726,7746,8170,8527,5564,5726,7746,7538,5305,5305,5296,7610,7967,8402,5501,5464,5464,8255,7723,8307,7853,7946,7867,5301,7946,5320,5301,8184,7710,9372,9372,5476,7542,7883,5237,7622,5305,5305,7542,5491,5573,5337,7828,5476,5367,5476,5726,7667,7834,5485,7628,5301,8903,8762,8179,7482,5726,7834,8772,8345,5655,5622,8179,5476,5712,7883,7834,8762,5485,7972,5501,5564,5564,8438,8438,8467,8140,5726,9646,8762,5325,7675,8211,5708,5432,5480,5358,8467,8387,5480,5693,5651,8716,7675,5209,7786,5358,7582,5501,8272,8467,7920,8227,5524,7706,8136,5629,7786,5320,5320,5501,7893,7752,7904,5564,8604,8316,5726,8119,5391,5337,5391,8805,7478,8184,5485,7643,8170,7834,5647,5377,5237,5274,7834,5407,5358,7610,5688,7653,7632,7478,5730,5237,5717,7687,5274,5534,7687,8789,7700,7706,8533,5325,5209,5325,5325,7706,5325,7710,5325,8033,7849,8387,8800,5661,8174,5358,5391,5209,7710,8184,8170,7681,8093,8093,5573,7768,5661,8800,8077,7653,8316,8287,8653,7628,7940,5476,8447,8451,7967,5726,8805,5274,7742,7864,8494,5476,8287,7967,7828,8267,9654,8387,7710,8033,7734,8277,8170,8093,8174,7681,5209,8800,7628,8287,5726,8494,7610,7710,5241,8334,7834,7610,5329,7817,8795,7516,7940,7738,7610,7817,8795,7952,5688,7768,7952,8354,8721,7849,8604,5661,8073,8115,7867,5480,7632,7883,7675,8893,5407,8190,8411,7962,7521,5274,5255,5655,8119,7982,5391,7605,8354,8104,5329,7478,7582,7675,5325,5381,5464,5426,5712,8010,7805,5622,7858,8527,7605,8062,7867,5730,5688,7622,7542,0,8005,9657,7957,8267,7849,5629,8354,5442,5524,7893,8893,5241,8131,8077,7542,7675,8498,7817,8334,8762,5301,5358,5314,5573,8635,7710,7605,8322,7610,5347,5407,8201,5301,5296,5358,8539,8827,7834,5352,9367,5622,5213,8647,8307,7628,7763,5622,8115,5237,8039,5476,7982,7877,5568,8140,5255,5442,5325,7952,7588,7957,7687,5329,8184,5612,8498,9662,5612,5333,8676,9670,7675,8073,5651,7487,8903,8239,7883,7828,5564,5407,8438,8005,5491,8255,8919,5464,7962,8149,8365,7675,8762,5391,8365,9676,5213,9680,5213,8811,8170,8762,5329,7834,8073,8903,8159,7990,7610,7542,5401,8073,7576,8277,9686,5347,8005,7628,8354,8052,5655,7658,5377,5651,5442,5325,9690,9680,8909,5622,7576,8010,5448,7576,9695,5314,8909,5329,5329,5407,5480,7616,7628,8277,7610,9701,5401,5347,7542,8354,7548,5726,5401,8411,8676,8857,5301,7487,7632,7616,8354,5314,7500,5651,8539,8010,7914,5578,7914,8293,5661,5666,5274,5209,8447,8879,9710,7542,9715,5358,8282,7478,8302,8756,8110,5501,5358,8402,9721,5301,7710,9726,9736,7904,5301,8811,8170,8312,5305,8140,8184,7576,5301,7588,7681,5301,7706,7588,8062,8316,5209,8604,8354,7576,7516,9345,8126,9740,5501,5325,9745,9751,7779,5274,5564,7779,8179,8845,5301,8354,5329,8170,7706,8402,8126,8015,7516,8548,5485,8039,9759,8589,8589,5629,8411,8110,7746,5730,7500,8548,7982,5407,8365,7839,5301,5661,5564,8447,7930,7786,5519,5524,5629,5688,9751,8340,9345,5629,5651,8589,5501,5372,8756,5419,5305,8589,8589,7495,5237,7779,5419,7908,8073,7811,985,8548,5274,7495,8641,8077,5301,7571,8539,8077,7681,5347,5651,5285,8484,5237,7817,5241,8484,5337,5325,5496,7576,8329,8354,8062,7628,7849,5509,8504,7752,7752,5688,8136,5209,7853,8816,8998,5381,5320,8104,7920,7482,8302,8062,7972,5325,5501,8267,8504,7883,5309,7588,7565,5612,8402,8484,7687,9766,5309,5564,7972,7839,5209,5442,8062,7687,5666,5237,5564,5661,7914,7930,7605,5726,8093,7605,8670,8811,7924,5564,5480,5655,5491,5314,5391,7548,5274,8443,7592,8282,8170,5305,5320,8397,9772,5485,8504,7946,5661,5381,7605,5442,7795,8126,5291,8582,7982,7839,8845,8845,8272,5661,7692,5285,7768,5671,7632,8190,5224,5274,5564,9462,8316,8164,7681,7482,5666,5661,7768,7500,8099,5459,8316,7487,5419,7521,5296,5291,7972,5407,5676,7710,7746,5655,5329,7558,5688,5320,7898,8316,7675,5509,8196,8845,5519,5377,5519,5661,8062,5237,5564,8805,5342,8217,8653,5564,5485,7982,7972,7834,7592,8527,5325,9778,9783,8548,7516,7888,5301,5329,7779,5442,7768,8670,7706,7706,9032,7706,5509,7542,5274,8087,7994,7706,8272,5509,8461,7599,5413,8863,7774,8039,8402,8099,7511,7706,8427,7930,8287,8093,7746,7706,7867,8772,8548,8234,7967,5476,5209,5426,7779,5309,7893,7872,8438,7628,8548,8010,5329,7500,9789,8015,9796,7500,7521,5407,7990,5274,8821,7746,7706,8676,7548,8539,8438,7622,8467,5661,8222,7487,5688,8411,7811,8845,8827,7746,7994,5564,7994,7628,8131,7622,5661,5401,8548,8411,8267,7482,5377,7795,7972,8267,7558,7877,5491,5367,8467,8548,7500,9804,9810,8845,9367,7616,5309,5476,8863,8447,7898,7786,7533,7576,5407,8451,7768,8617,8267,5367,8952,5237,8164,8272,5564,8267,5655,5524,8613,7982,5437,8909,5274,7588,5655,8548,8272,9818,7774,5358,8527,8140,5301,5612,7482,5237,8548,5666,5622,7542,7800,7972,5329,5305,8647,5401,5651,8190,8548,5325,5261,5342,8010,8952,5413,5476,5514,8711,7576,8322,7643,9824,5237,9829,5519,8297,8190,5296,8255,8833,7571,7972,5261,8589,7516,7628,8010,8239,8287,9021,5407,7648,7877,7872,5519,5296,5396,8857,5237,8322,9835,8245,8119,5296,5237,7719,5407,5419,7811,5372,8827,5381,5285,8073,7877,5476,5386,5342,5476,8635,7500,5325,8888,7542,5347,7734,8329,8857,7706,5352,5301,5305,5666,5661,8857,8582,5337,7500,5666,5274,7877,5568,5329,7877,7616,7774,7521,5274,8397,8857,7632,5237,8479,5347,5666,5401,7487,8484,7628,8062,7576,5274,7849,8354,5325,5509,8582,5325,8504,7994,8267,8062,8104,7920,8302,8461,8136,8504,8548,8099,5501,7972,7752,7565,7605,7482,8816,5320,5274,8811,5661,5564,5401,8443,7914,5237,7972,7548,7576,8282,5564,5314,8670,5476,5485,5491,7898,8164,5381,7692,7648,5459,7946,5296,9462,8190,5419,7632,5291,5285,8316,8845,7675,5676,5519,5237,5342,8272,5325,5377,5325,7500,8093,9839,7500,7706,7893,8287,8015,8234,8119,7994,7746,8087,5413,5442,8272,7511,7768,8548,8427,5509,5329,8863,5209,7990,7521,5407,7746,5347,5377,7622,7706,8267,5296,7487,7888,8676,8411,5274,8131,8863,7811,8539,5329,8411,8438,8467,5309,5564,8613,5655,8527,8952,5524,7877,5301,5476,5407,8888,8647,7800,5666,7616,5612,8711,5514,5661,8239,5261,8833,5419,7542,5372,7811,5285,8857,8998,5661,8461,8998,5699,8998,9844,8073,5255,5730,9853,8461,7616,7616,8745,5367,8721,9021,8772,8227,7706,5534,7616,5666,8772,5329,8721,7599,7599,8461,7599,7653,9858,7632,5564,5651,8048,7786,7605,8170,7790,7786,8438,8461,7904,7795,5377,5676,5564,7516,7834,7999,8397,7795,5314,7628,7972,8345,8048,7823,5320,7487,7920,7538,7511,7904,8048,5301,8783,7994,5358,5325,8833,8316,7511,5325,5676,5651,7999,7632,7920,5325,5325,8375,7924,7763,8322,7738,5712,7924,5337,5337,5501,7904,5524,7924,7786,8322,8205,5524,8093,5476,7605,8539,5519,7542,5476,5274,8164,8658,8658,7542,7811,8397,5274,5476,9863,8322,5274,7628,8845,5381,5629,8467,5237,8010,5261,5501,5261,5401,5666,8845,8417,8322,7877,7628,7817,5476,5248,5534,5501,8062,7710,7710,8402,5564,5367,9054,5476,7986,5476,7920,8093,7511,7972,5726,5237,5661,7521,5237,5237,7706,8255,5296,5296,7675,7719,8062,5419,8539,8402,7893,8272,8302,7710,7605,5407,8190,5391,7858,8548,5509,5296,5730,7849,7849,7653,5708,8647,5476,5401,5726,9873,7516,9054,8255,5708,8010,5476,5296,8190,8479,5642,8149,9877,8898,7790,5578,7706,8131,8131,8131,5459,5459,7696,9045,8821,7696,8716,5622,5666,8805,5209,8845,8783,8052,8267,8994,7920,7710,7487,5573,7977,8170,7849,5573,8149,8099,5325,5629,7742,7957,8417,8131,8334,8115,7957,5325,8149,8154,5337,5305,8359,7696,5578,8805,7491,8245,8022,8196,8267,7710,7883,7883,8062,8845,7972,9881,8077,7883,5655,7935,8093,5241,5337,8631,8239,7610,7972,8381,7681,7696,8387,5459,7795,9886,5401,8052,8119,8577,8751,5485,8170,5358,8539,8039,7752,7500,5255,8827,9891,9900,8805,7628,8827,8005,9904,8005,8827,5401,5534,8005,5401,5401,8827,5708,8119,8022,8805,8005,8077,7972,7883,8381,7867,5325,8805,8805,7610,7628,7628,7999,7487,7588,5476,7588,7487,7999,7999,8110,5476,5333,5325,5688,8800,8340,5717,8539,7811,5464,5476,8504,7675,8613,7576,8467,8762,8461,8164,8811,5496,8494,8227,7786,7972,7653,5564,7893,5501,8456,8334,5407,7565,9032,5337,8136,8560,8800,8297,7817,7628,7752,5642,5309,7920,7542,5237,5237,7893,8800,5485,7658,7914,7548,8015,5661,7914,7994,7576,5459,7883,7893,7904,8073,5726,5606,7930,7795,7658,5209,7692,7972,8447,5255,5209,5564,8334,5655,5274,7571,8456,7977,8119,7972,8222,7715,5726,7982,7990,5476,7482,7500,7924,7610,7582,9012,5329,5485,8293,7834,8334,7473,5476,8687,5671,5717,7582,7972,7675,7504,7504,7696,7864,5426,7858,8766,5209,7952,773,9915,2533,3110,9919,3464,9924,2802,9929,9934,9939,9945,3447,2826,2847,3306,9950,9955,2550,2661,3190,9961,2685,2300,3133,3157,2871,3215,9966,3179,3005,9971,3235,2606,2953,2977,40,609,2526,9977,1783,9981,3457,9985,2795,9989,9993,9997,10002,1733,2819,324,3297,10006,10010,2547,2654,3120,10015,2678,2700,3126,3148,2864,3208,10019,347,2998,10023,3228,2599,2950,2968,24,603,10028,429,10033,852,10037,803,972,800,10041,9312,10045,10050,829,833,985,806,955,959,10055,839,819,816,10060,826,988,1044,1464,926,809,10064,855,836,1659,10068,915,845,842,848,776,10073,4081,3560,10077,3573,10082,10087,10091,10096,10101,10107,4021,10112,3609,4035,10116,10121,3809,4003,10127,10131,3849,3912,10136,10140,3707,10145,10149,3959,3661,10154,10160,3747,3787,10164,64,606,2523,10169,3103,10173,3454,10177,2792,10181,10185,10189,10194,2738,2816,2840,3293,10198,10202,2544,2651,3183,10207,2675,2696,3123,3144,2861,3205,10211,670,2995,10215,3225,2596,2947,2964,52,1084,10220,2537,9220,3114,10225,3471,10229,2809,10233,10237,10241,10246,10250,2759,2833,2854,1321,10255,10259,1426,2668,3194,10264,1325,327,3137,3166,2878,3222,10268,1318,1311,10272,3242,2613,1400,2986,32,410,10277,1620,10282,482,10286,3468,10290,2806,10294,10298,10302,10307,10312,10316,3451,2830,2851,3311,10321,10325,2554,2665,432,10330,2689,2305,464,3162,2875,3219,452,1772,3009,10334,10339,3239,10345,2610,2957,2982,106,10349,0,0,0,10360,10360,10360,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,8,10,12,14,16,18,20,22,10360,10360,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10366,10366,5777,5777,4344,4344,5078,5078,6688,6688,6694,6694,10373,10373,10379,10379,5898,5898,6704,6704,670,670,6704,6704,10387,10387,10394,10394,6704,6704,1736,1736,0,0,10402,10402,10402,10402,10402,10402,10407,10407,10417,10417,10427,10427,10434,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10446,10446,10450,10450,10455,10455,6540,6540,10460,10460,2851,2851,3613,3613,10465,10465,10470,10470,10475,10475,4198,4198,3917,3917,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10480,10480,10480,10480,10480,10480,10480,10480,168,179,184,10488,193,168,179,184,10488,193,168,179,184,10495,193,618,618,618,10505,249,249,249,249,10511,10520,10520,10527,10527,10527,10527,10541,10541,10546,10546,10549,10549,10558,10558,10558,10558,4971,4971,770,770,1451,1451,908,908,5150,5150,5150,5150,1521,1521,28,28,44,44,44,44,44,44,10568,10568,46,46,52,52,52,52,776,776,54,54,54,54,54,54,56,56,56,56,58,58,10575,10575,66,66,10579,10579,10582,10582,10593,10593,10593,10593,10599,10599,5234,5234,4924,4924,10604,10604,10608,10611,10615,10619,10623,10575,4971,10627,10631,5070,5070,5070,5070,5070,5070,5070,46,46,5070,5070,5070,5070,5070,5070,10634,10645,10651,10658,10658,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,34,54,48,40,48,24,40,10667,64,32,52,10676,1311,1314,3242,4177,875,2878,3342,3222,10684,3648,4056,2514,10688,2854,1321,3194,10255,1400,3471,3373,2809,10229,2613,2668,1426,10693,1325,2537,24,40,64,32,776,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,836,911,915,922,926,812,809,848,806,955,816,842,803,968,800,845,1144,1454,1148,852,1464,1044,24,855,819,839,988,826,429,24,40,64,32,52,479,2885,833,1060,773,852,855,933,937,942,951,10697,10707,5004,10717,819,819,863,0,0,0,0,0,0,0,0,0,0,0,0,875,884,24,770,40,892,64,895,58,664,46,1057,32,773,905,52,776,908,836,911,915,918,922,926,812,809,929,848,933,937,942,946,951,806,955,816,959,842,803,968,800,972,845,855,819,839,985,988,992,826,429,976,10727,770,40,892,64,895,58,664,46,1057,32,773,905,52,776,908,1011,0,0,0,0,0,0,0,0,0,0,0,0,6,8,10,12,14,16,18,20,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,8,10,12,14,16,18,20,22,836,911,915,922,826,988,1044,848,806,10733,842,803,968,845,816,800,819,855,839,852,955,429,985,926,24,109,40,776,0,0,0,0,0,0,0,0,3715,10737,836,915,922,806,816,842,803,800,845,926,809,848,826,819,839,855,852,429,10041,10068,10060,10742,24,40,64,32,905,52,908,1786,10747,106,50,58,38,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,24,40,64,32,905,52,836,911,915,918,10750,922,812,10755,809,929,10760,10765,10769,806,955,816,959,10774,842,942,803,10778,968,800,972,10782,845,1073,855,819,839,985,992,826,429,770,40,892,1518,64,109,52,905,908,1440,855,819,839,852,0,0,0,0,0,0,0,0,0,4580,4580,4580,4580,4580,4580,4580,4580,4580,4580,4580,4580,4580,4580,0,0,0,6,8,10,12,14,16,18,20,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7558,7681,7972,8402,5712,5661,8402,5661,5305,8349,5325,10786,0,7908,7730,8205,7706,5386,5651,8789,8375,5509,8073,7752,8721,5688,5285,5485,8110,7946,8451,8577,5261,8805,5712,8104,7914,5661,8407,8397,8140,5519,7528,5480,8174,7558,8028,5564,8307,5480,5453,10798,7920,7786,7795,5301,5401,8015,8402,5381,7779,7576,7920,8473,8099,7858,8039,8005,7805,7883,5606,8028,5485,5381,7986,5476,8345,8504,7914,8287,5564,5564,8170,7893,8322,5509,7582,7920,8039,8548,5693,7478,5712,8821,5622,7972,8694,7795,7742,8539,8345,5426,5386,7628,8732,7823,8267,7548,8110,7864,8159,5647,5642,5407,7994,5285,7628,7977,8676,5358,8227,5564,5274,8447,7746,8631,8909,8422,7898,7542,5329,8631,5448,5629,7588,8863,5717,5476,8073,8239,5325,7920,5661,5524,5329,8888,7742,8227,5329,8039,8334,8663,8647,5419,5564,5629,5305,5237,5622,5329,5285,7616,5329,7972,10803,8104,5401,8316,5352,8447,7687,8239,8402,7952,7675,8909,8010,7972,5285,5261,7478,8402,8489,7521,5342,5501,7616,8772,9361,7883,7908,8789,8068,5401,5358,5218,5291,5573,5476,5676,7986,5401,5514,8068,7786,7706,8402,8888,8329,8613,8154,8205,5274,8473,5426,8739,7986,7834,5329,8154,8205,7632,5726,8205,8375,8447,8205,8033,7542,8494,8687,8205,7516,8687,5209,5285,8077,5442,5325,5524,5442,7746,8077,7972,7972,5717,5407,5459,7972,5519,7658,5655,8484,5274,7628,5496,5642,7628,5248,5237,5237,8484,7628,7628,5426,8170,8484,7528,5617,5617,10809,8484,5391,8772,5320,5391,5606,7883,7734,7734,8721,5396,8772,8732,8598,5367,7478,7576,8479,8461,5261,5476,0,8994,7658,8010,8282,8732,8560,7565,8282,5699,10817,7548,5407,8777,8093,7605,8115,7888,8073,5274,5717,8732,7977,5329,8062,8334,5237,0,5564,5372,8527,5301,8670,7628,7843,8805,0,7994,8073,8249,8184,8170,5464,8087,8548,8411,7790,5459,10825,7898,5496,5476,5514,8777,8340,7957,5491,10830,5642,8316,10836,8903,8772,5329,5476,5381,5407,8154,8249,7706,5329,5329,7877,8617,8682,7779,5407,5407,7719,7834,5564,5255,7834,7834,8340,8340,5476,5333,8805,5688,7663,8716,7681,5285,5381,5352,5509,5476,7637,7746,7763,8811,7542,7628,7628,8851,7723,5647,5367,7706,8211,5209,5296,5342,7972,7521,5358,5564,8068,7994,7478,7972,7706,5261,7752,7542,8504,8998,5568,5381,5329,7500,5325,8196,7706,8467,5501,7904,7872,7528,5325,5396,5396,7565,7478,5291,8131,7972,8267,8196,5708,5573,7790,8387,7893,8705,8560,8827,7482,5337,8411,5476,10844,7994,5301,7920,7864,5274,8227,8777,8249,7588,5476,8467,8297,8093,7658,7681,8539,7622,7723,5301,5218,7990,7715,8456,8222,8131,8438,5476,5476,8170,7920,8893,7692,7605,8447,8073,5224,5261,5688,5642,5274,8543,8062,7616,7687,7582,8170,5459,8077,8811,7982,5255,5712,5564,8119,7786,5358,7994,5564,5314,7790,8010,7867,7790,7790,7904,5209,5305,5209,8539,7710,5325,5485,7610,0,5453,0,5529,7616,7723,5717,8391,5301,8164,7482,8682,7542,7637,8033,7628,5519,5209,8577,7478,5325,8005,8604,5248,7839,8131,8687,8211,7710,5285,5285,5564,7628,7605,5209,5419,5296,7482,5496,8048,8164,8613,5248,8211,8316,7548,0,7605,8329,7811,7473,7768,5671,8245,5485,5426,7768,8340,5485,7696,8345,8087,7710,8504,5407,5377,5464,5255,5301,5309,8149,5320,9345,8245,7977,7648,5358,8115,8255,5296,7706,8903,0,8164,7643,7616,7632,7616,8329,5309,7962,7482,8349,8062,7576,5642,8762,7994,5573,8307,5564,8504,7482,7849,5358,8201,8267,8539,5647,5342,5342,7558,8033,7478,5432,5237,8845,5301,5564,7605,5305,5301,9345,5325,7888,5688,8302,5612,8033,8527,8170,5712,8249,5426,5485,7935,7528,7667,7834,8805,7757,8451,5509,7653,5337,8451,7977,7599,5337,8816,8670,5274,7843,5564,7864,5305,7752,5381,7823,7715,8795,8277,5401,5391,8494,10850,5401,8154,5337,7616,7616,10857,8104,8211,8211,7839,5509,5485,8539,5726,7582,5407,7967,7786,7986,5329,8170,7994,7667,8077,8653,7849,7734,5209,5524,8039,5564,8099,8227,5442,8022,7805,8427,8514,7774,7904,5301,5647,8073,7653,8222,8196,5676,5237,8196,8539,5381,7734,8903,5309,7999,7658,8845,5396,7786,8093,7893,5309,8345,7599,5413,7576,7834,8170,5407,7516,8772,5320,5606,8479,7982,7706,7849,8402,8272,8104,7930,8227,7811,7893,8277,7706,8249,5255,7994,7883,8302,7811,7834,5476,7681,7706,5509,8604,8716,10862,5480,8484,8964,7632,0,0,8249,0,10874,0,7616,7616,7616,7675,7730,5688,7990,7521,5509,7628,7628,5564,5401,8190,8467,7823,8115,8494,8104,7675,7628,7858,7790,8345,7864,7632,7616,8154,7795,5419,7746,7571,7571,8170,8222,8110,5237,5661,8345,5726,5407,5564,5329,5485,9054,8527,8062,8062,5730,7834,5647,7605,5209,7521,7914,5717,5381,5485,5651,5464,7914,7734,5671,7582,7576,7542,7994,8073,7994,8994,5325,7982,8205,7977,8676,5642,7667,8827,7768,7994,5274,8005,8805,7643,5237,5391,7706,5347,8548,5642,8467,5712,8267,5320,8539,5622,8721,9751,5529,7877,8509,8005,0,5419,7957,7994,5213,0,5448,7482,5391,8104,5391,8267,5655,7843,8293,8249,7849,5699,7940,8467,5301,8170,5237,8334,5573,7500,5647,7511,8494,5655,7542,8443,8312,8451,8467,5573,7628,7908,7533,7734,7734,8136,8851,5237,5501,8267,5241,5407,5325,8893,8777,8869,5651,8052,7962,5655,8391,5448,7500,7511,5237,7786,7843,8164,5534,5671,8451,5391,5629,7632,8613,5612,5274,7930,5642,7952,5358,8548,8234,8925,5519,8604,8370,5347,0,5325,5301,8179,7843,7628,0,7616,5305,7757,7681,7790,8316,7605,5352,8345,5401,8827,5237,5255,5688,5309,8104,5381,7994,8422,8340,7628,5476,5325,8239,5358,5329,7588,8201,8015,7632,5419,7800,7834,8093,5325,8647,8234,7653,8539,7588,5329,5617,8987,8539,7763,8329,7800,8073,8539,8451,5578,9367,8190,7994,7982,5708,5651,7957,8140,7548,7774,8312,5419,5651,8827,5453,5296,7667,7482,5407,7834,5320,7482,8005,8033,7982,8302,5568,7542,7538,8205,10880,8322,8307,5401,7516,5568,7663,5358,5301,7994,5325,8329,8119,8010,8249,7742,7877,7828,8329,5285,7872,7872,5666,7628,8255,5573,5396,5407,8349,8267,8222,5337,5726,5329,7648,5296,7864,8909,7893,5291,8397,8048,8613,5501,8005,8598,7872,8387,7500,5564,5291,8903,7478,8316,7487,7675,5237,7610,8267,0,7706,5407,8267,7962,8093,7628,5367,5218,5325,8062,7487,8789,5666,8190,8267,7628,5237,8052,8073,8052,7663,7994,5296,7994,5325,7839,7521,8375,7763,5476,8873,5419,8179,7914,8322,5401,7990,8467,8245,5377,5629,5661,5358,8427,7962,5401,8010,5693,5381,7786,5661,5320,5407,8898,8062,7730,7528,8329,5642,10888,5448,5320,8329,8217,8751,7994,8766,5442,8349,8613,8647,7658,7706,5372,8033,5655,7696,8447,7616,5524,8827,7675,7706,8048,5407,7500,8005,5381,8411,7757,5651,5347,5309,8777,7622,7723,7867,5274,10893,7742,5274,7588,5329,5476,7500,5661,5301,5476,7986,5666,7675,8539,7972,7930,8909,5642,5305,7811,8647,8010,5448,8772,8422,7723,8255,7994,7511,5296,0,5524,8267,0,5301,5320,5573,7663,7516,5372,8190,8033,8277,8154,5480,7478,7872,7872,7706,7946,5329,7588,8422,8211,8267,8751,7628,8329,5325,7592,5274,5305,10898,7588,7592,0,8077,8073,8261,5476,5274,7628,8170,5401,5401,7482,8322,7616,7610,8316,7994,8354,8093,5726,5642,8010,5651,5347,8005,5347,5325,8903,9516,5666,5666,5396,8527,7972,7994,8005,8427,8359,5301,5325,5651,5666,8359,7632,5325,8005,5329,5407,8589,0,5666,7768,7675,5476,8375,8514,5432,7982,7982,5329,9641,5329,7487,7675,7542,5573,7982,7500,8451,5564,7500,7500,5329,7982,7628,8052,5285,8170,8039,8222,7834,8427,8427,8005,8282,5237,5320,5248,5688,7757,5325,5688,7558,5391,0,8539,5578,5617,7628,8811,5209,8062,5296,8249,5717,5342,5367,7637,5391,5476,7538,7521,7565,7864,8994,7710,7542,7752,7752,7872,7898,5358,8354,8354,7667,7706,8297,7482,7706,5606,8467,5291,5296,8196,7706,7548,8387,7839,7715,7599,5501,5501,8560,7817,5372,5564,8297,5381,5564,7710,8307,8647,5274,8447,8594,5688,5337,7687,5255,7710,5337,7849,7653,8170,5301,5564,8297,7687,8131,7920,8073,5274,7605,7757,5432,5224,7786,8297,5726,5617,8964,8093,7786,7883,7786,7616,5301,7558,5726,8711,5717,7839,5296,5296,8211,5564,7924,8631,8577,7605,5476,5274,8144,5285,5301,5476,5255,5325,5201,5617,5476,7599,5305,7723,7867,7952,7817,7972,7800,10904,7972,7977,7648,7487,7706,5426,8577,5688,8670,5218,7977,8839,7935,8126,7864,7653,5320,8190,8527,7914,5655,5564,5274,5578,7478,5564,5301,7843,5358,5573,8467,5337,5381,7883,7834,8805,7828,8839,5296,7795,7972,8022,7893,8170,5651,7706,7706,7628,7667,7687,8249,8322,7487,5237,8099,5301,5459,7681,8272,8653,8811,7653,7628,7898,7893,7920,7994,5471,5476,8467,7588,7768,7542,7872,8447,8745,7994,7779,8039,5509,7582,7864,8282,8539,7599,8179,7924,7616,8039,7877,0,7986,7990,5325,7849,8805,8349,7500,7746,7628,5381,5391,8190,5464,7834,8411,8110,7994,5564,8467,5712,7994,5564,8821,5661,5337,5688,7790,5367,7616,5391,5248,5629,7605,8548,5377,5564,8467,5296,8249,7986,8762,7982,5688,5459,5301,7795,8267,8170,7823,7957,8658,8164,7616,5419,0,7843,8334,7487,5237,7839,5237,8467,5534,5401,5448,8282,8164,8164,5325,7478,5688,7653,8196,5476,5358,5396,5629,5476,8762,8716,7849,7982,5296,7538,8391,5476,7752,7616,8909,7628,8777,9423,10904,7800,0,8987,5578,8340,7710,8539,5708,5329,7994,7972,5629,8033,8647,5726,7920,7628,5407,7632,7957,8196,7548,7482,5419,8952,7752,5285,5509,7972,5578,7538,7538,8039,7511,7790,5237,8827,5301,7800,7675,10909,8015,8211,7521,5305,8397,7487,5688,8594,7972,5352,5352,5285,5726,5432,8239,7533,7952,5237,5325,5622,5464,7893,8149,5291,5291,5296,7482,7877,5285,5261,7648,7675,8711,5248,8329,7487,10919,7558,8903,5301,5661,5261,5476,5485,8245,7877,7706,7839,7521,5617,7632,8196,7616,7637,5301,8115,8190,5401,7605,8115,5661,8211,5661,7706,8164,5407,8249,8052,8821,8154,5314,5381,8888,7849,7763,8010,5666,5381,7986,5651,5301,8104,5301,5688,8077,5329,8762,7675,7605,7610,5301,7610,8527,7491,5413,8987,7786,5676,7616,0,5237,8179,5726,7768,8762,8179,7800,5291,5381,7605,7687,5661,5464,8816,8456,8293,7528,7548,5305,7696,7990,7763,5237,5426,7834,8795,8467,0,8093,8190,5320,5274,8316,7610,5381,5274,8387,7982,7994,8479,5248,7994,8479,9032,7946,5726,5476,5476,8201,8811,7628,8473,5496,5476,5261,8033,5564,8234,5501,8952,5381,8136,7548,7883,8915,7548,7548,5661,7706,5661,8297,7972,8504,8196,5309,7667,8467,5712,7637,5708,5453,5296,8297,7977,5480,8093,5491,8222,8174,5642,7571,5358,8670,8772,8170,7849,5320,5519,5655,5476,8994,8073,8539,8631,5564,8234,7972,7972,8297,7533,5476,7790,5480,8136,5568,5274,7877,5726,7930,8234,5237,8884,8073,9818,5564,5476,7710,7692,8504,5419,7977,8879,5305,5381,7696,7632,8613,7605,7952,7482,7774,8577,10923,10934,9345,8903,0,8653,8800,5453,5320,7977,8653,7558,5301,5676,7914,8057,5717,5476,7628,5655,7511,5688,8658,5325,5476,8201,9345,8839,8302,8658,5301,5401,5401,7692,5407,8998,7877,5358,8234,8272,8467,8093,7710,8227,5442,7888,8473,7779,8227,8456,8456,7893,8467,7632,8039,7834,8762,5237,7972,8170,7706,5325,7972,7795,8800,7935,5377,5377,5564,5248,5661,8411,5459,8653,8676,5519,5519,7849,8467,8222,8222,5564,7628,8641,7834,5296,7930,5573,5329,10940,10945,8267,8245,8131,8245,8359,8164,8467,8613,8716,7592,5612,8282,8068,7710,8940,5453,7616,5381,7542,8359,7692,5401,8222,5301,5578,5391,5329,5476,5459,5661,5274,7994,8473,8340,5325,5419,9367,8222,7521,10952,7734,5407,5622,5407,8397,5325,7883,8925,8010,8073,7521,7528,5432,7648,7800,5347,5708,7888,7952,8340,5342,8789,7877,5401,5358,5309,8903,5320,8772,5358,5347,7734,8613,7972,0,5320,8631,5391,8126,5661,8073,8033,8277,7610,5237,5274,5347,5578,5491,10961,8365,5391,5407,7533,5476,8297,8387,5237,5237,5642,8527,8772,0,8473,5564,7904,7849,5325,5325,5407,8721,8411,7834,7952,5291,7858,7790,5651,5651,7763,5391,7487,8427,7632,5291,5651,7681,5401,5642,7972,7667,5237,5261,7994,5237,5606,7628,5347,7864,8762,8196,8334,5325,8391,7616,8131,5726,8427,5309,8721,8919,5407,7632,5726,5407,7994,5291,5726,7632,5347,7914,8539,8721,5407,8721,7834,7952,5651,5391,8427,5347,5291,5325,5237,8539,5606,7628,8131,5309,5726,5285,8484,5309,8140,5291,7972,8783,5325,7786,7883,8397,8539,8987,5396,7768,5717,7710,5381,7952,7817,8062,5381,7643,5688,5426,7588,8447,5325,5329,7972,7687,5358,5426,7982,8987,7817,7972,5529,5573,5237,5476,5329,5291,5237,7834,5237,7834,7834,5693,5564,5688,5688,5285,8062,5325,8010,8329,7757,8062,5496,8272,7500,5381,5476,8504,8329,7482,5261,7706,5480,5325,8329,7482,7864,5501,8387,5642,8022,7914,7482,7528,5291,7675,8884,8033,5337,7972,7504,7565,7528,8783,5617,5274,8302,8068,7500,5476,5476,7588,7710,7849,7914,7849,7500,5655,7605,5241,8131,5209,5209,8427,7786,5564,7768,5459,8093,8539,7924,5301,5386,7533,7576,8811,5476,8170,5708,7687,5480,5476,5726,7999,5255,5358,7504,5726,7904,8245,8443,8272,7605,7839,5578,5218,7500,8329,5476,5464,7849,5391,5496,5285,5391,8727,5496,8131,7952,7768,5296,5381,5396,5671,7521,7994,7914,5442,8316,5651,8427,8391,7864,5296,7834,7504,7795,7696,5413,7681,7710,5666,7605,8582,7473,7478,7628,8909,5325,7972,8504,7588,7843,7864,8582,7864,5391,8805,7883,8073,7877,5337,7946,8255,8196,9045,8345,7628,7675,7558,5381,5274,7478,7478,5524,8022,7734,5296,5485,8851,5655,8851,8762,10969,8227,8839,5381,7990,5726,8827,7675,5342,7599,8190,7893,7710,7738,5476,8136,7482,7757,7920,8287,7877,8033,9032,5325,7706,8772,8863,7994,8170,8745,5407,5241,8115,7967,7542,5314,7779,5407,7605,8052,8099,7914,8473,8359,7858,7628,5459,7500,7858,5391,8190,5391,7643,5396,7864,7548,8539,5661,5564,7734,8805,5407,7706,7628,5209,8732,5237,5296,7482,8345,5274,7823,8033,8527,7605,7924,7834,7946,8190,5717,7495,7706,8711,7491,7994,0,8909,7967,5261,5407,8073,7692,5464,8154,5717,7616,5651,7675,5651,5237,8322,8033,9641,5377,7588,7898,7710,7542,5391,5419,8467,5661,5529,8272,5642,5642,0,7628,8473,8827,8745,5301,5305,5305,8987,5578,9476,5407,8115,5381,5401,7957,8179,7742,8721,5237,5314,5708,5708,5309,5578,5476,7982,5419,7800,8783,7653,5396,7877,7500,8833,7719,5237,5617,8217,5241,5386,5347,7864,7616,5291,5325,9021,5285,8073,5296,5622,7715,8982,7687,5391,8255,8772,8982,7734,8119,8190,5372,8772,8903,5342,7542,5325,5285,5485,5401,8417,5476,7663,8427,7920,5296,5396,5476,5476,5261,8261,8417,7542,8863,7738,7982,7576,8052,7491,7616,5407,7628,5407,5296,8762,5578,8190,8365,5666,7914,7994,7877,5301,5476,8411,5578,7834,7864,5442,7994,5442,5642,7877,8261,7482,5347,8033,8154,5578,7811,8365,5476,8903,8427,7834,8762,7834,5325,5693,5564,8504,5325,5381,8062,8272,8261,5261,7706,5480,8329,5476,8329,5325,8504,5419,5296,7742,8170,8387,8884,7500,7864,8099,7504,8022,8527,5617,7565,5291,5241,7786,7849,5255,8443,5391,7504,7687,7588,5655,8539,7967,7839,5726,7999,5358,5476,5476,8582,5666,5391,7795,5391,5381,5296,7558,7605,7914,5396,7883,8131,7768,7952,8329,5476,5241,5671,7521,5496,7643,7500,7576,5381,7478,7628,8255,7478,5524,5337,5296,8582,8851,8022,7663,8745,7605,7967,7495,8762,5314,7893,7990,7994,7628,8839,7914,7757,7877,7779,9032,5342,8772,7914,5476,8711,8033,5459,5464,5407,5661,9641,7491,7994,7864,7628,8190,7877,5209,8345,7834,8539,5651,7858,7500,5305,8903,7588,5661,5642,7898,5391,7542,5651,5309,7800,5578,5407,9476,8772,8982,8255,5347,7734,5291,7834,7542,8427,8033,7786,7542,8062,5367,5291,8062,7653,8062,5237,5237,8154,8239,7653,8762,7610,8307,5419,7706,5391,5301,8919,5509,5358,5320,5274,8527,7972,7972,7834,7834,5391,5573,5296,8068,5476,8068,5476,5407,7904,5730,7864,8140,7521,7811,5407,8800,5671,5726,5564,5237,8888,8052,7628,7605,7977,0,5237,8073,7752,7811,8888,8539,8548,5501,5476,7972,8222,7637,7653,7920,8136,7920,8131,8136,5337,7757,5305,7487,5519,7811,8653,7849,7849,5305,7653,7790,5301,8447,5358,7628,7977,8641,7790,7920,5237,7864,8170,5305,5573,8772,7811,5291,7930,5655,8467,5564,7774,7817,8594,5476,8560,5509,8751,8154,8010,8772,8721,8115,7972,7696,7605,5391,5358,5209,7696,7952,7858,8411,8349,5491,8119,8582,7893,8964,5476,7710,7790,7849,5358,5329,8504,5296,5671,7858,5209,7977,7500,9353,5285,5671,8205,5407,7616,8329,5655,5617,8888,8888,5688,5617,8732,8205,7576,8277,8365,7487,8033,8987,5606,8456,8845,5274,8349,5407,5342,5564,8772,8827,8827,7972,5325,8015,8762,5309,7504,8598,8267,8222,5437,8277,8527,8777,5325,8119,7663,5622,5564,8131,8159,8115,8239,7994,8126,8033,5622,7972,8863,8473,8267,8833,8772,8365,7834,10978,5261,5509,7616,5309,8811,5274,8205,5358,8762,5320,7834,9259,8190,7610,8811,8205,7930,5655,5564,8467,7817,7774,8115,5274,8126,8015,8154,7972,8010,8772,8751,8411,8131,7605,8721,7696,5407,5358,5391,8964,7952,8582,5491,7790,7893,7849,5476,9353,7972,7977,5296,5209,8504,5329,8205,5209,5671,5309,5688,5655,8277,5617,5564,8762,5325,5320,8987,7487,5358,7576,8845,8456,8772,8277,8527,8863,5564,5622,8159,8115,7834,8365,8267,8833,5261,7616,8811,7710,5237,5617,7823,7504,5237,7558,7849,7558,5578,5367,5629,7967,7967,5301,8484,5564,7999,8811,7706,5261,7723,8196,5274,7839,5291,8196,7710,7839,8033,8033,5459,8170,8783,8539,7719,8427,7605,8354,5726,5381,7710,5573,7795,5529,7839,7681,7888,8577,8811,5612,8140,5237,7999,7588,7482,8170,5407,5699,5629,8287,8402,5329,5726,8903,5688,5209,5377,5726,7710,5464,8255,8255,5642,5372,5377,10982,8365,8365,8443,8994,8222,7692,7990,5471,5291,5564,8033,5407,7565,7972,7730,8354,8994,7706,8354,8322,5480,7658,5476,8184,8093,5712,7904,5459,7692,5480,7977,7839,8174,5280,7605,8170,5459,7972,5564,7533,8170,5261,8073,8447,8170,5301,8682,5476,5325,5491,5274,5285,7888,7605,5622,7473,5635,7952,7723,8005,7521,7710,5329,5413,7972,7977,7681,7774,5407,7738,8255,5358,5274,7888,5325,8170,5325,5320,5647,5573,5485,8077,7675,8073,7710,8658,8711,5320,7843,5218,5285,5442,8255,0,7738,5407,7706,8494,7994,5314,5381,5325,8077,8170,8170,8099,5329,8873,8359,8170,7710,5509,7768,5377,8073,8443,7867,5325,8140,8548,7774,8548,5352,7972,5241,7828,7972,7628,7888,5471,8104,5218,7548,8539,5578,8033,8663,5407,7795,5629,8170,5564,8443,5459,7858,8110,7495,5377,5496,8422,5407,8479,8451,5237,7738,8322,8427,7828,5377,5325,8077,7800,7511,8427,5358,5248,5329,8239,8140,5629,5491,5612,5237,8005,5325,7972,8322,8539,7800,8548,5401,5413,5372,8184,5432,8422,8170,8919,8554,5274,8010,5573,7548,5471,8073,8140,8443,5291,5291,7516,7738,8255,8255,7734,8239,5471,8498,8582,5372,7738,5358,5358,7605,8170,5573,8255,5471,5442,5325,7478,8354,8184,7516,8577,7972,5301,7972,7877,5573,8676,7994,7610,7516,5274,7994,8857,5347,5661,8261,5661,8077,7738,5726,5381,8498,8857,5237,8005,5291,7516,7914,7817,7883,10986,5726,5377,7888,7888,7817,7843,10994,7632,7663,5325,8170,5629,11001,11009,7834,11013,8756,5726,7957,8149,5480,7972,11023,5377,8479,11023,7628,7935,8387,7952,7667,7994,8354,7528,8539,8190,8010,8504,5261,8322,5320,8068,8033,5491,7864,8136,7706,7790,8821,8504,8010,5622,8062,7982,5726,5464,8539,8093,5491,5708,5655,8010,8582,8608,5352,7930,7786,7692,8174,7605,8164,7864,7904,7576,7972,5642,7990,5476,8745,5391,5255,7696,7723,8170,5285,8687,5329,8509,7768,7576,5437,7972,5617,7779,7628,8670,5337,7811,8267,5578,5509,5564,8745,7576,8447,8093,5578,8427,7779,5209,5296,7599,8287,8039,8795,5476,5352,7542,8234,8184,7858,8721,7930,8099,5213,7779,8821,8110,5325,7924,5274,8732,8694,8658,5717,5337,8062,5320,5564,5209,5564,7752,8543,8427,7628,7752,8272,7786,5655,5367,8467,5329,8484,8783,5622,7994,7643,10830,7935,5285,8427,7734,8149,5501,8010,7516,5717,7719,8795,7811,5476,5325,8217,7696,7628,5274,8062,5666,8456,5301,5301,5329,7516,7935,8387,7952,8190,8539,8504,5622,7864,8099,8821,8062,7692,7990,5329,7576,7972,5476,7982,5655,5301,5642,8745,5391,5437,7972,5285,7576,7768,5329,5285,5578,5564,7779,8184,7930,5296,8234,7599,7779,8287,5209,8694,5564,5325,7752,5320,8456,8467,5367,8427,5329,7935,7516,7528,7786,7839,7839,7920,8397,8411,7986,7986,7839,5529,8282,8411,8411,8411,0,8411,8282,7839,8411,8411,8033,8613,8789,8789,5655,8287,8287,11031,8705,8411,8411,11039,11044,8239,8245,7877,8811,7542,7628,7628,7706,8329,5476,8039,8349,7706,8925,7599,7977,9032,7616,5377,8267,5309,8560,8387,8010,7478,8245,7864,7811,5578,11048,5309,8467,7994,5401,7710,7935,8447,7681,7972,5476,7592,7977,8033,5491,7696,8539,8312,7599,5459,8115,8272,5320,5480,11056,5485,5296,8316,5337,5651,5413,5325,8716,5476,5381,8863,8577,8329,8422,8022,7795,8272,8334,5730,8447,5471,7592,8190,8329,8201,5337,7675,5688,7853,7605,5688,8539,8539,5647,5485,5377,8307,5476,5578,8316,8687,7478,5391,7558,7588,5372,8658,8527,5401,5612,5296,5301,11061,8277,8543,8451,5291,5413,7811,5491,5329,5337,7576,5309,7628,8287,8005,7994,5377,5476,8245,8467,7632,5358,7495,7628,8903,5342,5471,5342,7834,8732,7710,5377,7628,5391,5655,5337,8267,7864,8411,8039,7864,5367,5464,5688,8479,8245,7994,11067,5476,8131,5642,5573,7511,8329,7738,8539,7710,8467,7588,7738,7542,0,5642,8721,8015,5708,5391,8604,7710,7588,5372,5578,5471,8539,7957,7710,8451,7516,9021,7648,7542,8190,7628,5476,7478,8239,8170,5391,5358,5642,8349,5661,5342,7811,8427,8909,7696,7622,8411,8411,7986,5301,8467,5642,7632,5301,5476,8805,8919,7706,5218,5261,7653,7628,8211,8613,7723,0,8582,5564,8756,8888,7565,5426,8136,7528,7914,7898,8467,8879,8154,5661,7898,7478,8170,5337,7653,7658,5688,5358,8456,5224,8670,7930,8631,8539,7967,7491,7516,8582,7952,7605,5391,7692,7628,5671,5717,5237,7972,5325,8329,5730,5426,5285,5237,7952,7495,7843,7977,7908,5241,11075,8267,7834,7558,8307,7710,5329,5564,7478,5564,5524,8052,7843,7977,8845,7667,7616,8073,5237,7930,5301,8267,8201,7675,7706,7920,8745,8039,7576,8772,7967,5255,8277,8447,8033,5337,8201,7521,7883,8170,5218,8255,5476,8762,7834,5712,8893,7930,7864,7628,5676,7628,8267,5730,8005,7521,7521,5448,5629,8391,5237,8613,5573,5209,7967,8170,7478,7521,8267,8052,5218,5358,5305,8783,5564,8239,7482,5622,7982,8255,7834,8015,8010,8255,7500,8919,5358,7528,5358,8554,7994,5241,7790,5261,7516,8312,7883,8249,7491,8340,7908,8527,8249,7967,8582,5401,8365,7877,5337,7706,7834,7877,8365,8093,7811,5237,8527,8365,5301,5337,5693,5688,5314,8456,7576,5476,8560,7628,8484,7834,8397,7790,7883,7500,7853,5655,5501,11082,0,8267,7658,5606,5280,5480,7571,7653,7786,7588,8312,5442,5437,8391,7632,8287,5442,5337,8316,7972,5274,5419,7558,7482,5647,7675,5712,7692,7940,5666,7734,8397,8370,7834,5237,8929,7994,5329,5347,7834,8272,8456,8427,8104,8772,8397,8287,8140,8653,5377,7746,8762,7982,7500,5426,8772,8484,8104,8267,8312,7990,5448,5651,7768,5442,8451,8267,5218,8608,7687,8370,5629,5419,8647,5261,7628,5301,5372,8149,5476,5419,7734,5285,5237,8772,8312,8789,5476,5301,8170,5285,5476,8929,8613,8329,5442,7834,8093,5651,5651,8929,7528,5285,5237,5651,7834,8411,7774,5391,5337,5391,5391,5301,7548,7491,7779,5301,5309,5309,5688,5476,7757,8479,7999,5693,8312,5688,7849,5564,5655,7972,7904,8375,5564,8716,7757,5261,8255,5568,8732,5209,8010,7628,5396,7653,7817,7706,8211,8915,8539,7487,5237,5476,7637,5391,5647,5237,8293,7542,11094,5407,7920,7491,7482,7904,7565,8033,5426,7853,8354,7834,5564,7920,8136,7528,7864,5291,5471,8131,7482,7542,8282,5325,8504,8783,8816,5501,8267,5325,8196,7920,8039,8062,7482,7667,5391,5476,7548,8077,5671,8915,8154,7658,8756,11104,11112,11119,0,7888,5209,8447,5647,5391,8438,7786,7864,8093,5224,5476,7786,7904,7920,7628,7487,7571,8201,5337,7828,7977,5655,5391,5391,8964,8170,8427,5391,5617,8190,7999,8222,7849,5358,8119,5573,5391,8073,7605,7710,8925,8312,8316,7542,5564,8533,7511,7542,5564,5301,8354,7920,7924,8282,8073,5381,8131,5320,5241,7715,8447,8077,8539,7977,7715,7883,7914,5476,7487,8582,9012,7930,5407,8316,5426,8062,5285,7710,7696,5717,5224,5391,8711,7977,7482,7667,7576,5248,8987,8316,5305,5666,5325,7628,7500,8504,9021,7972,7723,5261,7710,5274,5426,7768,7920,8964,7605,5730,8391,7473,5642,5274,5274,5519,7667,5496,8149,5325,7920,8613,5651,5476,7482,8687,8345,9562,5337,7719,8898,7542,8375,11126,7663,7757,7653,7872,5391,8946,5688,7675,5578,5519,8205,5377,8451,7795,7817,7548,8307,5329,5712,7843,5509,7528,8267,7930,7478,7588,7628,7877,8805,8073,7653,7977,8062,8498,8527,7877,5509,7972,7487,8190,7478,7478,7681,7817,5314,9471,5426,7542,7914,7653,9471,5661,5573,5241,8170,5274,8964,8211,7734,5301,7533,7872,7558,5524,5301,8594,11135,7605,11142,5647,7511,8397,8170,8227,8467,5407,8461,7757,8272,8227,8099,7473,8093,7930,5329,5301,8322,8057,5676,8438,8397,5352,8345,7920,5274,8387,8863,5666,9051,8571,7738,8653,8762,7994,7805,5209,5241,8543,8077,8827,8658,8772,5693,7706,7542,5314,7706,7628,5309,8721,7790,8227,5606,5237,5401,8272,7786,8451,5320,5655,5329,8249,5329,5396,8473,5205,8277,8800,11147,8201,8716,5509,8365,0,8407,5274,0,8154,7779,5933,8514,8509,7616,8539,5401,8039,5274,8762,5647,7994,8827,5564,8110,5325,7864,8110,8033,5377,7687,8062,7924,8676,5367,7628,8946,5426,5464,7994,5564,7999,5496,7867,5617,8062,8005,5606,8711,8255,8255,5730,7853,8827,7811,7491,8438,5407,8676,5407,8022,8005,7982,8190,7888,5381,5655,8411,7548,5209,5519,7491,5712,5213,7663,5381,0,5712,8287,7738,7898,5367,5401,5612,5237,7511,8443,7491,8417,5534,8164,5629,5612,8322,5717,8851,7805,8073,7533,7730,5358,8940,8461,5209,7478,7616,5464,7681,7511,8509,7962,8302,5448,5509,8052,5655,5655,7632,5476,8467,5629,8077,5237,7977,5717,7538,5676,11126,11104,5612,0,0,0,8136,5329,5612,7742,8443,8641,5519,8721,8190,5401,8087,5708,7800,5305,7632,5358,7994,7511,8539,8255,8827,5476,5329,5708,8946,8322,8402,7706,8227,5629,7800,5218,7877,8527,5485,8473,5320,7957,5519,8827,7610,8365,5407,8340,5301,5367,5237,8756,0,5413,0,0,5241,5329,5396,5325,7734,5296,8322,8312,7516,5612,5519,8589,7558,8005,7487,7511,5386,7946,8959,5342,8010,8255,7768,7924,5629,7521,5291,5285,9021,8239,5381,8149,8217,8772,8365,5325,5407,7548,8919,8387,7616,8217,5291,8417,5377,7734,8964,0,0,5693,5261,8509,5407,7893,5342,5329,5676,5296,7628,5401,5314,8255,7542,5314,5666,5358,8964,7811,7491,7888,8039,8903,8170,5501,8245,7930,5476,7663,8548,8329,7757,7605,7946,8863,5325,8077,7738,8154,8745,8888,7616,8005,8381,7500,5407,5407,11155,5496,7972,7763,5301,5666,5325,8857,8582,8987,5352,7986,8762,8851,8287,5329,8473,8222,5329,0,0,7610,7864,5329,7528,5407,5347,8073,5407,5642,7877,7521,5407,5237,8721,8777,8077,5666,8498,5726,7533,7632,8857,8375,5372,8077,5291,5629,5320,5347,5309,5688,5476,5655,5693,7999,8312,7757,5647,7542,8732,5261,5325,8010,7757,8514,8293,5237,7637,5426,5671,8201,7658,8170,5471,8783,7548,8136,7930,8461,8282,7542,5642,8196,7667,7478,8131,8756,7565,8154,7853,8816,7904,7628,7542,5241,7542,7786,8073,7864,8312,8201,7904,8354,8857,7715,7883,7977,7828,5337,8964,8073,8093,8851,7542,7511,8222,5391,8190,5617,5358,8447,7920,7888,5426,8898,8149,7696,8211,8387,5337,7558,7977,7491,5386,7972,8903,8316,5329,7757,7482,8509,7687,7605,5274,8805,9003,5274,5396,7768,8302,7977,5642,5717,8391,5241,7719,5285,5476,7877,5248,5629,8345,7482,8613,7605,8149,7734,7478,8277,8594,5401,8946,7675,5612,5301,5241,5573,8039,5524,8964,5519,8451,9471,8527,7528,7511,8509,5407,7872,5377,7843,7542,8170,9051,8322,7888,5606,8451,7790,8543,7706,8407,7473,8653,8227,5237,7786,7632,7805,8863,5309,7972,5274,5676,8154,8057,8772,5693,5407,8170,8249,5209,7867,7616,8509,8322,8022,7864,5496,8255,7548,8676,5448,5464,7811,7663,8762,5712,7957,5209,7893,5712,5305,5655,8073,5717,8077,5629,5676,8077,8136,7511,8052,7898,5476,7977,8888,8164,8473,5629,7800,7632,5413,5218,5485,8539,8443,8190,7511,8772,5291,8239,7734,5329,8217,5347,7734,8498,8322,8919,8154,5666,7811,5314,5401,5476,5496,8473,7986,7877,7521,8227,8227,8484,5708,5459,5726,8239,5651,8227,8514,7538,8969,5261,8154,8514,7834,5358,7653,5358,8589,8509,8756,5413,8062,8489,8589,5274,5274,5407,8438,5367,11161,8307,7687,5386,5407,5352,5367,8093,8411,5358,8489,7849,8721,5717,5717,8048,5573,8062,7952,8438,7719,8653,7843,5329,8805,8302,8170,8354,8354,7877,5726,7516,8227,8635,8653,7834,8438,7834,7864,7643,7628,7752,7521,8222,7521,5726,5642,7752,8282,8345,7994,7482,8144,5699,5347,8762,0,11167,5606,8077,7738,8509,7849,5699,8519,8721,8307,7706,8005,5629,8721,8647,8795,5237,5296,7877,7920,8903,7811,7738,7752,0,8514,8969,5261,7834,7653,5358,7752,8519,8489,7994,5274,8062,5407,8438,8756,8514,7687,5386,7952,7752,7738,8438,5329,8509,8048,5717,7849,8653,8484,8354,7843,8762,7628,7834,8227,5237,7752,7643,7834,7864,7877,5347,5726,5296,8144,5699,5717,5606,7738,5699,8795,7811,5564,5564,5333,8217,7528,7542,7478,5476,5480,7482,7924,8307,7864,8119,8282,8456,8946,8267,8821,7972,7920,5485,7565,7924,7482,5655,5381,7558,7864,5726,8539,8443,7571,7828,8093,9051,5480,5480,8312,5224,5564,5325,5329,7610,8033,5426,7888,7957,5305,5419,5320,7888,5274,7696,7952,7628,5671,5261,8329,8255,5426,8104,5564,5358,5367,5261,8119,7972,7734,8307,8467,5655,5573,5274,7853,8077,8267,5274,8456,8456,7967,5476,8217,8099,7482,8170,7805,8033,7920,8093,8272,5274,5329,8119,5274,7482,7605,7924,8705,5261,5248,7834,7482,7628,5377,7628,7610,7994,7994,8077,8217,5342,8345,5464,5381,5342,7482,5671,7834,5296,5717,8267,7478,7994,7663,5237,5629,5325,8015,8479,5708,5237,7482,11175,7648,7516,8422,8919,7920,5342,5342,7628,5274,5501,8447,7696,5325,8479,5237,7482,7864,5296,7610,5237,5301,5301,5301,8863,7849,7972,9032,7667,7823,5476,5699,7834,7542,8387,7504,8387,5325,7786,7811,7972,8131,7667,7839,5218,8170,5573,7982,8925,7632,7628,5442,7757,5342,7653,8154,8617,8721,5573,8925,5218,5325,5237,5442,7511,5301,7823,5529,8925,5325,5325,7628,7628,5529,8136,8998,7719,7715,7752,5501,8334,8267,5301,5301,8608,8093,5666,8345,8222,8249,7828,8903,5426,7478,7999,7500,5325,7715,8033,7675,7687,8805,5655,8456,5712,8093,7706,5442,8154,8302,7893,5534,8427,7482,8447,5442,8068,7516,0,7582,7616,7478,8093,8617,8093,5367,8062,7482,5305,8349,8267,7511,8249,8888,7478,7994,8154,7482,5237,5476,7663,7883,8919,5274,7628,5329,7610,5491,5325,8334,7924,7904,7920,7994,0,5237,5325,8349,8249,8249,5666,5301,8154,7663,7893,5491,7610,8093,7663,8527,5301,8222,0,7849,7849,5224,8745,8745,5485,5606,5655,5485,7558,8745,5485,5485,7828,5485,5606,7893,7893,8898,5651,7746,7746,8174,7491,5606,5296,7491,5717,5693,5496,5407,8504,8539,8762,7478,8504,8196,5309,5529,8816,7904,7482,7730,8136,5305,8443,8245,8282,5476,5642,8272,5480,7977,8062,8174,7924,11180,7482,7977,8272,5325,5661,8345,8345,8727,7817,11186,8245,8255,8805,5509,7616,5342,7681,8255,8190,8571,5413,7738,8015,5224,8144,8170,7986,5661,8110,7898,5476,5688,5688,7849,7675,7715,8170,5407,8411,8539,5407,11194,8272,8131,7738,7930,5661,7533,5717,5358,8144,5629,7957,7952,8255,5529,5325,5407,5419,7877,8245,8154,5274,7542,8762,8631,5407,5347,7994,8504,5564,5712,5676,5717,7994,8255,7653,8227,0,8110,8329,5617,7994,5717,7930,8272,8131,8267,0,5358,7994,5296,8762,8631,8762,7994,8504,5564,7653,7994,8267,8272,8484,8484,5274,5661,5274,5325,7482,8925,8267,8670,5333,5352,7946,7616,8267,5352,7482,7482,7521,7982,7491,5693,8745,7533,7521,8598,7653,7500,5476,7500,7786,8022,8005,7706,8560,7628,5509,8282,5471,8539,7883,7533,8312,8093,8604,5485,5666,7849,8255,7864,7864,7994,5381,7795,7914,5476,7914,8370,8217,7858,5255,5666,5564,7977,7853,5296,8005,7977,5333,5606,7558,7616,7667,7982,7653,5485,8422,8422,8751,8277,8422,5209,5209,7805,5693,8277,7834,7653,5407,7990,8402,7592,8196,5476,8159,5377,7864,7864,7834,7643,8795,5218,5622,7834,5274,7528,5476,8467,8940,7828,7828,5419,7692,5666,8239,8647,5476,7800,7706,7648,8052,8255,7786,8329,7542,5296,8427,8613,8062,8888,5274,8751,5329,5347,8077,7768,7491,5693,8745,7653,7521,8598,7500,7500,5509,7786,5471,7706,8282,8022,8560,7628,5329,8093,8312,5485,5381,7977,5606,7653,7616,7592,8370,5476,8751,5296,8422,7653,7616,7616,7990,5377,5218,7864,5622,7834,7864,8077,7800,7828,8940,8052,5666,8427,8613,8751,7768,8527,8473,11198,5564,5367,8427,8473,7730,7904,7658,8577,7795,8190,8670,8170,5358,7487,7994,7924,5642,5448,8509,5514,8010,7511,5237,8239,8647,8647,7511,8473,8473,8473,8239,0,7719,8527,8473,8527,7924,8427,8473,7730,8170,7487,5448,5642,7511,8647,8473,8473,7893,8010,7893,7893,5391,5391,8179,5325,5693,7487,5480,8427,7962,7521,8068,8504,7628,5676,7710,7482,8010,8010,7962,7482,7605,5476,8533,5358,5381,8272,7511,7839,8964,7487,8222,5391,7888,8370,8504,5606,5285,7977,5224,5642,8316,7839,7521,7924,7924,7696,7834,5333,5476,8179,8073,8028,7864,8201,7667,8307,7588,7628,5391,5642,7643,8039,5391,5407,8863,5224,5274,8201,7491,8772,7893,8015,7994,8721,7864,8699,7643,7982,5464,8964,5296,5407,5730,7849,5426,5501,7994,7786,5496,8022,5629,8073,5524,5237,8005,7511,5448,8272,7491,8267,5305,5629,7800,5358,7628,5519,5309,8589,8005,5622,5261,7710,7883,5476,5325,7648,7558,5218,8272,5296,7521,8427,5501,8370,8249,7834,5305,7877,7521,7632,8857,7700,5391,5693,5325,5480,5426,8068,5237,8504,7628,7710,8010,7482,5407,5391,8222,7487,7888,5476,7696,7648,7521,7977,5333,5285,5476,5224,8073,8307,7864,7628,8028,7667,8039,7643,5274,8721,5496,8005,7786,5448,7877,7491,5305,8073,7511,5519,5309,7800,8589,5622,7700,8087,8005,8039,7521,5501,7904,8447,5358,8073,5647,7653,7893,5407,8345,7663,5564,5274,7752,7528,5501,8888,5426,7538,7628,8527,7653,8539,5480,5480,7710,8329,7605,7972,8456,7528,8915,7730,7482,7752,7972,7883,5329,5337,8073,8222,7908,5480,5476,5726,0,5726,7592,8073,7999,8467,5352,7576,8170,7605,8293,8170,7920,8205,7977,8093,5655,7658,5564,7924,5391,5358,5480,5480,7487,7511,7538,7858,8272,7972,8164,8909,7582,8329,7768,7914,7592,7696,8370,8073,7605,7482,7632,11206,7883,5661,7511,8170,8022,8196,8211,7779,7653,5647,8190,8422,7667,7864,7558,7528,7663,5329,8863,7576,5617,7858,8653,8272,8277,8548,7990,7706,7706,7834,7893,5514,7834,5381,5642,7478,7858,8827,7858,7542,7893,5464,5407,8154,7628,5377,7768,5367,8548,8005,8110,7487,7795,5480,8005,5448,7542,7558,7972,7511,8334,8909,5237,8340,8762,7834,8467,7967,5514,5261,5301,7972,8617,5329,5237,7632,8015,5305,5708,8179,8647,8827,5726,5358,7972,7628,7500,5396,8073,7588,7675,7516,7877,5471,7511,5480,8833,8772,5285,8964,7834,7632,8427,5485,5476,7491,5480,8888,7967,7834,5352,5329,8909,7521,5325,8617,8170,5237,7811,5301,8473,7538,7628,5480,8329,7710,5726,8915,8073,5329,8205,5391,7487,5564,8170,7967,7605,5480,8293,7977,5476,7658,7675,7538,7482,5285,5396,7632,8370,7858,8473,5301,7558,7834,7528,8196,7667,7706,7706,7990,8863,8548,7588,8179,7858,7972,8005,5514,7478,5708,7511,7542,5261,8647,7632,8827,7877,7967,5325,8617,7521,7786,7994,7994,7994,7628,8811,5476,8608,7853,5661,8222,5358,7710,5377,8539,7692,8370,8255,8131,7473,5717,8422,8845,7858,5358,7990,9012,7628,5342,7957,8073,7675,8334,8073,7839,8739,8888,5305,8239,7957,5386,8762,8205,5342,5377,8888,8739,5329,5524,5524,8255,8898,8255,8149,5372,8473,8653,8653,5377,7565,5519,8297,7790,7883,8653,8888,8048,7681,5352,5209,8048,8297,5377,8174,7920,7790,5564,7696,8164,5726,7817,5519,7795,5325,5352,9361,8670,8302,5377,5301,8888,8548,5377,5352,8022,5241,7768,8548,8598,5407,7888,7982,7986,8484,7706,5401,5655,8888,5352,5305,8589,7800,7800,9026,7500,8577,7542,7542,8789,7811,7908,8381,8888,8577,8261,8307,8307,5386,8062,5237,8307,7653,8307,8307,8484,8227,7628,7628,5301,5676,5564,7542,7952,8548,7511,7952,8987,7628,7952,5712,5325,7706,5381,8005,7643,7904,8312,5712,7500,7834,7675,7779,7628,8422,7706,7599,7779,7994,5407,7710,8647,5358,5305,5325,7500,5442,7834,8427,7628,8479,8504,5325,11212,7817,5480,7757,5325,7500,7864,7864,8302,8560,8068,5305,5381,7914,8010,8467,5358,5329,7752,7982,5329,8925,7565,5501,8136,5337,11217,11225,7849,5367,5726,7653,7920,8093,5480,8073,5688,5255,5564,5358,5325,7994,8170,7757,8073,5337,8234,7920,8184,5426,7658,8222,5564,7687,8170,7786,11231,8316,11239,7738,5381,5320,5730,7521,7696,8345,7994,7681,7605,7482,8577,7632,8316,5476,7706,5224,7994,5285,8201,7952,5274,5717,5296,11243,11249,8898,11255,7888,7667,5377,7800,7675,8925,8302,8196,7628,8028,5578,8234,8845,7588,7478,5688,8805,5564,5509,5337,5301,8302,8302,5524,8249,11261,11267,11274,11285,5218,8447,5209,7706,8745,7521,8028,8104,5325,7757,7867,7786,7576,7582,8277,7893,8447,5476,8653,5329,8484,8227,5485,8099,8093,7967,5301,8249,8548,7972,8184,11295,11303,11310,5391,7914,7643,5391,5730,5426,7605,7986,8548,5325,8411,8411,7811,7768,8115,7994,7994,7628,8658,8110,5459,5464,5401,7834,5688,5688,5407,5358,7864,7924,5564,8159,5407,5367,5480,7982,11319,8893,11328,7752,5407,8052,7478,7565,5514,7511,7538,5391,5391,7482,11336,8909,7738,5642,5717,8164,7542,7706,7752,8893,11339,5401,5708,5333,5296,8438,5325,7681,5726,5407,5514,7800,5237,5688,8473,5325,5325,7605,5419,5688,5622,5218,8015,8756,5529,5432,5291,5726,7521,8073,5285,8329,7588,5464,9021,5261,5261,8010,5291,7516,8329,7622,5237,11349,11354,5501,8721,5730,7908,9353,5514,8427,8811,7952,8119,5301,8227,11339,11360,11368,8613,5325,7500,8154,11360,5301,8577,5301,7763,5655,7521,7864,5329,8721,5301,5274,7628,8479,5325,5337,8068,5329,7565,7904,7849,8073,5255,8184,5329,5337,7687,5564,8073,8222,5730,7920,7658,7952,5381,8898,7994,7696,8316,8115,5730,7908,5325,5285,5274,8925,7521,8329,8845,5301,5401,5407,5301,5391,7681,8234,8302,5509,7667,5325,5218,8745,8093,7706,7967,7893,8653,8227,7786,8447,8184,7757,5485,7914,5391,5209,5501,5459,5358,8227,5391,7752,7994,8159,7864,5688,5564,5464,7768,5419,8411,5514,5708,7706,7738,7482,5642,7565,5407,5333,8473,5529,5432,7800,8438,5218,7994,5237,5291,5261,7516,9021,8154,8811,5301,8427,8721,5453,5476,5564,5301,8484,8201,7834,5564,7757,5325,8527,11375,8811,5391,8527,8391,8222,8467,7972,7982,8196,5564,5501,7752,5407,5391,7628,8998,11380,5291,5291,7920,7811,5655,8222,7834,8387,5241,7565,8527,7752,7742,8594,7977,8293,8093,7763,5564,5480,7752,5301,8411,7972,5717,8467,5209,5726,7675,7972,7883,8170,5337,7786,7548,7628,7924,8164,8387,8964,7628,11386,7616,8863,7478,7696,7795,7663,7972,7834,7946,5285,5325,8577,7605,8504,5476,8062,7632,8613,8711,5717,8504,5285,5519,7576,7972,7632,11393,11402,9457,8375,7977,5325,7628,7811,5480,8201,7478,5676,7628,8073,8329,8329,5358,5237,7667,8170,5647,5485,5377,7864,7864,8582,7982,7478,7914,8277,11408,11417,5329,5255,5320,5564,8345,7999,5352,8196,7542,7930,7757,5329,5699,5407,8170,5647,8387,8467,7706,5301,7491,8863,8571,8863,8653,8119,7706,5485,5476,5476,5485,5209,8277,7582,7706,8104,8845,8170,5726,11425,11432,5325,5320,0,7710,7622,8110,8345,5688,5377,7982,5377,7864,5381,7790,5564,8104,5647,7834,7849,8467,7858,8267,5712,7982,7616,5471,7715,8170,11445,8777,7565,7786,7616,8467,8190,5534,5391,7849,5573,5629,5367,8893,7511,5325,7786,5407,9032,7653,5209,5209,8447,5642,7834,5325,5301,5606,5568,5377,5377,8447,5647,7538,5285,5524,5606,8033,5301,5622,5578,5708,5642,5476,7742,7710,7972,8239,8164,7957,5358,8617,5314,7628,7478,5291,7482,7768,7487,5285,5476,5396,5358,7616,7588,5464,8010,5285,8239,7834,8898,8484,5274,5274,5647,8349,9021,7628,7616,5329,8641,5274,5529,5476,7920,5320,7632,7706,5476,5325,5578,7628,8427,7491,7924,7920,8381,8154,5651,7616,8249,8539,8354,7628,5666,8222,5329,7849,7610,8617,8354,7616,8721,5726,5301,8375,5453,8484,5325,8467,8391,5391,7742,8387,8777,8222,5655,7786,7582,5329,8387,7675,7924,8093,7972,5726,8467,5529,5480,7487,7972,7696,7795,5519,7946,7576,5717,8375,8062,7478,8073,5301,5676,7982,7864,7628,5274,5377,7478,5699,7622,8345,8653,7930,5352,7542,8104,8845,8467,7588,7982,7849,7864,7786,5688,5209,5712,7715,8447,5642,5534,7511,5325,8447,5407,7849,5476,7616,5578,8239,8239,5285,8484,7628,5329,8190,8427,7616,8154,8249,8721,8617,5329,5309,8093,5407,5274,8451,5407,5407,7834,8451,5329,5337,8140,5325,8473,8140,8473,7605,7667,7605,5407,5651,5651,7478,7511,8033,7667,7516,8447,7706,5329,8484,7667,5485,5301,7521,7834,7977,5651,5301,5617,8015,7516,5485,5325,8093,7834,8140,8349,8349,5717,8783,5564,7746,7746,5564,8174,5726,5726,8711,5564,5274,8277,5726,7746,0,8527,5564,5726,7746,7538,5305,5305,5296,7538,7967,5362,5501,5464,5464,5309,8687,5606,7853,7946,5237,8582,7946,5320,5301,8184,7710,9372,9372,5476,7542,7883,5237,8641,5305,5305,7542,5491,5573,5337,7828,5476,5367,7834,5726,5712,7834,5485,7628,5301,8903,8762,8179,7482,8345,7834,8772,8345,5655,5491,8179,5476,5712,7883,7834,8762,5329,7972,5501,5564,5564,8438,8438,8467,8140,5726,8783,8631,7605,7972,8211,5708,5432,5480,5358,8467,8783,5480,5693,5651,8716,5693,5209,7786,7786,7582,5501,8272,8467,7920,8227,5524,7706,8467,5629,8909,5320,5320,5501,7893,7752,7904,7757,5480,8316,5726,8119,5391,5337,5391,8805,7478,8184,5485,7643,8170,7834,5647,5377,5237,5274,7834,5666,5358,5642,5688,7653,7478,7478,5730,5237,5717,7687,5519,5534,7687,8789,7700,7706,8533,5325,5209,5325,5325,7706,5325,7710,8033,8033,7849,8387,8800,5661,8174,8451,5391,5209,7710,8184,8170,7681,8093,8093,5573,7768,5661,8800,8077,8484,5642,8287,8653,7628,5573,5476,8447,8451,7967,5726,5362,5274,7742,7864,8494,5476,8287,7967,7828,5573,5309,8387,7710,8033,7849,8800,8170,8093,8174,7681,5209,8800,7628,8287,5726,8494,7610,8334,7817,8334,7834,7610,7610,7817,8795,7738,8093,7738,7610,7817,8795,7952,5688,5432,7952,8354,7805,7849,5291,5661,7628,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4269,11454,0,0,11459,0,0,0,11464,0,0,0,0,0,0,0,11469,11474,0,11479,0,11484,0,11490,0,0,0,0,11495,11500,0,0,0,0,0,0,11506,0,0,0,0,0,0,0,0,0,0,0,11512,0,0,0,0,0,0,0,11519,0,0,0,0,0,0,0,0,0,0,0,11525,5599,40,11528,11531,11535,335,11539,4899,11543,24,11546,11549,11553,11556,380,11560,52,11563,11566,32,3103,11569,11573,2795,11577,11581,11586,11591,11595,11600,11604,800,11608,11612,11617,11621,11626,11630,2809,11634,11638,2806,11642,11646,11650,2792,9676,11654,11659,11663,11667,11671,11674,11678,11683,11687,11691,3457,11695,11699,11704,11708,11713,11717,803,9686,11721,11726,11730,11735,11739,3471,11743,11747,11751,3454,11755,9690,11759,11763,11767,11771,11774,11778,11783,11787,11792,11797,11801,11806,11812,11818,11823,11829,11834,1073,11839,11844,11850,11855,11861,11866,11871,11875,11880,11885,11889,11894,11899,11904,11908,11913,11919,11924,11929,11934,11938,11943,11948,11953,11957,11962,11968,11973,11979,11984,11989,9710,11993,11998,12003,12007,12012,12017,12022,12026,12031,12037,12042,9721,12047,12051,12056,12062,12067,12072,12077,12081,12086,12092,12097,12103,12108,12113,12117,12122,12128,12133,12139,12144,12149,12153,12158,12163,12168,12172,12177,12183,9740,12188,12192,9745,12197,12202,12206,2599,12210,12214,12219,12223,12228,12232,845,12236,12240,12245,12250,12254,12259,12263,2613,12267,12271,2610,12275,12279,2596,12283,12287,12292,12296,12300,12304,12307,12311,12315,1733,12319,12323,12327,833,12331,12335,2759,12339,12343,12347,2738,12351,12355,12360,12364,12368,12372,12375,12379,12383,2819,12387,12391,12396,12401,12405,12410,12414,985,12418,12422,12426,2833,12430,12434,12438,12442,12446,2816,12450,12454,12459,12463,12467,10579,12471,12475,12480,12484,12488,3120,12492,12496,12501,12505,12510,12514,816,12518,12522,12527,618,12531,3194,12535,12539,432,12543,12547,12551,3183,12555,12559,12564,12568,12572,324,12576,12580,5230,12585,12590,12594,806,12598,12602,12607,12612,12616,12621,12625,2854,4993,12629,2851,12633,12637,12641,2840,12645,12649,12654,12658,12663,2496,12668,12673,12679,12684,12690,12695,942,12700,12705,12711,12716,12722,12727,2514,12732,12737,2510,12742,12747,12752,3201,12757,12762,12768,12773,12778,10015,12783,12788,12794,12799,12804,10060,12809,12814,12819,10264,12824,12829,10330,12834,12839,12844,10207,12849,12854,12860,12865,12870,12875,12879,12884,12890,12896,12901,12907,12912,3064,12917,12922,12928,12933,12938,12943,12948,12953,12957,12962,12967,12971,2950,12975,12979,12984,12988,12993,842,12997,13001,13006,13010,13015,13019,1400,13023,13027,2957,13031,13035,13039,2947,13043,13047,13052,13056,13061,13066,13070,13075,13081,13086,13092,13097,4878,13102,13107,13113,13118,13124,13129,13133,13138,13143,13147,13152,13157,13162,13166,13171,13177,13182,13187,13192,13196,13201,13207,13212,13216,2547,13220,13224,13229,13234,13238,13243,13247,839,13251,13255,13260,13265,13269,13274,13278,1426,13282,13286,2554,13290,13294,13298,2544,13302,13306,13311,13315,13319,4493,13323,13327,13332,13336,13340,3228,13344,13348,13353,13358,13362,13367,13371,915,13375,13379,13384,13389,13393,13398,13402,3242,13406,13410,13414,3239,13418,13422,13426,3225,13430,13434,13439,13443,13447,2998,13451,13455,13460,13464,13469,13473,836,13477,13481,13486,13490,13495,13499,1311,13503,13507,13511,3009,13515,13519,13523,2995,13527,13531,13536,13540,13545,3271,13550,13556,13561,13567,13572,1060,13577,13582,13588,13594,13599,13605,13610,3289,13615,13620,13625,3285,13630,13635,13640,3267,13645,13650,13656,13661,13667,13672,13677,13682,13686,13691,13697,13702,13708,13713,13718,13722,13727,13732,13736,13741,13746,13751,13755,13760,13766,13771,13776,13781,13785,13790,13796,13802,13807,13813,13818,13823,13827,13832,13838,13844,13849,13855,13860,13865,13869,13874,13879,13883,13888,13894,13899,13905,13910,922,13915,13920,13926,13932,13937,13942,4136,13947,13952,13957,13961,13966,13970,1623,13975,13979,429,13983,13987,13992,13997,14001,14006,14010,2537,14014,14018,1620,14022,14026,14030,852,14034,14038,14043,14047,14052,3114,14056,14060,482,14064,14068,14072,3126,14076,14080,14085,14089,14094,14098,1044,14102,14106,14111,14115,14120,14124,3137,14128,14132,464,14136,14140,14144,3123,14148,14152,14157,14161,14165,14169,14172,14176,14181,14185,14189,2864,14193,14197,14202,14207,14211,14216,14220,926,14224,14228,14233,14237,14242,14246,2878,14250,14254,2875,14258,14262,14266,2861,14270,14274,14279,14283,14287,5159,14291,14295,14300,14304,14309,6491,14314,14319,14325,14331,14336,14342,14347,6483,14352,14357,6509,14362,14367,6505,14372,14377,6487,14382,14387,14393,14398,14403,14408,14412,14417,9839,14423,14428,14433,14437,14442,14448,14453,14459,14464,14469,14473,14478,14484,14489,14494,14499,14504,14508,14513,14517,14522,14528,14533,14538,14543,14547,14552,14558,14563,14567,2678,14571,14575,14580,14584,14589,14593,826,14597,14601,14606,14610,14615,14619,1325,14623,14627,2689,14631,14635,14639,2675,14643,14647,14652,14656,14660,14664,14667,14671,14676,14680,14685,6435,14690,14695,14701,14706,14712,14717,992,14722,14727,14732,4430,14737,14742,6449,14747,14752,14757,6431,14762,9853,14767,14772,14776,14781,14787,14792,14797,1464,14802,14807,14813,14818,14824,14829,3166,14834,14839,14844,3162,14849,14854,9858,3144,14859,14864,14870,14875,14880,14885,14889,14894,14900,14905,14910,812,14915,14920,14926,14932,14937,14943,14948,3342,14953,14958,14963,3338,14968,14973,3320,14978,14983,14989,14994,14999,15004,15008,15013,15019,15024,822,15029,15035,15040,15045,10693,15050,15055,15060,15065,15069,15074,15079,15084,15088,15093,15099,15104,15109,15114,15118,15123,15129,15134,15139,4604,15144,15149,15154,15158,15163,15168,15173,15177,15182,15187,15192,15196,15201,15207,15212,15217,15222,15226,15231,15237,15242,15247,988,15252,15257,15263,15268,15274,15279,327,15284,15289,15294,2305,15299,15304,15309,2696,15314,15319,15325,15330,15335,15340,15344,15349,15355,15360,15364,819,15368,15372,15377,15381,15386,15390,2668,15394,15398,2665,15402,15406,15410,2651,15414,15418,15423,15427,15431,4486,15435,15439,15444,15448,15452,3208,15456,15460,15465,15470,15474,15479,15484,15489,15493,15498,15502,3222,15506,15510,15514,3205,15518,15522,15527,9873,15531,5156,15535,15539,15544,15548,15552,2712,15556,15560,15565,9877,15570,15575,15580,3499,15585,15590,15594,2726,15598,15602,15606,2709,15610,15614,15619,15623,15627,15631,15634,15638,15643,15647,15652,4282,15657,15662,15668,15674,15679,15685,15691,15696,15702,15707,4269,15712,15717,15722,4265,15727,15732,15738,15743,15748,15753,15757,15762,15767,10019,15772,15777,15783,15789,15794,15800,15806,15811,15816,10268,15821,15826,10211,9881,15831,15837,15842,15847,15852,15856,15861,15867,15872,15877,2968,15882,15887,15893,15899,15904,15910,9886,15916,15922,15927,2986,15932,15937,15942,2964,15947,15952,15956,2891,15960,15964,15969,9900,15974,15979,15984,15988,15992,2905,15996,16000,16004,16008,16011,16015,16020,16024,16028,347,16032,16036,16041,16046,16050,16055,16060,16065,16069,16074,16078,1318,16082,16086,16090,670,16094,16098,16103,16107,16111,1124,16115,16119,16124,0,0,0,15590,2547,13443,15882,14291,6435,13615,13418,2599,13771,13332,11894,12267,1318,11747,13844,12590,915,0,0,12768,11659,13594,15932,2840,11563,15717,14120,11763,12149,16024,12459,15340,12438,1044,3222,0,15753,13398,15674,3114,3183,15325,13234,5159,14237,14193,13869,15242,0,15284,3338,14319,0,3009,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2995,16128,0,0,16132,0,0,0,16136,0,0,0,0,0,0,0,16140,16144,0,16148,0,16152,0,0,0,0,0,0,16157,0,0,0,16162,0,0,0,16168,0,0,0,0,0,0,0,0,0,0,0,0,16174,0,0,0,0,0,0,3030,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16181,0,0,0,0,0,0,3016,16187,0,0,16192,0,0,0,16197,0,0,0,0,0,0,0,16202,16207,0,16212,0,16217,0,0,0,0,0,0,6584,0,0,0,16223,0,0,0,16228,0,0,0,0,0,0,0,16233,0,0,0,0,0,0,0,0,0,0,0,16238,16242,0,0,16247,0,0,0,16252,0,0,0,0,0,0,0,16257,16262,0,0,0,16267,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2998,16273,0,0,16277,0,0,0,16281,0,0,0,0,0,0,0,16285,16289,0,16293,0,16297,0,0,0,0,0,0,806,16302,0,0,1655,0,0,0,16306,16310,0,0,0,0,0,0,16315,16319,0,16323,16327,16332,0,0,0,0,0,0,16337,16341,0,0,16346,0,0,0,16351,0,0,0,0,0,0,0,16356,16361,0,16366,16371,16377,0,0,0,0,0,0,4073,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16383,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16389,16393,0,0,16398,0,0,0,16403,0,16408,0,0,0,0,0,16414,16419,0,16424,16429,16435,0,0,0,0,0,0,2851,16441,0,0,16445,0,0,0,16449,0,0,0,0,0,0,0,16453,16457,0,16461,0,16465,0,0,0,0,0,0,16470,0,0,0,16475,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16481,0,0,0,0,0,0,0,4061,0,0,0,16488,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2854,16493,0,0,16497,0,0,0,16501,0,0,0,0,0,0,0,16505,16509,0,16513,0,16517,0,0,0,0,4993,0,2857,0,0,0,16522,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16527,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16532,0,0,0,16536,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16541,0,16546,0,0,0,0,0,0,4069,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2840,16552,0,0,16556,0,0,0,16560,0,0,0,0,0,0,0,10627,16564,0,16568,0,16572,0,0,0,0,0,0,16577,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16582,0,0,0,0,0,0,0,3613,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3617,16589,0,0,16594,0,0,0,16599,0,0,0,0,0,0,0,16604,16609,0,0,0,16614,0,0,0,0,0,0,16620,0,0,0,16624,0,0,0,16629,0,0,0,0,0,0,0,16634,0,0,0,0,16639,0,0,0,0,0,0,16645,16649,0,0,16654,0,0,16659,16664,0,16669,0,0,0,0,0,16675,16680,0,16685,0,0,0,0,0,0,0,0,4065,0,0,0,16690,0,0,0,16695,0,0,0,0,0,0,0,16700,16705,0,0,0,0,0,0,0,0,0,0,324,16710,0,0,16714,0,0,0,16718,0,0,0,0,0,0,0,16722,16726,0,16730,0,16734,0,0,0,0,0,0,803,16739,16743,0,16748,0,0,0,16752,0,16756,0,0,0,0,0,16761,16765,0,16769,16773,16778,0,0,0,11713,0,0,16783,16787,0,0,16792,0,0,0,16797,0,0,0,0,0,0,0,16802,16807,0,16812,16817,16823,0,0,0,0,0,0,16829,16833,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16838,16842,0,0,16847,0,0,0,16852,0,0,0,0,0,0,0,16857,16862,0,16867,16872,16878,0,0,0,0,0,0,3468,16884,0,0,16888,0,0,0,16892,0,0,0,0,0,0,0,16896,16900,0,16904,0,16908,0,0,0,0,0,0,16913,0,0,0,16918,0,0,0,16924,0,0,0,0,0,0,0,16930,16936,0,0,16942,16949,0,0,0,0,0,0,16956,0,0,0,0,0,0,0,16960,0,0,0,0,0,0,0,0,16965,0,16970,0,0,0,0,0,0,0,0,3471,16975,0,0,16979,0,0,0,16983,0,0,0,0,0,0,0,16987,16991,0,16995,0,16999,0,0,0,0,0,0,2779,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,17004,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,17010,0,0,0,17014,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,17019,0,0,0,17023,0,0,0,17028,0,0,0,0,0,0,0,0,17033,0,17038,0,0,0,0,0,0,0,0,3454,17043,0,0,17047,0,0,17051,17055,0,17059,0,0,0,0,0,17064,17068,0,17072,0,17076,0,0,0,0,0,0,17081,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,17086,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3577,0,0,0,17093,0,0,0,17098,0,0,0,0,0,0,0,17103,0,0,17108,0,0,0,0,0,0,0,0,17113,0,0,0,17117,0,0,0,17122,0,0,0,0,0,0,0,17127,0,0,17132,0,17137,0,0,0,0,0,0,17143,0,0,0,17147,0,0,0,17152,0,0,0,0,0,0,0,17157,17162,0,17167,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3457,17172,0,0,17176,0,0,0,17180,0,0,0,0,0,0,0,17184,17188,0,17192,0,17196,0,0,0,0,0,0,429,17201,0,0,10033,0,0,0,17205,0,0,0,0,17209,0,0,17214,17218,0,17222,0,17226,0,0,0,0,0,0,1616,17231,0,0,17236,0,0,0,17241,0,0,0,0,0,0,0,17246,17251,0,17256,17261,17267,0,0,0,0,0,0,17273,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,17277,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,17283,17287,0,0,17292,0,0,0,17297,0,17302,0,0,0,0,0,17308,17313,0,17318,0,17323,0,0,0,0,0,0,1620,17329,0,0,10282,0,0,0,17333,0,0,0,0,0,0,0,17337,17341,0,17345,0,10541,0,0,0,0,0,0,17349,17354,0,0,17360,0,0,0,17366,0,0,0,0,0,0,0,17372,17378,0,17384,17390,17397,0,0,0,0,0,0,17404,0,0,0,17408,0,0,0,17413,0,0,0,0,0,0,0,0,17418,0,0,0,0,0,0,0,0,0,0,2537,17423,0,0,9220,0,0,0,17427,0,0,0,0,17431,0,0,17436,17440,0,17444,0,17448,0,0,0,14006,0,0,4211,17453,0,0,17458,0,0,0,17463,0,0,0,0,0,0,0,0,0,0,17468,0,17473,0,0,0,0,0,0,17479,17484,0,0,17490,0,0,0,0,0,0,0,0,0,0,0,0,0,0,17496,0,17502,0,0,0,0,0,0,1631,17509,0,0,17514,0,0,0,17519,0,0,0,0,0,0,0,0,17524,0,17529,0,17534,0,0,0,0,0,0,17540,0,0,0,17544,0,0,0,17549,0,0,0,0,0,0,0,0,17554,0,17559,0,0,0,0,0,0,0,0,2523,17564,0,0,10169,0,0,0,17568,0,0,0,0,17572,0,0,17577,0,0,17581,0,17585,0,0,0,0,0,0,17590,0,0,0,17595,0,0,0,17601,0,0,0,0,0,0,0,17607,0,0,0,0,17613,0,0,0,0,0,0,4198,17620,0,0,915,17625,17629,17634,1639,17639,17644,17649,17653,17657,17662,17667,17672,17677,17682,17687,17692,17696,17700,17705,17709,17714,17719,17723,17727,13367,13375,17731,17735,17739,17744,17750,17756,17761,17767,17773,17778,17783,17789,17795,17801,17807,17813,17819,17825,17830,17835,17841,17846,17852,17858,17863,17868,17873,17878,17883,6640,17888,17893,17899,17905,17910,17916,17922,17927,17932,17938,17944,17950,17956,17962,17968,17974,17979,17984,17990,17995,18001,18007,18012,18017,18022,18027,18032,18037,18042,18048,18055,18062,18068,18075,18082,18088,18094,18101,18108,18115,18122,18129,18136,18143,18149,18155,18162,18168,18175,18182,18188,18194,18200,18206,18212,1140,18218,18223,18229,18235,18240,18246,18252,18257,18262,18268,18274,18280,18286,18292,18298,18304,18309,18314,18320,18325,18331,18337,18342,18347,18352,18357,18362,3239,18367,18371,18376,10345,18381,18386,18391,18395,18399,18404,18409,18414,18419,18424,18429,18434,18438,18442,18447,18451,18456,18461,18465,18469,13410,13418,18473,18477,18482,18488,18495,18502,18508,18515,18522,18528,18534,18541,18548,18555,18562,18569,18576,18583,18589,18595,18602,18608,18615,18622,18628,18634,18640,18646,18652,6662,18658,18663,18669,18675,18680,18686,18692,18697,18702,18708,18714,18720,18726,18732,18738,18744,18749,18754,18760,18765,18771,18777,18782,18787,18792,18797,18802,3242,18807,18811,18816,18821,18825,18830,18835,18839,18843,18848,18853,18858,18863,18868,18873,18878,18882,18886,18891,18895,18900,18905,18909,18913,13398,13406,18917,3245,18921,18926,18932,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,6,24,54,24,54,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18938,18943,18949,18955,18960,18965,18971,18977,18983,18989,18995,19001,19007,19012,19017,19023,19028,19034,19040,19045,19050,19055,19060,19065,19070,19075,19081,19088,19095,19101,19108,19115,19121,19127,19134,19141,19148,19155,19162,19169,19176,19182,19188,19195,19201,19208,19215,19221,19227,19233,19239,19245,19251,19255,19260,19266,19272,19277,19283,19289,19294,19299,19305,19311,19317,19323,19329,19335,19341,19346,19351,19357,19362,19368,19374,19379,19384,19389,19394,19399,6666,19404,19409,19415,10825,19421,19427,19433,19438,19443,19449,19455,19461,19467,19473,19479,19485,19490,19495,19501,19506,19512,19518,19523,19528,19533,19538,19543,3225,19548,19552,19557,19562,19566,19571,19576,19580,19584,19589,19594,19599,19604,19609,19614,19619,19623,19627,19632,19636,19641,19646,19650,19654,13422,13430,19658,19662,19667,19673,19680,19687,19693,19700,19707,19713,19719,19726,19733,19740,19747,19754,19761,19768,19774,19780,19787,19793,19800,19807,19813,19819,19825,19831,19837,3263,19843,19848,19854,19860,19865,19871,19877,19882,19887,19893,19899,19905,19911,19917,19923,19929,19934,19939,19945,19950,19956,19962,19967,19972,19977,19982,19987,3249,19992,19997,20003,20009,20014,20020,20026,20031,20036,20042,20048,20054,20060,20066,20072,20078,20083,20088,20094,20099,20105,20111,20116,20121,20126,20131,20136,6644,20141,20146,20152,20158,20163,20169,20175,20180,20185,20191,20197,20203,20209,20215,20221,20227,20232,20237,20243,20248,20254,20260,20265,20270,20275,20280,20285,20290,20294,20299,20305,20311,20316,20322,20328,20333,20338,20344,20350,20356,20362,20368,20374,20380,20385,20390,20396,7478,8154,20401,20406,20411,20416,20421,20426,6648,20431,20436,20442,20448,20453,20459,20465,20470,20475,20481,20487,20493,20499,20505,20511,20517,20522,20527,20533,20538,20544,20550,20555,20560,20565,20570,20575,3228,20580,20584,20589,20594,20598,20603,20608,20612,20616,20621,20626,20631,20636,20641,20646,20651,20655,20659,20664,20668,20673,20678,20682,20686,13336,13344,20690,1060,20694,20699,20705,20711,20716,20722,20728,20733,20738,20744,20750,20756,20762,20768,20774,20780,20785,20790,20796,20801,20807,20813,20818,20823,13567,13577,20828,20833,20838,20844,20851,20858,20864,20871,20878,20884,20890,20897,20904,20911,20918,20925,20932,20939,20945,20951,20958,20964,20971,20978,20984,20990,20996,21002,21008,21014,21019,21025,21032,21039,21045,21052,21059,21065,21071,21078,21085,21092,21099,21106,21113,21120,21126,21132,21139,21145,21152,21159,21165,21171,21177,21183,21189,21195,21201,21208,21216,21224,21231,21239,21247,21254,21261,21269,21277,21285,21293,21301,21309,21317,21324,21331,21339,21346,21354,21362,21369,21376,21383,21390,21397,21404,21409,21415,21422,21429,21435,21442,21449,21455,21461,21468,21475,21482,21489,21496,21503,21510,21516,21522,21529,21535,21542,21549,21555,21561,21567,21573,21579,3285,21585,21590,21596,21602,21607,21613,21619,21624,21629,21635,21641,21647,21653,21659,21665,21671,21676,21681,21687,21692,21698,21704,21709,21714,13620,13630,21719,21724,21730,21737,21745,21753,21760,21768,21776,21783,21790,21798,21806,21814,21822,21830,21838,21846,21853,21860,21868,21875,21883,21891,21898,21905,21912,21919,21926,21933,21938,21944,21951,21958,21964,21971,21978,21984,21990,21997,22004,22011,22018,22025,22032,22039,22045,22051,22058,22064,22071,22078,22084,22090,22096,22102,22108,3289,22114,22119,22125,22131,22136,22142,22148,22153,22158,22164,22170,22176,22182,22188,22194,22200,22205,22210,22216,22221,22227,22233,22238,22243,13605,13615,22248,6410,22253,22259,22266,22273,22279,22286,22293,22299,22305,22312,22319,22326,22333,22340,22347,22354,22360,22366,22373,22379,22386,22393,22399,22405,22411,22417,22423,22429,22435,22442,22450,22458,22465,22473,22481,22488,22495,22503,22511,22519,22527,22535,22543,22551,22558,22565,22573,22580,22588,22596,22603,22610,22617,22624,22631,22638,22643,22649,22656,22663,22669,22676,22683,22689,22695,22702,22709,22716,22723,22730,22737,22744,22750,22756,22763,22769,22776,22783,22789,22795,22801,22807,22813,22819,22824,22830,22837,22844,22850,22857,22864,22870,22876,22883,22890,22897,22904,22911,22918,22925,22931,22937,22944,22950,22957,22964,22970,22976,22982,22988,22994,3267,23000,23005,23011,23017,23022,23028,23034,23039,23044,23050,23056,23062,23068,23074,23080,23086,23091,23096,23102,23107,23113,23119,23124,23129,13635,13645,23134,23139,23145,23152,23160,23168,23175,23183,23191,23198,23205,23213,23221,23229,23237,23245,23253,23261,23268,23275,23283,23290,23298,23306,23313,23320,23327,23334,23341,6426,23348,23354,23361,23368,23374,23381,23388,23394,23400,23407,23414,23421,23428,23435,23442,23449,23455,23461,23468,23474,23481,23488,23494,23500,23506,23512,23518,6415,23524,23530,23537,23544,23550,23557,23564,23570,23576,23583,23590,23597,23604,23611,23618,23625,23631,23637,23644,23650,23657,23664,23670,23676,23682,23688,23694,23700,23705,23711,23718,23725,23731,23738,23745,23751,23757,23764,23771,23778,23785,23792,23799,23806,23812,23818,23825,23831,23838,23845,23851,23857,23863,23869,23875,23881,23886,23892,23899,23906,23912,23919,23926,23932,23938,23945,23952,23959,23966,23973,23980,23987,23993,23999,24006,24012,24019,24026,24032,24038,24044,24050,24056,24062,24067,24073,24080,24087,24093,24100,24107,24113,24119,24126,24133,24140,24147,24154,24161,24168,24174,24180,24187,24193,24200,24207,24213,24219,24225,24231,24237,3271,24243,24248,24254,24260,24265,24271,24277,24282,24287,24293,24299,24305,24311,24317,24323,24329,24334,24339,24345,24350,24356,24362,24367,24372,13540,24377,24382,842,24387,24391,24396,24401,24405,24410,24415,24419,24423,24428,24433,24438,24443,24448,24453,24458,24462,24466,24471,24475,24480,24485,24489,24493,24497,12997,3488,24501,24505,24510,24516,24522,24527,24533,24539,24544,24549,24555,24561,24567,24573,24579,24585,24591,24596,24601,24607,24612,24618,24624,24629,24634,24639,24644,24649,848,24654,24659,24665,10893,24671,24677,24683,24688,24693,24699,24705,24711,24717,24723,24729,24735,24740,24745,24751,24756,24762,24768,24773,24778,24783,24788,24793,24798,24803,24809,24816,24823,24829,24836,24843,24849,24855,24862,24869,24876,24883,24890,24897,24904,24910,24916,24923,24929,24936,24943,24949,24955,24961,24967,24973,24979,24983,24988,24994,25000,25005,25011,25017,25022,25027,25033,25039,25045,25051,25057,25063,25069,25074,25079,25085,25090,25096,25102,25107,25112,25117,25122,25127,2957,25132,25136,25141,25146,25150,25155,25160,25164,25168,25173,25178,25183,25188,25193,25198,25203,25207,25211,25216,25220,25225,25230,25234,25238,25242,13031,25246,25250,25255,25261,25268,25275,25281,25288,25295,25301,25307,25314,25321,25328,25335,25342,25349,25356,25362,25368,25375,25381,25388,25395,25401,25407,25413,25419,25425,2982,25431,25436,25442,25448,25453,25459,25465,25470,25475,25481,25487,25493,25499,25505,25511,25517,25522,25527,25533,25538,25544,25550,25555,25560,25565,25570,25575,1400,25580,25584,25589,25594,25598,25603,25608,25612,25616,25621,25626,25631,25636,25641,25646,25651,25655,25659,25664,25668,25673,25678,25682,25686,13015,13023,25690,2960,25694,25699,25705,25711,25716,25722,25728,25733,25738,25744,25750,25756,25762,25768,25774,25780,25785,25790,25796,25801,25807,25813,25818,25823,25828,25833,25838,25843,25848,25854,25861,25868,25874,25881,25888,25894,25900,25907,25914,25921,25928,25935,25942,25949,25955,25961,25968,25974,25981,25988,25994,26000,26006,26012,26018,26024,26028,26033,26039,26045,26050,26056,26062,26067,26072,26078,26084,26090,26096,26102,26108,26114,26119,26124,26130,26135,26141,26147,26152,26157,26162,26167,26172,2986,26177,26182,26188,26194,26199,26205,26211,26216,26221,26227,26233,26239,26245,26251,26257,26263,26268,26273,26279,26284,26290,26296,26301,26306,15922,15932,26311,2947,26316,26320,26325,26330,26334,26339,26344,26348,26352,26357,26362,26367,26372,26377,26382,10623,26387,26391,26396,26400,26405,26410,26414,26418,13035,13043,26422,26426,26431,26437,26444,26451,26457,26464,26471,26477,26483,26490,26497,26504,26511,26518,26525,26532,26538,26544,26551,26557,26564,26571,26577,26583,26589,26595,26601,3791,26607,26612,26618,26624,26629,26635,26641,26646,26651,26657,26663,26669,26675,26681,26687,26693,26698,26703,26709,26714,26720,26726,26731,26736,26741,26746,26751,26756,26760,26765,26771,26777,26782,26788,26794,26799,26804,26810,26816,26822,26828,26834,26840,26846,26851,26856,26862,26867,26873,26879,26884,26889,26894,26899,26904,2964,26909,26914,26920,26926,26931,26937,26943,26948,26953,26959,26965,26971,26977,26983,26989,26995,27000,27005,27011,27016,27022,27028,27033,27038,15937,15947,27043,27048,27052,27057,27063,27069,27074,27080,27086,27091,27096,27102,27108,27114,27120,27126,27132,27138,27143,27148,27154,27159,27165,27171,27176,27181,27186,27191,27196,2968,27201,27206,27212,27218,27223,27229,27235,27240,27245,27251,27257,27263,27269,27275,27281,27287,27292,27297,27303,27308,27314,27320,27325,27330,15872,15882,27335,2950,27340,27344,27349,27354,27358,27363,27368,27372,27376,27381,27386,27391,27396,27401,27406,27411,27415,27419,27424,27428,27433,27438,27442,27446,12967,12975,27450,816,27454,27458,27463,27468,27472,27477,27482,681,27486,27491,27496,27501,27506,27511,27516,27521,10919,27525,27530,27534,27539,27544,27548,27552,12510,12518,27556,27560,27564,27569,27575,27581,27586,27592,27598,27603,27608,27614,27620,27626,27632,27638,27644,27650,27655,27660,27666,27671,27677,27683,27688,27693,27698,27703,27708,27713,27717,27722,27728,27734,27739,27745,27751,27756,27761,27767,27773,27779,27785,27791,27797,27803,27808,27813,27819,27824,27830,27836,27841,27846,27851,27856,27861,27866,27871,27877,27884,27891,27897,27904,27911,27917,27923,27930,27937,27944,27951,27958,27965,27972,27978,27984,27991,27997,28004,28011,28017,28023,28029,28035,28041,28047,28051,28056,28062,28068,28073,28079,28085,28090,28095,28101,28107,28113,28119,28125,28131,28137,28142,28147,28153,28158,28164,28170,28175,28180,28185,28190,28195,432,82,28200,28205,28210,28214,28219,28224,28228,28232,28237,28242,28247,28252,28257,28262,28267,28271,28275,28280,28284,28289,28294,28298,28302,28306,12543,28310,28314,28319,28325,28332,28339,28345,28352,28359,28365,28371,28378,28385,28392,28399,28406,28413,28420,28426,28432,28439,28445,28452,28459,28465,28471,28477,28483,28489,28495,28499,28504,28510,28516,28521,28527,28533,28538,28543,28549,28555,28561,28567,28573,28579,28585,28590,28595,28601,28606,28612,28618,28623,28628,28633,28638,28643,3194,28648,28652,28657,1643,28662,28667,28672,28676,28680,28685,28690,28695,28700,28705,28710,28715,28719,28723,28728,28732,28737,28742,28746,28750,618,12535,28754,3197,28758,28763,28769,28775,28780,28786,28792,28797,28802,28808,28814,28820,28826,28832,28838,28844,28849,28854,28860,28865,28871,28877,28882,28887,28892,28897,28902,28907,28912,28918,28925}
index ac083fc2d5acabe69279407779b19ba411ab2a4b..8a6d044ccd91ce104d5b08ad371a206f6ebe29ee 100755 (executable)
@@ -1,6 +1,6 @@
 #!/bin/sh
 #
-# Plugin to monitor the types of requsts made to the API
+# Plugin to monitor the types of requests made to the API
 #
 # Can be configured through libpq environment variables, for example
 # PGUSER, PGDATABASE, etc. See man page of psql for more information.
index 6c01a68ae5cebfe44711b59856c0e6a18abed2fd..8c2136f410988d37a2d1578b63ad6a7682f02d17 100644 (file)
@@ -1,7 +1,14 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# This file is part of Nominatim. (https://nominatim.org)
+#
+# Copyright (C) 2022 by the Nominatim developer community.
+# For a full list of authors see the git log.
 """
 Command-line interface to the Nominatim functions for import, update,
 database administration and querying.
 """
+from typing import Optional, Any, List, Union
 import logging
 import os
 import sys
@@ -12,16 +19,16 @@ from nominatim.config import Configuration
 from nominatim.tools.exec_utils import run_legacy_script, run_php_server
 from nominatim.errors import UsageError
 from nominatim import clicmd
-from nominatim.clicmd.args import NominatimArgs
+from nominatim import version
+from nominatim.clicmd.args import NominatimArgs, Subcommand
 
 LOG = logging.getLogger()
 
-
 class CommandlineParser:
     """ Wraps some of the common functions for parsing the command line
         and setting up subcommands.
     """
-    def __init__(self, prog, description):
+    def __init__(self, prog: str, description: Optional[str]):
         self.parser = argparse.ArgumentParser(
             prog=prog,
             description=description,
@@ -30,6 +37,10 @@ class CommandlineParser:
         self.subs = self.parser.add_subparsers(title='available commands',
                                                dest='subcommand')
 
+        # Global arguments that only work if no sub-command given
+        self.parser.add_argument('--version', action='store_true',
+                                 help='Print Nominatim version and exit')
+
         # Arguments added to every sub-command
         self.default_args = argparse.ArgumentParser(add_help=False)
         group = self.default_args.add_argument_group('Default arguments')
@@ -46,11 +57,22 @@ class CommandlineParser:
                            help='Number of parallel threads to use')
 
 
-    def add_subcommand(self, name, cmd):
+    def nominatim_version_text(self) -> str:
+        """ Program name and version number as string
+        """
+        text = f'Nominatim version {version.version_str()}'
+        if version.GIT_COMMIT_HASH is not None:
+            text += f' ({version.GIT_COMMIT_HASH})'
+        return text
+
+
+    def add_subcommand(self, name: str, cmd: Subcommand) -> None:
         """ Add a subcommand to the parser. The subcommand must be a class
             with a function add_args() that adds the parameters for the
             subcommand and a run() function that executes the command.
         """
+        assert cmd.__doc__ is not None
+
         parser = self.subs.add_parser(name, parents=[self.default_args],
                                       help=cmd.__doc__.split('\n', 1)[0],
                                       description=cmd.__doc__,
@@ -59,12 +81,20 @@ class CommandlineParser:
         parser.set_defaults(command=cmd)
         cmd.add_args(parser)
 
-    def run(self, **kwargs):
+
+    def run(self, **kwargs: Any) -> int:
         """ Parse the command line arguments of the program and execute the
             appropriate subcommand.
         """
         args = NominatimArgs()
-        self.parser.parse_args(args=kwargs.get('cli_args'), namespace=args)
+        try:
+            self.parser.parse_args(args=kwargs.get('cli_args'), namespace=args)
+        except SystemExit:
+            return 1
+
+        if args.version:
+            print(self.nominatim_version_text())
+            return 0
 
         if args.subcommand is None:
             self.parser.print_help()
@@ -119,8 +149,7 @@ class QueryExport:
     Export addresses as CSV file from the database.
     """
 
-    @staticmethod
-    def add_args(parser):
+    def add_args(self, parser: argparse.ArgumentParser) -> None:
         group = parser.add_argument_group('Output arguments')
         group.add_argument('--output-type', default='street',
                            choices=('continent', 'country', 'state', 'county',
@@ -149,11 +178,10 @@ class QueryExport:
                            help='Export only children of this OSM relation')
 
 
-    @staticmethod
-    def run(args):
-        params = ['export.php',
-                  '--output-type', args.output_type,
-                  '--output-format', args.output_format]
+    def run(self, args: NominatimArgs) -> int:
+        params: List[Union[int, str]] = [
+                             '--output-type', args.output_type,
+                             '--output-format', args.output_format]
         if args.output_all_postcodes:
             params.append('--output-all-postcodes')
         if args.language:
@@ -167,7 +195,7 @@ class QueryExport:
         if args.restrict_to_osm_relation:
             params.extend(('--restrict-to-osm-relation', args.restrict_to_osm_relation))
 
-        return run_legacy_script(*params, nominatim_env=args)
+        return run_legacy_script('export.php', *params, nominatim_env=args)
 
 
 class AdminServe:
@@ -181,51 +209,52 @@ class AdminServe:
     By the default, the webserver can be accessed at: http://127.0.0.1:8088
     """
 
-    @staticmethod
-    def add_args(parser):
+    def add_args(self, parser: argparse.ArgumentParser) -> None:
         group = parser.add_argument_group('Server arguments')
         group.add_argument('--server', default='127.0.0.1:8088',
                            help='The address the server will listen to.')
 
-    @staticmethod
-    def run(args):
+
+    def run(self, args: NominatimArgs) -> int:
         run_php_server(args.server, args.project_dir / 'website')
+        return 0
+
 
-def get_set_parser(**kwargs):
+def get_set_parser(**kwargs: Any) -> CommandlineParser:
     """\
     Initializes the parser and adds various subcommands for
     nominatim cli.
     """
     parser = CommandlineParser('nominatim', nominatim.__doc__)
 
-    parser.add_subcommand('import', clicmd.SetupAll)
-    parser.add_subcommand('freeze', clicmd.SetupFreeze)
-    parser.add_subcommand('replication', clicmd.UpdateReplication)
+    parser.add_subcommand('import', clicmd.SetupAll())
+    parser.add_subcommand('freeze', clicmd.SetupFreeze())
+    parser.add_subcommand('replication', clicmd.UpdateReplication())
 
-    parser.add_subcommand('special-phrases', clicmd.ImportSpecialPhrases)
+    parser.add_subcommand('special-phrases', clicmd.ImportSpecialPhrases())
 
-    parser.add_subcommand('add-data', clicmd.UpdateAddData)
-    parser.add_subcommand('index', clicmd.UpdateIndex)
+    parser.add_subcommand('add-data', clicmd.UpdateAddData())
+    parser.add_subcommand('index', clicmd.UpdateIndex())
     parser.add_subcommand('refresh', clicmd.UpdateRefresh())
 
-    parser.add_subcommand('admin', clicmd.AdminFuncs)
+    parser.add_subcommand('admin', clicmd.AdminFuncs())
 
-    parser.add_subcommand('export', QueryExport)
-    parser.add_subcommand('serve', AdminServe)
+    parser.add_subcommand('export', QueryExport())
+    parser.add_subcommand('serve', AdminServe())
 
     if kwargs.get('phpcgi_path'):
-        parser.add_subcommand('search', clicmd.APISearch)
-        parser.add_subcommand('reverse', clicmd.APIReverse)
-        parser.add_subcommand('lookup', clicmd.APILookup)
-        parser.add_subcommand('details', clicmd.APIDetails)
-        parser.add_subcommand('status', clicmd.APIStatus)
+        parser.add_subcommand('search', clicmd.APISearch())
+        parser.add_subcommand('reverse', clicmd.APIReverse())
+        parser.add_subcommand('lookup', clicmd.APILookup())
+        parser.add_subcommand('details', clicmd.APIDetails())
+        parser.add_subcommand('status', clicmd.APIStatus())
     else:
         parser.parser.epilog = 'php-cgi not found. Query commands not available.'
 
     return parser
 
 
-def nominatim(**kwargs):
+def nominatim(**kwargs: Any) -> int:
     """\
     Command-line tools for importing, updating, administrating and
     querying the Nominatim database.
index ac2cae5b782cac0ecc4dee9eb641f3b0129b8199..bdd9bafe7c4d9c5f965dcc8675a0c54544a5d72c 100644 (file)
@@ -1,13 +1,26 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# This file is part of Nominatim. (https://nominatim.org)
+#
+# Copyright (C) 2022 by the Nominatim developer community.
+# For a full list of authors see the git log.
 """
 Subcommand definitions for the command-line tool.
 """
+# mypy and pylint disagree about the style of explicit exports,
+# see https://github.com/PyCQA/pylint/issues/6006.
+# pylint: disable=useless-import-alias
 
-from nominatim.clicmd.setup import SetupAll
-from nominatim.clicmd.replication import UpdateReplication
-from nominatim.clicmd.api import APISearch, APIReverse, APILookup, APIDetails, APIStatus
-from nominatim.clicmd.index import UpdateIndex
-from nominatim.clicmd.refresh import UpdateRefresh
-from nominatim.clicmd.add_data import UpdateAddData
-from nominatim.clicmd.admin import AdminFuncs
-from nominatim.clicmd.freeze import SetupFreeze
-from nominatim.clicmd.special_phrases import ImportSpecialPhrases
+from nominatim.clicmd.setup import SetupAll as SetupAll
+from nominatim.clicmd.replication import UpdateReplication as UpdateReplication
+from nominatim.clicmd.api import (APISearch as APISearch,
+                                  APIReverse as APIReverse,
+                                  APILookup as APILookup,
+                                  APIDetails as APIDetails,
+                                  APIStatus as APIStatus)
+from nominatim.clicmd.index import UpdateIndex as UpdateIndex
+from nominatim.clicmd.refresh import UpdateRefresh as UpdateRefresh
+from nominatim.clicmd.add_data import UpdateAddData as UpdateAddData
+from nominatim.clicmd.admin import AdminFuncs as AdminFuncs
+from nominatim.clicmd.freeze import SetupFreeze as SetupFreeze
+from nominatim.clicmd.special_phrases import ImportSpecialPhrases as ImportSpecialPhrases
index 9f0d311898dbadbf54a6f77b1900735a3b5d532a..8905bc2183fc1c75a4c500530c3134c14a0efa6f 100644 (file)
@@ -1,10 +1,20 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# This file is part of Nominatim. (https://nominatim.org)
+#
+# Copyright (C) 2022 by the Nominatim developer community.
+# For a full list of authors see the git log.
 """
 Implementation of the 'add-data' subcommand.
 """
+from typing import cast
+import argparse
 import logging
 
 import psutil
 
+from nominatim.clicmd.args import NominatimArgs
+
 # Do not repeat documentation of subcommand classes.
 # pylint: disable=C0111
 # Using non-top-level imports to avoid eventually unused imports.
@@ -29,32 +39,31 @@ class UpdateAddData:
     for more information.
     """
 
-    @staticmethod
-    def add_args(parser):
+    def add_args(self, parser: argparse.ArgumentParser) -> None:
         group_name = parser.add_argument_group('Source')
-        group = group_name.add_mutually_exclusive_group(required=True)
-        group.add_argument('--file', metavar='FILE',
-                           help='Import data from an OSM file or diff file')
-        group.add_argument('--diff', metavar='FILE',
-                           help='Import data from an OSM diff file (deprecated: use --file)')
-        group.add_argument('--node', metavar='ID', type=int,
-                           help='Import a single node from the API')
-        group.add_argument('--way', metavar='ID', type=int,
-                           help='Import a single way from the API')
-        group.add_argument('--relation', metavar='ID', type=int,
-                           help='Import a single relation from the API')
-        group.add_argument('--tiger-data', metavar='DIR',
-                           help='Add housenumbers from the US TIGER census database')
-        group = parser.add_argument_group('Extra arguments')
-        group.add_argument('--use-main-api', action='store_true',
-                           help='Use OSM API instead of Overpass to download objects')
-        group.add_argument('--osm2pgsql-cache', metavar='SIZE', type=int,
-                           help='Size of cache to be used by osm2pgsql (in MB)')
-        group.add_argument('--socket-timeout', dest='socket_timeout', type=int, default=60,
-                           help='Set timeout for file downloads')
-
-    @staticmethod
-    def run(args):
+        group1 = group_name.add_mutually_exclusive_group(required=True)
+        group1.add_argument('--file', metavar='FILE',
+                            help='Import data from an OSM file or diff file')
+        group1.add_argument('--diff', metavar='FILE',
+                            help='Import data from an OSM diff file (deprecated: use --file)')
+        group1.add_argument('--node', metavar='ID', type=int,
+                            help='Import a single node from the API')
+        group1.add_argument('--way', metavar='ID', type=int,
+                            help='Import a single way from the API')
+        group1.add_argument('--relation', metavar='ID', type=int,
+                            help='Import a single relation from the API')
+        group1.add_argument('--tiger-data', metavar='DIR',
+                            help='Add housenumbers from the US TIGER census database')
+        group2 = parser.add_argument_group('Extra arguments')
+        group2.add_argument('--use-main-api', action='store_true',
+                            help='Use OSM API instead of Overpass to download objects')
+        group2.add_argument('--osm2pgsql-cache', metavar='SIZE', type=int,
+                            help='Size of cache to be used by osm2pgsql (in MB)')
+        group2.add_argument('--socket-timeout', dest='socket_timeout', type=int, default=60,
+                            help='Set timeout for file downloads')
+
+
+    def run(self, args: NominatimArgs) -> int:
         from nominatim.tokenizer import factory as tokenizer_factory
         from nominatim.tools import tiger_data, add_osm_data
 
@@ -67,7 +76,7 @@ class UpdateAddData:
 
         osm2pgsql_params = args.osm2pgsql_options(default_cache=1000, default_threads=1)
         if args.file or args.diff:
-            return add_osm_data.add_data_from_file(args.file or args.diff,
+            return add_osm_data.add_data_from_file(cast(str, args.file or args.diff),
                                                    osm2pgsql_params)
 
         if args.node:
index 06a61974db1c6db5d52d37555d2a67afbbdcf648..ad900579946c6a1d08e2d65b081e4ac05118648c 100644 (file)
@@ -1,10 +1,17 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# This file is part of Nominatim. (https://nominatim.org)
+#
+# Copyright (C) 2022 by the Nominatim developer community.
+# For a full list of authors see the git log.
 """
 Implementation of the 'admin' subcommand.
 """
 import logging
+import argparse
 
 from nominatim.tools.exec_utils import run_legacy_script
-from nominatim.db.connection import connect
+from nominatim.clicmd.args import NominatimArgs
 
 # Do not repeat documentation of subcommand classes.
 # pylint: disable=C0111
@@ -18,8 +25,7 @@ class AdminFuncs:
     Analyse and maintain the database.
     """
 
-    @staticmethod
-    def add_args(parser):
+    def add_args(self, parser: argparse.ArgumentParser) -> None:
         group = parser.add_argument_group('Admin tasks')
         objs = group.add_mutually_exclusive_group(required=True)
         objs.add_argument('--warm', action='store_true',
@@ -44,10 +50,9 @@ class AdminFuncs:
         mgroup.add_argument('--place-id', type=int,
                             help='Analyse indexing of the given Nominatim object')
 
-    @staticmethod
-    def run(args):
+    def run(self, args: NominatimArgs) -> int:
         if args.warm:
-            return AdminFuncs._warm(args)
+            return self._warm(args)
 
         if args.check_database:
             LOG.warning('Checking database')
@@ -57,8 +62,7 @@ class AdminFuncs:
         if args.analyse_indexing:
             LOG.warning('Analysing performance of indexing function')
             from ..tools import admin
-            with connect(args.config.get_libpq_dsn()) as conn:
-                admin.analyse_indexing(conn, osm_id=args.osm_id, place_id=args.place_id)
+            admin.analyse_indexing(args.config, osm_id=args.osm_id, place_id=args.place_id)
             return 0
 
         if args.migrate:
@@ -69,8 +73,7 @@ class AdminFuncs:
         return 1
 
 
-    @staticmethod
-    def _warm(args):
+    def _warm(self, args: NominatimArgs) -> int:
         LOG.warning('Warming database caches')
         params = ['warm.php']
         if args.target == 'reverse':
index 70baa8ff4ad0910c368025a1c14c014129e5f319..b899afad15f36e1bb4f7ea574427d8185aa4ff78 100644 (file)
@@ -1,10 +1,19 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# This file is part of Nominatim. (https://nominatim.org)
+#
+# Copyright (C) 2022 by the Nominatim developer community.
+# For a full list of authors see the git log.
 """
 Subcommand definitions for API calls from the command line.
 """
+from typing import Mapping, Dict
+import argparse
 import logging
 
 from nominatim.tools.exec_utils import run_api_script
 from nominatim.errors import UsageError
+from nominatim.clicmd.args import NominatimArgs
 
 # Do not repeat documentation of subcommand classes.
 # pylint: disable=C0111
@@ -36,7 +45,7 @@ DETAILS_SWITCHES = (
     ('polygon_geojson', 'Include geometry of result')
 )
 
-def _add_api_output_arguments(parser):
+def _add_api_output_arguments(parser: argparse.ArgumentParser) -> None:
     group = parser.add_argument_group('Output arguments')
     group.add_argument('--format', default='jsonv2',
                        choices=['xml', 'json', 'jsonv2', 'geojson', 'geocodejson'],
@@ -54,7 +63,7 @@ def _add_api_output_arguments(parser):
                              "Parameter is difference tolerance in degrees."))
 
 
-def _run_api(endpoint, args, params):
+def _run_api(endpoint: str, args: NominatimArgs, params: Mapping[str, object]) -> int:
     script_file = args.project_dir / 'website' / (endpoint + '.php')
 
     if not script_file.exists():
@@ -76,8 +85,7 @@ class APISearch:
     https://nominatim.org/release-docs/latest/api/Search/
     """
 
-    @staticmethod
-    def add_args(parser):
+    def add_args(self, parser: argparse.ArgumentParser) -> None:
         group = parser.add_argument_group('Query arguments')
         group.add_argument('--query',
                            help='Free-form query string')
@@ -103,8 +111,8 @@ class APISearch:
                            help='Do not remove duplicates from the result list')
 
 
-    @staticmethod
-    def run(args):
+    def run(self, args: NominatimArgs) -> int:
+        params: Dict[str, object]
         if args.query:
             params = dict(q=args.query)
         else:
@@ -139,8 +147,7 @@ class APIReverse:
     https://nominatim.org/release-docs/latest/api/Reverse/
     """
 
-    @staticmethod
-    def add_args(parser):
+    def add_args(self, parser: argparse.ArgumentParser) -> None:
         group = parser.add_argument_group('Query arguments')
         group.add_argument('--lat', type=float, required=True,
                            help='Latitude of coordinate to look up (in WGS84)')
@@ -152,8 +159,7 @@ class APIReverse:
         _add_api_output_arguments(parser)
 
 
-    @staticmethod
-    def run(args):
+    def run(self, args: NominatimArgs) -> int:
         params = dict(lat=args.lat, lon=args.lon, format=args.format)
         if args.zoom is not None:
             params['zoom'] = args.zoom
@@ -181,8 +187,7 @@ class APILookup:
     https://nominatim.org/release-docs/latest/api/Lookup/
     """
 
-    @staticmethod
-    def add_args(parser):
+    def add_args(self, parser: argparse.ArgumentParser) -> None:
         group = parser.add_argument_group('Query arguments')
         group.add_argument('--id', metavar='OSMID',
                            action='append', required=True, dest='ids',
@@ -191,9 +196,8 @@ class APILookup:
         _add_api_output_arguments(parser)
 
 
-    @staticmethod
-    def run(args):
-        params = dict(osm_ids=','.join(args.ids), format=args.format)
+    def run(self, args: NominatimArgs) -> int:
+        params: Dict[str, object] = dict(osm_ids=','.join(args.ids), format=args.format)
 
         for param, _ in EXTRADATA_PARAMS:
             if getattr(args, param):
@@ -218,8 +222,7 @@ class APIDetails:
     https://nominatim.org/release-docs/latest/api/Details/
     """
 
-    @staticmethod
-    def add_args(parser):
+    def add_args(self, parser: argparse.ArgumentParser) -> None:
         group = parser.add_argument_group('Query arguments')
         objs = group.add_mutually_exclusive_group(required=True)
         objs.add_argument('--node', '-n', type=int,
@@ -240,8 +243,8 @@ class APIDetails:
         group.add_argument('--lang', '--accept-language', metavar='LANGS',
                            help='Preferred language order for presenting search results')
 
-    @staticmethod
-    def run(args):
+
+    def run(self, args: NominatimArgs) -> int:
         if args.node:
             params = dict(osmtype='N', osmid=args.node)
         elif args.way:
@@ -270,12 +273,11 @@ class APIStatus:
     https://nominatim.org/release-docs/latest/api/Status/
     """
 
-    @staticmethod
-    def add_args(parser):
+    def add_args(self, parser: argparse.ArgumentParser) -> None:
         group = parser.add_argument_group('API parameters')
         group.add_argument('--format', default='text', choices=['text', 'json'],
                            help='Format of result')
 
-    @staticmethod
-    def run(args):
+
+    def run(self, args: NominatimArgs) -> int:
         return _run_api('status', args, dict(format=args.format))
index 4e2c23a7baea190798cf4346d562af835e9824d4..c976f394849be1496ca97ba320ea319dc8397ecf 100644 (file)
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# This file is part of Nominatim. (https://nominatim.org)
+#
+# Copyright (C) 2022 by the Nominatim developer community.
+# For a full list of authors see the git log.
 """
 Provides custom functions over command-line arguments.
 """
+from typing import Optional, List, Dict, Any, Sequence, Tuple
+import argparse
 import logging
 from pathlib import Path
 
 from nominatim.errors import UsageError
+from nominatim.config import Configuration
+from nominatim.typing import Protocol
 
 LOG = logging.getLogger()
 
+class Subcommand(Protocol):
+    """
+    Interface to be implemented by classes implementing a CLI subcommand.
+    """
+
+    def add_args(self, parser: argparse.ArgumentParser) -> None:
+        """
+        Fill the given parser for the subcommand with the appropriate
+        parameters.
+        """
+
+    def run(self, args: 'NominatimArgs') -> int:
+        """
+        Run the subcommand with the given parsed arguments.
+        """
+
+
 class NominatimArgs:
     """ Customized namespace class for the nominatim command line tool
         to receive the command-line arguments.
     """
+    # Basic environment set by root program.
+    config: Configuration
+    project_dir: Path
+    module_dir: Path
+    osm2pgsql_path: Path
+    phplib_dir: Path
+    sqllib_dir: Path
+    data_dir: Path
+    config_dir: Path
+    phpcgi_path: Path
+
+    # Global switches
+    version: bool
+    subcommand: Optional[str]
+    command: Subcommand
+
+    # Shared parameters
+    osm2pgsql_cache: Optional[int]
+    socket_timeout: int
+
+    # Arguments added to all subcommands.
+    verbose: int
+    threads: Optional[int]
+
+    # Arguments to 'add-data'
+    file: Optional[str]
+    diff: Optional[str]
+    node: Optional[int]
+    way: Optional[int]
+    relation: Optional[int]
+    tiger_data: Optional[str]
+    use_main_api: bool
+
+    # Arguments to 'admin'
+    warm: bool
+    check_database: bool
+    migrate: bool
+    analyse_indexing: bool
+    target: Optional[str]
+    osm_id: Optional[str]
+    place_id: Optional[int]
+
+    # Arguments to 'import'
+    osm_file: List[str]
+    continue_at: Optional[str]
+    reverse_only: bool
+    no_partitions: bool
+    no_updates: bool
+    offline: bool
+    ignore_errors: bool
+    index_noanalyse: bool
+
+    # Arguments to 'index'
+    boundaries_only: bool
+    no_boundaries: bool
+    minrank: int
+    maxrank: int
+
+    # Arguments to 'export'
+    output_type: str
+    output_format: str
+    output_all_postcodes: bool
+    language: Optional[str]
+    restrict_to_country: Optional[str]
+    restrict_to_osm_node: Optional[int]
+    restrict_to_osm_way: Optional[int]
+    restrict_to_osm_relation: Optional[int]
+
+    # Arguments to 'refresh'
+    postcodes: bool
+    word_tokens: bool
+    word_counts: bool
+    address_levels: bool
+    functions: bool
+    wiki_data: bool
+    importance: bool
+    website: bool
+    diffs: bool
+    enable_debug_statements: bool
+    data_object: Sequence[Tuple[str, int]]
+    data_area: Sequence[Tuple[str, int]]
+
+    # Arguments to 'replication'
+    init: bool
+    update_functions: bool
+    check_for_updates: bool
+    once: bool
+    catch_up: bool
+    do_index: bool
+
+    # Arguments to 'serve'
+    server: str
+
+    # Arguments to 'special-phrases
+    import_from_wiki: bool
+    import_from_csv: Optional[str]
+    no_replace: bool
+
+    # Arguments to all query functions
+    format: str
+    addressdetails: bool
+    extratags: bool
+    namedetails: bool
+    lang: Optional[str]
+    polygon_output: Optional[str]
+    polygon_threshold: Optional[float]
+
+    # Arguments to 'search'
+    query: Optional[str]
+    street: Optional[str]
+    city: Optional[str]
+    county: Optional[str]
+    state: Optional[str]
+    country: Optional[str]
+    postalcode: Optional[str]
+    countrycodes: Optional[str]
+    exclude_place_ids: Optional[str]
+    limit: Optional[int]
+    viewbox: Optional[str]
+    bounded: bool
+    dedupe: bool
+
+    # Arguments to 'reverse'
+    lat: float
+    lon: float
+    zoom: Optional[int]
+
+    # Arguments to 'lookup'
+    ids: Sequence[str]
+
+    # Arguments to 'details'
+    object_class: Optional[str]
+
 
-    def osm2pgsql_options(self, default_cache, default_threads):
+    def osm2pgsql_options(self, default_cache: int,
+                          default_threads: int) -> Dict[str, Any]:
         """ Return the standard osm2pgsql options that can be derived
             from the command line arguments. The resulting dict can be
             further customized and then used in `run_osm2pgsql()`.
@@ -23,7 +184,7 @@ class NominatimArgs:
                     osm2pgsql_style=self.config.get_import_style_file(),
                     threads=self.threads or default_threads,
                     dsn=self.config.get_libpq_dsn(),
-                    flatnode_file=str(self.config.get_path('FLATNODE_FILE')),
+                    flatnode_file=str(self.config.get_path('FLATNODE_FILE') or ''),
                     tablespaces=dict(slim_data=self.config.TABLESPACE_OSM_DATA,
                                      slim_index=self.config.TABLESPACE_OSM_INDEX,
                                      main_data=self.config.TABLESPACE_PLACE_DATA,
@@ -32,7 +193,7 @@ class NominatimArgs:
                    )
 
 
-    def get_osm_file_list(self):
+    def get_osm_file_list(self) -> Optional[List[Path]]:
         """ Return the --osm-file argument as a list of Paths or None
             if no argument was given. The function also checks if the files
             exist and raises a UsageError if one cannot be found.
index 41dd610ed67f8f2246cda918f94f4558895730e1..5dfdd255c8736768713ee3f3532ffb3bf2b3dbb0 100644 (file)
@@ -1,8 +1,16 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# This file is part of Nominatim. (https://nominatim.org)
+#
+# Copyright (C) 2022 by the Nominatim developer community.
+# For a full list of authors see the git log.
 """
 Implementation of the 'freeze' subcommand.
 """
+import argparse
 
 from nominatim.db.connection import connect
+from nominatim.clicmd.args import NominatimArgs
 
 # Do not repeat documentation of subcommand classes.
 # pylint: disable=C0111
@@ -21,16 +29,15 @@ class SetupFreeze:
     This command has the same effect as the `--no-updates` option for imports.
     """
 
-    @staticmethod
-    def add_args(parser):
+    def add_args(self, parser: argparse.ArgumentParser) -> None:
         pass # No options
 
-    @staticmethod
-    def run(args):
+
+    def run(self, args: NominatimArgs) -> int:
         from ..tools import freeze
 
         with connect(args.config.get_libpq_dsn()) as conn:
             freeze.drop_update_tables(conn)
-        freeze.drop_flatnode_file(str(args.config.get_path('FLATNODE_FILE')))
+        freeze.drop_flatnode_file(args.config.get_path('FLATNODE_FILE'))
 
         return 0
index c38dfb1c6114090ed9310d8d6a3d138179396c3b..16b5311c79f5764c2f9cde048b5635e0a1619e03 100644 (file)
@@ -1,10 +1,19 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# This file is part of Nominatim. (https://nominatim.org)
+#
+# Copyright (C) 2022 by the Nominatim developer community.
+# For a full list of authors see the git log.
 """
 Implementation of the 'index' subcommand.
 """
+import argparse
+
 import psutil
 
 from nominatim.db import status
 from nominatim.db.connection import connect
+from nominatim.clicmd.args import NominatimArgs
 
 # Do not repeat documentation of subcommand classes.
 # pylint: disable=C0111
@@ -22,8 +31,7 @@ class UpdateIndex:
     of indexing. For other cases, this function allows to run indexing manually.
     """
 
-    @staticmethod
-    def add_args(parser):
+    def add_args(self, parser: argparse.ArgumentParser) -> None:
         group = parser.add_argument_group('Filter arguments')
         group.add_argument('--boundaries-only', action='store_true',
                            help="""Index only administrative boundaries.""")
@@ -34,8 +42,8 @@ class UpdateIndex:
         group.add_argument('--maxrank', '-R', type=int, metavar='RANK', default=30,
                            help='Maximum/finishing rank')
 
-    @staticmethod
-    def run(args):
+
+    def run(self, args: NominatimArgs) -> int:
         from ..indexer.indexer import Indexer
         from ..tokenizer import factory as tokenizer_factory
 
index 82a61f54e56df3c9497aee4ef49e0150323c6d93..dce28d983a1365656c43b3e57bc79eb20c8befc8 100644 (file)
@@ -1,10 +1,21 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# This file is part of Nominatim. (https://nominatim.org)
+#
+# Copyright (C) 2022 by the Nominatim developer community.
+# For a full list of authors see the git log.
 """
 Implementation of 'refresh' subcommand.
 """
+from typing import Tuple, Optional
+import argparse
 import logging
 from pathlib import Path
 
+from nominatim.config import Configuration
 from nominatim.db.connection import connect
+from nominatim.tokenizer.base import AbstractTokenizer
+from nominatim.clicmd.args import NominatimArgs
 
 # Do not repeat documentation of subcommand classes.
 # pylint: disable=C0111
@@ -13,6 +24,16 @@ from nominatim.db.connection import connect
 
 LOG = logging.getLogger()
 
+def _parse_osm_object(obj: str) -> Tuple[str, int]:
+    """ Parse the given argument into a tuple of OSM type and ID.
+        Raises an ArgumentError if the format is not recognized.
+    """
+    if len(obj) < 2 or obj[0].lower() not in 'nrw' or not obj[1:].isdigit():
+        raise argparse.ArgumentTypeError("Cannot parse OSM ID. Expect format: [N|W|R]<id>.")
+
+    return (obj[0].upper(), int(obj[1:]))
+
+
 class UpdateRefresh:
     """\
     Recompute auxiliary data used by the indexing process.
@@ -25,14 +46,15 @@ class UpdateRefresh:
     Warning: the 'update' command must not be run in parallel with other update
              commands like 'replication' or 'add-data'.
     """
-    def __init__(self):
-        self.tokenizer = None
+    def __init__(self) -> None:
+        self.tokenizer: Optional[AbstractTokenizer] = None
 
-    @staticmethod
-    def add_args(parser):
+    def add_args(self, parser: argparse.ArgumentParser) -> None:
         group = parser.add_argument_group('Data arguments')
         group.add_argument('--postcodes', action='store_true',
                            help='Update postcode centroid table')
+        group.add_argument('--word-tokens', action='store_true',
+                           help='Clean up search terms')
         group.add_argument('--word-counts', action='store_true',
                            help='Compute frequency of full-word search terms')
         group.add_argument('--address-levels', action='store_true',
@@ -45,6 +67,15 @@ class UpdateRefresh:
                            help='Recompute place importances (expensive!)')
         group.add_argument('--website', action='store_true',
                            help='Refresh the directory that serves the scripts for the web API')
+        group.add_argument('--data-object', action='append',
+                           type=_parse_osm_object, metavar='OBJECT',
+                           help='Mark the given OSM object as requiring an update'
+                                ' (format: [NWR]<id>)')
+        group.add_argument('--data-area', action='append',
+                           type=_parse_osm_object, metavar='OBJECT',
+                           help='Mark the area around the given OSM object as requiring an update'
+                                ' (format: [NWR]<id>)')
+
         group = parser.add_argument_group('Arguments for function refresh')
         group.add_argument('--no-diff-updates', action='store_false', dest='diffs',
                            help='Do not enable code for propagating updates')
@@ -52,7 +83,7 @@ class UpdateRefresh:
                            help='Enable debug warning statements in functions')
 
 
-    def run(self, args):
+    def run(self, args: NominatimArgs) -> int: #pylint: disable=too-many-branches
         from ..tools import refresh, postcodes
         from ..indexer.indexer import Indexer
 
@@ -70,6 +101,11 @@ class UpdateRefresh:
                 LOG.error("The place table doesn't exist. "
                           "Postcode updates on a frozen database is not possible.")
 
+        if args.word_tokens:
+            LOG.warning('Updating word tokens')
+            tokenizer = self._get_tokenizer(args.config)
+            tokenizer.update_word_tokens()
+
         if args.word_counts:
             LOG.warning('Recompute word statistics')
             self._get_tokenizer(args.config).update_statistics()
@@ -104,13 +140,25 @@ class UpdateRefresh:
         if args.website:
             webdir = args.project_dir / 'website'
             LOG.warning('Setting up website directory at %s', webdir)
+            # This is a little bit hacky: call the tokenizer setup, so that
+            # the tokenizer directory gets repopulated as well, in case it
+            # wasn't there yet.
+            self._get_tokenizer(args.config)
             with connect(args.config.get_libpq_dsn()) as conn:
                 refresh.setup_website(webdir, args.config, conn)
 
+        if args.data_object or args.data_area:
+            with connect(args.config.get_libpq_dsn()) as conn:
+                for obj in args.data_object or []:
+                    refresh.invalidate_osm_object(*obj, conn, recursive=False)
+                for obj in args.data_area or []:
+                    refresh.invalidate_osm_object(*obj, conn, recursive=True)
+                conn.commit()
+
         return 0
 
 
-    def _get_tokenizer(self, config):
+    def _get_tokenizer(self, config: Configuration) -> AbstractTokenizer:
         if self.tokenizer is None:
             from ..tokenizer import factory as tokenizer_factory
 
index 7ad82c4fff6190667a63fbcc4c073de7a3e4485a..2d6396a1d13e248d85846e8ce167cb25b151a2f0 100644 (file)
@@ -1,6 +1,14 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# This file is part of Nominatim. (https://nominatim.org)
+#
+# Copyright (C) 2022 by the Nominatim developer community.
+# For a full list of authors see the git log.
 """
 Implementation of the 'replication' sub-command.
 """
+from typing import Optional
+import argparse
 import datetime as dt
 import logging
 import socket
@@ -9,13 +17,14 @@ import time
 from nominatim.db import status
 from nominatim.db.connection import connect
 from nominatim.errors import UsageError
+from nominatim.clicmd.args import NominatimArgs
 
 LOG = logging.getLogger()
 
 # Do not repeat documentation of subcommand classes.
 # pylint: disable=C0111
 # Using non-top-level imports to make pyosmium optional for replication only.
-# pylint: disable=E0012,C0415
+# pylint: disable=C0415
 
 class UpdateReplication:
     """\
@@ -35,8 +44,7 @@ class UpdateReplication:
     downloads and imports the next batch of updates.
     """
 
-    @staticmethod
-    def add_args(parser):
+    def add_args(self, parser: argparse.ArgumentParser) -> None:
         group = parser.add_argument_group('Arguments for initialisation')
         group.add_argument('--init', action='store_true',
                            help='Initialise the update process')
@@ -62,8 +70,8 @@ class UpdateReplication:
         group.add_argument('--socket-timeout', dest='socket_timeout', type=int, default=60,
                            help='Set timeout for file downloads')
 
-    @staticmethod
-    def _init_replication(args):
+
+    def _init_replication(self, args: NominatimArgs) -> int:
         from ..tools import replication, refresh
 
         LOG.warning("Initialising replication updates")
@@ -75,29 +83,28 @@ class UpdateReplication:
         return 0
 
 
-    @staticmethod
-    def _check_for_updates(args):
+    def _check_for_updates(self, args: NominatimArgs) -> int:
         from ..tools import replication
 
         with connect(args.config.get_libpq_dsn()) as conn:
             return replication.check_for_updates(conn, base_url=args.config.REPLICATION_URL)
 
-    @staticmethod
-    def _report_update(batchdate, start_import, start_index):
-        def round_time(delta):
+
+    def _report_update(self, batchdate: dt.datetime,
+                       start_import: dt.datetime,
+                       start_index: Optional[dt.datetime]) -> None:
+        def round_time(delta: dt.timedelta) -> dt.timedelta:
             return dt.timedelta(seconds=int(delta.total_seconds()))
 
         end = dt.datetime.now(dt.timezone.utc)
         LOG.warning("Update completed. Import: %s. %sTotal: %s. Remaining backlog: %s.",
                     round_time((start_index or end) - start_import),
-                    "Indexing: {} ".format(round_time(end - start_index))
-                    if start_index else '',
+                    f"Indexing: {round_time(end - start_index)} " if start_index else '',
                     round_time(end - start_import),
                     round_time(end - batchdate))
 
 
-    @staticmethod
-    def _compute_update_interval(args):
+    def _compute_update_interval(self, args: NominatimArgs) -> int:
         if args.catch_up:
             return 0
 
@@ -114,13 +121,13 @@ class UpdateReplication:
         return update_interval
 
 
-    @staticmethod
-    def _update(args):
+    def _update(self, args: NominatimArgs) -> None:
+        # pylint: disable=too-many-locals
         from ..tools import replication
         from ..indexer.indexer import Indexer
         from ..tokenizer import factory as tokenizer_factory
 
-        update_interval = UpdateReplication._compute_update_interval(args)
+        update_interval = self._compute_update_interval(args)
 
         params = args.osm2pgsql_options(default_cache=2000, default_threads=1)
         params.update(base_url=args.config.REPLICATION_URL,
@@ -164,7 +171,8 @@ class UpdateReplication:
                     indexer.index_full(analyse=False)
 
             if LOG.isEnabledFor(logging.WARNING):
-                UpdateReplication._report_update(batchdate, start, index_start)
+                assert batchdate is not None
+                self._report_update(batchdate, start, index_start)
 
             if args.once or (args.catch_up and state is replication.UpdateState.NO_CHANGES):
                 break
@@ -174,15 +182,14 @@ class UpdateReplication:
                 time.sleep(recheck_interval)
 
 
-    @staticmethod
-    def run(args):
+    def run(self, args: NominatimArgs) -> int:
         socket.setdefaulttimeout(args.socket_timeout)
 
         if args.init:
-            return UpdateReplication._init_replication(args)
+            return self._init_replication(args)
 
         if args.check_for_updates:
-            return UpdateReplication._check_for_updates(args)
+            return self._check_for_updates(args)
 
-        UpdateReplication._update(args)
+        self._update(args)
         return 0
index 9a2a73de0d5aab3e88a253fd28778ded8ba0ab22..6ffa7afb8babb91c58d7f40c0af16cfbb32f110d 100644 (file)
@@ -1,19 +1,31 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# This file is part of Nominatim. (https://nominatim.org)
+#
+# Copyright (C) 2022 by the Nominatim developer community.
+# For a full list of authors see the git log.
 """
 Implementation of the 'import' subcommand.
 """
+from typing import Optional
+import argparse
 import logging
 from pathlib import Path
 
 import psutil
 
-from nominatim.db.connection import connect
+from nominatim.config import Configuration
+from nominatim.db.connection import connect, Connection
 from nominatim.db import status, properties
-from nominatim.version import NOMINATIM_VERSION
+from nominatim.tokenizer.base import AbstractTokenizer
+from nominatim.version import version_str
+from nominatim.clicmd.args import NominatimArgs
+from nominatim.errors import UsageError
 
 # Do not repeat documentation of subcommand classes.
 # pylint: disable=C0111
 # Using non-top-level imports to avoid eventually unused imports.
-# pylint: disable=E0012,C0415
+# pylint: disable=C0415
 
 LOG = logging.getLogger()
 
@@ -26,43 +38,46 @@ class SetupAll:
     needs superuser rights on the database.
     """
 
-    @staticmethod
-    def add_args(parser):
+    def add_args(self, parser: argparse.ArgumentParser) -> None:
         group_name = parser.add_argument_group('Required arguments')
-        group = group_name.add_mutually_exclusive_group(required=True)
-        group.add_argument('--osm-file', metavar='FILE', action='append',
+        group1 = group_name.add_mutually_exclusive_group(required=True)
+        group1.add_argument('--osm-file', metavar='FILE', action='append',
                            help='OSM file to be imported'
                                 ' (repeat for importing multiple files)')
-        group.add_argument('--continue', dest='continue_at',
+        group1.add_argument('--continue', dest='continue_at',
                            choices=['load-data', 'indexing', 'db-postprocess'],
                            help='Continue an import that was interrupted')
-        group = parser.add_argument_group('Optional arguments')
-        group.add_argument('--osm2pgsql-cache', metavar='SIZE', type=int,
+        group2 = parser.add_argument_group('Optional arguments')
+        group2.add_argument('--osm2pgsql-cache', metavar='SIZE', type=int,
                            help='Size of cache to be used by osm2pgsql (in MB)')
-        group.add_argument('--reverse-only', action='store_true',
+        group2.add_argument('--reverse-only', action='store_true',
                            help='Do not create tables and indexes for searching')
-        group.add_argument('--no-partitions', action='store_true',
+        group2.add_argument('--no-partitions', action='store_true',
                            help=("Do not partition search indices "
                                  "(speeds up import of single country extracts)"))
-        group.add_argument('--no-updates', action='store_true',
+        group2.add_argument('--no-updates', action='store_true',
                            help="Do not keep tables that are only needed for "
                                 "updating the database later")
-        group = parser.add_argument_group('Expert options')
-        group.add_argument('--ignore-errors', action='store_true',
+        group2.add_argument('--offline', action='store_true',
+                           help="Do not attempt to load any additional data from the internet")
+        group3 = parser.add_argument_group('Expert options')
+        group3.add_argument('--ignore-errors', action='store_true',
                            help='Continue import even when errors in SQL are present')
-        group.add_argument('--index-noanalyse', action='store_true',
+        group3.add_argument('--index-noanalyse', action='store_true',
                            help='Do not perform analyse operations during index (expert only)')
 
 
-    @staticmethod
-    def run(args):
-        from ..tools import database_import, refresh, postcodes, freeze, country_info
+    def run(self, args: NominatimArgs) -> int: # pylint: disable=too-many-statements
+        from ..data import country_info
+        from ..tools import database_import, refresh, postcodes, freeze
         from ..indexer.indexer import Indexer
 
         country_info.setup_country_config(args.config)
 
         if args.continue_at is None:
             files = args.get_osm_file_list()
+            if not files:
+                raise UsageError("No input files (use --osm-file).")
 
             LOG.warning('Creating database')
             database_import.setup_database_skeleton(args.config.get_libpq_dsn(),
@@ -79,7 +94,7 @@ class SetupAll:
                                             drop=args.no_updates,
                                             ignore_errors=args.ignore_errors)
 
-            SetupAll._setup_tables(args.config, args.reverse_only)
+            self._setup_tables(args.config, args.reverse_only)
 
             LOG.warning('Importing wikipedia importance data')
             data_path = Path(args.config.WIKIPEDIA_DATA_PATH or args.project_dir)
@@ -98,7 +113,7 @@ class SetupAll:
                                       args.threads or psutil.cpu_count() or 1)
 
         LOG.warning("Setting up tokenizer")
-        tokenizer = SetupAll._get_tokenizer(args.continue_at, args.config)
+        tokenizer = self._get_tokenizer(args.continue_at, args.config)
 
         if args.continue_at is None or args.continue_at == 'load-data':
             LOG.warning('Calculate postcodes')
@@ -108,7 +123,7 @@ class SetupAll:
         if args.continue_at is None or args.continue_at in ('load-data', 'indexing'):
             if args.continue_at is not None and args.continue_at != 'load-data':
                 with connect(args.config.get_libpq_dsn()) as conn:
-                    SetupAll._create_pending_index(conn, args.config.TABLESPACE_ADDRESS_INDEX)
+                    self._create_pending_index(conn, args.config.TABLESPACE_ADDRESS_INDEX)
             LOG.warning('Indexing places')
             indexer = Indexer(args.config.get_libpq_dsn(), tokenizer,
                               args.threads or psutil.cpu_count() or 1)
@@ -120,7 +135,7 @@ class SetupAll:
                                                   drop=args.no_updates)
             LOG.warning('Create search index for default country names.')
             country_info.create_country_names(conn, tokenizer,
-                                              args.config.LANGUAGES)
+                                              args.config.get_str_list('LANGUAGES'))
             if args.no_updates:
                 freeze.drop_update_tables(conn)
         tokenizer.finalize_import(args.config)
@@ -133,13 +148,12 @@ class SetupAll:
         with connect(args.config.get_libpq_dsn()) as conn:
             refresh.setup_website(webdir, args.config, conn)
 
-        SetupAll._set_database_date(args.config.get_libpq_dsn())
+        self._finalize_database(args.config.get_libpq_dsn(), args.offline)
 
         return 0
 
 
-    @staticmethod
-    def _setup_tables(config, reverse_only):
+    def _setup_tables(self, config: Configuration, reverse_only: bool) -> None:
         """ Set up the basic database layout: tables, indexes and functions.
         """
         from ..tools import database_import, refresh
@@ -160,8 +174,8 @@ class SetupAll:
             refresh.create_functions(conn, config, False, False)
 
 
-    @staticmethod
-    def _get_tokenizer(continue_at, config):
+    def _get_tokenizer(self, continue_at: Optional[str],
+                       config: Configuration) -> AbstractTokenizer:
         """ Set up a new tokenizer or load an already initialised one.
         """
         from ..tokenizer import factory as tokenizer_factory
@@ -173,8 +187,8 @@ class SetupAll:
         # just load the tokenizer
         return tokenizer_factory.get_tokenizer_for_db(config)
 
-    @staticmethod
-    def _create_pending_index(conn, tablespace):
+
+    def _create_pending_index(self, conn: Connection, tablespace: str) -> None:
         """ Add a supporting index for finding places still to be indexed.
 
             This index is normally created at the end of the import process
@@ -188,24 +202,23 @@ class SetupAll:
             LOG.warning('Creating support index')
             if tablespace:
                 tablespace = 'TABLESPACE ' + tablespace
-            cur.execute("""CREATE INDEX idx_placex_pendingsector
-                           ON placex USING BTREE (rank_address,geometry_sector)
-                           {} WHERE indexed_status > 0
-                        """.format(tablespace))
+            cur.execute(f"""CREATE INDEX idx_placex_pendingsector
+                            ON placex USING BTREE (rank_address,geometry_sector)
+                            {tablespace} WHERE indexed_status > 0
+                         """)
         conn.commit()
 
 
-    @staticmethod
-    def _set_database_date(dsn):
+    def _finalize_database(self, dsn: str, offline: bool) -> None:
         """ Determine the database date and set the status accordingly.
         """
         with connect(dsn) as conn:
-            try:
-                dbdate = status.compute_database_date(conn)
-                status.set_status(conn, dbdate)
-                LOG.info('Database is at %s.', dbdate)
-            except Exception as exc: # pylint: disable=broad-except
-                LOG.error('Cannot determine date of database: %s', exc)
-
-            properties.set_property(conn, 'database_version',
-                                    '{0[0]}.{0[1]}.{0[2]}-{0[3]}'.format(NOMINATIM_VERSION))
+            if not offline:
+                try:
+                    dbdate = status.compute_database_date(conn)
+                    status.set_status(conn, dbdate)
+                    LOG.info('Database is at %s.', dbdate)
+                except Exception as exc: # pylint: disable=broad-except
+                    LOG.error('Cannot determine date of database: %s', exc)
+
+            properties.set_property(conn, 'database_version', version_str())
index a4ef89a4a3ba14c3c105ba33a4317767a2fe8e7e..beac0c84f6ffcbaf57434e3ea59c6e2c1681834e 100644 (file)
@@ -1,13 +1,22 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# This file is part of Nominatim. (https://nominatim.org)
+#
+# Copyright (C) 2022 by the Nominatim developer community.
+# For a full list of authors see the git log.
 """
     Implementation of the 'special-phrases' command.
 """
+import argparse
 import logging
 from pathlib import Path
+
 from nominatim.errors import UsageError
 from nominatim.db.connection import connect
-from nominatim.tools.special_phrases.sp_importer import SPImporter
+from nominatim.tools.special_phrases.sp_importer import SPImporter, SpecialPhraseLoader
 from nominatim.tools.special_phrases.sp_wiki_loader import SPWikiLoader
 from nominatim.tools.special_phrases.sp_csv_loader import SPCsvLoader
+from nominatim.clicmd.args import NominatimArgs
 
 LOG = logging.getLogger()
 
@@ -43,8 +52,8 @@ class ImportSpecialPhrases:
     with custom rules into the project directory or by using the `--config`
     option to point to another configuration file.
     """
-    @staticmethod
-    def add_args(parser):
+
+    def add_args(self, parser: argparse.ArgumentParser) -> None:
         group = parser.add_argument_group('Input arguments')
         group.add_argument('--import-from-wiki', action='store_true',
                            help='Import special phrases from the OSM wiki to the database')
@@ -52,26 +61,24 @@ class ImportSpecialPhrases:
                            help='Import special phrases from a CSV file')
         group.add_argument('--no-replace', action='store_true',
                            help='Keep the old phrases and only add the new ones')
-        group.add_argument('--config', action='store',
-                           help='Configuration file for black/white listing '
-                                '(default: phrase-settings.json)')
 
-    @staticmethod
-    def run(args):
+
+    def run(self, args: NominatimArgs) -> int:
+
         if args.import_from_wiki:
-            ImportSpecialPhrases.start_import(args, SPWikiLoader(args.config))
+            self.start_import(args, SPWikiLoader(args.config))
 
         if args.import_from_csv:
             if not Path(args.import_from_csv).is_file():
                 LOG.fatal("CSV file '%s' does not exist.", args.import_from_csv)
                 raise UsageError('Cannot access file.')
 
-            ImportSpecialPhrases.start_import(args, SPCsvLoader(args.import_from_csv))
+            self.start_import(args, SPCsvLoader(args.import_from_csv))
 
         return 0
 
-    @staticmethod
-    def start_import(args, loader):
+
+    def start_import(self, args: NominatimArgs, loader: SpecialPhraseLoader) -> None:
         """
             Create the SPImporter object containing the right
             sp loader and then start the import of special phrases.
index bc3556f3cdf101f722df036730eb7311d88c6474..7502aff703ebaaf4610ddc4b591d212957c1229c 100644 (file)
@@ -1,20 +1,30 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# This file is part of Nominatim. (https://nominatim.org)
+#
+# Copyright (C) 2022 by the Nominatim developer community.
+# For a full list of authors see the git log.
 """
 Nominatim configuration accessor.
 """
+from typing import Dict, Any, List, Mapping, Optional
+import importlib.util
 import logging
 import os
+import sys
 from pathlib import Path
 import json
 import yaml
 
 from dotenv import dotenv_values
 
+from nominatim.typing import StrPath
 from nominatim.errors import UsageError
 
 LOG = logging.getLogger()
+CONFIG_CACHE : Dict[str, Any] = {}
 
-
-def flatten_config_list(content, section=''):
+def flatten_config_list(content: Any, section: str = '') -> List[Any]:
     """ Flatten YAML configuration lists that contain include sections
         which are lists themselves.
     """
@@ -48,7 +58,8 @@ class Configuration:
         avoid conflicts with other environment variables.
     """
 
-    def __init__(self, project_dir, config_dir, environ=None):
+    def __init__(self, project_dir: Path, config_dir: Path,
+                 environ: Optional[Mapping[str, str]] = None) -> None:
         self.environ = environ or os.environ
         self.project_dir = project_dir
         self.config_dir = config_dir
@@ -57,66 +68,86 @@ class Configuration:
             self._config.update(dotenv_values(str((project_dir / '.env').resolve())))
 
         class _LibDirs:
-            pass
+            module: Path
+            osm2pgsql: Path
+            php: Path
+            sql: Path
+            data: Path
 
         self.lib_dir = _LibDirs()
+        self._private_plugins: Dict[str, object] = {}
+
 
-    def set_libdirs(self, **kwargs):
+    def set_libdirs(self, **kwargs: StrPath) -> None:
         """ Set paths to library functions and data.
         """
         for key, value in kwargs.items():
             setattr(self.lib_dir, key, Path(value).resolve())
 
-    def __getattr__(self, name):
+
+    def __getattr__(self, name: str) -> str:
         name = 'NOMINATIM_' + name
 
         if name in self.environ:
             return self.environ[name]
 
-        return self._config[name]
+        return self._config[name] or ''
 
-    def get_bool(self, name):
+
+    def get_bool(self, name: str) -> bool:
         """ Return the given configuration parameter as a boolean.
             Values of '1', 'yes' and 'true' are accepted as truthy values,
             everything else is interpreted as false.
         """
-        return self.__getattr__(name).lower() in ('1', 'yes', 'true')
+        return getattr(self, name).lower() in ('1', 'yes', 'true')
 
 
-    def get_int(self, name):
+    def get_int(self, name: str) -> int:
         """ Return the given configuration parameter as an int.
         """
         try:
-            return int(self.__getattr__(name))
+            return int(getattr(self, name))
         except ValueError as exp:
             LOG.fatal("Invalid setting NOMINATIM_%s. Needs to be a number.", name)
             raise UsageError("Configuration error.") from exp
 
 
-    def get_path(self, name):
+    def get_str_list(self, name: str) -> Optional[List[str]]:
+        """ Return the given configuration parameter as a list of strings.
+            The values are assumed to be given as a comma-sparated list and
+            will be stripped before returning them. On empty values None
+            is returned.
+        """
+        raw = getattr(self, name)
+
+        return [v.strip() for v in raw.split(',')] if raw else None
+
+
+    def get_path(self, name: str) -> Optional[Path]:
         """ Return the given configuration parameter as a Path.
             If a relative path is configured, then the function converts this
             into an absolute path with the project directory as root path.
-            If the configuration is unset, a falsy value is returned.
+            If the configuration is unset, None is returned.
         """
-        value = self.__getattr__(name)
-        if value:
-            value = Path(value)
+        value = getattr(self, name)
+        if not value:
+            return None
+
+        cfgpath = Path(value)
 
-            if not value.is_absolute():
-                value = self.project_dir / value
+        if not cfgpath.is_absolute():
+            cfgpath = self.project_dir / cfgpath
 
-            value = value.resolve()
+        return cfgpath.resolve()
 
-        return value
 
-    def get_libpq_dsn(self):
+    def get_libpq_dsn(self) -> str:
         """ Get configured database DSN converted into the key/value format
             understood by libpq and psycopg.
         """
         dsn = self.DATABASE_DSN
 
-        def quote_param(param):
+        def quote_param(param: str) -> str:
             key, val = param.split('=')
             val = val.replace('\\', '\\\\').replace("'", "\\'")
             if ' ' in val:
@@ -130,20 +161,20 @@ class Configuration:
         return dsn
 
 
-    def get_import_style_file(self):
+    def get_import_style_file(self) -> Path:
         """ Return the import style file as a path object. Translates the
             name of the standard styles automatically into a file in the
             config style.
         """
-        style = self.__getattr__('IMPORT_STYLE')
+        style = getattr(self, 'IMPORT_STYLE')
 
         if style in ('admin', 'street', 'address', 'full', 'extratags'):
-            return self.config_dir / 'import-{}.style'.format(style)
+            return self.config_dir / f'import-{style}.style'
 
         return self.find_config_file('', 'IMPORT_STYLE')
 
 
-    def get_os_env(self):
+    def get_os_env(self) -> Dict[str, Optional[str]]:
         """ Return a copy of the OS environment with the Nominatim configuration
             merged in.
         """
@@ -153,10 +184,11 @@ class Configuration:
         return env
 
 
-    def load_sub_configuration(self, filename, config=None):
+    def load_sub_configuration(self, filename: StrPath,
+                               config: Optional[str] = None) -> Any:
         """ Load additional configuration from a file. `filename` is the name
             of the configuration file. The file is first searched in the
-            project directory and then in the global settings dirctory.
+            project directory and then in the global settings directory.
 
             If `config` is set, then the name of the configuration file can
             be additionally given through a .env configuration option. When
@@ -175,26 +207,75 @@ class Configuration:
         """
         configfile = self.find_config_file(filename, config)
 
+        if str(configfile) in CONFIG_CACHE:
+            return CONFIG_CACHE[str(configfile)]
+
         if configfile.suffix in ('.yaml', '.yml'):
-            return self._load_from_yaml(configfile)
+            result = self._load_from_yaml(configfile)
+        elif configfile.suffix == '.json':
+            with configfile.open('r', encoding='utf-8') as cfg:
+                result = json.load(cfg)
+        else:
+            raise UsageError(f"Config file '{configfile}' has unknown format.")
+
+        CONFIG_CACHE[str(configfile)] = result
+        return result
+
+
+    def load_plugin_module(self, module_name: str, internal_path: str) -> Any:
+        """ Load a Python module as a plugin.
+
+            The module_name may have three variants:
+
+            * A name without any '.' is assumed to be an internal module
+              and will be searched relative to `internal_path`.
+            * If the name ends in `.py`, module_name is assumed to be a
+              file name relative to the project directory.
+            * Any other name is assumed to be an absolute module name.
+
+            In either of the variants the module name must start with a letter.
+        """
+        if not module_name or not module_name[0].isidentifier():
+            raise UsageError(f'Invalid module name {module_name}')
+
+        if '.' not in module_name:
+            module_name = module_name.replace('-', '_')
+            full_module = f'{internal_path}.{module_name}'
+            return sys.modules.get(full_module) or importlib.import_module(full_module)
+
+        if module_name.endswith('.py'):
+            if self.project_dir is None or not (self.project_dir / module_name).exists():
+                raise UsageError(f"Cannot find module '{module_name}' in project directory.")
+
+            if module_name in self._private_plugins:
+                return self._private_plugins[module_name]
+
+            file_path = str(self.project_dir / module_name)
+            spec = importlib.util.spec_from_file_location(module_name, file_path)
+            if spec:
+                module = importlib.util.module_from_spec(spec)
+                # Do not add to global modules because there is no standard
+                # module name that Python can resolve.
+                self._private_plugins[module_name] = module
+                assert spec.loader is not None
+                spec.loader.exec_module(module)
 
-        if configfile.suffix == '.json':
-            with configfile.open('r') as cfg:
-                return json.load(cfg)
+                return module
 
-        raise UsageError(f"Config file '{configfile}' has unknown format.")
+        return sys.modules.get(module_name) or importlib.import_module(module_name)
 
 
-    def find_config_file(self, filename, config=None):
+    def find_config_file(self, filename: StrPath,
+                         config: Optional[str] = None) -> Path:
         """ Resolve the location of a configuration file given a filename and
             an optional configuration option with the file name.
             Raises a UsageError when the file cannot be found or is not
             a regular file.
         """
         if config is not None:
-            cfg_filename = self.__getattr__(config)
-            if cfg_filename:
-                cfg_filename = Path(cfg_filename)
+            cfg_value = getattr(self, config)
+            if cfg_value:
+                cfg_filename = Path(cfg_value)
 
                 if cfg_filename.is_absolute():
                     cfg_filename = cfg_filename.resolve()
@@ -218,7 +299,7 @@ class Configuration:
         raise UsageError("Config file not found.")
 
 
-    def _load_from_yaml(self, cfgfile):
+    def _load_from_yaml(self, cfgfile: Path) -> Any:
         """ Load a YAML configuration file. This installs a special handler that
             allows to include other YAML files using the '!include' operator.
         """
@@ -227,11 +308,11 @@ class Configuration:
         return yaml.safe_load(cfgfile.read_text(encoding='utf-8'))
 
 
-    def _yaml_include_representer(self, loader, node):
+    def _yaml_include_representer(self, loader: Any, node: yaml.Node) -> Any:
         """ Handler for the '!include' operator in YAML files.
 
             When the filename is relative, then the file is first searched in the
-            project directory and then in the global settings dirctory.
+            project directory and then in the global settings directory.
         """
         fname = loader.construct_scalar(node)
 
diff --git a/nominatim/data/__init__.py b/nominatim/data/__init__.py
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/nominatim/data/country_info.py b/nominatim/data/country_info.py
new file mode 100644 (file)
index 0000000..eb0190b
--- /dev/null
@@ -0,0 +1,175 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# This file is part of Nominatim. (https://nominatim.org)
+#
+# Copyright (C) 2022 by the Nominatim developer community.
+# For a full list of authors see the git log.
+"""
+Functions for importing and managing static country information.
+"""
+from typing import Dict, Any, Iterable, Tuple, Optional, Container, overload
+from pathlib import Path
+import psycopg2.extras
+
+from nominatim.db import utils as db_utils
+from nominatim.db.connection import connect, Connection
+from nominatim.errors import UsageError
+from nominatim.config import Configuration
+from nominatim.tokenizer.base import AbstractTokenizer
+
+def _flatten_name_list(names: Any) -> Dict[str, str]:
+    if names is None:
+        return {}
+
+    if not isinstance(names, dict):
+        raise UsageError("Expected key-value list for names in country_settings.py")
+
+    flat = {}
+    for prefix, remain in names.items():
+        if isinstance(remain, str):
+            flat[prefix] = remain
+        elif not isinstance(remain, dict):
+            raise UsageError("Entries in names must be key-value lists.")
+        else:
+            for suffix, name in remain.items():
+                if suffix == 'default':
+                    flat[prefix] = name
+                else:
+                    flat[f'{prefix}:{suffix}'] = name
+
+    return flat
+
+
+
+class _CountryInfo:
+    """ Caches country-specific properties from the configuration file.
+    """
+
+    def __init__(self) -> None:
+        self._info: Dict[str, Dict[str, Any]] = {}
+
+
+    def load(self, config: Configuration) -> None:
+        """ Load the country properties from the configuration files,
+            if they are not loaded yet.
+        """
+        if not self._info:
+            self._info = config.load_sub_configuration('country_settings.yaml')
+            for prop in self._info.values():
+                # Convert languages into a list for simpler handling.
+                if 'languages' not in prop:
+                    prop['languages'] = []
+                elif not isinstance(prop['languages'], list):
+                    prop['languages'] = [x.strip()
+                                         for x in prop['languages'].split(',')]
+                prop['names'] = _flatten_name_list(prop.get('names'))
+
+
+    def items(self) -> Iterable[Tuple[str, Dict[str, Any]]]:
+        """ Return tuples of (country_code, property dict) as iterable.
+        """
+        return self._info.items()
+
+    def get(self, country_code: str) -> Dict[str, Any]:
+        """ Get country information for the country with the given country code.
+        """
+        return self._info.get(country_code, {})
+
+
+
+_COUNTRY_INFO = _CountryInfo()
+
+
+def setup_country_config(config: Configuration) -> None:
+    """ Load country properties from the configuration file.
+        Needs to be called before using any other functions in this
+        file.
+    """
+    _COUNTRY_INFO.load(config)
+
+@overload
+def iterate() -> Iterable[Tuple[str, Dict[str, Any]]]:
+    ...
+
+@overload
+def iterate(prop: str) -> Iterable[Tuple[str, Any]]:
+    ...
+
+def iterate(prop: Optional[str] = None) -> Iterable[Tuple[str, Dict[str, Any]]]:
+    """ Iterate over country code and properties.
+
+        When `prop` is None, all countries are returned with their complete
+        set of properties.
+
+        If `prop` is given, then only countries are returned where the
+        given property is set. The second item of the tuple contains only
+        the content of the given property.
+    """
+    if prop is None:
+        return _COUNTRY_INFO.items()
+
+    return ((c, p[prop]) for c, p in _COUNTRY_INFO.items() if prop in p)
+
+
+def setup_country_tables(dsn: str, sql_dir: Path, ignore_partitions: bool = False) -> None:
+    """ Create and populate the tables with basic static data that provides
+        the background for geocoding. Data is assumed to not yet exist.
+    """
+    db_utils.execute_file(dsn, sql_dir / 'country_osm_grid.sql.gz')
+
+    params = []
+    for ccode, props in _COUNTRY_INFO.items():
+        if ccode is not None and props is not None:
+            if ignore_partitions:
+                partition = 0
+            else:
+                partition = props.get('partition', 0)
+            lang = props['languages'][0] if len(
+                props['languages']) == 1 else None
+
+            params.append((ccode, props['names'], lang, partition))
+    with connect(dsn) as conn:
+        with conn.cursor() as cur:
+            psycopg2.extras.register_hstore(cur)
+            cur.execute(
+                """ CREATE TABLE public.country_name (
+                        country_code character varying(2),
+                        name public.hstore,
+                        derived_name public.hstore,
+                        country_default_language_code text,
+                        partition integer
+                    ); """)
+            cur.execute_values(
+                """ INSERT INTO public.country_name
+                    (country_code, name, country_default_language_code, partition) VALUES %s
+                """, params)
+        conn.commit()
+
+
+def create_country_names(conn: Connection, tokenizer: AbstractTokenizer,
+                         languages: Optional[Container[str]] = None) -> None:
+    """ Add default country names to search index. `languages` is a comma-
+        separated list of language codes as used in OSM. If `languages` is not
+        empty then only name translations for the given languages are added
+        to the index.
+    """
+    def _include_key(key: str) -> bool:
+        return ':' not in key or not languages or \
+               key[key.index(':') + 1:] in languages
+
+    with conn.cursor() as cur:
+        psycopg2.extras.register_hstore(cur)
+        cur.execute("""SELECT country_code, name FROM country_name
+                       WHERE country_code is not null""")
+
+        with tokenizer.name_analyzer() as analyzer:
+            for code, name in cur:
+                names = {'countrycode': code}
+
+                # country names (only in languages as provided)
+                if name:
+                    names.update({k : v for k, v in name.items() if _include_key(k)})
+
+                analyzer.add_country_names(code, names)
+
+    conn.commit()
diff --git a/nominatim/data/place_info.py b/nominatim/data/place_info.py
new file mode 100644 (file)
index 0000000..1bfd512
--- /dev/null
@@ -0,0 +1,86 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# This file is part of Nominatim. (https://nominatim.org)
+#
+# Copyright (C) 2022 by the Nominatim developer community.
+# For a full list of authors see the git log.
+"""
+Wrapper around place information the indexer gets from the database and hands to
+the tokenizer.
+"""
+from typing import Optional, Mapping, Any, Tuple
+
+class PlaceInfo:
+    """ This data class contains all information the tokenizer can access
+        about a place.
+    """
+
+    def __init__(self, info: Mapping[str, Any]) -> None:
+        self._info = info
+
+
+    @property
+    def name(self) -> Optional[Mapping[str, str]]:
+        """ A dictionary with the names of the place. Keys and values represent
+            the full key and value of the corresponding OSM tag. Which tags
+            are saved as names is determined by the import style.
+            The property may be None if the place has no names.
+        """
+        return self._info.get('name')
+
+
+    @property
+    def address(self) -> Optional[Mapping[str, str]]:
+        """ A dictionary with the address elements of the place. They key
+            usually corresponds to the suffix part of the key of an OSM
+            'addr:*' or 'isin:*' tag. There are also some special keys like
+            `country` or `country_code` which merge OSM keys that contain
+            the same information. See [Import Styles][1] for details.
+
+            The property may be None if the place has no address information.
+
+            [1]: ../customize/Import-Styles.md
+        """
+        return self._info.get('address')
+
+
+    @property
+    def country_code(self) -> Optional[str]:
+        """ The country code of the country the place is in. Guaranteed
+            to be a two-letter lower-case string. If the place is not inside
+            any country, the property is set to None.
+        """
+        return self._info.get('country_code')
+
+
+    @property
+    def rank_address(self) -> int:
+        """ The [rank address][1] before ant rank correction is applied.
+
+            [1]: ../customize/Ranking.md#address-rank
+        """
+        return self._info.get('rank_address', 0)
+
+
+    @property
+    def centroid(self) -> Optional[Tuple[float, float]]:
+        """ A center point of the place in WGS84. May be None when the
+            geometry of the place is unknown.
+        """
+        x, y = self._info.get('centroid_x'), self._info.get('centroid_y')
+        return None if x is None or y is None else (x, y)
+
+
+    def is_a(self, key: str, value: str) -> bool:
+        """ Set to True when the place's primary tag corresponds to the given
+            key and value.
+        """
+        return self._info.get('class') == key and self._info.get('type') == value
+
+
+    def is_country(self) -> bool:
+        """ Set to True when the place is a valid country boundary.
+        """
+        return self.rank_address == 4 \
+               and self.is_a('boundary', 'administrative') \
+               and self.country_code is not None
diff --git a/nominatim/data/place_name.py b/nominatim/data/place_name.py
new file mode 100644 (file)
index 0000000..f4c5e0f
--- /dev/null
@@ -0,0 +1,78 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# This file is part of Nominatim. (https://nominatim.org)
+#
+# Copyright (C) 2022 by the Nominatim developer community.
+# For a full list of authors see the git log.
+"""
+Data class for a single name of a place.
+"""
+from typing import Optional, Dict, Mapping
+
+class PlaceName:
+    """ Each name and address part of a place is encapsulated in an object of
+        this class. It saves not only the name proper but also describes the
+        kind of name with two properties:
+
+        * `kind` describes the name of the OSM key used without any suffixes
+          (i.e. the part after the colon removed)
+        * `suffix` contains the suffix of the OSM tag, if any. The suffix
+          is the part of the key after the first colon.
+
+        In addition to that, a name may have arbitrary additional attributes.
+        How attributes are used, depends on the sanitizers and token analysers.
+        The exception is is the 'analyzer' attribute. This attribute determines
+        which token analysis module will be used to finalize the treatment of
+        names.
+    """
+
+    def __init__(self, name: str, kind: str, suffix: Optional[str]):
+        self.name = name
+        self.kind = kind
+        self.suffix = suffix
+        self.attr: Dict[str, str] = {}
+
+
+    def __repr__(self) -> str:
+        return f"PlaceName(name='{self.name}',kind='{self.kind}',suffix='{self.suffix}')"
+
+
+    def clone(self, name: Optional[str] = None,
+              kind: Optional[str] = None,
+              suffix: Optional[str] = None,
+              attr: Optional[Mapping[str, str]] = None) -> 'PlaceName':
+        """ Create a deep copy of the place name, optionally with the
+            given parameters replaced. In the attribute list only the given
+            keys are updated. The list is not replaced completely.
+            In particular, the function cannot to be used to remove an
+            attribute from a place name.
+        """
+        newobj = PlaceName(name or self.name,
+                           kind or self.kind,
+                           suffix or self.suffix)
+
+        newobj.attr.update(self.attr)
+        if attr:
+            newobj.attr.update(attr)
+
+        return newobj
+
+
+    def set_attr(self, key: str, value: str) -> None:
+        """ Add the given property to the name. If the property was already
+            set, then the value is overwritten.
+        """
+        self.attr[key] = value
+
+
+    def get_attr(self, key: str, default: Optional[str] = None) -> Optional[str]:
+        """ Return the given property or the value of 'default' if it
+            is not set.
+        """
+        return self.attr.get(key, default)
+
+
+    def has_attr(self, key: str) -> bool:
+        """ Check if the given attribute is set.
+        """
+        return key in self.attr
diff --git a/nominatim/data/postcode_format.py b/nominatim/data/postcode_format.py
new file mode 100644 (file)
index 0000000..dad35b7
--- /dev/null
@@ -0,0 +1,114 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# This file is part of Nominatim. (https://nominatim.org)
+#
+# Copyright (C) 2022 by the Nominatim developer community.
+# For a full list of authors see the git log.
+"""
+Functions for formatting postcodes according to their country-specific
+format.
+"""
+from typing import Any, Mapping, Optional, Set, Match
+import re
+
+from nominatim.errors import UsageError
+from nominatim.data import country_info
+
+class CountryPostcodeMatcher:
+    """ Matches and formats a postcode according to a format definition
+        of the given country.
+    """
+    def __init__(self, country_code: str, config: Mapping[str, Any]) -> None:
+        if 'pattern' not in config:
+            raise UsageError("Field 'pattern' required for 'postcode' "
+                             f"for country '{country_code}'")
+
+        pc_pattern = config['pattern'].replace('d', '[0-9]').replace('l', '[A-Z]')
+
+        self.norm_pattern = re.compile(f'\\s*(?:{country_code.upper()}[ -]?)?(.*)\\s*')
+        self.pattern = re.compile(pc_pattern)
+
+        self.output = config.get('output', r'\g<0>')
+
+
+    def match(self, postcode: str) -> Optional[Match[str]]:
+        """ Match the given postcode against the postcode pattern for this
+            matcher. Returns a `re.Match` object if the match was successful
+            and None otherwise.
+        """
+        # Upper-case, strip spaces and leading country code.
+        normalized = self.norm_pattern.fullmatch(postcode.upper())
+
+        if normalized:
+            return self.pattern.fullmatch(normalized.group(1))
+
+        return None
+
+
+    def normalize(self, match: Match[str]) -> str:
+        """ Return the default format of the postcode for the given match.
+            `match` must be a `re.Match` object previously returned by
+            `match()`
+        """
+        return match.expand(self.output)
+
+
+class PostcodeFormatter:
+    """ Container for different postcode formats of the world and
+        access functions.
+    """
+    def __init__(self) -> None:
+        # Objects without a country code can't have a postcode per definition.
+        self.country_without_postcode: Set[Optional[str]] = {None}
+        self.country_matcher = {}
+        self.default_matcher = CountryPostcodeMatcher('', {'pattern': '.*'})
+
+        for ccode, prop in country_info.iterate('postcode'):
+            if prop is False:
+                self.country_without_postcode.add(ccode)
+            elif isinstance(prop, dict):
+                self.country_matcher[ccode] = CountryPostcodeMatcher(ccode, prop)
+            else:
+                raise UsageError(f"Invalid entry 'postcode' for country '{ccode}'")
+
+
+    def set_default_pattern(self, pattern: str) -> None:
+        """ Set the postcode match pattern to use, when a country does not
+            have a specific pattern.
+        """
+        self.default_matcher = CountryPostcodeMatcher('', {'pattern': pattern})
+
+
+    def get_matcher(self, country_code: Optional[str]) -> Optional[CountryPostcodeMatcher]:
+        """ Return the CountryPostcodeMatcher for the given country.
+            Returns None if the country doesn't have a postcode and the
+            default matcher if there is no specific matcher configured for
+            the country.
+        """
+        if country_code in self.country_without_postcode:
+            return None
+
+        assert country_code is not None
+
+        return self.country_matcher.get(country_code, self.default_matcher)
+
+
+    def match(self, country_code: Optional[str], postcode: str) -> Optional[Match[str]]:
+        """ Match the given postcode against the postcode pattern for this
+            matcher. Returns a `re.Match` object if the country has a pattern
+            and the match was successful or None if the match failed.
+        """
+        if country_code in self.country_without_postcode:
+            return None
+
+        assert country_code is not None
+
+        return self.country_matcher.get(country_code, self.default_matcher).match(postcode)
+
+
+    def normalize(self, country_code: str, match: Match[str]) -> str:
+        """ Return the default format of the postcode for the given match.
+            `match` must be a `re.Match` object previously returned by
+            `match()`
+        """
+        return self.country_matcher.get(country_code, self.default_matcher).normalize(match)
index a86c5bdcee13eb37c4874f29be286d2b06beecc0..a2c8fe4de8a630e54001b7a08e0da41c79a9684d 100644 (file)
@@ -1,10 +1,12 @@
 # SPDX-License-Identifier: GPL-2.0-only
 #
-# This file is part of Nominatim.
-# Copyright (C) 2021 by the Nominatim developer community.
+# This file is part of Nominatim. (https://nominatim.org)
+#
+# Copyright (C) 2022 by the Nominatim developer community.
 # For a full list of authors see the git log.
-""" Database helper functions for the indexer.
+""" Non-blocking database connections.
 """
+from typing import Callable, Any, Optional, Iterator, Sequence
 import logging
 import select
 import time
@@ -20,6 +22,8 @@ try:
 except ImportError:
     __has_psycopg2_errors__ = False
 
+from nominatim.typing import T_cursor, Query
+
 LOG = logging.getLogger()
 
 class DeadlockHandler:
@@ -28,14 +32,14 @@ class DeadlockHandler:
         normally.
     """
 
-    def __init__(self, handler, ignore_sql_errors=False):
+    def __init__(self, handler: Callable[[], None], ignore_sql_errors: bool = False) -> None:
         self.handler = handler
         self.ignore_sql_errors = ignore_sql_errors
 
-    def __enter__(self):
+    def __enter__(self) -> 'DeadlockHandler':
         return self
 
-    def __exit__(self, exc_type, exc_value, traceback):
+    def __exit__(self, exc_type: Any, exc_value: Any, traceback: Any) -> bool:
         if __has_psycopg2_errors__:
             if exc_type == psycopg2.errors.DeadlockDetected: # pylint: disable=E1101
                 self.handler()
@@ -56,26 +60,31 @@ class DBConnection:
     """ A single non-blocking database connection.
     """
 
-    def __init__(self, dsn, cursor_factory=None, ignore_sql_errors=False):
-        self.current_query = None
-        self.current_params = None
+    def __init__(self, dsn: str,
+                 cursor_factory: Optional[Callable[..., T_cursor]] = None,
+                 ignore_sql_errors: bool = False) -> None:
         self.dsn = dsn
+
+        self.current_query: Optional[Query] = None
+        self.current_params: Optional[Sequence[Any]] = None
         self.ignore_sql_errors = ignore_sql_errors
 
-        self.conn = None
-        self.cursor = None
+        self.conn: Optional['psycopg2.connection'] = None
+        self.cursor: Optional['psycopg2.cursor'] = None
         self.connect(cursor_factory=cursor_factory)
 
-    def close(self):
+    def close(self) -> None:
         """ Close all open connections. Does not wait for pending requests.
         """
         if self.conn is not None:
-            self.cursor.close()
+            if self.cursor is not None:
+                self.cursor.close() # type: ignore[no-untyped-call]
+                self.cursor = None
             self.conn.close()
 
         self.conn = None
 
-    def connect(self, cursor_factory=None):
+    def connect(self, cursor_factory: Optional[Callable[..., T_cursor]] = None) -> None:
         """ (Re)connect to the database. Creates an asynchronous connection
             with JIT and parallel processing disabled. If a connection was
             already open, it is closed and a new connection established.
@@ -88,7 +97,10 @@ class DBConnection:
         self.conn = psycopg2.connect(**{'dsn': self.dsn, 'async': True})
         self.wait()
 
-        self.cursor = self.conn.cursor(cursor_factory=cursor_factory)
+        if cursor_factory is not None:
+            self.cursor = self.conn.cursor(cursor_factory=cursor_factory)
+        else:
+            self.cursor = self.conn.cursor()
         # Disable JIT and parallel workers as they are known to cause problems.
         # Update pg_settings instead of using SET because it does not yield
         # errors on older versions of Postgres where the settings are not
@@ -99,11 +111,15 @@ class DBConnection:
                    WHERE name = 'max_parallel_workers_per_gather';""")
         self.wait()
 
-    def _deadlock_handler(self):
+    def _deadlock_handler(self) -> None:
         LOG.info("Deadlock detected (params = %s), retry.", str(self.current_params))
+        assert self.cursor is not None
+        assert self.current_query is not None
+        assert self.current_params is not None
+
         self.cursor.execute(self.current_query, self.current_params)
 
-    def wait(self):
+    def wait(self) -> None:
         """ Block until any pending operation is done.
         """
         while True:
@@ -112,25 +128,29 @@ class DBConnection:
                 self.current_query = None
                 return
 
-    def perform(self, sql, args=None):
+    def perform(self, sql: Query, args: Optional[Sequence[Any]] = None) -> None:
         """ Send SQL query to the server. Returns immediately without
             blocking.
         """
+        assert self.cursor is not None
         self.current_query = sql
         self.current_params = args
         self.cursor.execute(sql, args)
 
-    def fileno(self):
+    def fileno(self) -> int:
         """ File descriptor to wait for. (Makes this class select()able.)
         """
+        assert self.conn is not None
         return self.conn.fileno()
 
-    def is_done(self):
+    def is_done(self) -> bool:
         """ Check if the connection is available for a new query.
 
             Also checks if the previous query has run into a deadlock.
             If so, then the previous query is repeated.
         """
+        assert self.conn is not None
+
         if self.current_query is None:
             return True
 
@@ -149,14 +169,14 @@ class WorkerPool:
     """
     REOPEN_CONNECTIONS_AFTER = 100000
 
-    def __init__(self, dsn, pool_size, ignore_sql_errors=False):
+    def __init__(self, dsn: str, pool_size: int, ignore_sql_errors: bool = False) -> None:
         self.threads = [DBConnection(dsn, ignore_sql_errors=ignore_sql_errors)
                         for _ in range(pool_size)]
         self.free_workers = self._yield_free_worker()
-        self.wait_time = 0
+        self.wait_time = 0.0
 
 
-    def finish_all(self):
+    def finish_all(self) -> None:
         """ Wait for all connection to finish.
         """
         for thread in self.threads:
@@ -165,22 +185,22 @@ class WorkerPool:
 
         self.free_workers = self._yield_free_worker()
 
-    def close(self):
+    def close(self) -> None:
         """ Close all connections and clear the pool.
         """
         for thread in self.threads:
             thread.close()
         self.threads = []
-        self.free_workers = None
+        self.free_workers = iter([])
 
 
-    def next_free_worker(self):
+    def next_free_worker(self) -> DBConnection:
         """ Get the next free connection.
         """
         return next(self.free_workers)
 
 
-    def _yield_free_worker(self):
+    def _yield_free_worker(self) -> Iterator[DBConnection]:
         ready = self.threads
         command_stat = 0
         while True:
@@ -199,17 +219,17 @@ class WorkerPool:
                 self.wait_time += time.time() - tstart
 
 
-    def _reconnect_threads(self):
+    def _reconnect_threads(self) -> None:
         for thread in self.threads:
             while not thread.is_done():
                 thread.wait()
             thread.connect()
 
 
-    def __enter__(self):
+    def __enter__(self) -> 'WorkerPool':
         return self
 
 
-    def __exit__(self, exc_type, exc_value, traceback):
+    def __exit__(self, exc_type: Any, exc_value: Any, traceback: Any) -> None:
         self.finish_all()
         self.close()
index 1319ac16ea21c6e3d9424ea3bd205dd369768b4d..44a293d43b7f58dbfd19690525989b69333a9486 100644 (file)
@@ -1,6 +1,13 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# This file is part of Nominatim. (https://nominatim.org)
+#
+# Copyright (C) 2022 by the Nominatim developer community.
+# For a full list of authors see the git log.
 """
 Specialised connection and cursor functions.
 """
+from typing import Optional, Any, Callable, ContextManager, Dict, cast, overload, Tuple, Iterable
 import contextlib
 import logging
 import os
@@ -10,24 +17,27 @@ import psycopg2.extensions
 import psycopg2.extras
 from psycopg2 import sql as pysql
 
+from nominatim.typing import SysEnv, Query, T_cursor
 from nominatim.errors import UsageError
 
 LOG = logging.getLogger()
 
-class _Cursor(psycopg2.extras.DictCursor):
+class Cursor(psycopg2.extras.DictCursor):
     """ A cursor returning dict-like objects and providing specialised
         execution functions.
     """
-
-    def execute(self, query, args=None): # pylint: disable=W0221
+    # pylint: disable=arguments-renamed,arguments-differ
+    def execute(self, query: Query, args: Any = None) -> None:
         """ Query execution that logs the SQL query when debugging is enabled.
         """
-        LOG.debug(self.mogrify(query, args).decode('utf-8'))
+        if LOG.isEnabledFor(logging.DEBUG):
+            LOG.debug(self.mogrify(query, args).decode('utf-8')) # type: ignore[no-untyped-call]
 
         super().execute(query, args)
 
 
-    def execute_values(self, sql, argslist, template=None):
+    def execute_values(self, sql: Query, argslist: Iterable[Tuple[Any, ...]],
+                       template: Optional[Query] = None) -> None:
         """ Wrapper for the psycopg2 convenience function to execute
             SQL for a list of values.
         """
@@ -36,7 +46,7 @@ class _Cursor(psycopg2.extras.DictCursor):
         psycopg2.extras.execute_values(self, sql, argslist, template=template)
 
 
-    def scalar(self, sql, args=None):
+    def scalar(self, sql: Query, args: Any = None) -> Any:
         """ Execute query that returns a single value. The value is returned.
             If the query yields more than one row, a ValueError is raised.
         """
@@ -45,12 +55,15 @@ class _Cursor(psycopg2.extras.DictCursor):
         if self.rowcount != 1:
             raise RuntimeError("Query did not return a single row.")
 
-        return self.fetchone()[0]
+        result = self.fetchone()
+        assert result is not None
+
+        return result[0]
 
 
-    def drop_table(self, name, if_exists=True, cascade=False):
+    def drop_table(self, name: str, if_exists: bool = True, cascade: bool = False) -> None:
         """ Drop the table with the given name.
-            Set `if_exists` to False if a non-existant table should raise
+            Set `if_exists` to False if a non-existent table should raise
             an exception instead of just being ignored. If 'cascade' is set
             to True then all dependent tables are deleted as well.
         """
@@ -64,27 +77,49 @@ class _Cursor(psycopg2.extras.DictCursor):
         self.execute(pysql.SQL(sql).format(pysql.Identifier(name)))
 
 
-class _Connection(psycopg2.extensions.connection):
+class Connection(psycopg2.extensions.connection):
     """ A connection that provides the specialised cursor by default and
         adds convenience functions for administrating the database.
     """
+    @overload # type: ignore[override]
+    def cursor(self) -> Cursor:
+        ...
+
+    @overload
+    def cursor(self, name: str) -> Cursor:
+        ...
 
-    def cursor(self, cursor_factory=_Cursor, **kwargs):
+    @overload
+    def cursor(self, cursor_factory: Callable[..., T_cursor]) -> T_cursor:
+        ...
+
+    def cursor(self, cursor_factory  = Cursor, **kwargs): # type: ignore
         """ Return a new cursor. By default the specialised cursor is returned.
         """
         return super().cursor(cursor_factory=cursor_factory, **kwargs)
 
 
-    def table_exists(self, table):
+    def table_exists(self, table: str) -> bool:
         """ Check that a table with the given name exists in the database.
         """
         with self.cursor() as cur:
             num = cur.scalar("""SELECT count(*) FROM pg_tables
                                 WHERE tablename = %s and schemaname = 'public'""", (table, ))
-            return num == 1
+            return num == 1 if isinstance(num, int) else False
+
+
+    def table_has_column(self, table: str, column: str) -> bool:
+        """ Check if the table 'table' exists and has a column with name 'column'.
+        """
+        with self.cursor() as cur:
+            has_column = cur.scalar("""SELECT count(*) FROM information_schema.columns
+                                       WHERE table_name = %s
+                                             and column_name = %s""",
+                                    (table, column))
+            return has_column > 0 if isinstance(has_column, int) else False
 
 
-    def index_exists(self, index, table=None):
+    def index_exists(self, index: str, table: Optional[str] = None) -> bool:
         """ Check that an index with the given name exists in the database.
             If table is not None then the index must relate to the given
             table.
@@ -97,14 +132,16 @@ class _Connection(psycopg2.extensions.connection):
 
             if table is not None:
                 row = cur.fetchone()
+                if row is None or not isinstance(row[0], str):
+                    return False
                 return row[0] == table
 
         return True
 
 
-    def drop_table(self, name, if_exists=True, cascade=False):
+    def drop_table(self, name: str, if_exists: bool = True, cascade: bool = False) -> None:
         """ Drop the table with the given name.
-            Set `if_exists` to False if a non-existant table should raise
+            Set `if_exists` to False if a non-existent table should raise
             an exception instead of just being ignored.
         """
         with self.cursor() as cur:
@@ -112,18 +149,18 @@ class _Connection(psycopg2.extensions.connection):
         self.commit()
 
 
-    def server_version_tuple(self):
+    def server_version_tuple(self) -> Tuple[int, int]:
         """ Return the server version as a tuple of (major, minor).
             Converts correctly for pre-10 and post-10 PostgreSQL versions.
         """
         version = self.server_version
         if version < 100000:
-            return (int(version / 10000), (version % 10000) / 100)
+            return (int(version / 10000), int((version % 10000) / 100))
 
         return (int(version / 10000), version % 10000)
 
 
-    def postgis_version_tuple(self):
+    def postgis_version_tuple(self) -> Tuple[int, int]:
         """ Return the postgis version installed in the database as a
             tuple of (major, minor). Assumes that the PostGIS extension
             has been installed already.
@@ -131,22 +168,31 @@ class _Connection(psycopg2.extensions.connection):
         with self.cursor() as cur:
             version = cur.scalar('SELECT postgis_lib_version()')
 
-        return tuple((int(x) for x in version.split('.')[:2]))
+        version_parts = version.split('.')
+        if len(version_parts) < 2:
+            raise UsageError(f"Error fetching Postgis version. Bad format: {version}")
 
+        return (int(version_parts[0]), int(version_parts[1]))
+
+class ConnectionContext(ContextManager[Connection]):
+    """ Context manager of the connection that also provides direct access
+        to the underlying connection.
+    """
+    connection: Connection
 
-def connect(dsn):
+def connect(dsn: str) -> ConnectionContext:
     """ Open a connection to the database using the specialised connection
         factory. The returned object may be used in conjunction with 'with'.
         When used outside a context manager, use the `connection` attribute
         to get the connection.
     """
     try:
-        conn = psycopg2.connect(dsn, connection_factory=_Connection)
-        ctxmgr = contextlib.closing(conn)
-        ctxmgr.connection = conn
+        conn = psycopg2.connect(dsn, connection_factory=Connection)
+        ctxmgr = cast(ConnectionContext, contextlib.closing(conn))
+        ctxmgr.connection = cast(Connection, conn)
         return ctxmgr
     except psycopg2.OperationalError as err:
-        raise UsageError("Cannot connect to database: {}".format(err)) from err
+        raise UsageError(f"Cannot connect to database: {err}") from err
 
 
 # Translation from PG connection string parameters to PG environment variables.
@@ -181,7 +227,8 @@ _PG_CONNECTION_STRINGS = {
 }
 
 
-def get_pg_env(dsn, base_env=None):
+def get_pg_env(dsn: str,
+               base_env: Optional[SysEnv] = None) -> Dict[str, str]:
     """ Return a copy of `base_env` with the environment variables for
         PostgresSQL set up from the given database connection string.
         If `base_env` is None, then the OS environment is used as a base
index 9cc371fee22c0f9287b32a6c8985f890db6bef40..e8d5e0ca5c47194f7e72402f3c6b541a251c6a2a 100644 (file)
@@ -1,9 +1,18 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# This file is part of Nominatim. (https://nominatim.org)
+#
+# Copyright (C) 2022 by the Nominatim developer community.
+# For a full list of authors see the git log.
 """
 Query and access functions for the in-database property table.
 """
+from typing import Optional, cast
 
-def set_property(conn, name, value):
-    """ Add or replace the propery with the given name.
+from nominatim.db.connection import Connection
+
+def set_property(conn: Connection, name: str, value: str) -> None:
+    """ Add or replace the property with the given name.
     """
     with conn.cursor() as cur:
         cur.execute('SELECT value FROM nominatim_properties WHERE property = %s',
@@ -17,12 +26,22 @@ def set_property(conn, name, value):
         cur.execute(sql, (value, name))
     conn.commit()
 
-def get_property(conn, name):
-    """ Return the current value of the given propery or None if the property
+
+def get_property(conn: Connection, name: str) -> Optional[str]:
+    """ Return the current value of the given property or None if the property
         is not set.
     """
+    if not conn.table_exists('nominatim_properties'):
+        return None
+
     with conn.cursor() as cur:
         cur.execute('SELECT value FROM nominatim_properties WHERE property = %s',
                     (name, ))
 
-        return cur.fetchone()[0] if cur.rowcount > 0 else None
+        if cur.rowcount == 0:
+            return None
+
+        result = cur.fetchone()
+        assert result is not None
+
+        return cast(Optional[str], result[0])
index c8e07f6e64a4a18fcbe6bcd02808793f7daaa379..b450422da09396cb687cfe50750490311f82a31d 100644 (file)
@@ -1,10 +1,19 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# This file is part of Nominatim. (https://nominatim.org)
+#
+# Copyright (C) 2022 by the Nominatim developer community.
+# For a full list of authors see the git log.
 """
 Preprocessing of SQL files.
 """
+from typing import Set, Dict, Any
 import jinja2
 
+from nominatim.db.connection import Connection
+from nominatim.config import Configuration
 
-def _get_partitions(conn):
+def _get_partitions(conn: Connection) -> Set[int]:
     """ Get the set of partitions currently in use.
     """
     with conn.cursor() as cur:
@@ -16,7 +25,7 @@ def _get_partitions(conn):
     return partitions
 
 
-def _get_tables(conn):
+def _get_tables(conn: Connection) -> Set[str]:
     """ Return the set of tables currently in use.
         Only includes non-partitioned
     """
@@ -26,22 +35,22 @@ def _get_tables(conn):
         return set((row[0] for row in list(cur)))
 
 
-def _setup_tablespace_sql(config):
+def _setup_tablespace_sql(config: Configuration) -> Dict[str, str]:
     """ Returns a dict with tablespace expressions for the different tablespace
         kinds depending on whether a tablespace is configured or not.
     """
     out = {}
     for subset in ('ADDRESS', 'SEARCH', 'AUX'):
         for kind in ('DATA', 'INDEX'):
-            tspace = getattr(config, 'TABLESPACE_{}_{}'.format(subset, kind))
+            tspace = getattr(config, f'TABLESPACE_{subset}_{kind}')
             if tspace:
-                tspace = 'TABLESPACE "{}"'.format(tspace)
-            out['{}_{}'.format(subset.lower(), kind.lower())] = tspace
+                tspace = f'TABLESPACE "{tspace}"'
+            out[f'{subset.lower()}_{kind.lower()}'] = tspace
 
     return out
 
 
-def _setup_postgresql_features(conn):
+def _setup_postgresql_features(conn: Connection) -> Dict[str, Any]:
     """ Set up a dictionary with various optional Postgresql/Postgis features that
         depend on the database version.
     """
@@ -63,11 +72,11 @@ class SQLPreprocessor:
         and follows its syntax.
     """
 
-    def __init__(self, conn, config):
+    def __init__(self, conn: Connection, config: Configuration) -> None:
         self.env = jinja2.Environment(autoescape=False,
                                       loader=jinja2.FileSystemLoader(str(config.lib_dir.sql)))
 
-        db_info = {}
+        db_info: Dict[str, Any] = {}
         db_info['partitions'] = _get_partitions(conn)
         db_info['tables'] = _get_tables(conn)
         db_info['reverse_only'] = 'search_name' not in db_info['tables']
@@ -78,7 +87,7 @@ class SQLPreprocessor:
         self.env.globals['postgres'] = _setup_postgresql_features(conn)
 
 
-    def run_sql_file(self, conn, name, **kwargs):
+    def run_sql_file(self, conn: Connection, name: str, **kwargs: Any) -> None:
         """ Execute the given SQL file on the connection. The keyword arguments
             may supply additional parameters for preprocessing.
         """
index 71e587875cd4db6c633d98b44118d6bed3202112..2c01de71466dca8fb237461509062c5c8c3e248a 100644 (file)
@@ -1,17 +1,35 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# This file is part of Nominatim. (https://nominatim.org)
+#
+# Copyright (C) 2022 by the Nominatim developer community.
+# For a full list of authors see the git log.
 """
 Access and helper functions for the status and status log table.
 """
+from typing import Optional, Tuple, cast
 import datetime as dt
 import logging
 import re
 
+from nominatim.db.connection import Connection
 from nominatim.tools.exec_utils import get_url
 from nominatim.errors import UsageError
+from nominatim.typing import TypedDict
 
 LOG = logging.getLogger()
 ISODATE_FORMAT = '%Y-%m-%dT%H:%M:%S'
 
-def compute_database_date(conn):
+
+class StatusRow(TypedDict):
+    """ Dictionary of columns of the import_status table.
+    """
+    lastimportdate: dt.datetime
+    sequence_id: Optional[int]
+    indexed: Optional[bool]
+
+
+def compute_database_date(conn: Connection) -> dt.datetime:
     """ Determine the date of the database from the newest object in the
         data base.
     """
@@ -28,7 +46,7 @@ def compute_database_date(conn):
 
     LOG.info("Using node id %d for timestamp lookup", osmid)
     # Get the node from the API to find the timestamp when it was created.
-    node_url = 'https://www.openstreetmap.org/api/0.6/node/{}/1'.format(osmid)
+    node_url = f'https://www.openstreetmap.org/api/0.6/node/{osmid}/1'
     data = get_url(node_url)
 
     match = re.search(r'timestamp="((\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}))Z"', data)
@@ -43,10 +61,12 @@ def compute_database_date(conn):
     return dt.datetime.strptime(match.group(1), ISODATE_FORMAT).replace(tzinfo=dt.timezone.utc)
 
 
-def set_status(conn, date, seq=None, indexed=True):
+def set_status(conn: Connection, date: Optional[dt.datetime],
+               seq: Optional[int] = None, indexed: bool = True) -> None:
     """ Replace the current status with the given status. If date is `None`
         then only sequence and indexed will be updated as given. Otherwise
         the whole status is replaced.
+        The change will be committed to the database.
     """
     assert date is None or date.tzinfo == dt.timezone.utc
     with conn.cursor() as cur:
@@ -61,7 +81,7 @@ def set_status(conn, date, seq=None, indexed=True):
     conn.commit()
 
 
-def get_status(conn):
+def get_status(conn: Connection) -> Tuple[Optional[dt.datetime], Optional[int], Optional[bool]]:
     """ Return the current status as a triple of (date, sequence, indexed).
         If status has not been set up yet, a triple of None is returned.
     """
@@ -70,11 +90,11 @@ def get_status(conn):
         if cur.rowcount < 1:
             return None, None, None
 
-        row = cur.fetchone()
+        row = cast(StatusRow, cur.fetchone())
         return row['lastimportdate'], row['sequence_id'], row['indexed']
 
 
-def set_indexed(conn, state):
+def set_indexed(conn: Connection, state: bool) -> None:
     """ Set the indexed flag in the status table to the given state.
     """
     with conn.cursor() as cur:
@@ -82,7 +102,8 @@ def set_indexed(conn, state):
     conn.commit()
 
 
-def log_status(conn, start, event, batchsize=None):
+def log_status(conn: Connection, start: dt.datetime,
+               event: str, batchsize: Optional[int] = None) -> None:
     """ Write a new status line to the `import_osmosis_log` table.
     """
     with conn.cursor() as cur:
@@ -90,3 +111,4 @@ def log_status(conn, start, event, batchsize=None):
                        (batchend, batchseq, batchsize, starttime, endtime, event)
                        SELECT lastimportdate, sequence_id, %s, %s, now(), %s FROM import_status""",
                     (batchsize, start, event))
+    conn.commit()
index bb7faa25767f2a55066494a448a3fc00aa5b6025..9a7b4f164787b8abb03831477fe3b876357e9b25 100644 (file)
@@ -1,17 +1,27 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# This file is part of Nominatim. (https://nominatim.org)
+#
+# Copyright (C) 2022 by the Nominatim developer community.
+# For a full list of authors see the git log.
 """
 Helper functions for handling DB accesses.
 """
+from typing import IO, Optional, Union, Any, Iterable
 import subprocess
 import logging
 import gzip
 import io
+from pathlib import Path
 
-from nominatim.db.connection import get_pg_env
+from nominatim.db.connection import get_pg_env, Cursor
 from nominatim.errors import UsageError
 
 LOG = logging.getLogger()
 
-def _pipe_to_proc(proc, fdesc):
+def _pipe_to_proc(proc: 'subprocess.Popen[bytes]',
+                  fdesc: Union[IO[bytes], gzip.GzipFile]) -> int:
+    assert proc.stdin is not None
     chunk = fdesc.read(2048)
     while chunk and proc.poll() is None:
         try:
@@ -22,7 +32,10 @@ def _pipe_to_proc(proc, fdesc):
 
     return len(chunk)
 
-def execute_file(dsn, fname, ignore_errors=False, pre_code=None, post_code=None):
+def execute_file(dsn: str, fname: Path,
+                 ignore_errors: bool = False,
+                 pre_code: Optional[str] = None,
+                 post_code: Optional[str] = None) -> None:
     """ Read an SQL file and run its contents against the given database
         using psql. Use `pre_code` and `post_code` to run extra commands
         before or after executing the file. The commands are run within the
@@ -34,56 +47,57 @@ def execute_file(dsn, fname, ignore_errors=False, pre_code=None, post_code=None)
         cmd.extend(('-v', 'ON_ERROR_STOP=1'))
     if not LOG.isEnabledFor(logging.INFO):
         cmd.append('--quiet')
-    proc = subprocess.Popen(cmd, env=get_pg_env(dsn), stdin=subprocess.PIPE)
 
-    try:
-        if not LOG.isEnabledFor(logging.INFO):
-            proc.stdin.write('set client_min_messages to WARNING;'.encode('utf-8'))
+    with subprocess.Popen(cmd, env=get_pg_env(dsn), stdin=subprocess.PIPE) as proc:
+        assert proc.stdin is not None
+        try:
+            if not LOG.isEnabledFor(logging.INFO):
+                proc.stdin.write('set client_min_messages to WARNING;'.encode('utf-8'))
 
-        if pre_code:
-            proc.stdin.write((pre_code + ';').encode('utf-8'))
+            if pre_code:
+                proc.stdin.write((pre_code + ';').encode('utf-8'))
 
-        if fname.suffix == '.gz':
-            with gzip.open(str(fname), 'rb') as fdesc:
-                remain = _pipe_to_proc(proc, fdesc)
-        else:
-            with fname.open('rb') as fdesc:
-                remain = _pipe_to_proc(proc, fdesc)
+            if fname.suffix == '.gz':
+                with gzip.open(str(fname), 'rb') as fdesc:
+                    remain = _pipe_to_proc(proc, fdesc)
+            else:
+                with fname.open('rb') as fdesc:
+                    remain = _pipe_to_proc(proc, fdesc)
 
-        if remain == 0 and post_code:
-            proc.stdin.write((';' + post_code).encode('utf-8'))
-    finally:
-        proc.stdin.close()
-        ret = proc.wait()
+            if remain == 0 and post_code:
+                proc.stdin.write((';' + post_code).encode('utf-8'))
+        finally:
+            proc.stdin.close()
+            ret = proc.wait()
 
     if ret != 0 or remain > 0:
         raise UsageError("Failed to execute SQL file.")
 
 
 # List of characters that need to be quoted for the copy command.
-_SQL_TRANSLATION = {ord(u'\\'): u'\\\\',
-                    ord(u'\t'): u'\\t',
-                    ord(u'\n'): u'\\n'}
+_SQL_TRANSLATION = {ord('\\'): '\\\\',
+                    ord('\t'): '\\t',
+                    ord('\n'): '\\n'}
 
 
 class CopyBuffer:
     """ Data collector for the copy_from command.
     """
 
-    def __init__(self):
+    def __init__(self) -> None:
         self.buffer = io.StringIO()
 
 
-    def __enter__(self):
+    def __enter__(self) -> 'CopyBuffer':
         return self
 
 
-    def __exit__(self, exc_type, exc_value, traceback):
+    def __exit__(self, exc_type: Any, exc_value: Any, traceback: Any) -> None:
         if self.buffer is not None:
             self.buffer.close()
 
 
-    def add(self, *data):
+    def add(self, *data: Any) -> None:
         """ Add another row of data to the copy buffer.
         """
         first = True
@@ -99,9 +113,9 @@ class CopyBuffer:
         self.buffer.write('\n')
 
 
-    def copy_out(self, cur, table, columns=None):
+    def copy_out(self, cur: Cursor, table: str, columns: Optional[Iterable[str]] = None) -> None:
         """ Copy all collected data into the given table.
         """
         if self.buffer.tell() > 0:
             self.buffer.seek(0)
-            cur.copy_from(self.buffer, table, columns=columns)
+            cur.copy_from(self.buffer, table, columns=columns) # type: ignore[no-untyped-call]
index e77f956a4eab01df45106dcc1fb375ab6f277996..26752aa2a52c4930abdc1b24c9eb29b441e5174a 100644 (file)
@@ -1,3 +1,9 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# This file is part of Nominatim. (https://nominatim.org)
+#
+# Copyright (C) 2022 by the Nominatim developer community.
+# For a full list of authors see the git log.
 """
 Custom exception and error classes for Nominatim.
 """
index 50bd232e30dc0c341c6d43bbf8cf70eb720d37d0..5425c8ffaf212ada260b57932c0566c6611ac2c5 100644 (file)
@@ -1,15 +1,24 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# This file is part of Nominatim. (https://nominatim.org)
+#
+# Copyright (C) 2022 by the Nominatim developer community.
+# For a full list of authors see the git log.
 """
 Main work horse for indexing (computing addresses) the database.
 """
+from typing import Optional, Any, cast
 import logging
 import time
 
 import psycopg2.extras
 
+from nominatim.tokenizer.base import AbstractTokenizer
 from nominatim.indexer.progress import ProgressLogger
 from nominatim.indexer import runners
 from nominatim.db.async_connection import DBConnection, WorkerPool
-from nominatim.db.connection import connect
+from nominatim.db.connection import connect, Connection, Cursor
+from nominatim.typing import DictCursorResults
 
 LOG = logging.getLogger()
 
@@ -17,10 +26,11 @@ LOG = logging.getLogger()
 class PlaceFetcher:
     """ Asynchronous connection that fetches place details for processing.
     """
-    def __init__(self, dsn, setup_conn):
-        self.wait_time = 0
-        self.current_ids = None
-        self.conn = DBConnection(dsn, cursor_factory=psycopg2.extras.DictCursor)
+    def __init__(self, dsn: str, setup_conn: Connection) -> None:
+        self.wait_time = 0.0
+        self.current_ids: Optional[DictCursorResults] = None
+        self.conn: Optional[DBConnection] = DBConnection(dsn,
+                                               cursor_factory=psycopg2.extras.DictCursor)
 
         with setup_conn.cursor() as cur:
             # need to fetch those manually because register_hstore cannot
@@ -31,7 +41,7 @@ class PlaceFetcher:
         psycopg2.extras.register_hstore(self.conn.conn, oid=hstore_oid,
                                         array_oid=hstore_array_oid)
 
-    def close(self):
+    def close(self) -> None:
         """ Close the underlying asynchronous connection.
         """
         if self.conn:
@@ -39,44 +49,46 @@ class PlaceFetcher:
             self.conn = None
 
 
-    def fetch_next_batch(self, cur, runner):
+    def fetch_next_batch(self, cur: Cursor, runner: runners.Runner) -> bool:
         """ Send a request for the next batch of places.
             If details for the places are required, they will be fetched
             asynchronously.
 
             Returns true if there is still data available.
         """
-        ids = cur.fetchmany(100)
+        ids = cast(Optional[DictCursorResults], cur.fetchmany(100))
 
         if not ids:
             self.current_ids = None
             return False
 
-        if hasattr(runner, 'get_place_details'):
-            runner.get_place_details(self.conn, ids)
-            self.current_ids = []
-        else:
-            self.current_ids = ids
+        assert self.conn is not None
+        self.current_ids = runner.get_place_details(self.conn, ids)
 
         return True
 
-    def get_batch(self):
+    def get_batch(self) -> DictCursorResults:
         """ Get the next batch of data, previously requested with
             `fetch_next_batch`.
         """
+        assert self.conn is not None
+        assert self.conn.cursor is not None
+
         if self.current_ids is not None and not self.current_ids:
             tstart = time.time()
             self.conn.wait()
             self.wait_time += time.time() - tstart
-            self.current_ids = self.conn.cursor.fetchall()
+            self.current_ids = cast(Optional[DictCursorResults],
+                                    self.conn.cursor.fetchall())
 
-        return self.current_ids
+        return self.current_ids if self.current_ids is not None else []
 
-    def __enter__(self):
+    def __enter__(self) -> 'PlaceFetcher':
         return self
 
 
-    def __exit__(self, exc_type, exc_value, traceback):
+    def __exit__(self, exc_type: Any, exc_value: Any, traceback: Any) -> None:
+        assert self.conn is not None
         self.conn.wait()
         self.close()
 
@@ -85,13 +97,13 @@ class Indexer:
     """ Main indexing routine.
     """
 
-    def __init__(self, dsn, tokenizer, num_threads):
+    def __init__(self, dsn: str, tokenizer: AbstractTokenizer, num_threads: int):
         self.dsn = dsn
         self.tokenizer = tokenizer
         self.num_threads = num_threads
 
 
-    def has_pending(self):
+    def has_pending(self) -> bool:
         """ Check if any data still needs indexing.
             This function must only be used after the import has finished.
             Otherwise it will be very expensive.
@@ -102,7 +114,7 @@ class Indexer:
                 return cur.rowcount > 0
 
 
-    def index_full(self, analyse=True):
+    def index_full(self, analyse: bool = True) -> None:
         """ Index the complete database. This will first index boundaries
             followed by all other objects. When `analyse` is True, then the
             database will be analysed at the appropriate places to
@@ -111,7 +123,7 @@ class Indexer:
         with connect(self.dsn) as conn:
             conn.autocommit = True
 
-            def _analyze():
+            def _analyze() -> None:
                 if analyse:
                     with conn.cursor() as cur:
                         cur.execute('ANALYZE')
@@ -132,7 +144,7 @@ class Indexer:
             _analyze()
 
 
-    def index_boundaries(self, minrank, maxrank):
+    def index_boundaries(self, minrank: int, maxrank: int) -> None:
         """ Index only administrative boundaries within the given rank range.
         """
         LOG.warning("Starting indexing boundaries using %s threads",
@@ -142,7 +154,7 @@ class Indexer:
             for rank in range(max(minrank, 4), min(maxrank, 26)):
                 self._index(runners.BoundaryRunner(rank, analyzer))
 
-    def index_by_rank(self, minrank, maxrank):
+    def index_by_rank(self, minrank: int, maxrank: int) -> None:
         """ Index all entries of placex in the given rank range (inclusive)
             in order of their address rank.
 
@@ -154,26 +166,23 @@ class Indexer:
                     minrank, maxrank, self.num_threads)
 
         with self.tokenizer.name_analyzer() as analyzer:
-            for rank in range(max(1, minrank), maxrank):
-                self._index(runners.RankRunner(rank, analyzer))
+            for rank in range(max(1, minrank), maxrank + 1):
+                self._index(runners.RankRunner(rank, analyzer), 20 if rank == 30 else 1)
 
             if maxrank == 30:
                 self._index(runners.RankRunner(0, analyzer))
                 self._index(runners.InterpolationRunner(analyzer), 20)
-                self._index(runners.RankRunner(30, analyzer), 20)
-            else:
-                self._index(runners.RankRunner(maxrank, analyzer))
 
 
-    def index_postcodes(self):
-        """Index the entries ofthe location_postcode table.
+    def index_postcodes(self) -> None:
+        """Index the entries of the location_postcode table.
         """
         LOG.warning("Starting indexing postcodes using %s threads", self.num_threads)
 
         self._index(runners.PostcodeRunner(), 20)
 
 
-    def update_status_table(self):
+    def update_status_table(self) -> None:
         """ Update the status in the status table to 'indexed'.
         """
         with connect(self.dsn) as conn:
@@ -182,7 +191,7 @@ class Indexer:
 
             conn.commit()
 
-    def _index(self, runner, batch=1):
+    def _index(self, runner: runners.Runner, batch: int = 1) -> None:
         """ Index a single rank or table. `runner` describes the SQL to use
             for indexing. `batch` describes the number of objects that
             should be processed with a single SQL statement
@@ -212,7 +221,7 @@ class Indexer:
                                 # asynchronously get the next batch
                                 has_more = fetcher.fetch_next_batch(cur, runner)
 
-                                # And insert the curent batch
+                                # And insert the current batch
                                 for idx in range(0, len(places), batch):
                                     part = places[idx:idx + batch]
                                     LOG.debug("Processing places: %s", str(part))
diff --git a/nominatim/indexer/place_info.py b/nominatim/indexer/place_info.py
deleted file mode 100644 (file)
index 06d730e..0000000
+++ /dev/null
@@ -1,68 +0,0 @@
-"""
-Wrapper around place information the indexer gets from the database and hands to
-the tokenizer.
-"""
-
-import psycopg2.extras
-
-class PlaceInfo:
-    """ Data class containing all information the tokenizer gets about a
-        place it should process the names for.
-    """
-
-    def __init__(self, info):
-        self._info = info
-
-
-    def analyze(self, analyzer):
-        """ Process this place with the given tokenizer and return the
-            result in psycopg2-compatible Json.
-        """
-        return psycopg2.extras.Json(analyzer.process_place(self))
-
-
-    @property
-    def name(self):
-        """ A dictionary with the names of the place or None if the place
-            has no names.
-        """
-        return self._info.get('name')
-
-
-    @property
-    def address(self):
-        """ A dictionary with the address elements of the place
-            or None if no address information is available.
-        """
-        return self._info.get('address')
-
-
-    @property
-    def country_code(self):
-        """ The country code of the country the place is in. Guaranteed
-            to be a two-letter lower-case string or None, if no country
-            could be found.
-        """
-        return self._info.get('country_code')
-
-
-    @property
-    def rank_address(self):
-        """ The computed rank address before rank correction.
-        """
-        return self._info.get('rank_address')
-
-
-    def is_a(self, key, value):
-        """ Check if the place's primary tag corresponds to the given
-            key and value.
-        """
-        return self._info.get('class') == key and self._info.get('type') == value
-
-
-    def is_country(self):
-        """ Check if the place is a valid country boundary.
-        """
-        return self.rank_address == 4 \
-               and self.is_a('boundary', 'administrative') \
-               and self.country_code is not None
index 634b1fae703670d838bf1633a2d222b427dd43fa..177c262b702e19eec30c08383737670c1414ce74 100644 (file)
@@ -1,7 +1,9 @@
 # SPDX-License-Identifier: GPL-2.0-only
 #
-# This file is part of Nominatim.
-# Copyright (C) 2020 Sarah Hoffmann
+# This file is part of Nominatim. (https://nominatim.org)
+#
+# Copyright (C) 2022 by the Nominatim developer community.
+# For a full list of authors see the git log.
 """
 Helpers for progress logging.
 """
@@ -16,11 +18,11 @@ class ProgressLogger:
     """ Tracks and prints progress for the indexing process.
         `name` is the name of the indexing step being tracked.
         `total` sets up the total number of items that need processing.
-        `log_interval` denotes the interval in seconds at which progres
+        `log_interval` denotes the interval in seconds at which progress
         should be reported.
     """
 
-    def __init__(self, name, total, log_interval=1):
+    def __init__(self, name: str, total: int, log_interval: int = 1) -> None:
         self.name = name
         self.total_places = total
         self.done_places = 0
@@ -28,7 +30,7 @@ class ProgressLogger:
         self.log_interval = log_interval
         self.next_info = INITIAL_PROGRESS if LOG.isEnabledFor(logging.WARNING) else total + 1
 
-    def add(self, num=1):
+    def add(self, num: int = 1) -> None:
         """ Mark `num` places as processed. Print a log message if the
             logging is at least info and the log interval has passed.
         """
@@ -53,14 +55,14 @@ class ProgressLogger:
 
         self.next_info += int(places_per_sec) * self.log_interval
 
-    def done(self):
+    def done(self) -> None:
         """ Print final statistics about the progress.
         """
         rank_end_time = datetime.now()
 
         if rank_end_time == self.rank_start_time:
-            diff_seconds = 0
-            places_per_sec = self.done_places
+            diff_seconds = 0.0
+            places_per_sec = float(self.done_places)
         else:
             diff_seconds = (rank_end_time - self.rank_start_time).total_seconds()
             places_per_sec = self.done_places / diff_seconds
index 70536a71db8b51f2e8b3792b63a224a8a646e046..bbadd282ec96c538baa7ff3926e75bd5bd6cbe69 100644 (file)
@@ -1,18 +1,41 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# This file is part of Nominatim. (https://nominatim.org)
+#
+# Copyright (C) 2022 by the Nominatim developer community.
+# For a full list of authors see the git log.
 """
 Mix-ins that provide the actual commands for the indexer for various indexing
 tasks.
 """
+from typing import Any, List
 import functools
 
 from psycopg2 import sql as pysql
+import psycopg2.extras
 
-from nominatim.indexer.place_info import PlaceInfo
+from nominatim.data.place_info import PlaceInfo
+from nominatim.tokenizer.base import AbstractAnalyzer
+from nominatim.db.async_connection import DBConnection
+from nominatim.typing import Query, DictCursorResult, DictCursorResults, Protocol
 
 # pylint: disable=C0111
 
-def _mk_valuelist(template, num):
+def _mk_valuelist(template: str, num: int) -> pysql.Composed:
     return pysql.SQL(',').join([pysql.SQL(template)] * num)
 
+def _analyze_place(place: DictCursorResult, analyzer: AbstractAnalyzer) -> psycopg2.extras.Json:
+    return psycopg2.extras.Json(analyzer.process_place(PlaceInfo(place)))
+
+
+class Runner(Protocol):
+    def name(self) -> str: ...
+    def sql_count_objects(self) -> Query: ...
+    def sql_get_objects(self) -> Query: ...
+    def get_place_details(self, worker: DBConnection,
+                          ids: DictCursorResults) -> DictCursorResults: ...
+    def index_places(self, worker: DBConnection, places: DictCursorResults) -> None: ...
+
 
 class AbstractPlacexRunner:
     """ Returns SQL commands for indexing of the placex table.
@@ -20,14 +43,13 @@ class AbstractPlacexRunner:
     SELECT_SQL = pysql.SQL('SELECT place_id FROM placex ')
     UPDATE_LINE = "(%s, %s::hstore, %s::hstore, %s::int, %s::jsonb)"
 
-    def __init__(self, rank, analyzer):
+    def __init__(self, rank: int, analyzer: AbstractAnalyzer) -> None:
         self.rank = rank
         self.analyzer = analyzer
 
 
-    @staticmethod
     @functools.lru_cache(maxsize=1)
-    def _index_sql(num_places):
+    def _index_sql(self, num_places: int) -> pysql.Composed:
         return pysql.SQL(
             """ UPDATE placex
                 SET indexed_status = 0, address = v.addr, token_info = v.ti,
@@ -37,19 +59,21 @@ class AbstractPlacexRunner:
             """).format(_mk_valuelist(AbstractPlacexRunner.UPDATE_LINE, num_places))
 
 
-    @staticmethod
-    def get_place_details(worker, ids):
-        worker.perform("""SELECT place_id, (placex_indexing_prepare(placex)).*
-                          FROM placex WHERE place_id IN %s""",
+    def get_place_details(self, worker: DBConnection, ids: DictCursorResults) -> DictCursorResults:
+        worker.perform("""SELECT place_id, extra.*
+                          FROM placex, LATERAL placex_indexing_prepare(placex) as extra
+                          WHERE place_id IN %s""",
                        (tuple((p[0] for p in ids)), ))
 
+        return []
+
 
-    def index_places(self, worker, places):
-        values = []
+    def index_places(self, worker: DBConnection, places: DictCursorResults) -> None:
+        values: List[Any] = []
         for place in places:
             for field in ('place_id', 'name', 'address', 'linked_place_id'):
                 values.append(place[field])
-            values.append(PlaceInfo(place).analyze(self.analyzer))
+            values.append(_analyze_place(place, self.analyzer))
 
         worker.perform(self._index_sql(len(places)), values)
 
@@ -58,15 +82,15 @@ class RankRunner(AbstractPlacexRunner):
     """ Returns SQL commands for indexing one rank within the placex table.
     """
 
-    def name(self):
-        return "rank {}".format(self.rank)
+    def name(self) -> str:
+        return f"rank {self.rank}"
 
-    def sql_count_objects(self):
+    def sql_count_objects(self) -> pysql.Composed:
         return pysql.SQL("""SELECT count(*) FROM placex
                             WHERE rank_address = {} and indexed_status > 0
                          """).format(pysql.Literal(self.rank))
 
-    def sql_get_objects(self):
+    def sql_get_objects(self) -> pysql.Composed:
         return self.SELECT_SQL + pysql.SQL(
             """WHERE indexed_status > 0 and rank_address = {}
                ORDER BY geometry_sector
@@ -78,17 +102,17 @@ class BoundaryRunner(AbstractPlacexRunner):
         of a certain rank.
     """
 
-    def name(self):
-        return "boundaries rank {}".format(self.rank)
+    def name(self) -> str:
+        return f"boundaries rank {self.rank}"
 
-    def sql_count_objects(self):
+    def sql_count_objects(self) -> pysql.Composed:
         return pysql.SQL("""SELECT count(*) FROM placex
                             WHERE indexed_status > 0
                               AND rank_search = {}
                               AND class = 'boundary' and type = 'administrative'
                          """).format(pysql.Literal(self.rank))
 
-    def sql_get_objects(self):
+    def sql_get_objects(self) -> pysql.Composed:
         return self.SELECT_SQL + pysql.SQL(
             """WHERE indexed_status > 0 and rank_search = {}
                      and class = 'boundary' and type = 'administrative'
@@ -101,37 +125,33 @@ class InterpolationRunner:
         location_property_osmline.
     """
 
-    def __init__(self, analyzer):
+    def __init__(self, analyzer: AbstractAnalyzer) -> None:
         self.analyzer = analyzer
 
 
-    @staticmethod
-    def name():
+    def name(self) -> str:
         return "interpolation lines (location_property_osmline)"
 
-    @staticmethod
-    def sql_count_objects():
+    def sql_count_objects(self) -> str:
         return """SELECT count(*) FROM location_property_osmline
                   WHERE indexed_status > 0"""
 
-    @staticmethod
-    def sql_get_objects():
+    def sql_get_objects(self) -> str:
         return """SELECT place_id
                   FROM location_property_osmline
                   WHERE indexed_status > 0
                   ORDER BY geometry_sector"""
 
 
-    @staticmethod
-    def get_place_details(worker, ids):
+    def get_place_details(self, worker: DBConnection, ids: DictCursorResults) -> DictCursorResults:
         worker.perform("""SELECT place_id, get_interpolation_address(address, osm_id) as address
                           FROM location_property_osmline WHERE place_id IN %s""",
                        (tuple((p[0] for p in ids)), ))
+        return []
 
 
-    @staticmethod
     @functools.lru_cache(maxsize=1)
-    def _index_sql(num_places):
+    def _index_sql(self, num_places: int) -> pysql.Composed:
         return pysql.SQL("""UPDATE location_property_osmline
                             SET indexed_status = 0, address = v.addr, token_info = v.ti
                             FROM (VALUES {}) as v(id, addr, ti)
@@ -139,36 +159,38 @@ class InterpolationRunner:
                          """).format(_mk_valuelist("(%s, %s::hstore, %s::jsonb)", num_places))
 
 
-    def index_places(self, worker, places):
-        values = []
+    def index_places(self, worker: DBConnection, places: DictCursorResults) -> None:
+        values: List[Any] = []
         for place in places:
             values.extend((place[x] for x in ('place_id', 'address')))
-            values.append(PlaceInfo(place).analyze(self.analyzer))
+            values.append(_analyze_place(place, self.analyzer))
 
         worker.perform(self._index_sql(len(places)), values)
 
 
 
-class PostcodeRunner:
+class PostcodeRunner(Runner):
     """ Provides the SQL commands for indexing the location_postcode table.
     """
 
-    @staticmethod
-    def name():
+    def name(self) -> str:
         return "postcodes (location_postcode)"
 
-    @staticmethod
-    def sql_count_objects():
+
+    def sql_count_objects(self) -> str:
         return 'SELECT count(*) FROM location_postcode WHERE indexed_status > 0'
 
-    @staticmethod
-    def sql_get_objects():
+
+    def sql_get_objects(self) -> str:
         return """SELECT place_id FROM location_postcode
                   WHERE indexed_status > 0
                   ORDER BY country_code, postcode"""
 
-    @staticmethod
-    def index_places(worker, ids):
+
+    def get_place_details(self, worker: DBConnection, ids: DictCursorResults) -> DictCursorResults:
+        return ids
+
+    def index_places(self, worker: DBConnection, places: DictCursorResults) -> None:
         worker.perform(pysql.SQL("""UPDATE location_postcode SET indexed_status = 0
                                     WHERE place_id IN ({})""")
-                       .format(pysql.SQL(',').join((pysql.Literal(i[0]) for i in ids))))
+                       .format(pysql.SQL(',').join((pysql.Literal(i[0]) for i in places))))
index c88c39f028e3f8626ec4f2d4f4188b9471447e55..afbd1914b35d84219812afdd64f3061d306944f5 100644 (file)
@@ -1,14 +1,20 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# This file is part of Nominatim. (https://nominatim.org)
+#
+# Copyright (C) 2022 by the Nominatim developer community.
+# For a full list of authors see the git log.
 """
-Abstract class defintions for tokenizers. These base classes are here
+Abstract class definitions for tokenizers. These base classes are here
 mainly for documentation purposes.
 """
 from abc import ABC, abstractmethod
-from typing import List, Tuple, Dict, Any
+from typing import List, Tuple, Dict, Any, Optional, Iterable
+from pathlib import Path
 
 from nominatim.config import Configuration
-from nominatim.indexer.place_info import PlaceInfo
-
-# pylint: disable=unnecessary-pass
+from nominatim.data.place_info import PlaceInfo
+from nominatim.typing import Protocol
 
 class AbstractAnalyzer(ABC):
     """ The analyzer provides the functions for analysing names and building
@@ -22,7 +28,7 @@ class AbstractAnalyzer(ABC):
         return self
 
 
-    def __exit__(self, exc_type, exc_value, traceback) -> None:
+    def __exit__(self, exc_type: Any, exc_value: Any, traceback: Any) -> None:
         self.close()
 
 
@@ -74,7 +80,8 @@ class AbstractAnalyzer(ABC):
 
 
     @abstractmethod
-    def update_special_phrases(self, phrases: List[Tuple[str, str, str, str]],
+    def update_special_phrases(self,
+                               phrases: Iterable[Tuple[str, str, str, str]],
                                should_replace: bool) -> None:
         """ Update the tokenizer's special phrase tokens from the given
             list of special phrases.
@@ -89,7 +96,7 @@ class AbstractAnalyzer(ABC):
 
 
     @abstractmethod
-    def add_country_names(self, country_code: str, names: Dict[str, str]):
+    def add_country_names(self, country_code: str, names: Dict[str, str]) -> None:
         """ Add the given names to the tokenizer's list of country tokens.
 
             Arguments:
@@ -106,7 +113,7 @@ class AbstractAnalyzer(ABC):
             the search index.
 
             Arguments:
-                place: Place information retrived from the database.
+                place: Place information retrieved from the database.
 
             Returns:
                 A JSON-serialisable structure that will be handed into
@@ -134,7 +141,7 @@ class AbstractTokenizer(ABC):
 
               init_db: When set to False, then initialisation of database
                 tables should be skipped. This option is only required for
-                migration purposes and can be savely ignored by custom
+                migration purposes and can be safely ignored by custom
                 tokenizers.
 
             TODO: can we move the init_db parameter somewhere else?
@@ -180,7 +187,7 @@ class AbstractTokenizer(ABC):
 
 
     @abstractmethod
-    def check_database(self, config: Configuration) -> str:
+    def check_database(self, config: Configuration) -> Optional[str]:
         """ Check that the database is set up correctly and ready for being
             queried.
 
@@ -203,6 +210,13 @@ class AbstractTokenizer(ABC):
         """
 
 
+    @abstractmethod
+    def update_word_tokens(self) -> None:
+        """ Do house-keeping on the tokenizers internal data structures.
+            Remove unused word tokens, resort data etc.
+        """
+
+
     @abstractmethod
     def name_analyzer(self) -> AbstractAnalyzer:
         """ Create a new analyzer for tokenizing names and queries
@@ -217,3 +231,13 @@ class AbstractTokenizer(ABC):
             When used outside the with construct, the caller must ensure to
             call the close() function before destructing the analyzer.
         """
+
+
+class TokenizerModule(Protocol):
+    """ Interface that must be exported by modules that implement their
+        own tokenizer.
+    """
+
+    def create(self, dsn: str, data_dir: Path) -> AbstractTokenizer:
+        """ Factory for new tokenizers.
+        """
index dc3e7411fa4e865c62e356b6187c910c4ea72b4c..f5159fa00fb64b3c64a36a95fd855a9aab61b847 100644 (file)
@@ -1,29 +1,38 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# This file is part of Nominatim. (https://nominatim.org)
+#
+# Copyright (C) 2022 by the Nominatim developer community.
+# For a full list of authors see the git log.
 """
 Functions for creating a tokenizer or initialising the right one for an
 existing database.
 
 A tokenizer is something that is bound to the lifetime of a database. It
-can be choosen and configured before the intial import but then needs to
+can be chosen and configured before the initial import but then needs to
 be used consistently when querying and updating the database.
 
 This module provides the functions to create and configure a new tokenizer
-as well as instanciating the appropriate tokenizer for updating an existing
+as well as instantiating the appropriate tokenizer for updating an existing
 database.
 
 A tokenizer usually also includes PHP code for querying. The appropriate PHP
 normalizer module is installed, when the tokenizer is created.
 """
+from typing import Optional
 import logging
 import importlib
 from pathlib import Path
 
-from ..errors import UsageError
-from ..db import properties
-from ..db.connection import connect
+from nominatim.errors import UsageError
+from nominatim.db import properties
+from nominatim.db.connection import connect
+from nominatim.config import Configuration
+from nominatim.tokenizer.base import AbstractTokenizer, TokenizerModule
 
 LOG = logging.getLogger()
 
-def _import_tokenizer(name):
+def _import_tokenizer(name: str) -> TokenizerModule:
     """ Load the tokenizer.py module from project directory.
     """
     src_file = Path(__file__).parent / (name + '_tokenizer.py')
@@ -35,7 +44,8 @@ def _import_tokenizer(name):
     return importlib.import_module('nominatim.tokenizer.' + name + '_tokenizer')
 
 
-def create_tokenizer(config, init_db=True, module_name=None):
+def create_tokenizer(config: Configuration, init_db: bool = True,
+                     module_name: Optional[str] = None) -> AbstractTokenizer:
     """ Create a new tokenizer as defined by the given configuration.
 
         The tokenizer data and code is copied into the 'tokenizer' directory
@@ -64,7 +74,7 @@ def create_tokenizer(config, init_db=True, module_name=None):
     return tokenizer
 
 
-def get_tokenizer_for_db(config):
+def get_tokenizer_for_db(config: Configuration) -> AbstractTokenizer:
     """ Instantiate a tokenizer for an existing database.
 
         The function looks up the appropriate tokenizer in the database
@@ -72,8 +82,8 @@ def get_tokenizer_for_db(config):
     """
     basedir = config.project_dir / 'tokenizer'
     if not basedir.is_dir():
-        LOG.fatal("Cannot find tokenizer data in '%s'.", basedir)
-        raise UsageError('Cannot initialize tokenizer.')
+        # Directory will be repopulated by tokenizer below.
+        basedir.mkdir()
 
     with connect(config.get_libpq_dsn()) as conn:
         name = properties.get_property(conn, 'tokenizer')
index b8551038aa42283dfccfc6bedaf1c0b89c0ba68b..4c36282ca54bfbd3526d24ead471a3e9fe9dbc33 100644 (file)
@@ -1,17 +1,27 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# This file is part of Nominatim. (https://nominatim.org)
+#
+# Copyright (C) 2022 by the Nominatim developer community.
+# For a full list of authors see the git log.
 """
 Helper class to create ICU rules from a configuration file.
 """
-import importlib
+from typing import Mapping, Any, Dict, Optional
 import io
 import json
 import logging
 
-from nominatim.config import flatten_config_list
+from icu import Transliterator
+
+from nominatim.config import flatten_config_list, Configuration
 from nominatim.db.properties import set_property, get_property
+from nominatim.db.connection import Connection
 from nominatim.errors import UsageError
 from nominatim.tokenizer.place_sanitizer import PlaceSanitizer
 from nominatim.tokenizer.icu_token_analysis import ICUTokenAnalysis
-import nominatim.tools.country_info
+from nominatim.tokenizer.token_analysis.base import AnalysisModule, Analyzer
+import nominatim.data.country_info
 
 LOG = logging.getLogger()
 
@@ -20,7 +30,7 @@ DBCFG_IMPORT_TRANS_RULES = "tokenizer_import_transliteration"
 DBCFG_IMPORT_ANALYSIS_RULES = "tokenizer_import_analysis_rules"
 
 
-def _get_section(rules, section):
+def _get_section(rules: Mapping[str, Any], section: str) -> Any:
     """ Get the section named 'section' from the rules. If the section does
         not exist, raise a usage error with a meaningful message.
     """
@@ -35,12 +45,13 @@ class ICURuleLoader:
     """ Compiler for ICU rules from a tokenizer configuration file.
     """
 
-    def __init__(self, config):
+    def __init__(self, config: Configuration) -> None:
+        self.config = config
         rules = config.load_sub_configuration('icu_tokenizer.yaml',
                                               config='TOKENIZER_CONFIG')
 
-        # Make sure country information is available to analyzers and sanatizers.
-        nominatim.tools.country_info.setup_country_config(config)
+        # Make sure country information is available to analyzers and sanitizers.
+        nominatim.data.country_info.setup_country_config(config)
 
         self.normalization_rules = self._cfg_to_icu_rules(rules, 'normalization')
         self.transliteration_rules = self._cfg_to_icu_rules(rules, 'transliteration')
@@ -51,17 +62,27 @@ class ICURuleLoader:
         self.sanitizer_rules = rules.get('sanitizers', [])
 
 
-    def load_config_from_db(self, conn):
+    def load_config_from_db(self, conn: Connection) -> None:
         """ Get previously saved parts of the configuration from the
             database.
         """
-        self.normalization_rules = get_property(conn, DBCFG_IMPORT_NORM_RULES)
-        self.transliteration_rules = get_property(conn, DBCFG_IMPORT_TRANS_RULES)
-        self.analysis_rules = json.loads(get_property(conn, DBCFG_IMPORT_ANALYSIS_RULES))
+        rules = get_property(conn, DBCFG_IMPORT_NORM_RULES)
+        if rules is not None:
+            self.normalization_rules = rules
+
+        rules = get_property(conn, DBCFG_IMPORT_TRANS_RULES)
+        if rules is not None:
+            self.transliteration_rules = rules
+
+        rules = get_property(conn, DBCFG_IMPORT_ANALYSIS_RULES)
+        if rules:
+            self.analysis_rules = json.loads(rules)
+        else:
+            self.analysis_rules = []
         self._setup_analysis()
 
 
-    def save_config_to_db(self, conn):
+    def save_config_to_db(self, conn: Connection) -> None:
         """ Save the part of the configuration that cannot be changed into
             the database.
         """
@@ -70,20 +91,20 @@ class ICURuleLoader:
         set_property(conn, DBCFG_IMPORT_ANALYSIS_RULES, json.dumps(self.analysis_rules))
 
 
-    def make_sanitizer(self):
+    def make_sanitizer(self) -> PlaceSanitizer:
         """ Create a place sanitizer from the configured rules.
         """
-        return PlaceSanitizer(self.sanitizer_rules)
+        return PlaceSanitizer(self.sanitizer_rules, self.config)
 
 
-    def make_token_analysis(self):
+    def make_token_analysis(self) -> ICUTokenAnalysis:
         """ Create a token analyser from the reviouly loaded rules.
         """
         return ICUTokenAnalysis(self.normalization_rules,
                                 self.transliteration_rules, self.analysis)
 
 
-    def get_search_rules(self):
+    def get_search_rules(self) -> str:
         """ Return the ICU rules to be used during search.
             The rules combine normalization and transliteration.
         """
@@ -96,26 +117,31 @@ class ICURuleLoader:
         return rules.getvalue()
 
 
-    def get_normalization_rules(self):
+    def get_normalization_rules(self) -> str:
         """ Return rules for normalisation of a term.
         """
         return self.normalization_rules
 
 
-    def get_transliteration_rules(self):
+    def get_transliteration_rules(self) -> str:
         """ Return the rules for converting a string into its asciii representation.
         """
         return self.transliteration_rules
 
 
-    def _setup_analysis(self):
+    def _setup_analysis(self) -> None:
         """ Process the rules used for creating the various token analyzers.
         """
-        self.analysis = {}
+        self.analysis: Dict[Optional[str], TokenAnalyzerRule]  = {}
 
         if not isinstance(self.analysis_rules, list):
             raise UsageError("Configuration section 'token-analysis' must be a list.")
 
+        norm = Transliterator.createFromRules("rule_loader_normalization",
+                                              self.normalization_rules)
+        trans = Transliterator.createFromRules("rule_loader_transliteration",
+                                              self.transliteration_rules)
+
         for section in self.analysis_rules:
             name = section.get('id', None)
             if name in self.analysis:
@@ -125,11 +151,12 @@ class ICURuleLoader:
                     LOG.fatal("ICU tokenizer configuration has two token "
                               "analyzers with id '%s'.", name)
                 raise UsageError("Syntax error in ICU tokenizer config.")
-            self.analysis[name] = TokenAnalyzerRule(section, self.normalization_rules)
+            self.analysis[name] = TokenAnalyzerRule(section, norm, trans,
+                                                    self.config)
 
 
     @staticmethod
-    def _cfg_to_icu_rules(rules, section):
+    def _cfg_to_icu_rules(rules: Mapping[str, Any], section: str) -> str:
         """ Load an ICU ruleset from the given section. If the section is a
             simple string, it is interpreted as a file name and the rules are
             loaded verbatim from the given file. The filename is expected to be
@@ -149,12 +176,21 @@ class TokenAnalyzerRule:
         and creates a new token analyzer on request.
     """
 
-    def __init__(self, rules, normalization_rules):
-        # Find the analysis module
-        module_name = 'nominatim.tokenizer.token_analysis.' \
-                      + _get_section(rules, 'analyzer').replace('-', '_')
-        analysis_mod = importlib.import_module(module_name)
-        self.create = analysis_mod.create
+    def __init__(self, rules: Mapping[str, Any],
+                 normalizer: Any, transliterator: Any,
+                 config: Configuration) -> None:
+        analyzer_name = _get_section(rules, 'analyzer')
+        if not analyzer_name or not isinstance(analyzer_name, str):
+            raise UsageError("'analyzer' parameter needs to be simple string")
+
+        self._analysis_mod: AnalysisModule = \
+            config.load_plugin_module(analyzer_name, 'nominatim.tokenizer.token_analysis')
 
-        # Load the configuration.
-        self.config = analysis_mod.configure(rules, normalization_rules)
+        self.config = self._analysis_mod.configure(rules, normalizer,
+                                                   transliterator)
+
+
+    def create(self, normalizer: Any, transliterator: Any) -> Analyzer:
+        """ Create a new analyser instance for the given rule.
+        """
+        return self._analysis_mod.create(normalizer, transliterator, self.config)
index f27a2fbe96e9a849912e9ea41304857ce22907b0..7ea31e8ea1eb21b20f3e8dd8b3c3f12cdc7cee83 100644 (file)
@@ -1,16 +1,29 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# This file is part of Nominatim. (https://nominatim.org)
+#
+# Copyright (C) 2022 by the Nominatim developer community.
+# For a full list of authors see the git log.
 """
 Container class collecting all components required to transform an OSM name
 into a Nominatim token.
 """
-
+from typing import Mapping, Optional, TYPE_CHECKING
 from icu import Transliterator
 
+from nominatim.tokenizer.token_analysis.base import Analyzer
+
+if TYPE_CHECKING:
+    from typing import Any
+    from nominatim.tokenizer.icu_rule_loader import TokenAnalyzerRule # pylint: disable=cyclic-import
+
 class ICUTokenAnalysis:
     """ Container class collecting the transliterators and token analysis
-        modules for a single NameAnalyser instance.
+        modules for a single Analyser instance.
     """
 
-    def __init__(self, norm_rules, trans_rules, analysis_rules):
+    def __init__(self, norm_rules: str, trans_rules: str,
+                 analysis_rules: Mapping[Optional[str], 'TokenAnalyzerRule']):
         self.normalizer = Transliterator.createFromRules("icu_normalization",
                                                          norm_rules)
         trans_rules += ";[:Space:]+ > ' '"
@@ -19,5 +32,12 @@ class ICUTokenAnalysis:
         self.search = Transliterator.createFromRules("icu_search",
                                                      norm_rules + trans_rules)
 
-        self.analysis = {name: arules.create(self.to_ascii, arules.config)
+        self.analysis = {name: arules.create(self.normalizer, self.to_ascii)
                          for name, arules in analysis_rules.items()}
+
+
+    def get_analyzer(self, name: Optional[str]) -> Analyzer:
+        """ Return the given named analyzer. If no analyzer with that
+            name exists, return the default analyzer.
+        """
+        return self.analysis.get(name) or self.analysis[None]
index ea6e5d3cca5a9d063cd69b89c214f1d5e9699526..79f383f6f1c11b2e8aac46b09fe1afb75e26a981 100644 (file)
@@ -1,43 +1,55 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# This file is part of Nominatim. (https://nominatim.org)
+#
+# Copyright (C) 2022 by the Nominatim developer community.
+# For a full list of authors see the git log.
 """
 Tokenizer implementing normalisation as used before Nominatim 4 but using
 libICU instead of the PostgreSQL module.
 """
+from typing import Optional, Sequence, List, Tuple, Mapping, Any, cast, \
+                   Dict, Set, Iterable
 import itertools
 import json
 import logging
-import re
+from pathlib import Path
 from textwrap import dedent
 
-from nominatim.db.connection import connect
+from nominatim.db.connection import connect, Connection, Cursor
+from nominatim.config import Configuration
 from nominatim.db.utils import CopyBuffer
 from nominatim.db.sql_preprocessor import SQLPreprocessor
-from nominatim.indexer.place_info import PlaceInfo
+from nominatim.data.place_info import PlaceInfo
 from nominatim.tokenizer.icu_rule_loader import ICURuleLoader
+from nominatim.tokenizer.place_sanitizer import PlaceSanitizer
+from nominatim.data.place_name import PlaceName
+from nominatim.tokenizer.icu_token_analysis import ICUTokenAnalysis
 from nominatim.tokenizer.base import AbstractAnalyzer, AbstractTokenizer
 
 DBCFG_TERM_NORMALIZATION = "tokenizer_term_normalization"
 
 LOG = logging.getLogger()
 
-def create(dsn, data_dir):
+def create(dsn: str, data_dir: Path) -> 'ICUTokenizer':
     """ Create a new instance of the tokenizer provided by this module.
     """
-    return LegacyICUTokenizer(dsn, data_dir)
+    return ICUTokenizer(dsn, data_dir)
 
 
-class LegacyICUTokenizer(AbstractTokenizer):
-    """ This tokenizer uses libICU to covert names and queries to ASCII.
+class ICUTokenizer(AbstractTokenizer):
+    """ This tokenizer uses libICU to convert names and queries to ASCII.
         Otherwise it uses the same algorithms and data structures as the
         normalization routines in Nominatim 3.
     """
 
-    def __init__(self, dsn, data_dir):
+    def __init__(self, dsn: str, data_dir: Path) -> None:
         self.dsn = dsn
         self.data_dir = data_dir
-        self.loader = None
+        self.loader: Optional[ICURuleLoader] = None
 
 
-    def init_new_db(self, config, init_db=True):
+    def init_new_db(self, config: Configuration, init_db: bool = True) -> None:
         """ Set up a new tokenizer for the database.
 
             This copies all necessary data in the project directory to make
@@ -45,7 +57,7 @@ class LegacyICUTokenizer(AbstractTokenizer):
         """
         self.loader = ICURuleLoader(config)
 
-        self._install_php(config.lib_dir.php)
+        self._install_php(config.lib_dir.php, overwrite=True)
         self._save_config()
 
         if init_db:
@@ -53,7 +65,7 @@ class LegacyICUTokenizer(AbstractTokenizer):
             self._init_db_tables(config)
 
 
-    def init_from_project(self, config):
+    def init_from_project(self, config: Configuration) -> None:
         """ Initialise the tokenizer from the project directory.
         """
         self.loader = ICURuleLoader(config)
@@ -61,8 +73,10 @@ class LegacyICUTokenizer(AbstractTokenizer):
         with connect(self.dsn) as conn:
             self.loader.load_config_from_db(conn)
 
+        self._install_php(config.lib_dir.php, overwrite=False)
 
-    def finalize_import(self, config):
+
+    def finalize_import(self, config: Configuration) -> None:
         """ Do any required postprocessing to make the tokenizer data ready
             for use.
         """
@@ -71,7 +85,7 @@ class LegacyICUTokenizer(AbstractTokenizer):
             sqlp.run_sql_file(conn, 'tokenizer/legacy_tokenizer_indices.sql')
 
 
-    def update_sql_functions(self, config):
+    def update_sql_functions(self, config: Configuration) -> None:
         """ Reimport the SQL functions for this tokenizer.
         """
         with connect(self.dsn) as conn:
@@ -79,14 +93,14 @@ class LegacyICUTokenizer(AbstractTokenizer):
             sqlp.run_sql_file(conn, 'tokenizer/icu_tokenizer.sql')
 
 
-    def check_database(self, config):
+    def check_database(self, config: Configuration) -> None:
         """ Check that the tokenizer is set up correctly.
         """
         # Will throw an error if there is an issue.
         self.init_from_project(config)
 
 
-    def update_statistics(self):
+    def update_statistics(self) -> None:
         """ Recompute frequencies for all name words.
         """
         with connect(self.dsn) as conn:
@@ -106,7 +120,50 @@ class LegacyICUTokenizer(AbstractTokenizer):
             conn.commit()
 
 
-    def name_analyzer(self):
+    def _cleanup_housenumbers(self) -> None:
+        """ Remove unused house numbers.
+        """
+        with connect(self.dsn) as conn:
+            if not conn.table_exists('search_name'):
+                return
+            with conn.cursor(name="hnr_counter") as cur:
+                cur.execute("""SELECT DISTINCT word_id, coalesce(info->>'lookup', word_token)
+                               FROM word
+                               WHERE type = 'H'
+                                 AND NOT EXISTS(SELECT * FROM search_name
+                                                WHERE ARRAY[word.word_id] && name_vector)
+                                 AND (char_length(coalesce(word, word_token)) > 6
+                                      OR coalesce(word, word_token) not similar to '\\d+')
+                            """)
+                candidates = {token: wid for wid, token in cur}
+            with conn.cursor(name="hnr_counter") as cur:
+                cur.execute("""SELECT housenumber FROM placex
+                               WHERE housenumber is not null
+                                     AND (char_length(housenumber) > 6
+                                          OR housenumber not similar to '\\d+')
+                            """)
+                for row in cur:
+                    for hnr in row[0].split(';'):
+                        candidates.pop(hnr, None)
+            LOG.info("There are %s outdated housenumbers.", len(candidates))
+            LOG.debug("Outdated housenumbers: %s", candidates.keys())
+            if candidates:
+                with conn.cursor() as cur:
+                    cur.execute("""DELETE FROM word WHERE word_id = any(%s)""",
+                                (list(candidates.values()), ))
+                conn.commit()
+
+
+
+    def update_word_tokens(self) -> None:
+        """ Remove unused tokens.
+        """
+        LOG.warning("Cleaning up housenumber tokens.")
+        self._cleanup_housenumbers()
+        LOG.warning("Tokenizer house-keeping done.")
+
+
+    def name_analyzer(self) -> 'ICUNameAnalyzer':
         """ Create a new analyzer for tokenizing names and queries
             using this tokinzer. Analyzers are context managers and should
             be used accordingly:
@@ -121,31 +178,36 @@ class LegacyICUTokenizer(AbstractTokenizer):
 
             Analyzers are not thread-safe. You need to instantiate one per thread.
         """
-        return LegacyICUNameAnalyzer(self.dsn, self.loader.make_sanitizer(),
-                                     self.loader.make_token_analysis())
+        assert self.loader is not None
+        return ICUNameAnalyzer(self.dsn, self.loader.make_sanitizer(),
+                               self.loader.make_token_analysis())
 
 
-    def _install_php(self, phpdir):
+    def _install_php(self, phpdir: Path, overwrite: bool = True) -> None:
         """ Install the php script for the tokenizer.
         """
+        assert self.loader is not None
         php_file = self.data_dir / "tokenizer.php"
-        php_file.write_text(dedent(f"""\
-            <?php
-            @define('CONST_Max_Word_Frequency', 10000000);
-            @define('CONST_Term_Normalization_Rules', "{self.loader.normalization_rules}");
-            @define('CONST_Transliteration', "{self.loader.get_search_rules()}");
-            require_once('{phpdir}/tokenizer/icu_tokenizer.php');"""))
+
+        if not php_file.exists() or overwrite:
+            php_file.write_text(dedent(f"""\
+                <?php
+                @define('CONST_Max_Word_Frequency', 10000000);
+                @define('CONST_Term_Normalization_Rules', "{self.loader.normalization_rules}");
+                @define('CONST_Transliteration', "{self.loader.get_search_rules()}");
+                require_once('{phpdir}/tokenizer/icu_tokenizer.php');"""), encoding='utf-8')
 
 
-    def _save_config(self):
+    def _save_config(self) -> None:
         """ Save the configuration that needs to remain stable for the given
             database as database properties.
         """
+        assert self.loader is not None
         with connect(self.dsn) as conn:
             self.loader.save_config_to_db(conn)
 
 
-    def _init_db_tables(self, config):
+    def _init_db_tables(self, config: Configuration) -> None:
         """ Set up the word table and fill it with pre-computed word
             frequencies.
         """
@@ -155,15 +217,16 @@ class LegacyICUTokenizer(AbstractTokenizer):
             conn.commit()
 
 
-class LegacyICUNameAnalyzer(AbstractAnalyzer):
-    """ The legacy analyzer uses the ICU library for splitting names.
+class ICUNameAnalyzer(AbstractAnalyzer):
+    """ The ICU analyzer uses the ICU library for splitting names.
 
         Each instance opens a connection to the database to request the
         normalization.
     """
 
-    def __init__(self, dsn, sanitizer, token_analysis):
-        self.conn = connect(dsn).connection
+    def __init__(self, dsn: str, sanitizer: PlaceSanitizer,
+                 token_analysis: ICUTokenAnalysis) -> None:
+        self.conn: Optional[Connection] = connect(dsn).connection
         self.conn.autocommit = True
         self.sanitizer = sanitizer
         self.token_analysis = token_analysis
@@ -171,7 +234,7 @@ class LegacyICUNameAnalyzer(AbstractAnalyzer):
         self._cache = _TokenCache()
 
 
-    def close(self):
+    def close(self) -> None:
         """ Free all resources used by the analyzer.
         """
         if self.conn:
@@ -179,20 +242,20 @@ class LegacyICUNameAnalyzer(AbstractAnalyzer):
             self.conn = None
 
 
-    def _search_normalized(self, name):
+    def _search_normalized(self, name: str) -> str:
         """ Return the search token transliteration of the given name.
         """
-        return self.token_analysis.search.transliterate(name).strip()
+        return cast(str, self.token_analysis.search.transliterate(name)).strip()
 
 
-    def _normalized(self, name):
+    def _normalized(self, name: str) -> str:
         """ Return the normalized version of the given name with all
             non-relevant information removed.
         """
-        return self.token_analysis.normalizer.transliterate(name).strip()
+        return cast(str, self.token_analysis.normalizer.transliterate(name)).strip()
 
 
-    def get_word_token_info(self, words):
+    def get_word_token_info(self, words: Sequence[str]) -> List[Tuple[str, str, int]]:
         """ Return token information for the given list of words.
             If a word starts with # it is assumed to be a full name
             otherwise is a partial name.
@@ -203,6 +266,7 @@ class LegacyICUNameAnalyzer(AbstractAnalyzer):
             The function is used for testing and debugging only
             and not necessarily efficient.
         """
+        assert self.conn is not None
         full_tokens = {}
         partial_tokens = {}
         for word in words:
@@ -225,8 +289,7 @@ class LegacyICUNameAnalyzer(AbstractAnalyzer):
                + [(k, v, part_ids.get(v, None)) for k, v in partial_tokens.items()]
 
 
-    @staticmethod
-    def normalize_postcode(postcode):
+    def normalize_postcode(self, postcode: str) -> str:
         """ Convert the postcode to a standardized form.
 
             This function must yield exactly the same result as the SQL function
@@ -235,52 +298,91 @@ class LegacyICUNameAnalyzer(AbstractAnalyzer):
         return postcode.strip().upper()
 
 
-    def _make_standard_hnr(self, hnr):
-        """ Create a normalised version of a housenumber.
-
-            This function takes minor shortcuts on transliteration.
-        """
-        return self._search_normalized(hnr)
-
-    def update_postcodes_from_db(self):
+    def update_postcodes_from_db(self) -> None:
         """ Update postcode tokens in the word table from the location_postcode
             table.
         """
-        to_delete = []
+        assert self.conn is not None
+        analyzer = self.token_analysis.analysis.get('@postcode')
+
         with self.conn.cursor() as cur:
-            # This finds us the rows in location_postcode and word that are
-            # missing in the other table.
-            cur.execute("""SELECT * FROM
-                            (SELECT pc, word FROM
-                              (SELECT distinct(postcode) as pc FROM location_postcode) p
-                              FULL JOIN
-                              (SELECT word FROM word WHERE type = 'P') w
-                              ON pc = word) x
-                           WHERE pc is null or word is null""")
-
-            with CopyBuffer() as copystr:
-                for postcode, word in cur:
-                    if postcode is None:
-                        to_delete.append(word)
-                    else:
-                        copystr.add(self._search_normalized(postcode),
-                                    'P', postcode)
-
-                if to_delete:
-                    cur.execute("""DELETE FROM WORD
-                                   WHERE type ='P' and word = any(%s)
-                                """, (to_delete, ))
-
-                copystr.copy_out(cur, 'word',
-                                 columns=['word_token', 'type', 'word'])
-
-
-    def update_special_phrases(self, phrases, should_replace):
+            # First get all postcode names currently in the word table.
+            cur.execute("SELECT DISTINCT word FROM word WHERE type = 'P'")
+            word_entries = set((entry[0] for entry in cur))
+
+            # Then compute the required postcode names from the postcode table.
+            needed_entries = set()
+            cur.execute("SELECT country_code, postcode FROM location_postcode")
+            for cc, postcode in cur:
+                info = PlaceInfo({'country_code': cc,
+                                  'class': 'place', 'type': 'postcode',
+                                  'address': {'postcode': postcode}})
+                address = self.sanitizer.process_names(info)[1]
+                for place in address:
+                    if place.kind == 'postcode':
+                        if analyzer is None:
+                            postcode_name = place.name.strip().upper()
+                            variant_base = None
+                        else:
+                            postcode_name = analyzer.get_canonical_id(place)
+                            variant_base = place.get_attr("variant")
+
+                        if variant_base:
+                            needed_entries.add(f'{postcode_name}@{variant_base}')
+                        else:
+                            needed_entries.add(postcode_name)
+                        break
+
+        # Now update the word table.
+        self._delete_unused_postcode_words(word_entries - needed_entries)
+        self._add_missing_postcode_words(needed_entries - word_entries)
+
+    def _delete_unused_postcode_words(self, tokens: Iterable[str]) -> None:
+        assert self.conn is not None
+        if tokens:
+            with self.conn.cursor() as cur:
+                cur.execute("DELETE FROM word WHERE type = 'P' and word = any(%s)",
+                            (list(tokens), ))
+
+    def _add_missing_postcode_words(self, tokens: Iterable[str]) -> None:
+        assert self.conn is not None
+        if not tokens:
+            return
+
+        analyzer = self.token_analysis.analysis.get('@postcode')
+        terms = []
+
+        for postcode_name in tokens:
+            if '@' in postcode_name:
+                term, variant = postcode_name.split('@', 2)
+                term = self._search_normalized(term)
+                if analyzer is None:
+                    variants = [term]
+                else:
+                    variants = analyzer.compute_variants(variant)
+                    if term not in variants:
+                        variants.append(term)
+            else:
+                variants = [self._search_normalized(postcode_name)]
+            terms.append((postcode_name, variants))
+
+        if terms:
+            with self.conn.cursor() as cur:
+                cur.execute_values("""SELECT create_postcode_word(pc, var)
+                                      FROM (VALUES %s) AS v(pc, var)""",
+                                   terms)
+
+
+
+
+    def update_special_phrases(self, phrases: Iterable[Tuple[str, str, str, str]],
+                               should_replace: bool) -> None:
         """ Replace the search index for special phrases with the new phrases.
             If `should_replace` is True, then the previous set of will be
             completely replaced. Otherwise the phrases are added to the
             already existing ones.
         """
+        assert self.conn is not None
         norm_phrases = set(((self._normalized(p[0]), p[1], p[2], p[3])
                             for p in phrases))
 
@@ -303,7 +405,9 @@ class LegacyICUNameAnalyzer(AbstractAnalyzer):
                  len(norm_phrases), added, deleted)
 
 
-    def _add_special_phrases(self, cursor, new_phrases, existing_phrases):
+    def _add_special_phrases(self, cursor: Cursor,
+                             new_phrases: Set[Tuple[str, str, str, str]],
+                             existing_phrases: Set[Tuple[str, str, str, str]]) -> int:
         """ Add all phrases to the database that are not yet there.
         """
         to_add = new_phrases - existing_phrases
@@ -324,9 +428,10 @@ class LegacyICUNameAnalyzer(AbstractAnalyzer):
         return added
 
 
-    @staticmethod
-    def _remove_special_phrases(cursor, new_phrases, existing_phrases):
-        """ Remove all phrases from the databse that are no longer in the
+    def _remove_special_phrases(self, cursor: Cursor,
+                             new_phrases: Set[Tuple[str, str, str, str]],
+                             existing_phrases: Set[Tuple[str, str, str, str]]) -> int:
+        """ Remove all phrases from the database that are no longer in the
             new phrase list.
         """
         to_delete = existing_phrases - new_phrases
@@ -342,21 +447,24 @@ class LegacyICUNameAnalyzer(AbstractAnalyzer):
         return len(to_delete)
 
 
-    def add_country_names(self, country_code, names):
-        """ Add names for the given country to the search index.
+    def add_country_names(self, country_code: str, names: Mapping[str, str]) -> None:
+        """ Add default names for the given country to the search index.
         """
         # Make sure any name preprocessing for country names applies.
         info = PlaceInfo({'name': names, 'country_code': country_code,
                           'rank_address': 4, 'class': 'boundary',
                           'type': 'administrative'})
         self._add_country_full_names(country_code,
-                                     self.sanitizer.process_names(info)[0])
+                                     self.sanitizer.process_names(info)[0],
+                                     internal=True)
 
 
-    def _add_country_full_names(self, country_code, names):
+    def _add_country_full_names(self, country_code: str, names: Sequence[PlaceName],
+                                internal: bool = False) -> None:
         """ Add names for the given country from an already sanitized
             name list.
         """
+        assert self.conn is not None
         word_tokens = set()
         for name in names:
             norm_name = self._search_normalized(name.name)
@@ -365,75 +473,127 @@ class LegacyICUNameAnalyzer(AbstractAnalyzer):
 
         with self.conn.cursor() as cur:
             # Get existing names
-            cur.execute("""SELECT word_token FROM word
-                            WHERE type = 'C' and word = %s""",
+            cur.execute("""SELECT word_token, coalesce(info ? 'internal', false) as is_internal
+                             FROM word
+                             WHERE type = 'C' and word = %s""",
                         (country_code, ))
-            word_tokens.difference_update((t[0] for t in cur))
+            # internal/external names
+            existing_tokens: Dict[bool, Set[str]] = {True: set(), False: set()}
+            for word in cur:
+                existing_tokens[word[1]].add(word[0])
+
+            # Delete names that no longer exist.
+            gone_tokens = existing_tokens[internal] - word_tokens
+            if internal:
+                gone_tokens.update(existing_tokens[False] & word_tokens)
+            if gone_tokens:
+                cur.execute("""DELETE FROM word
+                               USING unnest(%s) as token
+                               WHERE type = 'C' and word = %s
+                                     and word_token = token""",
+                            (list(gone_tokens), country_code))
 
             # Only add those names that are not yet in the list.
-            if word_tokens:
-                cur.execute("""INSERT INTO word (word_token, type, word)
-                               (SELECT token, 'C', %s
-                                FROM unnest(%s) as token)
-                            """, (country_code, list(word_tokens)))
-
-            # No names are deleted at the moment.
-            # If deletion is made possible, then the static names from the
-            # initial 'country_name' table should be kept.
-
-
-    def process_place(self, place):
+            new_tokens = word_tokens - existing_tokens[True]
+            if not internal:
+                new_tokens -= existing_tokens[False]
+            if new_tokens:
+                if internal:
+                    sql = """INSERT INTO word (word_token, type, word, info)
+                               (SELECT token, 'C', %s, '{"internal": "yes"}'
+                                  FROM unnest(%s) as token)
+                           """
+                else:
+                    sql = """INSERT INTO word (word_token, type, word)
+                                   (SELECT token, 'C', %s
+                                    FROM unnest(%s) as token)
+                          """
+                cur.execute(sql, (country_code, list(new_tokens)))
+
+
+    def process_place(self, place: PlaceInfo) -> Mapping[str, Any]:
         """ Determine tokenizer information about the given place.
 
             Returns a JSON-serializable structure that will be handed into
             the database via the token_info field.
         """
-        token_info = _TokenInfo(self._cache)
+        token_info = _TokenInfo()
 
         names, address = self.sanitizer.process_names(place)
 
         if names:
-            fulls, partials = self._compute_name_tokens(names)
-
-            token_info.add_names(fulls, partials)
+            token_info.set_names(*self._compute_name_tokens(names))
 
             if place.is_country():
+                assert place.country_code is not None
                 self._add_country_full_names(place.country_code, names)
 
         if address:
             self._process_place_address(token_info, address)
 
-        return token_info.data
+        return token_info.to_dict()
 
 
-    def _process_place_address(self, token_info, address):
-        hnrs = []
-        addr_terms = []
+    def _process_place_address(self, token_info: '_TokenInfo',
+                               address: Sequence[PlaceName]) -> None:
         for item in address:
             if item.kind == 'postcode':
-                self._add_postcode(item.name)
-            elif item.kind in ('housenumber', 'streetnumber', 'conscriptionnumber'):
-                hnrs.append(item.name)
+                token_info.set_postcode(self._add_postcode(item))
+            elif item.kind == 'housenumber':
+                token_info.add_housenumber(*self._compute_housenumber_token(item))
             elif item.kind == 'street':
-                token_info.add_street(self._compute_partial_tokens(item.name))
+                token_info.add_street(self._retrieve_full_tokens(item.name))
             elif item.kind == 'place':
-                token_info.add_place(self._compute_partial_tokens(item.name))
-            elif not item.kind.startswith('_') and \
-                 item.kind not in ('country', 'full'):
-                addr_terms.append((item.kind, self._compute_partial_tokens(item.name)))
-
-        if hnrs:
-            hnrs = self._split_housenumbers(hnrs)
-            token_info.add_housenumbers(self.conn, [self._make_standard_hnr(n) for n in hnrs])
+                if not item.suffix:
+                    token_info.add_place(self._compute_partial_tokens(item.name))
+            elif not item.kind.startswith('_') and not item.suffix and \
+                 item.kind not in ('country', 'full', 'inclusion'):
+                token_info.add_address_term(item.kind, self._compute_partial_tokens(item.name))
 
-        if addr_terms:
-            token_info.add_address_terms(addr_terms)
 
+    def _compute_housenumber_token(self, hnr: PlaceName) -> Tuple[Optional[int], Optional[str]]:
+        """ Normalize the housenumber and return the word token and the
+            canonical form.
+        """
+        assert self.conn is not None
+        analyzer = self.token_analysis.analysis.get('@housenumber')
+        result: Tuple[Optional[int], Optional[str]] = (None, None)
 
-    def _compute_partial_tokens(self, name):
+        if analyzer is None:
+            # When no custom analyzer is set, simply normalize and transliterate
+            norm_name = self._search_normalized(hnr.name)
+            if norm_name:
+                result = self._cache.housenumbers.get(norm_name, result)
+                if result[0] is None:
+                    with self.conn.cursor() as cur:
+                        hid = cur.scalar("SELECT getorcreate_hnr_id(%s)", (norm_name, ))
+
+                        result = hid, norm_name
+                        self._cache.housenumbers[norm_name] = result
+        else:
+            # Otherwise use the analyzer to determine the canonical name.
+            # Per convention we use the first variant as the 'lookup name', the
+            # name that gets saved in the housenumber field of the place.
+            word_id = analyzer.get_canonical_id(hnr)
+            if word_id:
+                result = self._cache.housenumbers.get(word_id, result)
+                if result[0] is None:
+                    variants = analyzer.compute_variants(word_id)
+                    if variants:
+                        with self.conn.cursor() as cur:
+                            hid = cur.scalar("SELECT create_analyzed_hnr_id(%s, %s)",
+                                             (word_id, list(variants)))
+                            result = hid, variants[0]
+                            self._cache.housenumbers[word_id] = result
+
+        return result
+
+
+    def _compute_partial_tokens(self, name: str) -> List[int]:
         """ Normalize the given term, split it into partial words and return
             then token list for them.
         """
+        assert self.conn is not None
         norm_name = self._search_normalized(name)
 
         tokens = []
@@ -452,134 +612,189 @@ class LegacyICUNameAnalyzer(AbstractAnalyzer):
                             (need_lookup, ))
 
                 for partial, token in cur:
+                    assert token is not None
                     tokens.append(token)
                     self._cache.partials[partial] = token
 
         return tokens
 
 
-    def _compute_name_tokens(self, names):
+    def _retrieve_full_tokens(self, name: str) -> List[int]:
+        """ Get the full name token for the given name, if it exists.
+            The name is only retrieved for the standard analyser.
+        """
+        assert self.conn is not None
+        norm_name = self._search_normalized(name)
+
+        # return cached if possible
+        if norm_name in self._cache.fulls:
+            return self._cache.fulls[norm_name]
+
+        with self.conn.cursor() as cur:
+            cur.execute("SELECT word_id FROM word WHERE word_token = %s and type = 'W'",
+                        (norm_name, ))
+            full = [row[0] for row in cur]
+
+        self._cache.fulls[norm_name] = full
+
+        return full
+
+
+    def _compute_name_tokens(self, names: Sequence[PlaceName]) -> Tuple[Set[int], Set[int]]:
         """ Computes the full name and partial name tokens for the given
             dictionary of names.
         """
-        full_tokens = set()
-        partial_tokens = set()
+        assert self.conn is not None
+        full_tokens: Set[int] = set()
+        partial_tokens: Set[int] = set()
 
         for name in names:
             analyzer_id = name.get_attr('analyzer')
-            norm_name = self._normalized(name.name)
+            analyzer = self.token_analysis.get_analyzer(analyzer_id)
+            word_id = analyzer.get_canonical_id(name)
             if analyzer_id is None:
-                token_id = norm_name
+                token_id = word_id
             else:
-                token_id = f'{norm_name}@{analyzer_id}'
+                token_id = f'{word_id}@{analyzer_id}'
 
             full, part = self._cache.names.get(token_id, (None, None))
             if full is None:
-                variants = self.token_analysis.analysis[analyzer_id].get_variants_ascii(norm_name)
+                variants = analyzer.compute_variants(word_id)
                 if not variants:
                     continue
 
                 with self.conn.cursor() as cur:
-                    cur.execute("SELECT (getorcreate_full_word(%s, %s)).*",
+                    cur.execute("SELECT * FROM getorcreate_full_word(%s, %s)",
                                 (token_id, variants))
-                    full, part = cur.fetchone()
+                    full, part = cast(Tuple[int, List[int]], cur.fetchone())
 
                 self._cache.names[token_id] = (full, part)
 
+            assert part is not None
+
             full_tokens.add(full)
             partial_tokens.update(part)
 
         return full_tokens, partial_tokens
 
 
-    def _add_postcode(self, postcode):
+    def _add_postcode(self, item: PlaceName) -> Optional[str]:
         """ Make sure the normalized postcode is present in the word table.
         """
-        if re.search(r'[:,;]', postcode) is None:
-            postcode = self.normalize_postcode(postcode)
+        assert self.conn is not None
+        analyzer = self.token_analysis.analysis.get('@postcode')
 
-            if postcode not in self._cache.postcodes:
-                term = self._search_normalized(postcode)
-                if not term:
-                    return
+        if analyzer is None:
+            postcode_name = item.name.strip().upper()
+            variant_base = None
+        else:
+            postcode_name = analyzer.get_canonical_id(item)
+            variant_base = item.get_attr("variant")
 
-                with self.conn.cursor() as cur:
-                    # no word_id needed for postcodes
-                    cur.execute("""INSERT INTO word (word_token, type, word)
-                                   (SELECT %s, 'P', pc FROM (VALUES (%s)) as v(pc)
-                                    WHERE NOT EXISTS
-                                     (SELECT * FROM word
-                                      WHERE type = 'P' and word = pc))
-                                """, (term, postcode))
-                self._cache.postcodes.add(postcode)
-
-
-    @staticmethod
-    def _split_housenumbers(hnrs):
-        if len(hnrs) > 1 or ',' in hnrs[0] or ';' in hnrs[0]:
-            # split numbers if necessary
-            simple_list = []
-            for hnr in hnrs:
-                simple_list.extend((x.strip() for x in re.split(r'[;,]', hnr)))
-
-            if len(simple_list) > 1:
-                hnrs = list(set(simple_list))
-            else:
-                hnrs = simple_list
+        if variant_base:
+            postcode = f'{postcode_name}@{variant_base}'
+        else:
+            postcode = postcode_name
 
-        return hnrs
+        if postcode not in self._cache.postcodes:
+            term = self._search_normalized(postcode_name)
+            if not term:
+                return None
 
+            variants = {term}
+            if analyzer is not None and variant_base:
+                variants.update(analyzer.compute_variants(variant_base))
+
+            with self.conn.cursor() as cur:
+                cur.execute("SELECT create_postcode_word(%s, %s)",
+                            (postcode, list(variants)))
+            self._cache.postcodes.add(postcode)
 
+        return postcode_name
 
 
 class _TokenInfo:
     """ Collect token information to be sent back to the database.
     """
-    def __init__(self, cache):
-        self._cache = cache
-        self.data = {}
+    def __init__(self) -> None:
+        self.names: Optional[str] = None
+        self.housenumbers: Set[str] = set()
+        self.housenumber_tokens: Set[int] = set()
+        self.street_tokens: Set[int] = set()
+        self.place_tokens: Set[int] = set()
+        self.address_tokens: Dict[str, str] = {}
+        self.postcode: Optional[str] = None
+
+
+    def _mk_array(self, tokens: Iterable[Any]) -> str:
+        return f"{{{','.join((str(s) for s in tokens))}}}"
+
+
+    def to_dict(self) -> Dict[str, Any]:
+        """ Return the token information in database importable format.
+        """
+        out: Dict[str, Any] = {}
+
+        if self.names:
+            out['names'] = self.names
+
+        if self.housenumbers:
+            out['hnr'] = ';'.join(self.housenumbers)
+            out['hnr_tokens'] = self._mk_array(self.housenumber_tokens)
+
+        if self.street_tokens:
+            out['street'] = self._mk_array(self.street_tokens)
+
+        if self.place_tokens:
+            out['place'] = self._mk_array(self.place_tokens)
 
-    @staticmethod
-    def _mk_array(tokens):
-        return '{%s}' % ','.join((str(s) for s in tokens))
+        if self.address_tokens:
+            out['addr'] = self.address_tokens
 
+        if self.postcode:
+            out['postcode'] = self.postcode
 
-    def add_names(self, fulls, partials):
+        return out
+
+
+    def set_names(self, fulls: Iterable[int], partials: Iterable[int]) -> None:
         """ Adds token information for the normalised names.
         """
-        self.data['names'] = self._mk_array(itertools.chain(fulls, partials))
+        self.names = self._mk_array(itertools.chain(fulls, partials))
 
 
-    def add_housenumbers(self, conn, hnrs):
+    def add_housenumber(self, token: Optional[int], hnr: Optional[str]) -> None:
         """ Extract housenumber information from a list of normalised
             housenumbers.
         """
-        self.data['hnr_tokens'] = self._mk_array(self._cache.get_hnr_tokens(conn, hnrs))
-        self.data['hnr'] = ';'.join(hnrs)
+        if token:
+            assert hnr is not None
+            self.housenumbers.add(hnr)
+            self.housenumber_tokens.add(token)
 
 
-    def add_street(self, tokens):
+    def add_street(self, tokens: Iterable[int]) -> None:
         """ Add addr:street match terms.
         """
-        if tokens:
-            self.data['street'] = self._mk_array(tokens)
+        self.street_tokens.update(tokens)
 
 
-    def add_place(self, tokens):
+    def add_place(self, tokens: Iterable[int]) -> None:
         """ Add addr:place search and match terms.
         """
-        if tokens:
-            self.data['place'] = self._mk_array(tokens)
+        self.place_tokens.update(tokens)
 
 
-    def add_address_terms(self, terms):
+    def add_address_term(self, key: str, partials: Iterable[int]) -> None:
         """ Add additional address terms.
         """
-        tokens = {key: self._mk_array(partials)
-                  for key, partials in terms if partials}
+        if partials:
+            self.address_tokens[key] = self._mk_array(partials)
 
-        if tokens:
-            self.data['addr'] = tokens
+    def set_postcode(self, postcode: Optional[str]) -> None:
+        """ Set the postcode to the given one.
+        """
+        self.postcode = postcode
 
 
 class _TokenCache:
@@ -588,34 +803,9 @@ class _TokenCache:
         This cache is not thread-safe and needs to be instantiated per
         analyzer.
     """
-    def __init__(self):
-        self.names = {}
-        self.partials = {}
-        self.postcodes = set()
-        self.housenumbers = {}
-
-
-    def get_hnr_tokens(self, conn, terms):
-        """ Get token ids for a list of housenumbers, looking them up in the
-            database if necessary. `terms` is an iterable of normalized
-            housenumbers.
-        """
-        tokens = []
-        askdb = []
-
-        for term in terms:
-            token = self.housenumbers.get(term)
-            if token is None:
-                askdb.append(term)
-            else:
-                tokens.append(token)
-
-        if askdb:
-            with conn.cursor() as cur:
-                cur.execute("SELECT nr, getorcreate_hnr_id(nr) FROM unnest(%s) as nr",
-                            (askdb, ))
-                for term, tid in cur:
-                    self.housenumbers[term] = tid
-                    tokens.append(tid)
-
-        return tokens
+    def __init__(self) -> None:
+        self.names: Dict[str, Tuple[int, List[int]]] = {}
+        self.partials: Dict[str, int] = {}
+        self.fulls: Dict[str, List[int]] = {}
+        self.postcodes: Set[str] = set()
+        self.housenumbers: Dict[str, Tuple[Optional[int], Optional[str]]] = {}
index b720bbddbec9c4a730db8da6314abfe17c79136a..1b0b2980f9048f0fb42ac82e9b5bc8c8fe4f6298 100644 (file)
@@ -1,8 +1,17 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# This file is part of Nominatim. (https://nominatim.org)
+#
+# Copyright (C) 2022 by the Nominatim developer community.
+# For a full list of authors see the git log.
 """
 Tokenizer implementing normalisation as used before Nominatim 4.
 """
+from typing import Optional, Sequence, List, Tuple, Mapping, Any, Callable, \
+                   cast, Dict, Set, Iterable
 from collections import OrderedDict
 import logging
+from pathlib import Path
 import re
 import shutil
 from textwrap import dedent
@@ -11,10 +20,12 @@ from icu import Transliterator
 import psycopg2
 import psycopg2.extras
 
-from nominatim.db.connection import connect
+from nominatim.db.connection import connect, Connection
+from nominatim.config import Configuration
 from nominatim.db import properties
 from nominatim.db import utils as db_utils
 from nominatim.db.sql_preprocessor import SQLPreprocessor
+from nominatim.data.place_info import PlaceInfo
 from nominatim.errors import UsageError
 from nominatim.tokenizer.base import AbstractAnalyzer, AbstractTokenizer
 
@@ -23,13 +34,13 @@ DBCFG_MAXWORDFREQ = "tokenizer_maxwordfreq"
 
 LOG = logging.getLogger()
 
-def create(dsn, data_dir):
+def create(dsn: str, data_dir: Path) -> 'LegacyTokenizer':
     """ Create a new instance of the tokenizer provided by this module.
     """
     return LegacyTokenizer(dsn, data_dir)
 
 
-def _install_module(config_module_path, src_dir, module_dir):
+def _install_module(config_module_path: str, src_dir: Path, module_dir: Path) -> str:
     """ Copies the PostgreSQL normalisation module into the project
         directory if necessary. For historical reasons the module is
         saved in the '/module' subdirectory and not with the other tokenizer
@@ -46,7 +57,7 @@ def _install_module(config_module_path, src_dir, module_dir):
     # Compatibility mode for builddir installations.
     if module_dir.exists() and src_dir.samefile(module_dir):
         LOG.info('Running from build directory. Leaving database module as is.')
-        return module_dir
+        return str(module_dir)
 
     # In any other case install the module in the project directory.
     if not module_dir.exists():
@@ -58,20 +69,20 @@ def _install_module(config_module_path, src_dir, module_dir):
 
     LOG.info('Database module installed at %s', str(destfile))
 
-    return module_dir
+    return str(module_dir)
 
 
-def _check_module(module_dir, conn):
+def _check_module(module_dir: str, conn: Connection) -> None:
     """ Try to use the PostgreSQL module to confirm that it is correctly
         installed and accessible from PostgreSQL.
     """
     with conn.cursor() as cur:
         try:
             cur.execute("""CREATE FUNCTION nominatim_test_import_func(text)
-                           RETURNS text AS '{}/nominatim.so', 'transliteration'
+                           RETURNS text AS %s, 'transliteration'
                            LANGUAGE c IMMUTABLE STRICT;
                            DROP FUNCTION nominatim_test_import_func(text)
-                        """.format(module_dir))
+                        """, (f'{module_dir}/nominatim.so', ))
         except psycopg2.DatabaseError as err:
             LOG.fatal("Error accessing database module: %s", err)
             raise UsageError("Database module cannot be accessed.") from err
@@ -83,13 +94,13 @@ class LegacyTokenizer(AbstractTokenizer):
         calls to the database.
     """
 
-    def __init__(self, dsn, data_dir):
+    def __init__(self, dsn: str, data_dir: Path) -> None:
         self.dsn = dsn
         self.data_dir = data_dir
-        self.normalization = None
+        self.normalization: Optional[str] = None
 
 
-    def init_new_db(self, config, init_db=True):
+    def init_new_db(self, config: Configuration, init_db: bool = True) -> None:
         """ Set up a new tokenizer for the database.
 
             This copies all necessary data in the project directory to make
@@ -101,7 +112,7 @@ class LegacyTokenizer(AbstractTokenizer):
 
         self.normalization = config.TERM_NORMALIZATION
 
-        self._install_php(config)
+        self._install_php(config, overwrite=True)
 
         with connect(self.dsn) as conn:
             _check_module(module_dir, conn)
@@ -113,14 +124,20 @@ class LegacyTokenizer(AbstractTokenizer):
             self._init_db_tables(config)
 
 
-    def init_from_project(self, _):
+    def init_from_project(self, config: Configuration) -> None:
         """ Initialise the tokenizer from the project directory.
         """
         with connect(self.dsn) as conn:
             self.normalization = properties.get_property(conn, DBCFG_NORMALIZATION)
 
+        if not (config.project_dir / 'module' / 'nominatim.so').exists():
+            _install_module(config.DATABASE_MODULE_PATH,
+                            config.lib_dir.module,
+                            config.project_dir / 'module')
 
-    def finalize_import(self, config):
+        self._install_php(config, overwrite=False)
+
+    def finalize_import(self, config: Configuration) -> None:
         """ Do any required postprocessing to make the tokenizer data ready
             for use.
         """
@@ -129,7 +146,7 @@ class LegacyTokenizer(AbstractTokenizer):
             sqlp.run_sql_file(conn, 'tokenizer/legacy_tokenizer_indices.sql')
 
 
-    def update_sql_functions(self, config):
+    def update_sql_functions(self, config: Configuration) -> None:
         """ Reimport the SQL functions for this tokenizer.
         """
         with connect(self.dsn) as conn:
@@ -142,7 +159,7 @@ class LegacyTokenizer(AbstractTokenizer):
                               modulepath=modulepath)
 
 
-    def check_database(self, _):
+    def check_database(self, _: Configuration) -> Optional[str]:
         """ Check that the tokenizer is set up correctly.
         """
         hint = """\
@@ -169,7 +186,7 @@ class LegacyTokenizer(AbstractTokenizer):
         return None
 
 
-    def migrate_database(self, config):
+    def migrate_database(self, config: Configuration) -> None:
         """ Initialise the project directory of an existing database for
             use with this tokenizer.
 
@@ -186,7 +203,7 @@ class LegacyTokenizer(AbstractTokenizer):
             self._save_config(conn, config)
 
 
-    def update_statistics(self):
+    def update_statistics(self) -> None:
         """ Recompute the frequency of full words.
         """
         with connect(self.dsn) as conn:
@@ -205,7 +222,14 @@ class LegacyTokenizer(AbstractTokenizer):
                     cur.drop_table("word_frequencies")
             conn.commit()
 
-    def name_analyzer(self):
+
+    def update_word_tokens(self) -> None:
+        """ No house-keeping implemented for the legacy tokenizer.
+        """
+        LOG.info("No tokenizer clean-up available.")
+
+
+    def name_analyzer(self) -> 'LegacyNameAnalyzer':
         """ Create a new analyzer for tokenizing names and queries
             using this tokinzer. Analyzers are context managers and should
             be used accordingly:
@@ -225,19 +249,21 @@ class LegacyTokenizer(AbstractTokenizer):
         return LegacyNameAnalyzer(self.dsn, normalizer)
 
 
-    def _install_php(self, config):
+    def _install_php(self, config: Configuration, overwrite: bool = True) -> None:
         """ Install the php script for the tokenizer.
         """
         php_file = self.data_dir / "tokenizer.php"
-        php_file.write_text(dedent("""\
-            <?php
-            @define('CONST_Max_Word_Frequency', {0.MAX_WORD_FREQUENCY});
-            @define('CONST_Term_Normalization_Rules', "{0.TERM_NORMALIZATION}");
-            require_once('{0.lib_dir.php}/tokenizer/legacy_tokenizer.php');
-            """.format(config)))
+
+        if not php_file.exists() or overwrite:
+            php_file.write_text(dedent(f"""\
+                <?php
+                @define('CONST_Max_Word_Frequency', {config.MAX_WORD_FREQUENCY});
+                @define('CONST_Term_Normalization_Rules', "{config.TERM_NORMALIZATION}");
+                require_once('{config.lib_dir.php}/tokenizer/legacy_tokenizer.php');
+                """), encoding='utf-8')
 
 
-    def _init_db_tables(self, config):
+    def _init_db_tables(self, config: Configuration) -> None:
         """ Set up the word table and fill it with pre-computed word
             frequencies.
         """
@@ -250,10 +276,12 @@ class LegacyTokenizer(AbstractTokenizer):
         db_utils.execute_file(self.dsn, config.lib_dir.data / 'words.sql')
 
 
-    def _save_config(self, conn, config):
+    def _save_config(self, conn: Connection, config: Configuration) -> None:
         """ Save the configuration that needs to remain stable for the given
             database as database properties.
         """
+        assert self.normalization is not None
+
         properties.set_property(conn, DBCFG_NORMALIZATION, self.normalization)
         properties.set_property(conn, DBCFG_MAXWORDFREQ, config.MAX_WORD_FREQUENCY)
 
@@ -266,8 +294,8 @@ class LegacyNameAnalyzer(AbstractAnalyzer):
         normalization.
     """
 
-    def __init__(self, dsn, normalizer):
-        self.conn = connect(dsn).connection
+    def __init__(self, dsn: str, normalizer: Any):
+        self.conn: Optional[Connection] = connect(dsn).connection
         self.conn.autocommit = True
         self.normalizer = normalizer
         psycopg2.extras.register_hstore(self.conn)
@@ -275,7 +303,7 @@ class LegacyNameAnalyzer(AbstractAnalyzer):
         self._cache = _TokenCache(self.conn)
 
 
-    def close(self):
+    def close(self) -> None:
         """ Free all resources used by the analyzer.
         """
         if self.conn:
@@ -283,7 +311,7 @@ class LegacyNameAnalyzer(AbstractAnalyzer):
             self.conn = None
 
 
-    def get_word_token_info(self, words):
+    def get_word_token_info(self, words: Sequence[str]) -> List[Tuple[str, str, int]]:
         """ Return token information for the given list of words.
             If a word starts with # it is assumed to be a full name
             otherwise is a partial name.
@@ -294,6 +322,7 @@ class LegacyNameAnalyzer(AbstractAnalyzer):
             The function is used for testing and debugging only
             and not necessarily efficient.
         """
+        assert self.conn is not None
         with self.conn.cursor() as cur:
             cur.execute("""SELECT t.term, word_token, word_id
                            FROM word, (SELECT unnest(%s::TEXT[]) as term) t
@@ -309,15 +338,14 @@ class LegacyNameAnalyzer(AbstractAnalyzer):
             return [(r[0], r[1], r[2]) for r in cur]
 
 
-    def normalize(self, phrase):
+    def normalize(self, phrase: str) -> str:
         """ Normalize the given phrase, i.e. remove all properties that
             are irrelevant for search.
         """
-        return self.normalizer.transliterate(phrase)
+        return cast(str, self.normalizer.transliterate(phrase))
 
 
-    @staticmethod
-    def normalize_postcode(postcode):
+    def normalize_postcode(self, postcode: str) -> str:
         """ Convert the postcode to a standardized form.
 
             This function must yield exactly the same result as the SQL function
@@ -326,10 +354,12 @@ class LegacyNameAnalyzer(AbstractAnalyzer):
         return postcode.strip().upper()
 
 
-    def update_postcodes_from_db(self):
+    def update_postcodes_from_db(self) -> None:
         """ Update postcode tokens in the word table from the location_postcode
             table.
         """
+        assert self.conn is not None
+
         with self.conn.cursor() as cur:
             # This finds us the rows in location_postcode and word that are
             # missing in the other table.
@@ -363,9 +393,12 @@ class LegacyNameAnalyzer(AbstractAnalyzer):
 
 
 
-    def update_special_phrases(self, phrases, should_replace):
+    def update_special_phrases(self, phrases: Iterable[Tuple[str, str, str, str]],
+                               should_replace: bool) -> None:
         """ Replace the search index for special phrases with the new phrases.
         """
+        assert self.conn is not None
+
         norm_phrases = set(((self.normalize(p[0]), p[1], p[2], p[3])
                             for p in phrases))
 
@@ -402,9 +435,11 @@ class LegacyNameAnalyzer(AbstractAnalyzer):
                  len(norm_phrases), len(to_add), len(to_delete))
 
 
-    def add_country_names(self, country_code, names):
+    def add_country_names(self, country_code: str, names: Mapping[str, str]) -> None:
         """ Add names for the given country to the search index.
         """
+        assert self.conn is not None
+
         with self.conn.cursor() as cur:
             cur.execute(
                 """INSERT INTO word (word_id, word_token, country_code)
@@ -416,12 +451,14 @@ class LegacyNameAnalyzer(AbstractAnalyzer):
                 """, (country_code, list(names.values()), country_code))
 
 
-    def process_place(self, place):
+    def process_place(self, place: PlaceInfo) -> Mapping[str, Any]:
         """ Determine tokenizer information about the given place.
 
             Returns a JSON-serialisable structure that will be handed into
             the database via the token_info field.
         """
+        assert self.conn is not None
+
         token_info = _TokenInfo(self._cache)
 
         names = place.name
@@ -430,6 +467,7 @@ class LegacyNameAnalyzer(AbstractAnalyzer):
             token_info.add_names(self.conn, names)
 
             if place.is_country():
+                assert place.country_code is not None
                 self.add_country_names(place.country_code, names)
 
         address = place.address
@@ -439,7 +477,8 @@ class LegacyNameAnalyzer(AbstractAnalyzer):
         return token_info.data
 
 
-    def _process_place_address(self, token_info, address):
+    def _process_place_address(self, token_info: '_TokenInfo', address: Mapping[str, str]) -> None:
+        assert self.conn is not None
         hnrs = []
         addr_terms = []
 
@@ -447,15 +486,17 @@ class LegacyNameAnalyzer(AbstractAnalyzer):
             if key == 'postcode':
                 # Make sure the normalized postcode is present in the word table.
                 if re.search(r'[:,;]', value) is None:
-                    self._cache.add_postcode(self.conn,
-                                             self.normalize_postcode(value))
+                    norm_pc = self.normalize_postcode(value)
+                    token_info.set_postcode(norm_pc)
+                    self._cache.add_postcode(self.conn, norm_pc)
             elif key in ('housenumber', 'streetnumber', 'conscriptionnumber'):
                 hnrs.append(value)
             elif key == 'street':
                 token_info.add_street(self.conn, value)
             elif key == 'place':
                 token_info.add_place(self.conn, value)
-            elif not key.startswith('_') and key not in ('country', 'full'):
+            elif not key.startswith('_') \
+                 and key not in ('country', 'full', 'inclusion'):
                 addr_terms.append((key, value))
 
         if hnrs:
@@ -469,12 +510,12 @@ class LegacyNameAnalyzer(AbstractAnalyzer):
 class _TokenInfo:
     """ Collect token information to be sent back to the database.
     """
-    def __init__(self, cache):
+    def __init__(self, cache: '_TokenCache') -> None:
         self.cache = cache
-        self.data = {}
+        self.data: Dict[str, Any] = {}
 
 
-    def add_names(self, conn, names):
+    def add_names(self, conn: Connection, names: Mapping[str, str]) -> None:
         """ Add token information for the names of the place.
         """
         with conn.cursor() as cur:
@@ -483,7 +524,7 @@ class _TokenInfo:
                                             (names, ))
 
 
-    def add_housenumbers(self, conn, hnrs):
+    def add_housenumbers(self, conn: Connection, hnrs: Sequence[str]) -> None:
         """ Extract housenumber information from the address.
         """
         if len(hnrs) == 1:
@@ -494,7 +535,7 @@ class _TokenInfo:
                 return
 
         # split numbers if necessary
-        simple_list = []
+        simple_list: List[str] = []
         for hnr in hnrs:
             simple_list.extend((x.strip() for x in re.split(r'[;,]', hnr)))
 
@@ -502,45 +543,53 @@ class _TokenInfo:
             simple_list = list(set(simple_list))
 
         with conn.cursor() as cur:
-            cur.execute("SELECT (create_housenumbers(%s)).* ", (simple_list, ))
-            self.data['hnr_tokens'], self.data['hnr'] = cur.fetchone()
+            cur.execute("SELECT * FROM create_housenumbers(%s)", (simple_list, ))
+            result = cur.fetchone()
+            assert result is not None
+            self.data['hnr_tokens'], self.data['hnr'] = result
 
 
-    def add_street(self, conn, street):
+    def set_postcode(self, postcode: str) -> None:
+        """ Set or replace the postcode token with the given value.
+        """
+        self.data['postcode'] = postcode
+
+    def add_street(self, conn: Connection, street: str) -> None:
         """ Add addr:street match terms.
         """
-        def _get_street(name):
+        def _get_street(name: str) -> List[int]:
             with conn.cursor() as cur:
-                return cur.scalar("SELECT word_ids_from_name(%s)::text", (name, ))
+                return cast(List[int],
+                            cur.scalar("SELECT word_ids_from_name(%s)::text", (name, )))
 
         tokens = self.cache.streets.get(street, _get_street)
         if tokens:
             self.data['street'] = tokens
 
 
-    def add_place(self, conn, place):
+    def add_place(self, conn: Connection, place: str) -> None:
         """ Add addr:place search and match terms.
         """
-        def _get_place(name):
+        def _get_place(name: str) -> Tuple[List[int], List[int]]:
             with conn.cursor() as cur:
                 cur.execute("""SELECT make_keywords(hstore('name' , %s))::text,
                                       word_ids_from_name(%s)::text""",
                             (name, name))
-                return cur.fetchone()
+                return cast(Tuple[List[int], List[int]], cur.fetchone())
 
         self.data['place_search'], self.data['place_match'] = \
             self.cache.places.get(place, _get_place)
 
 
-    def add_address_terms(self, conn, terms):
+    def add_address_terms(self, conn: Connection, terms: Sequence[Tuple[str, str]]) -> None:
         """ Add additional address terms.
         """
-        def _get_address_term(name):
+        def _get_address_term(name: str) -> Tuple[List[int], List[int]]:
             with conn.cursor() as cur:
                 cur.execute("""SELECT addr_ids_from_name(%s)::text,
                                       word_ids_from_name(%s)::text""",
                             (name, name))
-                return cur.fetchone()
+                return cast(Tuple[List[int], List[int]], cur.fetchone())
 
         tokens = {}
         for key, value in terms:
@@ -557,13 +606,12 @@ class _LRU:
         produce the item when there is a cache miss.
     """
 
-    def __init__(self, maxsize=128, init_data=None):
-        self.data = init_data or OrderedDict()
+    def __init__(self, maxsize: int = 128):
+        self.data: 'OrderedDict[str, Any]' = OrderedDict()
         self.maxsize = maxsize
-        if init_data is not None and len(init_data) > maxsize:
-            self.maxsize = len(init_data)
 
-    def get(self, key, generator):
+
+    def get(self, key: str, generator: Callable[[str], Any]) -> Any:
         """ Get the item with the given key from the cache. If nothing
             is found in the cache, generate the value through the
             generator function and store it in the cache.
@@ -586,7 +634,7 @@ class _TokenCache:
         This cache is not thread-safe and needs to be instantiated per
         analyzer.
     """
-    def __init__(self, conn):
+    def __init__(self, conn: Connection):
         # various LRU caches
         self.streets = _LRU(maxsize=256)
         self.places = _LRU(maxsize=128)
@@ -596,18 +644,18 @@ class _TokenCache:
         with conn.cursor() as cur:
             cur.execute("""SELECT i, ARRAY[getorcreate_housenumber_id(i::text)]::text
                            FROM generate_series(1, 100) as i""")
-            self._cached_housenumbers = {str(r[0]): r[1] for r in cur}
+            self._cached_housenumbers: Dict[str, str] = {str(r[0]): r[1] for r in cur}
 
         # For postcodes remember the ones that have already been added
-        self.postcodes = set()
+        self.postcodes: Set[str] = set()
 
-    def get_housenumber(self, number):
+    def get_housenumber(self, number: str) -> Optional[str]:
         """ Get a housenumber token from the cache.
         """
         return self._cached_housenumbers.get(number)
 
 
-    def add_postcode(self, conn, postcode):
+    def add_postcode(self, conn: Connection, postcode: str) -> None:
         """ Make sure the given postcode is in the database.
         """
         if postcode not in self.postcodes:
index 5961dcf0774a339390e137eda1ea093519cf971d..2f76fe344a518c96ca030edf6610a5088844e724 100644 (file)
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# This file is part of Nominatim. (https://nominatim.org)
+#
+# Copyright (C) 2022 by the Nominatim developer community.
+# For a full list of authors see the git log.
 """
 Handler for cleaning name and address tags in place information before it
 is handed to the token analysis.
 """
-import importlib
+from typing import Optional, List, Mapping, Sequence, Callable, Any, Tuple
 
 from nominatim.errors import UsageError
-
-class PlaceName:
-    """ A searchable name for a place together with properties.
-        Every name object saves the name proper and two basic properties:
-        * 'kind' describes the name of the OSM key used without any suffixes
-          (i.e. the part after the colon removed)
-        * 'suffix' contains the suffix of the OSM tag, if any. The suffix
-          is the part of the key after the first colon.
-        In addition to that, the name may have arbitrary additional attributes.
-        Which attributes are used, depends on the token analyser.
-    """
-
-    def __init__(self, name, kind, suffix):
-        self.name = name
-        self.kind = kind
-        self.suffix = suffix
-        self.attr = {}
-
-
-    def __repr__(self):
-        return f"PlaceName(name='{self.name}',kind='{self.kind}',suffix='{self.suffix}')"
-
-
-    def clone(self, name=None, kind=None, suffix=None, attr=None):
-        """ Create a deep copy of the place name, optionally with the
-            given parameters replaced. In the attribute list only the given
-            keys are updated. The list is not replaced completely.
-            In particular, the function cannot to be used to remove an
-            attribute from a place name.
-        """
-        newobj = PlaceName(name or self.name,
-                           kind or self.kind,
-                           suffix or self.suffix)
-
-        newobj.attr.update(self.attr)
-        if attr:
-            newobj.attr.update(attr)
-
-        return newobj
-
-
-    def set_attr(self, key, value):
-        """ Add the given property to the name. If the property was already
-            set, then the value is overwritten.
-        """
-        self.attr[key] = value
-
-
-    def get_attr(self, key, default=None):
-        """ Return the given property or the value of 'default' if it
-            is not set.
-        """
-        return self.attr.get(key, default)
-
-
-    def has_attr(self, key):
-        """ Check if the given attribute is set.
-        """
-        return key in self.attr
-
-
-class _ProcessInfo:
-    """ Container class for information handed into to handler functions.
-        The 'names' and 'address' members are mutable. A handler must change
-        them by either modifying the lists place or replacing the old content
-        with a new list.
-    """
-
-    def __init__(self, place):
-        self.place = place
-        self.names = self._convert_name_dict(place.name)
-        self.address = self._convert_name_dict(place.address)
-
-
-    @staticmethod
-    def _convert_name_dict(names):
-        """ Convert a dictionary of names into a list of PlaceNames.
-            The dictionary key is split into the primary part of the key
-            and the suffix (the part after an optional colon).
-        """
-        out = []
-
-        if names:
-            for key, value in names.items():
-                parts = key.split(':', 1)
-                out.append(PlaceName(value.strip(),
-                                     parts[0].strip(),
-                                     parts[1].strip() if len(parts) > 1 else None))
-
-        return out
+from nominatim.config import Configuration
+from nominatim.tokenizer.sanitizers.config import SanitizerConfig
+from nominatim.tokenizer.sanitizers.base import SanitizerHandler, ProcessInfo
+from nominatim.data.place_name import PlaceName
+from nominatim.data.place_info import PlaceInfo
 
 
 class PlaceSanitizer:
@@ -102,24 +23,29 @@ class PlaceSanitizer:
         names and address before they are used by the token analysers.
     """
 
-    def __init__(self, rules):
-        self.handlers = []
+    def __init__(self, rules: Optional[Sequence[Mapping[str, Any]]],
+                 config: Configuration) -> None:
+        self.handlers: List[Callable[[ProcessInfo], None]] = []
 
         if rules:
             for func in rules:
                 if 'step' not in func:
                     raise UsageError("Sanitizer rule is missing the 'step' attribute.")
-                module_name = 'nominatim.tokenizer.sanitizers.' + func['step'].replace('-', '_')
-                handler_module = importlib.import_module(module_name)
-                self.handlers.append(handler_module.create(func))
+                if not isinstance(func['step'], str):
+                    raise UsageError("'step' attribute must be a simple string.")
+
+                module: SanitizerHandler = \
+                    config.load_plugin_module(func['step'], 'nominatim.tokenizer.sanitizers')
+
+                self.handlers.append(module.create(SanitizerConfig(func)))
 
 
-    def process_names(self, place):
+    def process_names(self, place: PlaceInfo) -> Tuple[List[PlaceName], List[PlaceName]]:
         """ Extract a sanitized list of names and address parts from the
             given place. The function returns a tuple
             (list of names, list of address names)
         """
-        obj = _ProcessInfo(place)
+        obj = ProcessInfo(place)
 
         for func in self.handlers:
             func(obj)
diff --git a/nominatim/tokenizer/sanitizers/base.py b/nominatim/tokenizer/sanitizers/base.py
new file mode 100644 (file)
index 0000000..2de868c
--- /dev/null
@@ -0,0 +1,64 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# This file is part of Nominatim. (https://nominatim.org)
+#
+# Copyright (C) 2022 by the Nominatim developer community.
+# For a full list of authors see the git log.
+"""
+Common data types and protocols for sanitizers.
+"""
+from typing import Optional, List, Mapping, Callable
+
+from nominatim.tokenizer.sanitizers.config import SanitizerConfig
+from nominatim.data.place_info import PlaceInfo
+from nominatim.data.place_name import PlaceName
+from nominatim.typing import Protocol, Final
+
+
+class ProcessInfo:
+    """ Container class for information handed into to handler functions.
+        The 'names' and 'address' members are mutable. A handler must change
+        them by either modifying the lists place or replacing the old content
+        with a new list.
+    """
+
+    def __init__(self, place: PlaceInfo):
+        self.place: Final = place
+        self.names = self._convert_name_dict(place.name)
+        self.address = self._convert_name_dict(place.address)
+
+
+    @staticmethod
+    def _convert_name_dict(names: Optional[Mapping[str, str]]) -> List[PlaceName]:
+        """ Convert a dictionary of names into a list of PlaceNames.
+            The dictionary key is split into the primary part of the key
+            and the suffix (the part after an optional colon).
+        """
+        out = []
+
+        if names:
+            for key, value in names.items():
+                parts = key.split(':', 1)
+                out.append(PlaceName(value.strip(),
+                                     parts[0].strip(),
+                                     parts[1].strip() if len(parts) > 1 else None))
+
+        return out
+
+
+class SanitizerHandler(Protocol):
+    """ Protocol for sanitizer modules.
+    """
+
+    def create(self, config: SanitizerConfig) -> Callable[[ProcessInfo], None]:
+        """
+        Create a function for sanitizing a place.
+
+        Arguments:
+            config: A dictionary with the additional configuration options
+                    specified in the tokenizer configuration
+
+        Return:
+            The result must be a callable that takes a place description
+            and transforms name and address as reuqired.
+        """
diff --git a/nominatim/tokenizer/sanitizers/clean_housenumbers.py b/nominatim/tokenizer/sanitizers/clean_housenumbers.py
new file mode 100644 (file)
index 0000000..417d68d
--- /dev/null
@@ -0,0 +1,87 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# This file is part of Nominatim. (https://nominatim.org)
+#
+# Copyright (C) 2022 by the Nominatim developer community.
+# For a full list of authors see the git log.
+"""
+Sanitizer that preprocesses address tags for house numbers. The sanitizer
+allows to
+
+* define which tags are to be considered house numbers (see 'filter-kind')
+* split house number lists into individual numbers (see 'delimiters')
+
+Arguments:
+    delimiters: Define the set of characters to be used for
+                splitting a list of house numbers into parts. (default: ',;')
+    filter-kind: Define the address tags that are considered to be a
+                 house number. Either takes a single string or a list of strings,
+                 where each string is a regular expression. An address item
+                 is considered a house number if the 'kind' fully matches any
+                 of the given regular expressions. (default: 'housenumber')
+    convert-to-name: Define house numbers that should be treated as a name
+                     instead of a house number. Either takes a single string
+                     or a list of strings, where each string is a regular
+                     expression that must match the full house number value.
+"""
+from typing import Callable, Iterator, List
+import re
+
+from nominatim.tokenizer.sanitizers.base import ProcessInfo
+from nominatim.data.place_name import PlaceName
+from nominatim.tokenizer.sanitizers.config import SanitizerConfig
+
+class _HousenumberSanitizer:
+
+    def __init__(self, config: SanitizerConfig) -> None:
+        self.filter_kind = config.get_filter_kind('housenumber')
+        self.split_regexp = config.get_delimiter()
+
+        nameregexps = config.get_string_list('convert-to-name', [])
+        self.is_name_regexp = [re.compile(r) for r in nameregexps]
+
+
+
+    def __call__(self, obj: ProcessInfo) -> None:
+        if not obj.address:
+            return
+
+        new_address: List[PlaceName] = []
+        for item in obj.address:
+            if self.filter_kind(item.kind):
+                if self._treat_as_name(item.name):
+                    obj.names.append(item.clone(kind='housenumber'))
+                else:
+                    new_address.extend(item.clone(kind='housenumber', name=n)
+                                       for n in self.sanitize(item.name))
+            else:
+                # Don't touch other address items.
+                new_address.append(item)
+
+        obj.address = new_address
+
+
+    def sanitize(self, value: str) -> Iterator[str]:
+        """ Extract housenumbers in a regularized format from an OSM value.
+
+            The function works as a generator that yields all valid housenumbers
+            that can be created from the value.
+        """
+        for hnr in self.split_regexp.split(value):
+            if hnr:
+                yield from self._regularize(hnr)
+
+
+    def _regularize(self, hnr: str) -> Iterator[str]:
+        yield hnr
+
+
+    def _treat_as_name(self, housenumber: str) -> bool:
+        return any(r.fullmatch(housenumber) is not None for r in self.is_name_regexp)
+
+
+def create(config: SanitizerConfig) -> Callable[[ProcessInfo], None]:
+    """ Create a housenumber processing function.
+    """
+
+    return _HousenumberSanitizer(config)
diff --git a/nominatim/tokenizer/sanitizers/clean_postcodes.py b/nominatim/tokenizer/sanitizers/clean_postcodes.py
new file mode 100644 (file)
index 0000000..593f770
--- /dev/null
@@ -0,0 +1,80 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# This file is part of Nominatim. (https://nominatim.org)
+#
+# Copyright (C) 2022 by the Nominatim developer community.
+# For a full list of authors see the git log.
+"""
+Sanitizer that filters postcodes by their officially allowed pattern.
+
+Arguments:
+    convert-to-address: If set to 'yes' (the default), then postcodes that do
+                        not conform with their country-specific pattern are
+                        converted to an address component. That means that
+                        the postcode does not take part when computing the
+                        postcode centroids of a country but is still searchable.
+                        When set to 'no', non-conforming postcodes are not
+                        searchable either.
+    default-pattern:    Pattern to use, when there is none available for the
+                        country in question. Warning: will not be used for
+                        objects that have no country assigned. These are always
+                        assumed to have no postcode.
+"""
+from typing import Callable, Optional, Tuple
+
+from nominatim.data.postcode_format import PostcodeFormatter
+from nominatim.tokenizer.sanitizers.base import ProcessInfo
+from nominatim.tokenizer.sanitizers.config import SanitizerConfig
+
+class _PostcodeSanitizer:
+
+    def __init__(self, config: SanitizerConfig) -> None:
+        self.convert_to_address = config.get_bool('convert-to-address', True)
+        self.matcher = PostcodeFormatter()
+
+        default_pattern = config.get('default-pattern')
+        if default_pattern is not None and isinstance(default_pattern, str):
+            self.matcher.set_default_pattern(default_pattern)
+
+
+    def __call__(self, obj: ProcessInfo) -> None:
+        if not obj.address:
+            return
+
+        postcodes = ((i, o) for i, o in enumerate(obj.address) if o.kind == 'postcode')
+
+        for pos, postcode in postcodes:
+            formatted = self.scan(postcode.name, obj.place.country_code)
+
+            if formatted is None:
+                if self.convert_to_address:
+                    postcode.kind = 'unofficial_postcode'
+                else:
+                    obj.address.pop(pos)
+            else:
+                postcode.name = formatted[0]
+                postcode.set_attr('variant', formatted[1])
+
+
+    def scan(self, postcode: str, country: Optional[str]) -> Optional[Tuple[str, str]]:
+        """ Check the postcode for correct formatting and return the
+            normalized version. Returns None if the postcode does not
+            correspond to the official format of the given country.
+        """
+        match = self.matcher.match(country, postcode)
+        if match is None:
+            return None
+
+        assert country is not None
+
+        return self.matcher.normalize(country, match),\
+               ' '.join(filter(lambda p: p is not None, match.groups()))
+
+
+
+
+def create(config: SanitizerConfig) -> Callable[[ProcessInfo], None]:
+    """ Create a housenumber processing function.
+    """
+
+    return _PostcodeSanitizer(config)
diff --git a/nominatim/tokenizer/sanitizers/config.py b/nominatim/tokenizer/sanitizers/config.py
new file mode 100644 (file)
index 0000000..8b9164c
--- /dev/null
@@ -0,0 +1,131 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# This file is part of Nominatim. (https://nominatim.org)
+#
+# Copyright (C) 2022 by the Nominatim developer community.
+# For a full list of authors see the git log.
+"""
+Configuration for Sanitizers.
+"""
+from typing import Sequence, Optional, Pattern, Callable, Any, TYPE_CHECKING
+from collections import UserDict
+import re
+
+from nominatim.errors import UsageError
+
+# working around missing generics in Python < 3.8
+# See https://github.com/python/typing/issues/60#issuecomment-869757075
+if TYPE_CHECKING:
+    _BaseUserDict = UserDict[str, Any]
+else:
+    _BaseUserDict = UserDict
+
+class SanitizerConfig(_BaseUserDict):
+    """ The `SanitizerConfig` class is a read-only dictionary
+        with configuration options for the sanitizer.
+        In addition to the usual dictionary functions, the class provides
+        accessors to standard sanitizer options that are used by many of the
+        sanitizers.
+    """
+
+    def get_string_list(self, param: str, default: Sequence[str] = tuple()) -> Sequence[str]:
+        """ Extract a configuration parameter as a string list.
+
+            Arguments:
+                param: Name of the configuration parameter.
+                default: Value to return, when the parameter is missing.
+
+            Returns:
+                If the parameter value is a simple string, it is returned as a
+                one-item list. If the parameter value does not exist, the given
+                default is returned. If the parameter value is a list, it is
+                checked to contain only strings before being returned.
+        """
+        values = self.data.get(param, None)
+
+        if values is None:
+            return None if default is None else list(default)
+
+        if isinstance(values, str):
+            return [values] if values else []
+
+        if not isinstance(values, (list, tuple)):
+            raise UsageError(f"Parameter '{param}' must be string or list of strings.")
+
+        if any(not isinstance(value, str) for value in values):
+            raise UsageError(f"Parameter '{param}' must be string or list of strings.")
+
+        return values
+
+
+    def get_bool(self, param: str, default: Optional[bool] = None) -> bool:
+        """ Extract a configuration parameter as a boolean.
+
+            Arguments:
+                param: Name of the configuration parameter. The parameter must
+                       contain one of the yaml boolean values or an
+                       UsageError will be raised.
+                default: Value to return, when the parameter is missing.
+                         When set to `None`, the parameter must be defined.
+
+            Returns:
+                Boolean value of the given parameter.
+        """
+        value = self.data.get(param, default)
+
+        if not isinstance(value, bool):
+            raise UsageError(f"Parameter '{param}' must be a boolean value ('yes' or 'no'.")
+
+        return value
+
+
+    def get_delimiter(self, default: str = ',;') -> Pattern[str]:
+        """ Return the 'delimiters' parameter in the configuration as a
+            compiled regular expression that can be used to split strings on
+            these delimiters.
+
+            Arguments:
+                default: Delimiters to be used when 'delimiters' parameter
+                         is not explicitly configured.
+
+            Returns:
+                A regular expression pattern which can be used to
+                split a string. The regular expression makes sure that the
+                resulting names are stripped and that repeated delimiters
+                are ignored. It may still create empty fields on occasion. The
+                code needs to filter those.
+        """
+        delimiter_set = set(self.data.get('delimiters', default))
+        if not delimiter_set:
+            raise UsageError("Empty 'delimiter' parameter not allowed for sanitizer.")
+
+        return re.compile('\\s*[{}]+\\s*'.format(''.join('\\' + d for d in delimiter_set)))
+
+
+    def get_filter_kind(self, *default: str) -> Callable[[str], bool]:
+        """ Return a filter function for the name kind from the 'filter-kind'
+            config parameter.
+
+            If the 'filter-kind' parameter is empty, the filter lets all items
+            pass. If the parameter is a string, it is interpreted as a single
+            regular expression that must match the full kind string.
+            If the parameter is a list then
+            any of the regular expressions in the list must match to pass.
+
+            Arguments:
+                default: Filters to be used, when the 'filter-kind' parameter
+                         is not specified. If omitted then the default is to
+                         let all names pass.
+
+            Returns:
+                A filter function which takes a name string and returns
+                True when the item passes the filter.
+        """
+        filters = self.get_string_list('filter-kind', default)
+
+        if not filters:
+            return lambda _: True
+
+        regexes = [re.compile(regex) for regex in filters]
+
+        return lambda name: any(regex.fullmatch(name) for regex in regexes)
index 86385985053ef2623c1c016d458c2d51ae420d44..7d0667b4e323ce1aa060c3f0ae2738505173a476 100644 (file)
@@ -1,25 +1,28 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# This file is part of Nominatim. (https://nominatim.org)
+#
+# Copyright (C) 2022 by the Nominatim developer community.
+# For a full list of authors see the git log.
 """
 Sanitizer that splits lists of names into their components.
 
 Arguments:
     delimiters: Define the set of characters to be used for
-                splitting the list. (default: `,;`)
+                splitting the list. (default: ',;')
 """
-import re
+from typing import Callable
 
-from nominatim.errors import UsageError
+from nominatim.tokenizer.sanitizers.base import ProcessInfo
+from nominatim.tokenizer.sanitizers.config import SanitizerConfig
 
-def create(func):
+def create(config: SanitizerConfig) -> Callable[[ProcessInfo], None]:
     """ Create a name processing function that splits name values with
         multiple values into their components.
     """
-    delimiter_set = set(func.get('delimiters', ',;'))
-    if not delimiter_set:
-        raise UsageError("Set of delimiters in split-name-list sanitizer is empty.")
+    regexp = config.get_delimiter()
 
-    regexp = re.compile('\\s*[{}]\\s*'.format(''.join('\\' + d for d in delimiter_set)))
-
-    def _process(obj):
+    def _process(obj: ProcessInfo) -> None:
         if not obj.names:
             return
 
index caadc815edb8e71ec5bca387ee166c10bccd96cb..119d5693a58beee7ebfa2fa852b03cb312a5b441 100644 (file)
@@ -1,14 +1,25 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# This file is part of Nominatim. (https://nominatim.org)
+#
+# Copyright (C) 2022 by the Nominatim developer community.
+# For a full list of authors see the git log.
 """
 This sanitizer creates additional name variants for names that have
 addendums in brackets (e.g. "Halle (Saale)"). The additional variant contains
 only the main name part with the bracket part removed.
 """
+from typing import Callable
 
-def create(_):
+from nominatim.tokenizer.sanitizers.base import ProcessInfo
+from nominatim.tokenizer.sanitizers.config import SanitizerConfig
+
+
+def create(_: SanitizerConfig) -> Callable[[ProcessInfo], None]:
     """ Create a name processing function that creates additional name variants
         for bracket addendums.
     """
-    def _process(obj):
+    def _process(obj: ProcessInfo) -> None:
         """ Add variants for names that have a bracket extension.
         """
         if obj.names:
index 739e93136022076f6720aae1fe7bc48bafe88f6b..6d6430f034e0c10dfae13555e137b40ccae19484 100644 (file)
@@ -1,3 +1,9 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# This file is part of Nominatim. (https://nominatim.org)
+#
+# Copyright (C) 2022 by the Nominatim developer community.
+# For a full list of authors see the git log.
 """
 This sanitizer sets the `analyzer` property depending on the
 language of the tag. The language is taken from the suffix of the name.
@@ -7,7 +13,7 @@ Arguments:
 
     filter-kind: Restrict the names the sanitizer should be applied to
                  to the given tags. The parameter expects a list of
-                 regular expressions which are matched against `kind`.
+                 regular expressions which are matched against 'kind'.
                  Note that a match against the full string is expected.
     whitelist: Restrict the set of languages that should be tagged.
                Expects a list of acceptable suffixes. When unset,
@@ -24,32 +30,29 @@ Arguments:
           any analyzer tagged) is retained. (default: replace)
 
 """
-import re
+from typing import Callable, Dict, Optional, List
 
-from nominatim.tools import country_info
+from nominatim.data import country_info
+from nominatim.tokenizer.sanitizers.base import ProcessInfo
+from nominatim.tokenizer.sanitizers.config import SanitizerConfig
 
 class _AnalyzerByLanguage:
     """ Processor for tagging the language of names in a place.
     """
 
-    def __init__(self, config):
-        if 'filter-kind' in config:
-            self.regexes = [re.compile(regex) for regex in config['filter-kind']]
-        else:
-            self.regexes = None
-
+    def __init__(self, config: SanitizerConfig) -> None:
+        self.filter_kind = config.get_filter_kind()
         self.replace = config.get('mode', 'replace') != 'append'
         self.whitelist = config.get('whitelist')
 
-        self.__compute_default_languages(config.get('use-defaults', 'no'))
+        self._compute_default_languages(config.get('use-defaults', 'no'))
 
 
-    def __compute_default_languages(self, use_defaults):
-        self.deflangs = {}
+    def _compute_default_languages(self, use_defaults: str) -> None:
+        self.deflangs: Dict[Optional[str], List[str]] = {}
 
         if use_defaults in ('mono', 'all'):
-            for ccode, prop in country_info.iterate():
-                clangs = prop['languages']
+            for ccode, clangs in country_info.iterate('languages'):
                 if len(clangs) == 1 or use_defaults == 'all':
                     if self.whitelist:
                         self.deflangs[ccode] = [l for l in clangs if l in self.whitelist]
@@ -57,28 +60,21 @@ class _AnalyzerByLanguage:
                         self.deflangs[ccode] = clangs
 
 
-    def _kind_matches(self, kind):
-        if self.regexes is None:
-            return True
-
-        return any(regex.fullmatch(kind) for regex in self.regexes)
-
-
-    def _suffix_matches(self, suffix):
+    def _suffix_matches(self, suffix: str) -> bool:
         if self.whitelist is None:
             return len(suffix) in (2, 3) and suffix.islower()
 
         return suffix in self.whitelist
 
 
-    def __call__(self, obj):
+    def __call__(self, obj: ProcessInfo) -> None:
         if not obj.names:
             return
 
         more_names = []
 
         for name in (n for n in obj.names
-                     if not n.has_attr('analyzer') and self._kind_matches(n.kind)):
+                     if not n.has_attr('analyzer') and self.filter_kind(n.kind)):
             if name.suffix:
                 langs = [name.suffix] if self._suffix_matches(name.suffix) else None
             else:
@@ -96,7 +92,7 @@ class _AnalyzerByLanguage:
         obj.names.extend(more_names)
 
 
-def create(config):
+def create(config: SanitizerConfig) -> Callable[[ProcessInfo], None]:
     """ Create a function that sets the analyzer property depending on the
         language of the tag.
     """
diff --git a/nominatim/tokenizer/token_analysis/base.py b/nominatim/tokenizer/token_analysis/base.py
new file mode 100644 (file)
index 0000000..68046f9
--- /dev/null
@@ -0,0 +1,96 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# This file is part of Nominatim. (https://nominatim.org)
+#
+# Copyright (C) 2022 by the Nominatim developer community.
+# For a full list of authors see the git log.
+"""
+Common data types and protocols for analysers.
+"""
+from typing import Mapping, List, Any
+
+from nominatim.typing import Protocol
+from nominatim.data.place_name import PlaceName
+
+class Analyzer(Protocol):
+    """ The `create()` function of an analysis module needs to return an
+        object that implements the following functions.
+    """
+
+    def get_canonical_id(self, name: PlaceName) -> str:
+        """ Return the canonical form of the given name. The canonical ID must
+            be unique (the same ID must always yield the same variants) and
+            must be a form from which the variants can be derived.
+
+            Arguments:
+                name: Extended place name description as prepared by
+                      the sanitizers.
+
+            Returns:
+                ID string with a canonical form of the name. The string may
+                be empty, when the analyzer cannot analyze the name at all,
+                for example because the character set in use does not match.
+        """
+
+    def compute_variants(self, canonical_id: str) -> List[str]:
+        """ Compute the transliterated spelling variants for the given
+            canonical ID.
+
+            Arguments:
+                canonical_id: ID string previously computed with
+                              `get_canonical_id()`.
+
+            Returns:
+                A list of possible spelling variants. All strings must have
+                been transformed with the global normalizer and
+                transliterator ICU rules. Otherwise they cannot be matched
+                against the input by the query frontend.
+                The list may be empty, when there are no useful
+                spelling variants. This may happen when an analyzer only
+                usually outputs additional variants to the canonical spelling
+                and there are no such variants.
+        """
+
+
+class AnalysisModule(Protocol):
+    """ The setup of the token analysis is split into two parts:
+        configuration and analyser factory. A token analysis module must
+        therefore implement the two functions here described.
+    """
+
+    def configure(self, rules: Mapping[str, Any],
+                  normalizer: Any, transliterator: Any) -> Any:
+        """ Prepare the configuration of the analysis module.
+            This function should prepare all data that can be shared
+            between instances of this analyser.
+
+            Arguments:
+                rules: A dictionary with the additional configuration options
+                       as specified in the tokenizer configuration.
+                normalizer: an ICU Transliterator with the compiled
+                            global normalization rules.
+                transliterator: an ICU Transliterator with the compiled
+                                global transliteration rules.
+
+            Returns:
+                A data object with configuration data. This will be handed
+                as is into the `create()` function and may be
+                used freely by the analysis module as needed.
+        """
+
+    def create(self, normalizer: Any, transliterator: Any, config: Any) -> Analyzer:
+        """ Create a new instance of the analyser.
+            A separate instance of the analyser is created for each thread
+            when used in multi-threading context.
+
+            Arguments:
+                normalizer: an ICU Transliterator with the compiled normalization
+                            rules.
+                transliterator: an ICU Transliterator with the compiled
+                                transliteration rules.
+                config: The object that was returned by the call to configure().
+
+            Returns:
+                A new analyzer instance. This must be an object that implements
+                the Analyzer protocol.
+        """
diff --git a/nominatim/tokenizer/token_analysis/config_variants.py b/nominatim/tokenizer/token_analysis/config_variants.py
new file mode 100644 (file)
index 0000000..1258373
--- /dev/null
@@ -0,0 +1,139 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# This file is part of Nominatim. (https://nominatim.org)
+#
+# Copyright (C) 2022 by the Nominatim developer community.
+# For a full list of authors see the git log.
+"""
+Parser for configuration for variants.
+"""
+from typing import Any, Iterator, Tuple, List, Optional, Set, NamedTuple
+from collections import defaultdict
+import itertools
+import re
+
+from nominatim.config import flatten_config_list
+from nominatim.errors import UsageError
+
+class ICUVariant(NamedTuple):
+    """ A single replacement rule for variant creation.
+    """
+    source: str
+    replacement: str
+
+
+def get_variant_config(in_rules: Any,
+                       normalizer: Any) -> Tuple[List[Tuple[str, List[str]]], str]:
+    """ Convert the variant definition from the configuration into
+        replacement sets.
+
+        Returns a tuple containing the replacement set and the list of characters
+        used in the replacements.
+    """
+    immediate = defaultdict(list)
+    chars: Set[str] = set()
+
+    if in_rules:
+        vset: Set[ICUVariant] = set()
+        rules = flatten_config_list(in_rules, 'variants')
+
+        vmaker = _VariantMaker(normalizer)
+
+        for section in rules:
+            for rule in (section.get('words') or []):
+                vset.update(vmaker.compute(rule))
+
+        # Intermediate reorder by source. Also compute required character set.
+        for variant in vset:
+            if variant.source[-1] == ' ' and variant.replacement[-1] == ' ':
+                replstr = variant.replacement[:-1]
+            else:
+                replstr = variant.replacement
+            immediate[variant.source].append(replstr)
+            chars.update(variant.source)
+
+    return list(immediate.items()), ''.join(chars)
+
+
+class _VariantMaker:
+    """ Generator for all necessary ICUVariants from a single variant rule.
+
+        All text in rules is normalized to make sure the variants match later.
+    """
+
+    def __init__(self, normalizer: Any) -> None:
+        self.norm = normalizer
+
+
+    def compute(self, rule: Any) -> Iterator[ICUVariant]:
+        """ Generator for all ICUVariant tuples from a single variant rule.
+        """
+        parts = re.split(r'(\|)?([=-])>', rule)
+        if len(parts) != 4:
+            raise UsageError(f"Syntax error in variant rule: {rule}")
+
+        decompose = parts[1] is None
+        src_terms = [self._parse_variant_word(t) for t in parts[0].split(',')]
+        repl_terms = (self.norm.transliterate(t).strip() for t in parts[3].split(','))
+
+        # If the source should be kept, add a 1:1 replacement
+        if parts[2] == '-':
+            for src in src_terms:
+                if src:
+                    for froms, tos in _create_variants(*src, src[0], decompose):
+                        yield ICUVariant(froms, tos)
+
+        for src, repl in itertools.product(src_terms, repl_terms):
+            if src and repl:
+                for froms, tos in _create_variants(*src, repl, decompose):
+                    yield ICUVariant(froms, tos)
+
+
+    def _parse_variant_word(self, name: str) -> Optional[Tuple[str, str, str]]:
+        name = name.strip()
+        match = re.fullmatch(r'([~^]?)([^~$^]*)([~$]?)', name)
+        if match is None or (match.group(1) == '~' and match.group(3) == '~'):
+            raise UsageError(f"Invalid variant word descriptor '{name}'")
+        norm_name = self.norm.transliterate(match.group(2)).strip()
+        if not norm_name:
+            return None
+
+        return norm_name, match.group(1), match.group(3)
+
+
+_FLAG_MATCH = {'^': '^ ',
+               '$': ' ^',
+               '': ' '}
+
+
+def _create_variants(src: str, preflag: str, postflag: str,
+                     repl: str, decompose: bool) -> Iterator[Tuple[str, str]]:
+    if preflag == '~':
+        postfix = _FLAG_MATCH[postflag]
+        # suffix decomposition
+        src = src + postfix
+        repl = repl + postfix
+
+        yield src, repl
+        yield ' ' + src, ' ' + repl
+
+        if decompose:
+            yield src, ' ' + repl
+            yield ' ' + src, repl
+    elif postflag == '~':
+        # prefix decomposition
+        prefix = _FLAG_MATCH[preflag]
+        src = prefix + src
+        repl = prefix + repl
+
+        yield src, repl
+        yield src + ' ', repl + ' '
+
+        if decompose:
+            yield src, repl + ' '
+            yield src + ' ', repl
+    else:
+        prefix = _FLAG_MATCH[preflag]
+        postfix = _FLAG_MATCH[postflag]
+
+        yield prefix + src + postfix, prefix + repl + postfix
index 4b47889ebeeb74211ac323d7e0b5e25ad2037ae8..1ed9bf4d383107e0c00a071d3f768057499f432e 100644 (file)
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# This file is part of Nominatim. (https://nominatim.org)
+#
+# Copyright (C) 2022 by the Nominatim developer community.
+# For a full list of authors see the git log.
 """
 Generic processor for names that creates abbreviation variants.
 """
-from collections import defaultdict, namedtuple
+from typing import Mapping, Dict, Any, Iterable, Iterator, Optional, List, cast
 import itertools
-import re
 
-from icu import Transliterator
 import datrie
 
-from nominatim.config import flatten_config_list
 from nominatim.errors import UsageError
+from nominatim.data.place_name import PlaceName
+from nominatim.tokenizer.token_analysis.config_variants import get_variant_config
+from nominatim.tokenizer.token_analysis.generic_mutation import MutationVariantGenerator
 
 ### Configuration section
 
-ICUVariant = namedtuple('ICUVariant', ['source', 'replacement'])
-
-def configure(rules, normalization_rules):
+def configure(rules: Mapping[str, Any], normalizer: Any, _: Any) -> Dict[str, Any]:
     """ Extract and preprocess the configuration for this module.
     """
-    config = {}
+    config: Dict[str, Any] = {}
 
-    config['replacements'], config['chars'] = _get_variant_config(rules.get('variants'),
-                                                                  normalization_rules)
+    config['replacements'], config['chars'] = get_variant_config(rules.get('variants'),
+                                                                 normalizer)
     config['variant_only'] = rules.get('mode', '') == 'variant-only'
 
-    return config
-
-
-def _get_variant_config(rules, normalization_rules):
-    """ Convert the variant definition from the configuration into
-        replacement sets.
-    """
-    immediate = defaultdict(list)
-    chars = set()
-
-    if rules:
-        vset = set()
-        rules = flatten_config_list(rules, 'variants')
-
-        vmaker = _VariantMaker(normalization_rules)
-
-        for section in rules:
-            for rule in (section.get('words') or []):
-                vset.update(vmaker.compute(rule))
-
-        # Intermediate reorder by source. Also compute required character set.
-        for variant in vset:
-            if variant.source[-1] == ' ' and variant.replacement[-1] == ' ':
-                replstr = variant.replacement[:-1]
-            else:
-                replstr = variant.replacement
-            immediate[variant.source].append(replstr)
-            chars.update(variant.source)
-
-    return list(immediate.items()), ''.join(chars)
-
-
-class _VariantMaker:
-    """ Generater for all necessary ICUVariants from a single variant rule.
-
-        All text in rules is normalized to make sure the variants match later.
-    """
-
-    def __init__(self, norm_rules):
-        self.norm = Transliterator.createFromRules("rule_loader_normalization",
-                                                   norm_rules)
-
-
-    def compute(self, rule):
-        """ Generator for all ICUVariant tuples from a single variant rule.
-        """
-        parts = re.split(r'(\|)?([=-])>', rule)
-        if len(parts) != 4:
-            raise UsageError("Syntax error in variant rule: " + rule)
-
-        decompose = parts[1] is None
-        src_terms = [self._parse_variant_word(t) for t in parts[0].split(',')]
-        repl_terms = (self.norm.transliterate(t).strip() for t in parts[3].split(','))
-
-        # If the source should be kept, add a 1:1 replacement
-        if parts[2] == '-':
-            for src in src_terms:
-                if src:
-                    for froms, tos in _create_variants(*src, src[0], decompose):
-                        yield ICUVariant(froms, tos)
-
-        for src, repl in itertools.product(src_terms, repl_terms):
-            if src and repl:
-                for froms, tos in _create_variants(*src, repl, decompose):
-                    yield ICUVariant(froms, tos)
-
-
-    def _parse_variant_word(self, name):
-        name = name.strip()
-        match = re.fullmatch(r'([~^]?)([^~$^]*)([~$]?)', name)
-        if match is None or (match.group(1) == '~' and match.group(3) == '~'):
-            raise UsageError("Invalid variant word descriptor '{}'".format(name))
-        norm_name = self.norm.transliterate(match.group(2)).strip()
-        if not norm_name:
-            return None
-
-        return norm_name, match.group(1), match.group(3)
+    # parse mutation rules
+    config['mutations'] = []
+    for rule in rules.get('mutations', []):
+        if 'pattern' not in rule:
+            raise UsageError("Missing field 'pattern' in mutation configuration.")
+        if not isinstance(rule['pattern'], str):
+            raise UsageError("Field 'pattern' in mutation configuration "
+                             "must be a simple text field.")
+        if 'replacements' not in rule:
+            raise UsageError("Missing field 'replacements' in mutation configuration.")
+        if not isinstance(rule['replacements'], list):
+            raise UsageError("Field 'replacements' in mutation configuration "
+                             "must be a list of texts.")
+
+        config['mutations'].append((rule['pattern'], rule['replacements']))
 
-
-_FLAG_MATCH = {'^': '^ ',
-               '$': ' ^',
-               '': ' '}
-
-
-def _create_variants(src, preflag, postflag, repl, decompose):
-    if preflag == '~':
-        postfix = _FLAG_MATCH[postflag]
-        # suffix decomposition
-        src = src + postfix
-        repl = repl + postfix
-
-        yield src, repl
-        yield ' ' + src, ' ' + repl
-
-        if decompose:
-            yield src, ' ' + repl
-            yield ' ' + src, repl
-    elif postflag == '~':
-        # prefix decomposition
-        prefix = _FLAG_MATCH[preflag]
-        src = prefix + src
-        repl = prefix + repl
-
-        yield src, repl
-        yield src + ' ', repl + ' '
-
-        if decompose:
-            yield src, repl + ' '
-            yield src + ' ', repl
-    else:
-        prefix = _FLAG_MATCH[preflag]
-        postfix = _FLAG_MATCH[postflag]
-
-        yield prefix + src + postfix, prefix + repl + postfix
+    return config
 
 
 ### Analysis section
 
-def create(transliterator, config):
+def create(normalizer: Any, transliterator: Any,
+           config: Mapping[str, Any]) -> 'GenericTokenAnalysis':
     """ Create a new token analysis instance for this module.
     """
-    return GenericTokenAnalysis(transliterator, config)
+    return GenericTokenAnalysis(normalizer, transliterator, config)
 
 
 class GenericTokenAnalysis:
@@ -153,7 +61,8 @@ class GenericTokenAnalysis:
         and provides the functions to apply the transformations.
     """
 
-    def __init__(self, to_ascii, config):
+    def __init__(self, norm: Any, to_ascii: Any, config: Mapping[str, Any]) -> None:
+        self.norm = norm
         self.to_ascii = to_ascii
         self.variant_only = config['variant_only']
 
@@ -165,19 +74,51 @@ class GenericTokenAnalysis:
         else:
             self.replacements = None
 
+        # set up mutation rules
+        self.mutations = [MutationVariantGenerator(*cfg) for cfg in config['mutations']]
+
+
+    def get_canonical_id(self, name: PlaceName) -> str:
+        """ Return the normalized form of the name. This is the standard form
+            from which possible variants for the name can be derived.
+        """
+        return cast(str, self.norm.transliterate(name.name)).strip()
+
 
-    def get_variants_ascii(self, norm_name):
+    def compute_variants(self, norm_name: str) -> List[str]:
         """ Compute the spelling variants for the given normalized name
             and transliterate the result.
         """
+        variants = self._generate_word_variants(norm_name)
+
+        for mutation in self.mutations:
+            variants = mutation.generate(variants)
+
+        return [name for name in self._transliterate_unique_list(norm_name, variants) if name]
+
+
+    def _transliterate_unique_list(self, norm_name: str,
+                                   iterable: Iterable[str]) -> Iterator[Optional[str]]:
+        seen = set()
+        if self.variant_only:
+            seen.add(norm_name)
+
+        for variant in map(str.strip, iterable):
+            if variant not in seen:
+                seen.add(variant)
+                yield self.to_ascii.transliterate(variant).strip()
+
+
+    def _generate_word_variants(self, norm_name: str) -> Iterable[str]:
         baseform = '^ ' + norm_name + ' ^'
+        baselen = len(baseform)
         partials = ['']
 
         startpos = 0
         if self.replacements is not None:
             pos = 0
             force_space = False
-            while pos < len(baseform):
+            while pos < baselen:
                 full, repl = self.replacements.longest_prefix_item(baseform[pos:],
                                                                    (None, None))
                 if full is not None:
@@ -201,24 +142,9 @@ class GenericTokenAnalysis:
 
         # No variants detected? Fast return.
         if startpos == 0:
-            if self.variant_only:
-                return []
-
-            trans_name = self.to_ascii.transliterate(norm_name).strip()
-            return [trans_name] if trans_name else []
-
-        return self._compute_result_set(partials, baseform[startpos:],
-                                        norm_name if self.variant_only else '')
-
-
-    def _compute_result_set(self, partials, prefix, exclude):
-        results = set()
+            return (norm_name, )
 
-        for variant in partials:
-            vname = (variant + prefix)[1:-1].strip()
-            if vname != exclude:
-                trans_name = self.to_ascii.transliterate(vname).strip()
-                if trans_name:
-                    results.add(trans_name)
+        if startpos < baselen:
+            return (part[1:] + baseform[startpos:-1] for part in partials)
 
-        return list(results)
+        return (part[1:-1] for part in partials)
diff --git a/nominatim/tokenizer/token_analysis/generic_mutation.py b/nominatim/tokenizer/token_analysis/generic_mutation.py
new file mode 100644 (file)
index 0000000..612f558
--- /dev/null
@@ -0,0 +1,57 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# This file is part of Nominatim. (https://nominatim.org)
+#
+# Copyright (C) 2022 by the Nominatim developer community.
+# For a full list of authors see the git log.
+"""
+Creator for mutation variants for the generic token analysis.
+"""
+from typing import Sequence, Iterable, Iterator, Tuple
+import itertools
+import logging
+import re
+
+from nominatim.errors import UsageError
+
+LOG = logging.getLogger()
+
+def _zigzag(outer: Iterable[str], inner: Iterable[str]) -> Iterator[str]:
+    return itertools.chain.from_iterable(itertools.zip_longest(outer, inner, fillvalue=''))
+
+
+class MutationVariantGenerator:
+    """ Generates name variants by applying a regular expression to the name
+        and replacing it with one or more variants. When the regular expression
+        matches more than once, each occurrence is replaced with all replacement
+        patterns.
+    """
+
+    def __init__(self, pattern: str, replacements: Sequence[str]):
+        self.pattern = re.compile(pattern)
+        self.replacements = replacements
+
+        if self.pattern.groups > 0:
+            LOG.fatal("The mutation pattern %s contains a capturing group. "
+                      "This is not allowed.", pattern)
+            raise UsageError("Bad mutation pattern in configuration.")
+
+
+    def generate(self, names: Iterable[str]) -> Iterator[str]:
+        """ Generator function for the name variants. 'names' is an iterable
+            over a set of names for which the variants are to be generated.
+        """
+        for name in names:
+            parts = self.pattern.split(name)
+            if len(parts) == 1:
+                yield name
+            else:
+                for seps in self._fillers(len(parts)):
+                    yield ''.join(_zigzag(parts, seps))
+
+
+    def _fillers(self, num_parts: int) -> Iterator[Tuple[str, ...]]:
+        """ Returns a generator for strings to join the given number of string
+            parts in all possible combinations.
+        """
+        return itertools.product(self.replacements, repeat=num_parts - 1)
diff --git a/nominatim/tokenizer/token_analysis/housenumbers.py b/nominatim/tokenizer/token_analysis/housenumbers.py
new file mode 100644 (file)
index 0000000..a8ad3ec
--- /dev/null
@@ -0,0 +1,70 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# This file is part of Nominatim. (https://nominatim.org)
+#
+# Copyright (C) 2022 by the Nominatim developer community.
+# For a full list of authors see the git log.
+"""
+Specialized processor for housenumbers. Analyses common housenumber patterns
+and creates variants for them.
+"""
+from typing import Any, List, cast
+import re
+
+from nominatim.data.place_name import PlaceName
+from nominatim.tokenizer.token_analysis.generic_mutation import MutationVariantGenerator
+
+RE_NON_DIGIT = re.compile('[^0-9]')
+RE_DIGIT_ALPHA = re.compile(r'(\d)\s*([^\d\s␣])')
+RE_ALPHA_DIGIT = re.compile(r'([^\s\d␣])\s*(\d)')
+RE_NAMED_PART = re.compile(r'[a-z]{4}')
+
+### Configuration section
+
+def configure(*_: Any) -> None:
+    """ All behaviour is currently hard-coded.
+    """
+    return None
+
+### Analysis section
+
+def create(normalizer: Any, transliterator: Any, config: None) -> 'HousenumberTokenAnalysis': # pylint: disable=W0613
+    """ Create a new token analysis instance for this module.
+    """
+    return HousenumberTokenAnalysis(normalizer, transliterator)
+
+
+class HousenumberTokenAnalysis:
+    """ Detects common housenumber patterns and normalizes them.
+    """
+    def __init__(self, norm: Any, trans: Any) -> None:
+        self.norm = norm
+        self.trans = trans
+
+        self.mutator = MutationVariantGenerator('␣', (' ', ''))
+
+    def get_canonical_id(self, name: PlaceName) -> str:
+        """ Return the normalized form of the housenumber.
+        """
+        # shortcut for number-only numbers, which make up 90% of the data.
+        if RE_NON_DIGIT.search(name.name) is None:
+            return name.name
+
+        norm = cast(str, self.trans.transliterate(self.norm.transliterate(name.name)))
+        # If there is a significant non-numeric part, use as is.
+        if RE_NAMED_PART.search(norm) is None:
+            # Otherwise add optional spaces between digits and letters.
+            (norm_opt, cnt1) = RE_DIGIT_ALPHA.subn(r'\1␣\2', norm)
+            (norm_opt, cnt2) = RE_ALPHA_DIGIT.subn(r'\1␣\2', norm_opt)
+            # Avoid creating too many variants per number.
+            if cnt1 + cnt2 <= 4:
+                return norm_opt
+
+        return norm
+
+    def compute_variants(self, norm_name: str) -> List[str]:
+        """ Compute the spelling variants for the given normalized housenumber.
+
+            Generates variants for optional spaces (marked with '␣').
+        """
+        return list(self.mutator.generate([norm_name]))
diff --git a/nominatim/tokenizer/token_analysis/postcodes.py b/nominatim/tokenizer/token_analysis/postcodes.py
new file mode 100644 (file)
index 0000000..94e9364
--- /dev/null
@@ -0,0 +1,65 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# This file is part of Nominatim. (https://nominatim.org)
+#
+# Copyright (C) 2022 by the Nominatim developer community.
+# For a full list of authors see the git log.
+"""
+Specialized processor for postcodes. Supports a 'lookup' variant of the
+token, which produces variants with optional spaces.
+"""
+from typing import Any, List
+
+from nominatim.tokenizer.token_analysis.generic_mutation import MutationVariantGenerator
+from nominatim.data.place_name import PlaceName
+
+### Configuration section
+
+def configure(*_: Any) -> None:
+    """ All behaviour is currently hard-coded.
+    """
+    return None
+
+### Analysis section
+
+def create(normalizer: Any, transliterator: Any, config: None) -> 'PostcodeTokenAnalysis': # pylint: disable=W0613
+    """ Create a new token analysis instance for this module.
+    """
+    return PostcodeTokenAnalysis(normalizer, transliterator)
+
+
+class PostcodeTokenAnalysis:
+    """ Special normalization and variant generation for postcodes.
+
+        This analyser must not be used with anything but postcodes as
+        it follows some special rules: the canonial ID is the form that
+        is used for the output. `compute_variants` then needs to ensure that
+        the generated variants once more follow the standard normalization
+        and transliteration, so that postcodes are correctly recognised by
+        the search algorithm.
+    """
+    def __init__(self, norm: Any, trans: Any) -> None:
+        self.norm = norm
+        self.trans = trans
+
+        self.mutator = MutationVariantGenerator(' ', (' ', ''))
+
+
+    def get_canonical_id(self, name: PlaceName) -> str:
+        """ Return the standard form of the postcode.
+        """
+        return name.name.strip().upper()
+
+
+    def compute_variants(self, norm_name: str) -> List[str]:
+        """ Compute the spelling variants for the given normalized postcode.
+
+            Takes the canonical form of the postcode, normalizes it using the
+            standard rules and then creates variants of the result where
+            all spaces are optional.
+        """
+        # Postcodes follow their own transliteration rules.
+        # Make sure at this point, that the terms are normalized in a way
+        # that they are searchable with the standard transliteration rules.
+        return [self.trans.transliterate(term) for term in
+                self.mutator.generate([self.norm.transliterate(norm_name)]) if term]
index cab6fb8b89ce541f1054ad7887cd5aafcdd0d5c1..acf0a96976329a34f6e179628e796b05a73e483c 100644 (file)
@@ -1,3 +1,9 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# This file is part of Nominatim. (https://nominatim.org)
+#
+# Copyright (C) 2022 by the Nominatim developer community.
+# For a full list of authors see the git log.
 """
 Module with functions for importing, updating Nominatim databases
 as well as general maintenance helpers.
index fa356673219bd5e02d2019a05ee70ef86ff1b7ab..fc016fec80d6538268bb6b441b16660680b6bb38 100644 (file)
@@ -1,6 +1,13 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# This file is part of Nominatim. (https://nominatim.org)
+#
+# Copyright (C) 2022 by the Nominatim developer community.
+# For a full list of authors see the git log.
 """
 Function to add additional OSM data from a file or the API into the database.
 """
+from typing import Any, MutableMapping
 from pathlib import Path
 import logging
 import urllib
@@ -9,7 +16,7 @@ from nominatim.tools.exec_utils import run_osm2pgsql, get_url
 
 LOG = logging.getLogger()
 
-def add_data_from_file(fname, options):
+def add_data_from_file(fname: str, options: MutableMapping[str, Any]) -> int:
     """ Adds data from a OSM file to the database. The file may be a normal
         OSM file or a diff file in all formats supported by libosmium.
     """
@@ -21,7 +28,8 @@ def add_data_from_file(fname, options):
     return 0
 
 
-def add_osm_object(osm_type, osm_id, use_main_api, options):
+def add_osm_object(osm_type: str, osm_id: int, use_main_api: bool,
+                   options: MutableMapping[str, Any]) -> int:
     """ Add or update a single OSM object from the latest version of the
         API.
     """
@@ -44,3 +52,5 @@ def add_osm_object(osm_type, osm_id, use_main_api, options):
     options['import_data'] = get_url(base_url).encode('utf-8')
 
     run_osm2pgsql(options)
+
+    return 0
index 2e18cb6f854b2c06698d225f377bcbbc5982e241..da7845ebc949696145588b393664d4be2077eb37 100644 (file)
@@ -1,49 +1,89 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# This file is part of Nominatim. (https://nominatim.org)
+#
+# Copyright (C) 2022 by the Nominatim developer community.
+# For a full list of authors see the git log.
 """
 Functions for database analysis and maintenance.
 """
+from typing import Optional, Tuple, Any, cast
 import logging
 
+from psycopg2.extras import Json, register_hstore
+
+from nominatim.config import Configuration
+from nominatim.db.connection import connect, Cursor
+from nominatim.tokenizer import factory as tokenizer_factory
 from nominatim.errors import UsageError
+from nominatim.data.place_info import PlaceInfo
+from nominatim.typing import DictCursorResult
 
 LOG = logging.getLogger()
 
-def analyse_indexing(conn, osm_id=None, place_id=None):
+def _get_place_info(cursor: Cursor, osm_id: Optional[str],
+                    place_id: Optional[int]) -> DictCursorResult:
+    sql = """SELECT place_id, extra.*
+             FROM placex, LATERAL placex_indexing_prepare(placex) as extra
+          """
+
+    values: Tuple[Any, ...]
+    if osm_id:
+        osm_type = osm_id[0].upper()
+        if osm_type not in 'NWR' or not osm_id[1:].isdigit():
+            LOG.fatal('OSM ID must be of form <N|W|R><id>. Got: %s', osm_id)
+            raise UsageError("OSM ID parameter badly formatted")
+
+        sql += ' WHERE placex.osm_type = %s AND placex.osm_id = %s'
+        values = (osm_type, int(osm_id[1:]))
+    elif place_id is not None:
+        sql += ' WHERE placex.place_id = %s'
+        values = (place_id, )
+    else:
+        LOG.fatal("No OSM object given to index.")
+        raise UsageError("OSM object not found")
+
+    cursor.execute(sql + ' LIMIT 1', values)
+
+    if cursor.rowcount < 1:
+        LOG.fatal("OSM object %s not found in database.", osm_id)
+        raise UsageError("OSM object not found")
+
+    return cast(DictCursorResult, cursor.fetchone())
+
+
+def analyse_indexing(config: Configuration, osm_id: Optional[str] = None,
+                     place_id: Optional[int] = None) -> None:
     """ Analyse indexing of a single Nominatim object.
     """
-    with conn.cursor() as cur:
-        if osm_id:
-            osm_type = osm_id[0].upper()
-            if osm_type not in 'NWR' or not osm_id[1:].isdigit():
-                LOG.fatal('OSM ID must be of form <N|W|R><id>. Got: %s', osm_id)
-                raise UsageError("OSM ID parameter badly formatted")
-            cur.execute('SELECT place_id FROM placex WHERE osm_type = %s AND osm_id = %s',
-                        (osm_type, osm_id[1:]))
-
-            if cur.rowcount < 1:
-                LOG.fatal("OSM object %s not found in database.", osm_id)
-                raise UsageError("OSM object not found")
-
-            place_id = cur.fetchone()[0]
-
-        if place_id is None:
-            LOG.fatal("No OSM object given to index.")
-            raise UsageError("OSM object not found")
-
-        cur.execute("update placex set indexed_status = 2 where place_id = %s",
-                    (place_id, ))
-
-        cur.execute("""SET auto_explain.log_min_duration = '0';
-                       SET auto_explain.log_analyze = 'true';
-                       SET auto_explain.log_nested_statements = 'true';
-                       LOAD 'auto_explain';
-                       SET client_min_messages = LOG;
-                       SET log_min_messages = FATAL""")
-
-        cur.execute("update placex set indexed_status = 0 where place_id = %s",
-                    (place_id, ))
-
-    # we do not want to keep the results
-    conn.rollback()
-
-    for msg in conn.notices:
-        print(msg)
+    with connect(config.get_libpq_dsn()) as conn:
+        register_hstore(conn)
+        with conn.cursor() as cur:
+            place = _get_place_info(cur, osm_id, place_id)
+
+            cur.execute("update placex set indexed_status = 2 where place_id = %s",
+                        (place['place_id'], ))
+
+            cur.execute("""SET auto_explain.log_min_duration = '0';
+                           SET auto_explain.log_analyze = 'true';
+                           SET auto_explain.log_nested_statements = 'true';
+                           LOAD 'auto_explain';
+                           SET client_min_messages = LOG;
+                           SET log_min_messages = FATAL""")
+
+            tokenizer = tokenizer_factory.get_tokenizer_for_db(config)
+
+            with tokenizer.name_analyzer() as analyzer:
+                cur.execute("""UPDATE placex
+                               SET indexed_status = 0, address = %s, token_info = %s,
+                               name = %s, linked_place_id = %s
+                               WHERE place_id = %s""",
+                            (place['address'],
+                             Json(analyzer.process_place(PlaceInfo(place))),
+                             place['name'], place['linked_place_id'], place['place_id']))
+
+        # we do not want to keep the results
+        conn.rollback()
+
+        for msg in conn.notices:
+            print(msg)
index 30b27d1f60accd64c5ece68d3d82d9841b6cc656..7372a49fd215564623c9c47bd3df83001f6edfe8 100644 (file)
@@ -1,10 +1,18 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# This file is part of Nominatim. (https://nominatim.org)
+#
+# Copyright (C) 2022 by the Nominatim developer community.
+# For a full list of authors see the git log.
 """
 Collection of functions that check if the database is complete and functional.
 """
+from typing import Callable, Optional, Any, Union, Tuple, Mapping, List
 from enum import Enum
 from textwrap import dedent
 
-from nominatim.db.connection import connect
+from nominatim.config import Configuration
+from nominatim.db.connection import connect, Connection
 from nominatim.errors import UsageError
 from nominatim.tokenizer import factory as tokenizer_factory
 
@@ -17,15 +25,19 @@ class CheckState(Enum):
     FAIL = 1
     FATAL = 2
     NOT_APPLICABLE = 3
+    WARN = 4
 
-def _check(hint=None):
+CheckResult = Union[CheckState, Tuple[CheckState, Mapping[str, Any]]]
+CheckFunc = Callable[[Connection, Configuration], CheckResult]
+
+def _check(hint: Optional[str] = None) -> Callable[[CheckFunc], CheckFunc]:
     """ Decorator for checks. It adds the function to the list of
         checks to execute and adds the code for printing progress messages.
     """
-    def decorator(func):
-        title = func.__doc__.split('\n', 1)[0].strip()
+    def decorator(func: CheckFunc) -> CheckFunc:
+        title = (func.__doc__ or '').split('\n', 1)[0].strip()
 
-        def run_check(conn, config):
+        def run_check(conn: Connection, config: Configuration) -> CheckState:
             print(title, end=' ... ')
             ret = func(conn, config)
             if isinstance(ret, tuple):
@@ -34,6 +46,11 @@ def _check(hint=None):
                 params = {}
             if ret == CheckState.OK:
                 print('\033[92mOK\033[0m')
+            elif ret == CheckState.WARN:
+                print('\033[93mWARNING\033[0m')
+                if hint:
+                    print('')
+                    print(dedent(hint.format(**params)))
             elif ret == CheckState.NOT_APPLICABLE:
                 print('not applicable')
             else:
@@ -49,20 +66,20 @@ def _check(hint=None):
 
 class _BadConnection:
 
-    def __init__(self, msg):
+    def __init__(self, msg: str) -> None:
         self.msg = msg
 
-    def close(self):
+    def close(self) -> None:
         """ Dummy function to provide the implementation.
         """
 
-def check_database(config):
+def check_database(config: Configuration) -> int:
     """ Run a number of checks on the database and return the status.
     """
     try:
         conn = connect(config.get_libpq_dsn()).connection
     except UsageError as err:
-        conn = _BadConnection(str(err))
+        conn = _BadConnection(str(err)) # type: ignore[assignment]
 
     overall_result = 0
     for check in CHECKLIST:
@@ -77,7 +94,7 @@ def check_database(config):
     return overall_result
 
 
-def _get_indexes(conn):
+def _get_indexes(conn: Connection) -> List[str]:
     indexes = ['idx_place_addressline_address_place_id',
                'idx_placex_rank_search',
                'idx_placex_rank_address',
@@ -119,7 +136,7 @@ def _get_indexes(conn):
              Project directory: {config.project_dir}
              Current setting of NOMINATIM_DATABASE_DSN: {config.DATABASE_DSN}
              """)
-def check_connection(conn, config):
+def check_connection(conn: Any, config: Configuration) -> CheckResult:
     """ Checking database connection
     """
     if isinstance(conn, _BadConnection):
@@ -137,7 +154,7 @@ def check_connection(conn, config):
              Project directory: {config.project_dir}
              Current setting of NOMINATIM_DATABASE_DSN: {config.DATABASE_DSN}
              """)
-def check_placex_table(conn, config):
+def check_placex_table(conn: Connection, config: Configuration) -> CheckResult:
     """ Checking for placex table
     """
     if conn.table_exists('placex'):
@@ -146,8 +163,8 @@ def check_placex_table(conn, config):
     return CheckState.FATAL, dict(config=config)
 
 
-@_check(hint="""placex table has no data. Did the import finish sucessfully?""")
-def check_placex_size(conn, _):
+@_check(hint="""placex table has no data. Did the import finish successfully?""")
+def check_placex_size(conn: Connection, _: Configuration) -> CheckResult:
     """ Checking for placex content
     """
     with conn.cursor() as cur:
@@ -157,14 +174,14 @@ def check_placex_size(conn, _):
 
 
 @_check(hint="""{msg}""")
-def check_tokenizer(_, config):
+def check_tokenizer(_: Connection, config: Configuration) -> CheckResult:
     """ Checking that tokenizer works
     """
     try:
         tokenizer = tokenizer_factory.get_tokenizer_for_db(config)
     except UsageError:
         return CheckState.FAIL, dict(msg="""\
-            Cannot load tokenizer. Did the import finish sucessfully?""")
+            Cannot load tokenizer. Did the import finish successfully?""")
 
     result = tokenizer.check_database(config)
 
@@ -174,12 +191,29 @@ def check_tokenizer(_, config):
     return CheckState.FAIL, dict(msg=result)
 
 
+@_check(hint="""\
+             Wikipedia/Wikidata importance tables missing.
+             Quality of search results may be degraded. Reverse geocoding is unaffected.
+             See https://nominatim.org/release-docs/latest/admin/Import/#wikipediawikidata-rankings
+             """)
+def check_existance_wikipedia(conn: Connection, _: Configuration) -> CheckResult:
+    """ Checking for wikipedia/wikidata data
+    """
+    if not conn.table_exists('search_name'):
+        return CheckState.NOT_APPLICABLE
+
+    with conn.cursor() as cur:
+        cnt = cur.scalar('SELECT count(*) FROM wikipedia_article')
+
+        return CheckState.WARN if cnt == 0 else CheckState.OK
+
+
 @_check(hint="""\
              The indexing didn't finish. {count} entries are not yet indexed.
 
              To index the remaining entries, run:   {index_cmd}
              """)
-def check_indexing(conn, _):
+def check_indexing(conn: Connection, _: Configuration) -> CheckResult:
     """ Checking indexing status
     """
     with conn.cursor() as cur:
@@ -204,7 +238,7 @@ def check_indexing(conn, _):
 
              Rerun the index creation with:   nominatim import --continue db-postprocess
              """)
-def check_database_indexes(conn, _):
+def check_database_indexes(conn: Connection, _: Configuration) -> CheckResult:
     """ Checking that database indexes are complete
     """
     missing = []
@@ -226,7 +260,7 @@ def check_database_indexes(conn, _):
              Invalid indexes:
                {indexes}
              """)
-def check_database_index_valid(conn, _):
+def check_database_index_valid(conn: Connection, _: Configuration) -> CheckResult:
     """ Checking that all database indexes are valid
     """
     with conn.cursor() as cur:
@@ -246,7 +280,7 @@ def check_database_index_valid(conn, _):
              {error}
              Run TIGER import again:   nominatim add-data --tiger-data <DIR>
              """)
-def check_tiger_table(conn, config):
+def check_tiger_table(conn: Connection, config: Configuration) -> CheckResult:
     """ Checking TIGER external data table.
     """
     if not config.get_bool('USE_US_TIGER_DATA'):
diff --git a/nominatim/tools/country_info.py b/nominatim/tools/country_info.py
deleted file mode 100644 (file)
index 635d158..0000000
+++ /dev/null
@@ -1,113 +0,0 @@
-"""
-Functions for importing and managing static country information.
-"""
-import psycopg2.extras
-
-from nominatim.db import utils as db_utils
-from nominatim.db.connection import connect
-
-class _CountryInfo:
-    """ Caches country-specific properties from the configuration file.
-    """
-
-    def __init__(self):
-        self._info = {}
-
-
-    def load(self, config):
-        """ Load the country properties from the configuration files,
-            if they are not loaded yet.
-        """
-        if not self._info:
-            self._info = config.load_sub_configuration('country_settings.yaml')
-            # Convert languages into a list for simpler handling.
-            for prop in self._info.values():
-                if 'languages' not in prop:
-                    prop['languages'] = []
-                elif not isinstance(prop['languages'], list):
-                    prop['languages'] = [x.strip()
-                                         for x in prop['languages'].split(',')]
-
-
-    def items(self):
-        """ Return tuples of (country_code, property dict) as iterable.
-        """
-        return self._info.items()
-
-
-_COUNTRY_INFO = _CountryInfo()
-
-def setup_country_config(config):
-    """ Load country properties from the configuration file.
-        Needs to be called before using any other functions in this
-        file.
-    """
-    _COUNTRY_INFO.load(config)
-
-
-def iterate():
-    """ Iterate over country code and properties.
-    """
-    return _COUNTRY_INFO.items()
-
-
-def setup_country_tables(dsn, sql_dir, ignore_partitions=False):
-    """ Create and populate the tables with basic static data that provides
-        the background for geocoding. Data is assumed to not yet exist.
-    """
-    db_utils.execute_file(dsn, sql_dir / 'country_name.sql')
-    db_utils.execute_file(dsn, sql_dir / 'country_osm_grid.sql.gz')
-
-    params = []
-    for ccode, props in _COUNTRY_INFO.items():
-        if ccode is not None and props is not None:
-            if ignore_partitions:
-                partition = 0
-            else:
-                partition = props.get('partition')
-            lang = props['languages'][0] if len(props['languages']) == 1 else None
-            params.append((ccode, partition, lang))
-
-    with connect(dsn) as conn:
-        with conn.cursor() as cur:
-            cur.execute_values(
-                """ UPDATE country_name
-                    SET partition = part, country_default_language_code = lang
-                    FROM (VALUES %s) AS v (cc, part, lang)
-                    WHERE country_code = v.cc""", params)
-        conn.commit()
-
-
-def create_country_names(conn, tokenizer, languages=None):
-    """ Add default country names to search index. `languages` is a comma-
-        separated list of language codes as used in OSM. If `languages` is not
-        empty then only name translations for the given languages are added
-        to the index.
-    """
-    if languages:
-        languages = languages.split(',')
-
-    def _include_key(key):
-        return key == 'name' or \
-               (key.startswith('name:') and (not languages or key[5:] in languages))
-
-    with conn.cursor() as cur:
-        psycopg2.extras.register_hstore(cur)
-        cur.execute("""SELECT country_code, name FROM country_name
-                       WHERE country_code is not null""")
-
-        with tokenizer.name_analyzer() as analyzer:
-            for code, name in cur:
-                names = {'countrycode': code}
-                if code == 'gb':
-                    names['short_name'] = 'UK'
-                if code == 'us':
-                    names['short_name'] = 'United States'
-
-                # country names (only in languages as provided)
-                if name:
-                    names.update(((k, v) for k, v in name.items() if _include_key(k)))
-
-                analyzer.add_country_names(code, names)
-
-    conn.commit()
index 38635c34920131c889ea0549d84d4cc05a0157b5..447e90f1d5c7d547ced545a1fcad6a4958ceb317 100644 (file)
@@ -1,6 +1,13 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# This file is part of Nominatim. (https://nominatim.org)
+#
+# Copyright (C) 2022 by the Nominatim developer community.
+# For a full list of authors see the git log.
 """
 Functions for setting up and importing a new Nominatim database.
 """
+from typing import Tuple, Optional, Union, Sequence, MutableMapping, Any
 import logging
 import os
 import selectors
@@ -10,7 +17,8 @@ from pathlib import Path
 import psutil
 from psycopg2 import sql as pysql
 
-from nominatim.db.connection import connect, get_pg_env
+from nominatim.config import Configuration
+from nominatim.db.connection import connect, get_pg_env, Connection
 from nominatim.db.async_connection import DBConnection
 from nominatim.db.sql_preprocessor import SQLPreprocessor
 from nominatim.tools.exec_utils import run_osm2pgsql
@@ -19,7 +27,7 @@ from nominatim.version import POSTGRESQL_REQUIRED_VERSION, POSTGIS_REQUIRED_VERS
 
 LOG = logging.getLogger()
 
-def _require_version(module, actual, expected):
+def _require_version(module: str, actual: Tuple[int, int], expected: Tuple[int, int]) -> None:
     """ Compares the version for the given module and raises an exception
         if the actual version is too old.
     """
@@ -30,7 +38,7 @@ def _require_version(module, actual, expected):
         raise UsageError(f'{module} is too old.')
 
 
-def setup_database_skeleton(dsn, rouser=None):
+def setup_database_skeleton(dsn: str, rouser: Optional[str] = None) -> None:
     """ Create a new database for Nominatim and populate it with the
         essential extensions.
 
@@ -59,7 +67,7 @@ def setup_database_skeleton(dsn, rouser=None):
                 cnt = cur.scalar('SELECT count(*) FROM pg_user where usename = %s',
                                  (rouser, ))
                 if cnt == 0:
-                    LOG.fatal("Web user '%s' does not exists. Create it with:\n"
+                    LOG.fatal("Web user '%s' does not exist. Create it with:\n"
                               "\n      createuser %s", rouser, rouser)
                     raise UsageError('Missing read-only user.')
 
@@ -74,7 +82,9 @@ def setup_database_skeleton(dsn, rouser=None):
                          POSTGIS_REQUIRED_VERSION)
 
 
-def import_osm_data(osm_files, options, drop=False, ignore_errors=False):
+def import_osm_data(osm_files: Union[Path, Sequence[Path]],
+                    options: MutableMapping[str, Any],
+                    drop: bool = False, ignore_errors: bool = False) -> None:
     """ Import the given OSM files. 'options' contains the list of
         default settings for osm2pgsql.
     """
@@ -111,7 +121,7 @@ def import_osm_data(osm_files, options, drop=False, ignore_errors=False):
         Path(options['flatnode_file']).unlink()
 
 
-def create_tables(conn, config, reverse_only=False):
+def create_tables(conn: Connection, config: Configuration, reverse_only: bool = False) -> None:
     """ Create the set of basic tables.
         When `reverse_only` is True, then the main table for searching will
         be skipped and only reverse search is possible.
@@ -122,7 +132,7 @@ def create_tables(conn, config, reverse_only=False):
     sql.run_sql_file(conn, 'tables.sql')
 
 
-def create_table_triggers(conn, config):
+def create_table_triggers(conn: Connection, config: Configuration) -> None:
     """ Create the triggers for the tables. The trigger functions must already
         have been imported with refresh.create_functions().
     """
@@ -130,14 +140,14 @@ def create_table_triggers(conn, config):
     sql.run_sql_file(conn, 'table-triggers.sql')
 
 
-def create_partition_tables(conn, config):
+def create_partition_tables(conn: Connection, config: Configuration) -> None:
     """ Create tables that have explicit partitioning.
     """
     sql = SQLPreprocessor(conn, config)
     sql.run_sql_file(conn, 'partition-tables.src.sql')
 
 
-def truncate_data_tables(conn):
+def truncate_data_tables(conn: Connection) -> None:
     """ Truncate all data tables to prepare for a fresh load.
     """
     with conn.cursor() as cur:
@@ -168,7 +178,7 @@ _COPY_COLUMNS = pysql.SQL(',').join(map(pysql.Identifier,
                                          'extratags', 'geometry')))
 
 
-def load_data(dsn, threads):
+def load_data(dsn: str, threads: int) -> None:
     """ Copy data into the word and placex table.
     """
     sel = selectors.DefaultSelector()
@@ -210,12 +220,12 @@ def load_data(dsn, threads):
         print('.', end='', flush=True)
     print('\n')
 
-    with connect(dsn) as conn:
-        with conn.cursor() as cur:
+    with connect(dsn) as syn_conn:
+        with syn_conn.cursor() as cur:
             cur.execute('ANALYSE')
 
 
-def create_search_indices(conn, config, drop=False):
+def create_search_indices(conn: Connection, config: Configuration, drop: bool = False) -> None:
     """ Create tables that have explicit partitioning.
     """
 
@@ -228,7 +238,7 @@ def create_search_indices(conn, config, drop=False):
         bad_indices = [row[0] for row in list(cur)]
         for idx in bad_indices:
             LOG.info("Drop invalid index %s.", idx)
-            cur.execute('DROP INDEX "{}"'.format(idx))
+            cur.execute(pysql.SQL('DROP INDEX {}').format(pysql.Identifier(idx)))
     conn.commit()
 
     sql = SQLPreprocessor(conn, config)
index cb39ad486a128557a1c6b503844676ea80ee6ed4..610e2182d5436b8723b0bc3ebe2cb24fcd672f2c 100644 (file)
@@ -1,17 +1,28 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# This file is part of Nominatim. (https://nominatim.org)
+#
+# Copyright (C) 2022 by the Nominatim developer community.
+# For a full list of authors see the git log.
 """
 Helper functions for executing external programs.
 """
+from typing import Any, Union, Optional, Mapping, IO
+from pathlib import Path
 import logging
 import subprocess
 import urllib.request as urlrequest
 from urllib.parse import urlencode
 
-from nominatim.version import NOMINATIM_VERSION
+from nominatim.typing import StrPath
+from nominatim.version import version_str
 from nominatim.db.connection import get_pg_env
 
 LOG = logging.getLogger()
 
-def run_legacy_script(script, *args, nominatim_env=None, throw_on_fail=False):
+def run_legacy_script(script: StrPath, *args: Union[int, str],
+                      nominatim_env: Any,
+                      throw_on_fail: bool = False) -> int:
     """ Run a Nominatim PHP script with the given arguments.
 
         Returns the exit code of the script. If `throw_on_fail` is True
@@ -34,9 +45,11 @@ def run_legacy_script(script, *args, nominatim_env=None, throw_on_fail=False):
 
     return proc.returncode
 
-def run_api_script(endpoint, project_dir, extra_env=None, phpcgi_bin=None,
-                   params=None):
-    """ Execute a Nominiatim API function.
+def run_api_script(endpoint: str, project_dir: Path,
+                   extra_env: Optional[Mapping[str, str]] = None,
+                   phpcgi_bin: Optional[Path] = None,
+                   params: Optional[Mapping[str, Any]] = None) -> int:
+    """ Execute a Nominatim API function.
 
         The function needs a project directory that contains the website
         directory with the scripts to be executed. The scripts will be run
@@ -49,10 +62,10 @@ def run_api_script(endpoint, project_dir, extra_env=None, phpcgi_bin=None,
     query_string = urlencode(params or {})
 
     env = dict(QUERY_STRING=query_string,
-               SCRIPT_NAME='/{}.php'.format(endpoint),
-               REQUEST_URI='/{}.php?{}'.format(endpoint, query_string),
+               SCRIPT_NAME=f'/{endpoint}.php',
+               REQUEST_URI=f'/{endpoint}.php?{query_string}',
                CONTEXT_DOCUMENT_ROOT=webdir,
-               SCRIPT_FILENAME='{}/{}.php'.format(webdir, endpoint),
+               SCRIPT_FILENAME=f'{webdir}/{endpoint}.php',
                HTTP_HOST='localhost',
                HTTP_USER_AGENT='nominatim-tool',
                REMOTE_ADDR='0.0.0.0',
@@ -90,14 +103,14 @@ def run_api_script(endpoint, project_dir, extra_env=None, phpcgi_bin=None,
     return 0
 
 
-def run_php_server(server_address, base_dir):
+def run_php_server(server_address: str, base_dir: StrPath) -> None:
     """ Run the built-in server from the given directory.
     """
     subprocess.run(['/usr/bin/env', 'php', '-S', server_address],
                    cwd=str(base_dir), check=True)
 
 
-def run_osm2pgsql(options):
+def run_osm2pgsql(options: Mapping[str, Any]) -> None:
     """ Run osm2pgsql with the given options.
     """
     env = get_pg_env(options['dsn'])
@@ -141,13 +154,14 @@ def run_osm2pgsql(options):
                    env=env, check=True)
 
 
-def get_url(url):
+def get_url(url: str) -> str:
     """ Get the contents from the given URL and return it as a UTF-8 string.
     """
-    headers = {"User-Agent": "Nominatim/{0[0]}.{0[1]}.{0[2]}-{0[3]}".format(NOMINATIM_VERSION)}
+    headers = {"User-Agent": f"Nominatim/{version_str()}"}
 
     try:
-        with urlrequest.urlopen(urlrequest.Request(url, headers=headers)) as response:
+        request = urlrequest.Request(url, headers=headers)
+        with urlrequest.urlopen(request) as response: # type: IO[bytes]
             return response.read().decode('utf-8')
     except Exception:
         LOG.fatal('Failed to load URL: %s', url)
index a182fc8b32aa7c8ec05427d2d95587a4b567bb78..39c3279d3ce55718cc086cd7bf1278e5e82e9082 100644 (file)
@@ -1,10 +1,19 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# This file is part of Nominatim. (https://nominatim.org)
+#
+# Copyright (C) 2022 by the Nominatim developer community.
+# For a full list of authors see the git log.
 """
 Functions for removing unnecessary data from the database.
 """
+from typing import Optional
 from pathlib import Path
 
 from psycopg2 import sql as pysql
 
+from nominatim.db.connection import Connection
+
 UPDATE_TABLES = [
     'address_levels',
     'gb_postcode',
@@ -19,7 +28,7 @@ UPDATE_TABLES = [
     'wikipedia_%'
 ]
 
-def drop_update_tables(conn):
+def drop_update_tables(conn: Connection) -> None:
     """ Drop all tables only necessary for updating the database from
         OSM replication data.
     """
@@ -36,10 +45,8 @@ def drop_update_tables(conn):
     conn.commit()
 
 
-def drop_flatnode_file(fname):
+def drop_flatnode_file(fpath: Optional[Path]) -> None:
     """ Remove the flatnode file if it exists.
     """
-    if fname:
-        fpath = Path(fname)
-        if fpath.exists():
-            fpath.unlink()
+    if fpath and fpath.exists():
+        fpath.unlink()
index bcf8f1425050a3fd82249af27c9c49109d870fef..7854154c92c3e7ffb0746775fbe9f852a8bde0de 100644 (file)
@@ -1,20 +1,32 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# This file is part of Nominatim. (https://nominatim.org)
+#
+# Copyright (C) 2022 by the Nominatim developer community.
+# For a full list of authors see the git log.
 """
 Functions for database migration to newer software versions.
 """
+from typing import List, Tuple, Callable, Any
 import logging
 
+from psycopg2 import sql as pysql
+
+from nominatim.config import Configuration
 from nominatim.db import properties
-from nominatim.db.connection import connect
-from nominatim.version import NOMINATIM_VERSION
+from nominatim.db.connection import connect, Connection
+from nominatim.version import NOMINATIM_VERSION, version_str
 from nominatim.tools import refresh
 from nominatim.tokenizer import factory as tokenizer_factory
 from nominatim.errors import UsageError
 
 LOG = logging.getLogger()
 
-_MIGRATION_FUNCTIONS = []
+VersionTuple = Tuple[int, int, int, int]
+
+_MIGRATION_FUNCTIONS : List[Tuple[VersionTuple, Callable[..., None]]] = []
 
-def migrate(config, paths):
+def migrate(config: Configuration, paths: Any) -> int:
     """ Check for the current database version and execute migrations,
         if necesssary.
     """
@@ -40,8 +52,9 @@ def migrate(config, paths):
         has_run_migration = False
         for version, func in _MIGRATION_FUNCTIONS:
             if db_version <= version:
-                LOG.warning("Runnning: %s (%s)", func.__doc__.split('\n', 1)[0],
-                            '{0[0]}.{0[1]}.{0[2]}-{0[3]}'.format(version))
+                title = func.__doc__ or ''
+                LOG.warning("Running: %s (%s)", title.split('\n', 1)[0],
+                            version_str(version))
                 kwargs = dict(conn=conn, config=config, paths=paths)
                 func(**kwargs)
                 conn.commit()
@@ -53,15 +66,14 @@ def migrate(config, paths):
             tokenizer = tokenizer_factory.get_tokenizer_for_db(config)
             tokenizer.update_sql_functions(config)
 
-        properties.set_property(conn, 'database_version',
-                                '{0[0]}.{0[1]}.{0[2]}-{0[3]}'.format(NOMINATIM_VERSION))
+        properties.set_property(conn, 'database_version', version_str())
 
         conn.commit()
 
     return 0
 
 
-def _guess_version(conn):
+def _guess_version(conn: Connection) -> VersionTuple:
     """ Guess a database version when there is no property table yet.
         Only migrations for 3.6 and later are supported, so bail out
         when the version seems older.
@@ -81,7 +93,8 @@ def _guess_version(conn):
 
 
 
-def _migration(major, minor, patch=0, dbpatch=0):
+def _migration(major: int, minor: int, patch: int = 0,
+               dbpatch: int = 0) -> Callable[[Callable[..., None]], Callable[..., None]]:
     """ Decorator for a single migration step. The parameters describe the
         version after which the migration is applicable, i.e before changing
         from the given version to the next, the migration is required.
@@ -94,7 +107,7 @@ def _migration(major, minor, patch=0, dbpatch=0):
         process, so the migration functions may leave a temporary state behind
         there.
     """
-    def decorator(func):
+    def decorator(func: Callable[..., None]) -> Callable[..., None]:
         _MIGRATION_FUNCTIONS.append(((major, minor, patch, dbpatch), func))
         return func
 
@@ -102,7 +115,7 @@ def _migration(major, minor, patch=0, dbpatch=0):
 
 
 @_migration(3, 5, 0, 99)
-def import_status_timestamp_change(conn, **_):
+def import_status_timestamp_change(conn: Connection, **_: Any) -> None:
     """ Add timezone to timestamp in status table.
 
         The import_status table has been changed to include timezone information
@@ -114,19 +127,19 @@ def import_status_timestamp_change(conn, **_):
 
 
 @_migration(3, 5, 0, 99)
-def add_nominatim_property_table(conn, config, **_):
+def add_nominatim_property_table(conn: Connection, config: Configuration, **_: Any) -> None:
     """ Add nominatim_property table.
     """
     if not conn.table_exists('nominatim_properties'):
         with conn.cursor() as cur:
-            cur.execute("""CREATE TABLE nominatim_properties (
-                               property TEXT,
-                               value TEXT);
-                           GRANT SELECT ON TABLE nominatim_properties TO "{}";
-                        """.format(config.DATABASE_WEBUSER))
+            cur.execute(pysql.SQL("""CREATE TABLE nominatim_properties (
+                                        property TEXT,
+                                        value TEXT);
+                                     GRANT SELECT ON TABLE nominatim_properties TO {};
+                                  """).format(pysql.Identifier(config.DATABASE_WEBUSER)))
 
 @_migration(3, 6, 0, 0)
-def change_housenumber_transliteration(conn, **_):
+def change_housenumber_transliteration(conn: Connection, **_: Any) -> None:
     """ Transliterate housenumbers.
 
         The database schema switched from saving raw housenumbers in
@@ -157,7 +170,7 @@ def change_housenumber_transliteration(conn, **_):
 
 
 @_migration(3, 7, 0, 0)
-def switch_placenode_geometry_index(conn, **_):
+def switch_placenode_geometry_index(conn: Connection, **_: Any) -> None:
     """ Replace idx_placex_geometry_reverse_placeNode index.
 
         Make the index slightly more permissive, so that it can also be used
@@ -174,7 +187,7 @@ def switch_placenode_geometry_index(conn, **_):
 
 
 @_migration(3, 7, 0, 1)
-def install_legacy_tokenizer(conn, config, **_):
+def install_legacy_tokenizer(conn: Connection, config: Configuration, **_: Any) -> None:
     """ Setup legacy tokenizer.
 
         If no other tokenizer has been configured yet, then create the
@@ -188,15 +201,16 @@ def install_legacy_tokenizer(conn, config, **_):
                                            and column_name = 'token_info'""",
                                         (table, ))
                 if has_column == 0:
-                    cur.execute('ALTER TABLE {} ADD COLUMN token_info JSONB'.format(table))
+                    cur.execute(pysql.SQL('ALTER TABLE {} ADD COLUMN token_info JSONB')
+                                .format(pysql.Identifier(table)))
         tokenizer = tokenizer_factory.create_tokenizer(config, init_db=False,
                                                        module_name='legacy')
 
-        tokenizer.migrate_database(config)
+        tokenizer.migrate_database(config) # type: ignore[attr-defined]
 
 
 @_migration(4, 0, 99, 0)
-def create_tiger_housenumber_index(conn, **_):
+def create_tiger_housenumber_index(conn: Connection, **_: Any) -> None:
     """ Create idx_location_property_tiger_parent_place_id with included
         house number.
 
@@ -210,3 +224,94 @@ def create_tiger_housenumber_index(conn, **_):
                             ON location_property_tiger
                             USING btree(parent_place_id)
                             INCLUDE (startnumber, endnumber) """)
+
+
+@_migration(4, 0, 99, 1)
+def create_interpolation_index_on_place(conn: Connection, **_: Any) -> None:
+    """ Create idx_place_interpolations for lookup of interpolation lines
+        on updates.
+    """
+    with conn.cursor() as cur:
+        cur.execute("""CREATE INDEX IF NOT EXISTS idx_place_interpolations
+                       ON place USING gist(geometry)
+                       WHERE osm_type = 'W' and address ? 'interpolation'""")
+
+
+@_migration(4, 0, 99, 2)
+def add_step_column_for_interpolation(conn: Connection, **_: Any) -> None:
+    """ Add a new column 'step' to the interpolations table.
+
+        Also converts the data into the stricter format which requires that
+        startnumbers comply with the odd/even requirements.
+    """
+    if conn.table_has_column('location_property_osmline', 'step'):
+        return
+
+    with conn.cursor() as cur:
+        # Mark invalid all interpolations with no intermediate numbers.
+        cur.execute("""UPDATE location_property_osmline SET startnumber = null
+                       WHERE endnumber - startnumber <= 1 """)
+        # Align the start numbers where odd/even does not match.
+        cur.execute("""UPDATE location_property_osmline
+                       SET startnumber = startnumber + 1,
+                           linegeo = ST_LineSubString(linegeo,
+                                                      1.0 / (endnumber - startnumber)::float,
+                                                      1)
+                       WHERE (interpolationtype = 'odd' and startnumber % 2 = 0)
+                              or (interpolationtype = 'even' and startnumber % 2 = 1)
+                    """)
+        # Mark invalid odd/even interpolations with no intermediate numbers.
+        cur.execute("""UPDATE location_property_osmline SET startnumber = null
+                       WHERE interpolationtype in ('odd', 'even')
+                             and endnumber - startnumber = 2""")
+        # Finally add the new column and populate it.
+        cur.execute("ALTER TABLE location_property_osmline ADD COLUMN step SMALLINT")
+        cur.execute("""UPDATE location_property_osmline
+                         SET step = CASE WHEN interpolationtype = 'all'
+                                         THEN 1 ELSE 2 END
+                    """)
+
+
+@_migration(4, 0, 99, 3)
+def add_step_column_for_tiger(conn: Connection, **_: Any) -> None:
+    """ Add a new column 'step' to the tiger data table.
+    """
+    if conn.table_has_column('location_property_tiger', 'step'):
+        return
+
+    with conn.cursor() as cur:
+        cur.execute("ALTER TABLE location_property_tiger ADD COLUMN step SMALLINT")
+        cur.execute("""UPDATE location_property_tiger
+                         SET step = CASE WHEN interpolationtype = 'all'
+                                         THEN 1 ELSE 2 END
+                    """)
+
+
+@_migration(4, 0, 99, 4)
+def add_derived_name_column_for_country_names(conn: Connection, **_: Any) -> None:
+    """ Add a new column 'derived_name' which in the future takes the
+        country names as imported from OSM data.
+    """
+    if not conn.table_has_column('country_name', 'derived_name'):
+        with conn.cursor() as cur:
+            cur.execute("ALTER TABLE country_name ADD COLUMN derived_name public.HSTORE")
+
+
+@_migration(4, 0, 99, 5)
+def mark_internal_country_names(conn: Connection, config: Configuration, **_: Any) -> None:
+    """ Names from the country table should be marked as internal to prevent
+        them from being deleted. Only necessary for ICU tokenizer.
+    """
+    import psycopg2.extras # pylint: disable=import-outside-toplevel
+
+    tokenizer = tokenizer_factory.get_tokenizer_for_db(config)
+    with tokenizer.name_analyzer() as analyzer:
+        with conn.cursor() as cur:
+            psycopg2.extras.register_hstore(cur)
+            cur.execute("SELECT country_code, name FROM country_name")
+
+            for country_code, names in cur:
+                if not names:
+                    names = {}
+                names['countrycode'] = country_code
+                analyzer.add_country_names(country_code, names)
index d00fc97a8dbb39180b2ca5dae92784a7291bd40e..7171e25d169d0af7b625430fafefdfba183c4df4 100644 (file)
@@ -1,7 +1,16 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# This file is part of Nominatim. (https://nominatim.org)
+#
+# Copyright (C) 2022 by the Nominatim developer community.
+# For a full list of authors see the git log.
 """
 Functions for importing, updating and otherwise maintaining the table
 of artificial postcode centroids.
 """
+from typing import Optional, Tuple, Dict, List, TextIO
+from collections import defaultdict
+from pathlib import Path
 import csv
 import gzip
 import logging
@@ -9,38 +18,53 @@ from math import isfinite
 
 from psycopg2 import sql as pysql
 
-from nominatim.db.connection import connect
+from nominatim.db.connection import connect, Connection
+from nominatim.utils.centroid import PointsCentroid
+from nominatim.data.postcode_format import PostcodeFormatter, CountryPostcodeMatcher
+from nominatim.tokenizer.base import AbstractAnalyzer, AbstractTokenizer
 
 LOG = logging.getLogger()
 
-def _to_float(num, max_value):
+def _to_float(numstr: str, max_value: float) -> float:
     """ Convert the number in string into a float. The number is expected
         to be in the range of [-max_value, max_value]. Otherwise rises a
         ValueError.
     """
-    num = float(num)
+    num = float(numstr)
     if not isfinite(num) or num <= -max_value or num >= max_value:
         raise ValueError()
 
     return num
 
-class _CountryPostcodesCollector:
+class _PostcodeCollector:
     """ Collector for postcodes of a single country.
     """
 
-    def __init__(self, country):
+    def __init__(self, country: str, matcher: Optional[CountryPostcodeMatcher]):
         self.country = country
-        self.collected = dict()
+        self.matcher = matcher
+        self.collected: Dict[str, PointsCentroid] = defaultdict(PointsCentroid)
+        self.normalization_cache: Optional[Tuple[str, Optional[str]]] = None
 
 
-    def add(self, postcode, x, y):
+    def add(self, postcode: str, x: float, y: float) -> None:
         """ Add the given postcode to the collection cache. If the postcode
             already existed, it is overwritten with the new centroid.
         """
-        self.collected[postcode] = (x, y)
+        if self.matcher is not None:
+            normalized: Optional[str]
+            if self.normalization_cache and self.normalization_cache[0] == postcode:
+                normalized = self.normalization_cache[1]
+            else:
+                match = self.matcher.match(postcode)
+                normalized = self.matcher.normalize(match) if match else None
+                self.normalization_cache = (postcode, normalized)
 
+            if normalized:
+                self.collected[normalized] += (x, y)
 
-    def commit(self, conn, analyzer, project_dir):
+
+    def commit(self, conn: Connection, analyzer: AbstractAnalyzer, project_dir: Path) -> None:
         """ Update postcodes for the country from the postcodes selected so far
             as well as any externally supplied postcodes.
         """
@@ -74,7 +98,8 @@ class _CountryPostcodesCollector:
                               """).format(pysql.Literal(self.country)), to_update)
 
 
-    def _compute_changes(self, conn):
+    def _compute_changes(self, conn: Connection) \
+          -> Tuple[List[Tuple[str, float, float]], List[str], List[Tuple[str, float, float]]]:
         """ Compute which postcodes from the collected postcodes have to be
             added or modified and which from the location_postcode table
             have to be deleted.
@@ -87,21 +112,21 @@ class _CountryPostcodesCollector:
                            WHERE country_code = %s""",
                         (self.country, ))
             for postcode, x, y in cur:
-                newx, newy = self.collected.pop(postcode, (None, None))
-                if newx is not None:
-                    dist = (x - newx)**2 + (y - newy)**2
-                    if dist > 0.0000001:
+                pcobj = self.collected.pop(postcode, None)
+                if pcobj:
+                    newx, newy = pcobj.centroid()
+                    if (x - newx) > 0.0000001 or (y - newy) > 0.0000001:
                         to_update.append((postcode, newx, newy))
                 else:
                     to_delete.append(postcode)
 
-        to_add = [(k, v[0], v[1]) for k, v in self.collected.items()]
-        self.collected = []
+        to_add = [(k, *v.centroid()) for k, v in self.collected.items()]
+        self.collected = defaultdict(PointsCentroid)
 
         return to_add, to_delete, to_update
 
 
-    def _update_from_external(self, analyzer, project_dir):
+    def _update_from_external(self, analyzer: AbstractAnalyzer, project_dir: Path) -> None:
         """ Look for an external postcode file for the active country in
             the project directory and add missing postcodes when found.
         """
@@ -119,8 +144,10 @@ class _CountryPostcodesCollector:
                 postcode = analyzer.normalize_postcode(row['postcode'])
                 if postcode not in self.collected:
                     try:
-                        self.collected[postcode] = (_to_float(row['lon'], 180),
-                                                    _to_float(row['lat'], 90))
+                        # Do float conversation separately, it might throw
+                        centroid = (_to_float(row['lon'], 180),
+                                    _to_float(row['lat'], 90))
+                        self.collected[postcode] += centroid
                     except ValueError:
                         LOG.warning("Bad coordinates %s, %s in %s country postcode file.",
                                     row['lat'], row['lon'], self.country)
@@ -129,14 +156,14 @@ class _CountryPostcodesCollector:
             csvfile.close()
 
 
-    def _open_external(self, project_dir):
-        fname = project_dir / '{}_postcodes.csv'.format(self.country)
+    def _open_external(self, project_dir: Path) -> Optional[TextIO]:
+        fname = project_dir / f'{self.country}_postcodes.csv'
 
         if fname.is_file():
             LOG.info("Using external postcode file '%s'.", fname)
-            return open(fname, 'r')
+            return open(fname, 'r', encoding='utf-8')
 
-        fname = project_dir / '{}_postcodes.csv.gz'.format(self.country)
+        fname = project_dir / f'{self.country}_postcodes.csv.gz'
 
         if fname.is_file():
             LOG.info("Using external postcode file '%s'.", fname)
@@ -145,13 +172,14 @@ class _CountryPostcodesCollector:
         return None
 
 
-def update_postcodes(dsn, project_dir, tokenizer):
+def update_postcodes(dsn: str, project_dir: Path, tokenizer: AbstractTokenizer) -> None:
     """ Update the table of artificial postcodes.
 
         Computes artificial postcode centroids from the placex table,
         potentially enhances it with external data and then updates the
         postcodes in the table 'location_postcode'.
     """
+    matcher = PostcodeFormatter()
     with tokenizer.name_analyzer() as analyzer:
         with connect(dsn) as conn:
             # First get the list of countries that currently have postcodes.
@@ -163,19 +191,17 @@ def update_postcodes(dsn, project_dir, tokenizer):
             # Recompute the list of valid postcodes from placex.
             with conn.cursor(name="placex_postcodes") as cur:
                 cur.execute("""
-                SELECT cc as country_code, pc, ST_X(centroid), ST_Y(centroid)
+                SELECT cc, pc, ST_X(centroid), ST_Y(centroid)
                 FROM (SELECT
                         COALESCE(plx.country_code,
                                  get_country_code(ST_Centroid(pl.geometry))) as cc,
-                        token_normalized_postcode(pl.address->'postcode') as pc,
-                        ST_Centroid(ST_Collect(COALESCE(plx.centroid,
-                                                        ST_Centroid(pl.geometry)))) as centroid
+                        pl.address->'postcode' as pc,
+                        COALESCE(plx.centroid, ST_Centroid(pl.geometry)) as centroid
                       FROM place AS pl LEFT OUTER JOIN placex AS plx
                              ON pl.osm_id = plx.osm_id AND pl.osm_type = plx.osm_type
-                    WHERE pl.address ? 'postcode' AND pl.geometry IS NOT null
-                    GROUP BY cc, pc) xx
+                    WHERE pl.address ? 'postcode' AND pl.geometry IS NOT null) xx
                 WHERE pc IS NOT null AND cc IS NOT null
-                ORDER BY country_code, pc""")
+                ORDER BY cc, pc""")
 
                 collector = None
 
@@ -183,7 +209,7 @@ def update_postcodes(dsn, project_dir, tokenizer):
                     if collector is None or country != collector.country:
                         if collector is not None:
                             collector.commit(conn, analyzer, project_dir)
-                        collector = _CountryPostcodesCollector(country)
+                        collector = _PostcodeCollector(country, matcher.get_matcher(country))
                         todo_countries.discard(country)
                     collector.add(postcode, x, y)
 
@@ -192,13 +218,14 @@ def update_postcodes(dsn, project_dir, tokenizer):
 
             # Now handle any countries that are only in the postcode table.
             for country in todo_countries:
-                _CountryPostcodesCollector(country).commit(conn, analyzer, project_dir)
+                fmt = matcher.get_matcher(country)
+                _PostcodeCollector(country, fmt).commit(conn, analyzer, project_dir)
 
             conn.commit()
 
         analyzer.update_postcodes_from_db()
 
-def can_compute(dsn):
+def can_compute(dsn: str) -> bool:
     """
         Check that the place table exists so that
         postcodes can be computed.
index 0a72b02bee9bf0fbc76cdea29bfed08add7fdf7c..8c1e9d9bbb24882601e4d0d8bed6c3c54a41f498 100644 (file)
@@ -1,20 +1,31 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# This file is part of Nominatim. (https://nominatim.org)
+#
+# Copyright (C) 2022 by the Nominatim developer community.
+# For a full list of authors see the git log.
 """
 Functions for bringing auxiliary data in the database up-to-date.
 """
+from typing import MutableSequence, Tuple, Any, Type, Mapping, Sequence, List, cast
 import logging
 from textwrap import dedent
 from pathlib import Path
 
 from psycopg2 import sql as pysql
 
+from nominatim.config import Configuration
+from nominatim.db.connection import Connection
 from nominatim.db.utils import execute_file
 from nominatim.db.sql_preprocessor import SQLPreprocessor
-from nominatim.version import NOMINATIM_VERSION
+from nominatim.version import version_str
 
 LOG = logging.getLogger()
 
+OSM_TYPE = {'N': 'node', 'W': 'way', 'R': 'relation'}
 
-def _add_address_level_rows_from_entry(rows, entry):
+def _add_address_level_rows_from_entry(rows: MutableSequence[Tuple[Any, ...]],
+                                       entry: Mapping[str, Any]) -> None:
     """ Converts a single entry from the JSON format for address rank
         descriptions into a flat format suitable for inserting into a
         PostgreSQL table and adds these lines to `rows`.
@@ -31,35 +42,39 @@ def _add_address_level_rows_from_entry(rows, entry):
             for country in countries:
                 rows.append((country, key, value, rank_search, rank_address))
 
-def load_address_levels(conn, table, levels):
+
+def load_address_levels(conn: Connection, table: str, levels: Sequence[Mapping[str, Any]]) -> None:
     """ Replace the `address_levels` table with the contents of `levels'.
 
         A new table is created any previously existing table is dropped.
         The table has the following columns:
             country, class, type, rank_search, rank_address
     """
-    rows = []
+    rows: List[Tuple[Any, ...]]  = []
     for entry in levels:
         _add_address_level_rows_from_entry(rows, entry)
 
     with conn.cursor() as cur:
         cur.drop_table(table)
 
-        cur.execute("""CREATE TABLE {} (country_code varchar(2),
+        cur.execute(pysql.SQL("""CREATE TABLE {} (
+                                        country_code varchar(2),
                                         class TEXT,
                                         type TEXT,
                                         rank_search SMALLINT,
-                                        rank_address SMALLINT)""".format(table))
+                                        rank_address SMALLINT)
+                              """).format(pysql.Identifier(table)))
 
         cur.execute_values(pysql.SQL("INSERT INTO {} VALUES %s")
                            .format(pysql.Identifier(table)), rows)
 
-        cur.execute('CREATE UNIQUE INDEX ON {} (country_code, class, type)'.format(table))
+        cur.execute(pysql.SQL('CREATE UNIQUE INDEX ON {} (country_code, class, type)')
+                    .format(pysql.Identifier(table)))
 
     conn.commit()
 
 
-def load_address_levels_from_config(conn, config):
+def load_address_levels_from_config(conn: Connection, config: Configuration) -> None:
     """ Replace the `address_levels` table with the content as
         defined in the given configuration. Uses the parameter
         NOMINATIM_ADDRESS_LEVEL_CONFIG to determine the location of the
@@ -69,7 +84,9 @@ def load_address_levels_from_config(conn, config):
     load_address_levels(conn, 'address_levels', cfg)
 
 
-def create_functions(conn, config, enable_diff_updates=True, enable_debug=False):
+def create_functions(conn: Connection, config: Configuration,
+                     enable_diff_updates: bool = True,
+                     enable_debug: bool = False) -> None:
     """ (Re)create the PL/pgSQL functions.
     """
     sql = SQLPreprocessor(conn, config)
@@ -106,10 +123,10 @@ PHP_CONST_DEFS = (
 )
 
 
-def import_wikipedia_articles(dsn, data_path, ignore_errors=False):
+def import_wikipedia_articles(dsn: str, data_path: Path, ignore_errors: bool = False) -> int:
     """ Replaces the wikipedia importance tables with new data.
         The import is run in a single transaction so that the new data
-        is replace seemlessly.
+        is replace seamlessly.
 
         Returns 0 if all was well and 1 if the importance file could not
         be found. Throws an exception if there was an error reading the file.
@@ -130,7 +147,7 @@ def import_wikipedia_articles(dsn, data_path, ignore_errors=False):
     return 0
 
 
-def recompute_importance(conn):
+def recompute_importance(conn: Connection) -> None:
     """ Recompute wikipedia links and importance for all entries in placex.
         This is a long-running operations that must not be executed in
         parallel with updates.
@@ -153,18 +170,19 @@ def recompute_importance(conn):
     conn.commit()
 
 
-def _quote_php_variable(var_type, config, conf_name):
+def _quote_php_variable(var_type: Type[Any], config: Configuration,
+                        conf_name: str) -> str:
     if var_type == bool:
         return 'true' if config.get_bool(conf_name) else 'false'
 
     if var_type == int:
-        return getattr(config, conf_name)
+        return cast(str, getattr(config, conf_name))
 
     if not getattr(config, conf_name):
         return 'false'
 
     if var_type == Path:
-        value = str(config.get_path(conf_name))
+        value = str(config.get_path(conf_name) or '')
     else:
         value = getattr(config, conf_name)
 
@@ -172,23 +190,22 @@ def _quote_php_variable(var_type, config, conf_name):
     return f"'{quoted}'"
 
 
-def setup_website(basedir, config, conn):
+def setup_website(basedir: Path, config: Configuration, conn: Connection) -> None:
     """ Create the website script stubs.
     """
     if not basedir.exists():
         LOG.info('Creating website directory.')
         basedir.mkdir()
 
-    template = dedent("""\
+    template = dedent(f"""\
                       <?php
 
                       @define('CONST_Debug', $_GET['debug'] ?? false);
-                      @define('CONST_LibDir', '{0}');
-                      @define('CONST_TokenizerDir', '{2}');
-                      @define('CONST_NominatimVersion', '{1[0]}.{1[1]}.{1[2]}-{1[3]}');
+                      @define('CONST_LibDir', '{config.lib_dir.php}');
+                      @define('CONST_TokenizerDir', '{config.project_dir / 'tokenizer'}');
+                      @define('CONST_NominatimVersion', '{version_str()}');
 
-                      """.format(config.lib_dir.php, NOMINATIM_VERSION,
-                                 config.project_dir / 'tokenizer'))
+                      """)
 
     for php_name, conf_name, var_type in PHP_CONST_DEFS:
         varout = _quote_php_variable(var_type, config, conf_name)
@@ -204,3 +221,29 @@ def setup_website(basedir, config, conn):
             (basedir / script).write_text(template.format('reverse-only-search.php'), 'utf-8')
         else:
             (basedir / script).write_text(template.format(script), 'utf-8')
+
+
+def invalidate_osm_object(osm_type: str, osm_id: int, conn: Connection,
+                          recursive: bool = True) -> None:
+    """ Mark the given OSM object for reindexing. When 'recursive' is set
+        to True (the default), then all dependent objects are marked for
+        reindexing as well.
+
+        'osm_type' must be on of 'N' (node), 'W' (way) or 'R' (relation).
+        If the given object does not exist, then nothing happens.
+    """
+    assert osm_type in ('N', 'R', 'W')
+
+    LOG.warning("Invalidating OSM %s %s%s.",
+                OSM_TYPE[osm_type], osm_id,
+                ' and its dependent places' if recursive else '')
+
+    with conn.cursor() as cur:
+        if recursive:
+            sql = """SELECT place_force_update(place_id)
+                     FROM placex WHERE osm_type = %s and osm_id = %s"""
+        else:
+            sql = """UPDATE placex SET indexed_status = 2
+                     WHERE osm_type = %s and osm_id = %s"""
+
+        cur.execute(sql, (osm_type, osm_id))
index c167a49f81fa0a28c6cbdbf877e3646d0b2c168b..db706bf67563d795b863da9b0d025412b8554c0f 100644 (file)
@@ -1,12 +1,21 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# This file is part of Nominatim. (https://nominatim.org)
+#
+# Copyright (C) 2022 by the Nominatim developer community.
+# For a full list of authors see the git log.
 """
 Functions for updating a database from a replication source.
 """
+from typing import ContextManager, MutableMapping, Any, Generator, cast
+from contextlib import contextmanager
 import datetime as dt
 from enum import Enum
 import logging
 import time
 
 from nominatim.db import status
+from nominatim.db.connection import Connection
 from nominatim.tools.exec_utils import run_osm2pgsql
 from nominatim.errors import UsageError
 
@@ -14,13 +23,13 @@ try:
     from osmium.replication.server import ReplicationServer
     from osmium import WriteHandler
 except ImportError as exc:
-    logging.getLogger().fatal("pyosmium not installed. Replication functions not available.\n"
-                              "To install pyosmium via pip: pip3 install osmium")
+    logging.getLogger().critical("pyosmium not installed. Replication functions not available.\n"
+                                 "To install pyosmium via pip: pip3 install osmium")
     raise UsageError("replication tools not available") from exc
 
 LOG = logging.getLogger()
 
-def init_replication(conn, base_url):
+def init_replication(conn: Connection, base_url: str) -> None:
     """ Set up replication for the server at the given base URL.
     """
     LOG.info("Using replication source: %s", base_url)
@@ -41,10 +50,10 @@ def init_replication(conn, base_url):
 
     status.set_status(conn, date=date, seq=seq)
 
-    LOG.warning("Updates intialised at sequence %s (%s)", seq, date)
+    LOG.warning("Updates initialised at sequence %s (%s)", seq, date)
 
 
-def check_for_updates(conn, base_url):
+def check_for_updates(conn: Connection, base_url: str) -> int:
     """ Check if new data is available from the replication service at the
         given base URL.
     """
@@ -77,7 +86,7 @@ class UpdateState(Enum):
     NO_CHANGES = 3
 
 
-def update(conn, options):
+def update(conn: Connection, options: MutableMapping[str, Any]) -> UpdateState:
     """ Update database from the next batch of data. Returns the state of
         updates according to `UpdateState`.
     """
@@ -88,6 +97,8 @@ def update(conn, options):
                   "Please run 'nominatim replication --init' first.")
         raise UsageError("Replication not set up.")
 
+    assert startdate is not None
+
     if not indexed and options['indexed_only']:
         LOG.info("Skipping update. There is data that needs indexing.")
         return UpdateState.MORE_PENDING
@@ -103,24 +114,39 @@ def update(conn, options):
         options['import_file'].unlink()
 
     # Read updates into file.
-    repl = ReplicationServer(options['base_url'])
-
-    outhandler = WriteHandler(str(options['import_file']))
-    endseq = repl.apply_diffs(outhandler, startseq + 1,
-                              max_size=options['max_diff_size'] * 1024)
-    outhandler.close()
+    with _make_replication_server(options['base_url']) as repl:
+        outhandler = WriteHandler(str(options['import_file']))
+        endseq = repl.apply_diffs(outhandler, startseq + 1,
+                                  max_size=options['max_diff_size'] * 1024)
+        outhandler.close()
 
-    if endseq is None:
-        return UpdateState.NO_CHANGES
+        if endseq is None:
+            return UpdateState.NO_CHANGES
 
-    # Consume updates with osm2pgsql.
-    options['append'] = True
-    options['disable_jit'] = conn.server_version_tuple() >= (11, 0)
-    run_osm2pgsql(options)
+        # Consume updates with osm2pgsql.
+        options['append'] = True
+        options['disable_jit'] = conn.server_version_tuple() >= (11, 0)
+        run_osm2pgsql(options)
 
-    # Write the current status to the file
-    endstate = repl.get_state_info(endseq)
-    status.set_status(conn, endstate.timestamp if endstate else None,
-                      seq=endseq, indexed=False)
+        # Write the current status to the file
+        endstate = repl.get_state_info(endseq)
+        status.set_status(conn, endstate.timestamp if endstate else None,
+                          seq=endseq, indexed=False)
 
     return UpdateState.UP_TO_DATE
+
+
+def _make_replication_server(url: str) -> ContextManager[ReplicationServer]:
+    """ Returns a ReplicationServer in form of a context manager.
+
+        Creates a light wrapper around older versions of pyosmium that did
+        not support the context manager interface.
+    """
+    if hasattr(ReplicationServer, '__enter__'):
+        return cast(ContextManager[ReplicationServer], ReplicationServer(url))
+
+    @contextmanager
+    def get_cm() -> Generator[ReplicationServer, None, None]:
+        yield ReplicationServer(url)
+
+    return get_cm()
index d0b3bbf81fc3300ae59a10000db981427a212833..0bb118c856a921777ea336060fe887f1a2d129e3 100644 (file)
@@ -1,3 +1,9 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# This file is part of Nominatim. (https://nominatim.org)
+#
+# Copyright (C) 2022 by the Nominatim developer community.
+# For a full list of authors see the git log.
 """
     Contains the class which handles statistics for the
     import of special phrases.
@@ -6,15 +12,14 @@ import logging
 LOG = logging.getLogger()
 
 class SpecialPhrasesImporterStatistics():
-    # pylint: disable-msg=too-many-instance-attributes
     """
         Class handling statistics of the import
         process of special phrases.
     """
-    def __init__(self):
+    def __init__(self) -> None:
         self._intialize_values()
 
-    def _intialize_values(self):
+    def _intialize_values(self) -> None:
         """
             Set all counts for the global
             import to 0.
@@ -24,32 +29,32 @@ class SpecialPhrasesImporterStatistics():
         self.tables_ignored = 0
         self.invalids = 0
 
-    def notify_one_phrase_invalid(self):
+    def notify_one_phrase_invalid(self) -> None:
         """
             Add +1 to the count of invalid entries
             fetched from the wiki.
         """
         self.invalids += 1
 
-    def notify_one_table_created(self):
+    def notify_one_table_created(self) -> None:
         """
             Add +1 to the count of created tables.
         """
         self.tables_created += 1
 
-    def notify_one_table_deleted(self):
+    def notify_one_table_deleted(self) -> None:
         """
             Add +1 to the count of deleted tables.
         """
         self.tables_deleted += 1
 
-    def notify_one_table_ignored(self):
+    def notify_one_table_ignored(self) -> None:
         """
             Add +1 to the count of ignored tables.
         """
         self.tables_ignored += 1
 
-    def notify_import_done(self):
+    def notify_import_done(self) -> None:
         """
             Print stats for the whole import process
             and reset all values.
index b7b24a7dff2cf3c70d148e5d97bfcc6e2d1a9b86..400f9fa91aa3efec500a8e40b3e7f1df08e609bf 100644 (file)
@@ -1,51 +1,45 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# This file is part of Nominatim. (https://nominatim.org)
+#
+# Copyright (C) 2022 by the Nominatim developer community.
+# For a full list of authors see the git log.
 """
     Module containing the SPCsvLoader class.
 
     The class allows to load phrases from a csv file.
 """
+from typing import Iterable
 import csv
 import os
-from collections.abc import Iterator
 from nominatim.tools.special_phrases.special_phrase import SpecialPhrase
 from nominatim.errors import UsageError
 
-class SPCsvLoader(Iterator):
+class SPCsvLoader:
     """
         Handles loading of special phrases from external csv file.
     """
-    def __init__(self, csv_path):
-        super().__init__()
+    def __init__(self, csv_path: str) -> None:
         self.csv_path = csv_path
-        self.has_been_read = False
 
-    def __next__(self):
-        if self.has_been_read:
-            raise StopIteration()
 
-        self.has_been_read = True
-        self.check_csv_validity()
-        return self.parse_csv()
-
-    def parse_csv(self):
-        """
-            Open and parse the given csv file.
+    def generate_phrases(self) -> Iterable[SpecialPhrase]:
+        """ Open and parse the given csv file.
             Create the corresponding SpecialPhrases.
         """
-        phrases = set()
+        self._check_csv_validity()
 
-        with open(self.csv_path) as file:
-            reader = csv.DictReader(file, delimiter=',')
+        with open(self.csv_path, encoding='utf-8') as fd:
+            reader = csv.DictReader(fd, delimiter=',')
             for row in reader:
-                phrases.add(
-                    SpecialPhrase(row['phrase'], row['class'], row['type'], row['operator'])
-                )
-        return phrases
+                yield SpecialPhrase(row['phrase'], row['class'], row['type'], row['operator'])
+
 
-    def check_csv_validity(self):
+    def _check_csv_validity(self) -> None:
         """
             Check that the csv file has the right extension.
         """
         _, extension = os.path.splitext(self.csv_path)
 
         if extension != '.csv':
-            raise UsageError('The file {} is not a csv file.'.format(self.csv_path))
+            raise UsageError(f'The file {self.csv_path} is not a csv file.')
index d9d126fa15be51c63f50362fe724bdd6ef9147b9..06b59fd003d5e3022b3e32cd458936152aaeb669 100644 (file)
@@ -1,3 +1,9 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# This file is part of Nominatim. (https://nominatim.org)
+#
+# Copyright (C) 2022 by the Nominatim developer community.
+# For a full list of authors see the git log.
 """
     Module containing the class handling the import
     of the special phrases.
     The phrases already present in the database which are not
     valids anymore are removed.
 """
+from typing import Iterable, Tuple, Mapping, Sequence, Optional, Set
 import logging
 import re
 
-from psycopg2.sql import Identifier, Literal, SQL
+from psycopg2.sql import Identifier, SQL
+
+from nominatim.config import Configuration
+from nominatim.db.connection import Connection
 from nominatim.tools.special_phrases.importer_statistics import SpecialPhrasesImporterStatistics
+from nominatim.tools.special_phrases.special_phrase import SpecialPhrase
+from nominatim.tokenizer.base import AbstractTokenizer
+from nominatim.typing import Protocol
 
 LOG = logging.getLogger()
 
-def _classtype_table(phrase_class, phrase_type):
+def _classtype_table(phrase_class: str, phrase_type: str) -> str:
     """ Return the name of the table for the given class and type.
     """
     return f'place_classtype_{phrase_class}_{phrase_type}'
 
+
+class SpecialPhraseLoader(Protocol):
+    """ Protocol for classes implementing a loader for special phrases.
+    """
+
+    def generate_phrases(self) -> Iterable[SpecialPhrase]:
+        """ Generates all special phrase terms this loader can produce.
+        """
+
+
 class SPImporter():
     # pylint: disable-msg=too-many-instance-attributes
     """
@@ -27,21 +50,22 @@ class SPImporter():
 
         Take a sp loader which load the phrases from an external source.
     """
-    def __init__(self, config, db_connection, sp_loader) -> None:
+    def __init__(self, config: Configuration, conn: Connection,
+                 sp_loader: SpecialPhraseLoader) -> None:
         self.config = config
-        self.db_connection = db_connection
+        self.db_connection = conn
         self.sp_loader = sp_loader
         self.statistics_handler = SpecialPhrasesImporterStatistics()
         self.black_list, self.white_list = self._load_white_and_black_lists()
         self.sanity_check_pattern = re.compile(r'^\w+$')
         # This set will contain all existing phrases to be added.
-        # It contains tuples with the following format: (lable, class, type, operator)
-        self.word_phrases = set()
+        # It contains tuples with the following format: (label, class, type, operator)
+        self.word_phrases: Set[Tuple[str, str, str, str]] = set()
         # This set will contain all existing place_classtype tables which doesn't match any
         # special phrases class/type on the wiki.
-        self.table_phrases_to_delete = set()
+        self.table_phrases_to_delete: Set[str] = set()
 
-    def import_phrases(self, tokenizer, should_replace):
+    def import_phrases(self, tokenizer: AbstractTokenizer, should_replace: bool) -> None:
         """
             Iterate through all SpecialPhrases extracted from the
             loader and import them into the database.
@@ -56,13 +80,12 @@ class SPImporter():
         # Store pairs of class/type for further processing
         class_type_pairs = set()
 
-        for loaded_phrases in self.sp_loader:
-            for phrase in loaded_phrases:
-                result = self._process_phrase(phrase)
-                if result:
-                    class_type_pairs.add(result)
+        for phrase in self.sp_loader.generate_phrases():
+            result = self._process_phrase(phrase)
+            if result:
+                class_type_pairs.add(result)
 
-        self._create_place_classtype_table_and_indexes(class_type_pairs)
+        self._create_classtype_table_and_indexes(class_type_pairs)
         if should_replace:
             self._remove_non_existent_tables_from_db()
         self.db_connection.commit()
@@ -74,7 +97,7 @@ class SPImporter():
         self.statistics_handler.notify_import_done()
 
 
-    def _fetch_existing_place_classtype_tables(self):
+    def _fetch_existing_place_classtype_tables(self) -> None:
         """
             Fetch existing place_classtype tables.
             Fill the table_phrases_to_delete set of the class.
@@ -90,7 +113,8 @@ class SPImporter():
             for row in db_cursor:
                 self.table_phrases_to_delete.add(row[0])
 
-    def _load_white_and_black_lists(self):
+    def _load_white_and_black_lists(self) \
+          -> Tuple[Mapping[str, Sequence[str]], Mapping[str, Sequence[str]]]:
         """
             Load white and black lists from phrases-settings.json.
         """
@@ -98,7 +122,7 @@ class SPImporter():
 
         return settings['blackList'], settings['whiteList']
 
-    def _check_sanity(self, phrase):
+    def _check_sanity(self, phrase: SpecialPhrase) -> bool:
         """
             Check sanity of given inputs in case somebody added garbage in the wiki.
             If a bad class/type is detected the system will exit with an error.
@@ -112,7 +136,7 @@ class SPImporter():
             return False
         return True
 
-    def _process_phrase(self, phrase):
+    def _process_phrase(self, phrase: SpecialPhrase) -> Optional[Tuple[str, str]]:
         """
             Processes the given phrase by checking black and white list
             and sanity.
@@ -140,7 +164,8 @@ class SPImporter():
         return (phrase.p_class, phrase.p_type)
 
 
-    def _create_place_classtype_table_and_indexes(self, class_type_pairs):
+    def _create_classtype_table_and_indexes(self,
+                                            class_type_pairs: Iterable[Tuple[str, str]]) -> None:
         """
             Create table place_classtype for each given pair.
             Also create indexes on place_id and centroid.
@@ -183,44 +208,48 @@ class SPImporter():
             db_cursor.execute("DROP INDEX idx_placex_classtype")
 
 
-    def _create_place_classtype_table(self, sql_tablespace, phrase_class, phrase_type):
+    def _create_place_classtype_table(self, sql_tablespace: str,
+                                      phrase_class: str, phrase_type: str) -> None:
         """
-            Create table place_classtype of the given phrase_class/phrase_type if doesn't exit.
+            Create table place_classtype of the given phrase_class/phrase_type
+            if doesn't exit.
         """
         table_name = _classtype_table(phrase_class, phrase_type)
-        with self.db_connection.cursor() as db_cursor:
-            db_cursor.execute(SQL("""
-                    CREATE TABLE IF NOT EXISTS {{}} {}
-                    AS SELECT place_id AS place_id,st_centroid(geometry) AS centroid FROM placex
-                    WHERE class = {{}} AND type = {{}}""".format(sql_tablespace))
-                              .format(Identifier(table_name), Literal(phrase_class),
-                                      Literal(phrase_type)))
-
-
-    def _create_place_classtype_indexes(self, sql_tablespace, phrase_class, phrase_type):
+        with self.db_connection.cursor() as cur:
+            cur.execute(SQL("""CREATE TABLE IF NOT EXISTS {} {} AS
+                                 SELECT place_id AS place_id,
+                                        st_centroid(geometry) AS centroid
+                                 FROM placex
+                                 WHERE class = %s AND type = %s
+                             """).format(Identifier(table_name), SQL(sql_tablespace)),
+                        (phrase_class, phrase_type))
+
+
+    def _create_place_classtype_indexes(self, sql_tablespace: str,
+                                        phrase_class: str, phrase_type: str) -> None:
         """
             Create indexes on centroid and place_id for the place_classtype table.
         """
-        index_prefix = 'idx_place_classtype_{}_{}_'.format(phrase_class, phrase_type)
+        index_prefix = f'idx_place_classtype_{phrase_class}_{phrase_type}_'
         base_table = _classtype_table(phrase_class, phrase_type)
         # Index on centroid
         if not self.db_connection.index_exists(index_prefix + 'centroid'):
             with self.db_connection.cursor() as db_cursor:
-                db_cursor.execute(SQL("""
-                    CREATE INDEX {{}} ON {{}} USING GIST (centroid) {}""".format(sql_tablespace))
+                db_cursor.execute(SQL("CREATE INDEX {} ON {} USING GIST (centroid) {}")
                                   .format(Identifier(index_prefix + 'centroid'),
-                                          Identifier(base_table)), sql_tablespace)
+                                          Identifier(base_table),
+                                          SQL(sql_tablespace)))
 
         # Index on place_id
         if not self.db_connection.index_exists(index_prefix + 'place_id'):
             with self.db_connection.cursor() as db_cursor:
-                db_cursor.execute(SQL(
-                    """CREATE INDEX {{}} ON {{}} USING btree(place_id) {}""".format(sql_tablespace))
+                db_cursor.execute(SQL("CREATE INDEX {} ON {} USING btree(place_id) {}")
                                   .format(Identifier(index_prefix + 'place_id'),
-                                          Identifier(base_table)))
+                                          Identifier(base_table),
+                                          SQL(sql_tablespace)))
 
 
-    def _grant_access_to_webuser(self, phrase_class, phrase_type):
+    def _grant_access_to_webuser(self, phrase_class: str, phrase_type: str) -> None:
         """
             Grant access on read to the table place_classtype for the webuser.
         """
@@ -230,7 +259,7 @@ class SPImporter():
                               .format(Identifier(table_name),
                                       Identifier(self.config.DATABASE_WEBUSER)))
 
-    def _remove_non_existent_tables_from_db(self):
+    def _remove_non_existent_tables_from_db(self) -> None:
         """
             Remove special phrases which doesn't exist on the wiki anymore.
             Delete the place_classtype tables.
index 1ad9de7e2cfa299dc18b68e873bf6f00c9592432..e71c2ec04a9f6e34504f02d3ecd3f90c5af3511c 100644 (file)
@@ -1,70 +1,67 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# This file is part of Nominatim. (https://nominatim.org)
+#
+# Copyright (C) 2022 by the Nominatim developer community.
+# For a full list of authors see the git log.
 """
     Module containing the SPWikiLoader class.
 """
+from typing import Iterable
 import re
 import logging
-from collections.abc import Iterator
+
+from nominatim.config import Configuration
 from nominatim.tools.special_phrases.special_phrase import SpecialPhrase
 from nominatim.tools.exec_utils import get_url
 
 LOG = logging.getLogger()
-class SPWikiLoader(Iterator):
+
+def _get_wiki_content(lang: str) -> str:
+    """
+        Request and return the wiki page's content
+        corresponding to special phrases for a given lang.
+        Requested URL Example :
+            https://wiki.openstreetmap.org/wiki/Special:Export/Nominatim/Special_Phrases/EN
+    """
+    url = 'https://wiki.openstreetmap.org/wiki/Special:Export/Nominatim/Special_Phrases/' \
+          + lang.upper()
+    return get_url(url)
+
+
+class SPWikiLoader:
     """
         Handles loading of special phrases from the wiki.
     """
-    def __init__(self, config, languages=None):
-        super().__init__()
+    def __init__(self, config: Configuration) -> None:
         self.config = config
         # Compile the regex here to increase performances.
         self.occurence_pattern = re.compile(
             r'\| *([^\|]+) *\|\| *([^\|]+) *\|\| *([^\|]+) *\|\| *([^\|]+) *\|\| *([\-YN])'
         )
-        self.languages = self._load_languages() if not languages else list(languages)
+        # Hack around a bug where building=yes was imported with quotes into the wiki
+        self.type_fix_pattern = re.compile(r'\"|&quot;')
 
-    def __next__(self):
-        if not self.languages:
-            raise StopIteration
+        self.languages = self.config.get_str_list('LANGUAGES') or \
+                         ['af', 'ar', 'br', 'ca', 'cs', 'de', 'en', 'es',
+                          'et', 'eu', 'fa', 'fi', 'fr', 'gl', 'hr', 'hu',
+                          'ia', 'is', 'it', 'ja', 'mk', 'nl', 'no', 'pl',
+                          'ps', 'pt', 'ru', 'sk', 'sl', 'sv', 'uk', 'vi']
 
-        lang = self.languages.pop(0)
-        loaded_xml = self._get_wiki_content(lang)
-        LOG.warning('Importing phrases for lang: %s...', lang)
-        return self.parse_xml(loaded_xml)
 
-    def parse_xml(self, xml):
+    def generate_phrases(self) -> Iterable[SpecialPhrase]:
+        """ Download the wiki pages for the configured languages
+            and extract the phrases from the page.
         """
-            Parses XML content and extracts special phrases from it.
-            Return a list of SpecialPhrase.
-        """
-        # One match will be of format [label, class, type, operator, plural]
-        matches = self.occurence_pattern.findall(xml)
-        returned_phrases = set()
-        for match in matches:
-            returned_phrases.add(
-                SpecialPhrase(match[0], match[1], match[2], match[3])
-            )
-        return returned_phrases
+        for lang in self.languages:
+            LOG.warning('Importing phrases for lang: %s...', lang)
+            loaded_xml = _get_wiki_content(lang)
 
-    def _load_languages(self):
-        """
-            Get list of all languages from env config file
-            or default if there is no languages configured.
-            The system will extract special phrases only from all specified languages.
-        """
-        default_languages = [
-            'af', 'ar', 'br', 'ca', 'cs', 'de', 'en', 'es',
-            'et', 'eu', 'fa', 'fi', 'fr', 'gl', 'hr', 'hu',
-            'ia', 'is', 'it', 'ja', 'mk', 'nl', 'no', 'pl',
-            'ps', 'pt', 'ru', 'sk', 'sl', 'sv', 'uk', 'vi']
-        return self.config.LANGUAGES.split(',') if self.config.LANGUAGES else default_languages
+            # One match will be of format [label, class, type, operator, plural]
+            matches = self.occurence_pattern.findall(loaded_xml)
 
-    @staticmethod
-    def _get_wiki_content(lang):
-        """
-            Request and return the wiki page's content
-            corresponding to special phrases for a given lang.
-            Requested URL Example :
-                https://wiki.openstreetmap.org/wiki/Special:Export/Nominatim/Special_Phrases/EN
-        """
-        url = 'https://wiki.openstreetmap.org/wiki/Special:Export/Nominatim/Special_Phrases/' \
-              + lang.upper()
-        return get_url(url)
+            for match in matches:
+                yield SpecialPhrase(match[0],
+                                    match[1],
+                                    self.type_fix_pattern.sub('', match[2]),
+                                    match[3])
index 3b6aef851ee50bf586bbd32ef703c5a4da295c2b..40f6a9e4cb57112736dab4381ba1fdcd41b19b9b 100644 (file)
@@ -1,20 +1,37 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# This file is part of Nominatim. (https://nominatim.org)
+#
+# Copyright (C) 2022 by the Nominatim developer community.
+# For a full list of authors see the git log.
 """
     Module containing the class SpecialPhrase.
 
     This class is a model used to transfer a special phrase through
     the process of load and importation.
 """
-import re
+from typing import Any
 
-class SpecialPhrase():
+class SpecialPhrase:
     """
         Model representing a special phrase.
     """
-    def __init__(self, p_label, p_class, p_type, p_operator):
+    def __init__(self, p_label: str, p_class: str, p_type: str, p_operator: str) -> None:
         self.p_label = p_label.strip()
         self.p_class = p_class.strip()
-        # Hack around a bug where building=yes was imported with quotes into the wiki
-        self.p_type = re.sub(r'\"|&quot;', '', p_type.strip())
+        self.p_type = p_type.strip()
         # Needed if some operator in the wiki are not written in english
         p_operator = p_operator.strip().lower()
         self.p_operator = '-' if p_operator not in ('near', 'in') else p_operator
+
+    def __eq__(self, other: Any) -> bool:
+        if not isinstance(other, SpecialPhrase):
+            return False
+
+        return self.p_label == other.p_label \
+               and self.p_class == other.p_class \
+               and self.p_type == other.p_type \
+               and self.p_operator == other.p_operator
+
+    def __hash__(self) -> int:
+        return hash((self.p_label, self.p_class, self.p_type, self.p_operator))
index 19a1268253feaa7ff1e2e6de20be3c43f1d74025..4a32bb1ebf93848b0126d0dfd31b5b0bd472c858 100644 (file)
@@ -1,50 +1,88 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# This file is part of Nominatim. (https://nominatim.org)
+#
+# Copyright (C) 2022 by the Nominatim developer community.
+# For a full list of authors see the git log.
 """
 Functions for importing tiger data and handling tarbar and directory files
 """
+from typing import Any, TextIO, List, Union, cast
 import csv
 import io
 import logging
 import os
 import tarfile
 
+from psycopg2.extras import Json
+
+from nominatim.config import Configuration
 from nominatim.db.connection import connect
 from nominatim.db.async_connection import WorkerPool
 from nominatim.db.sql_preprocessor import SQLPreprocessor
 from nominatim.errors import UsageError
-from nominatim.indexer.place_info import PlaceInfo
+from nominatim.data.place_info import PlaceInfo
+from nominatim.tokenizer.base import AbstractAnalyzer, AbstractTokenizer
 
 LOG = logging.getLogger()
 
-
-def handle_tarfile_or_directory(data_dir):
-    """ Handles tarfile or directory for importing tiger data
+class TigerInput:
+    """ Context manager that goes through Tiger input files which may
+        either be in a directory or gzipped together in a tar file.
     """
 
-    tar = None
-    if data_dir.endswith('.tar.gz'):
-        try:
-            tar = tarfile.open(data_dir)
-        except tarfile.ReadError as err:
-            LOG.fatal("Cannot open '%s'. Is this a tar file?", data_dir)
-            raise UsageError("Cannot open Tiger data file.") from err
-
-        csv_files = [i for i in tar.getmembers() if i.name.endswith('.csv')]
-        LOG.warning("Found %d CSV files in tarfile with path %s", len(csv_files), data_dir)
-        if not csv_files:
-            LOG.warning("Tiger data import selected but no files in tarfile's path %s", data_dir)
-            return None, None
-    else:
-        files = os.listdir(data_dir)
-        csv_files = [os.path.join(data_dir, i) for i in files if i.endswith('.csv')]
-        LOG.warning("Found %d CSV files in path %s", len(csv_files), data_dir)
-        if not csv_files:
-            LOG.warning("Tiger data import selected but no files found in path %s", data_dir)
-            return None, None
-
-    return csv_files, tar
-
-
-def handle_threaded_sql_statements(pool, fd, analyzer):
+    def __init__(self, data_dir: str) -> None:
+        self.tar_handle = None
+        self.files: List[Union[str, tarfile.TarInfo]] = []
+
+        if data_dir.endswith('.tar.gz'):
+            try:
+                self.tar_handle = tarfile.open(data_dir) # pylint: disable=consider-using-with
+            except tarfile.ReadError as err:
+                LOG.fatal("Cannot open '%s'. Is this a tar file?", data_dir)
+                raise UsageError("Cannot open Tiger data file.") from err
+
+            self.files = [i for i in self.tar_handle.getmembers() if i.name.endswith('.csv')]
+            LOG.warning("Found %d CSV files in tarfile with path %s", len(self.files), data_dir)
+        else:
+            files = os.listdir(data_dir)
+            self.files = [os.path.join(data_dir, i) for i in files if i.endswith('.csv')]
+            LOG.warning("Found %d CSV files in path %s", len(self.files), data_dir)
+
+        if not self.files:
+            LOG.warning("Tiger data import selected but no files found at %s", data_dir)
+
+
+    def __enter__(self) -> 'TigerInput':
+        return self
+
+
+    def __exit__(self, exc_type: Any, exc_val: Any, exc_tb: Any) -> None:
+        if self.tar_handle:
+            self.tar_handle.close()
+            self.tar_handle = None
+
+
+    def next_file(self) -> TextIO:
+        """ Return a file handle to the next file to be processed.
+            Raises an IndexError if there is no file left.
+        """
+        fname = self.files.pop(0)
+
+        if self.tar_handle is not None:
+            extracted = self.tar_handle.extractfile(fname)
+            assert extracted is not None
+            return io.TextIOWrapper(extracted)
+
+        return open(cast(str, fname), encoding='utf-8')
+
+
+    def __len__(self) -> int:
+        return len(self.files)
+
+
+def handle_threaded_sql_statements(pool: WorkerPool, fd: TextIO,
+                                   analyzer: AbstractAnalyzer) -> None:
     """ Handles sql statement with multiplexing
     """
     lines = 0
@@ -57,7 +95,7 @@ def handle_threaded_sql_statements(pool, fd, analyzer):
             address = dict(street=row['street'], postcode=row['postcode'])
             args = ('SRID=4326;' + row['geometry'],
                     int(row['from']), int(row['to']), row['interpolation'],
-                    PlaceInfo({'address': address}).analyze(analyzer),
+                    Json(analyzer.process_place(PlaceInfo({'address': address}))),
                     analyzer.normalize_postcode(row['postcode']))
         except ValueError:
             continue
@@ -69,39 +107,35 @@ def handle_threaded_sql_statements(pool, fd, analyzer):
             lines = 0
 
 
-def add_tiger_data(data_dir, config, threads, tokenizer):
+def add_tiger_data(data_dir: str, config: Configuration, threads: int,
+                   tokenizer: AbstractTokenizer) -> int:
     """ Import tiger data from directory or tar file `data dir`.
     """
     dsn = config.get_libpq_dsn()
-    files, tar = handle_tarfile_or_directory(data_dir)
 
-    if not files:
-        return
+    with TigerInput(data_dir) as tar:
+        if not tar:
+            return 1
 
-    with connect(dsn) as conn:
-        sql = SQLPreprocessor(conn, config)
-        sql.run_sql_file(conn, 'tiger_import_start.sql')
+        with connect(dsn) as conn:
+            sql = SQLPreprocessor(conn, config)
+            sql.run_sql_file(conn, 'tiger_import_start.sql')
 
-    # Reading files and then for each file line handling
-    # sql_query in <threads - 1> chunks.
-    place_threads = max(1, threads - 1)
+        # Reading files and then for each file line handling
+        # sql_query in <threads - 1> chunks.
+        place_threads = max(1, threads - 1)
 
-    with WorkerPool(dsn, place_threads, ignore_sql_errors=True) as pool:
-        with tokenizer.name_analyzer() as analyzer:
-            for fname in files:
-                if not tar:
-                    fd = open(fname)
-                else:
-                    fd = io.TextIOWrapper(tar.extractfile(fname))
+        with WorkerPool(dsn, place_threads, ignore_sql_errors=True) as pool:
+            with tokenizer.name_analyzer() as analyzer:
+                while tar:
+                    with tar.next_file() as fd:
+                        handle_threaded_sql_statements(pool, fd, analyzer)
 
-                handle_threaded_sql_statements(pool, fd, analyzer)
+        print('\n')
 
-                fd.close()
-
-    if tar:
-        tar.close()
-    print('\n')
     LOG.warning("Creating indexes on Tiger data")
     with connect(dsn) as conn:
         sql = SQLPreprocessor(conn, config)
         sql.run_sql_file(conn, 'tiger_import_finish.sql')
+
+    return 0
diff --git a/nominatim/typing.py b/nominatim/typing.py
new file mode 100644 (file)
index 0000000..7914d73
--- /dev/null
@@ -0,0 +1,52 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# This file is part of Nominatim. (https://nominatim.org)
+#
+# Copyright (C) 2022 by the Nominatim developer community.
+# For a full list of authors see the git log.
+"""
+Type definitions for typing annotations.
+
+Complex type definitions are moved here, to keep the source files readable.
+"""
+from typing import Any, Union, Mapping, TypeVar, Sequence, TYPE_CHECKING
+
+# Generics variable names do not confirm to naming styles, ignore globally here.
+# pylint: disable=invalid-name,abstract-method,multiple-statements
+# pylint: disable=missing-class-docstring,useless-import-alias
+
+if TYPE_CHECKING:
+    import psycopg2.sql
+    import psycopg2.extensions
+    import psycopg2.extras
+    import os
+
+StrPath = Union[str, 'os.PathLike[str]']
+
+SysEnv = Mapping[str, str]
+
+# psycopg2-related types
+
+Query = Union[str, bytes, 'psycopg2.sql.Composable']
+
+T_ResultKey = TypeVar('T_ResultKey', int, str)
+
+class DictCursorResult(Mapping[str, Any]):
+    def __getitem__(self, x: Union[int, str]) -> Any: ...
+
+DictCursorResults = Sequence[DictCursorResult]
+
+T_cursor = TypeVar('T_cursor', bound='psycopg2.extensions.cursor')
+
+# The following typing features require typing_extensions to work
+# on all supported Python versions.
+# Only require this for type checking but not for normal operations.
+
+if TYPE_CHECKING:
+    from typing_extensions import (Protocol as Protocol,
+                                   Final as Final,
+                                   TypedDict as TypedDict)
+else:
+    Protocol = object
+    Final = 'Final'
+    TypedDict = dict
diff --git a/nominatim/utils/__init__.py b/nominatim/utils/__init__.py
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/nominatim/utils/centroid.py b/nominatim/utils/centroid.py
new file mode 100644 (file)
index 0000000..2182317
--- /dev/null
@@ -0,0 +1,49 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# This file is part of Nominatim. (https://nominatim.org)
+#
+# Copyright (C) 2022 by the Nominatim developer community.
+# For a full list of authors see the git log.
+"""
+Functions for computation of centroids.
+"""
+from typing import Tuple, Any
+from collections.abc import Collection
+
+class PointsCentroid:
+    """ Centroid computation from single points using an online algorithm.
+        More points may be added at any time.
+
+        Coordinates are internally treated as a 7-digit fixed-point float
+        (i.e. in OSM style).
+    """
+
+    def __init__(self) -> None:
+        self.sum_x = 0
+        self.sum_y = 0
+        self.count = 0
+
+    def centroid(self) -> Tuple[float, float]:
+        """ Return the centroid of all points collected so far.
+        """
+        if self.count == 0:
+            raise ValueError("No points available for centroid.")
+
+        return (float(self.sum_x/self.count)/10000000,
+                float(self.sum_y/self.count)/10000000)
+
+
+    def __len__(self) -> int:
+        return self.count
+
+
+    def __iadd__(self, other: Any) -> 'PointsCentroid':
+        if isinstance(other, Collection) and len(other) == 2:
+            if all(isinstance(p, (float, int)) for p in other):
+                x, y = other
+                self.sum_x += int(x * 10000000)
+                self.sum_y += int(y * 10000000)
+                self.count += 1
+                return self
+
+        raise ValueError("Can only add 2-element tuples to centroid.")
index 06a3e97113692fd3c43e50caa598c71ae46017c7..e7e750b04bc77675809686c1a314ec05fba1d445 100644 (file)
@@ -1,6 +1,13 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# This file is part of Nominatim. (https://nominatim.org)
+#
+# Copyright (C) 2022 by the Nominatim developer community.
+# For a full list of authors see the git log.
 """
 Version information for Nominatim.
 """
+from typing import Optional, Tuple
 
 # Version information: major, minor, patch level, database patch level
 #
@@ -14,11 +21,25 @@ Version information for Nominatim.
 # to 99 to make sure that the migration is applied when updating from a
 # patch release to the next minor version. Patch releases usually shouldn't
 # have migrations in them. When they are needed, then make sure that the
-# migration can reapplied and set the migration version to the appropriate
+# migration can be reapplied and set the migration version to the appropriate
 # patch level when cherry-picking the commit with the migration.
 #
 # Released versions always have a database patch level of 0.
-NOMINATIM_VERSION = (4, 0, 99, 1)
+NOMINATIM_VERSION = (4, 1, 0, 0)
 
-POSTGRESQL_REQUIRED_VERSION = (9, 5)
+POSTGRESQL_REQUIRED_VERSION = (9, 6)
 POSTGIS_REQUIRED_VERSION = (2, 2)
+
+# Cmake sets a variable @GIT_HASH@ by executing 'git --log'. It is not run
+# on every execution of 'make'.
+# cmake/tool-installed.tmpl is used to build the binary 'nominatim'. Inside
+# there is a call to set the variable value below.
+GIT_COMMIT_HASH : Optional[str] = None
+
+
+# pylint: disable=consider-using-f-string
+def version_str(version:Tuple[int, int, int, int] = NOMINATIM_VERSION) -> str:
+    """
+    Return a human-readable string of the version.
+    """
+    return '{}.{}.{}-{}'.format(*version)
index bd7b4440000a9c1df639c5fac020bc00bd590368..b0352aa8f15e2739ba36d72561854a2738123770 160000 (submodule)
--- a/osm2pgsql
+++ b/osm2pgsql
@@ -1 +1 @@
-Subproject commit bd7b4440000a9c1df639c5fac020bc00bd590368
+Subproject commit b0352aa8f15e2739ba36d72561854a2738123770
index 67bca991929d6e1974e52d98994f414b685b1651..b63eac4efa065de8c3782cd1d75658af0197283c 100644 (file)
       }
   }
 },
+{ "countries" : [ "ca" ],
+  "tags" : {
+      "place" : {
+          "county" : [12, 0]
+      }
+  }
+},
 { "countries" : [ "de" ],
   "tags" : {
       "place" : {
diff --git a/settings/country-names/ad.yaml b/settings/country-names/ad.yaml
new file mode 100644 (file)
index 0000000..4ade567
--- /dev/null
@@ -0,0 +1,158 @@
+name: 
+    default: Andorra
+    ab: Андора
+    af: Andorra
+    ak: Andora
+    am: አንዶራ
+    an: Andorra
+    ar: أندورا
+    av: Андо́рра
+    az: Andorra
+    ba: Андо́рра
+    be: Андо́ра
+    bg: Андора
+    bh: अंडोरा
+    bi: Andorra
+    bm: Andɔr
+    bn: অ্যান্ডোরা
+    bo: ཨན་ཌོར་ར།
+    br: Andorra
+    bs: Andora
+    ca: Andorra
+    ce: Андо́рра
+    co: Andorra
+    cs: Andorra
+    cu: Андо́ра
+    cv: Андорра
+    cy: Andorra
+    da: Andorra
+    de: Andorra
+    dv: އެންޑޯރާ
+    dz: ཨཱན་དོ་ར
+    ee: Andorra
+    el: Ανδόρρα
+    en: Andorra
+    eo: Andoro
+    es: Andorra
+    et: Andorra
+    eu: Andorra
+    fa: آندورا
+    ff: Anndoora
+    fi: Andorra
+    fo: Andorra
+    fr: Andorre
+    fy: Andorra
+    ga: Andóra
+    gd: Andorra
+    gl: Andorra
+    gn: Andorra
+    gu: એન્ડોરા
+    gv: Andorra
+    ha: Andorra
+    he: אַנְדּוֹרָה
+    hi: अण्डोरा
+    hr: Andora
+    ht: Andora
+    hu: Andorra
+    hy: Անդորրա
+    ia: Andorra
+    id: Andorra
+    ie: Andorra
+    ig: Andorra
+    io: Andora
+    is: Andorra
+    it: Andorra
+    ja: アンドラ
+    jv: Andorra
+    ka: ანდორა
+    kg: Andora
+    ki: Andora
+    kk: Андорра
+    kl: Andorra
+    km: អង់ដូរ៉ា
+    kn: ಅಂಡೋರ
+    ko: 안도라
+    ks: اٮ۪نڑورا
+    ku: Andorra
+    kv: Андорра
+    kw: Andorra
+    ky: Андорра
+    la: Andorra
+    lb: Andorra
+    lg: Andora
+    li: Andorra
+    ln: Andora
+    lo: ອັງດອກ
+    lt: Andora
+    lv: Andora
+    mg: Andora
+    mi: Andorra
+    mk: Андора
+    ml: അൻഡോറ
+    mn: Андорра
+    mr: आंदोरा
+    ms: Andorra
+    mt: Andorra
+    my: အင်ဒိုရာနိုင်ငံ
+    na: Andorra
+    ne: एण्डोरा
+    nl: Andorra
+    nn: Andorra
+    "no": Andorra
+    nv: Andówa
+    oc: Andòrra
+    om: Andooraa
+    or: ଆଣ୍ଡୋରା
+    os: Андоррæ
+    pa: ਅੰਡੋਰਾ
+    pi: अंडोरा
+    pl: Andora
+    ps: اندورا
+    pt: Andorra
+    qu: Andurra
+    rm: Andorra
+    rn: Andora
+    ro: Andorra
+    ru: Андорра
+    rw: Andora
+    sa: अण्डोरा
+    sc: Andorra
+    sd: انڊورا
+    se: Andorra
+    sg: Andôro
+    sh: Andora
+    si: ඇන්ඩෝරා
+    sk: Andorra
+    sl: Andora
+    sm: Andora
+    sn: Andorra
+    so: Andorra
+    sq: Andorra
+    sr: Андора
+    ss: iYandola
+    su: Andorra
+    sv: Andorra
+    sw: Andorra
+    ta: அண்டோரா
+    te: అండొర్రా
+    tg: Андорра
+    th: อันดอร์รา
+    ti: አንዶራ
+    tk: Andorra
+    tl: Andorra
+    to: ʻEnitola
+    tr: Andorra
+    ts: Andorra
+    tt: Андорра
+    tw: Andorra
+    ug: ئاندوررا
+    uk: Андо́рра
+    ur: انڈورا
+    uz: Andorra
+    vi: Andorra
+    vo: Landorän
+    wo: Andoor
+    yi: אַנדאָרע
+    yo: Àndórà
+    zh: 安道爾
+    zu: I-Andora
diff --git a/settings/country-names/ae.yaml b/settings/country-names/ae.yaml
new file mode 100644 (file)
index 0000000..ede35e0
--- /dev/null
@@ -0,0 +1,122 @@
+name: 
+    default: الإمارات العربية المتحدة
+    af: Verenigde Arabiese Emirate
+    am: የተባበሩት የዓረብ ግዛቶች
+    an: Emiratos Arabes Unitos
+    ar: الإمارات العربية المتحدة
+    av: ГIарабазул Цолъарал Имаратал
+    az: Birləşmiş Ərəb Əmirlikləri
+    be: Аб'яднаныя Арабскія Эміраты
+    bg: Обединени арабски емирства
+    bn: সংযুক্ত আরব আমিরাত
+    bo: ཡི་ནེ་ཁྲེ་ཀྲི་ཨ་རབ་ཨེ་མེ་རེ་ཁྲི།
+    br: Emirelezhioù Arab Unanet
+    bs: Ujedinjeni Arapski Emirati
+    ca: Emirats Àrabs Units
+    ce: Ӏарбийн Цхьаьнакхетта Эмираташ
+    cs: Spojené arabské emiráty
+    cy: Yr Emiradau Arabaidd Unedig
+    da: Forenede Arabiske Emirater
+    de: Vereinigte Arabische Emirate
+    dv: އެކުވެރި ޢަރަބި އިމާރާތު
+    dz: ཡུ་ནའི་ཊེཊ་ཨ་རབ་ཨེ་མི་རེཊསི་
+    el: Ηνωμένα Αραβικά Εμιράτα
+    en: United Arab Emirates
+    eo: Unuiĝintaj Arabaj Emirlandoj
+    es: Emiratos Árabes Unidos
+    et: Araabia Ühendemiraadid
+    eu: Arabiar Emirerri Batuak
+    fa: امارات متحده عربی
+    fi: Yhdistyneet arabiemiirikunnat
+    fo: Sameindu Emirríkini
+    fr: Émirats arabes unis
+    fy: Feriene Arabyske Emiraten
+    ga: Aontas na nÉimíríochtaí Arabacha
+    gd: Na h-Iomaratan Arabach Aonaichte
+    gl: Emiratos Árabes Unidos
+    gn: Aravia Emiryvy Joaju
+    gv: Ny h-Emmiraidyn Arabagh Unnaneysit
+    he: איחוד האמירויות הערביות
+    hi: संयुक्त अरब अमीरात
+    hr: Ujedinjeni Arapski Emirati
+    ht: Emira Arab Ini
+    hu: Egyesült Arab Emírségek
+    hy: Արաբական Միացյալ Էմիրություններ
+    ia: Emiratos Arabe Unite
+    id: Uni Emirat Arab
+    ie: Unit Arabic Emiratus
+    io: Unionita Araba Emirati
+    is: Sameinuðu arabísku furstadæmin
+    it: Emirati Arabi Uniti
+    ja: アラブ首長国連邦
+    jv: Uni Emirat Arab
+    ka: არაბთა გაერთიანებული საამიროები
+    ki: United Arab Emirates
+    kk: Біріккен Араб Әмірліктері
+    kl: United Arab Emirates
+    kn: ಸಂಯುಕ್ತ ಅರಬ ಅಮೀರಾತ
+    ko: 아랍에미리트
+    ku: Mîrnişînên Erebî yên Yekbûyî
+    kv: Ӧтувтчӧм Араб Эмиратъяс
+    kw: Pennternasedh Unys Arabek
+    ky: Бириккен Араб Эмирликтери
+    la: Phylarchiarum Arabicarum Confoederatio
+    lb: Vereenegt Arabesch Emiraten
+    li: Vereinegde Arabische Emiraote
+    lt: Jungtiniai Arabų Emyratai
+    lv: Apvienotie Arābu Emirāti
+    mi: Te Kotahitanga o ngā Whenua Ārapi
+    mk: Обединети Арапски Емирати
+    ml: ഐക്യ അറബ് എമിറേറ്റുകൾ
+    mn: Арабын Нэгдсэн Эмирт Улс
+    mr: संयुक्त अरब अमिराती
+    ms: Emiriah Arab Bersatu
+    mt: Emirati Għarab Magħquda
+    my: အာရပ်စော်ဘွားများပြည်ထောင်စုနိုင်ငံ
+    na: Emireitit Arabiya
+    ne: संयुक्त अरब इमिरेट्स
+    nl: Verenigde Arabische Emiraten
+    nn: Dei sameinte arabiske emirata
+    "no": De forente arabiske emirater
+    nv: Ásáí Bikéyah Yázhí Ałhidadiidzooígíí
+    oc: Emirats Arabis Units
+    or: ୟୁନାଇଟେଡ଼ ଆରବ ଏମିରଟ
+    os: Араббы Иугонд Эмираттæ
+    pa: ਸੰਯੁਕਤ ਅਰਬ ਇਮਰਾਤ
+    pl: Emiraty Arabskie
+    ps: عربي متحده امارات
+    pt: Emirados Árabes Unidos
+    qu: Hukllachasqa Arab Imiratukuna
+    ro: Emiratele Arabe Unite
+    ru: Объединённые Арабские Эмираты
+    rw: Nyarabu Zunze Ubumwe
+    sd: گڏيل عرب امارات
+    se: Ovttastuvvan arábaemiráhtat
+    sh: Ujedinjeni Arapski Emirati
+    sk: Spojené arabské emiráty
+    sl: Združeni arabski emirati
+    so: Imaaraatka Carabta
+    sq: Emiratet e Bashkuara Arabe
+    sr: Уједињени Арапски Емирати
+    ss: Bunye bema-Arabhu
+    su: Uni Émirat Arab
+    sv: Förenade Arabemiraten
+    sw: Falme za Kiarabu
+    ta: ஐக்கிய அரபு அமீரகம்
+    te: యునైటెడ్ అరబ్ ఎమిరేట్స్
+    tg: Аморати Муттаҳидаи Араб
+    th: สหรัฐอาหรับเอมิเรตส์
+    tk: Birleşen Arap Emirlikleri
+    tl: United Arab Emirates
+    tr: Birleşik Arap Emirlikleri
+    tt: Берләшкән Гарәп Әмирлекләре
+    ug: ئەرەب بىرلەشمە خەلىپىلىكى
+    uk: Об'єднані Арабські Емірати
+    ur: متحدہ عرب امارات
+    uz: Birlashgan Arab Amirliklari
+    vi: Các Tiểu vương quốc Ả Rập Thống nhất
+    vo: Lemiräns Larabik Pebalöl
+    wo: Imaaraat yu Araab yu Bennoo yi
+    yi: פאראייניגטע אראבישע עמיראטן
+    yo: Àwọn Ẹ́mírétì Árábù Aṣọ̀kan
+    zh: 阿拉伯联合酋长国
diff --git a/settings/country-names/af.yaml b/settings/country-names/af.yaml
new file mode 100644 (file)
index 0000000..2f233de
--- /dev/null
@@ -0,0 +1,155 @@
+name: 
+    default: افغانستان
+    af: Afghanistan
+    ak: Afganistan
+    am: አፍጋኒስታን
+    an: Afganistán
+    ar: أفغانستان
+    as: আফগানিস্তান
+    az: Əfqanıstan
+    ba: Афғанстан
+    be: Афганістан
+    bg: Афганистан
+    bh: अफ़ग़ानिस्तान
+    bm: Afiganistaŋ
+    bn: আফগানিস্তান
+    bo: ཨ་ཧྥུའུ་རྒན་སི་ཐན།
+    br: Afghanistan
+    bs: Afganistan
+    ca: Afganistan
+    ce: АфгIанистан
+    ch: Afghanistan
+    co: Afghanistan
+    cs: Afghánistán
+    cv: Афганистан
+    cy: Affganistan
+    da: Afghanistan
+    de: Afghanistan
+    dv: އަފްޣާނިސްތާން
+    dz: ཨཕ་ག་ནིསི་ཏཱན་
+    ee: Afghanistan nutome
+    el: Αφγανιστάν
+    en: Afghanistan
+    eo: Afganio
+    es: Afganistán
+    et: Afganistan
+    eu: Afganistan
+    fa: افغانستان
+    ff: Afganistaan
+    fi: Afganistan
+    fo: Afghanistan
+    fr: Afghanistan
+    fy: Afganistan
+    ga: An Afganastáin
+    gd: Afganastan
+    gl: Afganistán - افغانستان
+    gn: Ahyganitã
+    gu: અફઘાનિસ્તાન
+    gv: Yn Afghanistaan
+    ha: Afghanistan
+    he: אפגניסטן
+    hi: अफ़्गानिस्तान
+    hr: Afganistan
+    ht: Afganistan
+    hu: Afganisztán
+    hy: Աֆղանստան
+    ia: Afghanistan
+    id: Afganistan
+    ie: Afghanistan
+    io: Afganistan
+    is: Afganistan
+    it: Afghanistan
+    iu: ᐊᑉᒐᓂᔅᑕᓐ
+    ja: アフガニスタン
+    jv: Afganistan
+    ka: ავღანეთი
+    kg: Afghanistan
+    ki: Afghanistan
+    kk: Ауғанстан
+    kl: Afghanistan
+    km: សាធារណរដ្ឋឥស្លាមអាហ្វហ្កានីស្ថាន
+    kn: ಅಫ್ಘಾನಿಸ್ತಾನ
+    ko: 아프가니스탄
+    ks: اَفغانَستان
+    ku: Afxanistan
+    kv: Афганистан
+    kw: Afghanistan
+    ky: Ооганстан
+    la: Afgania
+    lb: Afghanistan
+    lg: Afaganisitani
+    li: Afghanistan
+    ln: Afganistáni
+    lo: ອັບການິສະຖານ
+    lt: Afganistanas
+    lv: Afganistāna
+    mg: Afganistana
+    mi: Āwhekenetāna
+    mk: Авганистан
+    ml: അഫ്ഗാനിസ്താൻ
+    mn: Афганистан
+    mo: Афганистан
+    mr: अफगाणिस्तान
+    ms: Afghanistan
+    mt: Afganistan
+    my: အာဖဂန်နစ္စတန်နိုင်ငံ
+    na: Apeganitan
+    ne: अफगानिस्तान
+    nl: Afghanistan
+    nn: Afghanistan
+    "no": Afghanistan
+    oc: Afganistan
+    om: Afgaanistaan
+    or: ଆଫଗାନିସ୍ତାନ
+    os: Афгъанистан
+    pa: ਅਫ਼ਗ਼ਾਨਿਸਤਾਨ
+    pi: अफगानस्थान
+    pl: Afganistan
+    ps: افغانستان
+    pt: Afeganistão
+    qu: Afgansuyu
+    rm: Afganistan
+    rn: Afuganisitani
+    ro: Afganistan
+    ru: Афганистан
+    rw: Afuganisitani
+    sa: अफगानस्थान
+    sc: Afganistàn
+    sd: افغانستان
+    se: Afganistána
+    sg: Faganïta, Afganïstäan
+    sh: Afganistan
+    si: ඇෆ්ගනිස්ථානය
+    sk: Afganistan
+    sl: Afganistan
+    sm: Afakanisitana
+    sn: Afghanistan
+    so: Afgaanistan
+    sq: Afganistani
+    sr: Авганистан
+    ss: I-Afugani
+    su: Apganistan
+    sv: Afghanistan
+    sw: Afghanistan
+    ta: ஆப்கானித்தான்
+    te: ఆఫ్ఘనిస్తాన్
+    tg: Афғонистон
+    th: ประเทศอัฟกานิสถาน
+    ti: አፍጋኒስታን
+    tk: Owganystan
+    tl: Apganistan
+    to: ʻAfukanisitani
+    tr: Afganistan
+    tt: Әфганстан
+    ug: ئافغانىستان
+    uk: Афганістан
+    ur: افغانستان
+    uz: Afgʻoniston
+    vi: Afghanistan
+    vo: Lafganistän
+    wo: Afganistaan
+    yi: אפגאניסטאן
+    yo: Afghanístàn
+    za: Afghanistan
+    zh: 阿富汗
+    zu: I-Afganistani
diff --git a/settings/country-names/ag.yaml b/settings/country-names/ag.yaml
new file mode 100644 (file)
index 0000000..1035946
--- /dev/null
@@ -0,0 +1,141 @@
+name: 
+    default: Antigua and Barbuda
+    af: Antigua en Barbuda
+    ak: Antigua ne Baabuda
+    am: አንቲጋ እና ባርቡዳ
+    an: Antigua y Barbuda
+    ar: أنتيغوا وباربودا
+    as: এণ্টিগুৱা আৰু বাৰ্বুডা
+    ay: Antiwa wan Barbuda
+    az: Antiqua və Barbuda
+    ba: Антигуа һәм Барбуда
+    be: Антыгуа́ і Барбу́да
+    bg: Антигуа и Барбуда
+    bm: Antiga-ni-Barbuda
+    bn: অ্যান্টিগুয়া ও বার্বুডা
+    bo: ཨེན་ཊི་གུའ་དང་བར་བུ་ཌ།
+    br: Antigua ha Barbuda
+    bs: Antigva i Barbuda
+    ca: Antigua i Barbuda
+    ce: Анти́гуа а Барбу́да
+    cs: Antigua a Barbuda
+    cy: Antigwa a Barbiwda
+    da: Antigua og Barbuda
+    de: Antigua und Barbuda
+    dv: އެންޓިގުއާ އަދި ބާބިއުޑާ
+    dz: ཨན་ཊི་གུ་ཝ་ ཨེནཌ་ བྷར་བྷུ་ཌ
+    ee: Antigua and Barbuda
+    el: Αντίγκουα και Μπαρμπούντα
+    en: Antigua and Barbuda
+    eo: Antigvo-Barbudo
+    es: Antigua y Barbuda
+    et: Antigua ja Barbuda
+    eu: Antigua eta Barbuda
+    fa: آنتیگوا و باربودا
+    ff: Antiguwaa e Barbudaa
+    fi: Antigua ja Barbuda
+    fo: Antigua og Barbuda
+    fr: Antigua-et-Barbuda
+    fy: Antigûa en Barbûda
+    ga: Antigua agus Barbúda
+    gd: Antigua agus Barbuda
+    gl: Antiga e Barbuda
+    gn: Antigua ha Barbuda
+    gu: એન્ટીગુઆ અને બરબુડા
+    gv: Antigua as Barbuda
+    ha: Antigwa da Barbuba
+    he: אנטיגואה וברבודה
+    hi: अण्टीगुआ और बारबूडा
+    hr: Antigva i Barbuda
+    ht: Antigwa ak Babouda
+    hu: Antigua és Barbuda
+    hy: Անտիգուա և Բարբուդա
+    ia: Antigua e Barbuda
+    id: Antigua dan Barbuda
+    ie: Antigua e Barbuda
+    io: Antigua e Barbuda
+    is: Antígva og Barbúda
+    it: Antigua e Barbuda
+    ja: アンティグア・バーブーダ
+    jv: Antigua lan Barbuda
+    ka: ანტიგუა და ბარბუდა
+    ki: Antigua na Barbuda
+    kk: Антигуа және Барбуда
+    kl: Antigua aamma Barbuda
+    km: អង់ទីគ័រ និង​បាបុយដា
+    kn: ಆಂಟಿಗುವ ಮತ್ತು ಬಾರ್ಬುಡ
+    ko: 앤티가 바부다
+    ks: اٮ۪نٹِگُوا تہٕ باربوڑا
+    ku: Antîgua û Berbûda
+    kw: Antiga ha Barbuda
+    ky: Антигуа жана Барбуда
+    la: Antiqua et Barbuda
+    lb: Antigua a Barbuda
+    lg: Antigwa ne Barabuda
+    li: Antigua en Barbuda
+    ln: Antigua mpé Barbuda
+    lo: ແອນຕີກາວ ແລະ ບາບູດາ
+    lt: Antigva ir Barbuda
+    lv: Antigva un Barbuda
+    mg: Antigua sy Barbuda
+    mk: Антигва и Барбуда
+    ml: ആന്റിഗ്വയ ആന്റ് ബാർബൂഡ
+    mn: Антигуа ба Барбуда
+    mr: अँटिगा आणि बार्बुडा
+    ms: Antigua dan Barbuda
+    mt: Antigwa u Barbuda
+    my: အင်တီဂွါနှင့် ဘာဘူဒါ
+    na: Antigua me Barbuda
+    nb: Antigua og Barbuda
+    ne: एन्टिगुआ र बर्बुडा
+    nl: Antigua en Barbuda
+    nn: Antigua og Barbuda
+    "no": Antigua og Barbuda
+    nv: Antíígwa dóó Hashkʼaan Bikéyah Yázhí
+    oc: Antigua e Barbuda
+    om: Antiiguwaa fi Baarbuudaa
+    or: ଆଣ୍ଟିଗୁଆ ଓ ବରବୁଡା
+    os: Антигуæ æмæ Барбудæ
+    pa: ਐਂਟੀਗੁਆ ਅਤੇ ਬਰਬੂਡਾ
+    pl: Antigua i Barbuda
+    pt: Antígua e Barbuda
+    qu: Antiwa Barbudawan
+    rm: Antigua e Barbuda
+    ro: Antigua și Barbuda
+    ru: Антигуа и Барбуда
+    rw: Antigwa na Baribuda
+    sa: अण्टीग्वा
+    sc: Antigua e Barbuda
+    se: Antigua ja Barbuda
+    sh: Antigva i Barbuda
+    si: ඇන්ටිගුවා සහ බාබියුඩා
+    sk: Antigua a Barbuda
+    sl: Antigva in Barbuda
+    sn: Antigua and Barbuda
+    so: Antigua iyo Barbuda
+    sq: Antigua dhe Barbuda
+    sr: Антигва и Барбуда
+    ss: iBhabudi ne Anithikhu
+    su: Antigua jeung Barbuda
+    sv: Antigua och Barbuda
+    sw: Antigua na Barbuda
+    ta: அன்டிகுவா பர்புடா
+    te: ఆంటిగ్వా మరియు బార్బుడా
+    tg: Антигуаю Барбуда
+    th: แอนติกาและบาร์บูดา
+    ti: አንቲጓ እና ባሩዳ
+    tl: Antigua at Barbuda
+    to: Anitikua mo Palaputa
+    tr: Antigua ve Barbuda
+    tt: Анти́гуа һәм Барбу́да
+    ug: ئانتىگۇئا ۋە باربۇدا
+    uk: Анти́гуа і Барбу́да
+    ur: اینٹیگوا و باربوڈا
+    uz: Antigua va Barbuda
+    vi: Antigua và Barbuda
+    vo: Lantigeän e Barbudeän
+    wo: Antigua ak Barbuda
+    yo: Ántígúà àti Bàrbúdà
+    za: Antigua caeuq Barbuda
+    zh: 安提瓜和巴布达
+    zu: i-Antigua and Barbuda
diff --git a/settings/country-names/ai.yaml b/settings/country-names/ai.yaml
new file mode 100644 (file)
index 0000000..32fa3d3
--- /dev/null
@@ -0,0 +1,81 @@
+name: 
+    default: Anguilla
+    af: Anguilla
+    an: Anguila
+    ar: أنجويلا
+    az: Angilya
+    ba: Ангилья
+    be: Ангілья
+    bg: Ангуила
+    br: Anguilla
+    bs: Angvila
+    ca: Anguilla
+    cs: Anguilla
+    cy: Anguilla
+    da: Anguilla
+    de: Anguilla
+    dv: އަންގީލާ
+    el: Ανγκουίλα
+    en: Anguilla
+    eo: Angvilo
+    es: Anguila
+    et: Anguilla
+    eu: Aingira
+    fa: آنگویلا
+    fi: Anguilla
+    fr: Anguilla
+    ga: Angaíle
+    gl: Anguila
+    he: אנגווילה
+    hi: अंगुइला
+    hr: Angvila
+    hu: Anguilla
+    hy: Անգիլիա
+    id: Anguilla
+    io: Anguila
+    is: Angvilla
+    it: Anguilla
+    ja: アンギラ
+    jv: Anguilla
+    ka: ანგილია
+    ko: 앵귈라
+    kw: Angwilla
+    lb: Anguilla
+    li: Anguilla
+    lt: Angilija
+    lv: Angilja
+    mk: Ангвила
+    mn: Ангилья
+    mr: अँग्विला
+    ms: Anguilla
+    ne: एन्गुला
+    nl: Anguilla
+    nn: Anguilla
+    "no": Anguilla
+    oc: Anguilla
+    pa: ਐਂਗੁਈਲਾ
+    pl: Anguilla
+    pt: Anguilla
+    ro: Anguilla
+    ru: Ангилья
+    rw: Angwiya
+    sh: Angvila
+    sk: Anguilla
+    sl: Angvila
+    sq: Anguilla
+    sr: Ангвила
+    su: Anguilla
+    sv: Anguilla
+    sw: Anguilla
+    ta: அங்கியுலா
+    th: แองกวิลลา
+    tl: Anggilya
+    tr: Anguilla
+    ug: ئانگۋىللا
+    uk: Ангілья
+    ur: اینگویلا
+    uz: Angilya
+    vi: Anguilla
+    wo: Angila
+    yo: Àngúíllà
+    zh: 安圭拉
diff --git a/settings/country-names/al.yaml b/settings/country-names/al.yaml
new file mode 100644 (file)
index 0000000..bdd6b11
--- /dev/null
@@ -0,0 +1,166 @@
+name: 
+    default: Shqipëria
+    ab: Арнауыҭтәыла
+    af: Albanië
+    ak: Albania
+    am: አልባኒያ
+    an: Albania
+    ar: ألبانيا
+    as: আলবেনিয়া
+    av: Алба́ния
+    ay: Alwaña
+    az: Albaniya
+    ba: Алба́ния
+    be: Алба́нія
+    bg: Албания
+    bh: अल्बानिया
+    bi: Albania
+    bm: Alibani
+    bn: আলবেনিয়া
+    bo: ཨལ་པ་ཉི་ཡ།
+    br: Albania
+    bs: Albanija
+    ca: Albània
+    ce: Алба́ни
+    ch: Albania
+    co: Albania
+    cs: Albánie
+    cu: Алванїꙗ
+    cv: Албани
+    cy: Albania
+    da: Albanien
+    de: Albanien
+    dv: އަލްބޭނިއާ
+    dz: ཨཱལ་བེ་ནི་ཡ
+    ee: Albania
+    el: Αλβανία
+    en: Albania
+    eo: Albanio
+    es: Albania
+    et: Albaania
+    eu: Albania
+    fa: آلبانی
+    ff: Albaniya
+    fi: Albania
+    fo: Albania
+    fr: Albanie
+    fy: Albaanje
+    ga: An Albáin
+    gd: Albàinia
+    gl: Albania
+    gn: Avaña
+    gu: આલ્બેનિયા
+    gv: Yn Albaan
+    ha: Albaniya
+    he: אַלְבַּנְיָה
+    hi: अल्बानिया
+    hr: Albanija
+    ht: Albani
+    hu: Albánia
+    hy: Ալբանիա
+    ia: Albania
+    id: Albania
+    ie: Albania
+    ig: Albania
+    io: Albania
+    is: Albanía
+    it: Albania
+    iu: ᐊᓪᐹᓂᐊ
+    ja: アルバニア
+    jv: Albania
+    ka: ალბანეთი
+    kg: Albania
+    ki: Arũmbĩnia
+    kk: Албания
+    kl: Albania
+    km: អាល់បានី
+    kn: ಅಲ್ಬೇನಿಯ
+    ko: 알바니아
+    ks: اٮ۪لبانِیا
+    ku: Albanya
+    kv: Албания
+    kw: Albani
+    ky: Албания
+    la: Albania
+    lb: Albanien
+    lg: Alibaniya
+    li: Albanië
+    ln: Albania
+    lo: ແອລເບເນຍ
+    lt: Albanija
+    lv: Albānija
+    mg: Albania
+    mi: Arapeinia
+    mk: Албанија
+    ml: അൽബേനിയ
+    mn: Албани
+    mr: आल्बेनिया
+    ms: Albania
+    mt: Albanija
+    my: အယ်လ်ဘေးနီးယား၏
+    na: Arbainiya
+    ne: अल्बानिया
+    nl: Albanië
+    nn: Albania
+    "no": Albania
+    nv: Dziłigaii Bikéyah
+    oc: Albania
+    om: Albeeniyaa
+    or: ଆଲବାନିଆ
+    os: Албани
+    pa: ਅਲਬਾਨੀਆ
+    pi: अल्बानिया
+    pl: Albania
+    ps: البانیا
+    pt: Albânia
+    qu: Albanya
+    rm: Albania
+    rn: Alubaniya
+    ro: Albania
+    ru: Албания
+    rw: Alubaniya
+    sa: अल्बेनिया
+    sc: Albania
+    sd: البانيا
+    se: Albánia
+    sg: Albanïi
+    sh: Albanija
+    si: ඇල්බේනියාව
+    sk: Albánsko
+    sl: Albanija
+    sm: Albania
+    sn: Albania
+    so: Albania
+    sq: Shqipëria
+    sr: Албанија
+    ss: I-Alibheniya
+    st: Albania
+    su: Albania
+    sv: Albanien
+    sw: Albania
+    ta: அல்பேனியா
+    te: అల్బేనియా
+    tg: Албания
+    th: ประเทศแอลเบเนีย
+    ti: አልባኒያ
+    tk: Albaniýa
+    tl: Albanya
+    to: ʻAlipania
+    tr: Arnavutluk
+    ts: Albania
+    tt: Албания
+    tw: Albania
+    ty: Arapania
+    ug: ئالبانىيە
+    uk: Алба́нія
+    ur: البانیا
+    uz: Albaniya
+    vi: Albania
+    vo: Lalbanän
+    wa: Albaneye
+    wo: Albaani
+    yi: אלבאניע
+    yo: Albáníà
+    za: Albania
+    zh: 阿爾巴尼亞
+    zu: I-Albaniya
diff --git a/settings/country-names/am.yaml b/settings/country-names/am.yaml
new file mode 100644 (file)
index 0000000..9a1e968
--- /dev/null
@@ -0,0 +1,162 @@
+name: 
+    default: Հայաստան
+    ab: Ермантәыла
+    af: Armenië
+    ak: Armenia
+    am: አርመኒያ
+    an: Armenia
+    ar: أرمينيا
+    as: আৰ্মেনিয়া
+    av: ЦIамухъ
+    az: Ermənistan
+    ba: Әрмәнстан
+    be: Арме́нія
+    bg: Армения
+    bh: आर्मीनिया
+    bi: Armenia
+    bm: Arimeni
+    bn: আর্মেনিয়া
+    bo: ཨར་མེ་ནི་ཡ།
+    br: Armenia
+    bs: Ermenija
+    ca: Armènia
+    ce: Эрмалойчоь
+    ch: Armenia
+    co: Armenia
+    cs: Arménie
+    cu: Армєні́ꙗ
+    cv: Эрмени
+    cy: Armenia
+    da: Armenien
+    de: Armenien
+    dv: އަރުމީނިއާ
+    dz: ཨར་མི་ནི་ཡ
+    ee: Armenia
+    el: Αρμενία
+    en: Armenia
+    eo: Armenio
+    es: Armenia
+    et: Armeenia
+    eu: Armenia
+    fa: ارمنستان
+    ff: Armaaniya
+    fi: Armenia
+    fo: Armenia
+    fr: Arménie
+    fy: Armeenje
+    ga: An Airméin
+    gd: Airmeinia
+    gl: Armenia
+    gn: Aymenia
+    gu: આર્મેનિયા
+    gv: Armeain
+    ha: Armeniya
+    he: אַרְמֶנְיָה
+    hi: आर्मीनिया
+    hr: Armenija
+    ht: Ameni
+    hu: Örményország
+    hy: Հայաստան
+    ia: Armenia
+    id: Armenia
+    ie: Armenia
+    io: Armenia
+    is: Armenía
+    it: Armenia
+    ja: アルメニア
+    jv: Armènia
+    ka: სომხეთი
+    kg: Armenia
+    ki: Armenia
+    kk: Армения
+    kl: Armenia
+    km: អាមេនី
+    kn: ಆರ್ಮೇನಿಯ
+    ko: 아르메니아
+    ks: اَرمانِیا
+    ku: Ermenistan
+    kv: Армения
+    kw: Armeni
+    ky: Армения
+    la: Armenia
+    lb: Armenien
+    lg: Arameniya
+    li: Armenië
+    ln: Armeni
+    lo: ປະເທດອາກເມນີ
+    lt: Armėnija
+    lv: Armēnija
+    mg: Armenia
+    mi: Āmenia
+    mk: Ерменија
+    ml: അർമേനിയ
+    mn: Армен
+    mo: Армения
+    mr: आर्मेनिया
+    ms: Armenia
+    mt: Armenja
+    my: အာမေးနီးယားနိုင်ငံ
+    na: Arminiya
+    ne: आर्मेनिया
+    nl: Armenië
+    nn: Armenia
+    "no": Armenia
+    nv: Aooméénii Bikéyah
+    oc: Armenia
+    om: Armeeniyaa
+    or: ଆର୍ମେନିଆ
+    os: Сомихыстон
+    pa: ਅਰਮੀਨੀਆ
+    pi: आर्मीनिया
+    pl: Armenia
+    ps: ارمنستان
+    pt: Arménia
+    qu: Arminya
+    rm: Armenia
+    rn: Arumeniya
+    ro: Armenia
+    ru: Армения
+    rw: Arumeniya
+    sa: आर्मीनिया
+    sc: Armènia
+    sd: آرمينيا
+    se: Armenia
+    sg: Armenïi
+    sh: Jermenija
+    si: ආර්මේනියාව
+    sk: Arménsko
+    sl: Armenija
+    sm: Amenia
+    sn: Armenia
+    so: Armania
+    sq: Armenia
+    sr: Јерменија
+    ss: iArimeniya
+    su: Arménia
+    sv: Armenien
+    sw: Armenia
+    ta: ஆர்மீனியா
+    te: ఆర్మేనియా
+    tg: Арманистон
+    th: อาร์มีเนีย
+    ti: አርሜኒያ
+    tk: Ermenistan
+    tl: Armenya
+    to: ʻĀminia
+    tr: Ermenistan
+    ts: Armenia
+    tt: Әрмәнстан
+    tw: Aminia
+    ty: Āmenia
+    ug: ئەرمېنىيە
+    uk: Вірме́нія
+    ur: آرمینیا
+    uz: Armaniston
+    vi: Armenia
+    vo: Larmeniyän
+    wo: Armeeni
+    yi: אַרמעניע
+    yo: Arméníà
+    za: Armenia
+    zh: 亞美尼亞
+    zu: i-Armenia
diff --git a/settings/country-names/an.yaml b/settings/country-names/an.yaml
new file mode 100644 (file)
index 0000000..3ab1b23
--- /dev/null
@@ -0,0 +1,71 @@
+name: 
+    default: De Nederlandse Antillen
+    af: Nederlandse Antille
+    an: Antillas Neerlandesas
+    ar: جزر الأنتيل
+    be: Нідэрландскія Антылы
+    bg: Холандски Антили
+    br: Antilhez Nederlandat
+    bs: Holandski Antili
+    ca: Antilles Neerlandeses
+    cs: Nizozemské Antily
+    cy: Antilles yr Iseldiroedd
+    da: Nederlandske Antiller
+    de: Niederländische Antillen
+    dv: ނެދަލޭންޑު އެންޓިލޭ
+    el: Ολλανδικές Αντίλλες
+    en: Netherlands Antilles
+    eo: Nederlandaj Antiloj
+    es: Antillas Neerlandesas;Antillas Holandesas;Indias Occidentales Holandesas
+    et: Hollandi Antillid
+    eu: Holandarren Antillak
+    fa: آنتیل هلند
+    fi: Alankomaiden Antillit
+    fo: Niðurlendsku Antillurnar
+    fr: Antilles néerlandaises
+    fy: Nederlânske Antillen
+    ga: Aintillí na hÍsiltíre
+    gl: Antillas Neerlandesas
+    he: האנטילים ההולנדיים
+    hi: नीदरलैंड एंटीलीज़
+    hr: Nizozemski Antili
+    hu: Holland Antillák
+    ia: Antillas Nederlandese
+    id: Antillen Belanda
+    io: Nederlandana Antili
+    is: Hollensku Antillaeyjar
+    it: Antille Olandesi
+    ja: オランダ領アンティル
+    jv: Antillen Walanda
+    ka: ნიდერლანდის ანტილები
+    kk: Антийлер
+    ko: 네덜란드령 안틸레스
+    kw: Antillys Iseldiryek
+    la: Antillae Nederlandiae
+    lb: Hollännesch Antillen
+    li: Nederlandse Antille
+    ln: Antiya ya Holanda
+    lt: Nyderlandų Antilai
+    lv: Antiļas
+    mn: Нидерландын Антиллийн Арлууд
+    mr: नेदरलँड्स अँटिल्स
+    ms: Antillen Belanda
+    nn: Dei nederlandske Antillane
+    "no": De nederlandske Antillene
+    pl: Antyle Holenderskie
+    pt: Antilhas Holandesas
+    ro: Antilele Olandeze
+    ru: Нидерландские Антилы
+    sh: Nizozemski Antili
+    sk: Holandské Antily
+    sl: Nizozemski Antili
+    sr: Холандски Антили
+    sv: Nederländska Antillerna
+    sw: Antili za Kiholanzi
+    ta: நெதர்லாந்து அண்டிலிசு
+    tg: Антил Ҳоланд
+    th: เนเธอร์แลนด์แอนทิลลิส
+    tr: Hollanda Antilleri
+    uk: Нідерландські Антильські острови
+    vi: Antille thuộc Hà Lan
+    zh: 荷属安的列斯
diff --git a/settings/country-names/ao.yaml b/settings/country-names/ao.yaml
new file mode 100644 (file)
index 0000000..813e88e
--- /dev/null
@@ -0,0 +1,150 @@
+name: 
+    default: Angola
+    af: Angola
+    am: አንጎላ
+    an: Angola
+    ar: أنغولا
+    az: Anqola
+    ba: Анго́ла
+    be: Анго́ла
+    bg: Ангола
+    bh: अंगोला
+    bm: Angola
+    bn: অ্যাঙ্গোলা
+    bo: ཨང་གོ་ལ།
+    br: Angola
+    bs: Angola
+    ca: Angola
+    ce: Анго́ла
+    co: Angola
+    cs: Angola
+    cv: Ангола
+    cy: Angola
+    da: Angola
+    de: Angola
+    dv: އެންގޯލާ
+    dz: ཨང་གྷོ་ལ
+    ee: Aŋgola
+    el: Ανγκόλα
+    en: Angola
+    eo: Angolo
+    es: Angola
+    et: Angola
+    eu: Angola
+    fa: آنگولا
+    ff: Anngolaa
+    fi: Angola
+    fo: Angola
+    fr: Angola
+    fy: Angoala
+    ga: Angóla
+    gd: Angola
+    gl: Angola
+    gn: Angola
+    gu: અંગોલા
+    gv: Angoley
+    ha: Angola
+    he: אנגולה
+    hi: अंगोला
+    hr: Angola
+    ht: Angola
+    hu: Angola
+    hy: Անգոլա
+    ia: Angola
+    id: Angola
+    ie: Angola
+    ig: Angola
+    io: Angola
+    is: Angóla
+    it: Angola
+    ja: アンゴラ
+    jv: Angola
+    ka: ანგოლა
+    kg: Ngola
+    ki: Angola
+    kk: Ангола
+    km: អង់ហ្គោឡា
+    kn: ಅಂಗೋಲ
+    ko: 앙골라
+    ks: اینٛگولا
+    ku: Angola
+    kw: Angola
+    ky: Ангола
+    la: Angolia
+    lb: Angola
+    lg: Angola
+    li: Angola
+    ln: Angola
+    lo: ອັງໂກລາ
+    lt: Angola
+    lv: Angola
+    mg: Angola
+    mi: Anakora
+    mk: Ангола
+    ml: അംഗോള
+    mn: Ангол
+    mr: अँगोला
+    ms: Angola
+    mt: Angola
+    my: အင်ဂိုလာနိုင်ငံ
+    na: Angora
+    ne: अंगोला
+    nl: Angola
+    nn: Angola
+    "no": Angola
+    nv: Angóola
+    ny: Angola
+    oc: Angòla
+    om: Angoolaa
+    or: ଆଙ୍ଗୋଲା
+    os: Анголæ
+    pa: ਅੰਗੋਲਾ
+    pi: अंगोला
+    pl: Angola
+    ps: آنګولا
+    pt: Angola
+    qu: Angula
+    rm: Angola
+    ro: Angola
+    ru: Ангола
+    rw: Angola
+    sa: अङ्गोला
+    sc: Angola
+    se: Angola
+    sg: Angoläa
+    sh: Angola
+    si: ඇන්ගෝලාව
+    sk: Angola
+    sl: Angola
+    sn: Angola
+    so: Angola
+    sq: Angola
+    sr: Ангола
+    ss: I-Angola
+    st: Angola
+    su: Angola
+    sv: Angola
+    sw: Angola
+    ta: அங்கோலா
+    te: అంగోలా
+    tg: Ангола
+    th: ประเทศแองโกลา
+    ti: ኣንጎላ
+    tk: Angola
+    tl: Anggola
+    to: ʻEnikola
+    tr: Angola
+    ts: Angola
+    tt: Анго́ла
+    ug: ئانگولا
+    uk: Анґо́ла
+    ur: انگولہ
+    uz: Angola
+    vi: Angola
+    vo: Langolän
+    wo: Angolaa
+    yi: אַנגאלאַ
+    yo: Àngólà
+    za: Angola
+    zh: 安哥拉
+    zu: I-Angola
diff --git a/settings/country-names/aq.yaml b/settings/country-names/aq.yaml
new file mode 100644 (file)
index 0000000..eb310e3
--- /dev/null
@@ -0,0 +1,2 @@
+name: 
+    default: Antarctica
diff --git a/settings/country-names/ar.yaml b/settings/country-names/ar.yaml
new file mode 100644 (file)
index 0000000..3054ff5
--- /dev/null
@@ -0,0 +1,161 @@
+name: 
+    default: Argentina
+    af: Argentinië
+    ak: Agyɛntina
+    am: አርጀንቲና
+    an: Archentina
+    ar: الأرجنتين
+    as: আৰ্জেণ্টিনা
+    av: Аргентина
+    ay: Arxintina
+    az: Argentina
+    ba: Аргенти́на
+    be: Аргенці́на
+    bg: Аржентѝна
+    bh: अर्जेन्टीना
+    bi: Argentina
+    bm: Argentina
+    bn: আর্জেন্টিনা
+    bo: ཨར་ཇེན་ཊི་ན།
+    br: Arc'hantina
+    bs: Argentina
+    ca: Argentina
+    ce: Аргенти́на
+    ch: Argentina
+    co: Argentina
+    cs: Argentina
+    cv: Аргентина
+    cy: Ariannin
+    da: Argentina
+    de: Argentinien
+    dv: އާޖެންޓީނާ
+    dz: ཨར་ཇེན་ཊི་ན
+    ee: Argentina
+    el: Αργεντινή
+    en: Argentina
+    eo: Argentino
+    es: Argentina
+    et: Argentina
+    eu: Argentina
+    fa: آرژانتین
+    ff: Arjantiin
+    fi: Argentiina
+    fj: Argentina
+    fo: Argentina
+    fr: Argentine
+    fy: Argentynje
+    ga: an Airgintín
+    gd: Argentina
+    gl: Arxentina
+    gn: Argentina
+    gu: આર્જેન્ટીના
+    gv: yn Argenteen
+    ha: Argentina
+    he: ארגנטינה
+    hi: अर्जेण्टीना
+    hr: Argentina
+    ht: Ajantin
+    hu: Argentína
+    hy: Արգենտինա
+    ia: Argentina
+    id: Argentina
+    ie: Argentina
+    ig: Argentina
+    io: Arjentinia
+    is: Argentína
+    it: Argentina
+    ja: アルゼンチン
+    jv: Argèntina
+    ka: არგენტინა
+    kg: Arhentina
+    ki: Argentina
+    kk: Аргентина
+    kl: Argentina
+    km: អាហ្សង់ទីន
+    kn: ಅರ್ಜೆಂಟೀನ
+    ko: 아르헨티나
+    ks: أرجَنٹینا
+    ku: Arjentîn
+    kv: Аргентина
+    kw: Arghantina
+    ky: Аргентина
+    la: Argentina
+    lb: Argentinien
+    lg: Arigentina
+    li: Argentinië
+    ln: Argentina
+    lo: ອາກຊັງຕີນ
+    lt: Argentina
+    lv: Argentīna
+    mg: Arjentina
+    mi: Āketina
+    mk: Аргентина
+    ml: അർജന്റീന
+    mn: Аргентин
+    mr: आर्जेन्टिना
+    ms: Argentina
+    mt: Arġentina
+    my: အာဂျင်တီးနားနိုင်ငံ
+    na: Ardjentina
+    ne: अर्जेन्टिना
+    nl: Argentinië
+    nn: Argentina
+    "no": Argentina
+    nv: Béésh Łigaii Bikéyah
+    oc: Argentina
+    om: Arjentiinaa
+    or: ଆର୍ଜେଣ୍ଟିନା
+    os: Аргентинæ
+    pa: ਅਰਜਨਟੀਨਾ
+    pi: अर्जन्टीना
+    pl: Argentyna
+    ps: ارجنټاین
+    pt: Argentina
+    qu: Arhintina
+    rm: Argentinia
+    rn: Argentine
+    ro: Argentina
+    ru: Аргентина
+    rw: Arijantine
+    sa: अर्जण्टिना
+    sc: Argentina
+    se: Argentiinná
+    sg: Arzantîna
+    sh: Argentina
+    si: ආජන්ටිනාව
+    sk: Argentína
+    sl: Argentina
+    sm: Atenitina
+    sn: Argentina
+    so: Arjantiina
+    sq: Argjentina
+    sr: Аргентина
+    su: Argéntina
+    sv: Argentina
+    sw: Argentina
+    ta: அர்கெந்தீனா
+    te: అర్జెంటీనా
+    tg: Аргенти́на
+    th: อาร์เจนตินา
+    ti: አርጀንቲና
+    tk: Argentina
+    tl: Arhentina
+    to: ʻAsenitina
+    tr: Arjantin
+    ts: Arjentina
+    tt: Аргенти́на
+    tw: Argentina
+    ty: ’Atetina
+    ug: ئارگېنتىنا
+    uk: Аргенти́на
+    ur: ارجنٹائن
+    uz: Argentina
+    vi: Argentina
+    vo: Largäntän
+    wa: Årdjintene
+    wo: Arsantin
+    yi: אַרגענטינע
+    yo: Argẹntínà
+    za: Argentina
+    zh: 阿根廷
+    zu: i-Argentina
diff --git a/settings/country-names/as.yaml b/settings/country-names/as.yaml
new file mode 100644 (file)
index 0000000..fabf618
--- /dev/null
@@ -0,0 +1,2 @@
+name: 
+    default: American Samoa
diff --git a/settings/country-names/at.yaml b/settings/country-names/at.yaml
new file mode 100644 (file)
index 0000000..3b50922
--- /dev/null
@@ -0,0 +1,155 @@
+name: 
+    default: Österreich
+    ab: Австриа
+    af: Oostenryk
+    ak: Austria
+    am: ኦስትሪያ
+    an: Austria
+    ar: النمسا
+    as: অষ্ট্ৰিয়া
+    av: Авустур
+    ay: Austriya
+    az: Avstriya
+    ba: Австрия
+    be: Аўстрыя
+    bg: Австрия
+    bh: ऑस्ट्रिया
+    bi: Austria
+    bn: অস্ট্রিয়া
+    bo: ཨོ་སི་ཐྲི་ཡ།
+    br: Aostria
+    bs: Austrija
+    ca: Àustria
+    ce: Австри
+    ch: Austria
+    co: Austria
+    cs: Rakousko
+    cu: Аѵстрїꙗ
+    cv: Австри
+    cy: Awstria
+    da: Østrig
+    de: Österreich
+    dv: އޮސްޓްރިއާ
+    dz: ཨས་ཊི་ཡ
+    ee: Austria
+    el: Αυστρία
+    en: Austria
+    eo: Aŭstrio
+    es: Austria
+    et: Austria
+    eu: Austria
+    fa: اتریش
+    ff: Otiris
+    fi: Itävalta
+    fo: Eysturríki
+    fr: Autriche
+    fy: Eastenryk
+    ga: An Ostair
+    gd: An Ostair
+    gl: Austria
+    gn: Auteria
+    gu: ઑસ્ટ્રિયા
+    gv: Yn Austeyr
+    ha: Austriya
+    he: אוסטריה
+    hi: ऑस्ट्रिया
+    hr: Austrija
+    ht: Otrich
+    hu: Ausztria
+    hy: Ավստրիա
+    ia: Austria
+    id: Austria
+    ie: Austria
+    ig: Austria
+    io: Austria
+    is: Austurríki
+    it: Austria
+    ja: オーストリア
+    jv: Austria
+    ka: ავსტრია
+    kg: Autriche
+    kk: Аустрия Республикасы
+    kl: Østrigi
+    kn: ಆಸ್ಟ್ರಿಯ
+    ko: 오스트리아
+    ku: Awistriya
+    kv: Австрия
+    kw: Estrych
+    ky: Австрия
+    la: Austria
+    lb: Éisträich
+    li: Oosteriek
+    ln: Otrish
+    lo: ປະເທດໂອຕະລິດ
+    lt: Austrija
+    lv: Austrija
+    mg: Aotrisy
+    mi: Ateria
+    mk: Австрија
+    ml: ഓസ്ട്രിയ
+    mn: Австри
+    mr: ऑस्ट्रिया
+    ms: Austria
+    mt: Awstrija
+    my: သြစတြီးယားနိုင်ငံ
+    na: Oteriya
+    ne: अष्ट्रीया
+    nl: Oostenrijk
+    nn: Austerrike
+    "no": Østerrike
+    nv: Óóswiya
+    oc: Àustria
+    om: Oostiriyaa
+    or: ଅଷ୍ଟ୍ରିଆ
+    os: Австри
+    pa: ਆਸਟਰੀਆ
+    pi: आस्ट्रिया
+    pl: Austria
+    ps: اتريش
+    pt: Áustria
+    qu: Awstiriya
+    rm: Austria
+    ro: Austria
+    ru: Австрия
+    rw: Ositiriya
+    sa: आस्ट्रिया
+    sc: Àustria
+    sd: آسٽريا
+    se: Nuortariika
+    sh: Austrija
+    si: ඔස්ට්රියාව
+    sk: Rakúsko
+    sl: Avstrija
+    sm: Austilia
+    sn: Austria
+    so: Austriya
+    sq: Austria
+    sr: Аустрија
+    ss: IYosithiya
+    st: Austria
+    su: Austria
+    sv: Österrike
+    sw: Austria
+    ta: ஆஸ்திரியா
+    te: ఆస్ట్రియా
+    tg: Утриш
+    th: ประเทศออสเตรีย
+    tk: Awstriýa
+    tl: Austria
+    tr: Avusturya
+    ts: Austria
+    tt: Австрия
+    tw: Austria
+    ug: ئاۋستىرىيە
+    uk: Австрія
+    ur: آسٹریا
+    uz: Avstriya
+    vi: Áo
+    vo: Lösterän
+    wa: Otriche
+    wo: Otris
+    yi: עסטרייך
+    yo: Austríà
+    za: Audeihleih
+    zh: 奧地利
+    zu: I-Ostriya
diff --git a/settings/country-names/au.yaml b/settings/country-names/au.yaml
new file mode 100644 (file)
index 0000000..96e4a4b
--- /dev/null
@@ -0,0 +1,155 @@
+name: 
+    default: Australia
+    ab: Австралиа
+    af: Australië
+    am: አውስትራልያ
+    an: Australia
+    ar: أستراليا
+    as: অষ্ট্ৰেলিয়া
+    ay: Australla
+    az: Avstraliya
+    ba: Австралия
+    be: Аўстра́лія
+    bg: Австралия
+    bh: ऑस्ट्रेलिया
+    bi: Ostrelia
+    bm: Ostralia
+    bn: অস্ট্রেলিয়া
+    bo: ཨོ་སེ་ཐེ་ལི་ཡ།
+    br: Aostralia
+    bs: Australija
+    ca: Austràlia
+    ce: Австра́ли
+    co: Australia
+    cs: Austrálie
+    cu: Аѵстралїꙗ
+    cv: Австрали
+    cy: Awstralia
+    da: Australien
+    de: Australien
+    dv: އޮސްޓަރުލިޔާ
+    dz: ཨས་ཊེཡེ་ལི་ཡ
+    ee: Australia
+    el: Αυστραλία
+    en: Australia
+    eo: Aŭstralio
+    es: Australia
+    et: Austraalia
+    eu: Australia
+    fa: استرالیا
+    fi: Australia
+    fo: Avstralia
+    fr: Australie
+    fy: Austraalje
+    ga: Astráil
+    gd: Astràilia
+    gl: Australia
+    gn: Autaralia
+    gu: ઑસ્ટ્રેલિયા
+    gv: Austrail
+    ha: Asturaliya
+    he: אוסטרליה
+    hi: ऑस्ट्रेलिया
+    hr: Australija
+    ht: Ostrali
+    hu: Ausztrália
+    hy: Ավստրալիա
+    ia: Australia
+    id: Australia
+    ie: Australia
+    ig: Ostraliya
+    io: Australia
+    is: Ástralía
+    it: Australia
+    iu: ᐊᔅᑦᕌᓕᐊ
+    ja: オーストラリア
+    jv: Ostrali
+    ka: ავსტრალია
+    kg: Australia
+    ki: Australia
+    kk: Аустралия
+    kl: Australia
+    km: អូស្ត្រាលី
+    kn: ಆಸ್ಟ್ರೇಲಿಯ
+    ko: 오스트레일리아
+    ku: Awistralya
+    kv: Австралия
+    kw: Ostrali
+    ky: Австралия
+    la: Australia
+    lb: Australien
+    li: Australië
+    lo: ປະເທດອົດສະຕາລີ
+    lt: Australija
+    lv: Austrālija
+    mg: Aostralia
+    mi: Ahitereiria
+    mk: Австралија
+    ml: ഓസ്ട്രേലിയ
+    mn: Австрали
+    mr: ऑस्ट्रेलिया
+    ms: Australia
+    mt: Awstralja
+    my: ဩစတြေးလျနိုင်ငံ
+    na: Otereiriya
+    ne: अष्ट्रेलिया
+    nl: Australië
+    nn: Australia
+    "no": Australia
+    nv: Nahatʼeʼiitsoh Bikéyah
+    oc: Austràlia
+    om: Awustireliyaa
+    or: ଅଷ୍ଟ୍ରେଲିଆ
+    os: Австрали
+    pa: ਆਸਟ੍ਰੇਲੀਆ
+    pi: आस्ट्रेलिया
+    pl: Australia
+    ps: آسټراليا
+    pt: Austrália
+    qu: Awstralya
+    rm: Australia
+    rn: Australiya
+    ro: Australia
+    ru: Австралия
+    rw: Ositaraliya
+    sa: आस्ट्रेलिया
+    sc: Austràlia
+    sd: آسٽريليا
+    se: Australia
+    sg: Ostralïi
+    sh: Australija
+    si: ඕස්ට්‍රේලියාව
+    sk: Austrália
+    sl: Avstralija
+    sm: Ausetalia
+    sn: Australia
+    so: Australia
+    sq: Australia
+    sr: Аустралија
+    su: Australia
+    sv: Australien
+    sw: Australia
+    ta: ஆஸ்திரேலியா
+    te: ఆస్ట్రేలియా
+    tg: Австралия
+    th: ออสเตรเลีย
+    ti: ኣውስትራሊያ
+    tk: Awstraliýa
+    tl: Australya
+    tr: Avustralya
+    tt: Австралия
+    tw: Australia
+    ty: Autereraria
+    ug: ئاۋستىرالىيە
+    uk: Австра́лія
+    ur: آسٹریلیا
+    uz: Avstraliya
+    vi: Úc
+    vo: Laustralän
+    wa: Ostraleye
+    wo: Óstraali
+    yi: אויסטראַליע
+    yo: Austrálíà
+    za: Audaihleihya
+    zh: 澳大利亚
+    zu: I-Ostreliya
diff --git a/settings/country-names/aw.yaml b/settings/country-names/aw.yaml
new file mode 100644 (file)
index 0000000..3746b4d
--- /dev/null
@@ -0,0 +1,2 @@
+name: 
+    default: Aruba
diff --git a/settings/country-names/ax.yaml b/settings/country-names/ax.yaml
new file mode 100644 (file)
index 0000000..eb5c189
--- /dev/null
@@ -0,0 +1,2 @@
+name: 
+    default: Aland Islands
diff --git a/settings/country-names/az.yaml b/settings/country-names/az.yaml
new file mode 100644 (file)
index 0000000..f2cf417
--- /dev/null
@@ -0,0 +1,161 @@
+name: 
+    default: Azərbaycan
+    ab: Азербаиџьан
+    af: Azerbeidjan
+    ak: Azerbaijan
+    am: አዘርባይጃን
+    an: Azerbaichán
+    ar: أذربيجان
+    as: আজেৰবাইজান
+    av: Азарбижан
+    az: Azərbaycan
+    ba: Әзербайжан
+    be: Азербайджа́н
+    bg: Азербайджан
+    bh: अज़रबैजान
+    bi: Azerbaijan
+    bm: Azɛrbayjaŋ
+    bn: আজারবাইজান
+    bo: ཨ་ཛར་བཡི་ཇན།
+    br: Azerbaidjan
+    bs: Azerbejdžan
+    ca: Azerbaidjan
+    ce: Азербайджа́н
+    co: Azerbaighjan
+    cs: Ázerbájdžán
+    cu: Аꙁѣрбаича́нъ
+    cv: Азербайджан
+    cy: Aserbaijan
+    da: Aserbajdsjan
+    de: Aserbaidschan
+    dv: އަޒަރުބައިޖާން
+    dz: ཨཛར་བཡེ་ཇན།
+    ee: Azerbaijan
+    el: Αζερμπαϊτζάν
+    en: Azerbaijan
+    eo: Azerbajĝano
+    es: Azerbaiyán
+    et: Aserbaidžaan
+    eu: Azerbaijan
+    fa: آذربایجان
+    ff: Aserbayjan
+    fi: Azerbaidžan
+    fo: Aserbadsjan
+    fr: Azerbaïdjan
+    fy: Azerbeidzjan
+    ga: an Asarbaiseáin
+    gd: Asarbaideàn
+    gl: Acerbaixán
+    gn: Aservaijã
+    gu: અઝેરબીજાન
+    gv: yn Asserbajaan
+    ha: Azerbaijan
+    he: אָזַרְבַּיְיגָ'ן
+    hi: अज़रबैजान
+    hr: Azerbajdžan
+    ht: Azerbaydjan
+    hu: Azerbajdzsán
+    hy: Ադրբեջան
+    ia: Azerbaidzhan
+    id: Azerbaijan
+    ie: Azerbaidjan
+    io: Azerbaijan
+    is: Aserbaísjan
+    it: Azerbaigian
+    ja: アゼルバイジャン
+    jv: Azerbaijan
+    ka: აზერბაიჯანი
+    kg: Azerbaidjan
+    ki: Azerbaijan
+    kk: Әзірбайжан
+    kl: Aserbajdsjan
+    km: អាស៊ែបៃហ្សង់
+    kn: ಅಜೆರ್ಬೈಜಾನ್
+    ko: 아제르바이잔
+    ks: آزَرباجان
+    ku: Azerbaycan
+    kv: Азербайджа́н
+    kw: Azerbayjan
+    ky: Азербайжан
+    la: Atropatene
+    lb: Aserbaidschan
+    lg: Azerebayijaani
+    li: Azerbaidzjan
+    ln: Azɛrbayzáni
+    lo: ປະເທດອາແຊກບາຍຊັງ
+    lt: Azerbaidžanas
+    lv: Azerbaidžāna
+    mg: Azerbaijana
+    mi: Atepaihānia
+    mk: Азербејџан
+    ml: അസർബെയ്ജാൻ
+    mn: Азербайжан
+    mo: Азербаиӂан
+    mr: अझरबैजान
+    ms: Azerbaijan
+    mt: Ażerbajġan
+    my: အဇာဘိုင်ဂျန်နိုင်ငံ
+    na: Aderbaidjan
+    nb: Aserbajdsjan
+    ne: अजरबैजान
+    nl: Azerbeidzjan
+    nn: Aserbajdsjan
+    "no": Aserbajdsjan
+    nv: Azééwii Bikéyah
+    ny: Azerbaijan
+    oc: Azerbaitjan
+    om: Azarbaajan
+    or: ଆଜରବାଇଜାନ
+    os: Азербайджан
+    pa: ਅਜ਼ਰਬਾਈਜਾਨ
+    pi: अजर्बैजान
+    pl: Azerbejdżan
+    ps: آزربایجان
+    pt: Azerbaijão
+    qu: Asarsuyu
+    rm: Aserbeidschan
+    ro: Azerbaidjan
+    ru: Азербайджан
+    rw: Azeribayijani
+    sa: अजर्बैजान
+    sc: Azerbaigián
+    se: Azerbaižan
+    sg: Zerebaidyäan
+    sh: Azerbejdžan
+    si: අසර්බයිජානය
+    sk: Azerbajdžan
+    sl: Azerbajdžan
+    sm: Azerbaijin
+    sn: Azerbaijan
+    so: Aserbiijaan
+    sq: Azerbajxhani
+    sr: Азербејџан
+    ss: iZebajani
+    su: Azerbaijan
+    sv: Azerbajdzjan
+    sw: Azerbaijan
+    ta: அசர்பைஜான்
+    te: అజర్‌బైజాన్
+    tg: Озарбойҷон
+    th: อาเซอร์ไบจาน
+    ti: አዘርባጃን
+    tk: Azerbaýjan
+    tl: Aserbayan
+    to: ʻAsapaisani
+    tr: Azerbaycan
+    ts: Azerbaijan
+    tt: Азәрбайҗан
+    tw: Azerbaijan
+    ty: Atepaihānia
+    ug: ئەزەربەيجان
+    uk: Азербайджа́н
+    ur: آذربائیجان
+    uz: Ozarbayjon
+    vi: Azerbaijan
+    vo: Lasärbäcän
+    wo: Aserbayjaan
+    yi: אַזערבײַדזשאַן
+    yo: Azerbaijan
+    za: Ahsehbaiqgyangh
+    zh: 阿塞拜疆
+    zu: Azerbaijan
diff --git a/settings/country-names/ba.yaml b/settings/country-names/ba.yaml
new file mode 100644 (file)
index 0000000..bc3c1db
--- /dev/null
@@ -0,0 +1,155 @@
+name: 
+    default: Bosna i Hercegovina / Босна и Херцеговина
+    af: Bosnië en Herzegowina
+    ak: Bosnia and Herzegovina
+    am: ቦስኒያና ሄርጸጎቪና
+    an: Bosnia y Herzegovina
+    ar: البوسنة والهرسك
+    av: Бо́сния ва Герцегови́на
+    az: Bosniya və Herseqovina
+    ba: Босния һәм Герцеговина
+    be: Бо́снія і Герцагаві́на
+    bg: Босна и Херцеговина
+    bh: बोस्निया आ हर्जेगोविना
+    bi: Bosnia mo Herzegovina
+    bm: Bozni-Ɛrizigovini
+    bn: বসনিয়া ও হার্জেগোভিনা
+    bo: བྷོསུ་ནིཡ་དང་ཧར་ཛེ་གྷོ་ཝི་ན།
+    br: Bosnia-ha-Herzegovina
+    bs: Bosna i Hercegovina
+    ca: Bòsnia i Hercegovina
+    ce: Босни а Герцеговина а
+    co: Bosnia è Erzegovina
+    cs: Bosna a Hercegovina
+    cu: Босна́
+    cv: Босни тата Герцеговина
+    cy: Bosnia a Hercegovina
+    da: Bosnien og Hercegovina
+    de: Bosnien und Herzegowina
+    dv: ބޮސްނިޔާ އެންޑް ހެރްޒިގޮވީނާ
+    ee: Bosnia and Herzegovina
+    el: Βοσνία και Ερζεγοβίνη
+    en: Bosnia and Herzegovina
+    eo: Bosnio kaj Hercegovino
+    es: Bosnia y Herzegovina
+    et: Bosnia ja Hertsegoviina
+    eu: Bosnia eta Herzegovinako
+    fa: بوسنی و هرزگوین
+    ff: Bosniya e Herzegovina
+    fi: Bosnia ja Hertsegovina
+    fo: Bosnia og Hersegovina
+    fr: Bosnie-et-Herzégovine
+    fy: Bosnje-Hertsegovina
+    ga: an Bhoisnia-Heirseagaivéin
+    gd: Bosna agus Hearsagobhana
+    gl: Bosnia e Hercegovina
+    gn: Vonia ha Hesegovina
+    gu: બોસ્નિયા અને હર્ઝેગોવિના
+    gv: Bosnia as Herzegovina
+    ha: Bosnia da Herzegovina
+    he: בּוֹסְנִיָּה וְהֶרְצֶגוֹבִינָה
+    hi: बॉस्निया और हर्ज़ेगोविना
+    hr: Bosna i Hercegovina
+    ht: Bosni ak Erzegovin
+    hu: Bosznia-Hercegovina
+    hy: Բոսնիա և Հերցեգովինա
+    ia: Bosnia e Herzegovina
+    id: Bosnia dan Herzegovina
+    ie: Bosnia e Herzegovina
+    ig: Bosnia na Herzegovina
+    io: Bosnia e Herzegovina
+    is: Bosnía og Hersegóvína
+    it: Bosnia ed Erzegovina
+    ja: ボスニア・ヘルツェゴビナ
+    jv: Bosnia lan Hércegovina
+    ka: ბოსნია და ჰერცეგოვინა
+    kg: Bosna
+    ki: Mbocinia na Hecengobina
+    kk: Босния және Герцеговина
+    kl: Bosnia-Hercegovina
+    km: បូស្ន៉ី
+    kn: ಬೊಸ್ನಿಯ ಮತ್ತು ಹೆರ್ಜೆಗೊವಿನ
+    ko: 보스니아 헤르체고비나
+    ks: बास्निया
+    ku: Bosniya û Herzegovîna
+    kv: Босния да Герцеговина
+    kw: Bosni–Hercegovina
+    ky: Босния жана Герцеговина
+    la: Bosnia et Herzegovina
+    lb: Bosnien an Herzegowina
+    li: Bosnië en Herzegovina
+    ln: Bosnia na Erzegovina
+    lo: ປະເທດບົດສະນີແຮກເຊໂກວີນ
+    lt: Bosnija ir Hercegovina
+    lv: Bosnija un Hercegovina
+    mg: Bosnia sy Herzegovina
+    mi: Pōngia-Herekōmina
+    mk: Босна и Херцеговина
+    ml: ബോസ്നിയ ആന്റ് ഹെർസെഗോവിന
+    mn: Босни ба Херцеговина
+    mr: बॉस्निया आणि हर्झगोव्हिना
+    ms: Bosnia dan Herzegovina
+    mt: Bożnija u Ħerżegovina
+    my: ဘော့စနီးယားနှင့် ဟာဇီဂိုးဗီးနားနိုင်ငံ
+    na: Boteniya me Erdegobina
+    ne: बोस्निया र हर्जगोभिना
+    nl: Bosnië en Herzegovina
+    nn: Bosnia-Hercegovina
+    "no": Bosnia-Hercegovina
+    nv: Bosna dóó Hetsog Bikéyah
+    oc: Bòsnia e Ercegovina
+    om: Boosniyaa fi Herzegoviinaa
+    or: ବୋସନିଆ ଓ ହରଜଗୋଭିନା
+    os: Босни æмæ Герцеговинæ
+    pa: ਬੋਸਨੀਆ ਅਤੇ ਹਰਜ਼ੇਗੋਵੀਨਾ
+    pi: बास्निया
+    pl: Bośnia i Hercegowina
+    ps: بوسنيا او هېرزګوينا
+    pt: Bósnia e Herzegovina
+    qu: Busna-Hirsiquwina
+    rm: Bosnia-Erzegovina
+    rn: Bosiniya na Herigozevine
+    ro: Bosnia și Herțegovina
+    ru: Босния и Герцеговина
+    rw: Bosiniya na Herizegovina
+    sa: बास्निया
+    sc: Bòsnia e Erzegòvina
+    se: Bosnia ja Hercegovina
+    sg: Bosnïi na Herzegovînni
+    sh: Bosna i Hercegovina
+    si: බොස්නියා සහ හර්සගෝවිනා
+    sk: Bosna a Hercegovina
+    sl: Bosna in Hercegovina
+    sm: Bosnia ma Herzegovina
+    sn: Bosnia and Herzegovina
+    so: Bosniya iyo Herzegovina
+    sq: Bosnja dhe Hercegovina
+    sr: Босна и Херцеговина
+    ss: iBhosinya ne Hezegovi
+    su: Bosnia jeung Hérzégovina
+    sv: Bosnien och Hercegovina
+    sw: Bosnia na Herzegovina
+    ta: பொசுனியாவும் எர்செகோவினாவும்
+    te: బోస్నియా మరియు హెర్జెగొవీనా
+    tg: Босния ва Ҳерсеговина
+    th: บอสเนียและเฮอร์เซโกวีนา
+    ti: ቦስኒያ እና ሄርዞጎቪኒያ
+    tk: Bosniýa we Gersegowina
+    tl: Bosnia at Herzegovina
+    to: Posinia mo Hesikōvinia
+    tr: Bosna-Hersek
+    ts: Bosnia and Herzegovina
+    tt: Бо́сния һәм Герцегови́на
+    ty: Pōtinia-Heretōvina
+    ug: بوسنىيە ۋە ھېرسېگوۋىنا
+    uk: Бо́снія і Герцеґови́на
+    ur: بوسنیا و ہرزیگووینا
+    uz: Bosniya va Gersegovina
+    vi: Bosnia và Herzegovina
+    vo: Bosnän e Härzegovän
+    wa: Bosneye
+    wo: Bosni Hersegowin
+    yi: באסניע און הערצעגאווינע
+    yo: Bósníà àti Hẹrjẹgòfínà
+    zh: 波斯尼亞和黑塞哥維那
+    zu: IBhosniya neHerzegovina
diff --git a/settings/country-names/bb.yaml b/settings/country-names/bb.yaml
new file mode 100644 (file)
index 0000000..7ad8634
--- /dev/null
@@ -0,0 +1,125 @@
+name: 
+    default: Barbados
+    af: Barbados
+    am: ባርቤዶስ
+    an: Barbados
+    ar: باربادوس
+    ay: Barbados
+    az: Barbados
+    ba: Барба́дос
+    be: Барба́дас
+    bg: Барбадос
+    bn: বার্বাডোস
+    bo: བར་བ་ཌོ་སི།
+    br: Barbados
+    bs: Barbados
+    ca: Barbados
+    ce: Барбадос
+    cs: Barbados
+    cy: Barbados
+    da: Barbados
+    de: Barbados
+    dv: ބާބަޑޮސް
+    ee: Barbados
+    el: Μπαρμπάντος
+    en: Barbados
+    eo: Barbado
+    es: Barbados
+    et: Barbados
+    eu: Barbados
+    fa: باربادوس
+    fi: Barbados
+    fo: Barbados
+    fr: Barbade
+    fy: Barbados
+    ga: Barbadós
+    gd: Barbados
+    gl: Barbados
+    gn: Varvado
+    gv: Barbados
+    he: ברבדוס
+    hi: बारबाडोस
+    hr: Barbados
+    ht: Lababad
+    hu: Barbados
+    hy: Բարբադոսը
+    ia: Barbados
+    id: Barbados
+    ie: Barbados
+    ig: Barbados
+    io: Barbados
+    is: Barbados
+    it: Barbados
+    ja: バルバドス
+    jv: Barbadhos
+    ka: ბარბადოსი
+    kk: Барба́дос
+    kn: ಬಾರ್ಬಡೋಸ್
+    ko: 바베이도스
+    ku: Barbados
+    kv: Барбадос
+    kw: Barbados
+    ky: Барбадос
+    la: Barbata
+    lb: Barbados
+    li: Barbados
+    ln: Barbados
+    lt: Barbadòsas
+    lv: Barbadosa
+    mg: Barbady
+    mk: Барбадос
+    ml: ബർബാഡോസ്
+    mn: Барбадос
+    mr: बार्बाडोस
+    ms: Barbados
+    mt: Barbados
+    my: ဘာဘေးဒိုးစ်နိုင်ငံ
+    na: Barbadot
+    ne: बार्बाडोस
+    nl: Barbados
+    nn: Barbados
+    "no": Barbados
+    oc: Barbados
+    om: Baarbeedoos
+    or: ବାରବାଡୋସ
+    os: Барбадос
+    pa: ਬਾਰਬਾਡੋਸ
+    pi: बार्बाडोस
+    pl: Barbados
+    ps: بارباډوس
+    pt: Barbados
+    rm: Barbados
+    ro: Barbados
+    ru: Барбадос
+    rw: Barubadosi
+    sa: बार्बाडोस
+    se: Barbados
+    sh: Barbados
+    sk: Barbados
+    sl: Barbados
+    sn: Barbados
+    so: Barbados
+    sq: Barbadosi
+    sr: Барбадос
+    ss: iBhadosi
+    su: Barbados
+    sv: Barbados
+    sw: Barbados
+    ta: பார்படோசு
+    te: బార్బడోస్
+    tg: Барбáдос
+    th: บาร์เบโดส
+    tl: Barbados
+    tr: Barbados
+    tt: Барба́дос
+    ug: باربادوس
+    uk: Барба́дос
+    ur: بارباڈوس
+    uz: Barbados
+    vi: Barbados
+    vo: Barbadeän
+    wa: Barbåde
+    wo: Barbados
+    yi: באַרבאַדאס
+    yo: Bárbádọ̀s
+    zh: 巴巴多斯
diff --git a/settings/country-names/bd.yaml b/settings/country-names/bd.yaml
new file mode 100644 (file)
index 0000000..0793141
--- /dev/null
@@ -0,0 +1,40 @@
+name: 
+    default: Bangladesh
+    af: Bangladesj
+    ar: بنغلاديش
+    az: Banqladeş
+    be: Бангладэш
+    br: Bangladesh
+    ca: Bangla Desh
+    da: Bangladesh
+    de: Bangladesch
+    el: Μπανγκλαντές
+    en: Bangladesh
+    eo: Bangladeŝo
+    fa: بنگلادش
+    fi: Bangladesh
+    fr: Bangladesh
+    fy: Banglades
+    ga: An Bhangladéis
+    gd: Bangladais
+    he: בנגלדש
+    hr: Bangladeš
+    hu: Banglades
+    is: Bangladess
+    it: Bangladesh
+    ja: バングラデシュ
+    la: Bangladesha
+    lb: Bangladesch
+    li: Bangladesj
+    lt: Bangladešas
+    lv: Bangladeša
+    mn: Бангладеш
+    pl: Bangladesz
+    pt: Bangladesh
+    ru: Бангладеш
+    sl: Bangladeš
+    sv: Bangladesh
+    th: ประเทศบังกลาเทศ
+    tr: Bangladeş
+    uk: Бангладеш
+    zh: 孟加拉国
diff --git a/settings/country-names/be.yaml b/settings/country-names/be.yaml
new file mode 100644 (file)
index 0000000..e1b85f6
--- /dev/null
@@ -0,0 +1,159 @@
+name: 
+    default: België / Belgique / Belgien
+    af: België
+    ak: Belgium
+    am: ቤልጅግ
+    an: Belchica
+    ar: بلجيكا
+    av: Бе́льгия
+    ay: Bilkiya
+    az: Belçika
+    ba: Бе́льгия
+    be: Бeльгія
+    bg: Белгия
+    bh: बेल्जियम
+    bi: Beljiom
+    bm: Bɛliziki
+    bn: বেলজিয়াম
+    bo: པེར་ཅིན།
+    br: Belgia
+    bs: Belgija
+    ca: Bèlgica
+    ce: Бельги
+    co: Belgica
+    cs: Belgie
+    cu: Бє́лгїѥ
+    cv: Бельги
+    cy: Gwlad Belg
+    da: Belgien
+    de: Belgien
+    dv: ބެލްޖިއަމް
+    dz: བེལ་ཇིཡམ
+    ee: Belgium
+    el: Βέλγιο
+    en: Belgium
+    eo: Belgio
+    es: Bélgica
+    et: Belgia
+    eu: Belgika
+    fa: بلژیک
+    ff: Beljik
+    fi: Belgia
+    fo: Belgia
+    fr: Belgique
+    fy: Belgje
+    ga: an Bheilg
+    gd: a' Bheilg
+    gl: Bélxica
+    gn: Véyhika
+    gu: બેલ્જિયમ
+    gv: Velg
+    ha: Beljik
+    he: בֶּלְגְיָה
+    hi: बेल्जियम
+    hr: Belgija
+    ht: Bèljik
+    hu: Belgium
+    hy: Բելգիա
+    ia: Belgica
+    id: Belgia
+    ie: Belgia
+    ig: Belgium
+    io: Belgia
+    is: Belgía
+    it: Belgio
+    ja: ベルギー
+    jv: Bèlgia
+    ka: ბელგია
+    kg: Belezi
+    ki: Ubelgiji
+    kk: Бельгия
+    kl: Belgia
+    km: បែលហ្ស៉ិក
+    kn: ಬೆಲ್ಜಿಯಂ
+    ko: 벨기에
+    ks: बेल्जियम
+    ku: Belçîka
+    kv: Бельгия
+    kw: Pow Belg
+    ky: Бельгия
+    la: Belgica
+    lb: Belsch
+    lg: Bubirigi
+    li: Belsj
+    ln: Bɛ́ljika
+    lo: ປະເທດແບນຊິກ
+    lt: Belgija
+    lv: Beļģija
+    mg: Belzika
+    mi: Pehiamu
+    mk: Белгија
+    ml: ബെൽജിയം
+    mn: Бельги
+    mr: बेल्जियम
+    ms: Belgium
+    mt: Belġju
+    my: ဘယ်လ်ဂျီယမ်နိုင်ငံ
+    na: Berdjiyum
+    nb: Belgia
+    ne: बेल्जियम
+    nl: België
+    nn: Belgia
+    "no": Belgia
+    oc: Belgica
+    om: Beeljiyeem
+    or: ବେଲଜିଅମ
+    os: Бельги
+    pa: ਬੈਲਜੀਅਮ
+    pi: बेल्जियम
+    pl: Belgia
+    ps: بلجیم
+    pt: Bélgica
+    qu: Bilhika
+    rm: Belgia
+    rn: Ububirigi
+    ro: Belgia
+    ru: Бельгия
+    rw: Ububiligi
+    sa: बेल्जियम
+    sc: Bèlgiu
+    sd: بيلجيم
+    se: Belgia
+    sg: Bêleze
+    sh: Belgija
+    si: බෙල්ජියම්
+    sk: Belgicko
+    sl: Bélgija
+    sm: Peleseuma
+    sn: Belgium
+    so: Beljim
+    sq: Belgjika
+    sr: Белгија
+    ss: iBhelijiyamu
+    su: Bélgia
+    sv: Belgien
+    sw: Ubelgiji
+    ta: பெல்ஜியம்
+    te: బెల్జియం
+    tg: Белгия
+    th: เบลเยียม
+    ti: ቤልጄም
+    tk: Belgiýa
+    tl: Belhika
+    to: Pelesiume
+    tr: Belçika
+    ts: Belgium
+    tt: Бе́льгия
+    tw: Belgium
+    ug: بېلگىيە
+    uk: Бе́льгія
+    ur: بلجئیم
+    uz: Belgiya
+    vi: Bỉ
+    vo: Belgän
+    wa: Beldjike
+    wo: Belsik
+    yi: בעלגיע
+    yo: Bẹ́ljíọ̀m
+    zh: 比利時
+    zu: i-Belgium
diff --git a/settings/country-names/bf.yaml b/settings/country-names/bf.yaml
new file mode 100644 (file)
index 0000000..ddffe33
--- /dev/null
@@ -0,0 +1,147 @@
+name: 
+    default: Burkina Faso
+    af: Burkina Faso
+    ak: Burkina Faso
+    am: ቡርኪና ፋሶ
+    an: Burkina Faso
+    ar: بوركينا فاسو
+    az: Burkina-Faso
+    ba: Буркина́-Фасо́
+    be: Буркіна́-Фасо́
+    bg: Буркина Фасо
+    bh: बुर्किना फासो
+    bm: Burukina Faso
+    bn: বুর্কিনা ফাসো
+    bo: བུར་ཀི་ན་ཕ་སོ།
+    br: Burkina Faso
+    bs: Burkina Faso
+    ca: Burkina Faso
+    ce: Буркина-Фасо
+    cs: Burkina Faso
+    cv: Буркина Фасо
+    cy: Bwrcina Ffaso
+    da: Burkina Faso
+    de: Burkina Faso
+    dv: ބުރުކީނާ ފާސޯ
+    dz: བྷར་ཀི་ན་ ཕེ་སོ
+    ee: Burkina Faso
+    el: Μπουρκίνα Φάσο
+    en: Burkina Faso
+    eo: Burkina Faso
+    es: Burkina Faso
+    et: Burkina Faso
+    eu: Burkina Faso
+    fa: بورکینافاسو
+    ff: Burkina Faso
+    fi: Burkina Faso
+    fo: Burkina Faso
+    fr: Burkina Faso
+    fy: Boerkina Faso
+    ga: Buircíne Fasó
+    gd: Buirciona Faso
+    gl: Burquina Faso
+    gu: બુર્કિના ફાસો
+    gv: Burkina Faso
+    ha: Burkina faso
+    he: בורקינה פאסו
+    hi: बुर्किना फासो
+    hr: Burkina Faso
+    ht: Boukinafaso
+    hu: Burkina Faso
+    hy: Բուրկինա Ֆասո
+    ia: Burkina Faso
+    id: Burkina Faso
+    ie: Burkina Faso
+    ig: Burkina Faso
+    io: Burkina Faso
+    is: Búrkína Fasó
+    it: Burkina Faso
+    ja: ブルキナファソ
+    jv: Burkina Faso
+    ka: ბურკინა-ფასო
+    kg: Burkina Faso
+    ki: Burkina Faso
+    kk: Буркина Фасо
+    km: ប៊ូរគីណាហ្វាសូ
+    kn: ಬುರ್ಕೀನ ಫಾಸೊ
+    ko: 부르키나파소
+    ks: بُرکِنا فیسو
+    ku: Burkîna Faso
+    kw: Burkina Faso
+    ky: Буркина-Фасо
+    la: Burkina Faso
+    lb: Burkina Faso
+    lg: Burkina Faso
+    li: Burkina Faso
+    ln: Burkina Faso
+    lo: ເບີກິນາຟາໂຊ
+    lt: Burkina Fasas
+    lv: Burkinafaso
+    mg: Borkina Faso
+    mk: Буркина Фасо
+    ml: ബർക്കിനാ ഫാസോ
+    mn: Буркина Фасо
+    mr: बर्किना फासो
+    ms: Burkina Faso
+    mt: Burkina Faso
+    my: ဘာကီးနားဖားဆိုနိုင်ငံ
+    na: Burkinabato
+    ne: बुर्किना फासो
+    nl: Burkina Faso
+    nn: Burkina Faso
+    "no": Burkina Faso
+    oc: Burkina Faso
+    om: Burkinaa Faasoo
+    or: ବୁରକିନା ଫାସୋ
+    os: Буркина́-Фасо́
+    pa: ਬੁਰਕੀਨਾ ਫ਼ਾਸੋ
+    pi: बुर्कीना-फासो
+    pl: Burkina Faso
+    ps: بورکینا فاسو
+    pt: Burquina Faso
+    qu: Burkina Phasu
+    rm: Burkina Faso
+    rn: Burukina Faso
+    ro: Burkina Faso
+    ru: Буркина-Фасо
+    rw: Burukina Faso
+    sa: बुर्कीना-फासो
+    sc: Burkina Faso
+    se: Burkina Faso
+    sg: Burkina Faso
+    sh: Burkina Faso
+    si: බර්කිනා ෆාසෝ
+    sk: Burkina Faso
+    sl: Burkina Faso
+    sm: Burkina Faso
+    sn: Burkina Faso
+    so: Burkina Faso
+    sq: Burkina Faso
+    sr: Буркина Фасо
+    ss: iBhukhina-Faso
+    st: Burkina Faso
+    su: Burkina Faso
+    sv: Burkina Faso
+    sw: Burkina Faso
+    ta: புர்க்கினா பாசோ
+    te: బర్కీనా ఫాసో
+    tg: Буркина Фасо
+    th: บูร์กินาฟาโซ
+    ti: ቡርኪና ፋሶ
+    tk: Burkina-Faso
+    tl: Burkina Faso
+    to: Pekano Faso
+    tr: Burkina Faso
+    ts: Burkina Faso
+    tt: Буркина́ Фасо́
+    ug: بۇركىنا فاسو
+    uk: Буркіна́-Фасо́
+    ur: برکینا فاسو
+    uz: Burkina Faso
+    vi: Buốc-ki-na Pha-xô
+    vo: Burkinän
+    wo: Burkinaa Faaso
+    yi: בורקינע פֿאַסא
+    yo: Bùrkínà Fasò
+    zh: 布基纳法索
+    zu: iBukhina Faso
diff --git a/settings/country-names/bg.yaml b/settings/country-names/bg.yaml
new file mode 100644 (file)
index 0000000..cc9fd51
--- /dev/null
@@ -0,0 +1,153 @@
+name: 
+    default: Бългaрия
+    ab: Болга́риа
+    af: Bulgarye
+    ak: Bulgaria
+    am: ቡልጋሪያ
+    an: Bulgaria
+    ar: بلغاريا
+    av: Болга́рия
+    ay: Bulkariya
+    az: Bolqarıstan
+    ba: Болга́рия
+    be: Балга́рыя
+    bg: България
+    bh: बुल्गारिया
+    bi: Bulgaria
+    bn: বুলগেরিয়া
+    bo: པུ་ར་ག་རི་ཡ།
+    br: Bulgaria
+    bs: Bugarska
+    ca: Bulgària
+    ce: Болга́ри
+    ch: Bulgaria
+    co: Bulgaria
+    cs: Bulharsko
+    cu: Блъгарїꙗ
+    cv: Пăлхарĕ
+    cy: Bwlgaria
+    da: Bulgarien
+    de: Bulgarien
+    dv: ބަލްގޭރިއާ
+    ee: Bulgaria
+    el: Βουλγαρία
+    en: Bulgaria
+    eo: Bulgario
+    es: Bulgaria
+    et: Bulgaaria
+    eu: Bulgaria
+    fa: بلغارستان
+    ff: Bulgariya
+    fi: Bulgaria
+    fo: Bulgaria
+    fr: Bulgarie
+    fy: Bulgarije
+    ga: an Bhulgáir
+    gd: Bulgàiria
+    gl: Bulgaria
+    gn: Vugaria
+    gu: બલ્ગેરિયા
+    gv: yn Vulgeyr
+    ha: Bulgairiya
+    he: בּוּלְגַרְיָה
+    hi: बुल्गारिया
+    hr: Bugarska
+    ht: Bilgari
+    hu: Bulgária
+    hy: Բուլղարիա
+    ia: Bulgaria
+    id: Bulgaria
+    ie: Bulgaria
+    ig: Bulgaria
+    io: Bulgaria
+    is: Búlgaría
+    it: Bulgaria
+    ja: ブルガリア
+    jv: Bulgaria
+    ka: ბულგარეთი
+    kg: Balgaria
+    kk: Болгария
+    kl: Bulgaria
+    kn: ಬಲ್ಗೇರಿಯ
+    ko: 불가리아
+    ku: Bulgaristan
+    kv: Болгария
+    kw: Bulgari
+    ky: Болгария
+    la: Bulgaria
+    lb: Bulgarien
+    li: Bölgarije
+    ln: Bulgaria
+    lo: ປະເທດບູນກາລີ
+    lt: Bulgarija
+    lv: Bulgārija
+    mg: Biolgaria
+    mi: Purukāria
+    mk: Бугарија
+    ml: ബൾഗേറിയ
+    mn: Болгар
+    mr: बल्गेरिया
+    ms: Bulgaria
+    mt: Bulgarija
+    my: ဘူလ်ဂေးရီးယားနိုင်ငံ
+    na: Borgeriya
+    ne: बुल्गेरिया
+    nl: Bulgarije
+    nn: Bulgaria
+    "no": Bulgaria
+    nv: Bálgaa Bikéyah
+    oc: Bulgaria
+    om: Bulgeeriyaa
+    or: ବୁଲଗାରିଆ
+    os: Болгари
+    pa: ਬੁਲਗਾਰੀਆ
+    pi: बुल्गारिया
+    pl: Bułgaria
+    ps: بلغاریا
+    pt: Bulgária
+    qu: Bulgarya
+    rm: Bulgaria
+    rn: Bulgaria
+    ro: Bulgaria
+    ru: Болгария
+    rw: Bulugariya
+    sa: बुल्गारिया
+    sc: Bulgaria
+    sd: بلغاريه
+    se: Bulgária
+    sg: Bulugarïi
+    sh: Bugarska
+    si: බල්ගේරියාව
+    sk: Bulharsko
+    sl: Bolgarija
+    sm: Bultalia
+    sn: Bulgaria
+    so: Bulgaria
+    sq: Bullgaria
+    sr: Бугарска
+    ss: iBhulgariya
+    su: Bulgaria
+    sv: Bulgarien
+    sw: Bulgaria
+    ta: பல்கேரியா
+    te: బల్గేరియా
+    tg: Булғористон
+    th: บัลแกเรีย
+    tk: Bolgariýa
+    tl: Bulgarya
+    tr: Bulgaristan
+    ts: Bulgaria
+    tt: Болгария
+    tw: Bulgaria
+    ug: بۇلغارىيە
+    uk: Болга́рія
+    ur: بلغاریہ
+    uz: Bolgariya
+    vi: Bulgaria
+    vo: Bulgarän
+    wa: Bulgåreye
+    wo: Bulgaari
+    yi: בולגאַריע
+    yo: Bùlgáríà
+    zh: 保加利亚
+    zu: IBulgariya
diff --git a/settings/country-names/bh.yaml b/settings/country-names/bh.yaml
new file mode 100644 (file)
index 0000000..9aafc01
--- /dev/null
@@ -0,0 +1,148 @@
+name: 
+    default: البحرين
+    af: Bahrein
+    ak: Baren
+    am: ባሕሬን
+    an: Bahrein
+    ar: البحرين
+    as: বাহৰেইন
+    az: Bəhreyn
+    ba: Бахре́йн
+    be: Бахрэ́йн
+    bg: Бахрейн
+    bh: बहरीन
+    bm: Bareyini
+    bn: বাহরাইন
+    bo: བྷཧ་རཡིན།
+    br: Bahrein
+    bs: Bahrein
+    ca: Bahrain
+    ce: Бахьрайн
+    cs: Bahrajn
+    cv: Бахрейн
+    cy: Bahrein
+    da: Bahrain
+    de: Bahrain
+    dv: ބަޙްރައިން
+    dz: བཧ་རེན་
+    ee: Bahrain nutome
+    el: Μπαχρέιν
+    en: Bahrain
+    eo: Barejno
+    es: Baréin
+    et: Bahrein
+    eu: Bahrain
+    fa: بحرین
+    ff: Bahreyn
+    fi: Bahrain
+    fo: Barein
+    fr: Bahreïn
+    fy: Bachrein
+    ga: Bairéin
+    gd: Bachrain
+    gl: Bahrein
+    gn: Varéĩ
+    gu: બહેરીન
+    gv: Bahrain
+    ha: Baharain
+    he: בחריין
+    hi: बहरीन
+    hr: Bahrein
+    ht: Barayn
+    hu: Bahrein
+    hy: Բահրեյն
+    ia: Bahrain
+    id: Bahrain
+    ie: Bahrain
+    io: Bahrain
+    is: Barein
+    it: Bahrein
+    ja: バーレーン
+    jv: Bahrain
+    ka: ბაჰრეინი
+    kg: Bahrain
+    ki: Bahrain
+    kk: Бахрейн
+    kl: Bahrain
+    km: បារ៉ែន
+    kn: ಬಹರೇನ್
+    ko: 바레인
+    ks: بحریٖن
+    ku: Behreyn
+    kv: Бахрейн
+    kw: Bahreyn
+    ky: Бахре́йн
+    la: Baharina
+    lb: Bahrain
+    lg: Baareeni
+    li: Bahrein
+    ln: Bahrein
+    lo: ບາເລນ
+    lt: Bahreinas
+    lv: Bahreina
+    mg: Baharainy
+    mk: Бахреин
+    ml: ബഹ്‌റൈൻ
+    mn: Бахрейн
+    mr: बहरैन
+    ms: Bahrain
+    mt: Baħrejn
+    my: ဘာရိန်းနိုင်ငံ
+    na: Bahrain
+    ne: बहराइन
+    nl: Bahrein
+    nn: Bahrain
+    "no": Bahrain
+    oc: Bahrayn
+    om: Baahireen
+    or: ବାହାରିନ୍
+    os: Бахрейн
+    pa: ਬਹਿਰੀਨ
+    pi: बहरैन
+    pl: Bahrajn
+    ps: بحرین
+    pt: Bahrein
+    qu: Bahrayn
+    rm: Bahrain
+    rn: Bahareyini
+    ro: Bahrain
+    ru: Бахрейн
+    rw: Bahirayini
+    sa: बहरैन
+    sd: بحرين
+    se: Bahrain
+    sg: Bahrâina
+    sh: Bahrein
+    si: බහරේන්
+    sk: Bahrajn
+    sl: Bahrájn
+    sm: Bahrain
+    sn: Bahrain
+    so: Baxrayn
+    sq: Bahraini
+    sr: Бахреин
+    ss: iBhaharayi
+    su: Bahrain
+    sv: Bahrain
+    sw: Bahrain
+    ta: பகுரைன்
+    te: బహ్రయిన్
+    tg: Баҳрайн
+    th: บาห์เรน
+    ti: ባህሬን
+    tk: Bahreýn
+    tl: Bahrain
+    to: Paleini
+    tr: Bahreyn
+    tt: Бәхрәйн
+    ug: بەھرېيىن
+    uk: Бахре́йн
+    ur: بحرین
+    uz: Baxreyn
+    vi: Bahrain
+    vo: Bahruäns
+    wo: Bahrayni
+    yi: באכריין
+    yo: Báháráìnì
+    zh: 巴林
+    zu: i-Bahrain
diff --git a/settings/country-names/bi.yaml b/settings/country-names/bi.yaml
new file mode 100644 (file)
index 0000000..ef5f843
--- /dev/null
@@ -0,0 +1,147 @@
+name: 
+    default: Burundi
+    af: Burundi
+    am: ቡሩንዲ
+    an: Burundi
+    ar: بوروندي
+    az: Burundi
+    ba: Буру́нди
+    be: Буру́ндзі
+    bg: Бурунди
+    bh: बुरुंडी
+    bm: Burundi
+    bn: বুরুন্ডি
+    bo: བུ་རུན་ཌི།
+    br: Burundi
+    bs: Burundi
+    ca: Burundi
+    ce: Бурунди
+    cs: Burundi
+    cv: Бурунди
+    cy: Bwrwndi
+    da: Burundi
+    de: Burundi
+    dv: ބުރުންޑީ
+    dz: བྷུ་རུན་ཌི
+    ee: Burundi
+    el: Μπουρούντι
+    en: Burundi
+    eo: Burundo
+    es: Burundí
+    et: Burundi
+    eu: Burundi
+    fa: بوروندی
+    ff: Burunndi
+    fi: Burundi
+    fo: Burundi
+    fr: Burundi
+    fy: Boerûndy
+    ga: an Bhurúin
+    gd: Burundaidh
+    gl: Burundi
+    gn: Vurundi
+    gu: બુરુંડી
+    gv: Burundee
+    ha: Burundi
+    he: בורונדי
+    hi: बुरुण्डी
+    hr: Burundi
+    ht: Bouroundi
+    hu: Burundi
+    hy: Բուրունդի
+    ia: Burundi
+    id: Burundi
+    ie: Burundi
+    ig: Burundi
+    io: Burundi
+    is: Búrúndí
+    it: Burundi
+    ja: ブルンジ
+    jv: Burundi
+    ka: ბურუნდი
+    kg: Burundi
+    ki: Burundi
+    kk: Бурунди
+    km: ប៊ូរុនឌី
+    kn: ಬುರುಂಡಿ
+    ko: 부룬디
+    ks: بورَنڈِ
+    ku: Burundî
+    kw: Burundi
+    ky: Бурунди
+    la: Burundia
+    lb: Burundi
+    lg: Burundi
+    li: Boeroendi
+    ln: Burundi
+    lo: ບູລັນດີ
+    lt: Burundis
+    lv: Burundi
+    mg: Borondy
+    mk: Бурунди
+    ml: ബറുണ്ടി
+    mn: Бурунди
+    mr: बुरुंडी
+    ms: Burundi
+    mt: Burundi
+    my: ဘူရွန်ဒီနိုင်ငံ
+    na: Burundi
+    ne: बुरूण्डी
+    nl: Burundi
+    nn: Burundi
+    "no": Burundi
+    oc: Burundi
+    om: Buruundii
+    or: ବୁରୁଣ୍ଡି
+    os: Буру́нди
+    pa: ਬੁਰੂੰਡੀ
+    pi: बुरुंडी
+    pl: Burundi
+    ps: برونډي
+    pt: Burundi
+    qu: Burundi
+    rm: Burundi
+    rn: Uburundi
+    ro: Burundi
+    ru: Бурунди
+    rw: Uburundi
+    sa: बुरुंडी
+    sc: Burundi
+    se: Burundi
+    sg: Burundïi
+    sh: Burundi
+    si: බුරුන්ඩි
+    sk: Burundi
+    sl: Burundi
+    sn: Burundi
+    so: Burundi
+    sq: Burundi
+    sr: Бурунди
+    ss: iBurundi
+    st: Burundi
+    su: Burundi
+    sv: Burundi
+    sw: Burundi
+    ta: புருண்டி
+    te: బురుండి
+    tg: Бурунди
+    th: บุรุนดี
+    ti: ብሩንዲ
+    tk: Burundi
+    tl: Burundi
+    to: Pelaniti
+    tr: Burundi
+    ts: Burundi
+    tt: Буру́нди
+    ug: بۇرۇندى
+    uk: Буру́нді
+    ur: برونڈی
+    uz: Burundi
+    vi: Burundi
+    vo: Rundiyän
+    wa: Bouroundi
+    wo: Buruundi
+    yi: בורונדי
+    yo: Bùrúndì
+    zh: 布隆迪
+    zu: iBurundi
diff --git a/settings/country-names/bj.yaml b/settings/country-names/bj.yaml
new file mode 100644 (file)
index 0000000..d6a65e2
--- /dev/null
@@ -0,0 +1,150 @@
+name: 
+    default: Bénin
+    af: Benin
+    ak: Bɛnin
+    am: ቤኒን
+    an: Benín
+    ar: بنين
+    az: Benin
+    ba: Бенин
+    be: Бені́н
+    bg: Бенин
+    bh: बेनिन
+    bm: Benɛn
+    bn: বেনিন
+    bo: བེ་ནིན།
+    br: Benin
+    bs: Benin
+    ca: Benín
+    ce: Бени́н
+    cs: Benin
+    cv: Бенин
+    cy: Benin
+    da: Benin
+    de: Benin
+    dv: ބެނީން
+    dz: བཱེ་ནིན།
+    ee: Benɛ̃
+    el: Μπενίν
+    en: Benin
+    eo: Benino
+    es: Benín
+    et: Benin
+    eu: Benin
+    fa: بنین
+    ff: Benen
+    fi: Benin
+    fo: Benin
+    fr: Bénin
+    fy: Benyn
+    ga: Beinin
+    gd: Beinin
+    gl: Benin
+    gn: Mbenĩ
+    gu: બેનિન
+    gv: Benin
+    ha: Benin
+    he: בנין
+    hi: बेनिन
+    hr: Benin
+    ht: Benen
+    hu: Benin
+    hy: Բենին
+    ia: Benin
+    id: Benin
+    ie: Benin
+    ig: Benin
+    io: Benin
+    is: Benín
+    it: Benin
+    ja: ベナン
+    jv: Bénin
+    ka: ბენინი
+    kg: Benin
+    ki: Benin
+    kk: Бени́н
+    kl: Benin
+    km: បេណាំង
+    kn: ಬೆನಿನ್
+    ko: 베냉
+    ks: بِنِن
+    ku: Bênîn
+    kw: Benin
+    ky: Бени́н
+    la: Beninum
+    lb: Benin
+    lg: Benin
+    li: Benin
+    ln: Benin
+    lo: ເບນິນ
+    lt: Beninas
+    lv: Benina
+    mg: Benina
+    mi: Pēnina
+    mk: Бенин
+    ml: ബെനിൻ
+    mn: Бенин
+    mr: बेनिन
+    ms: Benin
+    mt: Benin
+    my: ဘီနင်နိုင်ငံ
+    na: Benin
+    ne: बेनिन
+    nl: Benin
+    nn: Benin
+    "no": Benin
+    oc: Benin
+    om: Beeniin
+    or: ବେନିନ
+    os: Бенин
+    pa: ਬੇਨਿਨ
+    pi: बेनिन
+    pl: Benin
+    ps: بېنين
+    pt: Benim
+    qu: Binin
+    rm: Benin
+    rn: Bene
+    ro: Benin
+    ru: Бенин
+    rw: Bene
+    sa: बेनिन्
+    sc: Benin
+    sd: بينن
+    se: Benin
+    sg: Benëen
+    sh: Benin
+    si: බෙනින්
+    sk: Benin
+    sl: Benin
+    sn: Benin
+    so: Benin
+    sq: Benini
+    sr: Бенин
+    ss: iBhenini
+    st: Benin
+    su: Bénin
+    sv: Benin
+    sw: Benin
+    ta: பெனின்
+    te: బెనిన్
+    tg: Бенѝн
+    th: เบนิน
+    ti: ቤኒን
+    tk: Benin
+    tl: Benin
+    to: Penini
+    tr: Benin
+    ts: Benin
+    tt: Бени́н
+    ug: بېنىن
+    uk: Бені́н
+    ur: بینن
+    uz: Benin
+    vi: Bénin
+    vo: Beninän
+    wo: Bene
+    yi: בענין
+    yo: Benin
+    zh: 贝宁
+    zu: IBenini
diff --git a/settings/country-names/bl.yaml b/settings/country-names/bl.yaml
new file mode 100644 (file)
index 0000000..d8aa1f9
--- /dev/null
@@ -0,0 +1,2 @@
+name: 
+    default: Saint Barthélemy
diff --git a/settings/country-names/bm.yaml b/settings/country-names/bm.yaml
new file mode 100644 (file)
index 0000000..a7eb8ef
--- /dev/null
@@ -0,0 +1,39 @@
+name: 
+    default: Bermuda
+    ar: برمودا
+    be: Бярмуды
+    br: Bermudez
+    ca: Bermudes
+    cs: Bermudy
+    da: Bermuda
+    de: Bermuda
+    el: Βερμούδες
+    en: Bermuda
+    eo: Bermudoj
+    fa: برمودا
+    fi: Bermuda
+    fr: Bermudes
+    ga: Beirmiúda
+    gl: Bermudas
+    he: ברמודה
+    hr: Bermudski Otoci
+    hu: Bermuda
+    id: Bermuda
+    is: Bermúda
+    it: Bermuda
+    lt: Bermuda
+    lv: Bermudu salas
+    mk: Бермуда
+    mn: Бермудын Арал
+    oc: Bermudas
+    pl: Bermudy
+    pt: Bermudas
+    ru: Бермудские острова
+    sl: Bermudi
+    sr: Бермуди
+    sv: Bermuda
+    th: เบอร์มิวดา
+    tr: Bermuda
+    uk: Бермудські острови
+    uz: Bermud orollari
+    zh: 百慕大
diff --git a/settings/country-names/bn.yaml b/settings/country-names/bn.yaml
new file mode 100644 (file)
index 0000000..1078a96
--- /dev/null
@@ -0,0 +1,147 @@
+name: 
+    default: Brunei
+    af: Broenei
+    ak: Brunae
+    am: ብሩናይ
+    an: Brunei
+    ar: بروناي
+    as: ব্ৰুণেই
+    az: Bruney
+    ba: Бруней
+    be: Бруне́й
+    bg: Бруней
+    bh: ब्रूनेई
+    bm: Burinɛyi
+    bn: ব্রুনাই
+    bo: བྷི་རུ་ནི།
+    br: Brunei
+    bs: Brunej
+    ca: Brunei
+    ce: Бруней
+    cs: Brunej
+    cv: Бруней
+    cy: Brwnei
+    da: Brunei
+    de: Brunei
+    dv: ބުރުނައީ
+    dz: བྷྲུ་ནའི
+    el: Μπρουνέι
+    en: Brunei
+    eo: Brunejo
+    es: Brunéi
+    et: Brunei
+    eu: Brunei
+    fa: برونئی
+    ff: Burnaay
+    fi: Brunei
+    fo: Brunei
+    fr: Brunei
+    fy: Brûnei
+    ga: Brúiné
+    gd: Brùnaigh
+    gl: Brunei
+    gn: Mburunéi
+    gu: બ્રુનેઈ
+    gv: Brunei
+    ha: Brunei
+    he: ברוניי
+    hi: ब्रुनेई
+    hr: Brunej
+    ht: Brouney
+    hu: Brunei
+    hy: Բրունեյ
+    ia: Brunei
+    id: Brunei
+    ie: Brunei
+    ik: Brunei
+    io: Brunei
+    is: Brúnei
+    it: Brunei
+    ja: ブルネイ
+    jv: Brunéi
+    ka: ბრუნეი
+    kg: Brunei
+    ki: Brunei
+    kk: Бруней
+    kl: Brunei
+    km: ប្រទេសប៊្រុយណេ
+    kn: ಬ್ರುನೈ
+    ko: 브루나이
+    ks: بُرنٔے
+    ku: Brûney
+    kv: Бруней
+    kw: Bruney
+    ky: Бруней
+    la: Bruneium
+    lb: Brunei
+    li: Brunei
+    ln: Brunei
+    lo: ບູໄນ
+    lt: Brunėjus
+    lv: Bruneja
+    mg: Boroney
+    mi: Poronai
+    mk: Брунеј
+    ml: ബ്രൂണൈ
+    mn: Бруней
+    mr: ब्रुनेई
+    ms: Brunei
+    mt: Brunej
+    my: ဘရူနိုင်းနိုင်ငံ
+    na: Brunei
+    ne: ब्रुनेई
+    nl: Brunei
+    nn: Brunei
+    "no": Brunei
+    ny: Brunei
+    oc: Brunei
+    om: Birunaay
+    or: ବ୍ରୁନେଇ
+    os: Бруней
+    pa: ਬਰੂਨਾਈ
+    pi: ब्रूनै
+    pl: Brunei
+    ps: برونای
+    pt: Brunei
+    qu: Bruniy
+    rm: Brunei
+    ro: Brunei
+    ru: Бруней
+    rw: Buruneyi
+    sa: ब्रूनै
+    sd: برونئي
+    se: Brunei
+    sg: Brunêi
+    sh: Brunej
+    si: බෲනායි
+    sk: Brunej
+    sl: Brunej
+    sn: Brunei
+    so: Barunay
+    sq: Brunei
+    sr: Брунеј
+    ss: iBhruneyi
+    su: Brunéi
+    sv: Brunei
+    sw: Brunei
+    ta: புரூணை
+    te: బ్రూనై
+    tg: Бруней
+    th: บรูไน
+    ti: ብሩኒ
+    tk: Bruneý
+    tl: Brunei
+    to: Pulunei
+    tr: Brunei
+    tt: Бруне́й
+    ug: برۇنېي
+    uk: Бруне́й
+    ur: برونائی
+    uz: Bruney
+    vi: Brunei
+    vo: Brunän
+    yi: ברוניי
+    yo: Brunei
+    za: Vwnzlaiz
+    zh: 文莱
+    zu: i-Brunei
diff --git a/settings/country-names/bo.yaml b/settings/country-names/bo.yaml
new file mode 100644 (file)
index 0000000..87996a2
--- /dev/null
@@ -0,0 +1,154 @@
+name: 
+    default: Bolivia
+    ab: Боли́виа
+    af: Bolivië
+    am: ቦሊቪያ
+    an: Bolivia
+    ar: بوليفيا
+    ay: Wuliwya
+    az: Boliviya
+    ba: Боливия
+    be: Балі́вія
+    bg: Боливия
+    bh: बोलीविया
+    bi: Bolivia
+    bm: Bolivia
+    bn: বলিভিয়া
+    bo: བྷོ་ལི་ཝི་ཡ།
+    br: Bolivia
+    bs: Bolivija
+    ca: Bolívia
+    ce: Боливи
+    co: Bolivia
+    cs: Bolívie
+    cv: Боливи
+    cy: Bolifia
+    da: Bolivia
+    de: Bolivien
+    dv: ބޮލީވިއާ
+    dz: བོ་ལི་ཝིཡ
+    ee: Bolivia
+    el: Βολιβία
+    en: Bolivia
+    eo: Bolivio
+    es: Bolivia
+    et: Boliivia
+    eu: Bolivia
+    fa: بولیوی
+    ff: Boliwii
+    fi: Bolivia
+    fo: Bolivia
+    fr: Bolivie
+    fy: Bolivia
+    ga: an Bholaiv
+    gd: Boilibhia
+    gl: Bolivia
+    gn: Volívia
+    gu: બોલીવિયા
+    gv: yn Volivia
+    ha: Bolibiya
+    he: בוליביה
+    hi: बोलिविया
+    hr: Bolivija
+    ht: Bolivi
+    hu: Bolívia
+    hy: Բոլիվիան
+    ia: Bolivia
+    id: Bolivia
+    ie: Bolivia
+    ig: Bolivia
+    io: Bolivia
+    is: Bólivía
+    it: Bolivia
+    ja: ボリビア
+    jv: Bolivia
+    ka: ბოლივია
+    kg: Bolivia
+    ki: Bolivia
+    kk: Боли́вия
+    kl: Bolivia
+    km: បូលីវី
+    kn: ಬೊಲಿವಿಯ
+    ko: 볼리비아
+    ks: بولِوِیا
+    ku: Bolîvya
+    kw: Bolivi
+    ky: Боливия
+    la: Bolivia
+    lb: Bolivien
+    lg: Boliviya
+    li: Bolivia
+    ln: Bolivia
+    lo: ໂບລີວີ
+    lt: Bolivija
+    lv: Bolīvija
+    mg: Bolivia
+    mi: Poriwia
+    mk: Боливија
+    ml: ബൊളീവിയ
+    mn: Боливи
+    mr: बोलिव्हिया
+    ms: Bolivia
+    mt: Bolivja
+    my: ဘိုလီးဗီးယားနိုင်ငံ
+    na: Boribiya
+    ne: बोलिभिया
+    nl: Bolivia
+    nn: Bolivia
+    "no": Bolivia
+    nv: Bolíbiya
+    oc: Bolívia
+    om: Boliiviyaa
+    or: ବୋଲିଭିଆ
+    os: Боливи
+    pa: ਬੋਲੀਵੀਆ
+    pi: बोलिविया
+    pl: Boliwia
+    ps: بولېویا
+    pt: Bolívia
+    qu: Wuliwiya
+    rm: Bolivia
+    rn: Boliviya
+    ro: Bolivia
+    ru: Боливия
+    rw: Boliviya
+    sa: बोलिविया
+    sc: Bolìvia
+    se: Bolivia
+    sg: Bolivïi
+    sh: Bolivija
+    si: බොලීවියාව
+    sk: Bolívia
+    sl: Bolivija
+    sm: Polevia
+    sn: Bolivia
+    so: Boliifia
+    sq: Bolivia
+    sr: Боливија
+    ss: IBholiviya
+    su: Bolivia
+    sv: Bolivia
+    sw: Bolivia
+    ta: பொலிவியா
+    te: బొలీవియా
+    tg: Боливия
+    th: โบลิเวีย
+    ti: ቦሊቪያ
+    tk: Boliwiýa
+    tl: Bolivia
+    to: Polīvia
+    tr: Bolivya
+    tt: Боли́вия
+    ug: بولىۋىيە
+    uk: Болі́вія
+    ur: بولیویا
+    uz: Boliviya
+    vi: Bolivia
+    vo: Bolivän
+    wa: Boliveye
+    wo: Boliibi
+    yi: באליוויע
+    yo: Bòlífíà
+    za: Bolivia
+    zh: 玻利维亚
+    zu: i-Bolivia
diff --git a/settings/country-names/bq.yaml b/settings/country-names/bq.yaml
new file mode 100644 (file)
index 0000000..cdb38e5
--- /dev/null
@@ -0,0 +1,2 @@
+name: 
+    default: "\N"
diff --git a/settings/country-names/br.yaml b/settings/country-names/br.yaml
new file mode 100644 (file)
index 0000000..5600bc5
--- /dev/null
@@ -0,0 +1,163 @@
+name: 
+    default: Brasil
+    af: Brasilië
+    ak: Brazil
+    am: ብራዚል
+    an: Brasil
+    ar: البَرَازِيل
+    as: ব্ৰাজিল
+    ay: Wrasil
+    az: Braziliya
+    ba: Брази́лия
+    be: Бразі́лія
+    bg: Бразилия
+    bh: ब्राज़ील
+    bi: Brazil
+    bm: Brazil
+    bn: ব্রাজিল
+    bo: པུ་རུ་ཟིལ།
+    br: Brazil
+    bs: Brazil
+    ca: Brasil
+    ce: Брази́ли
+    ch: Brazil
+    co: Brasile
+    cs: Brazílie
+    cu: Браꙁїлі́ꙗ
+    cv: Бразили
+    cy: Brasil
+    da: Brasilien
+    de: Brasilien
+    dv: ބުރެޒިލް
+    dz: བཱརཱ་ཛིལ་
+    ee: Brazil
+    el: Βραζιλία
+    en: Brazil
+    eo: Brazilo
+    es: Brasil
+    et: Brasiilia
+    eu: Brasil
+    fa: برزیل
+    ff: Barazil
+    fi: Brasilia
+    fj: Brazil
+    fo: Brasilia
+    fr: Brésil
+    fy: Brazylje
+    ga: an Bhrasaíl
+    gd: Braisil
+    gl: Brasil
+    gn: Pindoráma
+    gu: બ્રાઝિલ
+    gv: yn Vrasseel
+    ha: Brazil
+    he: ברזיל
+    hi: ब्रास़ील
+    hr: Brazil
+    ht: Brezil
+    hu: Brazília
+    hy: Բրազիլիա
+    ia: Brasil
+    id: Brasil
+    ie: Brasil
+    ig: Brazil
+    io: Brazilia
+    is: Brasilía
+    it: Brasile
+    ja: ブラジル
+    jv: Brasil
+    ka: ბრაზილია
+    kg: Brazilia
+    ki: Brazil
+    kk: Бразилия
+    kl: Brazil
+    km: ប្រេស៊ីល
+    kn: ಬ್ರೆಜಿಲ್
+    ko: 브라질
+    ks: برٛازِل
+    ku: Brazîl
+    kv: Бразилия
+    kw: Brasil
+    ky: Бразилия
+    la: Brasilia
+    lb: Brasilien
+    lg: Buraziiri
+    li: Braziel
+    ln: Brazil
+    lo: ບະເຣຊິນ
+    lt: Brazilija
+    lv: Brazīlija
+    mg: Brazila
+    mi: Parīhi
+    mk: Бразил
+    ml: ബ്രസീൽ
+    mn: Бразил
+    mr: ब्राझील
+    ms: Brazil
+    mt: Brażil
+    my: ဘရာဇီးနိုင်ငံ
+    na: Bradir
+    ne: ब्राजिल
+    nl: Brazilië
+    nn: Brasil
+    "no": Brasil
+    nv: Bwazííl
+    oc: Brasil
+    om: Biraazil
+    or: ବ୍ରାଜିଲ
+    os: Бразили
+    pa: ਬ੍ਰਾਜ਼ੀਲ
+    pi: ब्रासील
+    pl: Brazylia
+    ps: برازیل
+    pt: Brasil
+    qu: Prasil
+    rm: Brasilia
+    rn: Brazil
+    ro: Brazilia
+    ru: Бразилия
+    rw: Burezile
+    sa: ब्रासील
+    sc: Brasile
+    sd: برازيل
+    se: Brasilia
+    sh: Brazil
+    si: බ්රසීලය
+    sk: Brazília
+    sl: Brazilija
+    sm: Pasila
+    sn: Brazil
+    so: Barasiil
+    sq: Brazili
+    sr: Бразил
+    st: Brazil
+    su: Brasil
+    sv: Brasilien
+    sw: Brazil
+    ta: பிரேசில்
+    te: బ్రెజిల్
+    tg: Бразилия
+    th: บราซิล
+    ti: ብራዚል
+    tk: Braziliýa
+    tl: Brasil
+    to: Palāsili
+    tr: Brezilya
+    tt: Брази́лия
+    tw: Brazil
+    ty: Parīihi
+    ug: برازىلىيە
+    uk: Брази́лія
+    ur: برازیل
+    uz: Braziliya
+    ve: Brazil
+    vi: Brasil
+    vo: Brasilän
+    wa: Braezi
+    wo: Breesil
+    xh: Brasil
+    yi: בראַזיל
+    yo: Brasil
+    za: Bahsih
+    zh: 巴西
+    zu: IBrazili
diff --git a/settings/country-names/bs.yaml b/settings/country-names/bs.yaml
new file mode 100644 (file)
index 0000000..dcfe0fc
--- /dev/null
@@ -0,0 +1,140 @@
+name: 
+    default: The Bahamas
+    af: Bahamas
+    ak: Bahama
+    am: ባሃማስ
+    an: Bahamas
+    ar: جزر باهاماس
+    ay: Bahamas
+    az: Bahamalar
+    ba: Багама утрауҙары
+    be: Бага́мскія Астравы́
+    bg: Бахамските острови
+    bm: Bahamasi
+    bn: বাহামা দ্বীপপুঞ্জ
+    bo: བ་ཧ་མཱ་སི།
+    br: Bahamas
+    bs: Bahami
+    ca: Bahames
+    ce: Багама
+    cs: Bahamy
+    cv: Пахамсем
+    cy: Y Bahamas
+    da: Bahamas
+    de: Die Bahamas
+    dv: ބަހާމަސް
+    dz: བཱ་ཧ་མས྄།
+    ee: Bahamas
+    el: Μπαχάμες
+    en: The Bahamas
+    eo: La Bahamoj
+    es: Las Bahamas
+    et: Bahama
+    eu: Bahamak
+    fa: باهاما
+    ff: Bahamaas
+    fi: Bahama
+    fo: Bahamaoyggjar
+    fr: Les Bahamas
+    fy: De Bahama's
+    ga: na Bahámaí
+    gd: na Bahàmas
+    gl: Bahamas
+    gn: Vaamakuéra
+    gu: બહામાસ
+    gv: ny Bahamaghyn
+    he: איי בהאמה
+    hi: बहामस
+    hr: Bahami
+    ht: Il Bahamas
+    hu: Bahama-szigetek
+    hy: Բահամները
+    ia: Bahamas
+    id: Bahama
+    io: Bahama
+    is: Bahamaeyjar
+    it: Le Bahamas
+    ja: バハマ
+    jv: Bahama
+    ka: ბაჰამის კუნძულები
+    ki: Bahama
+    kk: Багам аралдары
+    km: បាហាម៉ា
+    kn: ಬಹಾಮಾಸ್
+    ko: 바하마
+    ks: بَہامَس
+    ku: Bahama
+    kw: Ynysow Bahama
+    ky: Багама аралдары
+    la: Bahamanae
+    lb: D'Bahamas
+    lg: Bahamasi
+    li: De Bahama's
+    ln: Bahamasɛ
+    lo: ບາຮາມມາສ
+    lt: Bahamos
+    lv: Bahamas
+    mg: Bahamasy
+    mk: Бахами
+    ml: ബഹാമാസ്
+    mn: Багамын Арлууд
+    mr: बहामास
+    ms: Bahamas
+    mt: Il-Baħamas
+    my: ဘဟားမားနိုင်ငံ
+    na: Bahamat
+    ne: बहामस
+    nl: Bahama's
+    nn: Bahamas
+    "no": Bahamas
+    oc: Las Bahamas
+    om: Bahamaas
+    or: ବାହାମା
+    os: Багамтæ
+    pa: ਬਹਾਮਾਸ
+    pi: बहामास
+    pl: Bahamy
+    pt: Bahamas
+    qu: Bahamakuna
+    rm: Bahamas
+    rn: Bahamasi
+    ro: Bahamas
+    ru: Багамские Острова
+    rw: Bahamasi
+    sa: बहामास
+    se: Bahamasullot
+    sg: Bahâmasa
+    sh: Bahami
+    si: බහාමාස්
+    sk: Bahamy
+    sl: Bahami
+    sn: The Bahamas
+    so: Bahamas
+    sq: Bahamet
+    sr: Бахаме
+    ss: iBhahamasi
+    su: Bahama
+    sv: Bahamas
+    sw: Bahamas
+    ta: பாகாமாசு
+    te: బహామాస్
+    tg: Баҳамас
+    th: ประเทศบาฮามาส
+    ti: ባሃማስ
+    tk: Bagama Adalary
+    tl: Bahamas
+    to: Pahama
+    tr: Bahamalar
+    tt: Багамалар
+    ug: باھاما
+    uk: Багамські Острови
+    ur: بہاماس
+    uz: Bagam orollari
+    vi: Bahamas
+    vo: Bahamuäns
+    wo: Bahamas
+    yi: די באַהאַמאַס
+    yo: Àwọn Bàhámà
+    za: Bahamas
+    zh: 巴哈马
+    zu: i-Bahamas
diff --git a/settings/country-names/bt.yaml b/settings/country-names/bt.yaml
new file mode 100644 (file)
index 0000000..d921a67
--- /dev/null
@@ -0,0 +1,150 @@
+name: 
+    default: འབྲུག་ཡུལ་
+    ab: Бутан
+    af: Bhoetan
+    ak: Butan
+    am: ቡታን
+    an: Bután
+    ar: بوتان
+    as: ভূটান
+    az: Butan
+    ba: Бута́н
+    be: Бута́н
+    bg: Бутан
+    bh: भूटान
+    bi: Bhutan
+    bn: ভুটান
+    bo: འབྲུག་ཡུལ།
+    br: Bhoutan
+    bs: Butan
+    ca: Bhutan
+    ce: Бутан
+    cs: Bhútán
+    cv: Бутан
+    cy: Bhwtan
+    da: Bhutan
+    de: Bhutan
+    dv: ބޫޓާން
+    dz: འབྲུགཡུལ་
+    el: Μπουτάν
+    en: Bhutan
+    eo: Butano
+    es: Bután
+    et: Bhutan
+    eu: Bhutan
+    fa: بوتان
+    ff: Butaan
+    fi: Bhutan
+    fo: Butan
+    fr: Bhoutan
+    fy: Bûtan
+    ga: an Bhútáin
+    gd: Butàn
+    gl: Bután
+    gn: Vutã
+    gu: ભૂતાન
+    gv: yn Vutaan
+    ha: Bhutan
+    he: בהוטן
+    hi: भूटान
+    hr: Butan
+    ht: Boutan
+    hu: Bhután
+    hy: Բութան
+    ia: Bhutan
+    id: Bhutan
+    ie: Bhutan
+    io: Bhutan
+    is: Bútan
+    it: Bhutan
+    ja: ブータン
+    jv: Bhutan
+    ka: ბჰუტანი
+    kg: Bhutan
+    ki: Bhutan
+    kk: Бутан
+    kl: Bhutan
+    km: ប៊ូតាន
+    kn: ಭೂತಾನ್
+    ko: 부탄
+    ks: بوٗٹان
+    ku: Bûtan
+    kv: Бутан
+    kw: Bhoutan
+    ky: Бутан
+    la: Butania
+    lb: Bhutan
+    lg: Butaani
+    li: Bhutan
+    ln: Butáni
+    lo: ບູຕານ
+    lt: Butanas
+    lv: Butāna
+    mg: Botàna
+    mi: Putāna
+    mk: Бутан
+    ml: ഭൂട്ടാൻ
+    mn: Бутан
+    mr: भूतान
+    ms: Bhutan
+    mt: Butan
+    my: ဘူတန်နိုင်ငံ
+    na: Butan
+    ne: भूटान
+    nl: Bhutan
+    nn: Bhutan
+    "no": Bhutan
+    nv: Bikéyah
+    oc: Botan
+    om: Buutan
+    or: ଭୁଟାନ
+    os: Бутан
+    pa: ਭੂਟਾਨ
+    pi: भूटान
+    pl: Bhutan
+    ps: بوتان
+    pt: Butão
+    qu: Butan
+    rm: Bhutan
+    rn: Butani
+    ro: Bhutan
+    ru: Бутан
+    rw: Butani
+    sa: भूटान
+    se: Bhutan
+    sg: Butäan
+    sh: Butan
+    si: භූතානය
+    sk: Bhután
+    sl: Butan
+    sn: Bhutan
+    so: Butaan
+    sq: Butani
+    sr: Бутан
+    ss: iBhuthani
+    su: Butan
+    sv: Bhutan
+    sw: Bhutan
+    ta: பூட்டான்
+    te: భూటాన్
+    tg: Бутан
+    th: ประเทศภูฏาน
+    ti: ቡህታን
+    tk: Butan
+    tl: Butan
+    to: Pūtani
+    tr: Bhutan
+    tt: Бутан
+    tw: Butan
+    ug: بۇتان
+    uk: Бута́н
+    ur: بھوٹان
+    uz: Butan
+    vi: Bhutan
+    vo: Butän
+    wo: Butaan
+    yi: בהוטאן
+    yo: Bhùtán
+    za: Budanh
+    zh: 不丹
+    zu: i-Bhutan
diff --git a/settings/country-names/bv.yaml b/settings/country-names/bv.yaml
new file mode 100644 (file)
index 0000000..6dc3bfd
--- /dev/null
@@ -0,0 +1,2 @@
+name: 
+    default: Bouvet Island
diff --git a/settings/country-names/bw.yaml b/settings/country-names/bw.yaml
new file mode 100644 (file)
index 0000000..74d1188
--- /dev/null
@@ -0,0 +1,151 @@
+name: 
+    default: Botswana
+    af: Botswana
+    ak: Bɔtswana
+    am: ቦትስዋና
+    an: Botswana
+    ar: بوتسوانا
+    az: Botsvana
+    ba: Ботсвана
+    be: Батсва́на
+    bg: Ботсвана
+    bh: बोत्सवाना
+    bm: Botswana
+    bn: বতসোয়ানা
+    bo: བྷོ་ཙི་ཝ་ན།
+    br: Botswana
+    bs: Bocvana
+    ca: Botswana
+    ce: Ботсвана
+    cs: Botswana
+    cv: Ботсвана
+    cy: Botswana
+    da: Botswana
+    de: Botsuana
+    dv: ބޮޓުސްވާނާ
+    dz: བྷོཙ་ཝ་ན
+    ee: Botswana
+    el: Μποτσουάνα
+    en: Botswana
+    eo: Bocvano
+    es: Botsuana
+    et: Botswana
+    eu: Botswana
+    fa: بوتسوانا
+    ff: Botswana
+    fi: Botswana
+    fo: Botsvana
+    fr: Botswana
+    fy: Botswana
+    ga: an Bhotsuáin
+    gd: Botsuana
+    gl: Botswana
+    gn: Votusuana
+    gu: બોત્સ્વાના
+    gv: yn Votswaan
+    ha: Botswana
+    he: בּוֹטְסְוָאנָה
+    hi: बोत्सवाना
+    hr: Bocvana
+    ht: Botswana
+    hu: Botswana
+    hy: Բոտսվանա
+    ia: Botswana
+    id: Botswana
+    ie: Botswana
+    ig: Botswana
+    io: Botswana
+    is: Botsvana
+    it: Botswana
+    ja: ボツワナ
+    jv: Botswana
+    ka: ბოტსვანა
+    kg: Botswana
+    ki: Botswana
+    kk: Ботсвана
+    km: បុតស្វាណា
+    kn: ಬೋಟ್ಸ್ವಾನ
+    ko: 보츠와나
+    ks: بوتَسوانا
+    ku: Botswana
+    kw: Botswana
+    ky: Ботсвана
+    la: Botsuana
+    lb: Botswana
+    lg: Botswana
+    li: Botswana
+    ln: Botswana
+    lo: ບອດສະວານາ
+    lt: Botsvana
+    lv: Botsvana
+    mg: Bôtsoàna
+    mi: Poriwana
+    mk: Боцвана
+    ml: ബോട്സ്വാന
+    mn: Ботсвана
+    mr: बोत्स्वाना
+    ms: Botswana
+    mt: Botswana
+    my: ဘော့ဆွာနာ သမ္မတနိုင်ငံ
+    na: Botwana
+    ne: बोत्स्वाना
+    nl: Botswana
+    nn: Botswana
+    "no": Botswana
+    nv: Tswana Dineʼé Bikéyah
+    oc: Botswana
+    om: Bootiswaanaa
+    or: ବୋସଚୱାନା
+    os: Ботсванæ
+    pa: ਬੋਤਸਵਾਨਾ
+    pi: बोत्सवाना
+    pl: Botswana
+    ps: بوتسوانا
+    pt: Botsuana
+    qu: Butswana
+    rm: Botswana
+    ro: Botswana
+    ru: Ботсвана
+    rw: Botswana
+    sa: बोत्सवाना
+    sc: Botzuana
+    se: Botswana
+    sg: Botswana
+    sh: Bocvana
+    si: බොට්ස්වානා
+    sk: Botswana
+    sl: Bocvána
+    sn: Botswana
+    so: Botswana
+    sq: Bocvana
+    sr: Боцвана
+    ss: ÉButjwána
+    st: Botswana
+    su: Botswana
+    sv: Botswana
+    sw: Botswana
+    ta: போட்சுவானா
+    te: బోత్సువానా
+    tg: Ботсвана
+    th: บอตสวานา
+    ti: ቦትስዋና
+    tk: Botswana
+    tl: Botswana
+    tn: Botswana
+    to: Potisiuana
+    tr: Botsvana
+    ts: Botswana
+    tt: Ботсва́на
+    ug: بوتسۋانا
+    uk: Ботсва́на
+    ur: بوٹسوانا
+    uz: Botsvana
+    ve: Vhu-Tswana
+    vi: Bốt-xoa-na
+    vo: Zvanän
+    wa: Boswana
+    wo: Botswana
+    yi: באצוואַנע
+    yo: Bòtswánà
+    zh: 波札那
+    zu: i-Botswana
diff --git a/settings/country-names/by.yaml b/settings/country-names/by.yaml
new file mode 100644 (file)
index 0000000..8cb34c5
--- /dev/null
@@ -0,0 +1,132 @@
+name: 
+    default: Беларусь
+    af: Wit-Rusland
+    am: ቤላሩስ
+    an: Belarrusia
+    ar: روسيا البيضاء
+    az: Belarus
+    be: Беларусь
+    bg: Беларус
+    bi: Belarus
+    bn: বেলারুশ
+    bo: བྷེ་ལ་རསུ།
+    br: Belarus
+    bs: Bjelorusija
+    ca: Bielorússia
+    ce: Белорусси
+    co: Bielorussia
+    cs: Bělorusko
+    cu: Бѣла Роусь
+    cv: Беларуç
+    cy: Belarws
+    da: Hviderusland
+    de: Belarus
+    dv: ބެލަރޫސް
+    dz: བེ་ལ་རུ་སུ།
+    ee: Belarus
+    el: Λευκορωσία
+    en: Belarus
+    eo: Belorusio
+    es: Bielorrusia
+    et: Valgevene
+    eu: Bielorrusia
+    fa: بلاروس
+    ff: Belaruusiya
+    fi: Valko-Venäjä
+    fo: Hvítarussland
+    fr: Biélorussie
+    fy: Wyt-Ruslân
+    ga: An Bhealarúis
+    gd: A' Bhealaruis
+    gl: Bielorrusia
+    gn: Vielorrusia
+    gu: બેલારુસ
+    gv: Yn Velaroosh
+    he: בלארוס
+    hi: बेलारूस
+    hr: Bjelorusija
+    ht: Byelorisi
+    hu: Fehéroroszország
+    hy: Բելառուս
+    ia: Bielorussia
+    id: Belarus
+    ie: Bielorussia
+    io: Bielorusia
+    is: Hvíta-Rússland
+    it: Bielorussia
+    ja: ベラルーシ
+    jv: Bélarus
+    ka: ბელარუსი
+    kg: Belarusia
+    kk: Беларусь
+    kl: Hvideruslandi
+    kn: ಬೆಲಾರುಸ್
+    ko: 벨라루스
+    ku: Belarûs
+    kv: Беларусь
+    kw: Belarussi
+    ky: Беларусия
+    la: Ruthenia Alba
+    lb: Wäissrussland
+    li: Wit-Rusland
+    ln: Bielorusia
+    lt: Baltarusija
+    lv: Baltkrievija
+    mi: Pērara
+    mk: Белорусија
+    ml: ബെലാറുസ്
+    mn: Беларусь
+    mr: बेलारूस
+    ms: Belarus
+    mt: Belarus
+    my: ဘီလာရုဇ်နိုင်ငံ
+    na: Berarut
+    ne: बेलारुस
+    nl: Wit-Rusland
+    nn: Kviterussland
+    "no": Hviterussland
+    oc: Bielorussia
+    or: ବେଲାଋଷ
+    os: Белорусси
+    pl: Białoruś
+    ps: بېلاروس
+    pt: Bielorrússia
+    qu: Bilarus
+    rm: Bielorussia
+    ro: Belarus
+    ru: Беларусь
+    rw: Belarusi
+    sa: बेलारूस
+    se: Vilges-Ruošša
+    sh: Belorusija
+    si: බෙලාරස්
+    sk: Bielorusko
+    sl: Belorusija
+    so: Belarus
+    sq: Bjellorusia
+    sr: Белорусија
+    ss: IBhelalasi
+    su: Bélarus
+    sv: Belarus
+    sw: Belarus
+    ta: பெலருஸ்
+    te: బెలారస్
+    tg: Беларус
+    th: ประเทศเบลารุส
+    tk: Belorussiýa
+    tl: Biyelorusya
+    tr: Beyaz Rusya
+    ts: Belarus
+    tt: Беларусия
+    ty: Belarus
+    ug: بېلورۇسسىيە
+    uk: Білорусь
+    ur: بیلاروس
+    uz: Belarus
+    vi: Belarus
+    vo: Belarusän
+    wo: Belaarus
+    yi: בעלארוס
+    yo: Bẹ̀lárùs
+    zh: 白罗斯/白羅斯
+    zu: IBelarusi
diff --git a/settings/country-names/bz.yaml b/settings/country-names/bz.yaml
new file mode 100644 (file)
index 0000000..c381f01
--- /dev/null
@@ -0,0 +1,141 @@
+name: 
+    default: Belize
+    af: Belize
+    ak: Beliz
+    am: ቤሊዝ
+    an: Belize
+    ar: بليز
+    ay: Wilisi
+    az: Beliz
+    ba: Белиз
+    be: Белі́з
+    bg: Белиз
+    bm: Belizi
+    bn: বেলিজ
+    bo: བེ་ལི་ཛི།
+    br: Belize
+    bs: Beliz
+    ca: Belize
+    ce: Бели́з
+    cs: Belize
+    cv: Белиз
+    cy: Belîs
+    da: Belize
+    de: Belize
+    dv: ބެލީޒު
+    dz: བེ་ལིཛ།
+    ee: Belize
+    el: Μπελίζ
+    en: Belize
+    eo: Belizo
+    es: Belice
+    et: Belize
+    eu: Belize
+    fa: بلیز
+    ff: Beliise
+    fi: Belize
+    fo: Belis
+    fr: Belize
+    fy: Belize
+    ga: an Bheilís
+    gd: Beilise
+    gl: Belice
+    gn: Mbelise
+    gu: બેલીઝ
+    gv: yn Veleesh
+    ha: Beliz
+    he: בליז
+    hi: बेलीज़
+    hr: Belize
+    ht: Beliz
+    hu: Belize
+    hy: Բելիզ
+    ia: Belize
+    id: Belize
+    ie: Belize
+    io: Belize
+    is: Belís
+    it: Belize
+    ja: ベリーズ
+    jv: Belize
+    ka: ბელიზი
+    kk: Бели́з
+    km: បេលីហ្ស
+    kn: ಬೆಲೀಜ್
+    ko: 벨리즈
+    ks: بیلِج
+    ku: Belîze
+    kw: Belisa
+    ky: Белиз
+    la: Beliza
+    lb: Belize
+    li: Belize
+    ln: Belize
+    lo: ເບຊີວ
+    lt: Belizas
+    lv: Beliza
+    mg: Belizy
+    mk: Белизе
+    ml: ബെലീസ്
+    mn: Белиз
+    mr: बेलिझ
+    ms: Belize
+    mt: Beliże
+    my: ဘလိဇ်
+    na: Berij
+    ne: बेलिज
+    nl: Belize
+    nn: Belize
+    "no": Belize
+    oc: Belize
+    om: Beliiz
+    or: ବେଲିଜ
+    os: Белиз
+    pa: ਬੇਲੀਜ਼
+    pi: बेलीज
+    pl: Belize
+    ps: بېلیز
+    pt: Belize
+    qu: Bilisi
+    rm: Belize
+    ro: Belize
+    ru: Белиз
+    rw: Belize
+    sa: बेलीज
+    sc: Belize
+    se: Belize
+    sg: Belîzi
+    sh: Belize
+    si: බෙලීස්
+    sk: Belize
+    sl: Belize
+    sm: Pelisi
+    sn: Belize
+    so: Belise
+    sq: Beliza
+    sr: Белизе
+    ss: iBhelizi
+    su: Bélis
+    sv: Belize
+    sw: Belize
+    ta: பெலீசு
+    te: బెలిజ్
+    tg: Белѝз
+    th: เบลีซ
+    ti: ቤሊዘ
+    tl: Belise
+    to: Pelise
+    tr: Belize
+    tt: Бели́з
+    ug: بېلىز
+    uk: Белі́з
+    ur: بیلیز
+    uz: Beliz
+    vi: Belize
+    vo: Belisän
+    wo: Beliis
+    yi: בעליז
+    yo: Bẹ̀lísè
+    za: Belize
+    zh: 伯利兹
+    zu: Belize
diff --git a/settings/country-names/ca.yaml b/settings/country-names/ca.yaml
new file mode 100644 (file)
index 0000000..eaa86a2
--- /dev/null
@@ -0,0 +1,151 @@
+name: 
+    default: Canada
+    ab: Канада
+    af: Kanada
+    am: ካናዳ
+    an: Canadá
+    ar: كندا
+    as: কানাডা
+    av: Канада
+    ay: Kanada
+    az: Kanada
+    ba: Канада
+    be: Канада
+    bg: Канада
+    bi: Kanada
+    bm: Kanada
+    bn: কানাডা
+    bo: ཁ་ན་ཌ།
+    br: Kanada
+    bs: Kanada
+    ca: Canadà
+    ce: Канада
+    co: Canadà
+    cs: Kanada
+    cu: Канада
+    cv: Канада
+    cy: Canada
+    da: Canada
+    de: Kanada
+    dv: ކެނެޑާ
+    dz: ཀེ་ན་ཌ་
+    ee: Canada
+    el: Καναδάς
+    en: Canada
+    eo: Kanado
+    es: Canadá
+    et: Kanada
+    eu: Kanada
+    fa: کانادا
+    fi: Kanada
+    fo: Kanada
+    fr: Canada
+    fy: Kanada
+    ga: Ceanada
+    gd: Canada
+    gl: Canadá
+    gn: Kanatã
+    gu: કેનેડા
+    gv: Yn Chanadey
+    ha: Kanada
+    he: קנדה
+    hi: कनाडा
+    hr: Kanada
+    ht: Kanada
+    hu: Kanada
+    hy: Կանադա
+    ia: Canada
+    id: Kanada
+    ie: Canada
+    ig: Kánada
+    ik: Kanada
+    io: Kanada
+    is: Kanada
+    it: Canada
+    iu: ᑲᓇᑕ
+    ja: カナダ
+    jv: Kanada
+    ka: კანადა
+    ki: Canada
+    kk: Канада
+    kl: Canada
+    km: កាណាដា
+    kn: ಕೆನಡಾ
+    ko: 캐나다
+    ku: Kanada
+    kv: Канада
+    kw: Kanada
+    ky: Канада
+    la: Canada
+    lb: Kanada
+    li: Canada
+    ln: Kanadá
+    lt: Kanada
+    lv: Kanāda
+    mg: Kanada
+    mi: Kānata
+    mk: Канада
+    ml: കാനഡ
+    mn: Канад
+    mr: कॅनडा
+    ms: Kanada
+    mt: Kanada
+    my: ကနေဒါနိုင်ငံ
+    na: Kanada
+    ne: क्यानाडा
+    nl: Canada
+    nn: Canada
+    "no": Canada
+    nv: Deeteel Bikéyah
+    oc: Canadà
+    om: Canada
+    or: କାନାଡ଼ା
+    os: Канадæ
+    pa: ਕੈਨੇਡਾ
+    pl: Kanada
+    ps: کاناډا
+    pt: Canadá
+    qu: Kanada
+    rm: Canada
+    rn: Kanada
+    ro: Canada
+    ru: Канада
+    rw: Kanada
+    sa: केनडा
+    sc: Canada
+    se: Kanáda
+    sg: Kanadäa
+    sh: Kanada
+    sk: Kanada
+    sl: Kanada
+    sn: Canada
+    so: Kanada
+    sq: Kanadaja
+    sr: Канада
+    ss: IKhanada
+    su: Kanada
+    sv: Kanada
+    sw: Kanada
+    ta: கனடா
+    te: కెనడా
+    tg: Канада
+    th: ประเทศแคนาดา
+    tk: Kanada
+    tl: Kanada
+    tr: Kanada
+    ts: Canada
+    tt: Канада
+    tw: Kanada
+    ty: Tanata
+    ug: كانادا
+    uk: Канада
+    ur: کینیڈا
+    uz: Kanada
+    vi: Canada
+    vo: Kanadän
+    wa: Canada
+    wo: Kanadaa
+    yi: קאנאדע
+    yo: Kánádà
+    zh: 加拿大
+    zu: IKhanada
diff --git a/settings/country-names/cc.yaml b/settings/country-names/cc.yaml
new file mode 100644 (file)
index 0000000..c5090a0
--- /dev/null
@@ -0,0 +1,37 @@
+name: 
+    default: Cocos (Keeling) Islands
+    af: Cocos (Keeling) Eilande
+    ar: جزر كوكوس (كيلينغ)
+    be: Какосавыя (Кілінг) астравы
+    br: Inizi Kokoz
+    ca: Illes Cocos
+    da: Cocosøerne
+    de: Kokosinseln
+    el: Νησιά Κόκος
+    en: Cocos (Keeling) Islands
+    eo: Kokosinsuloj
+    es: Islas Cocos (Keeling)
+    et: Kookossaared
+    eu: Cocos (Keeling) uharteak
+    fa: جزایر کوکوس
+    fi: Kookossaaret
+    fr: Îles Cocos
+    fy: de Kokoseilannen
+    he: איי קוקוס (קילינג)
+    hr: Kokosovi otoci
+    hu: Kókusz (Keeling)-szigetek
+    id: Kepulauan Cocos (Keeling)
+    is: Kókoseyjar
+    it: Isole Cocos e Keeling
+    lt: Kokoso (Keelingo) salos
+    lv: Kokosu (Kīlinga) salas
+    mn: Кокосын (Кийлингийн) Арлууд
+    nl: Cocoseilanden
+    pl: Wyspy Kokosowe
+    ru: Кокосовые острова
+    sl: Kokosovi otoki
+    sv: Kokosöarna
+    tr: Cocos (Keeling) Adaları
+    uk: Кокосові острови
+    vi: Quần đảo Cocos (Keeling)
+    zh: 科科斯(基林)群島
diff --git a/settings/country-names/cd.yaml b/settings/country-names/cd.yaml
new file mode 100644 (file)
index 0000000..69d4f5d
--- /dev/null
@@ -0,0 +1,124 @@
+name: 
+    default: République démocratique du Congo
+    af: Demokratiese Republiek van die Kongo
+    am: ኮንጎ ዲሞክራሲያዊ ሪፐብሊክ
+    an: Republica Democratica d'o Congo
+    ar: جمهورية الكونغو الديمقراطية
+    az: Konqo Demokratik Respublikası
+    be: Дэмакратычная Рэспубліка Конга
+    bg: Демократична република Конго
+    bm: Kongo ka Bɛjɛfanga Fasojamana
+    bn: গণতান্ত্রিক কঙ্গো প্রজাতন্ত্র
+    bo: ཀོང་གོ་མི་དམངས་དམངས་གཙོ།
+    br: Republik Demokratel Kongo
+    bs: Demokratska Republika Kongo
+    ca: República Democràtica del Congo
+    ce: Халкъа куьйгаллийца йолу Пачхьалкх Конго
+    cs: Demokratická republika Kongo
+    cv: Конго Демократиллĕ Республики
+    cy: Gweriniaeth Ddemocrataidd Congo
+    da: Demokratiske Republik Congo
+    de: Demokratische Republik Kongo
+    dv: ކޮންގޯ (ދިމިޤްރާޠީ ޖުމްހޫރިއްޔާ)
+    el: Λαϊκή Δημοκρατία του Κονγκό
+    en: Democratic Republic of the Congo
+    eo: Demokratia Respubliko Kongo
+    es: República Democrática del Congo
+    et: Kongo Demokraatlik Vabariik
+    eu: Kongoko Errepublika Demokratikoa
+    fa: جمهوری دموکراتیک کنگو
+    fi: Kongon demokraattinen tasavalta
+    fo: Fólkaræðiliga Lýðveldið Kongo
+    fr: République démocratique du Congo
+    fy: Demokratyske Republyk Kongo
+    ga: Poblacht Dhaonlathach an Chongó
+    gd: Poblachd Dheamocrach na Congo
+    gl: República Democrática do Congo
+    gn: Tetã Jekopytyjoja Kongo
+    gv: Pobblaght Gheynlagh ny Congo
+    ha: Jamhuriyar dimokuradiyya Kwango
+    he: הרפובליקה הדמוקרטית של קונגו
+    hi: कांगो लोकतान्त्रिक गणराज्य
+    hr: Demokratska Republika Kongo
+    hu: Kongói Demokratikus Köztársaság
+    hy: Կոնգոյի Դեմոկրատական Հանրապետություն
+    ia: Republica Democratic del Congo
+    id: Republik Demokratik Kongo
+    ie: Democratic Republic de Congo
+    io: Demokratial Republiko Kongo
+    is: Lýðræðislega Lýðveldið Kongó
+    it: Repubblica Democratica del Congo
+    ja: コンゴ民主共和国
+    jv: Republik Dhémokratis Kongo
+    ka: კონგოს დემოკრატიული რესპუბლიკა
+    kg: Repubilika ya Kongo ya Dimokalasi
+    kk: Конго Демократиялық Республикасы
+    kn: ಕಾಂಗೋ ಪ್ರಜಾಸತ್ತಾತ್ಮಕ ಗಣರಾಜ್ಯ
+    ko: 콩고 민주 공화국
+    ku: Kongoya Demokratîk
+    kw: Repoblek Werinel Kongo
+    la: Respublica Democratica Congensis
+    lb: Demokratesch Republik Kongo
+    li: Democratische Rippebliek vaan de Kongo
+    ln: Republiki ya Kongó Demokratiki
+    lt: Kongo Demokratinė Respublika
+    lv: Kongo Demokrātiskā Republika
+    mg: Repoblika Demokratikan'i Kongo
+    mi: Te Whenua o Kōngo
+    mk: Демократска Република Конго
+    ml: ഡെമോക്രാറ്റിക് റിപബ്ലിക്ക് ഓഫ് കോംഗോ
+    mn: Бүгд Найрамдах Ардчилсан Конго Улс
+    mr: काँगोचे लोकशाही प्रजासत्ताक
+    ms: Republik Demokratik Congo
+    my: ကွန်ဂိုဒီမိုကရက်တစ်သမ္မတနိုင်ငံ
+    na: Ripubrikit Engame Kongo
+    ne: प्रजातान्त्रिक गणतन्त्र कंगो
+    nl: Democratische Republiek Congo
+    nn: Den demokratiske republikken Kongo
+    "no": Den demokratiske republikken Kongo
+    nv: Kéyah Káango Shádiʼááhjí Siʼánígíí
+    oc: Republica Democratica de Còngo
+    or: କଙ୍ଗୋ
+    os: Конгойы Демократон Республикæ
+    pa: ਕਾਂਗੋ ਲੋਕਤੰਤਰੀ ਗਣਰਾਜ
+    pl: Demokratyczna Republika Konga
+    pt: República Democrática do Congo
+    qu: Kungu Runakamaq Republika
+    ro: Republica Democrată Congo
+    ru: Демократическая Республика Конго
+    rw: Repubulika Iharanira Demokarasi ya Kongo
+    sc: Repùbrica Democràtiga de su Congo
+    se: Kongo demokráhtalaš dásseváldi
+    sg: Kùodùorùosêse tî Ngunuhalëzo tî Kongö
+    sh: Demokratska Republika Kongo
+    si: කොංගෝ ප්රජාතන්ත්රවාදී ජනරජය
+    sk: Kongo (býv. Zair)
+    sl: Demokratična republika Kongo
+    sn: Democratic Republic of the Congo
+    so: Jamhuuriyada Dimuqaraadiga Kongo
+    sq: Republika Demokratike e Kongos
+    sr: Демократска Република Конго
+    ss: IKhongo
+    su: Républik Démokratik Kongo
+    sv: Demokratiska Republiken Kongo
+    sw: Jamhuri ya Kidemokrasia ya Kongo
+    ta: காங்கோ மக்களாட்சிக் குடியரசு
+    th: สาธารณรัฐประชาธิปไตยคองโก
+    tk: Kongo Demokratik Respublikasy
+    tl: Demokratikong Republika ng Konggo
+    tr: Demokratik Kongo Cumhuriyeti
+    ts: Democratic Republic of the Congo
+    tt: Конго Демократик Җөмһүрияте
+    ug: كونگو دېموكراتىك جۇمھۇرىيىتى
+    uk: Демократична Республіка Конго
+    ur: جمہوری جمہوریہ کانگو
+    uz: Kongo DR
+    vi: Cộng hòa Dân chủ Congo
+    vo: Kongoän (Repüblikän Demokratik)
+    wa: Republike democratike do Congo
+    wo: Republik Demokaraatik bu Kongóo
+    yi: דעמאקראטישע רעפובליק פון קאנגא
+    yo: Orílẹ̀-èdè Olómìnira Olóṣèlú ilẹ̀ Kóngò
+    za: Ganggoj Minzcuj Gunghozgoz
+    zh: 刚果民主共和国
+    zu: IRiphabliki Labantu weKongo
diff --git a/settings/country-names/cf.yaml b/settings/country-names/cf.yaml
new file mode 100644 (file)
index 0000000..22a17fd
--- /dev/null
@@ -0,0 +1,124 @@
+name: 
+    default: Ködörösêse tî Bêafrîka - République Centrafricaine
+    af: Sentraal-Afrikaanse Republiek
+    am: የመካከለኛው አፍሪካ ሪፐብሊክ
+    an: Republica Centroafricana
+    ar: جمهورية أفريقيا الوسطى
+    az: Mərkəzi Afrika Respublikası
+    be: Цэнтральна-Афрыканская Рэспубліка
+    bg: Централноафриканска република
+    bm: Cema Afrika Fasojamana
+    bn: মধ্য আফ্রিকান প্রজাতন্ত্র
+    bo: དབུས་ཨ་ཧྥེ་རི་ཁན་རི་པཔ་ལིཀ།
+    br: Republik Kreizafrikan
+    bs: Centralnoafrička Republika
+    ca: República Centreafricana
+    ce: Юккъерчу Африкин Республика
+    cs: Středoafrická republika
+    cy: Gweriniaeth Canolbarth Affrica
+    da: Centralafrikanske Republik
+    de: Zentralafrikanische Republik
+    dv: މެދުތެރޭ އެފްރިކާގެ ޖުމްހޫރިއްޔާ
+    ee: Central African Republic
+    el: Κεντροαφρικανική Δημοκρατία
+    en: Central African Republic
+    eo: Centr-Afriko
+    es: República Centroafricana
+    et: Kesk-Aafrika Vabariik
+    eu: Afrika Erdiko Errepublika
+    fa: جمهوری آفریقای مرکزی
+    fi: Keski-Afrikan tasavalta
+    fo: Miðafrikalýðveldið
+    fr: République Centrafricaine
+    fy: Sintraal-Afrikaanske Republyk
+    ga: Poblacht na hAfraice Láir
+    gd: Poblachd Meadhan Afraga
+    gl: República Centroafricana
+    gv: Pobblaght yn Affrick Veanagh
+    he: הרפובליקה המרכז-אפריקאית
+    hi: मध्य अफ़्रीकी गणराज्य
+    hr: Srednjoafrička Republika
+    ht: Repiblik santafrik
+    hu: Közép-afrikai Köztársaság
+    hy: Կենտրոնաաֆրիկյան Հանրապետություն
+    ia: Republica Centroafrican
+    id: Republik Afrika Tengah
+    ie: Central African Republic
+    io: Centrafrika
+    is: Mið-Afríkulýðveldið
+    it: Repubblica Centrafricana
+    ja: 中央アフリカ共和国
+    jv: Republik Afrika Tengah
+    ka: ცენტრალური აფრიკის რესპუბლიკა
+    kg: Repubilika ya Afelika ya Kati
+    kk: Орталық Африка Республикасы
+    kn: ಮಧ್ಯ ಆಫ್ರಿಕಾದ ಗಣರಾಜ್ಯ
+    ko: 중앙아프리카 공화국
+    ks: مرکٔزی اَفریٖکی جموٗریَت
+    ku: Komara Afrîkaya Navend
+    kw: Centrafrika
+    la: Respublica Africae Mediae
+    lb: Zentralafrikanesch Republik
+    li: Centraal Afrika
+    ln: Santrafríka
+    lt: Centrinės Afrikos Respublika
+    lv: Centrālāfrikas Republika
+    mi: Te Puku o Āwherika
+    mk: Централноафриканска Република
+    ml: മദ്ധ്യ ആഫ്രിക്കൻ റിപ്പബ്ലിക്ക്
+    mn: Төв Африкийн Бүгд Найрамдах Улс
+    mr: मध्य आफ्रिकेचे प्रजासत्ताक
+    ms: Republik Afrika Tengah
+    mt: Repubblika Ċentru-Afrikana
+    my: ဗဟိုအာဖရိကသမ္မတနိုင်ငံ
+    na: Ripubrikin Aprika Yugaga
+    ne: मध्य अफ्रिकी गणतन्त्र
+    nl: Centraal-Afrikaanse Republiek
+    nn: Den sentralafrikanske republikken
+    "no": Den sentralafrikanske republikk
+    nv: Naakaii Łizhinii Bikéyah Beʼałnííʼ
+    oc: Centreafrica
+    or: ସେଣ୍ଟରାଲ ଆଫ୍ରିକାନ ରିପବ୍ଲିକ
+    os: Централон Африкæйы Республикæ
+    pa: ਮੱਧ ਅਫ਼ਰੀਕੀ ਗਣਰਾਜ
+    pl: Republika Środkowoafrykańska
+    ps: د منځنی افريقا ولسمشريزه
+    pt: República da África Central
+    qu: Chawpi Aphrika Republika
+    ro: Republica Centrafricană
+    ru: Центральноафриканская Республика
+    rw: Repubulika ya Santara Afurika
+    sa: केन्द्रीय अफ्रीका गणराज्यम्
+    sc: Tzentràfrica
+    se: Gaska-Afrihká dásseváldi
+    sg: Ködörösêse tî Bêafrîka
+    sh: Srednjoafrička Republika
+    sk: Stredoafrická republika
+    sl: Srednjeafriška republika
+    sn: Central African Republic
+    so: Jamhuuriyadda Bartamaha Afrika
+    sq: Republika e Afrikës Qendrore
+    sr: Централноафричка Република
+    ss: Umkhatsi we-Afrikha
+    su: Républik Afrika Tengah
+    sv: Centralafrikanska republiken
+    sw: Jamhuri ya Afrika ya Kati
+    ta: மத்திய ஆப்பிரிக்கக் குடியரசு
+    te: సెంట్రల్ ఆఫ్రికన్ రిపబ్లిక్
+    tg: Ҷумҳурии Африқои Марказӣ
+    th: สาธารณรัฐแอฟริกากลาง
+    tk: Merkezi Afrika Respublikasy
+    tl: Republika ng Gitnang Aprika
+    tr: Orta Afrika Cumhuriyeti
+    ts: Afrika Wale Xikarhi
+    tt: Үзәк Африка Җөмһүрияте
+    ug: ئوتتۇرا ئافرىقا جۇمھۇرىيىتى
+    uk: Центральноафриканська Республіка
+    ur: وسطی افریقی جمہوریہ
+    uz: Markaziy Afrika Respublikasi
+    vi: Cộng hòa Trung Phi
+    vo: Zänoda-Frikop
+    wo: Réewum Diggu Afrig
+    yo: Orílẹ̀-èdè Olómìnira Àrin Áfríkà
+    zh: 中非共和國
+    zu: Central African Republic
diff --git a/settings/country-names/cg.yaml b/settings/country-names/cg.yaml
new file mode 100644 (file)
index 0000000..a279112
--- /dev/null
@@ -0,0 +1,120 @@
+name: 
+    default: Congo
+    af: Republiek van die Kongo
+    am: ኮንጎ ሪፐብሊክ
+    an: Republica d'o Congo
+    ar: جمهورية الكونغو
+    az: Konqo Respublikası
+    ba: Республика Конго
+    be: Рэспубліка Конга
+    bg: Република Конго
+    bm: Kongo-Brazaville
+    bn: কঙ্গো প্রজাতন্ত্র
+    bo: ཀོང་གོ་སྤྱི་མཐུན་རྒྱལ་ཁབ།
+    br: Republik Kongo
+    bs: Republika Kongo
+    ca: República del Congo
+    ce: Республика Конго
+    cs: Republika Kongo
+    cv: Конго Республики
+    cy: Gweriniaeth y Congo
+    da: Republikken Congo
+    de: Republik Kongo
+    dv: ކޮންގޯ (ޖުމްހޫރިއްޔާ)
+    el: Δημοκρατία του Κονγκό
+    en: Congo-Brazzaville
+    eo: Respubliko Kongo
+    es: República del Congo
+    et: Kongo Vabariik
+    eu: Kongoko Errepublika
+    fa: جمهوری کنگو
+    fi: Kongon tasavalta
+    fr: Congo-Brazzaville
+    fy: Republyk Kongo
+    ga: Poblacht an Chongó
+    gd: A' Chongo
+    gl: Congo
+    gv: Pobblaght ny Congo
+    he: הרפובליקה של קונגו
+    hi: कांगो गणराज्य
+    hr: Republika Kongo
+    ht: Kongo (Brazavil)
+    hu: Kongói Köztársaság
+    hy: Կոնգոյի Հանրապետություն
+    ia: Republica del Congo
+    id: Republik Kongo
+    ie: Republic de Congo
+    io: Republiko Kongo
+    is: Vestur-Kongó
+    it: Repubblica del Congo
+    ja: コンゴ共和国
+    jv: Republik Kongo
+    ka: კონგოს რესპუბლიკა
+    kg: Repubilika ya Kôngo
+    kk: Конго Республикасы
+    ko: 콩고 공화국
+    ku: Komara Kongoyê
+    kw: Repoblek Kongo
+    la: Respublica Congensis
+    lb: Republik Kongo
+    li: Kongo-Brazzaville
+    ln: Kongó-Brazzaville
+    lt: Kongo Respublika
+    lv: Kongo Republika
+    mk: Република Конго
+    ml: റിപ്പബ്ലിക്ക് ഓഫ് കോംഗോ
+    mn: Бүгд Найрамдах Конго Улс
+    mr: काँगोचे प्रजासत्ताक
+    ms: Republik Congo
+    my: ကွန်ဂိုသမ္မတနိုင်ငံ
+    na: Ripubrikin Kongo
+    ne: कङ्गो
+    nl: Congo-Brazzaville
+    nn: Kongo-Brazzaville
+    "no": Republikken Kongo
+    nv: Kéyah Káango Náhookǫsjí Siʼánígíí
+    oc: Republica de Còngo
+    os: Конгойы Республикæ
+    pa: ਕਾਂਗੋ ਗਣਰਾਜ
+    pl: Kongo
+    ps: د کانګو جمهوريت
+    pt: República do Congo
+    qu: Kungu Republika
+    ro: Republica Congo
+    ru: Республика Конго
+    rw: Kongo
+    sc: Repùbrica de su Congo
+    se: Kongo dásseváldi
+    sg: Ködörösêse tî Kongöo
+    sh: Republika Kongo
+    si: කොංගෝ ජනරජය
+    sk: Kongo (Brazzaville)
+    sl: Republika Kongo
+    sn: Republic of the Congo
+    so: Jamhuuriyadda Kongo
+    sq: Republika e Kongos
+    sr: Република Конго
+    ss: Tibuse weKhongo
+    su: Républik Kongo
+    sv: Republiken Kongo
+    sw: Jamhuri ya Kongo
+    ta: கொங்கோ குடியரசு
+    te: కాంగో రిపబ్లిక్
+    tg: Ҷумҳӯрии Конго
+    th: สาธารณรัฐคองโก
+    tk: Kongo Respublikasy
+    tl: Republika ng Konggo
+    tr: Kongo Cumhuriyeti
+    ts: Riphabliki ya Congo
+    tt: Конго Җөмһүрияте
+    ug: كونگو جۇمھۇرىيىتى
+    uk: Республіка Конго
+    ur: جمہوریہ کانگو
+    uz: Kongo Respublikasi
+    vi: Cộng hòa Congo
+    vo: Kongoän (Repüblikän)
+    wo: Kongóo-Brasaawiil
+    yi: רעפובליק פון קאנגא
+    yo: Orílẹ̀-èdè Olómìnira ilẹ̀ Kóngò
+    zh: 刚果共和国
+    zu: IKongo
diff --git a/settings/country-names/ch.yaml b/settings/country-names/ch.yaml
new file mode 100644 (file)
index 0000000..0fa5820
--- /dev/null
@@ -0,0 +1,134 @@
+name: 
+    default: Schweiz/Suisse/Svizzera/Svizra
+    af: Switserland
+    am: ስዊዘርላንድ
+    an: Suiza
+    ar: سويسرا
+    az: İsveçrə
+    ba: Швейцария
+    be: Швейцарыя
+    bg: Швейцария
+    bi: Switzerland
+    bn: Switzerland
+    bo: སུད་སི།
+    br: Suis
+    bs: Švicarska
+    ca: Suïssa
+    ce: Швейцари
+    co: Svizzera
+    cs: Švýcarsko
+    cu: Свицєра
+    cv: Швейцари
+    cy: Y Swistir
+    da: Schweiz
+    de: Schweiz
+    dv: ސުވިޒަލޭންޑު
+    dz: སུའིཊ་ཛར་ལེན་
+    ee: Switzerland
+    el: Ελβετία
+    en: Switzerland
+    eo: Svislando
+    es: Suiza
+    et: Šveits
+    eu: Suitza
+    fa: سوئیس
+    fi: Sveitsi
+    fo: Sveis
+    fr: Suisse
+    fy: Switserlân
+    ga: An Eilbhéis
+    gd: An Eilbheis
+    gl: Suíza
+    gn: Suisa
+    gu: સ્વિત્ઝરલેન્ડ
+    gv: Yn Elveeish
+    he: שוויץ
+    hi: स्विट्ज़रलैंड
+    hr: Švicarska
+    ht: Swis
+    hu: Svájc
+    hy: Շվեյցարիա
+    ia: Suissa
+    id: Swiss
+    ie: Svissia
+    io: Suisia
+    is: Sviss
+    it: Svizzera
+    ja: スイス
+    jv: Swiss
+    ka: შვეიცარია
+    kg: Suisi
+    kk: Швейцария
+    kl: Schweizi
+    kn: ಸ್ವಿಟ್ಜರ್ಲ್ಯಾಂಡ್
+    ko: 스위스
+    ku: Swîsre
+    kv: Швейцария
+    kw: Swistir
+    ky: Швейцария
+    la: Helvetia
+    lb: Schwäiz
+    li: Zweitserland
+    ln: Swisi
+    lt: Šveicarija
+    lv: Šveice
+    mg: Soisa
+    mi: Huiterangi
+    mk: Швајцарија
+    ml: സ്വിറ്റ്സര്ലാന്റ്
+    mn: Швейцари
+    mr: स्वित्झर्लंड
+    ms: Switzerland
+    mt: Żvizzera
+    my: ဆွစ်ဇာလန်နိုင်ငံ
+    na: Switzerland
+    ne: स्विजरल्याण्ड
+    nl: Zwitserland
+    nn: Sveits
+    "no": Sveits
+    nv: Swis Bikéyah
+    oc: Soïssa
+    or: ସୁଇଜରଲ୍ୟାଣ୍ଡ
+    os: Швейцари
+    pa: ਸਵਿਟਜ਼ਰਲੈਂਡ
+    pl: Szwajcaria
+    ps: سويس
+    pt: Suíça
+    qu: Suwisa
+    rm: Svizra
+    ro: Elveţia
+    ru: Швейцария
+    rw: Ubusuwisi
+    sa: स्विटजरलैंड
+    sc: Isvìtzera
+    se: Šveica
+    sh: Švajcarska
+    si: ස්විට්සර්ලන්තය
+    sk: Švajčiarsko
+    sl: Švica
+    so: Iswiizerlaan
+    sq: Zvicra
+    sr: Швајцарска
+    ss: ISwizalandi
+    su: Suis
+    sv: Schweiz
+    sw: Uswisi
+    ta: சுவிட்சர்லாந்து
+    te: స్విట్జర్లాండ్
+    tg: Швейтсария
+    th: ประเทศสวิตเซอร์แลนด์
+    tk: Şweýsariýa
+    tl: Suwisa
+    tr: İsviçre
+    tt: Швейцария
+    ug: Shwétsariye
+    uk: Швейцарія
+    ur: سویٹزر لینڈ
+    uz: Shveysariya
+    vi: Thụy Sĩ
+    vo: Jveizän
+    wo: Suwis
+    yi: שווייץ
+    yo: Swítsàlandì
+    za: Nyeiqswq
+    zh: 瑞士
diff --git a/settings/country-names/ci.yaml b/settings/country-names/ci.yaml
new file mode 100644 (file)
index 0000000..684fb05
--- /dev/null
@@ -0,0 +1,130 @@
+name: 
+    default: Côte d’Ivoire
+    af: Ivoorkus
+    am: ኮት ዲቯር
+    an: Costa de Vori
+    ar: ساحل العاج
+    az: Fil Dişi Sahili
+    be: Кот-д'Івуар
+    bg: Кот д'Ивоар
+    bm: Côte d'Ivoire
+    bn: কোত দিভোয়ার
+    bo: ཀོ་ཊི་ཌི་ཨའི་བོ་རི།
+    br: Aod an Olifant
+    bs: Obala Slonovače
+    ca: Costa d'Ivori
+    ce: Кот-д’Ивуар
+    cs: Pobřeží slonoviny
+    cv: Кот-д'Ивуар
+    cy: Côte d'Ivoire
+    da: Elfenbenskysten
+    de: Elfenbeinküste
+    dv: އައިވަރީ ކޯސްޓު
+    ee: Côte d'Ivoire
+    el: Ακτή Ελεφαντοστού
+    en: Côte d'Ivoire
+    eo: Ebur-Bordo
+    es: Costa de Marfil
+    et: Elevandiluurannik
+    eu: Boli Kosta
+    fa: ساحل عاج
+    ff: Kodduwaar
+    fi: Norsunluurannikko
+    fo: Fílabeinsstrondin
+    fr: Côte d’Ivoire
+    fy: Ivoarkust
+    ga: An Cósta Eabhair
+    gd: Costa Ìbhri
+    gl: Costa do Marfil
+    gv: Yn Clyst Iuaagagh
+    he: חוף השנהב
+    hi: कोत द'ईवोआर
+    hr: Obala Bjelokosti
+    ht: Kòt divwa
+    hu: Elefántcsontpart
+    hy: Կոտ դ'Իվուար
+    ia: Costa de Ebore
+    id: Pantai Gading
+    ie: Costa de Ivor
+    io: Ivora Rivo
+    is: Fílabeinsströndin
+    it: Costa d'Avorio
+    ja: コートジボワール
+    jv: Panté Gadhing
+    ka: კოტ-დ’ივუარი
+    kg: Côte d'Ivoire
+    ki: Côte d'Ivoire
+    kk: Кот-д-Ивуар
+    kn: ಕೋತ್ ದ್'ಇವಾರ್
+    ko: 코트디부아르
+    ku: Peravê Diranfîl
+    kw: Côte d'Ivoire
+    la: Litus Eburneum
+    lb: Elfebeeküst
+    li: Ivoorkös
+    ln: Kotdivuar
+    lt: Dramblio Kaulo Krantas
+    lv: Kotdivuāra
+    mg: Côte d'Ivoire
+    mi: Te Tai Rei
+    mk: Брег на Слоновата Коска
+    ml: ഐവറി കോസ്റ്റ്
+    mn: Кот д'Ивуар
+    mr: कोत द'ईवोआर
+    ms: Ivory Coast
+    mt: Kosta tal-Avorju
+    my: အိုင်ဗရီကို့စ်နိုင်ငံ
+    na: Aibori Kot
+    ne: आइभरी कोस्ट
+    nl: Ivoorkust
+    nn: Elfenbeinskysten
+    "no": Elfenbenskysten
+    nv: Chį́į́h Yee Adilohii Bideeʼ Tónteel Bibąąh
+    oc: Còsta d'Evòri
+    or: ଆଇଭେରି କୋଷ୍ଟ
+    os: Кот-д’Ивуар
+    pa: ਦੰਦ ਖੰਡ ਤਟ
+    pl: Wybrzeże Kości Słoniowej
+    ps: عاج ساحل
+    pt: Costa do Marfim
+    qu: Marphil Chala
+    rm: Costa d'Ivur
+    ro: Coasta de Fildeș
+    ru: Кот-д’Ивуар
+    rw: Kote Divuwari
+    sa: कोट ऐवरी
+    sc: Costa de Avòriu
+    se: Elefántačalánriddu
+    sg: Kôdivüära
+    sh: Obala Slonovače
+    si: අයිවරි කෝස්ට්
+    sk: Pobrežie Slonoviny
+    sl: Slonokoščena obala
+    sn: Côte d'Ivoire
+    so: Xeebta Foolmaroodi
+    sq: Bregu i Fildishtë
+    sr: Обала Слоноваче
+    ss: Lugu Lwempondvondlovu
+    su: Basisir Gading
+    sv: Elfenbenskusten
+    sw: Cote d'Ivoire
+    ta: கோட் டிவார்
+    te: కోటె డి ఐవొరి
+    tg: Кот-д'Ивуар
+    th: ประเทศโกตดิวัวร์
+    tk: Kot-d’Iwuar
+    tl: Baybaying Garing
+    tr: Fildişi Sahili
+    ts: Côte d'Ivoire
+    tt: Кот-д’Ивуар
+    ug: پىل چىشى قىرغىغى
+    uk: Кот-д'Івуар
+    ur: کوت داوواغ
+    uz: Kot-d‘ivuar
+    vi: Bờ Biển Ngà
+    vo: Viorajolän
+    wo: Kodiwaar
+    yi: בארטן פון העלפאנדביין
+    yo: Côte d'Ivoire
+    zh: 科特迪瓦
+    zu: Ugu Emhlophe
diff --git a/settings/country-names/ck.yaml b/settings/country-names/ck.yaml
new file mode 100644 (file)
index 0000000..51decfb
--- /dev/null
@@ -0,0 +1,126 @@
+name: 
+    default: Kūki 'Āirani
+    af: Cookeilande
+    ak: Kook Nsupɔw
+    am: ኩክ ደሴቶች
+    an: islas Cook
+    ar: جزر كوك
+    az: Kuk adaları
+    ba: Кук Утрауҙары
+    be: Астравы Кука
+    bg: Острови Кук
+    bm: Kuki Gun
+    bn: কুক দ্বীপপুঞ্জ
+    bo: ཀཱུག གླིང་ཕྲེན་རྒྱལ་ཁབ།
+    br: Inizi Cook
+    bs: Cookova Ostrva
+    ca: Illes Cook
+    cs: Cookovy ostrovy
+    cy: Ynysoedd Cook
+    da: Cook-øerne
+    de: Cookinseln
+    dv: ކުކް ޖަޒީރާ
+    dz: ཀུག་གླིང་ཚོམ
+    ee: Kook ƒudomekpo nutome
+    el: Νήσοι Κουκ
+    en: Cook Islands
+    eo: Kukinsuloj
+    es: Islas Cook
+    et: Cooki saared
+    eu: Cook uharteak
+    fa: جزایر کوک
+    ff: Duuɗe Kuuk
+    fi: Cookinsaaret
+    fo: Cooksoyggjarnar
+    fr: Îles Cook
+    fy: de Cookeilannen
+    ga: Oileáin Cook
+    gd: Eileanan Cook
+    gl: Illas Cook
+    gu: કુક આઇલેન્ડ્સ
+    ha: Tsibiran Kuku
+    he: איי קוּק
+    hi: कुक द्वीपसमूह
+    hr: Cookovo Otočje
+    hu: Cook-szigetek
+    hy: Կուկի կղզիներ
+    ia: Insulas Cook
+    id: Kepulauan Cook
+    io: Insuli Cook
+    is: Cooks-eyjar
+    it: Isole Cook
+    ja: クック諸島
+    jv: Kapuloan Cook
+    ka: კუკის კუნძულები
+    ki: Visiwa vya Cook
+    kk: Кук аралдары
+    kl: Cook qeqertaq
+    km: កោះ​ខូក
+    kn: ಕುಕ್ ದ್ವೀಪಗಳು
+    ko: 쿡 제도
+    ks: کُک جٔزیٖرٕ
+    ku: Giravên Cook
+    kw: Ynysow Cook
+    ky: Кук аралдары
+    la: Insulae de Cook
+    lb: Cookinseln
+    lg: Bizinga bya Kkuki
+    li: Cookeilenj
+    ln: Bisanga bya Kookɛ
+    lo: ຫມູ່ເກາະຄຸກ
+    lt: Kuko Salos
+    lv: Kuka Salas
+    mg: Nosy Kook
+    mi: Kuki Airani
+    mk: Кукови Острови
+    ml: കൂക്ക് ദ്വീപുകൾ
+    mn: Күүкийн Арлууд
+    mr: कूक द्वीपसमूह
+    ms: Kepulauan Cook
+    mt: Gżejjer Cook
+    my: ကွတ် ကျွန်းစု
+    ne: कुक टापु
+    nl: Cookeilanden
+    nn: Cookøyane
+    "no": Cookøyene
+    oc: Illas Cook
+    or: କୁକ୍ ଆଇସଲ୍ୟାଣ୍ଡ
+    os: Кучы сакъадæхтæ
+    pa: ਕੁੱਕ ਟਾਪੂ
+    pl: Wyspy Cooka
+    pt: Ilhas Cook
+    rm: Inslas Cook
+    rn: Izinga rya Kuku
+    ro: Insulele Cook
+    ru: Острова Кука
+    rw: Ibirwa bya Kuke
+    se: Cook-sullot
+    sg: âzûâ Kûku
+    sh: Kukova Ostrva
+    si: කුක් දිවයින්
+    sk: Cookove ostrovy
+    sl: Cookovi otoki
+    sn: Zvitsuwa zveCook
+    so: Jaziiradda Cook
+    sq: Ishulli Kuk
+    sr: Кукова Острва
+    su: Kapuloan Cook
+    sv: Cooköarna
+    sw: Visiwa vya Cook
+    ta: குக் தீவுகள்
+    te: కుక్ దీవులు
+    th: หมู่เกาะคุก
+    ti: ኩክ ደሴቶች
+    tl: Kapuluang Cook
+    to: ʻOtumotu Kuki
+    tr: Cook Adaları
+    tt: Кук утраулары
+    ug: Kuk Taqim Aralliri
+    uk: Острови́ Ку́ка
+    ur: جزائر کک
+    uz: Kuk orollari
+    vi: Quần đảo Cook
+    wo: Dunu Kook
+    yo: Orílẹ́ède Etíokun Kùúkù
+    zh: 庫克群島
+    zu: i-Cook Islands
diff --git a/settings/country-names/cl.yaml b/settings/country-names/cl.yaml
new file mode 100644 (file)
index 0000000..b5e5bf9
--- /dev/null
@@ -0,0 +1,172 @@
+name: 
+    default: Chile
+    ab: Чили
+    af: Chili
+    ak: Chile
+    am: ቺሌ
+    an: Chile
+    ar: تشيلي
+    as: চিলি
+    av: Чили
+    ay: Chili
+    az: Çili
+    ba: Чи́ли
+    be: Чылі
+    bg: Чили
+    bh: चिली
+    bi: Chile
+    bm: Chile
+    bn: চিলি
+    bo: ཅི་ལི།
+    br: Chile
+    bs: Čile
+    ca: Xile
+    ce: Чили
+    ch: Chile
+    co: Cile
+    cs: Chile
+    cu: Чилє
+    cv: Чили
+    cy: Chile
+    da: Chile
+    de: Chile
+    dv: ޗިލީ
+    dz: ཅི་ལེ
+    ee: Chile
+    el: Χιλή
+    en: Chile
+    eo: Ĉilio
+    es: Chile
+    et: Tšiili
+    eu: Txile
+    fa: شیلی
+    ff: Ciile
+    fi: Chile
+    fj: Chile
+    fo: Kili
+    fr: Chili
+    fy: Sily
+    ga: an tSile
+    gd: an t-Sile
+    gl: Chile
+    gn: Chile
+    gu: ચીલી
+    gv: yn Çhillee
+    ha: Chile
+    he: צ'ילה
+    hi: चिली
+    hr: Čile
+    ht: Chili
+    hu: Chile
+    hy: Չիլի
+    ia: Chile
+    id: Chili
+    ie: Chile
+    ig: Chile
+    ik: Cili
+    io: Chili
+    is: Síle
+    it: Cile
+    iu: ᓯᓕ
+    ja: チリ
+    jv: Chili
+    ka: ჩილე
+    kg: Chile
+    ki: Chile
+    kk: Чили
+    kl: Chile
+    km: ឈីលី
+    kn: ಚಿಲಿ
+    ko: 칠레
+    ks: چِلی
+    ku: Şîle
+    kv: Чили
+    kw: Chile
+    ky: Чили
+    la: Chilia
+    lb: Chile
+    lg: Chile
+    li: Chili
+    ln: Shili
+    lo: ປະເທດຈີເລ
+    lt: Čilė
+    lv: Čīle
+    mg: Silia
+    mi: Hiri
+    mk: Чиле
+    ml: ചിലി
+    mn: Чили
+    mr: चिली
+    ms: Chile
+    mt: Ċili
+    my: ချီလီနိုင်ငံ
+    na: Tsire
+    ne: चिली
+    nl: Chili
+    nn: Chile
+    "no": Chile
+    nv: Chíilii
+    ny: Chile
+    oc: Chile
+    om: Chiilii
+    or: ଚିଲି
+    os: Чили
+    pa: ਚਿਲੀ
+    pi: चिले
+    pl: Chile
+    ps: چېلي
+    pt: Chile
+    qu: Chili
+    rm: Chile
+    rn: Chile
+    ro: Chile
+    ru: Чили
+    rw: Shili
+    sa: चिले
+    sc: Cile
+    sd: چلي
+    se: Chile
+    sg: Shilïi
+    sh: Čile
+    si: චිලි
+    sk: Čile
+    sl: Čile
+    sm: Shili
+    sn: Chile
+    so: Jili
+    sq: Kilia
+    sr: Чиле
+    ss: iShile
+    st: Chile
+    su: Cilé
+    sv: Chile
+    sw: Chile
+    ta: சிலி
+    te: చిలీ
+    tg: Чиле
+    th: ชิลี
+    ti: ቺሌ
+    tk: Çili
+    tl: Chile
+    tn: Chile
+    to: Sile
+    tr: Şili
+    ts: Chile
+    tt: Чи́ли
+    tw: Kyili
+    ty: Tīri
+    ug: چىلى
+    uk: Чи́лі
+    ur: چلی
+    uz: Chili
+    ve: Shile
+    vi: Chi-lê
+    vo: Cilän
+    wa: Tchili
+    wo: Ciili
+    xh: iChile
+    yi: טשילע
+    yo: Tsílè
+    za: Chile
+    zh: 智利
+    zu: ITshile
diff --git a/settings/country-names/cm.yaml b/settings/country-names/cm.yaml
new file mode 100644 (file)
index 0000000..d928aba
--- /dev/null
@@ -0,0 +1,131 @@
+name: 
+    default: Cameroun
+    af: Kameroen
+    am: ካሜሩን
+    an: Camerún
+    ar: الكاميرون
+    az: Kamerun
+    ba: Камерун
+    be: Камерун
+    bg: Камерун
+    bm: Kamerun
+    bn: ক্যামেরুন
+    bo: ཁམ་མུ་རོན།
+    br: Kameroun
+    bs: Kamerun
+    ca: Camerun
+    cs: Kamerun
+    cv: Камерун
+    cy: Camerŵn
+    da: Cameroun
+    de: Kamerun
+    dv: ކެމަރޫން
+    ee: Cameroon
+    el: Καμερούν
+    en: Cameroon
+    eo: Kameruno
+    es: Camerún
+    et: Kamerun
+    eu: Kamerun
+    fa: کامرون
+    ff: Kamerun
+    fi: Kamerun
+    fo: Kamerun
+    fr: Cameroun
+    fy: Kameroen
+    ga: Camarún
+    gd: Camarun
+    gl: Camerún
+    gv: Cameroon
+    ha: Kameru
+    he: קמרון
+    hi: कैमरुन
+    hr: Kamerun
+    ht: Kamewoun
+    hu: Kamerun
+    hy: Կամերուն
+    ia: Camerun
+    id: Kamerun
+    ie: Cameroon
+    ig: Kameroon
+    io: Kamerun
+    is: Kamerún
+    it: Camerun
+    ja: カメルーン
+    jv: Kamerun
+    ka: კამერუნი
+    kg: Kamerun
+    ki: Cameroon
+    kk: Камерун
+    kn: ಕ್ಯಾಮರೂನ್
+    ko: 카메룬
+    ks: کیٚمِروٗن
+    ku: Kamerûn
+    kw: Kameroun
+    la: Cameronia
+    lb: Kamerun
+    li: Kameroen
+    ln: Kamerun
+    lt: Kamerūnas
+    lv: Kamerūna
+    mi: Kamarūna
+    mk: Камерун
+    ml: കാമറൂൺ
+    mn: Камерун
+    mr: कामेरून
+    ms: Cameroon
+    mt: Kamerun
+    my: ကင်မရွန်းနိုင်ငံ
+    na: Kamerun
+    ne: क्यामेरून
+    nl: Kameroen
+    nn: Kamerun
+    "no": Kamerun
+    nv: Táłtłʼááh Chʼosh Daadánígíí Bitooh
+    oc: Cameron
+    or: କାମେରୁନ
+    os: Камерун
+    pa: ਕੈਮਰੂਨ
+    pl: Kamerun
+    ps: کامرون
+    pt: Camarões
+    qu: Kamirun
+    rm: Camerun
+    ro: Camerun
+    ru: Камерун
+    rw: Kameruni
+    sa: केमेरून
+    sc: Camerùn
+    se: Kamerun
+    sg: Kamerün
+    sh: Kamerun
+    sk: Kamerun
+    sl: Kamerun
+    sn: Cameroon
+    so: Kamiruun
+    sq: Kameruni
+    sr: Камерун
+    ss: IKhameruni
+    su: Kamerun
+    sv: Kamerun
+    sw: Kamerun
+    ta: கமரூன்
+    te: కామెరూన్
+    tg: Камерун
+    th: ประเทศแคเมอรูน
+    tk: Kamerun
+    tl: Kamerun
+    tr: Kamerun
+    ts: Cameroon
+    tt: Камерун
+    ug: كامېرۇن
+    uk: Камерун
+    ur: کیمرون
+    uz: Kamerun
+    vi: Cameroon
+    vo: Kamerunän
+    wo: Kamerun
+    yi: קאמערון
+    yo: Kamẹrúùn
+    zh: 喀麦隆
+    zu: IKamerooni
diff --git a/settings/country-names/cn.yaml b/settings/country-names/cn.yaml
new file mode 100644 (file)
index 0000000..2098108
--- /dev/null
@@ -0,0 +1,170 @@
+name: 
+    default: 中国
+    ab: Чынҭ
+    af: China
+    ak: China
+    am: የቻይና
+    an: China
+    ar: الصين
+    as: চীন
+    av: Чин
+    ay: China
+    az: Çin
+    ba: Ҡытай
+    be: Кітай
+    bg: Китай
+    bh: चीन
+    bi: Jaena
+    bm: China
+    bn: গণচীন
+    bo: ཀྲུང་གོ།
+    br: Sina
+    bs: Kina
+    ca: Xina
+    ce: Цийн-мохк
+    ch: China
+    co: China
+    cs: Čína
+    cu: Срѣдинꙗнє
+    cv: Китай
+    cy: Tsieina
+    da: Kina
+    de: China
+    dv: ސީނުކަރަ
+    dz: རྒྱ་ནག
+    ee: China
+    el: Κίνα
+    en: China
+    eo: Ĉinio
+    es: China
+    et: Hiina
+    eu: Txina
+    fa: چین
+    ff: Ciina
+    fi: Kiina
+    fj: Jaina
+    fo: Kina
+    fr: Chine
+    fy: Sina
+    ga: Síne
+    gd: Sìona
+    gl: China
+    gn: Chína
+    gu: ચીન
+    gv: Sheen
+    ha: Sin
+    he: סין
+    hi: चीनी
+    hr: Kina
+    ht: Chin
+    hu: Kína
+    hy: Չինաստան
+    ia: China
+    id: Tiongkok
+    ie: China
+    ig: Chaina
+    ik: China
+    io: Chinia
+    is: Kína
+    it: Cina
+    iu: ᓴᐃᓇ
+    ja: 中国
+    jv: Cina
+    ka: ჩინეთი
+    kg: Sina
+    ki: China
+    kk: Қытай
+    kl: Kina
+    km: ចិន
+    kn: ಚೀನಿ
+    ko: 중국
+    ks: چیٖن
+    ku: Çîn
+    kv: Китай
+    kw: China
+    ky: Кытай
+    la: Sinae
+    lb: China
+    lg: Cayina
+    li: China
+    ln: Sína
+    lo: ປະເທດຈີນ
+    lt: Kinija
+    lv: Ķīna
+    mg: Sina
+    mi: Haina
+    mk: Кина
+    ml: ചീന
+    mn: Хятад
+    mr: चीन
+    ms: China
+    mt: Ċina
+    my: တရုတ်
+    na: Tsiene
+    nb: Kina
+    ne: चीन
+    nl: China
+    nn: Kina
+    "no": Kina
+    nv: Tsiiʼyishbizhí Dineʼé Bikéyah
+    ny: China
+    oc: China
+    om: Chaayinaan
+    or: ଚୀନ
+    os: Китай
+    pa: ਚੀਨ
+    pl: Chiny
+    ps: چين
+    pt: China
+    qu: Chunkuk
+    rm: China
+    rn: Ubushinwa
+    ro: China
+    ru: Китай
+    rw: Ubushinwa
+    sc: Cina
+    sd: چين
+    se: Kiinná
+    sg: Sînä
+    sh: Kina
+    si: චීනය
+    sk: Čína
+    sl: Kitájska
+    sm: Saina
+    sn: China
+    so: Shiinaha
+    sq: Kina
+    sr: Кина
+    ss: iShayina
+    st: Tjhaena
+    su: Tiongkok
+    sv: Kina
+    sw: China
+    ta: சீனா
+    te: చైనా
+    tg: Хито́й
+    th: ประเทศจีน
+    ti: የቻይና
+    tk: Hytaý
+    tl: Tsina
+    tn: China
+    to: Siaina
+    tr: Çin
+    ts: Chayina
+    tt: Кытай
+    tw: China
+    ty: Tinitō
+    ug: جۇڭخۇا خەلق جۇمھۇرىيىتى
+    uk: Кита́йська
+    ur: چین
+    uz: Xitoy
+    ve: China
+    vi: Trung Quốc
+    vo: Tsyinän
+    wo: Siin
+    xh: IShayina
+    yi: כינע
+    yo: Ṣáínà
+    za: Cunghgoz
+    zh: 中国
+    zu: IShayina
diff --git a/settings/country-names/co.yaml b/settings/country-names/co.yaml
new file mode 100644 (file)
index 0000000..e65a86d
--- /dev/null
@@ -0,0 +1,130 @@
+name: 
+    default: Colombia
+    af: Colombia
+    am: ኮሎምቢያ
+    an: Colombia
+    ar: كولومبيا
+    ay: Kuluwya
+    az: Kolumbiya
+    ba: Колумбия
+    be: Калумбія
+    bg: Колумбия
+    bi: Colombia
+    bn: কলম্বিয়া
+    bo: ཁོ་ལོམ་བི་ཡ།
+    br: Kolombia
+    bs: Kolumbija
+    ca: Colòmbia
+    ce: Колумби
+    co: Colombia
+    cs: Kolumbie
+    cv: Колумби
+    cy: Colombia
+    da: Colombia
+    de: Kolumbien
+    dv: ކޮލަންބިއާ
+    dz: ཀོ་ལོམ་བི་ཡ
+    ee: Colombia
+    el: Κολομβία
+    en: Colombia
+    eo: Kolombio
+    es: Colombia
+    et: Colombia
+    eu: Kolonbia
+    fa: کلمبیا
+    fi: Kolumbia
+    fo: Kolumbia
+    fr: Colombie
+    fy: Kolombia
+    ga: An Cholóim
+    gd: Coloimbia
+    gl: Colombia
+    gn: Kolómbia
+    gu: કોલમ્બિયા
+    gv: Yn Cholombey
+    he: קולומביה
+    hi: कोलम्बिया
+    hr: Kolumbija
+    ht: Kolonbi
+    hu: Kolumbia
+    hy: Կոլումբիա
+    ia: Colombia
+    id: Kolombia
+    ie: Columbia
+    io: Kolumbia
+    is: Kólumbía
+    it: Colombia
+    ja: コロンビア
+    jv: Kolombia
+    ka: კოლუმბია
+    kk: Колумбия Республикасы
+    kl: Colombia
+    km: កូឡុំប៊ី
+    kn: ಕೊಲೊಂಬಿಯ
+    ko: 콜롬비아
+    ku: Kolombiya
+    kw: Kolombi
+    la: Columbia
+    lb: Kolumbien
+    li: Colombia
+    ln: Kolombi
+    lt: Kolumbija
+    lv: Kolumbija
+    mg: Kolombia
+    mi: Koromōpia
+    mk: Колумбија
+    ml: കൊളംബിയ
+    mn: Колумб
+    mr: कोलंबिया
+    ms: Colombia
+    mt: Kolombja
+    my: ကိုလံဘီယာနိုင်ငံ
+    na: Korombiya
+    ne: कोलम्बिया
+    nl: Colombia
+    nn: Colombia
+    "no": Colombia
+    nv: Kolámbiya
+    oc: Colómbia
+    om: Colombia
+    or: କଲୋମ୍ବିଆ
+    os: Колумби
+    pa: ਕੋਲੰਬੀਆ
+    pl: Kolumbia
+    pt: Colômbia
+    qu: Kulumbya
+    rm: Columbia
+    ro: Columbia
+    ru: Колумбия
+    rw: Kolombiya
+    sa: कोलोम्बिया
+    se: Colombia
+    sh: Kolumbija
+    sk: Kolumbia
+    sl: Kolumbija
+    so: Kolombiya
+    sq: Kolumbia
+    sr: Колумбија
+    su: Kolombia
+    sv: Colombia
+    sw: Kolombia
+    ta: கொலொம்பியா
+    te: కొలంబియా
+    tg: Кулумбия
+    th: ประเทศโคลอมเบีย
+    tl: Colombia
+    tr: Kolombiya
+    ts: Colombia
+    tt: Колумбия
+    ug: كولومبىيە
+    uk: Колумбія
+    ur: کولمبیا
+    uz: Kolumbiya
+    vi: Colombia
+    vo: Kolumbän
+    wo: Koloombi
+    xh: IsiColombia
+    yi: קאלאמביע
+    yo: Kòlómbìà
+    zh: 哥伦比亚
+    zu: IKolombiya
diff --git a/settings/country-names/cr.yaml b/settings/country-names/cr.yaml
new file mode 100644 (file)
index 0000000..e2609b8
--- /dev/null
@@ -0,0 +1,132 @@
+name: 
+    default: Costa Rica
+    ab: Коста-Рика
+    af: Costa Rica
+    am: ኮስታ ሪካ
+    an: Costa Rica
+    ar: كوستاريكا
+    ay: Kustarika
+    az: Kosta-Rika
+    ba: Коста-Рика
+    be: Коста-Рыка
+    bg: Коста Рика
+    bh: कोस्टा रिका
+    bm: Kosta Rika
+    bn: কোস্টা রিকা
+    bo: ཁོ་ས་ཏ་རི་ཁ
+    br: Costa Rica
+    bs: Kostarika
+    ca: Costa Rica
+    ce: Коста-Рика
+    cs: Kostarika
+    cy: Costa Rica
+    da: Costa Rica
+    de: Costa Rica
+    dv: ކޮސްޓަރީކާ
+    ee: Costa Rica
+    el: Κόστα Ρίκα
+    en: Costa Rica
+    eo: Kostariko
+    es: Costa Rica
+    et: Costa Rica
+    eu: Costa Rica
+    fa: کاستاریکا
+    fi: Costa Rica
+    fo: Kosta Rika
+    fr: Costa Rica
+    fy: Kosta Rika
+    ga: Cósta Ríce
+    gd: Costa Rica
+    gl: Costa Rica
+    gn: Kosta Rrika
+    gv: Yn Coose Berçhagh
+    he: קוסטה ריקה
+    hi: कोस्टा रीका
+    hr: Kostarika
+    ht: Kostarika
+    hu: Costa Rica
+    hy: Կոստա Ռիկա
+    ia: Costa Rica
+    id: Kosta Rika
+    ie: Costa Rica
+    io: Kosta Rika
+    is: Kosta Ríka
+    it: Costa Rica
+    ja: コスタリカ
+    jv: Kosta Rika
+    ka: კოსტა-რიკა
+    kk: Коста-Рика
+    kn: ಕೋಸ್ಟಾ ರಿಕ
+    ko: 코스타리카
+    ku: Kosta Rîka
+    kv: Коста-Рика
+    kw: Kosta Rika
+    ky: Коста-Рика
+    la: Ora Opulenta
+    lb: Costa Rica
+    li: Costa Rica
+    ln: Kosta Rika
+    lo: ປະເທດກົດສະຕາລິກາ
+    lt: Kosta Rika
+    lv: Kostarika
+    mg: Costa Rica
+    mi: Koto Rika
+    mk: Костарика
+    ml: കോസ്റ്റ റീക്ക
+    mn: Коста-Рика
+    mr: कोस्टा रिका
+    ms: Costa Rica
+    mt: Kosta Rika
+    my: ကော့စတာရီကာနိုင်ငံ
+    na: Kosta Rika
+    ne: कोस्टारिका
+    nl: Costa Rica
+    nn: Costa Rica
+    "no": Costa Rica
+    oc: Còsta Rica
+    om: Kostaa Rikaa
+    or: କୋଷ୍ଟାରିକା
+    os: Коста-Рикæ
+    pa: ਕੋਸਤਾ ਰੀਕਾ
+    pi: कोस्टा रीका
+    pl: Kostaryka
+    ps: کوسټاریکا
+    pt: Costa Rica
+    qu: Kustarika
+    ro: Costa Rica
+    ru: Коста-Рика
+    rw: Kosita Rika
+    sa: कोस्टा रीका
+    se: Costa Rica
+    sh: Kostarika
+    si: කෝස්ට රිකා
+    sk: Kostarika
+    sl: Kostarika
+    sm: Kosta Rika
+    so: Kosta Rika
+    sq: Kosta Rika
+    sr: Костарика
+    ss: IKhosta-Likha
+    su: Kosta Rika
+    sv: Costa Rica
+    sw: Kosta Rika
+    ta: கோஸ்ட்டா ரிக்கா
+    te: కోస్టారీకా
+    tg: Коста Рика
+    th: ประเทศคอสตาริกา
+    tk: Kosta-Rika
+    tl: Costa Rica
+    tr: Kosta Rika
+    tt: Коста-Рика
+    ug: كوستارىكا
+    uk: Коста-Рика
+    ur: کوسٹاریکا
+    uz: Kosta Rika
+    vi: Costa Rica
+    vo: Kostarikän
+    wa: Costa Rica
+    wo: Kosta Riika
+    yi: קאסטא ריקא
+    yo: Kóstá Rikà
+    zh: 哥斯达黎加
+    zu: Costa Rica
diff --git a/settings/country-names/cu.yaml b/settings/country-names/cu.yaml
new file mode 100644 (file)
index 0000000..58d3d10
--- /dev/null
@@ -0,0 +1,127 @@
+name: 
+    default: Cuba
+    af: Kuba
+    am: ኩባ
+    an: Cuba
+    ar: كوبا
+    ay: Kuba
+    az: Kuba
+    ba: Куба
+    be: Куба
+    bg: Куба
+    bm: Kuba
+    bn: কিউবা
+    bo: ཀུ་བ།
+    br: Kuba
+    bs: Kuba
+    ca: Cuba
+    ce: Куба
+    cs: Kuba
+    cv: Куба
+    cy: Cuba
+    da: Cuba
+    de: Kuba
+    dv: ކިއުބާ
+    ee: Cuba
+    el: Κούβα
+    en: Cuba
+    eo: Kubo
+    es: Cuba
+    et: Kuuba
+    eu: Kuba
+    fa: کوبا
+    fi: Kuuba
+    fo: Kuba
+    fr: Cuba
+    fy: Kuba
+    ga: Cúba
+    gd: Cùba
+    gl: Cuba
+    gn: Kuva
+    gv: Yn Choobey
+    he: קובה
+    hi: क्यूबा
+    hr: Kuba
+    ht: Kiba
+    hu: Kuba
+    hy: Կուբա
+    ia: Cuba
+    id: Kuba
+    io: Kuba
+    is: Kúba
+    it: Cuba
+    iu: ᖂᐹ
+    ja: キューバ
+    jv: Kuba
+    ka: კუბა
+    kk: Куба
+    km: គុយបា
+    kn: ಕ್ಯೂಬಾ
+    ko: 쿠바
+    ku: Kûba
+    kv: Куба
+    kw: Kuba
+    la: Cuba
+    lb: Kuba
+    li: Cuba
+    ln: Kuba
+    lt: Kuba
+    lv: Kuba
+    mi: Kiupa
+    mk: Куба
+    ml: ക്യൂബ
+    mn: Куба
+    mr: क्युबा
+    ms: Cuba
+    mt: Kuba
+    my: ကျူးဘားနိုင်ငံ
+    na: Kiuba
+    ne: क्युबा
+    nl: Cuba
+    nn: Cuba
+    "no": Cuba
+    nv: Kyóoba
+    oc: Cuba
+    or: କ୍ୟୁବା
+    os: Кубæ
+    pa: ਕਿਊਬਾ
+    pl: Kuba
+    pt: Cuba
+    qu: Kuba
+    ro: Cuba
+    ru: Куба
+    rw: Kiba
+    sa: क्यूबा
+    sc: Cuba
+    se: Cuba
+    sh: Kuba
+    si: කියුබාව
+    sk: Kuba
+    sl: Kuba
+    so: Kuuba
+    sq: Kuba
+    sr: Куба
+    ss: IKhuyubha
+    su: Kuba
+    sv: Kuba
+    sw: Kuba
+    ta: கூபா
+    te: క్యూబా
+    tg: Кубо
+    th: ประเทศคิวบา
+    tk: Kuba
+    tl: Kuba
+    tr: Küba
+    tt: Куба
+    ug: كۇبا
+    uk: Куба
+    ur: کیوبا
+    uz: Kuba
+    vi: Cuba
+    vo: Kubeän
+    wa: Couba
+    wo: Kubaa
+    yi: קובא
+    yo: Kúbà
+    za: Gujbah
+    zh: 古巴
diff --git a/settings/country-names/cv.yaml b/settings/country-names/cv.yaml
new file mode 100644 (file)
index 0000000..51a07a3
--- /dev/null
@@ -0,0 +1,52 @@
+name: 
+    default: Cabo Verde
+    af: Kaap Verde
+    ar: الرأس الأخضر
+    be: Каба-Вердэ
+    br: Kab Glas
+    ca: Cap Verd
+    cs: Kapverdy
+    cy: Cabo Verde
+    da: Kap Verde
+    de: Kap Verde
+    el: Πράσινο Ακρωτήριο
+    en: Cape Verde
+    eo: Kaboverdo
+    es: Cabo Verde
+    et: Roheneemesaared
+    fa: کیپ ورد
+    fi: Kap Verde
+    fr: Cap-Vert
+    fy: Kaapverdje
+    ga: Rinn Verde
+    gd: Cape Verde
+    he: כף ורדה
+    hr: Zelenortski Otoci
+    hu: Zöld-foki Köztársaság
+    id: Tanjung Verde
+    io: Kabo Verda
+    is: Grænhöfðaeyjar
+    it: Capo Verde
+    la: Promontorium Viride
+    lb: Kap Verde
+    li: Kaapverdië
+    lt: Žaliasis Kyšulys
+    lv: Kaboverde
+    mi: Te Kūrae Matomato
+    mk: Зелен ’Рт
+    mn: Кабо-Верде
+    nl: Kaapverdië
+    pl: Republika Zielonego Przylądka
+    pt: Cabo Verde
+    ru: Кабо-Верде
+    se: Kap Verde
+    sl: Zelenortski otoki
+    sr: Зеленортска Острва
+    sv: Kap Verde
+    ta: கேப் வர்டி
+    th: ประเทศเคปเวิร์ด
+    tr: Yeşil Burun Adaları
+    uk: Кабо-Верде
+    uz: Kabo-Verde
+    vo: Kabovärduäns
+    zh: 佛得角
diff --git a/settings/country-names/cw.yaml b/settings/country-names/cw.yaml
new file mode 100644 (file)
index 0000000..800bce3
--- /dev/null
@@ -0,0 +1,7 @@
+name: 
+    default: Curaçao
+    en: Curaçao
+    es: Curazao
+    fr: Curaçao
+    ru: Кюрасао
+    sv: Curaçao
diff --git a/settings/country-names/cx.yaml b/settings/country-names/cx.yaml
new file mode 100644 (file)
index 0000000..19e26e3
--- /dev/null
@@ -0,0 +1,61 @@
+name: 
+    default: Christmas Island
+    af: Christmas-eiland
+    ar: جزيرة الميلاد
+    bg: Рождество
+    br: Enez Nedeleg
+    bs: Božićno ostrvo
+    ca: Illa Christmas
+    cs: Vánoční ostrov
+    cy: Ynys y Nadolig
+    da: Juleøen
+    de: Weihnachtsinsel
+    el: Νήσος των Χριστουγέννων
+    eo: Kristnaskinsulo
+    es: Isla de Navidad
+    et: Jõulusaar
+    eu: Christmas uhartea
+    fa: جزیره کریسمس
+    fi: Joulusaari
+    fr: Île Christmas
+    fy: Krysteilân
+    ga: Oileán na Nollag
+    gl: Illa de Nadal
+    he: טריטוריית האי חג המולד
+    hi: क्रिसमस आईलैंड
+    hr: Božićni otok
+    hu: Karácsony-sziget
+    id: Pulau Natal
+    is: Jólaeyja
+    it: Isola del Natale
+    ja: クリスマス島
+    ka: შობის კუნძული
+    kk: Кристмас аралы
+    ko: 크리스마스 섬
+    kw: Ynys Nadelik
+    lb: Chrëschtdagsinsel
+    lt: Kalėdų sala
+    lv: Ziemsvētku sala
+    mn: Зул Сарын Арал
+    mr: क्रिसमस द्वीप
+    ms: Pulau Krismas
+    nl: Christmaseiland
+    nn: Christmasøya
+    "no": Christmasøya
+    pl: Wyspa Bożego Narodzenia
+    pt: Ilha Christmas
+    ro: Insula Crăciunului
+    ru: Остров Рождества
+    sh: Božićni otok
+    sk: Vianočný ostrov
+    sl: Božični otoki
+    sr: Божићно Острво
+    sv: Julön
+    sw: Kisiwa cha Krismasi
+    ta: கிறிஸ்துமசு தீவு
+    th: เกาะคริสต์มาส
+    tr: Christmas Adası
+    uk: Острів Різдва
+    vi: Đảo Christmas
+    wo: Dunu Christmas
+    zh: 圣诞岛
diff --git a/settings/country-names/cy.yaml b/settings/country-names/cy.yaml
new file mode 100644 (file)
index 0000000..001ae3b
--- /dev/null
@@ -0,0 +1,128 @@
+name: 
+    default: Κύπρος - Kıbrıs
+    af: Siprus
+    am: ቆጵሮስ
+    an: Chipre
+    ar: قبرص
+    az: Kipr
+    be: Кіпр
+    bg: Кипър
+    bi: Cyprus
+    bn: সাইপ্রাস
+    bo: སེ་པི་རི་སི།
+    br: Kiprenez
+    bs: Kipar
+    ca: Xipre
+    ce: Кипр
+    co: Cipru
+    cs: Kypr
+    cu: Кѷпръ
+    cv: Кипр
+    cy: Cyprus
+    da: Cypern
+    de: Zypern
+    ee: Cyprus
+    el: Κύπρος
+    en: Cyprus
+    eo: Kipro
+    es: Chipre
+    et: Küpros
+    eu: Zipre
+    fa: قبرس
+    fi: Kypros
+    fo: Kýpros
+    fr: Chypre
+    fy: Syprus
+    ga: An Chipir
+    gd: Cìopras
+    gl: Chipre
+    gn: Chipre
+    gu: સાયપ્રસ
+    gv: Yn Cheeprey
+    he: קפריסין
+    hi: साइप्रस
+    hr: Cipar
+    ht: Chip
+    hu: Ciprus
+    hy: Կիպրոս
+    ia: Cypro
+    id: Siprus
+    ie: Cypria
+    io: Chipro
+    is: Kýpur
+    it: Cipro
+    ja: キプロス
+    jv: Siprus
+    ka: კვიპროსი
+    kg: Kipros
+    kk: Кипр
+    kl: Cyperni
+    kn: ಕಿಪ್ರೊಸ್
+    ko: 키프로스
+    ku: Kîpros
+    kv: Кипр
+    kw: Kobros
+    la: Cyprus
+    lb: Zypern
+    li: Cyprus
+    lt: Kipras
+    lv: Kipra
+    mg: Kipra
+    mi: Haipara
+    mk: Кипар
+    ml: സൈപ്രസ്
+    mn: Кипр
+    mr: सायप्रस
+    ms: Cyprus
+    mt: Ċipru
+    my: ဆိုက်ပရပ်စ်နိုင်ငံ
+    na: Taiprus
+    nb: Kypros
+    ne: साइप्रस
+    nl: Cyprus
+    nn: Kypros
+    "no": Kypros
+    nv: Béésh Łichíiʼii Bikéyah
+    oc: Chipre
+    or: ସାଇପ୍ରସ
+    os: Кипр
+    pa: ਸਾਇਪ੍ਰਸ
+    pl: Cypr
+    pt: Chipre
+    qu: Kipru
+    rm: Cipra
+    ro: Cipru
+    ru: Кипр
+    rw: Shipure
+    sc: Tzipru
+    se: Kypros
+    sh: Cipar
+    si: සයිප්‍රස්
+    sk: Cyprus
+    sl: Ciper
+    sm: Cyprus
+    so: Qabrus
+    sq: Qiproja
+    sr: Кипар
+    ss: ISayiphro
+    su: Siprus
+    sv: Cypern
+    sw: Kupro
+    ta: சைப்பிரஸ்
+    te: సైప్రస్
+    tg: Кипр
+    th: ประเทศไซปรัส
+    tk: Kipr
+    tl: Tsipre
+    tr: Kıbrıs
+    tt: Кипр
+    ug: سىپرۇس
+    uk: Кіпр
+    ur: قبرص
+    uz: Qibris
+    vi: Síp
+    vo: Sipreän
+    wo: Ciipër
+    yi: קיפראס
+    yo: Kíprù
+    zh: 赛普勒斯/塞浦路斯/塞浦路斯
diff --git a/settings/country-names/cz.yaml b/settings/country-names/cz.yaml
new file mode 100644 (file)
index 0000000..c22134a
--- /dev/null
@@ -0,0 +1,152 @@
+name: 
+    default: Česko
+    ab: Чехиа
+    af: Tsjeggië
+    am: ቼክ ሪፐብሊክ
+    an: Republica Checa
+    ar: التشيك
+    av: Чехия
+    ay: Chexya Ripublika
+    az: Çexiya
+    ba: Чехия
+    be: Чэхія
+    bg: Чешка република
+    bh: चेक रिपब्लिक
+    bi: Czech Republic
+    bn: চেক প্রজাতন্ত্র
+    bo: ཅེ་ཁེ།
+    br: Tchekia
+    bs: Češka
+    ca: Txèquia
+    ce: Чехи
+    ch: Chekia
+    co: Cechia
+    cs: Česko
+    cu: Чєшьско
+    cv: Чех Республики
+    cy: Gweriniaeth Tsiec
+    da: Tjekkiet
+    de: Tschechien
+    dv: ޗެކް ޖުމްހޫރިއްޔާ
+    dz: ཅེཀ་རི་པབ་ལིཀ་
+    ee: Czech Republic
+    el: Τσεχία
+    en: Czechia
+    eo: Ĉeĥio
+    es: Chequia
+    et: Tšehhi
+    eu: Txekia
+    fa: جمهوری چک
+    ff: Cekiya
+    fi: Tšekki
+    fo: Kekkia
+    fr: Tchéquie
+    fy: Tsjechje
+    ga: An tSeic
+    gd: An t-Seic
+    gl: República Checa
+    gn: Cheko
+    gv: Yn Phobblaght Çheck
+    ha: Kazech
+    he: צכיה
+    hi: चेक गणराज्य
+    hr: Češka
+    ht: Repiblik tchèk
+    hu: Csehország
+    hy: Չեխիա
+    ia: Republica Chec
+    id: Republik Ceko
+    ie: Tchechia
+    ig: Chekia
+    ik: Czech Republic
+    io: Chekia
+    is: Tékkland
+    it: Repubblica Ceca
+    ja: チェコ
+    jv: Céko
+    ka: ჩეხეთი
+    kg: République tchèque
+    kk: Чехия
+    kl: Tjekkia
+    kn: ಜೆಕ್ ಗಣರಾಜ್ಯ
+    ko: 체코
+    ku: Komara Çekî
+    kv: Чехия
+    kw: Pow Chek
+    ky: Чехия
+    la: Cechia
+    lb: Tschechien
+    li: Tsjechië
+    ln: Republíki Sheki
+    lo: ສາທາລະນະລັດແຊັກ
+    lt: Čekija
+    lv: Čehija
+    mg: Tsekia
+    mi: Tīekia
+    mk: Чешка
+    ml: ചെക്ക് റിപ്പബ്ലിക്ക്
+    mn: Бүгд Найрамдах Чех Улс
+    mr: चेक प्रजासत्ताक
+    ms: Republik Czech
+    mt: Repubblika Ċeka
+    my: ချက်သမ္မတနိုင်ငံ
+    na: Ripubrikin Tsiek
+    ne: चेक गणतन्त्र
+    nl: Tsjechië
+    nn: Tsjekkia
+    "no": Tsjekkia
+    nv: Chek Bikéyah
+    oc: Republica Chèca
+    om: Cheekiyaa
+    or: ଚେକ ରିପବ୍ଲିକ
+    os: Чехи
+    pa: ਚੈੱਕ ਗਣਰਾਜ
+    pi: चेक रिपब्लिक
+    pl: Czechy
+    ps: چېک جمهوريت
+    pt: Tcheca
+    qu: Chiksuyu
+    rm: Tschechia
+    ro: Cehia
+    ru: Чехия
+    rw: Cekiya
+    sa: ज़ेक् रिपब्लिक
+    sc: Repùblica Ceca
+    sd: جمهوريه چيڪ
+    se: Čeahkka
+    sh: Češka Republika
+    si: චෙක් ජනරජය
+    sk: Česko
+    sl: Češka
+    sm: Czechs Republic
+    sn: Czechia
+    so: Jamhuuriyadda Tashik
+    sq: Republika Çeke
+    sr: Чешка
+    ss: Shekhi
+    su: Céko
+    sv: Tjeckien
+    sw: Ucheki
+    ta: செக் குடியரசு
+    te: చెక్ రిపబ్లిక్
+    tg: Чехия
+    th: สาธารณรัฐเช็ก
+    tk: Çehiýa
+    tl: Republikang Tseko
+    tr: Çek Cumhuriyeti
+    ts: Czech Republic
+    tt: Чехия
+    ty: Czech Republic
+    ug: چېخ جۇمھۇرىيەتى
+    uk: Чехія
+    ur: چیک جمہوریہ
+    uz: Chexiya
+    vi: Cộng hòa Séc
+    vo: Tsyegän
+    wa: Tchekeye
+    wo: Réewum Cek
+    yi: טשעכיי
+    yo: Tsẹ́kì Olómìnira
+    za: Ciethaek
+    zh: 捷克
+    zu: ITsheki
diff --git a/settings/country-names/de.yaml b/settings/country-names/de.yaml
new file mode 100644 (file)
index 0000000..58b4f6d
--- /dev/null
@@ -0,0 +1,158 @@
+name: 
+    default: Deutschland
+    ab: Алмантәыла
+    af: Duitsland
+    ak: Germany
+    am: ጀርመን
+    an: Alemanya
+    ar: ألمانيا
+    av: Алмания
+    ay: Alimaña
+    az: Almaniya
+    ba: Германия
+    be: Германія
+    bg: Германия
+    bi: Germany
+    bm: Jermani
+    bn: জার্মানি
+    bo: འཇར་མན།
+    br: Alamagn
+    bs: Njemačka
+    ca: Alemanya
+    ce: Германи
+    co: Germania
+    cs: Německo
+    cu: Нѣмьци
+    cv: Германи
+    cy: Yr Almaen
+    da: Tyskland
+    de: Deutschland
+    dv: ޖަރުމަނުވިލާތް
+    dz: ཇཱར་མ་ནི
+    ee: Germany
+    el: Γερμανία
+    en: Germany
+    eo: Germanio
+    es: Alemania
+    et: Saksamaa
+    eu: Alemania
+    fa: آلمان
+    ff: Almaanya
+    fi: Saksa
+    fo: Týskland
+    fr: Allemagne
+    fy: Dútslân
+    ga: An Ghearmáin
+    gd: A' Ghearmailt
+    gl: Alemaña
+    gn: Alemaña
+    gu: જર્મની
+    gv: Yn Ghermaan
+    ha: Jamus
+    he: גרמניה
+    hi: जर्मनी
+    hr: Njemačka
+    ht: Almay
+    hu: Németország
+    hy: Գերմանիա
+    ia: Germania
+    id: Jerman
+    ie: Germania
+    ig: Jémanị
+    io: Germania
+    is: Þýskaland
+    it: Germania
+    iu: ᔮᒪᓂ
+    ja: ドイツ
+    jv: Jerman
+    ka: გერმანია
+    kg: Alemanyi
+    ki: Germany
+    kk: Германия Федеративтік Республикасы
+    kl: Tyskit Nunaat
+    km: អាល្លឺម៉ង់
+    kn: ಜರ್ಮನಿ
+    ko: 독일
+    ks: جرمٔنی
+    ku: Almanya
+    kv: Германия
+    kw: Almayn
+    ky: Германия
+    la: Germania
+    lb: Däitschland
+    lg: Girimane
+    li: Duutsjlandj
+    ln: Alémani
+    lo: ປະເທດເຢັຽລະມັນ
+    lt: Vokietija
+    lv: Vācija
+    mg: Alemaina
+    mi: Tiamani
+    mk: Германија
+    ml: ജർമ്മനി
+    mn: Герман
+    mo: Ӂермания
+    mr: जर्मनी
+    ms: Jerman
+    mt: Ġermanja
+    my: ဂျာမနီနိုင်ငံ
+    na: Djermani
+    ne: जर्मनी
+    nl: Duitsland
+    nn: Tyskland
+    "no": Tyskland
+    nv: Béésh Bichʼahii Bikéyah
+    oc: Alemanha
+    or: ଜର୍ମାନୀ
+    os: Герман
+    pa: ਜਰਮਨੀ
+    pl: Niemcy
+    ps: آلمان
+    pt: Alemanha
+    qu: Alimanya
+    rm: Germania
+    rn: Ubudagi
+    ro: Germania
+    ru: Германия
+    rw: Ubudage
+    sa: जर्मनी
+    sc: Germània
+    se: Duiska
+    sh: Nemačka
+    si: ජර්මනිය
+    sk: Nemecko
+    sl: Nemčija
+    sm: Siamani
+    so: Jarmalka
+    sq: Gjermania
+    sr: Немачка
+    ss: IJalimane
+    su: Jérman
+    sv: Tyskland
+    sw: Ujerumani
+    ta: செருமனி
+    te: జర్మనీ
+    tg: Олмон
+    th: ประเทศเยอรมนี
+    ti: ጀርመን
+    tk: Germaniýa
+    tl: Alemanya
+    tr: Almanya
+    ts: Jarimani
+    tt: Алмания
+    tw: Gyaaman
+    ty: Heremani
+    ug: گېرمانىيە
+    uk: Німеччина
+    ur: جرمنی
+    uz: Olmoniya
+    vi: Đức
+    vo: Deutän
+    wa: Almagne
+    wo: Almaañ
+    xh: IJamani
+    yi: דייטשלאנד
+    yo: Jẹ́mánì
+    za: Dwzgoz
+    zh: 德国
+    zu: IJalimani
diff --git a/settings/country-names/dj.yaml b/settings/country-names/dj.yaml
new file mode 100644 (file)
index 0000000..9a20578
--- /dev/null
@@ -0,0 +1,127 @@
+name: 
+    default: Djibouti جيبوتي
+    af: Djiboeti
+    am: ጅቡቲ
+    an: Chibuti
+    ar: جيبوتي
+    az: Cibuti
+    ba: Джибути
+    be: Джыбуці
+    bg: Джибути
+    bn: জিবুতি
+    bo: ཇི་བའོ་ཊི།
+    br: Djibouti
+    bs: Džibuti
+    ca: Djibouti
+    ce: Джибути
+    cs: Džibutsko
+    cv: Джибути
+    cy: Djibouti
+    da: Djibouti
+    de: Dschibuti
+    dv: ޖިބުތީ
+    ee: Djibouti
+    el: Τζιμπουτί
+    en: Djibouti
+    eo: Ĝibutio
+    es: Yibuti
+    et: Djibouti
+    eu: Djibuti
+    fa: جیبوتی
+    fi: Djibouti
+    fr: Djibouti
+    fy: Dzjibûty
+    ga: Diobúití
+    gd: Diobùtaidh
+    gl: Xibutí
+    gv: Djibouti
+    he: ג'יבוטי
+    hi: जिबूती
+    hr: Džibuti
+    ht: Djibouti
+    hu: Dzsibuti
+    hy: Ջիբութի
+    ia: Djibouti
+    id: Djibouti
+    ie: Djibouti
+    io: Djibuti
+    is: Djíbútí
+    it: Gibuti
+    ja: ジブチ
+    jv: Djibouti
+    ka: ჯიბუტი
+    kg: Djibuti
+    ki: Djibouti
+    kk: Джибути
+    ko: 지부티
+    ku: Cîbûtî
+    kw: Jibouti
+    la: Gibutum
+    lb: Dschibuti
+    li: Djibouti
+    ln: Djibuti
+    lt: Džibutis
+    lv: Džibutija
+    mg: Jibotia
+    mi: Tipūti
+    mk: Џибути
+    ml: ജിബൂട്ടി
+    mn: Джибути
+    mr: जिबूती
+    ms: Djibouti
+    mt: Ġibuti
+    my: ဂျီဘူတီနိုင်ငံ
+    na: Djibuti
+    ne: जिबुटी
+    nl: Djibouti
+    nn: Djibouti
+    "no": Djibouti
+    nv: Jibótii
+    oc: Jiboti
+    om: Jibuutii
+    or: ଡିଜିବୋଇଟି
+    os: Джибути
+    pa: ਜਿਬੂਤੀ
+    pl: Dżibuti
+    ps: جېبوتي
+    pt: Djibouti
+    qu: Yiwuti
+    ro: Djibouti
+    ru: Джибути
+    rw: Jibuti
+    sa: जिबूटी
+    sc: Gibuti
+    se: Djibouti
+    sg: Dibutùii
+    sh: Džibuti
+    sk: Džibutsko
+    sl: Džibuti
+    sn: Djibouti
+    so: Jabuuti
+    sq: Xhibuti
+    sr: Џибути
+    ss: IJibhuthi
+    su: Djibouti
+    sv: Djibouti
+    sw: Jibuti
+    ta: சீபூத்தீ
+    te: జిబౌటి
+    tg: Ҷибути
+    th: ประเทศจิบูตี
+    ti: ጂቡቲ
+    tk: Jibuti
+    tl: Hiboti
+    tr: Cibuti
+    ts: Djibouti
+    tt: Җибути
+    ug: جىبۇتى
+    uk: Джибуті
+    ur: جبوتی
+    uz: Jibuti
+    vi: Djibouti
+    vo: Cibutän
+    wo: Jibuti
+    yi: דזשיבוטי
+    yo: Djìbútì
+    zh: 吉布提
+    zu: IJibuthi
diff --git a/settings/country-names/dk.yaml b/settings/country-names/dk.yaml
new file mode 100644 (file)
index 0000000..aed6370
--- /dev/null
@@ -0,0 +1,136 @@
+name: 
+    default: Danmark
+    af: Denemarke
+    am: ዴንማርክ
+    an: Dinamarca
+    ar: الدنمارك
+    az: Danimarka
+    ba: Дания
+    be: Данія
+    bg: Дания
+    bi: Denmark
+    bn: ডেনমার্ক
+    bo: དན་མྲག
+    br: Danmark
+    bs: Danska
+    ca: Dinamarca
+    ce: Дани
+    co: Danimarca
+    cs: Dánsko
+    cu: Данїꙗ
+    cv: Дани
+    cy: Denmarc
+    da: Danmark
+    de: Dänemark
+    dv: ޑެންމާކު
+    dz: ཌེན་མཱཀ་
+    ee: Denmark
+    el: Δανία
+    en: Denmark
+    eo: Danio
+    es: Dinamarca
+    et: Taani
+    eu: Danimarka
+    fa: دانمارک
+    fi: Tanska
+    fo: Danmark
+    fr: Danemark
+    fy: Denemark
+    ga: An Danmhairg
+    gd: An Danmhairg
+    gl: Dinamarca
+    gn: Ndinamayka
+    gv: Yn Danvarg
+    he: דנמרק
+    hi: डेनमार्क
+    hr: Danska
+    ht: Danmak
+    hu: Dánia
+    hy: Դանիա
+    ia: Danmark
+    id: Denmark
+    ie: Dania
+    io: Dania
+    is: Danmörk
+    it: Danimarca
+    ja: デンマーク
+    jv: Denmark
+    ka: დანია
+    kg: Danemark
+    ki: Denmark
+    kk: Дания
+    kl: Danmarki
+    kn: ಡೆನ್ಮಾರ್ಕ್
+    ko: 덴마크
+    ku: Danîmarka
+    kv: Дания
+    kw: Danmark
+    ky: Дания
+    la: Dania
+    lb: Dänemark
+    lg: Denimaaka
+    li: Denemarke
+    ln: Danemark
+    lt: Danija
+    lv: Dānija
+    mg: Danmarka
+    mi: Tenemāka
+    mk: Данска
+    ml: ഡെന്മാർക്ക്
+    mn: Дани
+    mr: डेन्मार्क
+    ms: Denmark
+    mt: Danimarka
+    my: ဒိန်းမတ်နိုင်ငံ
+    na: Denemark
+    ne: डेनमार्क
+    nl: Denemarken
+    nn: Danmark
+    "no": Danmark
+    nv: Déinish Dineʼé Bikéyah
+    oc: Danemarc
+    or: ଡେନମାର୍କ
+    os: Дани
+    pl: Dania
+    ps: ډېنمارک
+    pt: Dinamarca
+    qu: Dansuyu
+    rm: Danemarc
+    rn: Danemarke
+    ro: Danemarca
+    ru: Дания
+    rw: Danimarike
+    sa: डेनमार्क
+    sc: Danimarca
+    se: Dánmárku
+    sh: Danska
+    si: ඩෙන්මාර්කය
+    sk: Dánsko
+    sl: Danska
+    so: Denmark
+    sq: Danimarka
+    sr: Данска
+    ss: IDenimakhi
+    st: Denmark
+    su: Dénmark
+    sv: Danmark
+    sw: Denmark
+    ta: டென்மார்க்
+    te: డెన్మార్క్
+    tg: Дания
+    th: ประเทศเดนมาร์ก
+    tk: Daniýa
+    tl: Dinamarka
+    tr: Danimarka
+    tt: Дания
+    ug: دانىيە
+    uk: Данія
+    ur: ڈنمارک
+    uz: Daniya
+    vi: Đan Mạch
+    vo: Danän
+    wo: Danmaark
+    yi: דענמארק
+    yo: Dẹ́nmárkì
+    zh: 丹麦
+    zu: IDenimaki
diff --git a/settings/country-names/dm.yaml b/settings/country-names/dm.yaml
new file mode 100644 (file)
index 0000000..2dbc01e
--- /dev/null
@@ -0,0 +1,42 @@
+name: 
+    default: Dominica
+    af: Dominika
+    ar: دومينيكا
+    be: Дамініка
+    br: Republik Dominikan
+    cs: Dominika
+    de: Dominica
+    el: Δομινίκα
+    en: Dominica
+    eo: Dominiko
+    es: Dominica
+    eu: Dominika
+    fa: دومینیکا
+    fi: Dominica
+    fr: Dominique
+    fy: Dominika
+    ga: Doiminice
+    gd: Doiminicia
+    he: דומיניקה
+    hr: Dominika
+    hu: Dominikai Közösség
+    id: Dominika
+    is: Dóminíka
+    it: Dominìca
+    ja: ドミニカ
+    lt: Dominika
+    lv: Dominika
+    mn: Доминика
+    nl: Dominica
+    pl: Dominika
+    pt: Dominica
+    ru: Доминика
+    se: Dominica
+    sk: Dominika
+    sl: Dominika
+    sv: Dominica
+    th: ประเทศโดมินิกา
+    tr: Dominika
+    uk: Домініка
+    vo: Dominikeän
+    zh: 多米尼克
diff --git a/settings/country-names/do.yaml b/settings/country-names/do.yaml
new file mode 100644 (file)
index 0000000..4668450
--- /dev/null
@@ -0,0 +1,115 @@
+name: 
+    default: República Dominicana
+    af: Dominikaanse Republiek
+    am: ዶሚኒካን ሪፐብሊክ
+    an: Republica Dominicana
+    ar: جمهورية الدومينيكان
+    ay: Republika Duminikana
+    az: Dominikan Respublikası
+    be: Дамініканская Рэспубліка
+    bg: Доминиканска република
+    bn: ডোমিনিকান প্রজাতন্ত্র
+    bo: ཌོ་མི་ནི་ཀན་སྤྱི་མཐུན་རྒྱལ་ཁབ།
+    br: Republik Dominikan
+    bs: Dominikanska Republika
+    ca: República Dominicana
+    ce: Доминикан Пачхьалкх
+    cs: Dominikánská republika
+    cy: Gweriniaeth Dominica
+    da: Dominikanske Republik
+    de: Dominikanische Republik
+    dv: ޑޮމިނިކަން ޖުމްހޫރިއްޔާ
+    ee: Dominican Republic
+    el: Δομινικανή Δημοκρατία
+    en: Dominican Republic
+    eo: Domingo
+    es: República Dominicana
+    et: Dominikaani Vabariik
+    eu: Dominikar Errepublika
+    fa: جمهوری دومینیکن
+    fi: Dominikaaninen tasavalta
+    fo: Dominikanalýðveldið
+    fr: République dominicaine
+    fy: Dominikaanske Republyk
+    ga: An Phoblacht Dhoiminiceach
+    gd: Poblachd Dhoiminicia
+    gl: República Dominicana
+    gv: Yn Phobblaght Ghominicagh
+    he: הרפובליקה הדומיניקנית
+    hi: डोमिनिकन गणराज्य
+    hr: Dominikanska Republika
+    ht: Dominikani
+    hu: Dominikai Köztársaság
+    hy: Դոմինիկյան Հանրապետություն
+    ia: Republica Dominican
+    id: Republik Dominika
+    io: Dominikana Republiko
+    is: Dóminíska lýðveldið
+    it: Repubblica Dominicana
+    ja: ドミニカ共和国
+    jv: Republik Dominika
+    ka: დომინიკელთა რესპუბლიკა
+    kk: Доминикан Республикасы
+    kn: ಡೊಮಿನಿಕ ಗಣರಾಜ್ಯ
+    ko: 도미니카 공화국
+    ku: Komara Domînîk
+    kw: Repoblek Dhominikanek
+    la: Respublica Dominicana
+    lb: Dominikanesch Republik
+    li: Dominicaanse Rippubliek
+    ln: Republiki Dominikani
+    lt: Dominikos Respublika
+    lv: Dominikāna
+    mi: Te Whenua Tominika
+    mk: Доминиканска Република
+    ml: ഡൊമനിക്കൻ റിപ്പബ്ലിക്
+    mn: Доминиканы Бүгд Найрамдах Улс
+    mr: डॉमिनिकन प्रजासत्ताक
+    ms: Republik Dominika
+    mt: Repubblika Dominikana
+    my: ဒိုမီနီကန်သမ္မတနိုင်ငံ
+    na: Ripubrikin Dominika
+    ne: डोमिनिकन गणतन्त्र
+    nl: Dominicaanse Republiek
+    nn: Den dominikanske republikken
+    "no": Den dominikanske republikk
+    nv: Domingo Bikéyah
+    oc: Republica Dominicana
+    or: ଡୋମେନିକାନ ରିପବ୍ଲିକ
+    os: Доминиканæйы Республикæ
+    pa: ਡੋਮਿਨਿਕਾਈ ਗਣਰਾਜ
+    pl: Dominikana
+    ps: ډومنيکان جمهوريت
+    pt: República Dominicana
+    qu: Duminikana
+    ro: Republica Dominicană
+    ru: Доминиканская Республика
+    rw: Repubulika ya Dominikani
+    sa: डोमोनिकन रिपब्लिक
+    se: Dominikána dásseváldi
+    sh: Dominikanska Republika
+    sk: Dominikánska republika
+    sl: Dominikanska republika
+    sq: Republika Dominikane
+    sr: Доминиканска Република
+    ss: Tibuse weDomonokha
+    su: Républik Dominika
+    sv: Dominikanska Republiken
+    sw: Jamhuri ya Dominika
+    ta: டொமினிக்கன் குடியரசு
+    te: డొమెనికన్ రిపబ్లిక్
+    tg: Ҷумҳурии Доминикана
+    th: สาธารณรัฐโดมินิกัน
+    tl: Republikang Dominikano
+    tr: Dominik Cumhuriyeti
+    tt: Доминикан Җөмһүрияте
+    ug: دومىنىكان جۇمھۇرىيەتى
+    uk: Домініканська Республіка
+    ur: جمہوریہ ڈومینیکن
+    uz: Dominika Respublikasi
+    vi: Cộng hòa Dominica
+    vo: Sandominän
+    wo: Réewum Dominik
+    yi: דאמיניקאנישע רעפובליק
+    yo: Orílẹ̀òmìnira Dómíníkì
+    zh: 多明尼加共和國
diff --git a/settings/country-names/dz.yaml b/settings/country-names/dz.yaml
new file mode 100644 (file)
index 0000000..8696136
--- /dev/null
@@ -0,0 +1,159 @@
+name: 
+    default: Algérie / ⵍⵣⵣⴰⵢⴻⵔ / الجزائر
+    af: Algerië
+    ak: Algeria
+    am: አልጄሪያ
+    an: Alcheria
+    ar: الجزائر
+    as: আলজেৰিয়া
+    ay: Alhirya
+    az: Əlcəzair
+    ba: Алжи́р
+    be: Алжы́р
+    bg: Алжѝр
+    bh: अल्जीरिया
+    bm: Algeri
+    bn: আলজেরিয়া
+    bo: ཨཱལ་ཇི་རི་ཡ།
+    br: Aljeria
+    bs: Alžir
+    ca: Algèria
+    ce: Алжи́р
+    cs: Alžírsko
+    cv: Алжир
+    cy: Algeria
+    da: Algeriet
+    de: Algerien
+    dv: ޖަޒާއިރު
+    dz: ཨཱལ་ཇི་རི་ཡ
+    ee: Ɔldzeria
+    el: Αλγερία
+    en: Algeria
+    eo: Alĝerio
+    es: Argelia
+    et: Alžeeria
+    eu: Aljeria
+    fa: الجزایر
+    ff: Aljeri
+    fi: Algeria
+    fo: Algeria
+    fr: Algérie
+    fy: Algerije
+    ga: An Ailgéir
+    gd: Aildiria
+    gl: Alxeria
+    gn: Ayhelia
+    gu: અલ્જીરિયા
+    gv: Yn Algear
+    ha: Aljeriya
+    he: אלג'יריה
+    hi: अल्जीरिया
+    hr: Alžir
+    ht: Aljeri
+    hu: Algéria
+    hy: Ալժիր
+    ia: Algeria
+    id: Aljazair
+    ie: Algeria
+    ig: Algeria
+    io: Aljeria
+    is: Alsír
+    it: Algeria
+    ja: アルジェリア
+    jv: Aljazair
+    ka: ალჟირი
+    kg: Algeria
+    ki: Algeria
+    kk: Алжир
+    kl: Algeriet
+    km: ប្រទេសអាល់ហ្សេរី
+    kn: ಅಲ್ಜೀರಿಯ
+    ko: 알제리
+    ks: اٮ۪لجیرِیا
+    ku: Cezayir
+    kw: Aljeri
+    ky: Алжир
+    la: Algerium
+    lb: Algerien
+    lg: Algeria
+    li: Algerieë
+    ln: Aljeria
+    lo: ແອລຈິເລຍ
+    lt: Alžyras
+    lv: Alžīrija
+    mg: Aljeria
+    mi: Aratiria
+    mk: Алжир
+    ml: അൾജീറിയ
+    mn: Алжир
+    mr: अल्जीरिया
+    ms: Algeria
+    mt: Alġerija
+    my: အယ်လ်ဂျီးရီးယားနိုင်ငံ
+    na: Ardjiriya
+    ne: अल्जेरिया
+    nl: Algerije
+    nn: Algerie
+    "no": Algerie
+    nv: Aljííya
+    ny: Algeria
+    oc: Argeria
+    om: Aljeeriyaa
+    or: ଆଲଜେରିଆ
+    os: Алжир
+    pa: ਅਲਜੀਰੀਆ
+    pi: अल्जीरिया
+    pl: Algieria
+    ps: الجزاير
+    pt: Argélia
+    qu: Alhirya
+    rm: Algeria
+    rn: Alijeriya
+    ro: Algeria
+    ru: Алжир
+    rw: Aligeriya
+    sa: अल्जीरिया
+    sc: Algerìa
+    sd: الجزائر
+    se: Algeria
+    sg: Alazëri
+    sh: Alžir
+    si: ඇල්ජීරියාව
+    sk: Alžírsko
+    sl: Alžirija
+    sm: Algeria
+    sn: Algeria
+    so: Aljeeriya
+    sq: Algjeria
+    sr: Алжир
+    ss: i-Alijeriya
+    st: Algeria
+    su: Aljazair
+    sv: Algeriet
+    sw: Algeria
+    ta: அல்சீரியா
+    te: అల్జీరియా
+    tg: Алҷазоир
+    th: ประเทศแอลจีเรีย
+    ti: አልጀሪያ
+    tk: Alžir
+    tl: Arhelya
+    to: ʻAisilia
+    tr: Cezayir
+    ts: Algeriya
+    tt: Әлҗәзаи́р
+    tw: Algeria
+    ug: ئالجىرىيە
+    uk: Алжир
+    ur: الجزائر
+    uz: Jazoir
+    vi: Algérie
+    vo: Laljerän
+    wa: Aldjereye
+    wo: Alseeri
+    xh: I-Algeria
+    yi: אַלזשיר
+    yo: Àlgéríà
+    za: Algeria
+    zh: 阿尔及利亚
+    zu: iAljiriya
diff --git a/settings/country-names/ec.yaml b/settings/country-names/ec.yaml
new file mode 100644 (file)
index 0000000..72b44ea
--- /dev/null
@@ -0,0 +1,122 @@
+name: 
+    default: Ecuador
+    am: ኤኳዶር
+    an: Ecuador
+    ar: الإكوادور
+    ay: Ikwadur
+    az: Ekvador
+    ba: Эквадор
+    be: Эквадор
+    bg: Еквадор
+    bn: ইকুয়েডর
+    bo: ཨེ་ཁོའོ་ཌོར།
+    br: Ecuador
+    bs: Ekvador
+    ca: Equador
+    ce: Эквадор
+    cs: Ekvádor
+    cv: Эквадор
+    cy: Ecuador
+    da: Ecuador
+    de: Ecuador
+    dv: އިކުއެޑޯރު
+    ee: Ecuador
+    el: Ισημερινός (χώρα)
+    en: Ecuador
+    eo: Ekvadoro
+    es: Ecuador
+    et: Ecuador
+    eu: Ekuador
+    fa: اکوادور
+    fi: Ecuador
+    fo: Ekvador
+    fr: Équateur
+    fy: Ekwador
+    ga: Eacuadór
+    gd: Eacuador
+    gl: Ecuador
+    gn: Ekuator
+    gu: ઈક્વેડોર
+    gv: Ecuador
+    he: אקוודור
+    hi: ईक्वाडोर
+    hr: Ekvador
+    ht: Ekwatè
+    hu: Ecuador
+    hy: Էկվադոր
+    ia: Ecuador
+    id: Ekuador
+    ie: Ecuador
+    io: Equador
+    is: Ekvador
+    it: Ecuador
+    ja: エクアドル
+    jv: Ekuador
+    ka: ეკვადორი
+    ki: Ecuador
+    kk: Эквадор
+    kl: Ecuador
+    kn: ಎಕ್ವಡಾರ್
+    ko: 에콰도르
+    ku: Ekuador
+    kw: Pow Ekwadorel
+    la: Aequatoria
+    lb: Ecuador
+    li: Ecuador
+    ln: Republíki ya Ekwatéli
+    lt: Ekvadoras
+    lv: Ekvadora
+    mi: Ekuatoa
+    mk: Еквадор
+    ml: ഇക്വഡോർ
+    mn: Эквадор
+    mr: इक्वेडोर
+    ms: Ecuador
+    mt: Ekwador
+    my: အီကွေဒေါနိုင်ငံ
+    na: Ekwador
+    ne: इक्वेडर
+    nl: Ecuador
+    nn: Ecuador
+    "no": Ecuador
+    nv: Kéyah Nahasdzáán Ałníiʼgi Siʼánígíí
+    oc: Eqüator
+    or: ଏକ୍ଵାଡୋର
+    os: Эквадор
+    pa: ਏਕੁਆਦੋਰ
+    pl: Ekwador
+    ps: اېکوادور
+    pt: Equador
+    qu: Ikwadur
+    rm: Ecuador
+    ro: Ecuador
+    ru: Эквадор
+    rw: Ekwadoro
+    sa: एक्वाडोर
+    se: Ecuador
+    sh: Ekvador
+    sk: Ekvádor
+    sl: Ekvador
+    so: Ikwadoor
+    sq: Ekuadori
+    sr: Еквадор
+    su: Ékuador
+    sv: Ecuador
+    sw: Ekuador
+    ta: எக்குவடோர்
+    te: ఈక్వడార్
+    tg: Экуадор
+    th: ประเทศเอกวาดอร์
+    tl: Ecuador
+    tr: Ekvador
+    tt: Эквадор
+    ug: ئېكۋادور
+    uk: Еквадор
+    ur: ایکواڈور
+    uz: Ekvador
+    vi: Ecuador
+    vo: Lekvadorän
+    wo: Ekwadoor
+    yi: עקוואדאר
+    yo: Ẹ̀kùàdọ̀r
+    zh: 厄瓜多尔
diff --git a/settings/country-names/ee.yaml b/settings/country-names/ee.yaml
new file mode 100644 (file)
index 0000000..766fd43
--- /dev/null
@@ -0,0 +1,136 @@
+name: 
+    default: Eesti
+    af: Estland
+    am: ኤስቶኒያ
+    an: Estonia
+    ar: إستونيا
+    az: Estoniya
+    ba: Эстония
+    be: Эстонія
+    bg: Естония
+    bi: Estonia
+    bm: Estonia
+    bn: ইস্তোনিয়া
+    bo: ཨིསུ་ཊོ་ནིཡ།
+    br: Estonia
+    bs: Estonija
+    ca: Estònia
+    ce: Эстони
+    co: Estonia
+    cs: Estonsko
+    cu: Єсть
+    cv: Эстони
+    cy: Estonia
+    da: Estland
+    de: Estland
+    dz: ཨིསི་ཊོ་ནི་ཡ།
+    ee: Estonia
+    el: Εσθονία
+    en: Estonia
+    eo: Estonio
+    es: Estonia
+    et: Eesti
+    eu: Estonia
+    fa: استونی
+    ff: Estoniya
+    fi: Viro
+    fo: Estland
+    fr: Estonie
+    fy: Estlân
+    ga: An Eastóin
+    gd: Eastòinia
+    gl: Estonia
+    gn: Etoña
+    gu: ઈસ્ટોનિયા
+    gv: Yn Estaan
+    he: אסטוניה
+    hi: एस्टोनिया
+    hr: Estonija
+    ht: Estoni
+    hu: Észtország
+    hy: Էստոնիա
+    ia: Estonia
+    id: Estonia
+    ie: Estonia
+    io: Estonia
+    is: Eistland
+    it: Estonia
+    ja: エストニア
+    jv: Estonia
+    ka: ესტონეთი
+    kg: Estonia
+    kk: Эстония
+    kl: Estlandi
+    kn: ಎಸ್ಟೊನಿಯ
+    ko: 에스토니아
+    ku: Estonya
+    kv: Эстония
+    kw: Estoni
+    ky: Эстония
+    la: Estonia
+    lb: Estland
+    li: Esland
+    ln: Estonia
+    lt: Estija
+    lv: Igaunija
+    mg: Estonia
+    mi: Etonia
+    mk: Естонија
+    ml: എസ്റ്റോണിയ
+    mn: Эстон
+    mr: एस्टोनिया
+    ms: Estonia
+    mt: Estonja
+    my: အက်စ်တိုးနီးယားနိုင်ငံ
+    na: Etoniya
+    ne: इस्टोनिया
+    nl: Estland
+    nn: Estland
+    "no": Estland
+    nv: Ééstii Bikéyah
+    oc: Estònia
+    or: ଏଷ୍ଟୋନିଆ
+    os: Эстони
+    pa: ਇਸਤੋਨੀਆ
+    pl: Estonia
+    ps: اېسټونيا
+    pt: Estónia
+    qu: Istunya
+    ro: Estonia
+    ru: Эстония
+    rw: Esitoniya
+    sa: एस्टोनिया
+    sc: Estònia
+    se: Estteeana
+    sh: Estonija
+    si: එස්ටෝනියා
+    sk: Estónsko
+    sl: Estonija
+    so: Estoniya
+    sq: Estonia
+    sr: Естонија
+    ss: IWestoniya
+    st: Estonia
+    su: Éstonia
+    sv: Estland
+    sw: Estonia
+    ta: எசுத்தோனியா
+    te: ఎస్టోనియా
+    tg: Эстония
+    th: ประเทศเอสโตเนีย
+    tk: Estoniýa
+    tl: Estonia
+    tr: Estonya
+    tt: Эстония
+    ug: ئېستونىيە
+    uk: Естонія
+    ur: استونیا
+    uz: Estoniya
+    ve: Estonia
+    vi: Estonia
+    vo: Lestiyän
+    wo: Estooni
+    yi: עסטלאנד
+    yo: Estóníà
+    zh: 爱沙尼亚
+    zu: I-Estoniya
diff --git a/settings/country-names/eg.yaml b/settings/country-names/eg.yaml
new file mode 100644 (file)
index 0000000..d49b24b
--- /dev/null
@@ -0,0 +1,161 @@
+name: 
+    default: مصر
+    ab: Мы́сры
+    af: Egipte
+    ak: Igyipt
+    am: ግብፅ
+    an: Echipto
+    ar: مصر
+    as: ইজিপ্ত
+    av: Еги́пет
+    ay: Iqiqtu
+    az: Misir
+    ba: Мысыр
+    be: Егі́пет
+    bg: Египет
+    bh: मिस्र
+    bm: Misra
+    bn: মিশর
+    bo: ཨའི་ཅི།
+    br: Egipt
+    bs: Egipat
+    ca: Egipte
+    ce: Мисар
+    ch: Ehiptu
+    cs: Egypt
+    cu: Єгѷптъ
+    cy: Yr Aifft
+    da: Egypten
+    de: Ägypten
+    dv: މިޞްރު
+    ee: Edzipti
+    el: Αίγυπτος
+    en: Egypt
+    eo: Egiptio
+    es: Egipto
+    et: Egiptus
+    eu: Egipto
+    fa: مصر
+    ff: Ejipt
+    fi: Egypti
+    fj: Ijipta
+    fo: Egyptaland
+    fr: Égypte
+    fy: Egypte
+    ga: An Éigipt
+    gd: An Èipheit
+    gl: Exipto
+    gn: Ehipto
+    gu: ઇજિપ્ત
+    gv: Yn Egypt
+    ha: Misra
+    he: מצרים
+    hi: मिस्र
+    hr: Egipat
+    ht: Ejip
+    hu: Egyiptom
+    hy: Եգիպտոս
+    ia: Egypto
+    id: Mesir
+    ie: Egiptia
+    ig: Egypt
+    io: Egiptia
+    is: Egyptaland
+    it: Egitto
+    ja: エジプト
+    jv: Mesir
+    ka: ეგვიპტე
+    kg: Misiri
+    ki: Egypt
+    kk: Мысыр
+    kl: Egypt
+    km: អេហ៊្សីប
+    kn: ಈಜಿಪ್ಟ್
+    ko: 이집트
+    ks: مِسر
+    ku: Misir
+    kv: Египет
+    kw: Ejyp
+    ky: Египет
+    la: Aegyptus
+    lb: Egypten
+    lg: Egypt
+    li: Egypte
+    ln: Ejipte
+    lo: ອີຢິບ
+    lt: Egiptas
+    lv: Ēģipte
+    mg: Ejipta
+    mi: Īhipa
+    mk: Египет
+    ml: ഈജിപ്ത്
+    mn: Египет
+    mr: इजिप्त
+    ms: Mesir
+    mt: Eġittu
+    my: အီဂျစ်နိုင်ငံ
+    na: Idjipt
+    ne: मिश्र
+    nl: Egypte
+    nn: Egypt
+    "no": Egypt
+    nv: Ííjip
+    oc: Egipte
+    om: Ijiipti
+    or: ଇଜିପ୍ଟ
+    os: Мысыр
+    pa: ਮਿਸਰ
+    pi: ईजिप्ट
+    pl: Egipt
+    ps: مصر
+    pt: Egito
+    qu: Ihiptu
+    rm: Egipta
+    rn: Egipto
+    ro: Egipt
+    ru: Египет
+    sa: ईजिप्तदेशः
+    sc: Egittu
+    sd: مصر
+    se: Egypta
+    sg: Kâmitâ
+    sh: Egipat
+    si: ඊජීප්තුව
+    sk: Egypt
+    sl: Egipt
+    sm: Aikupito
+    sn: Egypt
+    so: Masar
+    sq: Egjipti
+    sr: Египат
+    ss: iGibhithe
+    st: Egepeta
+    su: Mesir
+    sv: Egypten
+    sw: Misri
+    ta: எகிப்து
+    te: ఈజిప్టు
+    tg: Миср
+    th: ประเทศอียิปต์
+    ti: ግብጽ
+    tk: Müsür
+    tl: Ehipto
+    to: ʻIsipite
+    tr: Mısır
+    ts: Gibita
+    tt: Мисы́р
+    tw: Egypt
+    ty: ’Aifiti
+    ug: مىسىر
+    uk: Єги́пет
+    ur: مصر
+    uz: Misr
+    vi: Ai Cập
+    vo: Lägüptän
+    wa: Edjipe
+    wo: Isipt
+    yi: עגיפטן
+    yo: Ẹ́gíptì
+    za: Aehciz
+    zh: 埃及
+    zu: iGibhithe
diff --git a/settings/country-names/eh.yaml b/settings/country-names/eh.yaml
new file mode 100644 (file)
index 0000000..0f28bfd
--- /dev/null
@@ -0,0 +1,17 @@
+name: 
+    default: الجمهورية العربية الصحراوية الديمقراطية
+    ar: الجمهورية العربية الصحراوية الديمقراطية
+    cs: Saharská arabská demokratická republika
+    de: Demokratische Arabische Republik Sahara
+    el: Δημοκρατία της Σαχάρας
+    en: Sahrawi Arab Democratic Republic
+    es: República Árabe Saharaui Democrática
+    fa: جمهوری دموکراتیک عربی صحرا
+    fr: République arabe sahraouie démocratique
+    it: Repubblica Araba Democratica dei Sahrawi
+    lt: Sacharos Arabų Demokratinė Respublika
+    nl: Arabische Democratische Republiek Sahara
+    pt: República Árabe Saaraui Democrática
+    ru: Сахарская Арабская Демократическая Республика
+    ur: صحراوی عرب عوامی جمہوریہ
+    zh: 撒拉威阿拉伯民主共和國
diff --git a/settings/country-names/er.yaml b/settings/country-names/er.yaml
new file mode 100644 (file)
index 0000000..a223f46
--- /dev/null
@@ -0,0 +1,130 @@
+name: 
+    default: ኤርትራ Eritrea إرتريا
+    af: Eritrea
+    am: ኤርትራ
+    an: Eritrea
+    ar: إرتريا
+    az: Eritreya
+    ba: Эритрея
+    be: Эрытрэя
+    bg: Еритрея
+    bm: Eritrea
+    bn: ইরিত্রিয়া
+    bo: ཨི་རི་ཏྲའ།
+    br: Eritrea
+    bs: Eritreja
+    ca: Eritrea
+    ce: Эритре
+    cs: Eritrea
+    cu: Єрѷѳрїꙗ
+    cy: Eritrea
+    da: Eritrea
+    de: Eritrea
+    dv: އެރިތުރިއާ
+    ee: Eritrea
+    el: Ερυθραία
+    en: Eritrea
+    eo: Eritreo
+    es: Eritrea
+    et: Eritrea
+    eu: Eritrea
+    fa: اریتره
+    fi: Eritrea
+    fo: Eritrea
+    fr: Érythrée
+    fy: Eritreä
+    ga: An Eiritré
+    gd: Eartra
+    gl: Eritrea
+    gn: Erityrea
+    gv: Eritrea
+    he: אריתריאה
+    hi: इरित्रिया
+    hr: Eritreja
+    ht: Eritre
+    hu: Eritrea
+    hy: Էրիթրեա
+    ia: Eritrea
+    id: Eritrea
+    ie: Eritréa
+    io: Eritrea
+    is: Erítrea
+    it: Eritrea
+    ja: エリトリア
+    jv: Eritrea
+    ka: ერიტრეა
+    kg: Eritrea
+    kk: Эритрея
+    kn: ಎರಿಟ್ರಿಯ
+    ko: 에리트레아
+    ku: Erîtrea
+    kw: Eritrea
+    ky: Эритрея
+    la: Erythraea
+    lb: Eritrea
+    li: Eritrea
+    ln: Elitré
+    lt: Eritrėja
+    lv: Eritreja
+    mi: Eritēria
+    mk: Еритреја
+    ml: എരിട്രിയ
+    mn: Эритрей
+    mr: इरिट्रिया
+    ms: Eritrea
+    mt: Eritrea
+    my: အီရီထရီးယားနိုင်ငံ
+    na: Eritrea
+    ne: एरिट्रिया
+    nl: Eritrea
+    nn: Eritrea
+    "no": Eritrea
+    oc: Eritrèa
+    om: Eritrea
+    or: ଇରିଟ୍ରିଆ
+    os: Эритрей
+    pa: ਇਰੀਤਰੀਆ
+    pl: Erytrea
+    ps: اریتره
+    pt: Eritreia
+    qu: Iritriya
+    ro: Eritreea
+    ru: Эритрея
+    rw: Eritereya
+    sa: इरीट्रिया
+    sc: Eritrea
+    se: Eritrea
+    sg: Eritrëe
+    sh: Eritreja
+    sk: Eritrea
+    sl: Eritreja
+    sn: Eritrea
+    so: Eratareya
+    sq: Eritrea
+    sr: Еритреја
+    ss: IRitheya
+    st: Eritrea
+    su: Éritréa
+    sv: Eritrea
+    sw: Eritrea
+    ta: எரித்திரியா
+    te: ఎరిత్రియా
+    tg: Эритрея
+    th: ประเทศเอริเทรีย
+    ti: ኤርትራ
+    tk: Eritreýa
+    tl: Eritrea
+    tr: Eritre
+    ts: Eritreya
+    tt: Эритрея
+    ug: ئېرىترېيە
+    uk: Еритрея
+    ur: اریتریا
+    uz: Eritriya
+    vi: Eritrea
+    vo: Lerüträn
+    wo: Eritere
+    yi: עריטרעא
+    yo: Ẹritrẹ́à
+    zh: 厄立特里亚
+    zu: I-Eritrea
diff --git a/settings/country-names/es.yaml b/settings/country-names/es.yaml
new file mode 100644 (file)
index 0000000..47e051d
--- /dev/null
@@ -0,0 +1,148 @@
+name: 
+    default: España
+    af: Spanje
+    am: እስፓንያ
+    an: Espanya
+    ar: إسبانيا
+    ay: Ispaña
+    az: İspaniya
+    ba: Испания
+    be: Іспанія
+    bg: Испания
+    bi: Spain
+    bn: স্পেন
+    bo: ཞི་པན་ཡ།
+    br: Spagn
+    bs: Španija
+    ca: Espanya
+    ce: Испани
+    ch: España
+    co: Spagna
+    cs: Španělsko
+    cu: Їспанїꙗ
+    cv: Испани
+    cy: Sbaen
+    da: Spanien
+    de: Spanien
+    dv: އިސްޕެއިން
+    dz: སིཔཱེན་
+    ee: Spain
+    el: Ισπανία
+    en: Spain
+    eo: Hispanio
+    es: España
+    et: Hispaania
+    eu: Espainia
+    fa: اسپانیا
+    fi: Espanja
+    fo: Spania
+    fr: Espagne
+    fy: Spanje
+    ga: An Spáinn
+    gd: An Spàinn
+    gl: España
+    gn: España
+    gu: સ્પેન
+    gv: Yn Spaainey
+    he: ספרד
+    hi: स्पेन
+    hr: Španjolska
+    ht: Espay
+    hu: Spanyolország
+    hy: Իսպանիա
+    ia: Espania
+    id: Spanyol
+    ie: Hispania
+    ig: Spain
+    ik: Spaña
+    io: Hispania
+    is: Spánn
+    it: Spagna
+    iu: ᓯᐸᐃᓐ
+    ja: スペイン
+    jv: Spanyol
+    ka: ესპანეთი
+    kg: Espania
+    kk: Испания
+    kl: Spania
+    km: អេស្ប៉ាញ
+    kn: ಸ್ಪೇನ್
+    ko: 스페인
+    ku: Spanya
+    kv: Испания
+    kw: Spayn
+    ky: Испания
+    la: Hispania
+    lb: Spuenien
+    li: Spanje
+    ln: Espania
+    lt: Ispanija
+    lv: Spānija
+    mg: Espaina
+    mi: Peina
+    mk: Шпанија
+    ml: സ്പെയിൻ
+    mn: Испани
+    mr: स्पेन
+    ms: Sepanyol
+    mt: Spanja
+    my: စပိန်နိုင်ငံ
+    na: Pain
+    nb: Spania
+    ne: स्पेन
+    nl: Spanje
+    nn: Spania
+    "no": Spania
+    nv: Dibé Diníí Bikéyah
+    oc: Espanha
+    or: ସ୍ପେନ
+    os: Испани
+    pa: ਸਪੇਨ
+    pl: Hiszpania
+    ps: اسپانیا
+    pt: Espanha
+    qu: Ispaña
+    rm: Spagna
+    rn: Esipanye
+    ro: Spania
+    ru: Испания
+    rw: Esipanye
+    sa: स्पेन्
+    sc: Ispagna
+    se: Espánnja
+    sh: Španija
+    sk: Španielsko
+    sl: Španija
+    sm: Spania
+    so: Isbania
+    sq: Spanja
+    sr: Шпанија
+    ss: Sipeyini
+    st: Spain
+    su: Spanyol
+    sv: Spanien
+    sw: Hispania
+    ta: எசுப்பானியா
+    te: స్పెయిన్
+    tg: Испониё
+    th: ประเทศสเปน
+    tk: Ispaniýa
+    tl: Espanya
+    to: Sepeni
+    tr: İspanya
+    ts: Spaniya
+    tt: Испания
+    ty: Paniora
+    ug: ئىسپانىيە
+    uk: Іспанія
+    ur: ہسپانیہ
+    uz: Ispaniya
+    vi: Tây Ban Nha
+    vo: Spanyän
+    wa: Espagne
+    wo: Ispaañ
+    yi: שפאניע
+    yo: Spéìn
+    za: Sihbanhyaz
+    zh: 西班牙
+    zu: ISpeyini
diff --git a/settings/country-names/et.yaml b/settings/country-names/et.yaml
new file mode 100644 (file)
index 0000000..66e1812
--- /dev/null
@@ -0,0 +1,154 @@
+name: 
+    default: ኢትዮጵያ
+    af: Ethiopië
+    ak: Ithiopia
+    am: ኢትዮጵያ
+    an: Etiopia
+    ar: إثيوبيا
+    av: Хабашистан
+    az: Efiopiya
+    ba: Эфио́пия
+    be: Эфіопія
+    bg: Етиопия
+    bh: इथियोपिया
+    bm: Etiopia
+    bn: ইথিওপিয়া
+    bo: ཨི་ཐི་ཨོ་པི་ཡ།
+    br: Etiopia
+    bs: Etiopija
+    ca: Etiòpia
+    ce: Эфио́пи
+    cs: Etiopie
+    cu: Єѳїопі́ꙗ
+    cv: Эфиопи
+    cy: Ethiopia
+    da: Etiopien
+    de: Äthiopien
+    dv: ޙަބުޝްކަރަ
+    dz: ཨི་ཐི་ཡོ་པི་ཡ
+    ee: Etiopia
+    el: Αιθιοπία
+    en: Ethiopia
+    eo: Etiopio
+    es: Etiopía
+    et: Etioopia
+    eu: Etiopia
+    fa: اتیوپی
+    fi: Etiopia
+    fo: Etiopia
+    fr: Éthiopie
+    fy: Etioopje
+    ga: an Aetóip
+    gd: An Aetiòp
+    gl: Etiopía - Ityop'iya
+    gn: Etiopia
+    gu: ઇથિયોપિયા
+    gv: yn Eetoip
+    ha: Ethiopia
+    he: אתיופיה
+    hi: इथियोपिया
+    hr: Etiopija
+    ht: Etyopi
+    hu: Etiópia
+    hy: Եթովպիա
+    ia: Ethiopia
+    id: Ethiopia
+    ie: Etiopia
+    ig: Ethiopia
+    io: Etiopia
+    is: Eþíópía
+    it: Etiopia
+    ja: エチオピア
+    jv: Étiopia
+    ka: ეთიოპია
+    kg: Itiopia
+    ki: Ethiopia
+    kk: Ефиопия
+    km: អេត្យូពី
+    kn: ಇತಿಯೋಪಿಯ
+    ko: 에티오피아
+    ks: اِتھوپِیا
+    ku: Etiyopya
+    kv: Эфиопия
+    kw: Ethiopi
+    ky: Эфиопия
+    la: Aethiopia
+    lb: Ethiopien
+    lg: Ethiopia
+    li: Ethiopië
+    ln: Etiopi
+    lo: ເອທີໂອເປຍ
+    lt: Etiopija
+    lv: Etiopija
+    mg: Etiopia
+    mi: Etiopia
+    mk: Етиопија
+    ml: എത്യോപ്യ
+    mn: Этиоп
+    mr: इथियोपिया
+    ms: Habsyah
+    mt: Etjopja
+    my: အီသီယိုးပီးယားနိုင်ငံ
+    na: Itiyopiya
+    ne: इथियोपिया
+    nl: Ethiopië
+    nn: Etiopia
+    "no": Etiopia
+    nv: Iithiyópya
+    oc: Etiopia
+    om: Itoophiyaa
+    or: ଇଥିଓପିଆ
+    os: Эфио́пи
+    pa: ਇਥੋਪੀਆ
+    pi: ईथ्योपिया
+    pl: Etiopia
+    ps: اېتوپیا
+    pt: Etiópia
+    qu: Ithiyupya
+    rm: Etiopia
+    ro: Etiopia
+    ru: Эфиопия
+    rw: Etiyopiya
+    sa: ईथ्योपिया
+    sc: Etiòpia
+    se: Etiopia
+    sg: Etiopïi
+    sh: Etiopija
+    si: ඉතියෝපියාව
+    sk: Etiópia
+    sl: Etiópija
+    sm: Ethiopia
+    sn: Ethiopia
+    so: Itoobiya
+    sq: Etiopia
+    sr: Етиопија
+    ss: iTopiya
+    st: Ethiopia
+    su: Étiopia
+    sv: Etiopien
+    sw: Ethiopia
+    ta: எத்தியோப்பியா
+    te: ఇథియోపియా
+    tg: Эфиопия
+    th: เอธิโอเปีย
+    ti: ኢትዮጵያ
+    tk: Efiopiýa
+    tl: Etiyopiya
+    to: ʻItiōpea
+    tr: Etiyopya
+    ts: Topiya
+    tt: Хәбәшстан
+    ug: ئېفىئوپىيە
+    uk: Ефіо́пія
+    ur: ایتھوپیا
+    uz: Efiopiya
+    vi: Ethiopia
+    vo: Lätiopän
+    wa: Etiopeye
+    wo: Ecoopi
+    xh: iTopiya
+    yi: עטיאָפּיע
+    yo: Ethiópíà
+    za: Ethiopia
+    zh: 埃塞俄比亚
+    zu: i-Ithiopia
diff --git a/settings/country-names/fi.yaml b/settings/country-names/fi.yaml
new file mode 100644 (file)
index 0000000..c7c3632
--- /dev/null
@@ -0,0 +1,146 @@
+name: 
+    default: Suomi
+    ab: Суоми
+    af: Finland
+    am: ፊንላንድ
+    an: Finlandia
+    ar: فنلندا
+    ay: Phini suyu
+    az: Finlandiya
+    ba: Финляндия
+    be: Фінляндыя
+    bg: Финландия
+    bi: Finland
+    bm: Finland
+    bn: ফিনল্যান্ড
+    bo: ཧྥིན་ལན
+    br: Finland
+    bs: Finska
+    ca: Finlàndia
+    ce: Финлянди
+    co: Finlandia
+    cs: Finsko
+    cu: Соумь
+    cv: Финлянди
+    cy: Y Ffindir
+    da: Finland
+    de: Finnland
+    dv: ފިންލޭންޑު
+    dz: ཕིན་ལེནཌ་
+    ee: Finland
+    el: Φινλανδία
+    en: Finland
+    eo: Finnlando
+    es: Finlandia
+    et: Soome
+    eu: Finlandia
+    fa: فنلاند
+    fi: Suomi
+    fo: Finnland
+    fr: Finlande
+    fy: Finlân
+    ga: An Fhionlainn
+    gd: Suòmaidh
+    gl: Finlandia
+    gn: Hĩlandia
+    gu: ફીનલેંડ
+    gv: Finnlynn
+    he: פינלנד
+    hi: फ़िनलैंड
+    hr: Finska
+    ht: Fenlann
+    hu: Finnország
+    hy: Ֆինլանդիա
+    ia: Finlandia
+    id: Finlandia
+    ie: Finland
+    ig: Finland
+    io: Finlando
+    is: Finnland
+    it: Finlandia
+    iu: ᐃᓐᓚᓐᑦ
+    ja: フィンランド
+    jv: Finlandia
+    ka: ფინეთი
+    kg: Finlandi
+    ki: Finland
+    kk: Финландия
+    kl: Finlandi
+    kn: ಫಿನ್‍ಲ್ಯಾಂಡ್
+    ko: 핀란드
+    ks: فننش
+    ku: Fînland
+    kv: Финляндия
+    kw: Pow Finn
+    ky: Финляндия
+    la: Finnia
+    lb: Finnland
+    lg: Finilandi
+    li: Finland
+    ln: Finilanda
+    lt: Suomija
+    lv: Somija
+    mg: Finlandy
+    mi: Whinarana
+    mk: Финска
+    ml: ഫിൻലാന്റ്
+    mn: Финлянд
+    mr: फिनलंड
+    ms: Finland
+    mt: Finlandja
+    my: ဖင်လန်နိုင်ငံ
+    na: Finland
+    ne: फिनल्याण्ड
+    nl: Finland
+    nn: Finland
+    "no": Finland
+    nv: Nahoditsʼǫʼłání
+    oc: Finlàndia
+    or: ଫିନଲ୍ୟାଣ୍ଡ
+    os: Финлянди
+    pa: ਫ਼ਿਨਲੈਂਡ
+    pl: Finlandia
+    ps: فېنلانډ
+    pt: Finlândia
+    qu: Phinsuyu
+    rm: Finlanda
+    ro: Finlanda
+    ru: Финляндия
+    rw: Finilande
+    sa: फिन्लैंड
+    sc: Finlandia
+    se: Suopma
+    sh: Finska
+    si: ෆින්ලන්තය
+    sk: Fínsko
+    sl: Finska
+    sm: Finalagi
+    so: Finland
+    sq: Finlanda
+    sr: Финска
+    ss: IFini
+    st: Finland
+    su: Finlandia
+    sv: Finland
+    sw: Ufini
+    ta: பின்லாந்து
+    te: ఫిన్లెండ్
+    tg: Финланд
+    th: ประเทศฟินแลนด์
+    tk: Finlýandiýa
+    tl: Pinlandiya
+    tr: Finlandiya
+    tt: Finlândiä
+    ug: فىنلاندىيە
+    uk: Фінляндія
+    ur: فن لینڈ
+    uz: Finlandiya
+    vi: Phần Lan
+    vo: Suomiyän
+    wa: Finlande
+    wo: Finlaand
+    yi: פינלאנד
+    yo: Finlandi
+    za: Finlan
+    zh: 芬兰
+    zu: IFinlandi
diff --git a/settings/country-names/fj.yaml b/settings/country-names/fj.yaml
new file mode 100644 (file)
index 0000000..8d2b680
--- /dev/null
@@ -0,0 +1,121 @@
+name: 
+    default: Viti
+    af: Fidji
+    am: ፊጂ
+    an: Fichi
+    ar: فيجي
+    az: Fici
+    ba: Фиджи
+    be: Фіджы
+    bg: Фиджи
+    bh: फिजी
+    bn: ফিজি
+    bo: ཧྥི་ཇི།
+    br: Fidji
+    bs: Fidži
+    ca: Fiji
+    ce: Фиджи
+    cs: Fidži
+    cv: Фиджи
+    cy: Fiji
+    da: Fiji
+    de: Fidschi
+    dv: ފިޖީ
+    el: Φίτζι
+    en: Fiji
+    eo: Fiĝioj
+    es: Fiyi
+    et: Fidži
+    eu: Fiji
+    fa: فیجی
+    ff: Fiiji
+    fi: Fidži
+    fj: Viti
+    fo: Fiji
+    fr: Fidji
+    fy: Fidzjy
+    ga: Fidsí
+    gd: Fìdi
+    gl: Fidxi - Viti
+    gv: Fiji
+    he: פיג'י
+    hi: फ़िजी
+    hr: Fidži
+    ht: Fidji
+    hu: Fidzsi-szigetek
+    hy: Ֆիջի
+    ia: Fiji
+    id: Fiji
+    io: Fidji
+    is: Fídjieyjar
+    it: Figi
+    ja: フィジー
+    jv: Fiji
+    ka: ფიჯი
+    kk: Фиджи
+    kn: ಫಿಜಿ
+    ko: 피지
+    ku: Fîjî
+    kw: Fiji
+    la: Viti
+    lb: Fidschi
+    li: Fiji
+    lt: Fidžis
+    lv: Fidži
+    mi: Whītī
+    mk: Фиџи
+    ml: ഫിജി
+    mn: Фижи
+    mr: फिजी
+    ms: Fiji
+    mt: Fiġi
+    my: ဖီဂျီနိုင်ငံ
+    na: Bidji
+    ne: फिजी
+    nl: Fiji
+    nn: Fiji
+    "no": Fiji
+    nv: Fííjii
+    oc: Fiji
+    or: ଫିଜି
+    os: Фиджи
+    pa: ਫ਼ਿਜੀ
+    pl: Fidżi
+    pt: Fiji
+    qu: Phiyi
+    ro: Fiji
+    ru: Фиджи
+    rw: Fiji
+    sa: फिजी
+    se: Fiži
+    sg: Fidyïi
+    sh: Fidži
+    si: ෆීජි
+    sk: Fidži
+    sl: Fidži
+    sm: Fiti
+    so: Fiji
+    sq: Fixhi
+    sr: Фиџи
+    su: Fiji
+    sv: Fiji
+    sw: Fiji
+    ta: பிஜி
+    te: ఫిజీ
+    tg: Фиҷи
+    th: ประเทศฟิจิ
+    tl: Piyi
+    to: Fisi
+    tr: Fiji
+    tt: Fiji
+    ug: فىجى
+    uk: Фіджі
+    ur: فجی
+    uz: Fiji
+    vi: Fiji
+    vo: Ficiyuäns
+    wo: Fiiji
+    yi: פידזשי
+    yo: Fíjì
+    zh: 斐濟
+    zu: IFiji
diff --git a/settings/country-names/fk.yaml b/settings/country-names/fk.yaml
new file mode 100644 (file)
index 0000000..a7bae93
--- /dev/null
@@ -0,0 +1,105 @@
+name: 
+    default: Falkland Islands
+    af: Falklandeilande
+    ak: Fɔlkman Aeland
+    am: ፎክላንድ ደሴቶች (ኢስላስ ማልቪናስ)
+    ar: جزر الفولكلاند
+    az: Folkland Adaları
+    be: Фалклендскія астравы
+    bg: Фолкландски острови (Малвини)
+    bm: Maluwini Gun
+    bn: ফকল্যান্ড আইল্যান্ড (ইসল্যাস মাসভেনিস)
+    bo: ཕལྐ་ལནྜ་གླིང་ཕྲན།
+    br: Inizi Falkland (Inizi Maloù)
+    bs: Folklandska ostrva (Malvinska ostrva)
+    ca: Illes Malvines
+    cs: Falklandy
+    cy: Ynysoedd y Falklands
+    da: Falklandsøerne
+    de: Falklandinseln
+    dz: ཕལྐ་ལནྜ་གླིང་ཚོམ (ཨིས་ལཱས་མལ་བི་ཎཱས)
+    ee: Falkland ƒudomekpowo (Islas Malvinas) nutome
+    el: Νήσοι Φώκλαντ
+    en: Falkland Islands
+    eo: Falklandoj
+    es: Islas Malvinas
+    et: Falklandi saared
+    eu: Falkland uharteak (Malvina uharteak)
+    fa: جزایر فالکلند
+    ff: Duuɗe Falkland
+    fi: Falklandinsaaret
+    fo: Falklandsoyggjarnar
+    fr: Îles Malouines (Îles Falkland)
+    fy: Falklâneilannen
+    ga: Oileáin Fháclainne
+    gd: Na h-Eileanan Fàclainn
+    gl: Illas Malvinas
+    gu: ફૉકલેન્ડ આઇલેન્ડ્સ
+    gv: Ny Malveenaghyn
+    ha: Tsibiran Falkilan
+    he: איי פוקלנד (מלווינס)
+    hi: फ़ॉकलैंड आइलैंड (इज्लास माल्विनास)
+    hr: Falklandski Otoci
+    hu: Falkland-szigetek
+    id: Kepulauan Falkland
+    is: Falklandseyjar
+    it: Isole Falkland
+    ja: フォークランド諸島 (マルビナス諸島)
+    ka: ფალკლენდის კუნძულები
+    ki: Visiwa vya Falkland
+    kl: Falklandi qeqertaq
+    km: កោះ​ហ្វក់ឡែន (Islas Malvinas)
+    kn: ಫಾಲ್ಕ್‌ಲ್ಯಾಂಡ್ ದ್ವೀಪಗಳು (ಇಸ್ಲಾಸ್ ಮಾಲ್ವಿನಸ್)
+    ko: 포클랜드 제도 (말비나스 군도)
+    ks: فٕلاکلینٛڑ جٔزیٖرٕ
+    ku: Giravên Malvîn
+    la: Insulae Malvinae
+    lb: Falkland Inselen
+    lg: Bizinga by'eFalikalandi
+    ln: Bisanga bya Falkland
+    lo: ຫມູ່ເກາະຟອກແລນ (ອິສລາສ ມາວິລນາສ)
+    lt: Folklando (Malvinų) Salos
+    lv: Folklenda salas
+    mg: Nosy Falkand
+    mk: Фолкландски Острови
+    ml: ഫോക്ൿലൻഡ് ദ്വീപുകൾ (മൽവിനാസ്)
+    mn: Фолклендийн Арлууд
+    mr: फॉकलंड बेटे (इस्लास मालविनास)
+    ms: Kepulauan Falkland (Islas Malvinas)
+    mt: Falkland Islands
+    my: ဖောက်ကလန် ကျွန်းစု
+    ne: फक्ल्याण्ड टापुहरू (इज्लास माल्भिनास)
+    nl: Falklandeilanden
+    nn: Falklandsøyane
+    "no": Falklandsøyene
+    or: ଫଲ୍କଲ୍ୟାଣ୍ଡ ଦ୍ବୀପପୁଞ୍ଜ
+    pl: Falklandy
+    pt: Ilhas Malvinas
+    rm: Inslas dal Falkland
+    rn: Izinga rya Filikilandi
+    ro: Insulele Falkland
+    ru: Фолклендские острова
+    se: Falklandsullot
+    sg: Âzûâ tî Mälüîni
+    si: ෆෝක්ලන්ත දූපත් (අයිලස් මල්වියනාස්)
+    sk: Falklandy
+    sl: Falklandi
+    sn: Zvitsuwa zveFalklands
+    so: Jaziiradaha Fooklaan
+    sr: Фокландска (Малвинска) Острва
+    sv: Falklandsöarna
+    sw: Visiwa vya Falklandi (Islas Malvinas)
+    ta: ஃபாக்லாந்து தீவுகள் (இஸ்லாஸ் மால்வினஸ்)
+    te: ఫాక్ లేండ్ దీవులు (ఇస్లాస్ మాల్వినాస్)
+    th: หมู่เกาะฟอล์กแลนด์
+    ti: የፎልክላንድ ደሴቶች
+    tl: Kapuluang Falkland (Kapuluang Malvinas)
+    to: ʻOtumotu Fokuleni
+    tr: Falkland Adaları
+    tt: Фолкленд утраулары
+    uk: Фолклендські острови
+    ur: فاکلینڈ آئلینڈز (ازلاس مالوینس)
+    vi: Quần đảo Falkland
+    yo: Orílẹ́ède Etikun Fakalandi
+    zh: 福克兰群岛
+    zu: i-Falkland Islands (i-Islas Malvinas)
diff --git a/settings/country-names/fm.yaml b/settings/country-names/fm.yaml
new file mode 100644 (file)
index 0000000..f49daa5
--- /dev/null
@@ -0,0 +1,49 @@
+name: 
+    default: Micronesia
+    af: Mikronesië
+    ar: ميكرونيسيا
+    be: Мікранэзія
+    br: Mikronezia
+    ca: Micronèsia
+    cs: Mikronésie
+    da: Mikronesien
+    de: Föderierte Staaten von Mikronesien
+    en: Federated States of Micronesia
+    eo: Mikronezio
+    es: Estados Federados de Micronesia
+    et: Mikroneesia
+    fa: میکرونزی
+    fi: Mikronesia
+    fr: États fédérés de Micronésie
+    fy: Mikroneezje
+    ga: An Mhicrinéis
+    gd: Na Meanbh Eileanan
+    he: מיקרונזיה
+    hr: Mikronezija
+    hu: Mikronézia
+    ia: Micronesia
+    id: Mikronesia
+    io: Mikronezia
+    is: Míkrónesía
+    lb: Mikronesien
+    li: Micronesië
+    lt: Mikronezija
+    lv: Mikronēzija
+    mn: Микронези
+    nl: Micronesia
+    "no": Mikronesia
+    oc: Estats Federats de Micronesia
+    pl: Mikronezja
+    ru: Федеративные Штаты Микронезии
+    se: Mikronesia
+    sk: Mikronézia
+    sl: Mikronezija
+    sr: Микронезија
+    sv: Mikronesiens federerade stater
+    ta: மைக்குரோனீசியக் கூட்டு நாடுகள்
+    th: ประเทศไมโครนีเซีย
+    tr: Mikronezya
+    uk: Федеративні Штати Мікронезії
+    vi: Liên bang Micronesia
+    vo: Smala-Seanuäns
+    zh: 密克罗尼西亚 / 密克羅尼西亞
diff --git a/settings/country-names/fo.yaml b/settings/country-names/fo.yaml
new file mode 100644 (file)
index 0000000..11129fa
--- /dev/null
@@ -0,0 +1,101 @@
+name: 
+    default: Føroyar
+    af: Faroëreilande
+    am: ፋሮ ደሴቶች
+    an: Islas Feroe
+    ar: جزر فارو
+    az: Farer adaları
+    be: Фарэрскія астравы
+    bg: Ферьорски острови
+    bi: Faroe aelan
+    br: Faero
+    bs: Farska ostrva
+    ca: Illes Fèroe
+    ce: Фарерийн гІайренаш
+    cs: Faerské ostrovy
+    cy: Føroyar
+    da: Færøerne
+    de: Färöer
+    dv: ފަރޮއޭ ޖަޒީރާ
+    ee: Faroe Islands
+    el: Νήσοι Φερόες
+    en: Faroe Islands
+    eo: Ferooj
+    es: Islas Feroe
+    et: Fääri saared
+    eu: Faroeak
+    fa: جزایر فارو
+    fi: Färsaaret
+    fo: Føroyar
+    fr: Îles Féroé
+    fy: Faeröer
+    ga: Oileáin Fharó
+    gd: Na h-Eileanan Fàro
+    gl: Illas Feroe
+    gu: ફરો દ્વિપસમૂહ
+    gv: Ellanyn ny Geyrragh
+    he: איי פארו
+    hi: फ़रो द्वीपसमूह
+    hr: Ferojski Otoci
+    hu: Feröer
+    hy: Ֆարերյան կղզիներ
+    ia: Insulas Feroe
+    id: Kepulauan Faroe
+    io: Faero
+    is: Færeyjar
+    it: Fær Øer
+    ja: フェロー諸島
+    jv: Kapuloan Faroe
+    ka: ფარერის კუნძულები
+    kk: Фарер аралдары
+    kl: Savalimmiut
+    ko: 페로 제도
+    ku: Giravên Feroe
+    kv: Фарер діяс
+    kw: Ynysow Faroe
+    la: Faeroae insulae
+    li: Faeröer
+    lt: Farerai
+    lv: Fēru Salas
+    mi: Moutere Faroe
+    mk: Фарски Острови
+    mn: Фарерын арлууд
+    mr: फेरो द्वीपसमूह
+    ms: Kepulauan Faroe
+    mt: Gżejjer Faroe
+    ne: फरोइ टापु
+    nl: Faeröer
+    nn: Færøyane
+    "no": Færøyene
+    oc: Illas Feròe
+    os: Фареры сакъадæхтæ
+    pl: Wyspy Owcze
+    pt: Ilhas Feroe
+    qu: Pharuy
+    rm: Inslas Feroe
+    ro: Insulele Feroe
+    ru: Фарерские острова
+    rw: Ibirwa bya Farowe
+    se: Fearsullot
+    sh: Farski Otoci
+    si: ෆාරෝ දිවයින්
+    sk: Faerské ostrovy
+    sl: Ferski otoki
+    so: Jasiiradaha Feroe
+    sq: Ishujt Faroe
+    sr: Фарска Острва
+    su: Kapuloan Faroe
+    sv: Färöarna
+    sw: Visiwa vya Faroe
+    ta: பரோயே தீவுகள்
+    tg: Ҷазираҳои Фаро
+    th: หมู่เกาะแฟโร
+    tl: Kapuluang Peroe
+    tr: Faroe Adaları
+    tt: Фарер утраулары
+    uk: Фарерські острови
+    ur: جزائرفارو
+    vi: Quần đảo Faroe
+    wo: Duni Faarow
+    yo: Àwọn Erékùṣù Fàróè
+    zh: 法罗群岛
diff --git a/settings/country-names/fr.yaml b/settings/country-names/fr.yaml
new file mode 100644 (file)
index 0000000..b1a1046
--- /dev/null
@@ -0,0 +1,155 @@
+name: 
+    default: France
+    af: Frankryk
+    ak: Frɛnkyeman
+    am: ፈረንሣይ
+    an: Francia
+    ar: فرنسا
+    as: ফ্ৰান্স
+    ay: Phransiya
+    az: Fransa
+    ba: Франция
+    be: Францыя
+    bg: Франция
+    bi: Franis
+    bm: France
+    bn: ফ্রান্স
+    bo: ཧྥ་རན་སི།
+    br: Bro-C'hall
+    bs: Francuska
+    ca: França
+    ce: Франци
+    co: Francia
+    cs: Francie
+    cu: Франкїꙗ
+    cv: Франци
+    cy: Ffrainc
+    da: Frankrig
+    de: Frankreich
+    dv: ފަރަންސޭސިވިލާތް
+    dz: ཕརཱནསི་
+    ee: France
+    el: Γαλλία
+    en: France
+    eo: Francio
+    es: Francia
+    et: Prantsusmaa
+    eu: Frantzia
+    fa: فرانسه
+    ff: Faransi
+    fi: Ranska
+    fo: Frakland
+    fr: France
+    fy: Frankryk
+    ga: An Fhrainc
+    gd: An Fhraing
+    gl: Francia
+    gn: Hyãsia
+    gu: ફ્રાન્સ
+    gv: Yn Rank
+    ha: Faransa
+    he: צרפת
+    hi: फ़्रान्स
+    hr: Francuska
+    ht: Frans
+    hu: Franciaország
+    hy: Ֆրանսիա
+    ia: Francia
+    id: Perancis
+    ie: Francia
+    io: Francia
+    is: Frakkland
+    it: Francia
+    ja: フランス
+    jv: Prancis
+    ka: საფრანგეთი
+    kg: Fwalansa
+    ki: Ubaranja
+    kk: Франция
+    kl: Frankrigi
+    km: បារាំង
+    kn: ಫ್ರಾನ್ಸ್
+    ko: 프랑스
+    ks: فرٛانس
+    ku: Fransa
+    kv: Франция
+    kw: Pow Frynk
+    ky: Франция
+    la: Francia
+    lb: Frankräich
+    lg: Bufalansa
+    li: Frankriek
+    ln: Falansia
+    lo: ປະເທດຝະລັ່ງ
+    lt: Prancūzija
+    lv: Francija
+    mg: Frantsa
+    mi: Wīwī
+    mk: Франција
+    ml: ഫ്രാൻസ്
+    mn: Франц
+    mo: Франца
+    mr: फ्रान्स
+    ms: Perancis
+    mt: Franza
+    my: ပြင်သစ်နိုင်ငံ
+    na: Prant
+    ne: फ्रान्स
+    nl: Frankrijk
+    nn: Frankrike
+    "no": Frankrike
+    nv: Dáághahii Dineʼé Bikéyah
+    oc: França
+    or: ଫ୍ରାନ୍ସ
+    os: Франц
+    pa: ਫ੍ਰਾਂਸ
+    pl: Francja
+    ps: فرانسه
+    pt: França
+    qu: Ransiya
+    rm: Frantscha
+    rn: Francia
+    ro: Franța
+    ru: Франция
+    rw: Ubufaransa
+    sa: फ्रान्सदेशः
+    sc: Frantza
+    se: Frankriika
+    sg: Farânzi
+    sh: Francuska
+    si: ප්රංශය
+    sk: Francúzsko
+    sl: Francija
+    sm: Farani
+    so: Faransiiska
+    sq: Franca
+    sr: Француска
+    ss: IFulansi
+    st: Fora
+    su: Perancis
+    sv: Frankrike
+    sw: Ufaransa
+    ta: பிரான்சு
+    te: ఫ్రాన్స్
+    tg: Фаронса
+    th: ประเทศฝรั่งเศส
+    ti: ፈረንሳይ
+    tk: Fransiýa
+    tl: Pransiya
+    to: Falanisē
+    tr: Fransa
+    tt: Франция
+    ty: Farāni
+    ug: فرانسىيە
+    uk: Франція
+    ur: فرانس
+    uz: Fransiya
+    vi: Pháp
+    vo: Fransän
+    wa: France
+    wo: Faraas
+    yi: פראנקרייך
+    yo: Fránsì
+    za: Fazgoz
+    zh: 法國/法国
+    zu: IFulansi
diff --git a/settings/country-names/ga.yaml b/settings/country-names/ga.yaml
new file mode 100644 (file)
index 0000000..314ecb8
--- /dev/null
@@ -0,0 +1,131 @@
+name: 
+    default: Gabon
+    af: Gaboen
+    am: ጋቦን
+    an: Gabón
+    ar: الغابون
+    az: Qabon
+    ba: Габон
+    be: Габон
+    bg: Габон
+    bm: Gabon
+    bn: গাবন
+    bo: གེ་བོན།
+    br: Gabon
+    bs: Gabon
+    ca: Gabon
+    ce: Габон
+    cs: Gabon
+    cv: Габон
+    cy: Gabon
+    da: Gabon
+    de: Gabun
+    dv: ގެބޯން
+    dz: གྷེ་བྷོན
+    el: Γκαμπόν
+    en: Gabon
+    eo: Gabono
+    es: Gabón
+    et: Gabon
+    eu: Gabon
+    fa: گابن
+    ff: Gabon
+    fi: Gabon
+    fr: Gabon
+    fy: Gabon
+    ga: An Ghabúin
+    gd: Gabon
+    gl: Gabón
+    gv: Gabon
+    he: גבון
+    hi: गबॉन
+    hr: Gabon
+    ht: Gabon
+    hu: Gabon
+    hy: Գաբոն
+    ia: Gabon
+    id: Gabon
+    ie: Gabon
+    io: Gabon
+    is: Gabon
+    it: Gabon
+    ja: ガボン
+    jv: Gabon
+    ka: გაბონი
+    kg: Ngabu
+    ki: Gabon
+    kk: Габон
+    kn: ಗಬೊನ್
+    ko: 가봉
+    ks: گیبان
+    ku: Gabon
+    kw: Gabon
+    la: Gabonia
+    lb: Gabun
+    li: Gabon
+    ln: Gabɔ́
+    lt: Gabonas
+    lv: Gabona
+    mi: Kāpona
+    mk: Габон
+    ml: ഗാബോൺ
+    mn: Габон
+    mr: गॅबन
+    ms: Gabon
+    mt: Gabon
+    my: ဂါဘွန်နိုင်ငံ
+    na: Gabun
+    ne: गाबोन
+    nl: Gabon
+    nn: Gabon
+    "no": Gabon
+    nv: Gabǫ́ǫ́
+    oc: Gabon
+    or: ଗାବୋନ
+    os: Габон
+    pa: ਗਬਾਨ
+    pl: Gabon
+    ps: ګابن
+    pt: Gabão
+    qu: Gabun
+    rm: Gabun
+    ro: Gabon
+    ru: Габон
+    rw: Gabon
+    sa: गाबोन
+    sc: Gabòn
+    se: Gabon
+    sg: Gaböon
+    sh: Gabon
+    si: ගැබොන්
+    sk: Gabon
+    sl: Gabon
+    sn: Gabon
+    so: Gabon
+    sq: Gaboni
+    sr: Габон
+    ss: IGabhoni
+    st: Gabon
+    su: Gabon
+    sv: Gabon
+    sw: Gabon
+    ta: காபோன்
+    te: గబాన్
+    tg: Габон
+    th: ประเทศกาบอง
+    tk: Gabon
+    tl: Gabon
+    tr: Gabon
+    ts: Gaboni
+    tt: Габон
+    ug: گابون
+    uk: Габон
+    ur: گیبون
+    uz: Gabon
+    vi: Gabon
+    vo: Gabunän
+    wo: Gaboŋ
+    yi: גאבאן
+    yo: Gàbọ̀n
+    zh: 加蓬
+    zu: IGaboni
diff --git a/settings/country-names/gb.yaml b/settings/country-names/gb.yaml
new file mode 100644 (file)
index 0000000..c3bcb71
--- /dev/null
@@ -0,0 +1,157 @@
+short_name:
+    default: UK
+name:
+    default: United Kingdom
+    ab: Британиа Ду
+    af: Verenigde Koninkryk
+    ak: United Kingdom
+    am: ዩናይትድ ኪንግደም
+    an: Reino Unito
+    ar: المملكة المتحدة
+    as: যুক্তৰাজ্য
+    av: Кӏудабиритан
+    az: Böyük Britaniya
+    ba: Бөйөк Британия
+    be: Вялікабрытанія
+    bg: Обединено кралство Великобритания и Северна Ирландия
+    bh: यूनाइटेड किंगडम
+    bi: Unaeted Kingdom
+    bn: যুক্তরাজ্য
+    bo: དབྱིན་ཇི་མཉམ་འབྲེལ།
+    br: Rouantelezh-Unanet
+    bs: Ujedinjeno Kraljevstvo Velike Britanije i Sjeverne Irske
+    ca: Regne Unit
+    ce: Йоккха Британи
+    ch: Reinu Unidu
+    co: Regnu Unitu
+    cs: Spojené království
+    cu: Вєлика Британїꙗ
+    cv: Аслă Британи
+    cy: Deyrnas Unedig
+    da: Storbritannien
+    de: Vereinigtes Königreich
+    dv: ޔުނައިޓެޑް ކިންގްޑަމް
+    dz: ཡུ་ནའི་ཊེཊ་ཀིང་ཌམ
+    ee: United Kingdom
+    el: Ηνωμένο Βασίλειο
+    en: United Kingdom
+    eo: Unuiĝinta Reĝlando
+    es: Reino Unido
+    et: Suurbritannia
+    eu: Erresuma Batua
+    fa: بریتانیا
+    ff: Biritaani-Mawndi
+    fi: Yhdistynyt kuningaskunta
+    fo: Stóra Bretland
+    fr: Royaume-Uni
+    fy: Feriene Keninkryk
+    ga: An Ríocht Aontaithe
+    gd: An Rìoghachd Aonaichte
+    gl: Reino Unido
+    gn: Tavetã Joaju
+    gu: યુનાઇટેડ કિંગડમ
+    gv: Reeriaght Unnaneysit
+    ha: Birtaniya
+    he: הממלכה המאוחדת
+    hi: यूनाइटेड किंगडम
+    hr: Ujedinjeno Kraljevstvo
+    ht: Wayòm Ini
+    hu: Egyesült Királyság
+    hy: Միացյալ Թագավորություն
+    ia: Regno Unite
+    id: Britania Raya
+    ie: Reyatu Unit
+    ig: Obodoézè Nà Ofú
+    io: Unionita Rejio
+    is: Bretland
+    it: Regno Unito
+    iu: ᑐᓗᐃᑦ ᓄᓈᑦ
+    ja: イギリス
+    jv: Britania Raya
+    ka: გაერთიანებული სამეფო
+    kg: Royaume-Uni
+    kk: Ұлыбритания
+    kl: Tuluit Nunaat
+    km: រាជាណាចក្ររួម
+    kn: ಯುನೈಟೆಡ್ ಕಿಂಗ್‌ಡಂ
+    ko: 영국
+    ku: Keyaniya Yekbûyî
+    kv: Ыджыд Британия
+    kw: Ruwvaneth Unys
+    ky: Улуу Британия жана Түндүк Ирландия
+    la: Britanniarum Regnum
+    lb: Groussbritannien an Nordirland
+    li: Vereineg Keuninkriek
+    ln: Ingɛlɛ́tɛlɛ
+    lo: ສະຫະຣາຊອານາຈັກ
+    lt: Jungtinė Karalystė
+    lv: Apvienotā Karaliste
+    mg: Fanjakana Mitambatra
+    mi: Kīngitanga Kotahi
+    mk: Обединето Кралство
+    ml: യുണൈറ്റഡ് കിങ്ഡം
+    mn: Их Британи
+    mr: युनायटेड किंग्डम
+    ms: United Kingdom
+    mt: Renju Unit
+    my: ယူနိုက်တက်ကင်းဒမ်းနိုင်ငံ
+    na: Ingerand
+    ne: संयुक्त अधिराज्य
+    nl: Verenigd Koninkrijk
+    nn: Storbritannia
+    "no": Storbritannia
+    nv: Tótaʼ Dineʼé Bikéyah
+    oc: Reialme Unit
+    om: Yunaayitid Kingidem
+    or: ଯୁକ୍ତରାଜ୍ୟ
+    os: Стыр Британи
+    pa: ਸੰਯੁਕਤ ਬਾਦਸ਼ਾਹੀ
+    pl: Wielka Brytania
+    ps: بريتانيا
+    pt: Reino Unido
+    qu: Hukllachasqa Qhapaq Suyu
+    rm: Reginavel Unì
+    ro: Regatul Unit al Marii Britanii și al Irlandei de Nord
+    ru: Великобритания
+    rw: Ubwongereza
+    sa: संयुक्त अधिराज्य
+    sc: Rennu Auniadu
+    sd: گڏيل بادشاھت
+    se: Ovttastuvvan gonagasriika
+    sh: Ujedinjeno Kraljevstvo
+    si: එක්සත් රාජධානිය
+    sk: Spojené kráľovstvo
+    sl: Združeno kraljestvo Velike Britanije in Severne Irske
+    sm: Peretānia
+    sn: United Kingdom
+    so: Midowga boqortooyada Britan
+    sq: Mbretëria e Bashkuar e Britanisë dhe Irlandës së Veriut
+    sr: Уједињено Краљевство
+    ss: United Kingdom
+    su: Britania
+    sv: Storbritannien
+    sw: Ufalme wa Muungano
+    ta: ஐக்கிய இராச்சியம்
+    te: యునైటెడ్ కింగ్‌డమ్
+    tg: Подшоҳии Муттаҳида
+    th: สหราชอาณาจักร
+    tk: Birleşen Patyşalyk
+    tl: Nagkakaisang Kaharian
+    to: Pilitānia
+    tr: Birleşik Krallık
+    tt: Бөекбритания
+    tw: United Kingdom
+    ty: Paratāne
+    ug: بۈيۈك بېرىتانىيە
+    uk: Велика Британія
+    ur: برطانیہ
+    uz: Birlashgan Qirollik
+    vi: Vương quốc Anh
+    vo: Regän Pebalöl
+    wa: Rweyåme-Uni
+    wo: Nguur-Yu-Bennoo
+    yi: פאראייניגטע קעניגרייך
+    yo: Ilẹ̀ọba Aṣọ̀kan
+    za: Yinghgoz
+    zh: 英国/英國
+    zu: Umbuso Ohlangeneyo
diff --git a/settings/country-names/gd.yaml b/settings/country-names/gd.yaml
new file mode 100644 (file)
index 0000000..23806e1
--- /dev/null
@@ -0,0 +1,40 @@
+name: 
+    default: Grenada
+    ar: غرينادا
+    be: Грэнада
+    br: Grenada
+    cs: Grenada
+    da: Grenada
+    de: Grenada
+    el: Γρενάδα
+    en: Grenada
+    eo: Grenado
+    es: Granada
+    fa: گرنادا
+    fi: Grenada
+    fr: Grenade
+    fy: Grenada
+    ga: Greanáda
+    gd: Greanada
+    he: גרנדה
+    hr: Grenada
+    hu: Grenada
+    is: Grenada
+    it: Grenada
+    ja: グレナダ
+    la: Granata
+    lb: Granada
+    lv: Grenāda
+    mn: Гренада
+    nl: Grenada
+    pl: Granada
+    pt: Granada
+    ru: Гренада
+    se: Grenada
+    sl: Grenada
+    sv: Grenada
+    ta: கிரெனடா
+    th: ประเทศเกรเนดา
+    uk: Гренада
+    vo: Grenadeän
+    zh: 格林纳达
diff --git a/settings/country-names/ge.yaml b/settings/country-names/ge.yaml
new file mode 100644 (file)
index 0000000..20066f8
--- /dev/null
@@ -0,0 +1,124 @@
+name: 
+    default: საქართველო
+    ab: Қырҭтәыла
+    af: Georgië
+    am: ጂዮርጂያ
+    an: Cheorchia
+    ar: جورجيا
+    av: Гуржи
+    az: Gürcüstan
+    be: Грузія
+    bg: Грузия
+    bn: জর্জিয়া (রাষ্ট্র)
+    bo: འཇོར་ཇི་ཡ། (རྒྱལ་ཁབ།)
+    br: Jorjia (bro)
+    bs: Gruzija
+    ca: Geòrgia
+    ce: Гуьржийчоь
+    cs: Gruzie
+    cu: Гєѡргїꙗ
+    cv: Грузи
+    cy: Georgia
+    da: Georgien
+    de: Georgien
+    dv: ޖޯޖިޔާ (ޤައުމު)
+    dz: ཇཽ་ཇཱ
+    ee: Georgia
+    el: Γεωργία
+    en: Georgia
+    eo: Kartvelio
+    es: Georgia
+    et: Gruusia
+    eu: Georgia
+    fa: گرجستان
+    fi: Georgia
+    fo: Georgia (land)
+    fr: Géorgie
+    fy: Geörgje
+    ga: An tSeoirsia
+    gd: A' Chairtbheil
+    gl: Xeorxia - საქართველო
+    gu: જ્યોર્જીયા (દેશ)
+    gv: Yn Çhorshey
+    he: גאורגיה
+    hi: जॉर्जिया
+    hr: Gruzija
+    ht: Jeoji
+    hu: Grúzia
+    hy: Վրաստան
+    ia: Georgia
+    id: Georgia
+    ie: Georgia
+    io: Gruzia
+    is: Georgía
+    it: Georgia
+    ja: グルジア
+    jv: Georgia
+    ka: საქართველო
+    kk: Грузия
+    kn: ಜಾರ್ಜಿಯ
+    ko: 조지아 (국가)
+    ku: Gurcistan
+    kv: Грузия
+    kw: Pow Grouzi
+    ky: Грузия
+    la: Georgia
+    lb: Georgien
+    li: Georgië
+    lt: Gruzija
+    lv: Gruzija
+    mi: Hōria
+    mk: Грузија
+    ml: ജോർജ്ജിയ
+    mn: Гүрж
+    mr: जॉर्जिया
+    ms: Georgia
+    mt: Ġeorġja
+    my: ဂျော်ဂျီယာနိုင်ငံ
+    na: Djiordjiya
+    ne: जर्जिया (देश)
+    nl: Georgië
+    nn: Georgia
+    "no": Georgia
+    nv: Jóojah (Kéyah)
+    oc: Georgia (Caucàs)
+    or: ଜର୍ଜିଆ
+    os: Гуырдзыстон
+    pl: Gruzja
+    ps: ګرجستان
+    pt: Geórgia
+    qu: Kartulsuyu
+    ro: Georgia
+    ru: Грузия
+    rw: Geworugiya
+    sc: Georgia
+    se: Georgia
+    sh: Gruzija
+    si: ජෝර්ජියා (රට)
+    sk: Gruzínsko
+    sl: Gruzija
+    so: Joorjiya
+    sq: Gjeorgjia
+    sr: Грузија
+    ss: IJojiya
+    su: Géorgia
+    sv: Georgien
+    sw: Georgia (nchi)
+    ta: சியார்சியா (நாடு)
+    te: జార్జియా (దేశం)
+    tg: Гурҷистон
+    th: ประเทศจอร์เจีย
+    tk: Gruziýa
+    tl: Heorhiya
+    tr: Gürcistan
+    tt: Гөрҗистан
+    ug: گرۇزىيە
+    uk: Грузія
+    ur: جارجیا
+    uz: Gurjiston
+    vi: Gruzia
+    vo: Grusiyän
+    wo: Jeoorji
+    yi: גרוזיע
+    yo: Georgia
+    zh: 格鲁吉亚
diff --git a/settings/country-names/gf.yaml b/settings/country-names/gf.yaml
new file mode 100644 (file)
index 0000000..1e05958
--- /dev/null
@@ -0,0 +1,41 @@
+name: 
+    default: Guyane Française
+    af: Frans-Guyana
+    ar: غيانا
+    br: Gwiana c’hall
+    ca: Guaiana Francesa
+    cy: Guyane
+    da: Fransk Guyana
+    de: Französisch-Guayana
+    el: Γαλλική Γουιάνα
+    en: French Guiana
+    eo: Gujano
+    es: Guayana Francesa
+    et: Prantsuse Guajaana
+    fa: گویان فرانسه
+    fi: Ranskan Guayana
+    fr: Guyane française
+    fy: Frânsk Guyana
+    ga: Guáin na Fraince
+    gd: Guiana Fhrangach
+    he: גיאנה הצרפתית
+    hr: Francuska Gvajana
+    hu: Francia Guyana
+    id: Guyana Perancis
+    is: Franska Gvæjana
+    it: Guyana francese
+    la: Guiana Francica
+    li: Frans Guyana
+    lt: Prancūzijos Gviana
+    lv: Franču Gviāna
+    mn: Франц Гвиана
+    nl: Frans-Guyana
+    pl: Gujana Francuska
+    ru: Французская Гвиана
+    sl: Francoska Gvajana
+    sv: Franska Guyana
+    th: เฟรนช์เกียนา
+    tr: Fransız Guyanası
+    uk: Французька Гвіана
+    vi: Guyane thuộc Pháp
+    zh: 法属圭亚那
diff --git a/settings/country-names/gg.yaml b/settings/country-names/gg.yaml
new file mode 100644 (file)
index 0000000..e035f2c
--- /dev/null
@@ -0,0 +1,86 @@
+name: 
+    default: Guernsey
+    af: Guernsey
+    an: Guernési
+    ar: غيرنزي
+    az: Gernsi
+    be: Гернсi
+    bg: Гърнси
+    br: Gwernenez
+    bs: Guernsey
+    ca: Guernsey
+    cs: Guernsey
+    cy: Ynys y Garn
+    da: Guernsey
+    de: Guernsey
+    dv: ގުއާންސޭ
+    el: Γουερνισία
+    en: Guernsey
+    eo: Gernezejo
+    es: Guernsey
+    et: Guernsey
+    eu: Guernesey
+    fa: گرنزی
+    fi: Guernsey
+    fr: Guernesey
+    fy: Guernsey
+    ga: Geansaí
+    gd: Guernsey
+    gl: Guernsey
+    gv: Guernsey
+    he: גרנזי
+    hi: ग्वेर्नसे
+    hr: Guernsey
+    hu: Guernsey
+    hy: Գերնսի
+    id: Guernsey
+    io: Guernsey
+    is: Guernsey
+    it: Guernsey
+    ja: ガーンジー
+    jv: Guernsey
+    ka: გერნზი
+    kn: ಗುರ್ನ್‌ಸಿ
+    ko: 건지 섬
+    kw: Gwernenys
+    la: Lisia
+    lb: Guernsey
+    li: Guernsey
+    lt: Gernsis
+    lv: Gērnsija
+    mi: Kōnihi
+    mk: Гернзи
+    mn: Гернси
+    mr: गर्न्सी
+    ms: Guernsey
+    ne: गुर्न्जी
+    nl: Guernsey
+    nn: Guernsey
+    "no": Guernsey
+    oc: Guernesey
+    os: Гернси
+    pa: ਗਰਨਜ਼ੇ
+    pl: Guernsey
+    pt: Guernsey
+    ro: Guernsey
+    ru: Гернси
+    rw: Gwasi
+    sh: Guernsey
+    sk: Guernsey
+    sl: Guernsey
+    sq: Guernsey
+    sr: Гернзи
+    su: Guernsey
+    sv: Guernsey
+    sw: Guernsey
+    ta: குயெர்ன்சி
+    tg: Гернси
+    th: เกิร์นซีย์
+    tl: Gernesey
+    tr: Guernsey
+    tt: Гернси
+    uk: Гернсі
+    ur: گرنزی
+    vi: Guernsey
+    yo: Guernsey
+    zh: 根西島
diff --git a/settings/country-names/gh.yaml b/settings/country-names/gh.yaml
new file mode 100644 (file)
index 0000000..cbbc716
--- /dev/null
@@ -0,0 +1,137 @@
+name: 
+    default: Ghana
+    af: Ghana
+    ak: Ghana
+    am: ጋና
+    an: Ghana
+    ar: غانا
+    az: Qana
+    ba: Гана
+    be: Гана
+    bg: Гана
+    bm: Gana
+    bn: ঘানা
+    bo: ཀ་ན།
+    br: Ghana
+    bs: Gana
+    ca: Ghana
+    ce: Гана
+    co: Ghana
+    cs: Ghana
+    cv: Гана
+    cy: Ghana
+    da: Ghana
+    de: Ghana
+    dv: ގާނާ
+    ee: Ghana
+    el: Γκάνα
+    en: Ghana
+    eo: Ganao
+    es: Ghana
+    et: Ghana
+    eu: Ghana
+    fa: غنا
+    ff: Gana
+    fi: Ghana
+    fo: Gana
+    fr: Ghana
+    fy: Gana
+    ga: Gána
+    gd: Gàna
+    gl: Gana
+    gu: ઘાના
+    gv: Yn Ghaney
+    he: גאנה
+    hi: घाना
+    hr: Gana
+    ht: Gana
+    hu: Ghána
+    hy: Գանա
+    ia: Ghana
+    id: Ghana
+    ie: Ghana
+    ig: Ghana
+    io: Ghana
+    is: Gana
+    it: Ghana
+    ja: ガーナ
+    jv: Ghana
+    ka: განა
+    kg: Gana
+    ki: Ghana
+    kk: Гана
+    kn: ಘಾನಾ
+    ko: 가나
+    ku: Gana
+    kw: Ghana
+    ky: Гана
+    la: Gana
+    lb: Ghana
+    li: Ghana
+    ln: Ghana
+    lt: Gana
+    lv: Gana
+    mg: Ghana
+    mi: Kāna
+    mk: Гана
+    ml: ഘാന
+    mn: Гана
+    mr: घाना
+    ms: Ghana
+    mt: Gana
+    my: ဂါနာနိုင်ငံ
+    na: Gana
+    ne: घाना
+    nl: Ghana
+    nn: Ghana
+    "no": Ghana
+    nv: Gáana
+    oc: Ghana
+    or: ଘାନା
+    os: Ганæ
+    pa: ਘਾਨਾ
+    pl: Ghana
+    ps: ګانا
+    pt: Gana
+    qu: Gana
+    rm: Ghana
+    ro: Ghana
+    ru: Гана
+    rw: Gana
+    sa: घाना
+    sc: Ghana
+    se: Ghana
+    sg: Ganäa
+    sh: Gana
+    sk: Ghana
+    sl: Gana
+    sn: Ghana
+    so: Gaana
+    sq: Gana
+    sr: Гана
+    ss: IGana
+    su: Ghana
+    sv: Ghana
+    sw: Ghana
+    ta: கானா
+    te: ఘనా
+    tg: Гана
+    th: ประเทศกานา
+    tk: Gana
+    tl: Ghana
+    tr: Gana
+    ts: Ghana
+    tt: Гана
+    tw: Ghana
+    ug: گانا جۇمھۇرىيىتى
+    uk: Гана
+    ur: گھانا
+    uz: Gana
+    vi: Ghana
+    vo: Ganän
+    wa: Gana
+    wo: Gana
+    yi: גהאנע
+    yo: Ghánà
+    zh: 加纳
+    zu: IGana
diff --git a/settings/country-names/gi.yaml b/settings/country-names/gi.yaml
new file mode 100644 (file)
index 0000000..dec3822
--- /dev/null
@@ -0,0 +1,99 @@
+name: 
+    default: Gibraltar
+    af: Gibraltar
+    an: Chibraltar
+    ar: جبل طارق
+    az: Cəbəli-Tariq
+    ba: Гибралтар
+    be: Гібралтар
+    bg: Гибралтар
+    bn: জিব্রাল্টার
+    br: Jibraltar
+    bs: Gibraltar
+    ca: Gibraltar
+    cs: Gibraltar
+    cv: Гибралтар
+    cy: Gibraltar
+    da: Gibraltar
+    de: Gibraltar
+    dv: ޖަބަލްޠާރިޤު
+    el: Γιβραλτάρ
+    en: Gibraltar
+    eo: Ĝibraltaro
+    es: Gibraltar
+    et: Gibraltar
+    eu: Gibraltar
+    fa: جبل طارق
+    fi: Gibraltar
+    fo: Gibraltar
+    fr: Gibraltar
+    fy: Gibraltar
+    ga: Giobráltar
+    gd: Giobraltair
+    gl: Xibraltar
+    gv: Gibraaltar
+    he: גיברלטר
+    hi: जिब्राल्टर
+    hr: Gibraltar
+    hu: Gibraltár
+    hy: Ջիբրալթար
+    ia: Gibraltar
+    id: Gibraltar
+    ie: Gibraltar
+    io: Gibraltar
+    is: Gíbraltar
+    it: Gibilterra
+    ja: ジブラルタル
+    jv: Gibraltar
+    ka: გიბრალტარი
+    kk: Гибралтар
+    ko: 지브롤터
+    ku: Cîbraltar
+    kw: Jibraltar
+    la: Gibraltar
+    lb: Gibraltar
+    li: Gibraltar
+    lt: Gibraltaras
+    lv: Gibraltārs
+    mi: Kāmaka
+    mk: Гибралтар
+    mn: Гибралтар
+    mr: जिब्राल्टर
+    ms: Gibraltar
+    my: ဂျီဘရော်လ်တာ
+    ne: गिब्राल्टार
+    nl: Gibraltar
+    nn: Gibraltar
+    "no": Gibraltar
+    oc: Gibartar
+    or: ଜିବ୍ରାଲେଟର
+    os: Гибралтар
+    pa: ਜਿਬਰਾਲਟਰ
+    pl: Gibraltar
+    pt: Gibraltar
+    ro: Gibraltar
+    ru: Гибралтар
+    rw: Giburalitari
+    sh: Gibraltar
+    sk: Gibraltár
+    sl: Gibraltar
+    so: Jibraltaar
+    sq: Gjibraltari
+    sr: Гибралтар
+    su: Gibraltar
+    sv: Gibraltar
+    sw: Gibraltar
+    ta: ஜிப்ரால்ட்டர்
+    tg: Гибралтар
+    th: ยิบรอลตาร์
+    tl: Hibraltar
+    tr: Cebelitarık
+    tt: Гибралтар
+    uk: Гібралтар
+    ur: جبل الطارق
+    vi: Gibraltar
+    wa: Djibraltar
+    wo: Jibraltaar
+    yi: גיבראלטאר
+    yo: Gibraltar
+    zh: 直布罗陀
diff --git a/settings/country-names/gl.yaml b/settings/country-names/gl.yaml
new file mode 100644 (file)
index 0000000..14a595f
--- /dev/null
@@ -0,0 +1,113 @@
+name: 
+    default: Kalaallit Nunaat
+    af: Groenland
+    am: ግሪንላንድ
+    an: Gronlandia
+    ar: غرينلاند
+    az: Qrenlandiya
+    be: Грэнландыя
+    bg: Гренландия
+    bn: গ্রিনল্যান্ড
+    bo: གེ་རེན་ལ
+    br: Greunland
+    bs: Grenland
+    ca: Grenlàndia
+    cs: Grónsko
+    cv: Гренланди
+    cy: Yr Ynys Las
+    da: Grønland
+    de: Grönland
+    dv: ގުރީންލޭންޑު
+    el: Γροιλανδία
+    en: Greenland
+    eo: Gronlando
+    es: Groenlandia
+    et: Gröönimaa
+    eu: Groenlandia
+    fa: گرینلند
+    fi: Grönlanti
+    fo: Grønland
+    fr: Groenland
+    fy: Grienlân
+    ga: An Ghraonlainn
+    gd: A' Ghraonlainn
+    gl: Groenlandia
+    gn: Kyoẽlándia
+    gv: Greenlynn
+    he: גרינלנד
+    hi: ग्रीनलैण्ड
+    hr: Grenland
+    hu: Grönland
+    hy: Գրենլանդիա
+    ia: Groenlandia
+    id: Greenland
+    ie: Grenland
+    io: Grenlando
+    is: Grænland
+    it: Groenlandia
+    iu: ᐊᑯᑭᑦᑐᑦ
+    ja: グリーンランド
+    jv: Greenland
+    ka: გრენლანდია
+    kk: Гренландия
+    kl: Kalaallit Nunaat
+    kn: ಗ್ರೀನ್‍ಲ್ಯಾಂಡ್
+    ko: 그린란드
+    ku: Grînlenda
+    kv: Гренландия
+    kw: Greunland
+    la: Groenlandia
+    lb: Grönland
+    li: Greunland
+    ln: Groenlandi
+    lt: Grenlandija
+    lv: Grenlande
+    mg: Groenlanda
+    mi: Greenland
+    mk: Гренланд
+    ml: ഗ്രീൻലാൻഡ്
+    mn: Гренланд
+    mr: ग्रीनलँड
+    ms: Greenland
+    my: ဂရင်းလန်ကျွန်း
+    ne: ग्रीनल्याण्ड
+    nl: Groenland
+    nn: Grønland
+    "no": Grønland
+    nv: Haʼaʼaahjí Hakʼaz Dineʼé Bikéyah
+    oc: Groenlàndia
+    or: ଗ୍ରୀନଲାଣ୍ଡ
+    os: Гренланди
+    pa: ਗਰੀਨਲੈਂਡ
+    pl: Grenlandia
+    pt: Gronelândia
+    qu: Kalalit Nunat
+    ro: Groenlanda
+    ru: Гренландия
+    rw: Goronulande
+    se: Kalaallit Nunaat
+    sh: Grenland
+    sk: Grónsko
+    sl: Grenlandija
+    so: Griinland
+    sq: Groenlanda
+    sr: Гренланд
+    su: Lemah Héjo
+    sv: Grönland
+    sw: Greenland
+    ta: கிறீன்லாந்து
+    te: గ్రీన్‌లాండ్
+    tg: Гренландия
+    th: กรีนแลนด์
+    tl: Lupanlunti
+    tr: Grönland
+    tt: Гренландия
+    ug: گرېنلاندىيە
+    uk: Ґренландія
+    ur: گرین لینڈ
+    vi: Greenland
+    vo: Gröneän
+    wo: Groenlaand
+    yi: גרינלאנד
+    yo: Grínlándì
+    zh: 格陵兰
diff --git a/settings/country-names/gm.yaml b/settings/country-names/gm.yaml
new file mode 100644 (file)
index 0000000..af315bc
--- /dev/null
@@ -0,0 +1,132 @@
+name: 
+    default: Gambia
+    af: Gambië
+    am: ጋምቢያ
+    an: Gambia
+    ar: غامبيا
+    az: Qambiya
+    ba: Гамбия
+    be: Гамбія
+    bg: Гамбия
+    bm: Gambia
+    bn: গাম্বিয়া
+    bo: གེམ་བྷི་ཡ།
+    br: Gambia
+    bs: Gambija
+    ca: Gàmbia
+    ce: Гамби
+    cs: Gambie
+    cv: Гамби
+    cy: Y Gambia
+    da: Gambia
+    de: Gambia
+    dv: ގެމްބިއާ
+    dz: གྷེམ་བི་ཡ
+    ee: Gambia
+    el: Γκάμπια
+    en: The Gambia
+    eo: Gambio
+    es: Gambia
+    et: Gambia
+    eu: Gambia
+    fa: گامبیا
+    ff: Gammbi
+    fi: Gambia
+    fo: Gambia
+    fr: Gambie
+    fy: Gambia
+    ga: An Ghaimbia
+    gd: A' Ghaimbia
+    gl: Gambia
+    gv: Yn Ghambia
+    he: גמביה
+    hi: गाम्बिया
+    hr: Gambija
+    ht: Ganbi
+    hu: Gambia
+    hy: Գամբիա
+    ia: Gambia
+    id: Gambia
+    ie: The Gambia
+    io: Gambia
+    is: Gambía
+    it: Gambia
+    ja: ガンビア
+    jv: Gambia
+    ka: გამბია
+    kg: Gambia
+    ki: Gambia
+    kk: Гамбия
+    ko: 감비아
+    ku: Gambiya
+    kw: Gambi
+    ky: Гамбия
+    la: Gambia
+    lb: Gambia
+    li: Gambia
+    ln: Gambi
+    lt: Gambija
+    lv: Gambija
+    mk: Гамбија
+    ml: ഗാംബിയ
+    mn: Гамби
+    mr: गांबिया
+    ms: Gambia
+    mt: Gambja
+    my: ဂမ်ဘီယာနိုင်ငံ
+    na: Gambiya
+    nb: Gambia
+    ne: गाम्बिया
+    nl: Gambia
+    nn: Gambia
+    "no": Gambia
+    nv: Géémbiya
+    oc: Gàmbia
+    or: ଗାମ୍ବିଆ
+    os: Гамби
+    pa: ਗਾਂਬੀਆ
+    pl: Gambia
+    ps: ګامبيا
+    pt: Gâmbia
+    qu: Gambya
+    rm: Gambia
+    ro: Gambia
+    ru: Гамбия
+    rw: Gambiya
+    sa: गाम्बिया
+    sc: Gàmbia
+    sd: گيمبيا
+    se: Gambia
+    sg: Gambïi
+    sh: Gambija
+    sk: Gambia
+    sl: Gambija
+    sn: Gambia
+    so: Gambia
+    sq: Gambia
+    sr: Гамбија
+    ss: IGambiya
+    st: Gambia
+    su: Gambia
+    sv: Gambia
+    sw: Gambia
+    ta: காம்பியா
+    te: గాంబియా
+    tg: Гамбия
+    th: ประเทศแกมเบีย
+    tk: Gambiýa
+    tl: Ang Gambiya
+    tr: Gambiya
+    ts: Gambiya
+    tt: Гамбия
+    ug: گامبىيە
+    uk: Гамбія
+    ur: گیمبیا
+    uz: Gambia
+    vi: Gambia
+    vo: Gambiyän
+    wo: Gàmbi
+    yi: די גאמביע
+    yo: Gámbíà
+    zh: 冈比亚
+    zu: IGambia
diff --git a/settings/country-names/gn.yaml b/settings/country-names/gn.yaml
new file mode 100644 (file)
index 0000000..b25f68e
--- /dev/null
@@ -0,0 +1,127 @@
+name: 
+    default: Guinée
+    af: Guinee
+    am: ጊኔ
+    an: Guinea
+    ar: غينيا
+    az: Qvineya
+    ba: Гвинея
+    be: Гвінея
+    bg: Гвинея
+    bm: Gine
+    bn: গিনি
+    bo: གི་ནེ།
+    br: Ginea
+    bs: Gvineja
+    ca: República de Guinea
+    ce: Гвине
+    cs: Guinea
+    cv: Гвиней
+    cy: Guinée
+    da: Guinea
+    de: Guinea
+    dv: ގީނިއާ
+    ee: Guinea
+    el: Γουινέα
+    en: Guinea
+    eo: Gvineo
+    es: Guinea
+    et: Guinea
+    eu: Ginea
+    fa: گینه
+    ff: Gine
+    fi: Guinea
+    fo: Guinea
+    fr: Guinée
+    fy: Guinee
+    ga: An Ghuine
+    gd: Gini
+    gl: Guinea
+    gv: Yn Ghuinea
+    ha: Gine
+    he: גינאה
+    hi: गिनी
+    hr: Gvineja
+    ht: Gine
+    hu: Guinea
+    hy: Գվինեա
+    ia: Guinea
+    id: Guinea
+    ie: Guinea
+    io: Guinea
+    is: Gínea
+    it: Guinea
+    ja: ギニア
+    jv: Guinea
+    ka: გვინეა
+    kg: Ginea
+    kk: Гвинея
+    ko: 기니
+    ku: Gîne
+    kw: Gyni
+    ky: Гвинея
+    la: Guinea
+    lb: Guinea
+    li: Guinee
+    ln: Gine-Konakry
+    lt: Gvinėja
+    lv: Gvineja
+    mi: Kini
+    mk: Гвинеја
+    ml: ഗിനി
+    mn: Гвиней
+    mr: गिनी
+    ms: Guinea
+    my: ဂီနီနိုင်ငံ
+    na: Gini
+    ne: गिनी
+    nl: Guinee
+    nn: Guinea
+    "no": Guinea
+    nv: Gíní
+    oc: Guinèa
+    or: ଗିନି
+    os: Гвиней
+    pa: ਗਿਨੀ
+    pl: Gwinea
+    pt: Guiné
+    qu: Khiniya
+    ro: Guineea
+    ru: Гвинея
+    rw: Gineya
+    sa: गिनी
+    sc: Guinea
+    se: Guinea
+    sg: Ginëe
+    sh: Gvineja
+    sk: Guinea
+    sl: Gvineja
+    sm: Guinea
+    sn: Guinea
+    so: Guinea
+    sq: Guinea
+    sr: Гвинеја
+    ss: IGiniya
+    st: Guinea
+    su: Guinéa
+    sv: Guinea
+    sw: Guinea
+    ta: கினி
+    tg: Гвинея
+    th: ประเทศกินี
+    tk: Gwineýa
+    tl: Ginea
+    tr: Gine
+    ts: Gineya
+    tt: Гвинея
+    ug: ۋىنېيە
+    uk: Ґвінея
+    ur: جمہوریہ گنی
+    uz: Gvineya
+    vi: Guinée
+    vo: Gineyän
+    wo: Gine
+    yi: גינע
+    yo: Guinea
+    zh: 几内亚
+    zu: IGini
diff --git a/settings/country-names/gp.yaml b/settings/country-names/gp.yaml
new file mode 100644 (file)
index 0000000..0f2f7a4
--- /dev/null
@@ -0,0 +1,31 @@
+name: 
+    default: Guadeloupe
+    ar: غوادلوب
+    be: Гвадэлупа
+    br: Gwadeloup
+    ca: Illa de Guadalupe
+    da: Guadeloupe
+    el: Γουαδελούπη
+    en: Guadeloupe
+    eo: Gvadelupo
+    es: Guadalupe
+    fa: گوادلوپ
+    fi: Guadeloupe
+    fr: Guadeloupe
+    fy: Guadelûp
+    ga: Guadalúip
+    he: גוואדלופ
+    hr: Gvadalupa
+    hu: Guadeloupe
+    is: Gvadelúpeyjar
+    it: Guadalupa
+    la: Guadalupa
+    lt: Gvadelupa
+    lv: Gvadelupa
+    mn: Гуаделупе
+    pl: Gwadelupa
+    ru: Гваделупа
+    sv: Guadeloupe
+    th: กวาเดอลูป
+    uk: Гваделупа
+    zh: 瓜德罗普
diff --git a/settings/country-names/gq.yaml b/settings/country-names/gq.yaml
new file mode 100644 (file)
index 0000000..9b3248f
--- /dev/null
@@ -0,0 +1,146 @@
+name: 
+    default: Guinea Ecuatorial
+    af: Ekwatoriaal-Guinee
+    ak: Gini Ikuweta
+    am: ኢኳቶሪያል ጊኔ
+    an: Guinea Equatorial
+    ar: غينيا الاستوائية
+    az: Ekvatorial Qvineya
+    ba: Экватор Гвинеяһы
+    be: Экватарыяльная Гвінея
+    bg: Екваториална Гвинея
+    bh: भूमध्यरेखीय गिनी
+    bm: Cɛmajan Gine
+    bn: বিষুবীয় গিনি
+    bo: ཨི་ཁུའ་ཊོ་རལ་གི་ནེ།
+    br: Ginea ar C'heheder
+    bs: Ekvatorijalna Gvineja
+    ca: Guinea Equatorial
+    ce: Дуьнена асанан Гвине
+    co: Guinea Equatoriale
+    cs: Rovníková Guinea
+    cv: Экваториаллă Гвиней
+    cy: Gini Gyhydeddol
+    da: Ækvatorialguinea
+    de: Äquatorialguinea
+    dv: އިކުއެޓޯރިއަލް ގިނީ
+    dz: ཨེ་ཀུ་ཊོ་རེལ་ གི་ནི
+    ee: Gini Ekwatoria
+    el: Ισημερινή Γουινέα
+    en: Equatorial Guinea
+    eo: Ekvatora Gvineo
+    es: Guinea Ecuatorial
+    et: Ekvatoriaal-Guinea
+    eu: Ekuatore Ginea
+    fa: گینه استوایی
+    ff: Gine Ekwatoriyal
+    fi: Päiväntasaajan Guinea
+    fo: Ekvatorguinea
+    fr: Guinée équatoriale
+    fy: Ekwatoriaal-Guinee
+    ga: an Ghuine Mheánchriosach
+    gd: Gini Mheadhan-Chriosach
+    gl: Guinea Ecuatorial
+    gu: ઇક્વેટોરિયલ ગિની
+    gv: Guinea Chryss ny Cruinney
+    ha: Gini Ikwatoriya
+    he: גינאה המשוונית
+    hi: भूमध्यरेखीय गिनी
+    hr: Ekvatorska Gvineja
+    ht: Gine ekwateryal
+    hu: Egyenlítői-Guinea
+    hy: Հասարակածային Գվինեա
+    ia: Guinea Equatorial
+    id: Guinea Khatulistiwa
+    ie: Equatorial Guinéa
+    ig: Equatorial Guinea
+    io: Equatorala Guinea
+    is: Miðbaugs-Gínea
+    it: Guinea Equatoriale
+    ja: 赤道ギニア
+    jv: Guinea Khatulistiwa
+    ka: ეკვატორული გვინეა
+    kg: Ginea ya Ekwatelo
+    ki: Ginekweta
+    kk: Экваторлық Гвинея
+    km: ហ្គីណេអេក្វាទ័រ
+    kn: ವಿಷುವದ್ರೇಖೆಯ ಗಿನಿ
+    ko: 적도 기니
+    ks: اِکوِٹورِیَل گِنی
+    ku: Gîneya Rojbendî
+    kw: Gyni Ekwadoriel
+    la: Guinea Aequatorensis
+    lb: Equatorialguinea
+    lg: Equatorial Guinea
+    li: Equatoriaal Guinee
+    ln: Gine-Ekwatorial
+    lo: ອີຄົວໂທເລຍກີເນຍ
+    lt: Pusiaujo Gvinėja
+    lv: Ekvatoriālā Gvineja
+    mg: Ginea Ekoatorialy
+    mi: Kini Ekuatoria
+    mk: Екваторска Гвинеја
+    ml: ഇക്വറ്റോറിയൽ ഗിനി
+    mn: Экваторын Гвиней
+    mr: इक्वेटोरीयल गिनी
+    ms: Guinea Khatulistiwa
+    mt: Gwinea Ekwatorjali
+    my: အီကွေတာဂီနီနိုင်ငံ
+    na: Gini t Ekwador
+    nb: Ekvatorial-Guinea
+    ne: इक्वेटोरियल गिनी
+    nl: Equatoriaal Guinee
+    nn: Ekvatorial-Guinea
+    "no": Ekvatorial-Guinea
+    nv: Gíní Nahasdzáán Ałníiʼgi Siʼánígíí
+    oc: Guinèa Eqüatoriala
+    om: Iqu’aatoriyaal Giinii
+    or: ବିଷୁବରେଖୀୟ ଗିନି
+    os: Экваториалон Гвиней
+    pa: ਭੂ-ਮੱਧ ਰੇਖਾਈ ਗਿਨੀ
+    pl: Gwinea Równikowa
+    ps: اېکواټوريال ګوينا
+    pt: Guiné Equatorial
+    qu: Chawpipacha Khiniya
+    rm: Guinea Equatoriala
+    ro: Guineea Ecuatorială
+    ru: Экваториальная Гвинея
+    rw: Gineya Ekwatoriyale
+    sc: Guinea Ecuadoriale
+    se: Ekvatoriála Guinea
+    sg: Ginëe tî Ekuatëre
+    sh: Ekvatorijalna Gvineja
+    si: සමක ගිනියාව
+    sk: Rovníková Guinea
+    sl: Ekvatorialna Gvineja
+    sm: Kini Ekuatoria
+    sn: Equatorial Guinea
+    so: Ikweetiga Guinea
+    sq: Guinea Ekuatoriale
+    sr: Екваторијална Гвинеја
+    st: Equatorial Guinea
+    su: Guinéa Khatulistiwa
+    sv: Ekvatorialguinea
+    sw: Guinea ya Ikweta
+    ta: எக்குவடோரியல் கினி
+    te: ఎక్వేటోరియాల్ గినియా
+    tg: Гвинеяи Истивоӣ
+    th: อิเควทอเรียลกินี
+    ti: ኢኳቶሪያል ጊኒ
+    tk: Ekwatorial Gwineýa
+    tl: Gineang Ekwatoriyal
+    to: ʻEkueta Kini
+    tr: Ekvator Ginesi
+    ts: Gineya ya le Nkaveni
+    tt: Экваториа́ль Гвине́я
+    ug: ئېكۋاتور گۋىنېيىسى
+    uk: Екваторіа́льна Ґвіне́я
+    ur: استوائی گنی
+    uz: Ekvatorli Gvineya
+    vi: Guinea Xích Đạo
+    vo: Kveatora-Gineyän
+    wo: Gineg yamoo
+    yi: עקוואטארישע גינע
+    yo: Guinea Alágedeméjì
+    zh: 赤道几内亚
+    zu: iGini Enkabazwe
diff --git a/settings/country-names/gr.yaml b/settings/country-names/gr.yaml
new file mode 100644 (file)
index 0000000..9dfcb8d
--- /dev/null
@@ -0,0 +1,140 @@
+name: 
+    default: Ελλάς
+    ab: Барзентәыла
+    af: Griekeland
+    am: ግሪክ
+    an: Grecia
+    ar: اليونان
+    ay: Grisya
+    az: Yunanıstan
+    ba: Греция
+    be: Грэцыя
+    bg: Гърция
+    bi: Greece
+    bn: গ্রিস
+    bo: ཀེ་རི་སི།
+    br: Gres
+    bs: Grčka
+    ca: Grècia
+    ce: Греци
+    co: Grecia
+    cs: Řecko
+    cu: Грьци
+    cv: Греци
+    cy: Gwlad Groeg
+    da: Grækenland
+    de: Griechenland
+    dv: ޔޫނާން
+    dz: གྲྀས
+    ee: Greece
+    el: Ελλάς
+    en: Greece
+    eo: Grekio
+    es: Grecia
+    et: Kreeka
+    eu: Grezia
+    fa: یونان
+    fi: Kreikka
+    fo: Grikkaland
+    fr: Grèce
+    fy: Grikelân
+    ga: An Ghréig
+    gd: A' Ghrèig
+    gl: Grecia
+    gn: Gyresia
+    gu: ગ્રીસ
+    gv: Yn Ghreag
+    he: יוון
+    hi: यूनान
+    hr: Grčka
+    ht: Grès
+    hu: Görögország
+    hy: Հունաստան
+    ia: Grecia
+    id: Yunani
+    ie: Grecia
+    io: Grekia
+    is: Grikkland
+    it: Grecia
+    ja: ギリシャ
+    jv: Yunani
+    ka: საბერძნეთი
+    kg: Gelesi
+    ki: Ngiriki
+    kk: Грекия
+    kl: Grækerit Nunaat
+    kn: ಗ್ರೀಸ್
+    ko: 그리스
+    ku: Yewnanistan
+    kv: Эллада
+    kw: Pow Grek
+    ky: Греция
+    la: Graecia
+    lb: Griicheland
+    lg: Buyonaani
+    li: Griekeland
+    ln: Gresi
+    lt: Graikija
+    lv: Grieķija
+    mg: Grisy
+    mi: Kirihi
+    mk: Грција
+    ml: ഗ്രീസ്
+    mn: Грек
+    mr: ग्रीस
+    ms: Greece
+    mt: Greċja
+    my: ဂရိနိုင်ငံ
+    na: Grit
+    ne: ग्रीस
+    nl: Griekenland
+    nn: Hellas
+    "no": Hellas
+    nv: Gwíík Dineʼé Bikéyah
+    oc: Grècia
+    or: ଗ୍ରୀସ
+    os: Грекъ
+    pa: ਯੂਨਾਨ
+    pl: Grecja
+    ps: يونان
+    pt: Grécia
+    qu: Grisya
+    rm: Grezia
+    rn: Grecia
+    ro: Grecia
+    ru: Греция
+    rw: Ubugereki
+    sa: यवनदेशः
+    sc: Grèghia
+    se: Greika
+    sh: Grčka
+    si: ග්‍රීසිය
+    sk: Grécko
+    sl: Grčija
+    sm: Kuliti
+    so: Giriig
+    sq: Greqia
+    sr: Грчка
+    ss: IGrikhi
+    su: Yunani
+    sv: Grekland
+    sw: Ugiriki
+    ta: கிரேக்க நாடு
+    te: గ్రీస్
+    tg: Юнон
+    th: ประเทศกรีซ
+    tk: Gresiýa
+    tl: Gresya
+    tr: Yunanistan
+    tt: Греция
+    ug: Grétsiye
+    uk: Греція
+    ur: یونان
+    uz: Yunoniston
+    vi: Hy Lạp
+    vo: Grikän
+    wo: Girees
+    yi: גריכנלאנד
+    yo: Gríìsì
+    zh: 希腊
+    zu: IGreki
diff --git a/settings/country-names/gs.yaml b/settings/country-names/gs.yaml
new file mode 100644 (file)
index 0000000..e625e95
--- /dev/null
@@ -0,0 +1,62 @@
+name: 
+    default: South Georgia and the South Sandwich Islands
+    af: Suid-Georgië en die Suidelike Sandwich-eilande
+    ar: جزر جورجيا الجنوبية وساندويتش الجنوبية
+    az: Cənubi Georgiya və Cənubi Sandviç adaları
+    be: Паўднёвая Джорджыя і Паўднёвыя Сандвічавы астравы
+    bg: Южна Джорджия и Южни Сандвичеви острови
+    br: Inizi Georgia ar Su hag Inizi Sandwich ar Su
+    bs: Južna Džordžija i Južna Sendvička Ostrva
+    ca: Illes Geòrgia del Sud i Sandwich del Sud
+    cs: Jižní Georgie a Jižní Sandwichovy ostrovy
+    da: South Georgia og South Sandwich Islands
+    de: Südgeorgien und die Südlichen Sandwichinseln
+    el: Νήσοι Νότια Γεωργία και Νότιες Σάντουιτς
+    en: South Georgia and the South Sandwich Islands
+    eo: Sud-Georgio kaj Sud-Sandviĉinsuloj
+    es: Islas Georgias del Sur y Sandwich del Sur
+    et: Lõuna-Georgia ja Lõuna-Sandwichi saared
+    eu: Hegoaldeko Georgiak eta Hegoaldeko Sandwich uharteak
+    fa: جزایر جورجیای جنوبی و ساندویچ جنوبی
+    fi: Etelä-Georgia ja Eteläiset Sandwichsaaret
+    fo: Suðursandwichoyggjar og Suðurgeorgia
+    fr: Géorgie du Sud-et-les Îles Sandwich du Sud
+    fy: Súd-Georgje en de Súdlike Sandwicheilannen
+    gd: Seòirsia-a-Deas is na h-Eileanan Shandwich-a-Deas
+    gl: Illas Xeorxia do Sur e Sandwich do Sur
+    he: איי ג'ורג'יה הדרומית ואיי סנדוויץ' הדרומיים
+    hi: दक्षिण जॉर्जिया एवं दक्षिण सैंडविच द्वीप समूह
+    hr: Južna Georgija i Otočje Južni Sandwich
+    hu: Déli-Georgia és Déli-Sandwich-szigetek
+    id: Georgia Selatan dan Kepulauan Sandwich Selatan
+    is: Suður-Georgía og Suður-Sandvíkureyjar
+    it: Georgia del Sud e Isole Sandwich Australi
+    ja: サウスジョージア・サウスサンドウィッチ諸島
+    ko: 사우스조지아 사우스샌드위치 제도
+    kw: Jeorji Dheghow hag Ynysow Sandwich Deghow
+    lt: Pietų Džordžija ir Pietų Sandvičo salos
+    lv: Dienviddžordžija un Dienvidsendviču salas
+    mk: Јужна Џорџија и Јужни Сендвички Острови
+    mr: साउथ जॉर्जिया व साउथ सँडविच द्वीपसमूह
+    ms: Georgia Selatan dan Kepulauan Sandwich Selatan
+    nl: Zuid-Georgia en de Zuidelijke Sandwicheilanden
+    nn: Sør-Georgia og Sør-Sandwichøyane
+    "no": Sør-Georgia og Sør-Sandwichøyene
+    os: Хуссар Джорджи æмæ Хуссар Сандвичы сакъадæхтæ
+    pl: Georgia Południowa i Sandwich Południowy
+    pt: Ilhas Geórgia do Sul e Sanduíche do Sul
+    ro: Georgia de Sud şi Insulele Sandwich de Sud
+    ru: Южная Георгия и Южные Сандвичевы Острова
+    se: Lulli Georgia ja Lulli Sandwich-sullot
+    sk: Južná Georgia a Južné Sandwichove ostrovy
+    sl: Južna Georgija in Južni Sandwichevi otoki
+    sq: Gjeorgjia Jugore dhe Ishujt Jugorë Sanduiç
+    sr: Јужна Џорџија и Јужна Сендвичка Острва
+    sv: Sydgeorgien och Sydsandwichöarna
+    ta: தெற்கு யோர்சியா மற்றும் தெற்கு சண்ட்விச் தீவுகள்
+    th: เกาะเซาท์จอร์เจียและหมู่เกาะเซาท์แซนด์วิช
+    tr: Güney Georgia ve Güney Sandwich Adaları
+    uk: Південна Джорджія та Південні Сандвічеві острови
+    vi: Quần đảo Nam Georgia và Nam Sandwich
+    wo: Jeoorji gu Bëj-saalum ak Duni Islaand yi Bëj-saalum
+    zh: 南喬治亞和南桑威奇群島
diff --git a/settings/country-names/gt.yaml b/settings/country-names/gt.yaml
new file mode 100644 (file)
index 0000000..3cc1f20
--- /dev/null
@@ -0,0 +1,121 @@
+name: 
+    default: Guatemala
+    af: Guatemala
+    am: ጓቴማላ
+    an: Guatemala
+    ar: غواتيمالا
+    ay: Watimala
+    az: Qvatemala
+    ba: Гватемала
+    be: Гватэмала
+    bg: Гватемала
+    bm: Gatemala
+    bn: গুয়াতেমালা
+    bo: གུ་ཝེ་ཐི་མ་ལ།
+    br: Guatemala
+    bs: Gvatemala
+    ca: Guatemala
+    ce: Гватемала
+    cs: Guatemala
+    cy: Guatemala
+    da: Guatemala
+    de: Guatemala
+    dv: ގުއަޓެމާލާ
+    ee: Guatemala
+    el: Γουατεμάλα
+    en: Guatemala
+    eo: Gvatemalo
+    es: Guatemala
+    et: Guatemala
+    eu: Guatemala
+    fa: گواتمالا
+    fi: Guatemala
+    fo: Guatemala
+    fr: Guatemala
+    fy: Gûatemala
+    ga: Guatamala
+    gd: Guatamala
+    gl: Guatemala
+    gn: Guatemala
+    gv: Yn Ghuatemaley
+    he: גואטמלה
+    hi: ग्वाटेमाला
+    hr: Gvatemala
+    ht: Gwatemala
+    hu: Guatemala
+    hy: Գվատեմալա
+    ia: Guatemala
+    id: Guatemala
+    ie: Guatemala
+    io: Guatemala
+    is: Gvatemala
+    it: Guatemala
+    ja: グアテマラ
+    jv: Guatemala
+    ka: გვატემალა
+    kk: Гватемала
+    km: ហ្គាតេម៉ាឡា
+    kn: ಗ್ವಾಟೆಮಾಲ
+    ko: 과테말라
+    ku: Guatemala
+    kw: Gwatemala
+    la: Guatimalia
+    lb: Guatemala
+    li: Guatemala
+    ln: Gwatemala
+    lt: Gvatemala
+    lv: Gvatemala
+    mg: Goatemala
+    mi: Kuatamāra
+    mk: Гватемала
+    ml: ഗ്വാട്ടിമാല
+    mn: Гватемал
+    mr: ग्वातेमाला
+    ms: Guatemala
+    mt: Gwatemala
+    my: ဂွါတီမာလာနိုင်ငံ
+    na: Guatemara
+    ne: ग्वाटेमाला
+    nl: Guatemala
+    nn: Guatemala
+    "no": Guatemala
+    oc: Guatemala
+    os: Гватемалæ
+    pa: ਗੁਆਤੇਮਾਲਾ
+    pl: Gwatemala
+    ps: ګواتمالا
+    pt: Guatemala
+    qu: Watimala
+    ro: Guatemala
+    ru: Гватемала
+    rw: Gwatemala
+    sa: ग्वाटेमाला
+    se: Guatemala
+    sh: Gvatemala
+    sk: Guatemala
+    sl: Gvatemala
+    sm: Tuatemala
+    so: Guatemala
+    sq: Guatemala
+    sr: Гватемала
+    ss: IGwathamala
+    su: Guatémala
+    sv: Guatemala
+    sw: Guatemala
+    ta: குவாத்தமாலா
+    tg: Гуатемала
+    th: ประเทศกัวเตมาลา
+    tl: Guwatemala
+    tr: Guatemala
+    tt: Гватемала
+    ug: گۋاتېمالا
+    uk: Гватемала
+    ur: گوئٹے مالا
+    uz: Gvatemala
+    vi: Guatemala
+    vo: Gvatemän
+    wo: Guwaatemala
+    yi: גוואטעמאלע
+    yo: Guatẹmálà
+    zh: 危地马拉
+    zu: Guatemala
diff --git a/settings/country-names/gu.yaml b/settings/country-names/gu.yaml
new file mode 100644 (file)
index 0000000..f83ce6b
--- /dev/null
@@ -0,0 +1,2 @@
+name: 
+    default: Guam
diff --git a/settings/country-names/gw.yaml b/settings/country-names/gw.yaml
new file mode 100644 (file)
index 0000000..a856932
--- /dev/null
@@ -0,0 +1,124 @@
+name: 
+    default: Guiné-Bissau
+    af: Guinee-Bissau
+    am: ጊኔ-ቢሳው
+    an: Guinea-Bissau
+    ar: غينيا بيساو
+    az: Qvineya-Bisau
+    ba: Гвинея-Бисау
+    be: Гвінея-Бісау
+    bg: Гвинея-Бисау
+    bm: Gine Bisau
+    bn: গিনি-বিসাউ
+    bo: གི་ནེ་-བི་སའོ།
+    br: Ginea-Bissau
+    bs: Gvineja-Bisau
+    ca: Guinea Bissau
+    ce: Гвине-Бисау
+    co: Guinea-Bissau
+    cs: Guinea-Bissau
+    cv: Гвиней-Бисау
+    cy: Guiné-Bissau
+    da: Guinea-Bissau
+    de: Guinea-Bissau
+    dv: ގީނީ-ބިސާއޫ
+    ee: Guinea-Bissau
+    el: Γουινέα-Μπισσάου
+    en: Guinea-Bissau
+    eo: Gvineo Bisaŭa
+    es: Guinea-Bisáu
+    et: Guinea-Bissau
+    eu: Ginea-Bissau
+    fa: گینه بیسائو
+    ff: Gine-Bisaawo
+    fi: Guinea-Bissau
+    fo: Guinea-Bissau
+    fr: Guinée-Bissau
+    fy: Guinee-Bissau
+    ga: Guine-Bissau
+    gd: Gini-Bissau
+    gl: Guinea-Bisau
+    gv: Yn Ghuinea-Bissau
+    he: גינאה ביסאו
+    hi: गिनी-बिसाऊ
+    hr: Gvineja Bisau
+    ht: Gine-Bisao
+    hu: Bissau-Guinea
+    hy: Գվինեա Բիսաու
+    ia: Guinea-Bissau
+    id: Guinea-Bissau
+    ie: Guinea-Bissau
+    io: Guinea Bisau
+    is: Gínea-Bissá
+    it: Guinea-Bissau
+    ja: ギニアビサウ
+    jv: Guinea-Bissau
+    ka: გვინეა-ბისაუ
+    kg: Ginea-Bisau
+    kk: Гвинея-Бисау
+    ko: 기니비사우
+    ku: Gîne-Bissau
+    kw: Gyni-Bissaw
+    ky: Гвинея-Бисау
+    la: Guinea Bissaviensis
+    lb: Guinea-Bissau
+    li: Guinee-Bissau
+    ln: Gine-Bisau
+    lt: Bisau Gvinėja
+    lv: Gvineja-Bisava
+    mi: Kini Pihō
+    mk: Гвинеја-Бисау
+    ml: ഗിനി-ബിസൗ
+    mn: Гвиней-Бисау
+    mr: गिनी-बिसाउ
+    ms: Guinea-Bissau
+    my: ဂင်းနီဗစ်ဆောနိုင်ငံ
+    na: Gini-Bitau
+    ne: गिनी-बिसाउ
+    nl: Guinee-Bissau
+    nn: Guinea-Bissau
+    "no": Guinea-Bissau
+    nv: Gíní Bisó
+    oc: Guinèa Bissau
+    os: Гвиней-Бисау
+    pa: ਗਿਨੀ-ਬਿਸਾਊ
+    pl: Gwinea Bissau
+    pt: Guiné-Bissau
+    qu: Khiniya-Wisaw
+    ro: Guineea-Bissau
+    ru: Гвинея-Бисау
+    rw: Gineya-Biso
+    sc: Guinea-Bissau
+    se: Guinea-Bissau
+    sg: Ginëe-Bisau
+    sh: Gvineja Bisau
+    sk: Guinea-Bissau
+    sl: Gvineja Bissau
+    sn: Guinea-Bissau
+    so: Guinea-Bissau
+    sq: Guinea Bisau
+    sr: Гвинеја Бисао
+    ss: IGiniya-Bhasawu
+    st: Guinea-Bissau
+    su: Guinéa-Bissau
+    sv: Guinea-Bissau
+    sw: Guinea Bisau
+    ta: கினி-பிசாவு
+    tg: Гвинея Бисау
+    th: ประเทศกินี-บิสเซา
+    tk: Gwineýa-Bisau
+    tl: Ginea-Bissau
+    tr: Gine-Bissau
+    ts: Guinea-Bissau
+    tt: Гвинея-Бисау
+    ug: گۋىنېيە بىسسائۇ
+    uk: Гвінея-Бісау
+    ur: گنی بساؤ
+    uz: Gvineya-Bissau
+    vi: Guiné-Bissau
+    vo: Gineyän-Bisauän
+    wo: Gine Bisaawóo
+    yi: גינע-ביסאו
+    yo: Guinea-Bissau
+    zh: 幾內亞比索
+    zu: IGini Bisawu
diff --git a/settings/country-names/gy.yaml b/settings/country-names/gy.yaml
new file mode 100644 (file)
index 0000000..aa6fee7
--- /dev/null
@@ -0,0 +1,120 @@
+name: 
+    default: Guyana
+    af: Guyana
+    am: ጋያና
+    an: Guyana
+    ar: غويانا
+    ay: Wayana
+    az: Qayana
+    ba: Гайана
+    be: Гаяна
+    bg: Гвиана
+    bn: গায়ানা
+    bo: གུ་ཡ་ན།
+    br: Guyana
+    bs: Gvajana
+    ca: Guyana
+    ce: Гайана
+    cs: Guyana
+    cv: Гайана
+    cy: Guyana
+    da: Guyana
+    de: Guyana
+    dv: ގުޔާނާ
+    ee: Guyana
+    el: Γουιάνα
+    en: Guyana
+    eo: Gujano
+    es: Guyana
+    et: Guyana
+    eu: Guyana
+    fa: گویان
+    fi: Guyana
+    fo: Gujana
+    fr: Guyana
+    fy: Guyana
+    ga: An Ghuáin
+    gd: Guiana
+    gl: Güiana
+    gn: Gujána
+    gu: ગુયાના
+    gv: Geeaaney
+    he: גיאנה
+    hi: गयाना
+    hr: Gvajana
+    ht: Giyàn
+    hu: Guyana
+    hy: Գայանա
+    ia: Guyana
+    id: Guyana
+    ie: Guyana
+    io: Guyana
+    is: Gvæjana
+    it: Guyana
+    ja: ガイアナ
+    jv: Guyana
+    ka: გაიანა
+    kk: Гайана
+    kl: Guyana
+    kn: ಗಯಾನ
+    ko: 가이아나
+    ku: Guyana
+    kw: Gwayana
+    la: Guiana
+    lb: Guyana
+    li: Guyana
+    ln: Gwiana
+    lt: Gajana
+    lv: Gajāna
+    mi: Kaiana
+    mk: Гвајана
+    ml: ഗയാന
+    mn: Гайана
+    mr: गयाना
+    ms: Guyana
+    mt: Gujana
+    my: ဂိုင်ယာနာနိုင်ငံ
+    na: Guyana
+    ne: गुयना
+    nl: Guyana
+    nn: Guyana
+    "no": Guyana
+    oc: Guyana
+    or: ଗାଇଓନା
+    os: Гайанæ
+    pa: ਗੁਇਆਨਾ
+    pl: Gujana
+    ps: ګويانا
+    pt: Guiana
+    qu: Wayana
+    ro: Guyana
+    ru: Гайана
+    rw: Giyana
+    sa: गयाना
+    sc: Guyana
+    se: Guyana
+    sh: Gvajana
+    sk: Guyana
+    sl: Gvajana
+    so: Guyana
+    sq: Guajana
+    sr: Гвајана
+    su: Guyana
+    sv: Guyana
+    sw: Guyana
+    ta: கயானா
+    te: గయానా
+    th: ประเทศกายอานา
+    tl: Guyana
+    tr: Guyana
+    tt: Гайана
+    ug: گايانا
+    uk: Гаяна
+    ur: گیانا
+    uz: Gayana
+    vi: Guyana
+    vo: Gvayän
+    wo: Guyaana
+    yi: גויאנע
+    yo: Gùyánà
+    zh: 圭亚那
diff --git a/settings/country-names/hk.yaml b/settings/country-names/hk.yaml
new file mode 100644 (file)
index 0000000..17e0370
--- /dev/null
@@ -0,0 +1,2 @@
+name: 
+    default: Hong Kong
diff --git a/settings/country-names/hm.yaml b/settings/country-names/hm.yaml
new file mode 100644 (file)
index 0000000..b3ccac7
--- /dev/null
@@ -0,0 +1,2 @@
+name: 
+    default: Heard Island and MaxDonald Islands
diff --git a/settings/country-names/hn.yaml b/settings/country-names/hn.yaml
new file mode 100644 (file)
index 0000000..82f848e
--- /dev/null
@@ -0,0 +1,122 @@
+name: 
+    default: Honduras
+    af: Honduras
+    am: ሆንዱራስ
+    an: Honduras
+    ar: هندوراس
+    ay: Honduras
+    az: Honduras
+    ba: Гондурас
+    be: Гандурас
+    bg: Хондурас
+    bm: Honduras
+    bn: হন্ডুরাস
+    bo: ཧོང་དུ་ར་སི།
+    br: Honduras
+    bs: Honduras
+    ca: Hondures
+    ce: Гондурас
+    cs: Honduras
+    cu: Ондоурасъ
+    cy: Honduras
+    da: Honduras
+    de: Honduras
+    dv: ހޮންޑިއުރަސް
+    el: Ονδούρα
+    en: Honduras
+    eo: Honduro
+    es: Honduras
+    et: Honduras
+    eu: Honduras
+    fa: هندوراس
+    fi: Honduras
+    fo: Honduras
+    fr: Honduras
+    fy: Hondueras
+    ga: Hondúras
+    gd: Hondùras
+    gl: Honduras
+    gn: Honduras
+    gu: હોન્ડુરાસ
+    gv: Ny Hondooraghyn
+    he: הונדורס
+    hi: हौण्डुरस
+    hr: Honduras
+    ht: Ondiras
+    hu: Honduras
+    hy: Հոնդուրաս
+    ia: Honduras
+    id: Honduras
+    ie: Honduras
+    io: Honduras
+    is: Hondúras
+    it: Honduras
+    ja: ホンジュラス
+    jv: Honduras
+    ka: ჰონდურასი
+    kk: Гондурас
+    ko: 온두라스
+    ku: Hondûras
+    kw: Hondouras
+    ky: Гондурас
+    la: Honduria
+    lb: Honduras
+    li: Honduras
+    ln: Honduras
+    lt: Hondūras
+    lv: Hondurasa
+    mk: Хондурас
+    ml: ഹോണ്ടുറാസ്
+    mn: Гондурас
+    mr: होन्डुरास
+    ms: Honduras
+    mt: Ħonduras
+    my: ဟွန်ဒူးရပ်စ်နိုင်ငံ
+    na: Ondurat
+    ne: होण्डुरस
+    nl: Honduras
+    nn: Honduras
+    "no": Honduras
+    oc: Honduras
+    or: ହୋଣ୍ଡାରୁସ
+    os: Гондурас
+    pa: ਹਾਂਡੂਰਾਸ
+    pl: Honduras
+    ps: هندوراس
+    pt: Honduras
+    qu: Unduras
+    rn: Honduras
+    ro: Honduras
+    ru: Гондурас
+    rw: Hondurasi
+    sa: हांडूरस
+    se: Honduras
+    sh: Honduras
+    sk: Honduras
+    sl: Honduras
+    sm: Honilagi
+    sq: Hondurasi
+    sr: Хондурас
+    ss: IHondulasi
+    su: Honduras
+    sv: Honduras
+    sw: Honduras
+    ta: ஹொண்டுராஸ்
+    te: హోండురాస్
+    tg: Ҳондурас
+    th: ประเทศฮอนดูรัส
+    tl: Honduras
+    tr: Honduras
+    tt: Гондурас
+    ug: ھوندۇراس
+    uk: Гондурас
+    ur: ہونڈوراس
+    uz: Gonduras
+    vi: Honduras
+    vo: Hondurän
+    wa: Hondourasse
+    wo: Onduras
+    yi: האנדוראס
+    yo: Họ̀ndúràs
+    zh: 洪都拉斯
+    zu: Honduras
diff --git a/settings/country-names/hr.yaml b/settings/country-names/hr.yaml
new file mode 100644 (file)
index 0000000..be68fa6
--- /dev/null
@@ -0,0 +1,134 @@
+name: 
+    default: Hrvatska
+    ab: Хорватиа
+    af: Kroasië
+    am: ክሮኤሽያ
+    an: Croacia
+    ar: كرواتيا
+    az: Xorvatiya
+    ba: Хорватия
+    be: Харватыя
+    bg: Хърватия
+    bi: Croatia
+    bn: ক্রোয়েশিয়া
+    bo: ཁུརོ་ཤི་ཡ།
+    br: Kroatia
+    bs: Hrvatska
+    ca: Cròacia
+    ce: Хорвати
+    cs: Chorvatsko
+    cu: Хръватьска
+    cy: Croatia
+    da: Kroatien
+    de: Kroatien
+    dv: ކުރޮއޭޝިއާ
+    ee: Croatia
+    el: Κροατία
+    en: Croatia
+    eo: Kroatio
+    es: Croacia
+    et: Horvaatia
+    eu: Kroazia
+    fa: کرواسی
+    fi: Kroatia
+    fo: Kroatia
+    fr: Croatie
+    fy: Kroaasje
+    ga: An Chróit
+    gd: Croàisia
+    gl: Croacia
+    gn: Kyoasia
+    gu: ક્રોએશિયા
+    gv: Yn Chroit
+    he: קרואטיה
+    hi: क्रोएशिया
+    hr: Hrvatska
+    ht: Kroasi
+    hu: Horvátország
+    hy: Խորվաթիա
+    ia: Croatia
+    id: Kroasia
+    ie: Croatia
+    io: Kroatia
+    is: Króatía
+    it: Croazia
+    ja: クロアチア
+    jv: Kroasia
+    ka: ხორვატია
+    kg: Kroatia
+    kk: Хорватия
+    kl: Kroatia
+    kn: ಕ್ರೊಯೆಶಿಯ
+    ko: 크로아티아
+    ku: Kroatya
+    kv: Хорватия
+    kw: Kroati
+    ky: Хорватия
+    la: Croatia
+    lb: Kroatien
+    li: Kroatië
+    ln: Kroasia
+    lt: Kroatija
+    lv: Horvātija
+    mi: Koroātia
+    mk: Хрватска
+    ml: ക്രൊയേഷ്യ
+    mn: Хорват
+    mr: क्रोएशिया
+    ms: Croatia
+    mt: Kroazja
+    my: ခရိုအေးရှားနိုင်ငံ
+    na: Kroaitsiya
+    ne: क्रोएशिया
+    nl: Kroatië
+    nn: Kroatia
+    "no": Kroatia
+    nv: Kwóóʼad Bikéyah
+    oc: Croàcia
+    or: କ୍ରୋଏସିଆ
+    os: Хорвати
+    pa: ਕ੍ਰੋਏਸ਼ੀਆ
+    pl: Chorwacja
+    ps: کروواسيا
+    pt: Croácia
+    qu: Hurwatsuyu
+    rn: Croacia
+    ro: Croația
+    ru: Хорватия
+    rw: Korowatiya
+    sa: क्रोएशिया
+    sc: Croatzia
+    se: Kroatia
+    sg: Kroasïi
+    sh: Hrvatska
+    sk: Chorvátsko
+    sl: Hrvaška
+    sm: Croatia
+    so: Kroatia
+    sq: Kroacia
+    sr: Хрватска
+    ss: IKhuroshiya
+    st: Kroatia
+    su: Kroasia
+    sv: Kroatien
+    sw: Kroatia
+    ta: குரோவாசியா
+    te: క్రొయేషియా
+    tg: Хорватия
+    th: ประเทศโครเอเชีย
+    tk: Horwatiýa
+    tl: Kroasya
+    tr: Hırvatistan
+    tt: Хорватия
+    ug: كرودىيە
+    uk: Хорватія
+    ur: کروشیا
+    uz: Xorvatiya
+    vi: Croatia
+    vo: Kroasän
+    wa: Crowaceye
+    wo: Korwaasi
+    yi: קראאטיע
+    yo: Kroatíà
+    za: Gwzlozdiya
+    zh: 克羅地亞
diff --git a/settings/country-names/ht.yaml b/settings/country-names/ht.yaml
new file mode 100644 (file)
index 0000000..82892f1
--- /dev/null
@@ -0,0 +1,120 @@
+name: 
+    default: Ayiti
+    af: Haïti
+    am: ሃይቲ
+    an: Haití
+    ar: هايتي
+    ay: Ayti
+    az: Haiti Respublikası
+    be: Гаіці
+    bg: Хаити
+    bm: Ayiti
+    bn: হাইতি
+    bo: ཧའི་ཏི།
+    br: Republik Haiti
+    bs: Haiti
+    ca: Haití
+    ce: Гаити Пачхьалкх
+    co: Haiti
+    cs: Haiti
+    cv: Гаити
+    cy: Haiti
+    da: Haiti
+    de: Haiti
+    dv: ހެއިޓީ
+    ee: Haiti
+    el: Αϊτή
+    en: Haiti
+    eo: Haitio
+    es: Haití
+    et: Haiti
+    eu: Haiti
+    fa: هائیتی
+    fi: Haiti
+    fo: Haiti
+    fr: Haïti
+    fy: Haïty
+    ga: Háítí
+    gd: Haiti
+    gl: Haití - Haïti
+    gu: હૈતી
+    gv: Haiti
+    he: האיטי
+    hi: हैती
+    hr: Haiti
+    ht: Ayiti
+    hu: Haiti
+    hy: Հաիթի
+    ia: Haiti
+    id: Haiti
+    io: Haiti
+    is: Haítí
+    it: Haiti
+    ja: ハイチ
+    jv: Haiti
+    ka: ჰაიტი
+    kg: Ayiti
+    ki: Haiti
+    kk: Гаити
+    ko: 아이티
+    ku: Haîtî
+    kw: Hayti
+    la: Haitia
+    lb: Haiti
+    li: Haïti
+    ln: Ayiti
+    lt: Haitis
+    lv: Haiti
+    mg: Haiti
+    mk: Хаити
+    ml: ഹെയ്റ്റി
+    mn: Гайти
+    mr: हैती
+    ms: Haiti
+    mt: Ħaiti
+    my: ဟေတီနိုင်ငံ
+    na: Aiti
+    ne: हाइटी
+    nl: Haïti
+    nn: Haiti
+    "no": Haiti
+    nv: Héítii
+    oc: Haití (estat)
+    or: ହିଟି
+    os: Гаити
+    pa: ਹੈਤੀ
+    pl: Haiti
+    ps: هایتي
+    pt: Haiti
+    qu: Ayti (mama llaqta)
+    ro: Haiti
+    ru: Гаити
+    rw: Hayiti
+    se: Haiti
+    sh: Haiti
+    si: හෙයිටි
+    sk: Haiti
+    sl: Haiti
+    so: Haiti
+    sq: Haitia
+    sr: Хаити
+    ss: IHayithi
+    su: Haiti
+    sv: Haiti
+    sw: Haiti
+    ta: எயிட்டி
+    th: ประเทศเฮติ
+    tl: Hayti
+    tr: Haiti
+    tt: Гаити
+    ug: ھايتى
+    uk: Гаїті
+    ur: ہیٹی
+    uz: Gaiti
+    vi: Haiti
+    vo: Haitiyän
+    wa: Ayiti
+    wo: Ayiti
+    yi: האיטי
+    yo: Hàítì
+    zh: 海地
diff --git a/settings/country-names/hu.yaml b/settings/country-names/hu.yaml
new file mode 100644 (file)
index 0000000..049708d
--- /dev/null
@@ -0,0 +1,138 @@
+name: 
+    default: Magyarország
+    ab: Мадиартәыла
+    af: Hongarye
+    am: ሀንጋሪ
+    an: Hongría
+    ar: المجر
+    ay: Hunkariya
+    az: Macarıstan
+    ba: Венгрия
+    be: Венгрыя
+    bg: Унгария
+    bi: Hungary
+    bn: হাঙ্গেরি
+    bo: ཧུང་གྷ་རི།
+    br: Hungaria
+    bs: Mađarska
+    ca: Hongria
+    ce: Венгри
+    co: Ungheria
+    cs: Maďarsko
+    cu: Ѫгри
+    cv: Венгри
+    cy: Hwngari
+    da: Ungarn
+    de: Ungarn
+    dv: ހަންގޭރީ
+    ee: Hungary
+    el: Ουγγαρία
+    en: Hungary
+    eo: Hungario
+    es: Hungría
+    et: Ungari
+    eu: Hungaria
+    fa: مجارستان
+    ff: Hunngariya
+    fi: Unkari
+    fo: Ungarn
+    fr: Hongrie
+    fy: Hongarije
+    ga: An Ungáir
+    gd: An Ungair
+    gl: Hungría
+    gn: Hungyria
+    gu: હંગેરી
+    gv: Yn Ungaar
+    he: הונגריה
+    hi: हंगरी
+    hr: Mađarska
+    ht: Ongri
+    hu: Magyarország
+    hy: Հունգարիա
+    ia: Hungaria
+    id: Hongaria
+    ie: Hungaria
+    io: Hungaria
+    is: Ungverjaland
+    it: Ungheria
+    ja: ハンガリー
+    jv: Hongaria
+    ka: უნგრეთი
+    kg: Hongrie
+    ki: Macartsa
+    kk: Мажарстан
+    kl: Ungarni
+    km: ប្រទេសហុងគ្រី
+    ko: 헝가리
+    ku: Macaristan
+    kv: Мадьяр Му
+    kw: Hungari
+    ky: Мажарстан
+    la: Hungaria
+    lb: Ungarn
+    li: Hongarieë
+    ln: Ungri
+    lt: Vengrija
+    lv: Ungārija
+    mi: Hanekari
+    mk: Унгарија
+    ml: ഹംഗറി
+    mn: Унгар
+    mr: हंगेरी
+    ms: Hungary
+    mt: Ungerija
+    my: ဟန်ဂေရီနိုင်ငံ
+    na: Ungari
+    ne: हंगेरी
+    nl: Hongarije
+    nn: Ungarn
+    "no": Ungern
+    nv: Hángewii
+    oc: Ongria
+    or: ହଙ୍ଗେରୀ
+    os: Венгри
+    pa: ਹੰਗਰੀ
+    pl: Węgry
+    ps: هنګري
+    pt: Hungria
+    qu: Unriya
+    rm: Ungaria
+    ro: Ungaria
+    ru: Венгрия
+    rw: Hongiriya
+    sa: हंगरी
+    se: Ungára
+    sh: Mađarska
+    si: හන්ගේරියානු සමුහාණ්ඩුව
+    sk: Maďarsko
+    sl: Madžarska
+    sm: Hungary
+    sn: Hungary
+    so: Hungaria
+    sq: Hungaria
+    sr: Мађарска
+    ss: IHangareyi
+    st: Hungary
+    su: Hungaria
+    sv: Ungern
+    sw: Hungaria
+    ta: அங்கேரி
+    te: హంగేరి
+    tg: Маҷористон
+    th: ประเทศฮังการี
+    tk: Wengriýa
+    tl: Unggarya
+    tr: Macaristan
+    ts: Hungary
+    tt: Маҗарстан
+    ug: ۋېنگرىيە
+    uk: Угорщина
+    ur: مجارستان
+    uz: Mojariston
+    vi: Hungary
+    vo: Macarän
+    wo: Ongiri
+    yi: אונגארן
+    yo: Húngárì
+    zh: 匈牙利
diff --git a/settings/country-names/id.yaml b/settings/country-names/id.yaml
new file mode 100644 (file)
index 0000000..be19367
--- /dev/null
@@ -0,0 +1,140 @@
+name: 
+    default: Indonesia
+    af: Indonesië
+    ak: Indonesia
+    am: ኢንዶኔዥያ
+    an: Indonesia
+    ar: إندونيسيا
+    ay: Indunisya
+    az: İndoneziya
+    ba: Индонезия
+    be: Інданезія
+    bg: Индонезия
+    bi: Indonesia
+    bn: ইন্দোনেশিয়া
+    bo: ཨིན་རྡུ་ནི་ཤིས་ཡ།
+    br: Indonezia
+    bs: Indonezija
+    ca: Indonèsia
+    ce: Индонези
+    ch: Indonesia
+    co: Indunesia
+    cs: Indonésie
+    cu: Їндонисїꙗ
+    cv: Индонези
+    cy: Indonesia
+    da: Indonesien
+    de: Indonesien
+    dv: އިންޑޮނޭޝިޔާ
+    el: Ινδονησία
+    en: Indonesia
+    eo: Indonezio
+    es: Indonesia
+    et: Indoneesia
+    eu: Indonesia
+    fa: اندونزی
+    fi: Indonesia
+    fo: Indonesia
+    fr: Indonésie
+    fy: Yndoneezje
+    ga: An Indinéis
+    gd: An Innd-Innse
+    gl: Indonesia
+    gn: Indonesia
+    gu: ઈંડોનેશિયા
+    gv: Yn Indoneesh
+    he: אינדונזיה
+    hi: इंडोनेशिया
+    hr: Indonezija
+    ht: Endonezi
+    hu: Indonézia
+    hy: Ինդոնեզիա
+    ia: Indonesia
+    id: Indonesia
+    ie: Indonesia
+    io: Indonezia
+    is: Indónesía
+    it: Indonesia
+    iu: ᐄᓅᓯᐊ
+    ja: インドネシア
+    jv: Indonésia
+    ka: ინდონეზია
+    ki: Indonesia
+    kk: Индонезия
+    kl: Indonesia
+    km: ឥណ្ឌូនេស៊ី
+    kn: ಇಂಡೋನೇಷ್ಯಾ
+    ko: 인도네시아
+    ku: Îndonezya
+    kv: Индонезия
+    kw: Indonesi
+    ky: Индонезия
+    la: Indonesia
+    lb: Indonesien
+    li: Indonesië
+    ln: Indonezí
+    lt: Indonezija
+    lv: Indonēzija
+    mg: Indonezia
+    mi: Initonīhia
+    mk: Индонезија
+    ml: ഇന്തോനേഷ്യ
+    mn: Индонез
+    mr: इंडोनेशिया
+    ms: Indonesia
+    mt: Indoneżja
+    my: အင်ဒိုနီးရှားနိုင်ငံ
+    na: Indonitsiya
+    ne: इण्डोनेशिया
+    nl: Indonesië
+    nn: Indonesia
+    "no": Indonesia
+    nv: Indoníízha
+    oc: Indonesia
+    om: Indoneeshiyaa
+    or: ଇଣ୍ଡୋନେସିଆ
+    os: Индонези
+    pa: ਇੰਡੋਨੇਸ਼ੀਆ
+    pl: Indonezja
+    ps: اندونيزيا
+    pt: Indonésia
+    qu: Indunisya
+    rm: Indonesia
+    ro: Indonezia
+    ru: Индонезия
+    rw: Indonesiya
+    sa: इण्डोनेशिया
+    se: Indonesia
+    sg: Ênndonezïi
+    sh: Indonezija
+    si: ඉන්දුනීසියාව
+    sk: Indonézia
+    sl: Indonezija
+    sm: Indyunisia
+    so: Indunisiya
+    sq: Indonezia
+    sr: Индонезија
+    ss: INdonesiya
+    su: Indonésia
+    sv: Indonesien
+    sw: Indonesia
+    ta: இந்தோனேசியா
+    te: ఇండోనేషియా
+    tg: Индонезия
+    th: ประเทศอินโดนีเซีย
+    tk: Indoneziýa
+    tl: Indonesya
+    tr: Endonezya
+    tt: Индонезия
+    ug: ھىندونېزىيە
+    uk: Індонезія
+    ur: انڈونیشیا
+    uz: Indoneziya
+    vi: Indonesia
+    vo: Lindäna-Seänuäns
+    wa: Indonezeye
+    wo: Endoneesi
+    yi: אינדאנעזיע
+    yo: Indonésíà
+    za: Yindunizsihya
+    zh: 印度尼西亚 / 印度尼西亞
diff --git a/settings/country-names/ie.yaml b/settings/country-names/ie.yaml
new file mode 100644 (file)
index 0000000..08eb050
--- /dev/null
@@ -0,0 +1,146 @@
+name: 
+    default: Éire / Ireland
+    af: Ierland
+    ak: Aereland
+    am: አየርላንድ
+    an: Irlanda
+    ar: أيرلندا
+    ay: Irlandiya
+    az: İrlandiya
+    ba: Ирландия
+    be: Ірландыя
+    bg: Ирландия
+    bi: Ireland
+    bm: Irilandi
+    bn: আয়ারল্যান্ড
+    bo: ཨ་ཡར་ལནཌ།
+    br: Iwerzhon
+    bs: Irska
+    ca: Irlanda
+    ce: Ирланди
+    co: Irlanda
+    cs: Irsko
+    cu: Єирь
+    cv: Ирланди Республики
+    cy: Iwerddon
+    da: Irland
+    de: Irland
+    dv: އަޔަލޭންޑުގެ ޖުމްހޫރިއްޔާ
+    dz: ཨཱ་ཡ་ལེནཌ
+    ee: Ireland nutome
+    el: Ιρλανδία
+    en: Ireland
+    eo: Irlando
+    es: Irlanda
+    et: Iirimaa
+    eu: Irlanda
+    fa: ایرلند
+    ff: Irlannda
+    fi: Irlanti
+    fo: Írland
+    fr: Irlande
+    fy: Ierlân
+    ga: Éire
+    gd: Èirinn
+    gl: Irlanda
+    gn: Ilandia
+    gu: આયર્લેંડ
+    gv: Nerin
+    ha: Ayalan
+    he: אירלנד
+    hi: आयरलैंड
+    hr: Irska
+    ht: Ilann
+    hu: Írország
+    hy: Իռլանդիա
+    ia: Irlanda
+    id: Irlandia
+    ie: Irland
+    io: Irlando
+    is: Írland
+    it: Irlanda
+    ja: アイルランド
+    jv: Republik Irlandia
+    ka: ირლანდია
+    ki: Ayalandi
+    kk: Ирландия
+    kl: Irlandi
+    km: អៀរឡង់
+    kn: ಐರ್ಲೆಂಡ್
+    ko: 아일랜드
+    ks: اَیَرلینٛڑ
+    ku: Îrland
+    kv: Ирландия
+    kw: Repoblek Wordhen
+    ky: Ирландия
+    la: Hibernia
+    lb: Irland
+    lg: Ayalandi
+    li: Ierland
+    ln: Irelandɛ
+    lo: ໄອແລນ
+    lt: Airija
+    lv: Īrija
+    mg: Irlandy
+    mi: Airangi
+    mk: Ирска
+    ml: അയർലാൻഡ്
+    mn: Ирланд
+    mr: आयर्लंड
+    ms: Ireland
+    mt: Irlanda
+    my: အိုင်ယာလန်
+    na: Ripubrikit Airerand
+    ne: आइरल्याण्ड
+    nl: Ierland
+    nn: Irland
+    "no": Irland
+    nv: Bitsiighaʼ Łichííʼí Bikéyah
+    oc: Republica d'Irlanda
+    or: ଆୟରଲ୍ୟାଣ୍ଡ
+    os: Ирланди
+    pl: Irlandia
+    ps: د آيرلېنډ جمهوريت
+    pt: Irlanda
+    qu: Ilanda
+    rm: Irlanda
+    rn: Irilandi
+    ro: Irlanda
+    ru: Ирландия
+    rw: Irilande
+    sc: Irlanda
+    se: Irlánda
+    sg: Irlânde
+    sh: Irska
+    si: අයර්ලන්තය
+    sk: Írsko
+    sl: Irska
+    sn: Ireland
+    so: Ayrlaand
+    sq: Irlandë
+    sr: Ирска
+    ss: IYalendi
+    sv: Irland
+    sw: Ayalandi
+    ta: அயர்லாந்து
+    te: ఐర్ లాండ్
+    tg: Ҷумҳурии Ирландия
+    th: สาธารณรัฐไอร์แลนด์
+    ti: አየርላንድ
+    tk: Irlandiýa
+    tl: Irlanda
+    to: ʻAealani
+    tr: İrlanda
+    ts: Ireland
+    tt: Ирландия
+    uk: Ірландія
+    ur: آئرلینڈ
+    uz: Irlandiya
+    vi: Ireland
+    vo: Lireyän
+    wa: Irlande
+    yi: אירלאנד
+    yo: Orílẹ́ède Ailandi
+    za: Aiwjlanz Gunghozgoz
+    zh: 愛爾蘭
+    zu: i-Ireland
diff --git a/settings/country-names/il.yaml b/settings/country-names/il.yaml
new file mode 100644 (file)
index 0000000..9acd732
--- /dev/null
@@ -0,0 +1,136 @@
+name: 
+    default: ישראל
+    af: Israel
+    am: እስራኤል
+    an: Israel
+    ar: إسرائيل
+    av: Гlизраил
+    az: İsrail
+    ba: Израиль
+    be: Ізраіль
+    bg: Израел
+    bm: Israil
+    bn: ইসরায়েল
+    bo: ཨི་སི་ར་ཨེལ།
+    br: Israel
+    bs: Izrael
+    ca: Israel
+    ce: Израиль
+    co: Israele
+    cs: Izrael
+    cu: Їꙁдраил҄ь
+    cv: Израиль
+    cy: Israel
+    da: Israel
+    de: Israel
+    dv: އިސްރާއީލު
+    dz: ཨིཛ་རཱེལ་
+    el: Ισραήλ
+    en: Israel
+    eo: Israelo
+    es: Israel
+    et: Iisrael
+    eu: Israel
+    fa: اسرائیل
+    fi: Israel
+    fj: Isireli
+    fo: Ísrael
+    fr: Israël
+    fy: Israel
+    ga: Iosrael
+    gd: Iosrael
+    gl: Israel
+    gn: Israel
+    gu: ઈઝરાયલ
+    gv: Israel
+    ha: Isra'ila
+    he: ישראל
+    hi: इज़राइल
+    hr: Izrael
+    ht: Izrayèl
+    hu: Izrael
+    hy: Իսրայել
+    ia: Israel
+    id: Israel
+    ie: Israel
+    ig: Israel
+    io: Israel
+    is: Ísrael
+    it: Israele
+    ja: イスラエル
+    jv: Israèl
+    ka: ისრაელი
+    kg: Israel
+    kk: Израиль
+    kl: Israel
+    kn: ಇಸ್ರೇಲ್
+    ko: 이스라엘
+    ku: Îsraêl
+    kv: Израиль
+    kw: Ysrael
+    ky: Израиль
+    la: Israel
+    lb: Israel
+    li: Israël
+    ln: Israel
+    lt: Izraelis
+    lv: Izraēla
+    mi: Iharaira
+    mk: Израел
+    ml: ഇസ്രയേൽ
+    mn: Израйль
+    mr: इस्रायल
+    ms: Israel
+    mt: Iżrael
+    my: အစ္စရေးနိုင်ငံ
+    na: Iteraer
+    ne: इजरायल
+    nl: Israël
+    nn: Israel
+    "no": Israel
+    nv: Ízrel Bikéyah
+    oc: Israèl
+    or: ଇସ୍ରାଏଲ
+    os: Израиль
+    pa: ਇਜ਼ਰਾਇਲ
+    pl: Izrael
+    ps: اسرائيل
+    pt: Israel
+    qu: Israyil
+    ro: Israel
+    ru: Израиль
+    rw: Isirayeli
+    sa: इस्रेल
+    sc: Israele
+    se: Israel
+    sh: Izrael
+    si: ඊශ්‍රායලය
+    sk: Izrael
+    sl: Izrael
+    sm: Israel
+    so: Israaiil
+    sq: Izraeli
+    sr: Израел
+    ss: Ka-Israyeli
+    sv: Israel
+    sw: Israel
+    ta: இசுரேல்
+    te: ఇజ్రాయిల్
+    tg: Исроил
+    th: ประเทศอิสราเอล
+    tk: Ysraýyl
+    tl: Israel
+    tr: İsrail
+    tt: Исраил
+    ug: ئىسرائىلىيە
+    uk: Ізраїль
+    ur: اسرائیل
+    uz: Isroil
+    vi: Israel
+    vo: Yisraelän
+    wa: Israyel
+    wo: Israayil
+    yi: ישראל
+    yo: Ísráẹ́lì
+    zh: 以色列
+    zu: Isreyili
diff --git a/settings/country-names/im.yaml b/settings/country-names/im.yaml
new file mode 100644 (file)
index 0000000..49577b5
--- /dev/null
@@ -0,0 +1,88 @@
+name: 
+    default: Isle of Man
+    af: Eiland Man
+    an: Isla de Man
+    ar: جزيرة مان
+    az: Men adası
+    be: Востраў Мэн
+    bg: Ман
+    bn: আইল অফ ম্যান
+    br: Manav
+    bs: Ostrvo Man
+    ca: Illa de Man
+    cs: Man
+    cv: Мэн утравĕ
+    cy: Ynys Manaw
+    da: Isle of Man
+    de: Insel Man
+    dv: އައިޒަލް އޮފް މޭން
+    el: Νήσος του Μαν
+    en: Isle of Man
+    eo: Manksinsulo
+    es: Isla de Man
+    et: Man
+    eu: Man
+    fa: جزیره من
+    fi: Mansaari
+    fo: Mann
+    fr: Île de Man
+    fy: Man
+    ga: Oileán Mhanann
+    gd: Eilean Mhanainn
+    gl: Illa de Man
+    gv: Ellan Vannin
+    he: האי מאן
+    hi: आइल ऑफ़ मैन
+    hr: Otok Man
+    hu: Man
+    hy: Մեն կղզի
+    ia: Insula de Man
+    id: Pulau Man
+    io: Man-Insulo
+    is: Mön
+    it: Isola di Man
+    ja: マン島
+    jv: Pulo Man
+    ka: მენი
+    ko: 맨 섬
+    kw: Ynys Manow
+    la: Monapia
+    li: Man
+    lt: Meno Sala
+    lv: Menas Sala
+    mi: Motu o Man
+    mk: Ман
+    ml: ഐൽ ഒഫ് മാൻ
+    mr: आईल ऑफ मान
+    ms: Isle of Man
+    nl: Eiland Man
+    nn: Isle of Man
+    "no": Man
+    oc: Illa de Man
+    os: Мэн
+    pa: ਮੈਨ ਟਾਪੂ
+    pl: Wyspa Man
+    pt: Ilha de Man
+    qu: Man wat'a
+    ro: Insula Man
+    ru: Остров Мэн
+    rw: Ikirwa cya Man
+    sh: Otok Man
+    sk: Ostrov Man
+    sl: Otok Man
+    sq: Ishulli i Njeriut
+    sr: Острво Ман
+    su: Pulo Man
+    sv: Isle of Man
+    sw: Isle of Man
+    ta: மாண் தீவு
+    th: เกาะแมน
+    tl: Pulo ng Man
+    tr: Man Adası
+    tt: Мэн утравы
+    uk: Острів Мен
+    ur: آئل آف مین
+    vi: Đảo Man
+    vo: Mäneän
+    yo: Erékùṣù ilẹ̀ Man
+    zh: 马恩岛
diff --git a/settings/country-names/in.yaml b/settings/country-names/in.yaml
new file mode 100644 (file)
index 0000000..24758bf
--- /dev/null
@@ -0,0 +1,37 @@
+name: 
+    default: India
+    af: Indië
+    ar: الهند
+    be: Індыя
+    br: India
+    da: Indien
+    de: Indien
+    el: Ινδία
+    en: India
+    eo: Barato
+    fa: هند
+    fi: Intia
+    fr: Inde
+    fy: Yndia
+    ga: An India
+    gd: Na h-Innseachan
+    he: הודו
+    hi: भारत
+    hu: India
+    is: Indland
+    it: India
+    iu: ᐃᓐᑎᐊ/intia
+    ja: インド
+    lb: Indien
+    lt: Indija
+    lv: Indija
+    mn: Энэтхэг
+    pl: Indie
+    ru: Индия
+    sl: Indija
+    sv: Indien
+    th: ประเทศอินเดีย
+    tr: Hindistan
+    uk: Індія
+    vi: Ấn Độ
+    zh: 印度
diff --git a/settings/country-names/io.yaml b/settings/country-names/io.yaml
new file mode 100644 (file)
index 0000000..1ed6eea
--- /dev/null
@@ -0,0 +1,98 @@
+name: 
+    default: British Indian Ocean Territory
+    af: Britse Indiese Oseaan Gebied
+    ak: Britenfo Hɔn Man Wɔ India Po No Mu
+    am: የብሪታኒያ ህንድ ውቂያኖስ ግዛት
+    an: Territorio Britanico de l'Ozián Indico
+    ar: إقليم المحيط الهندي البريطاني
+    az: Britaniya-Hindistan Okeanik territoriyası
+    be: Брытанскія Індыйска-акіянскія тэрыторыі
+    bg: Британска индоокеанска територия
+    bm: Angilɛ ka ɛndu dugukolo
+    bn: ব্রিটিশ ভারত মহাসাগরীয় অঞ্চল
+    br: Tiriad Meurvor Indez Breizh-Veur
+    bs: Britanski teritorij Indijskog okeana
+    ca: Territori Britànic de l'Oceà Índic
+    cs: Britské indickooceánské území
+    cy: Tiriogaeth Prydain yng Nghefnfor India
+    da: Britiske Indiske Ocean
+    de: Britisches Territorium im Indischen Ozean
+    dz: བྲི་ཊིཤ་རྒྱ་གར་གྱི་རྒྱ་མཚོ་ས་ཁོངས
+    ee: Britaintɔwo ƒe india ƒudome nutome
+    el: Βρετανικό Έδαφος Ινδικού Ωκεανού
+    en: British Indian Ocean Territory
+    eo: Brita Hindoceana Teritorio
+    es: Territorio Británico del Océano Índico
+    et: Briti India ookeani ala
+    eu: Indiako Ozeanoko Britainiar Lurraldea
+    fa: مستعمره‌های بریتانیا در اقیانوس هند
+    ff: Keeriindi britaani to maayo enndo
+    fi: Brittiläinen Intian valtameren alue
+    fo: Bretsku Indiahavsoyggjarnar
+    fr: Territoire britannique de l'Océan Indien
+    fy: Britske Yndyske-Oseaanterritoarium
+    ga: Críoch Aigéan Indiach na Breataine
+    gd: Ranntair Breatannach Cuan nan Innseachan
+    gl: Territorio Británico do Océano Índico
+    gu: બ્રિટિશ ઇન્ડિયન ઓશન ટેરિટરી
+    ha: Yankin Birtaniya Na Tekun Indiya
+    he: טריטוריה בריטית באוקיאנוס ההודי
+    hi: ब्रिटिश हिंद महासागर क्षेत्र
+    hr: Britanski Indijskooceanski Teritoriji
+    hu: Brit Indiai-óceáni Terület
+    ia: Territorio oceanic britanno-indian
+    id: Teritorial Britania di Samudra Hindia
+    io: Britaniana teritorio en Indiana Oceano
+    is: Breska Indlandshafseyjar
+    it: Territorio britannico dell'oceano Indiano
+    ja: イギリス領インド洋地域
+    ka: ბრიტანეთის ინდოეთის ოკეანის ტერიტორია
+    ki: Eneo la Uingereza katika Bahari Hindi
+    km: ដែន​មហា​សមុទ្រ​ឥណ្ឌា ចក្រភព​អង់គ្លេស
+    kn: ಬ್ರಿಟೀಶ್ ಇಂಡಿಯನ್ ಮಹಾಸಾಗರ ಪ್ರದೇಶ
+    ko: 영국령 인도양 지역
+    ks: برطانوی بحرِ ہِنٛدۍ علاقہٕ
+    ku: Xakên Brîtanyayê yên Okyanûsa Hindî
+    lg: Bizinga by'eCago
+    ln: Mabelé ya Angɛlɛtɛ́lɛ na mbú ya Indiya
+    lo: ບຣິດທິສອິນດ່ຽນໂອຊ່ຽນເທີຣິທໍຣີ
+    lt: Indijos vandenyno Britų sritis
+    lv: Indijas okeāna Britu teritorija
+    mg: Faridranomasina indiana britanika
+    mk: Британска Индоокеанска Територија
+    ml: ബ്രിട്ടീഷ് ഇന്ത്യൻ മഹാസമുദ്ര പ്രദേശം
+    mn: Британийн Энэтхэгийн Далайн Нутаг дэвсгэр
+    mr: ब्रिटीश हिंदी महासागर क्षेत्र
+    ms: Wilayah Lautan Hindi British
+    my: ဗြိတိသျှ အိန္ဒြိယ သမုဒ္ဒရာ ပိုင်နက်
+    ne: बेलायती हिन्द महासागर क्षेत्र
+    nl: Brits Territorium in de Indische Oceaan
+    nn: Britiske område i Det indiske hav
+    "no": Det britiske territoriet i Indiahavet
+    or: ବ୍ରିଟିଶ୍ ଭାରତୀୟ ସାମୁଦ୍ରିକ କ୍ଷେତ୍ର
+    pl: Brytyjskie Terytorium Oceanu Indyjskiego
+    pt: Território Britânico do Oceano Índico
+    rm: Territori Britannic en l'Ocean Indic
+    rn: Intara y'Ubwongereza yo mu birwa by'Abahindi
+    ro: Teritoriul Britanic din Oceanul Indian
+    ru: Британская Территория в Индийском Океане
+    sg: Sêse tî Anglëe na Ngûyämä tî Ênnde
+    sh: Britanski teritorij Indijskog oceana
+    si: බ්‍රිතාන්‍ය ඉන්දීය සාගර ප්‍රාන්තය
+    sk: Britské indickooceánske územie
+    sl: Britanski teritorij v Indijskem oceanu
+    sr: Британска територија Индијског океана
+    sv: Brittiska territoriet i Indiska oceanen
+    sw: Eneo la Uingereza katika Bahari Hindi
+    ta: பிரித்தானிய இந்தியப் பெருங்கடல் மண்டலம்
+    te: బ్రిటిష్ భారతీయ ఓషన్ ప్రాంతం
+    th: บริติชอินเดียนโอเชียนเทร์ริทอรี
+    ti: የብሪታኒያ ህንድ ውቂያኖስ ግዛት
+    to: Potu fonua moana ʻInitia fakapilitānia
+    tr: Britanya Hint Okyanusu Toprakları
+    uk: Британська територія в Індійському океані
+    ur: برطانوی ہندوستانی سمندری خطہ
+    vi: Lãnh thổ Ấn Độ Dương thuộc Anh
+    yo: Orílẹ́ède Etíkun Índíánì ti Ìlú Bírítísì
+    zh: 英属印度洋领地
+    zu: i-British Indian Ocean Territory
diff --git a/settings/country-names/iq.yaml b/settings/country-names/iq.yaml
new file mode 100644 (file)
index 0000000..5b70e36
--- /dev/null
@@ -0,0 +1,129 @@
+name: 
+    default: العراق
+    af: Irak
+    am: ኢራቅ
+    an: Iraq
+    ar: العراق
+    av: ГӀиракъ
+    az: İraq
+    be: Ірак
+    bg: Ирак
+    bn: ইরাক
+    bo: ཡི་ལའ་ཁོ།
+    br: Irak
+    bs: Irak
+    ca: Iraq
+    ce: Ӏиракъ
+    cs: Irák
+    cv: Ирак
+    cy: Irac
+    da: Irak
+    de: Irak
+    dv: ޢިރާޤު
+    el: Ιράκ
+    en: Iraq
+    eo: Irako
+    es: Irak
+    et: Iraak
+    eu: Irak
+    fa: عراق
+    fi: Irak
+    fo: Irak
+    fr: Irak
+    fy: Irak
+    ga: An Iaráic
+    gd: Ioràc
+    gl: Iraq - العراق
+    gu: ઈરાક
+    gv: Yn Earack
+    he: עיראק
+    hi: इराक़
+    hr: Irak
+    ht: Irak
+    hu: Irak
+    hy: Իրաք
+    ia: Irak
+    id: Irak
+    ie: Irak
+    io: Irak
+    is: Írak
+    it: Iraq
+    iu: ᐃᕉᒃ
+    ja: イラク
+    jv: Irak
+    ka: ერაყი
+    ki: Iraq
+    kk: Ирак
+    kl: Iraq
+    kn: ಇರಾಕ್
+    ko: 이라크
+    ku: Iraq
+    kv: Ирак
+    kw: Irak
+    ky: Ирак
+    la: Iracum
+    lb: Irak
+    li: Irak
+    ln: Irak
+    lt: Irakas
+    lv: Irāka
+    mi: Irāki
+    mk: Ирак
+    ml: ഇറാഖ്
+    mn: Ирак
+    mr: इराक
+    ms: Iraq
+    mt: Iraq
+    my: အီရတ်နိုင်ငံ
+    na: Irak
+    nb: Irak
+    ne: ईराक
+    nl: Irak
+    nn: Irak
+    "no": Irak
+    nv: Iiwááʼ
+    oc: Iraq
+    or: ଇରାକ
+    os: Ирак
+    pa: ਇਰਾਕ
+    pl: Irak
+    ps: عراق
+    pt: Iraque
+    qu: Iraq
+    ro: Irak
+    ru: Ирак
+    rw: Irake
+    sa: ईराक
+    se: Irak
+    sh: Irak
+    si: ඉරාක ජනරජය
+    sk: Irak
+    sl: Irak
+    so: Ciraaq
+    sq: Iraku
+    sr: Ирак
+    ss: I-Irakhi
+    su: Irak
+    sv: Irak
+    sw: Iraq
+    ta: ஈராக்
+    te: ఇరాక్
+    tg: Ироқ
+    th: ประเทศอิรัก
+    tk: Yrak
+    tl: Irak
+    tr: Irak
+    tt: Гыйрак
+    tw: Irak
+    ug: ئىراق
+    uk: Ірак
+    ur: عراق
+    uz: Iroq
+    vi: Iraq
+    vo: Lirakän
+    wa: Irak
+    wo: Iraak
+    yi: איראק
+    yo: Irak
+    zh: 伊拉克
+    zu: I-Iraki
diff --git a/settings/country-names/ir.yaml b/settings/country-names/ir.yaml
new file mode 100644 (file)
index 0000000..3e73c0e
--- /dev/null
@@ -0,0 +1,135 @@
+name: 
+    default: ایران
+    af: Iran
+    am: ፋርስ
+    an: Irán
+    ar: إیران
+    az: İran
+    ba: Иран
+    be: Іран
+    bg: Иран
+    bn: ইরান
+    bo: ཡི་ལང་།
+    br: Iran
+    bs: Iran
+    ca: Iran
+    ce: Иран
+    co: Iranu
+    cs: Írán
+    cy: Iran
+    da: Iran
+    de: Iran
+    dv: އީރާން
+    dz: ཨི་རཱན་
+    el: Ιράν
+    en: Iran
+    eo: Irano
+    es: Irán
+    et: Iraan
+    eu: Iran
+    fa: ایران
+    fi: Iran
+    fo: Iran
+    fr: Iran
+    fy: Iran
+    ga: An Iaráin
+    gd: Ioràn
+    gl: Irán - ایران
+    gn: Irán
+    gu: ઈરાન
+    gv: Yn Eeraan
+    ha: Iran
+    he: איראן
+    hi: ईरान
+    hr: Iran
+    ht: Iran
+    hu: Irán
+    hy: Իրան
+    ia: Iran
+    id: Iran
+    ie: Iran
+    io: Iran
+    is: Íran
+    it: Iran
+    ja: イラン
+    jv: Iran
+    ka: ირანი
+    kk: Иран
+    kl: Iran
+    km: អ៊ីរ៉ង់
+    kn: ಇರಾನ್
+    ko: 이란
+    ks: ایٖران
+    ku: Îran
+    kv: Иран
+    kw: Iran
+    ky: Иран
+    la: Irania
+    lb: Iran
+    li: Iran
+    ln: Iran
+    lt: Iranas
+    lv: Irāna
+    mg: Iran
+    mi: Irāna
+    mk: Иран
+    ml: ഇറാൻ
+    mn: Иран
+    mr: इराण
+    ms: Iran
+    mt: Iran
+    my: အီရန်နိုင်ငံ
+    na: Iran
+    ne: इरान
+    nl: Iran
+    nn: Iran
+    "no": Iran
+    nv: Iiwą́ą́
+    oc: Iran
+    or: ଇରାନ
+    os: Иран
+    pa: ਇਰਾਨ
+    pl: Iran
+    ps: ایران
+    pt: Irão
+    qu: Iran
+    rm: Iran
+    ro: Iran
+    ru: Иран
+    rw: Irani
+    sa: ईरान
+    sc: Iran
+    se: Iran
+    sh: Iran
+    si: ඉරානය
+    sk: Irán
+    sl: Iran
+    so: Iiraan
+    sq: Irani
+    sr: Иран
+    ss: I-Irani
+    su: Iran
+    sv: Iran
+    sw: Uajemi
+    ta: ஈரான்
+    te: ఇరాన్
+    tg: Эрон
+    th: ประเทศอิหร่าน
+    tk: Eýran
+    tl: Iran
+    tr: İran
+    tt: Иран
+    tw: Iran
+    ug: ئىران
+    uk: Іран
+    ur: ایران
+    uz: Eron
+    vi: Iran
+    vo: Lirän
+    wa: Iran
+    wo: Iraan
+    yi: איראן
+    yo: Ìránì
+    za: Iran
+    zh: 伊朗
+    zu: I-Irani
diff --git a/settings/country-names/is.yaml b/settings/country-names/is.yaml
new file mode 100644 (file)
index 0000000..d427275
--- /dev/null
@@ -0,0 +1,143 @@
+name: 
+    default: Ísland
+    af: Ysland
+    am: አይስላንድ
+    an: Islandia
+    ar: آيسلندا
+    az: İslandiya
+    ba: Исландия
+    be: Ісландыя
+    bg: Исландия
+    bi: Iceland
+    bm: Aisland
+    bn: আইসল্যান্ড
+    bo: ཨཡིསུ་ལེན་ཌ།
+    br: Island
+    bs: Island
+    ca: Islàndia
+    ce: Исланди
+    co: Islanda
+    cs: Island
+    cu: Исландъ
+    cv: Исланди
+    cy: Gwlad yr Iâ
+    da: Island
+    de: Island
+    dv: އައިސްލަންޑަން
+    dz: ཨའིསི་ལེནཌ་
+    ee: Iceland
+    el: Ισλανδία
+    en: Iceland
+    eo: Islando
+    es: Islandia
+    et: Island
+    eu: Islandia
+    fa: ایسلند
+    ff: Islannda
+    fi: Islanti
+    fo: Ísland
+    fr: Islande
+    fy: Yslân
+    ga: An Íoslainn
+    gd: Innis Tìle
+    gl: Islandia
+    gn: Iylanda
+    gu: આઈસલેંડ
+    gv: Yn Eeslynn
+    he: איסלנד
+    hi: आइसलैण्ड
+    hr: Island
+    ht: Islann
+    hu: Izland
+    hy: Իսլանդիա
+    ia: Islanda
+    id: Islandia
+    ie: Island
+    io: Islando
+    is: Ísland
+    it: Islanda
+    ja: アイスランド
+    jv: Islandia
+    ka: ისლანდია
+    kg: Islande
+    kk: Исландия
+    kl: Islandi
+    km: ប្រទេសអាយឡែន
+    kn: ಐಸ್‍ಲ್ಯಾಂಡ್
+    ko: 아이슬란드
+    ku: Îslenda
+    kv: Исландия
+    kw: Island
+    ky: Исландия
+    la: Islandia
+    lb: Island
+    lg: Isilandi
+    li: Iesland
+    ln: Islandi
+    lo: ອິດສະລັງ
+    lt: Islandija
+    lv: Islande
+    mi: Tiorangi
+    mk: Исланд
+    ml: ഐസ്‌ലാന്റ്
+    mn: Исланд
+    mr: आइसलँड
+    ms: Iceland
+    mt: Iżlanda
+    my: အိုက်စလန်နိုင်ငံ
+    na: Aiterand
+    nb: Island
+    ne: आइसल्याण्ड
+    nl: IJsland
+    nn: Island
+    "no": Island
+    nv: Tin Bikéyah
+    oc: Islàndia
+    or: ଆଇସଲ୍ୟାଣ୍ଡ
+    os: Исланди
+    pa: ਆਈਸਲੈਂਡ
+    pl: Islandia
+    ps: آيسلېنډ
+    pt: Islândia
+    qu: Islandya
+    rm: Islanda
+    ro: Islanda
+    ru: Исландия
+    rw: Isilande
+    sa: आइसलैंड
+    sc: Islanda
+    se: Islánda
+    sg: Islânde
+    sh: Island
+    si: අයිස්ලන්තය
+    sk: Island
+    sl: Islandija
+    sm: Aiselani
+    so: Island
+    sq: Islanda
+    sr: Исланд
+    ss: Echweni
+    st: Iceland
+    su: Islandia
+    sv: Island
+    sw: Iceland
+    ta: ஐசுலாந்து
+    te: ఐస్‌లాండ్
+    tg: Исландия
+    th: ประเทศไอซ์แลนด์
+    tk: Islandiýa
+    tl: Lupangyelo
+    tr: İzlanda
+    tt: Исландия
+    ug: ئىسلاندىيە
+    uk: Ісландія
+    ur: آئس لینڈ
+    uz: Islandiya
+    vi: Iceland
+    vo: Lisladeän
+    wa: Izlande
+    wo: Islaand
+    yi: איסלאנד
+    yo: Íslándì
+    zh: 冰岛
+    zu: I-Ayisilandi
diff --git a/settings/country-names/it.yaml b/settings/country-names/it.yaml
new file mode 100644 (file)
index 0000000..cb84ada
--- /dev/null
@@ -0,0 +1,148 @@
+name: 
+    default: Italia
+    ab: Италиа
+    af: Italië
+    ak: Italy
+    am: ጣልያን
+    an: Italia
+    ar: إيطاليا
+    as: ইটালী
+    ay: Italiya
+    az: İtaliya
+    ba: Италия
+    be: Італія
+    bg: Италия
+    bi: Itali
+    bn: ইতালি
+    bo: ཨི་ཏ་ལི།
+    br: Italia
+    bs: Italija
+    ca: Itàlia
+    ce: Итали
+    co: Italia
+    cs: Itálie
+    cu: Италїꙗ
+    cv: Итали
+    cy: Yr Eidal
+    da: Italien
+    de: Italien
+    dv: އިޓަލީވިލާތް
+    dz: ཨྀཊ་ལི་
+    ee: Italy
+    el: Ιταλία
+    en: Italy
+    eo: Italio
+    es: Italia
+    et: Itaalia
+    eu: Italia
+    fa: ایتالیا
+    ff: Italiya
+    fi: Italia
+    fo: Italia
+    fr: Italie
+    fy: Itaalje
+    ga: An Iodáil
+    gd: An Eadailt
+    gl: Italia
+    gn: Itália
+    gu: ઈટલી
+    gv: Yn Iddaal
+    he: איטליה
+    hi: इटली
+    hr: Italija
+    ht: Itali
+    hu: Olaszország
+    hy: Իտալիա
+    ia: Italia
+    id: Italia
+    ie: Italia
+    io: Italia
+    is: Ítalía
+    it: Italia
+    ja: イタリア
+    jv: Italia
+    ka: იტალია
+    kg: Italia
+    ki: Italia
+    kk: Италия
+    kl: Italia
+    km: អ៊ីតាលី
+    kn: ಇಟಲಿ
+    ko: 이탈리아
+    ku: Îtalya
+    kv: Италия
+    kw: Itali
+    ky: Италия
+    la: Italia
+    lb: Italien
+    lg: Yitale
+    li: Italië
+    ln: Italya
+    lo: ອິຕາລີ
+    lt: Italija
+    lv: Itālija
+    mg: Italia
+    mi: Itari
+    mk: Италија
+    ml: ഇറ്റലി
+    mn: Итали
+    mr: इटली
+    ms: Itali
+    mt: Italja
+    my: အီတလီနိုင်ငံ
+    na: Itari
+    ne: इटाली
+    nl: Italië
+    nn: Italia
+    "no": Italia
+    nv: Ídelii
+    oc: Itàlia
+    or: ଇଟାଲୀ
+    os: Итали
+    pa: ਇਟਲੀ
+    pl: Włochy
+    ps: اېټاليا
+    pt: Itália
+    qu: Italya
+    rm: Italia
+    ro: Italia
+    ru: Италия
+    rw: Ubutaliyani
+    sa: इटली
+    sc: Itàlia
+    se: Itália
+    sg: Italùii
+    sh: Italija
+    sk: Taliansko
+    sl: Italija
+    sm: Italia
+    so: Talyaaniga
+    sq: Italia
+    sr: Италија
+    ss: INtaliyane
+    su: Italia
+    sv: Italien
+    sw: Italia
+    ta: இத்தாலி
+    te: ఇటలీ
+    tg: Итолиё
+    th: ประเทศอิตาลี
+    tk: Italiýa
+    tl: Italya
+    tr: İtalya
+    tt: Италия
+    tw: Italy
+    ty: ’Itāria
+    ug: ئىتالىيە
+    uk: Італія
+    ur: اطالیہ
+    uz: Italiya
+    ve: Italy
+    vi: Ý
+    vo: Litaliyän
+    wa: Itåleye
+    wo: Itaali
+    yi: איטאליע
+    yo: Itálíà
+    zh: 意大利
+    zu: ITaliya
diff --git a/settings/country-names/je.yaml b/settings/country-names/je.yaml
new file mode 100644 (file)
index 0000000..5212e46
--- /dev/null
@@ -0,0 +1,82 @@
+name: 
+    default: Jersey
+    af: Jersey
+    an: Jèrri
+    ar: جيرزي
+    az: Cersi
+    be: Джэрсi
+    bg: Джърси
+    br: Jerzenez
+    bs: Jersey
+    ca: Jersey
+    cs: Jersey
+    cy: Jersey
+    da: Jersey
+    de: Jersey
+    dv: ޖާސޭ
+    el: Υερσέη
+    en: Jersey
+    eo: Ĵerzejo
+    es: Jersey
+    et: Jersey
+    eu: Jersey
+    fa: جرزی
+    fi: Jersey
+    fr: Jersey
+    ga: Geirsí
+    gd: Jersey
+    gl: Illa de Jersey
+    gv: Jersee
+    he: ג'רזי
+    hr: Jersey
+    hu: Jersey
+    hy: Ջերսի
+    id: Jersey
+    io: Jersey
+    is: Jersey
+    it: Isola di Jersey
+    ja: ジャージー
+    jv: Jersey
+    ka: ჯერზი
+    kn: ಜರ್ಸಿ
+    ko: 저지 섬
+    kw: Jersi
+    la: Caesarea Insula
+    li: Jersey
+    lt: Džersis
+    lv: Džērsija
+    mi: Tōrehe
+    mn: Жерси
+    mr: जर्सी
+    ms: Jersey
+    ne: जर्सी
+    nl: Jersey
+    nn: Jersey
+    "no": Jersey
+    oc: Jersei
+    os: Джерси
+    pa: ਜਰਸੀ
+    pl: Jersey
+    pt: Jersey
+    ro: Insula Jersey
+    ru: Джерси
+    rw: Jersey
+    sh: Jersey
+    sk: Jersey
+    sl: Jersey
+    sq: Jersey
+    sr: Џерзи
+    su: Jersey
+    sv: Jersey
+    sw: Jersey
+    ta: யேர்சி
+    te: జెర్సీ
+    th: เจอร์ซีย์
+    tl: Hersey
+    tr: Jersey
+    tt: Җерси
+    uk: Джерсі
+    ur: جرزی
+    vi: Jersey
+    yo: Jersey
+    zh: 澤西島
diff --git a/settings/country-names/jm.yaml b/settings/country-names/jm.yaml
new file mode 100644 (file)
index 0000000..1cd5dc0
--- /dev/null
@@ -0,0 +1,46 @@
+name: 
+    default: Jamaica
+    af: Jamaika
+    ar: جامايكا
+    be: Ямайка
+    br: Jamaika
+    cs: Jamajka
+    de: Jamaika
+    el: Ιαμαϊκή
+    en: Jamaica
+    eo: Jamajko
+    fa: جامائیکا
+    fi: Jamaika
+    fr: Jamaïque
+    fy: Jamaika
+    ga: Iamáice
+    gd: Iaimeuca
+    he: ג'מייקה
+    hr: Jamajka
+    hu: Jamaica
+    id: Jamaika
+    io: Jamaika
+    is: Jamaíka
+    it: Giamaica
+    ja: ジャマイカ
+    ku: Camayka
+    la: Iamaica
+    lb: Jamaika
+    lt: Jamaika
+    lv: Jamaika
+    mn: Ямайка
+    nl: Jamaica
+    oc: Jamaica
+    pl: Jamajka
+    pt: Jamaica
+    ru: Ямайка
+    se: Jamaica
+    sk: Jamajka
+    sl: Jamajka
+    sv: Jamaica
+    ta: ஜமேக்கா
+    th: ประเทศจาเมกา
+    tr: Jamaika
+    uk: Ямайка
+    vo: Camekeän
+    zh: 牙买加
diff --git a/settings/country-names/jo.yaml b/settings/country-names/jo.yaml
new file mode 100644 (file)
index 0000000..5c14c0a
--- /dev/null
@@ -0,0 +1,120 @@
+name: 
+    default: الأردن
+    af: Jordanië
+    am: ጆርዳን
+    an: Chordania
+    ar: الأردن
+    az: İordaniya
+    ba: Иордания
+    be: Іарданія
+    bg: Йордания
+    bm: Ordon
+    bn: জর্দান
+    bo: རྗོར་ཌན།
+    br: Jordania
+    bs: Jordan
+    ca: Jordània
+    cs: Jordánsko
+    cv: Иордани
+    cy: Gwlad Iorddonen
+    da: Jordan
+    de: Jordanien
+    dv: އުރުދުން
+    el: Ιορδανία
+    en: Jordan
+    eo: Jordanio
+    es: Jordania
+    et: Jordaania
+    eu: Jordania
+    fa: اردن
+    fi: Jordania
+    fo: Jordan
+    fr: Jordanie
+    fy: Jordaanje
+    ga: An Iordáin
+    gd: Iòrdan
+    gl: Xordania
+    gu: જૉર્ડન
+    gv: Yn Jordaan
+    he: ירדן
+    hi: जॉर्डन
+    hr: Jordan
+    ht: Jòdani
+    hu: Jordánia
+    hy: Հորդանան
+    ia: Jordania
+    id: Yordania
+    ie: Jordania
+    io: Jordania
+    is: Jórdanía
+    it: Giordania
+    ja: ヨルダン
+    jv: Yordania
+    ka: იორდანია
+    kk: Иордания
+    kl: Jordan
+    km: ហ្សកដង់
+    ko: 요르단
+    ks: اردن
+    ku: Urdun
+    kv: Иордания
+    kw: Jordan
+    la: Iordania
+    lb: Jordanien
+    li: Jordanië
+    ln: Zordaní
+    lt: Jordanija
+    lv: Jordānija
+    mi: Hōrano
+    mk: Јордан
+    ml: ജോർദാൻ
+    mn: Йордан
+    mr: जॉर्डन
+    ms: Jordan
+    mt: Ġordan
+    my: ဂျော်ဒန်နိုင်ငံ
+    na: Djordan
+    nl: Jordanië
+    nn: Jordan
+    "no": Jordan
+    nv: Jóoʼdan
+    oc: Jordania
+    or: ଜୋର୍ଡାନ
+    os: Иордани
+    pa: ਜਾਰਡਨ
+    pl: Jordania
+    ps: اردن
+    pt: Jordânia
+    qu: Hurdanya
+    ro: Iordania
+    ru: Иордания
+    rw: Yorudani
+    sa: जार्डन
+    se: Jordania
+    sh: Jordan
+    sk: Jordánsko
+    sl: Jordanija
+    so: Urdun
+    sq: Jordania
+    sr: Јордан
+    ss: IJoridane
+    su: Yordania
+    sv: Jordanien
+    sw: Yordani
+    ta: ஜோர்தான்
+    te: జోర్డాన్
+    th: ประเทศจอร์แดน
+    tk: Iordaniýa
+    tl: Hordan
+    tr: Ürdün
+    tt: Үрдүн
+    ug: ئىئوردانىيە
+    uk: Йорданія
+    ur: اردن
+    uz: Iordaniya
+    vi: Jordan
+    vo: Yordän
+    wo: Jordaani
+    yi: יארדאניע
+    yo: Jọ́rdánì
+    zh: 约旦/約旦
diff --git a/settings/country-names/jp.yaml b/settings/country-names/jp.yaml
new file mode 100644 (file)
index 0000000..d587765
--- /dev/null
@@ -0,0 +1,149 @@
+name: 
+    default: 日本
+    ab: Иапониа
+    af: Japan
+    am: ጃፓን
+    an: Chapón
+    ar: اليابان
+    as: জাপান
+    ay: Nihun
+    az: Yaponiya
+    ba: Япония
+    be: Японія
+    bg: Япония
+    bn: জাপান
+    bo: རི་པིན།
+    br: Japan
+    bs: Japan
+    ca: Japó
+    ce: Япони
+    ch: Chapan
+    cs: Japonsko
+    cu: Ꙗпѡнїꙗ
+    cv: Япони
+    cy: Japan
+    da: Japan
+    de: Japan
+    dv: ޖަޕާނު
+    dz: ཇཱ་པཱན།
+    ee: Japan
+    el: Ιαπωνία
+    en: Japan
+    eo: Japanio
+    es: Japón
+    et: Jaapan
+    eu: Japonia
+    fa: ژاپن
+    fi: Japani
+    fo: Japan
+    fr: Japon
+    fy: Japan
+    ga: An tSeapáin
+    gd: An t-Seapan
+    gl: Xapón
+    gn: Hapõ
+    gu: જાપાન
+    gv: Yn Çhapaan
+    ha: Japan
+    he: יפן
+    hi: जापान
+    hr: Japan
+    ht: Japon
+    hu: Japán
+    hy: Ճապոնիա
+    ia: Japon
+    id: Jepang
+    ie: Japan
+    io: Japonia
+    is: Japan
+    it: Giappone
+    iu: ᓃᑉᐊᓐ
+    ja: 日本
+    jv: Jepang
+    ka: იაპონია
+    ki: Japan
+    kk: Жапония
+    kl: Japani
+    km: ជប៉ុន
+    kn: ಜಪಾನ್
+    ko: 일본
+    ks: जापान
+    ku: Japon
+    kv: Япония
+    kw: Nihon
+    ky: Жапония
+    la: Iaponia
+    lb: Japan
+    li: Japan
+    ln: Zapɔ́
+    lo: ປະເທດຍີ່ປຸ່ນ
+    lt: Japonija
+    lv: Japāna
+    mg: Japana
+    mi: Hapani
+    mk: Јапонија
+    ml: ജപ്പാൻ
+    mn: Япон
+    mo: Жапония
+    mr: जपान
+    ms: Jepun
+    mt: Ġappun
+    my: ဂျပန်နိုင်ငံ
+    na: Djapan
+    ne: जापान
+    nl: Japan
+    nn: Japan
+    "no": Japan
+    nv: Binaʼadaałtzózí Dinéʼiʼ Bikéyah
+    oc: Japon
+    om: Jaappaan
+    or: ଜାପାନ
+    os: Япон
+    pa: ਜਪਾਨ
+    pl: Japonia
+    ps: جاپان
+    pt: Japão
+    qu: Nihun
+    rm: Giapun
+    ro: Japonia
+    ru: Япония
+    rw: Ubuyapani
+    sa: सूर्यमूल
+    sc: Giapone
+    sd: جاپان
+    se: Japána
+    sh: Japan
+    si: ජපානය
+    sk: Japonsko
+    sl: Japonska
+    sm: Iapani
+    so: Jabaan
+    sq: Japonia
+    sr: Јапан
+    ss: IJaphani
+    su: Jepang
+    sv: Japan
+    sw: Japani
+    ta: ஜப்பான்
+    te: జపాన్
+    tg: Жопун
+    th: ประเทศญี่ปุ่น
+    ti: ጃፓን
+    tk: Ýaponiýa
+    tl: Hapon
+    tr: Japonya
+    tt: Япония
+    tw: Yapan
+    ty: Tāpōnē
+    ug: ياپونىيە
+    uk: Японія
+    ur: جاپان
+    uz: Yaponiya
+    vi: Nhật Bản
+    vo: Yapän
+    wo: Sapoŋ
+    yi: יאפאן
+    yo: Japan
+    za: Nditbonj
+    zh: 日本
+    zu: IJapani
diff --git a/settings/country-names/ke.yaml b/settings/country-names/ke.yaml
new file mode 100644 (file)
index 0000000..dabf133
--- /dev/null
@@ -0,0 +1,134 @@
+name: 
+    default: Kenya
+    af: Kenia
+    am: ኬንያ
+    an: Kenia
+    ar: كينيا
+    az: Keniya
+    ba: Кения
+    be: Кенія
+    bg: Кения
+    bm: Kenya
+    bn: কেনিয়া
+    bo: ཁེ་ནི་ཡ།
+    br: Kenya
+    bs: Kenija
+    ca: Kenya
+    ce: Кени
+    cs: Keňa
+    cv: Кени
+    cy: Kenya
+    da: Kenya
+    de: Kenia
+    dv: ކެންޔާ
+    dz: ཀེ་ནི་ཡ་
+    el: Κένυα
+    en: Kenya
+    eo: Kenjo
+    es: Kenia
+    et: Keenia
+    eu: Kenya
+    fa: کنیا
+    ff: Kenya
+    fi: Kenia
+    fo: Kenja
+    fr: Kenya
+    fy: Kenya
+    ga: An Chéinia
+    gd: A' Cheinia
+    gl: Quenia - Kenya
+    gu: કેન્યા
+    gv: Yn Cheinney
+    ha: Kenya
+    he: קניה
+    hi: कीनिया
+    hr: Kenija
+    ht: Kenya
+    hu: Kenya
+    hy: Քենիա
+    ia: Kenya
+    id: Kenya
+    ie: Kenia
+    io: Kenia
+    is: Kenía
+    it: Kenya
+    ja: ケニア
+    jv: Kénya
+    ka: კენია
+    kg: Kenya
+    ki: Kenya
+    kk: Кения
+    kl: Kenya
+    kn: ಕೀನ್ಯಾ
+    ko: 케냐
+    ku: Kenya
+    kw: Kenya
+    la: Kenia
+    lb: Kenia
+    lg: Kenya
+    li: Kenia
+    ln: Kénya
+    lt: Kenija
+    lv: Kenija
+    mg: Kenia
+    mi: Kēnia
+    mk: Кенија
+    ml: കെനിയ
+    mn: Кени
+    mr: केनिया
+    ms: Kenya
+    mt: Kenja
+    my: ကင်ညာနိုင်ငံ
+    na: Keniya
+    nl: Kenia
+    nn: Kenya
+    "no": Kenya
+    nv: Kénya
+    oc: Kenya
+    om: Keeniyaa
+    or: କେନିଆ
+    os: Кени
+    pa: ਕੀਨੀਆ
+    pl: Kenia
+    ps: کېنيا
+    pt: Quénia
+    qu: Kinya
+    ro: Kenya
+    ru: Кения
+    rw: Kenya
+    sa: केन्या
+    sc: Kènya
+    se: Kenia
+    sg: Kenyäa
+    sh: Kenija
+    sk: Keňa
+    sl: Kenija
+    sn: Kenya
+    so: Kiinya
+    sq: Kenia
+    sr: Кенија
+    ss: IKheniya
+    su: Kénya
+    sv: Kenya
+    sw: Kenya
+    ta: கென்யா
+    te: కెన్యా
+    tg: Кения
+    th: ประเทศเคนยา
+    ti: ኬንያ
+    tk: Keniýa
+    tl: Kenya
+    tr: Kenya
+    ts: Kenya
+    tt: Кения
+    ug: كېنىيە
+    uk: Кенія
+    ur: کینیا
+    uz: Keniya
+    vi: Kenya
+    vo: Kenyän
+    wo: Keeñaa
+    yi: קעניע
+    yo: Kẹ́nyà
+    zh: 肯尼亚
+    zu: IKenya
diff --git a/settings/country-names/kg.yaml b/settings/country-names/kg.yaml
new file mode 100644 (file)
index 0000000..6fb9bc6
--- /dev/null
@@ -0,0 +1,122 @@
+name: 
+    default: Кыргызстан
+    ab: Ҟырҕызсҭан
+    af: Kirgisië
+    am: ኪርጊዝስታን
+    an: Kirguizistán
+    ar: قرغيزستان
+    az: Qırğızıstan
+    ba: Ҡырғыҙстан
+    be: Кыргызстан
+    bg: Киргизстан
+    bn: কিরগিজিস্তান
+    bo: ཀེ་རེ་གེཛུ་སུཏེན།
+    br: Kirgizstan
+    bs: Kirgistan
+    ca: Kirguizistan
+    ce: Киргизи
+    cs: Kyrgyzstán
+    cv: Киргизи
+    cy: Kyrgyzstan
+    da: Kirgisistan
+    de: Kirgisistan
+    dv: ކިރިގިސްތާން
+    ee: Kyrgyzstan
+    el: Κιργιζία
+    en: Kyrgyzstan
+    eo: Kirgizio
+    es: Kirguistán
+    et: Kõrgõzstan
+    eu: Kirgizistan
+    fa: قرقیزستان
+    fi: Kirgisia
+    fr: Kirghizistan
+    fy: Kirgyzje
+    ga: An Chirgeastáin
+    gd: Cìorgastan
+    gl: Kirguizistán
+    gu: કિર્ગિસ્તાન
+    gv: Yn Chyrgistaan
+    he: קירגיזסטן
+    hi: किर्गिज़स्तान
+    hr: Kirgistan
+    ht: Kirgistan
+    hu: Kirgizisztán
+    hy: Ղրղզստան
+    ia: Kyrgyzistan
+    id: Kirgizstan
+    ie: Kirgizistan
+    io: Kirgizistan
+    is: Kirgisistan
+    it: Kirghizistan
+    ja: キルギス
+    jv: Kirgizstan
+    ka: ყირგიზეთი
+    kk: Қырғызстан
+    km: កៀហ៊្សីស៊ីស្ថាន
+    kn: ಕಿರ್ಗಿಸ್ಥಾನ್
+    ko: 키르기스스탄
+    ks: کرغیزستان
+    ku: Qirgizistan
+    kv: Кыргызстан
+    kw: Pow Kyrgys
+    ky: Кыргызстан
+    la: Chirgisia
+    lb: Kirgisistan
+    li: Kirgizië
+    ln: Kirghizistáni
+    lt: Kirgizija
+    lv: Kirgizstāna
+    mk: Киргистан
+    ml: കിർഗ്ഗിസ്ഥാൻ
+    mn: Кыргызстан
+    mr: किर्गिझस्तान
+    ms: Kyrgyzstan
+    my: ကာဂျစ္စတန်နိုင်ငံ
+    na: Kirgitan
+    nl: Kirgizië
+    nn: Kirgisistan
+    "no": Kirgisistan
+    nv: Kíígiz Bikéyah
+    oc: Quirguizstan
+    or: କିରଗିଜସ୍ତାନ
+    os: Хъиргъиз
+    pa: ਕਿਰਗਿਜ਼ਸਤਾਨ
+    pl: Kirgistan
+    ps: قرغزستان
+    pt: Quirguistão
+    qu: Kirkisuyu
+    ro: Kârgâzstan
+    ru: Киргизия
+    rw: Kirigizisitani
+    sa: किरगिस्थान
+    sd: ڪِرگزِستانُ
+    se: Kirgisistan
+    sh: Kirgistan
+    sk: Kirgizsko
+    sl: Kirgizistan
+    so: Qargistan
+    sq: Kirgistani
+    sr: Киргистан
+    ss: IKhirigi
+    su: Kirgistan
+    sv: Kirgizistan
+    sw: Kirgizia
+    ta: கிர்கிசுத்தான்
+    te: కిర్గిజిస్తాన్
+    tg: Қирғизистон
+    th: ประเทศคีร์กีซสถาน
+    tk: Gyrgyzystan
+    tl: Kirgistan
+    tr: Kırgızistan
+    tt: Кыргызстан
+    ug: قىرغىزىستان
+    uk: Киргизстан
+    ur: کرغیزستان
+    uz: Qirgʻiziston
+    vi: Kyrgyzstan
+    vo: Kirgistän
+    wo: Kirgistaan
+    yi: קירגיזסטאן
+    yo: Kirgistani
+    zh: 吉尔吉斯斯坦
diff --git a/settings/country-names/kh.yaml b/settings/country-names/kh.yaml
new file mode 100644 (file)
index 0000000..5f6b2dc
--- /dev/null
@@ -0,0 +1,125 @@
+name: 
+    default: ព្រះរាជាណាចក្រ​កម្ពុជា
+    af: Kambodja
+    am: ካምቦዲያ
+    an: Cambocha
+    ar: كمبوديا
+    az: Kamboca
+    ba: Камбоджа
+    be: Камбоджа
+    bg: Камбоджа
+    bn: কম্বোডিয়া
+    bo: ཁམ་པོ་ཛ།
+    br: Kambodja
+    bs: Kambodža
+    ca: Cambodja
+    ce: Камбоджа
+    cs: Kambodža
+    cv: Камбоджа
+    cy: Cambodia
+    da: Cambodja
+    de: Kambodscha
+    dv: ކެންބޯޑިއާ
+    dz: ཀམ་བོ་ཌི་ཡ་
+    el: Καμπότζη
+    en: Cambodia
+    eo: Kamboĝo
+    es: Camboya
+    et: Kambodža
+    eu: Kanbodia
+    fa: کامبوج
+    fi: Kambodža
+    fo: Kambodja
+    fr: Cambodge
+    fy: Kambodja
+    ga: An Chambóid
+    gd: Cambuidea
+    gl: Camboxa
+    gn: Kamboja
+    gu: કમ્બોડીયા
+    gv: Yn Chamboyd
+    ha: Kambodiya
+    he: קמבודיה
+    hi: कम्बोडिया
+    hr: Kambodža
+    ht: Kanbòdj
+    hu: Kambodzsa
+    hy: Կամբոջա
+    ia: Cambodgia
+    id: Kamboja
+    ie: Cambodja
+    io: Kambodja
+    is: Kambódía
+    it: Cambogia
+    ja: カンボジア
+    jv: Kamboja
+    ka: კამბოჯა
+    kk: Камбоджа
+    km: ព្រះរាជាណាចក្រកម្ពុជា
+    kn: ಕಾಂಬೋಡಿಯ
+    ko: 캄보디아
+    ku: Kamboca
+    kv: Камбоджа
+    kw: Kamboji
+    la: Cambosia
+    lb: Kambodscha
+    li: Cambodja
+    ln: Kamboji
+    lo: ປະເທດກຳປູເຈຍ
+    lt: Kambodža
+    lv: Kambodža
+    mg: Kambodia
+    mi: Kamapōtia
+    mk: Камбоџа
+    ml: കംബോഡിയ
+    mn: Камбож
+    mr: कंबोडिया
+    ms: Kemboja
+    mt: Kambodja
+    my: ကမ္ဘောဒီးယားနိုင်ငံ
+    na: Kambodja
+    nl: Cambodja
+    nn: Kambodsja
+    "no": Kambodsja
+    oc: Cambòtja
+    or: କମ୍ବୋଡ଼ିଆ
+    os: Камбоджæ
+    pa: ਕੰਬੋਡੀਆ
+    pl: Kambodża
+    ps: کمبودیا
+    pt: Camboja
+    qu: Kambuya
+    rm: Cambodscha
+    ro: Cambodgia
+    ru: Камбоджа
+    rw: Kambodiya
+    se: Kambodja
+    sh: Kambodža
+    si: කාම්බෝජය
+    sk: Kambodža
+    sl: Kambodža
+    so: Kambodiya
+    sq: Kamboxhia
+    sr: Камбоџа
+    ss: IKhambodiya
+    su: Kamboja
+    sv: Kambodja
+    sw: Kamboja
+    ta: கம்போடியா
+    te: కంబోడియా
+    tg: Камбоҷа
+    th: ประเทศกัมพูชา
+    tk: Kamboçiýa
+    tl: Kamboya
+    tr: Kamboçya
+    tt: Камбоҗа
+    ug: كامبوجا
+    uk: Камбоджа
+    ur: کمبوڈیا
+    uz: Kambodja
+    vi: Campuchia
+    vo: Kambocän
+    wo: Kamboodi
+    yi: קאמבאדיע
+    yo: Kàmbódíà
+    zh: 柬埔寨
diff --git a/settings/country-names/ki.yaml b/settings/country-names/ki.yaml
new file mode 100644 (file)
index 0000000..2f64e81
--- /dev/null
@@ -0,0 +1,27 @@
+name: 
+    default: Kiribati
+    ar: كيريباس
+    be: Кірыбаці
+    br: Kiribati
+    da: Kiribati
+    el: Κιριμπάτι
+    en: Kiribati
+    eo: Kiribato
+    fa: کیریباتی
+    fi: Kiribati
+    fr: Kiribati
+    fy: Kiribaty
+    ga: Cireabaití
+    he: קיריבטי
+    hu: Kiribati
+    is: Kíribatí
+    li: Kiribati-eilen
+    lt: Kiribatis
+    lv: Kiribati
+    mn: Кирибати
+    pl: Kiribati
+    ru: Кирибати
+    sv: Kiribati
+    th: ประเทศคิริบาส
+    uk: Кірибаті
+    zh: 基里巴斯
diff --git a/settings/country-names/km.yaml b/settings/country-names/km.yaml
new file mode 100644 (file)
index 0000000..406569c
--- /dev/null
@@ -0,0 +1,56 @@
+name: 
+    default: Comores Komori جزر القمر
+    af: Komore
+    ar: جزر القمر
+    br: Komorez
+    ca: Comores
+    cs: Komory
+    cy: Comoros
+    da: Comorerne
+    de: Komoren
+    el: Κομόρες
+    en: Comoros
+    eo: Komoroj
+    es: Comoras
+    et: Komoorid
+    eu: Komoreak
+    fa: اتحاد قمر
+    fi: Komorit
+    fr: Comores
+    fy: de Komoaren
+    ga: Oileáin Chomóra
+    gd: Comòras
+    he: קומורו
+    hr: Komori
+    hu: Comore-szigetek
+    ia: Comoros
+    id: Komoro
+    io: Komori
+    is: Kómoreyjar
+    it: Comore
+    ja: コモロ
+    la: Insulae Comorianae
+    lb: Komoren
+    lt: Komorai
+    lv: Komoru salas
+    mk: Комори
+    mn: Коморын арлууд
+    nl: Comoren
+    pl: Komory
+    ps: قمرټاپوګان
+    pt: Comores
+    ru: Коморские острова
+    se: Komorosullot
+    sk: Komory
+    sl: Komori
+    sr: Комори
+    sv: Komorerna
+    ta: கொமொரோசு
+    th: ประเทศคอโมโรส
+    tr: Komorlar
+    ug: كومور ئاراللىرى
+    uk: Коморські Острови
+    ur: اتحاد القمری
+    vi: Comoros
+    vo: Komoruäns
+    zh: 科摩洛
diff --git a/settings/country-names/kn.yaml b/settings/country-names/kn.yaml
new file mode 100644 (file)
index 0000000..c7329a6
--- /dev/null
@@ -0,0 +1,49 @@
+name: 
+    default: Saint Kitts and Nevis
+    af: Sint Kitts en Nevis
+    ar: سانت كيتس ونيفس
+    be: Святы Кітс і Невіс
+    br: Saint Kitts-ha-Nevis
+    ca: Saint Kitts i Nevis
+    cs: Svatý Kryštof a Nevis
+    cy: Saint Kitts a Nevis
+    da: Saint Kitts og Nevis
+    de: St. Kitts und Nevis
+    el: Άγιος Χριστόφορος και Νέβις
+    en: Saint Kitts and Nevis
+    eo: Sankta Kristoforo kaj Neviso
+    es: San Cristóbal y Nieves
+    et: Saint Kitts ja Nevis
+    fa: سنت کیتس و نویس
+    fi: Saint Kitts ja Nevis
+    fr: Saint-Christophe-et-Niévès
+    fy: Sint Kitts en Nevis
+    ga: San Críostóir-Nimheas
+    gd: Naomh Crìstean agus Nibheis
+    he: סנט קיטס ונוויס
+    hr: Sveti Kristofor i Nevis
+    hu: Saint Kitts és Nevis
+    ia: Sancte Christophoro e Nevis
+    id: Saint Kitts dan Nevis
+    io: Santa Kitts e Nevis
+    is: Sankti Kristófer og Nevis
+    it: Saint Kitts e Nevis
+    lb: Saint Kitts a Nevis
+    li: Saint-Kitts
+    lt: Sent Kitsas ir Nevis
+    mk: Свети Кристифер и Невис
+    mn: Сент-Киттс ба Невис
+    nl: Saint Kitts en Nevis
+    pl: Saint Kitts i Nevis
+    pt: São Cristóvão e Nevis
+    ru: Сент-Китс и Невис
+    se: Saint Kitts ja Nevis
+    sl: Sveti Krištof in Nevis
+    sv: Saint Kitts och Nevis
+    ta: செயிண்ட் கிட்சும் நெவிசும்
+    th: ประเทศเซนต์คิตส์และเนวิส
+    tr: Saint Kitts ve Nevis
+    uk: Сент-Кіттс і Невіс
+    vi: Saint Kitts và Nevis
+    vo: Sankiteän e Neviseän
+    zh: 圣基茨和尼维斯
diff --git a/settings/country-names/kp.yaml b/settings/country-names/kp.yaml
new file mode 100644 (file)
index 0000000..a46a66a
--- /dev/null
@@ -0,0 +1,141 @@
+name: 
+    default: 조선민주주의인민공화국
+    af: Noord-Korea
+    am: ስሜን ኮርያ
+    an: Coreya d'o Norte
+    ar: كوريا الشمالية
+    as: উত্তৰ কোৰিয়া
+    az: Koreya Xalq Demokratik Respublikası
+    ba: Корея Халыҡ-Демократик Республикаһы
+    be: Карэйская Народна-Дэмакратычная Рэспубліка
+    bg: Северна Корея
+    bh: उत्तर कोरिया
+    bn: উত্তর কোরিয়া
+    bo: བྱང་ཀོ་རི་ཡ།
+    br: Republik Poblel ha Demokratel Korea
+    bs: Sjeverna Koreja
+    ca: Corea del Nord
+    ce: Корейн Халкъан-Демократин Республика
+    cs: Severní Korea
+    cy: Gogledd Corea
+    da: Nordkorea
+    de: Nordkorea
+    dv: އުތުރު ކޮރެއާ
+    dz: བྱང་ཀོ་རི་ཡ་
+    ee: North Korea
+    el: Βόρεια Κορέα
+    en: North Korea
+    eo: Nord-Koreio
+    es: Corea del Norte
+    et: Põhja-Korea
+    eu: Ipar Korea
+    fa: کره شمالی
+    fi: Pohjois-Korea
+    fo: Norðurkorea
+    fr: Corée du Nord
+    fy: Noard-Koreä
+    ga: An Chóiré Thuaidh
+    gd: Coirèa a Tuath
+    gl: Corea do Norte
+    gn: Yvate Koréa
+    gu: ઉત્તર કોરિયા
+    gv: Yn Chorea Twoaie
+    ha: Koriya ta Arewa
+    he: קוריאה הצפונית
+    hi: उत्तर कोरिया
+    hr: Sjeverna Koreja
+    ht: Kore dinò
+    hu: Koreai Népi Demokratikus Köztársaság (Észak-Korea)
+    hy: Կորեայի Ժողովրդա-Դեմոկրատական Հանրապետություն
+    ia: Corea del Nord
+    id: Korea Utara
+    ie: Nord-Korea
+    ik: Nigiq Korea
+    io: Nord-Korea
+    is: Norður-Kórea
+    it: Corea del Nord
+    ja: 朝鮮民主主義人民共和国
+    jv: Koréa Lor
+    ka: კორეის სახალხო დემოკრატიული რესპუბლიკა
+    kg: Hangu ya Node
+    ki: North Korea
+    kk: Корей Халық Демократиялық Республикасы
+    kl: Korea Avannarleq
+    km: កូរ៉េខាងជើង
+    kn: ಉತ್ತರ ಕೊರಿಯಾ
+    ko: 조선민주주의인민공화국
+    ku: Korêya Bakur
+    kv: Корея Войтыр Демократия Республика
+    kw: Korea Gledh
+    ky: Корей Эл-Демократиялык Республикасы
+    la: Res publica popularis democratica Coreana
+    lb: Demokratesch Volleksrepublik Korea
+    li: Noord-Korea
+    ln: Koré ya Nola
+    lo: ປະເທດເກົາຫຼີເໜືອ
+    lt: Šiaurės Korėja
+    lv: Ziemeļkoreja
+    mg: Korea Avaratra
+    mi: Kōrea-ki-te-raki
+    mk: Демократска Народна Република Кореја
+    ml: ഉത്തര കൊറിയ
+    mn: Умард Солонгос
+    mr: उत्तर कोरिया
+    ms: Korea Utara
+    mt: Korea ta' Fuq
+    my: ကိုရီးယား ဒီမိုကရက်တစ် ပြည်သူ့သမ္မတနိုင်ငံ
+    na: Ripubrikit Engame Korea
+    ne: उत्तर कोरिया
+    nl: Noord-Korea
+    nn: Nord-Korea
+    "no": Nord-Korea
+    nv: Kolíya Bikéyah Náhookǫsjí Siʼánígíí
+    oc: Corèa del Nòrd
+    om: Kooriyaa Kaabaa
+    or: ପୂର୍ବ କୋରିଆ
+    os: Корейы Адæмон Демократон Республикæ
+    pa: ਉੱਤਰੀ ਕੋਰੀਆ
+    pl: Korea Północna
+    ps: شمالي کوريا
+    pt: Coreia do Norte
+    qu: Chusun Runakapaq Runallaqta Republika
+    ro: Coreea de Nord
+    ru: Северная Корея
+    rw: Koreya y’Amajyaruguru
+    sa: उत्तर कोरिया
+    sc: Corea de su Norte
+    sd: اتر ڪوريا
+    se: Davvi-Korea
+    sh: Demokratska Narodna Republika Koreja
+    si: උතුරු කොරියාව
+    sk: Kórejská ľudovodemokratická republika
+    sl: Severna Koreja
+    sn: North Korea
+    so: Waqooyiga Kuuriya
+    sq: Koreja e Veriut
+    sr: Северна Кореја
+    ss: IKhoriya leseNyakatfo
+    su: Koréa Kalér
+    sv: Nordkorea
+    sw: Korea Kaskazini
+    ta: வட கொரியா
+    te: ఉత్తర కొరియా
+    tg: Кореяи Шимолӣ
+    th: ประเทศเกาหลีเหนือ
+    tk: Demirgazyk Koreýa
+    tl: Hilagang Korea
+    tr: Kuzey Kore
+    ts: North Korea
+    tt: Корея Халык Демократик Җөмһүрияте
+    ug: شىمالىي چاۋشيەن
+    uk: Корейська Народно-Демократична Республіка
+    ur: شمالی کوریا
+    uz: Koreya Xalq Demokratik Respublikasi
+    vi: Bắc Triều Tiên
+    vo: Nolüda-Koreyän
+    wo: Kore gu Bëj-gànnaar
+    xh: Coreia do Twoaie
+    yi: צפון קארעע
+    yo: Kòréà Àríwá
+    za: Cauzsenh Minzcujcujyi Yinzminz Gunghozgoz
+    zh: 朝鲜民主主义人民共和国
diff --git a/settings/country-names/kr.yaml b/settings/country-names/kr.yaml
new file mode 100644 (file)
index 0000000..6954697
--- /dev/null
@@ -0,0 +1,137 @@
+name: 
+    default: 대한민국
+    af: Suid-Korea
+    ak: Anaafo Koria
+    am: ደቡብ ኮርያ
+    an: Corea d'o Sur
+    ar: كوريا الجنوبية
+    as: দক্ষিণ কোৰিয়া
+    az: Cənubi Koreya
+    ba: Көньяҡ Корея
+    be: Паўднёвая Карэя
+    bg: Южна Корея
+    bi: Saot Koria
+    bn: দক্ষিণ কোরিয়া
+    bo: ལྷོ་ཀོ་རི་ཡ།
+    br: Korea ar Su
+    bs: Južna Koreja
+    ca: Corea del Sud
+    ce: Къилба Корей
+    cs: Jižní Korea
+    cy: De Corea
+    da: Sydkorea
+    de: Südkorea
+    dv: ދެކުނު ކޮރެއާ
+    dz: ལྷོ་ཀོ་རི་ཡ་
+    ee: South Korea
+    el: Νότια Κορέα
+    en: South Korea
+    eo: Sud-Koreio
+    es: Corea del Sur
+    et: Lõuna-Korea
+    eu: Hego Korea
+    fa: کره جنوبی
+    fi: Etelä-Korea
+    fo: Suðurkorea
+    fr: Corée du Sud
+    fy: Súd-Korea
+    ga: An Chóiré Theas
+    gd: Coirea a Deas
+    gl: Corea do Sur
+    gn: Yvykorea
+    gu: દક્ષિણ કોરિયા
+    gv: Yn Chorea Yiass
+    he: קוריאה הדרומית
+    hi: दक्षिण कोरिया
+    hr: Južna Koreja
+    ht: Kore disid
+    hu: Dél-Korea
+    hy: Հարավային Կորեա
+    ia: Corea del Sud
+    id: Korea Selatan
+    ie: Sud-Korea
+    io: Sud-Korea
+    is: Suður-Kórea
+    it: Corea del Sud
+    ja: 大韓民国
+    jv: Koréa Kidul
+    ka: სამხრეთი კორეა
+    ki: South Korea
+    kk: Оңтүстік Корея
+    kl: Korea Kujalleq
+    km: កូរ៉េខាងត្បូង
+    kn: ದಕ್ಷಿಣ ಕೊರಿಯಾ
+    ko: 대한민국
+    ks: दक्षिण कोरिया
+    ku: Korêya Başûr
+    kv: Корея Республика
+    kw: Korea Dhyhow
+    ky: Корея Республикасы
+    la: Corea Meridionalis
+    lb: Südkorea
+    li: Zuud-Korea
+    ln: Kore ya Sidi
+    lo: ປະເທດເກົາຫຼີໃຕ້
+    lt: Pietų Korėja
+    lv: Dienvidkoreja
+    mg: Korea Atsimo
+    mi: Kōrea-ki-te-tonga
+    mk: Република Кореја
+    ml: ദക്ഷിണ കൊറിയ
+    mn: Өмнөд Солонгос
+    mr: दक्षिण कोरिया
+    ms: Korea Selatan
+    mt: Korea t'Isfel
+    my: တောင်ကိုရီးယားနိုင်ငံ
+    na: Ripubrikin Korea
+    ne: दक्षिण कोरिया
+    nl: Zuid-Korea
+    nn: Sør-Korea
+    "no": Sør-Korea
+    nv: Kolíya Bikéyah Shádiʼááhjí Siʼánígíí
+    oc: Corèa del Sud
+    or: ଦକ୍ଷିଣ କୋରିଆ
+    os: Хуссар Корей
+    pl: Korea Południowa
+    ps: سوېلي کوريا
+    pt: Coreia do Sul
+    qu: Urin Kuriya
+    rm: Corea dal sid
+    ro: Coreea de Sud
+    ru: Республика Корея
+    rw: Koreya y’Amajyepfo
+    sa: दक्षिण कोरिया
+    sc: Corea de su Sud
+    se: Lulli-Korea
+    sg: Korëe tî Mbongo
+    sh: Južna Koreja
+    si: දකුණු කොරියාව
+    sk: Južná Kórea
+    sl: Južna Koreja
+    sm: Kolea i Saute
+    sn: Korea, South
+    so: Koonfur Kuuriya
+    sq: Koreja e Jugut
+    sr: Јужна Кореја
+    ss: IKhoriya leseNingizimu
+    su: Koréa Kidul
+    sv: Sydkorea
+    sw: Korea Kusini
+    ta: தென்கொரியா
+    te: దక్షిణ కొరియా
+    th: ประเทศเกาหลีใต้
+    tk: Günorta Koreýa
+    tl: Timog Korea
+    tr: Güney Kore
+    tt: Көньяк Корея
+    ug: جەنۇبىي چاۋشيەن
+    uk: Південна Корея
+    ur: جنوبی کوریا
+    uz: Janubiy Koreya
+    vi: Hàn Quốc
+    vo: Sulüda-Koreyän
+    wo: Kore gu Bëj-saalum
+    yi: דרום קארעע
+    yo: Kòréà Gúúsù
+    za: Hanzgoz
+    zh: 韩国/南韓
diff --git a/settings/country-names/kw.yaml b/settings/country-names/kw.yaml
new file mode 100644 (file)
index 0000000..c6541db
--- /dev/null
@@ -0,0 +1,120 @@
+name: 
+    default: الكويت
+    af: Koeweit
+    am: ኩዌት
+    an: Kuwait
+    ar: الكويت
+    az: Küveyt
+    ba: Күвейт
+    be: Кувейт
+    bg: Кувейт
+    bn: কুয়েত
+    bo: ཁུ་ཝི་ཐི།
+    br: Koweit
+    bs: Kuvajt
+    ca: Kuwait
+    ce: Кувейт
+    cs: Kuvajt
+    cv: Кувейт
+    cy: Kuwait
+    da: Kuwait
+    de: Kuwait
+    dv: ކުވެއިތު
+    dz: ཀུ་ཝེཊ་
+    el: Κουβέιτ
+    en: Kuwait
+    eo: Kuvajto
+    es: Kuwait
+    et: Kuveit
+    eu: Kuwait
+    fa: کویت
+    fi: Kuwait
+    fo: Kuveit
+    fr: Koweït
+    fy: Koeweit
+    ga: Cuáit
+    gd: Cubhait
+    gl: Kuwait
+    gu: કુવૈત
+    gv: Yn Choowait
+    he: כווית
+    hi: कुवैत
+    hr: Kuvajt
+    ht: Kowet
+    hu: Kuvait
+    hy: Քուվեյթ
+    ia: Kuwait
+    id: Kuwait
+    ie: Kuwait
+    io: Kuwait
+    is: Kúveit
+    it: Kuwait
+    ja: クウェート
+    jv: Kuwait
+    ka: ქუვეითი
+    kk: Кувейт
+    kl: Kuwait
+    km: គុយវ៉ែត
+    kn: ಕುವೈತ್
+    ko: 쿠웨이트
+    ku: Kuweyt
+    kv: Кувейт
+    kw: Koweyt
+    la: Cuvaitum
+    lb: Kuwait
+    li: Koeweit
+    ln: Koweit
+    lt: Kuveitas
+    lv: Kuveita
+    mk: Кувајт
+    ml: കുവൈറ്റ്
+    mn: Кувейт
+    mr: कुवेत
+    ms: Kuwait
+    my: ကူဝိတ်နိုင်ငံ
+    na: Kuwait
+    ne: कुवेत
+    nl: Koeweit
+    nn: Kuwait
+    "no": Kuwait
+    nv: Kóóweiʼ
+    oc: Kowait
+    or: କୁଏତ
+    os: Кувейт
+    pl: Kuwejt
+    ps: کوېټ
+    pt: Kuwait
+    qu: Kuwait
+    ro: Kuweit
+    ru: Кувейт
+    rw: Koweti
+    sa: कुवैत
+    se: Kuwait
+    sh: Kuvajt
+    sk: Kuvajt
+    sl: Kuvajt
+    so: Kuwayt
+    sq: Kuvajti
+    sr: Кувајт
+    ss: IKhuwathi
+    su: Kuwait
+    sv: Kuwait
+    sw: Kuwait
+    ta: குவைத்
+    te: కువైట్
+    tg: Кувайт
+    th: ประเทศคูเวต
+    tk: Kuweýt
+    tl: Kuwait
+    tr: Kuveyt
+    tt: Күвәйт
+    ug: كۇۋەيت
+    uk: Кувейт
+    ur: کویت
+    uz: Quvayt
+    vi: Kuwait
+    vo: Kovätän
+    wo: Kowet
+    yi: קואווייט
+    yo: Kuwaiti
+    zh: 科威特
diff --git a/settings/country-names/ky.yaml b/settings/country-names/ky.yaml
new file mode 100644 (file)
index 0000000..0a2fbe3
--- /dev/null
@@ -0,0 +1,101 @@
+name: 
+    default: Cayman Islands
+    af: Kaaimanseilande
+    ak: Kemanfo Islands
+    am: ካይማን ደሴቶች
+    ar: جزر الكايمان
+    az: Kayman Adaları
+    be: Кайманавы астравы
+    bg: Кайманови острови
+    bm: Bama Gun
+    bn: কেম্যান দ্বীপপুঞ্জ
+    bo: ཁེ་མེན་གླིང་ཕྲན།
+    br: Inizi Cayman
+    bs: Kajmanska Ostrva
+    ca: Illes Caiman
+    cs: Kajmanské ostrovy
+    cy: Ynysoedd Cayman
+    da: Caymanøerne
+    de: Kaimaninseln
+    dz: ཁེ་མེན་གླིང་ཚོམ
+    ee: Kayman ƒudomekpowo nutome
+    el: Νήσοι Κέιμαν
+    en: Cayman Islands
+    eo: Kajmana Insularo
+    es: Islas Caimán
+    et: Kaimanisaared
+    eu: Kaiman Uharteak
+    fa: جزایر کایمان
+    ff: Duuɗe Kaymaa
+    fi: Caymansaaret
+    fo: Caymanoyggjarnar
+    fr: Îles Caïmans
+    fy: de Kaaimaneilannen
+    ga: Oileáin Cayman
+    gd: Na h-Eileanan Caimean
+    gl: Illas Caimán
+    gu: કેયમેન આઇલૅંડ્સ
+    gv: Ellanyn Cayman
+    ha: Tsibiran Kaiman
+    he: איי קיימן
+    hi: केमैन द्वीपसमूह
+    hr: Kajmanski Otoci
+    hu: Kajmán-szigetek
+    ia: Insulas de Caiman
+    id: Kepulauan Cayman
+    io: Insuli Kaiman
+    is: Caymaneyjar
+    it: Isole Cayman
+    ja: ケイマン諸島
+    ka: კაიმანის კუნძულები
+    ki: Visiwa vya Kayman
+    km: កោះ​កៃម៉ង់
+    kn: ಕೇಮನ್ ದ್ವೀಪಗಳು
+    ko: 케이맨제도
+    ks: کیمَن جٔزیٖرٕ
+    ku: Giravên Caymanê
+    lb: Kaimaninselen
+    lg: Bizinga ebya Kayimaani
+    ln: Bisanga bya Kayíma
+    lo: ຄາຍແມນ ອິດແລນ
+    lt: Kaimanų salos
+    lv: Kaimanu salas
+    mg: Nosy Kayman
+    mk: Кајмански Острови
+    ml: കേയ്മാൻ ദ്വീപുകൾ
+    mn: Кайманы Арлууд
+    mr: केमन बेटे
+    mt: Gżejjer Kajmani
+    my: ကေမန် ကျွန်းစု
+    ne: केयमान टापु
+    nl: Kaaimaneilanden
+    nn: Caymanøyane
+    "no": Caymanøyene
+    or: କେମ୍ୟାନ୍ ଦ୍ବୀପପୁଞ୍ଜ
+    pl: Kajmany
+    pt: Ilhas Cayman
+    rm: Inslas Cayman
+    rn: Ibirwa bya Keyimani
+    ro: Insulele Cayman
+    ru: Острова Кайман
+    se: Cayman-sullot
+    sg: Âzûâ Ngundë, Kaimäni
+    si: කේමන් දූපත්
+    sk: Kajmanie ostrovy
+    sl: Kajmanski otoki
+    sn: Zvitsuwa zveCayman
+    sr: Кајманска Острва
+    sv: Caymanöarna
+    sw: Visiwa vya Kayman
+    ta: கேமென் தீவுகள்
+    te: కేమాన్ దీవులు
+    th: หมู่เกาะเคย์แมน
+    ti: ካይማን ደሴቶች
+    to: ʻOtumotu Keimeni
+    tr: Kayman Adaları
+    uk: Кайманові острови
+    ur: کیمین آئلینڈز
+    vi: Quần đảo Cayman
+    yo: Orílẹ́ède Etíokun Kámánì
+    zh: 开曼群岛
+    zu: i-Cayman Islands
diff --git a/settings/country-names/kz.yaml b/settings/country-names/kz.yaml
new file mode 100644 (file)
index 0000000..7440058
--- /dev/null
@@ -0,0 +1,133 @@
+name: 
+    default: Қазақстан
+    ab: Ҟазаҟсҭан
+    af: Kasakstan
+    am: ካዛክስታን
+    an: Cazaquistán
+    ar: كازاخستان
+    av: Хъазахъистан
+    az: Qazaxıstan
+    ba: Ҡаҙағстан
+    be: Казахстан
+    bg: Казахстан
+    bi: Kazakhstan
+    bn: কাজাখস্তান
+    bo: ཀཛ་ཀིསུ་གཏན།
+    br: Kazakstan
+    bs: Kazahstan
+    ca: Kazakhstan
+    ce: Кхазакхстан
+    cs: Kazachstán
+    cu: Каꙁахстанъ
+    cv: Казахстан
+    cy: Kazakstan
+    da: Kasakhstan
+    de: Kasachstan
+    dv: ކަޒަކިސްތާން
+    ee: Kazakhstan
+    el: Καζακστάν
+    en: Kazakhstan
+    eo: Kazaĥio
+    es: Kazajistán
+    et: Kasahstan
+    eu: Kazakhstan
+    fa: قزاقستان
+    fi: Kazakstan
+    fo: Kasakstan
+    fr: Kazakhstan
+    fy: Kazakstan
+    ga: An Chasacstáin
+    gd: Casachstàn
+    gl: Casaquistán
+    gn: Kazajistán
+    gu: કઝાકિસ્તાન
+    gv: Yn Chassaghstaan
+    he: קזחסטן
+    hi: कज़ाख़िस्तान
+    hr: Kazahstan
+    ht: Kazakstan
+    hu: Kazahsztán
+    hy: Ղազախստան
+    ia: Kazakhstan
+    id: Kazakhstan
+    ie: Kazakstan
+    io: Kazakstan
+    is: Kasakstan
+    it: Kazakistan
+    ja: カザフスタン
+    jv: Kazakhstan
+    ka: ყაზახეთი
+    kg: Kazakhstan
+    kk: Қазақстан
+    kl: Kasakhstani
+    km: កាសាក់ស្ថាន
+    kn: ಕಜಾಕಸ್ಥಾನ್
+    ko: 카자흐스탄
+    ku: Qazaxistan
+    kv: Казахстан
+    kw: Pow Kazagh
+    ky: Казакстан Республикасы
+    la: Kazachstania
+    lb: Kasachstan
+    li: Kazachstan
+    ln: Kazakstáni
+    lt: Kazachstanas
+    lv: Kazahstāna
+    mg: Kazakstàna
+    mi: Katatānga
+    mk: Казахстан
+    ml: ഖസാഖ്സ്ഥാൻ
+    mn: Казахстан
+    mr: कझाकस्तान
+    ms: Kazakhstan
+    mt: Każakistan
+    my: ကာဇက်စတန်နိုင်ငံ
+    na: Kadaketan
+    nl: Kazachstan
+    nn: Kasakhstan
+    "no": Kasakhstan
+    nv: Kʼazah Bikéyah
+    oc: Cazacstan
+    or: କାଜାଖସ୍ତାନ
+    os: Хъазахстан
+    pa: ਕਜਾਖਸਤਾਨ
+    pl: Kazachstan
+    ps: قزاقستان
+    pt: Cazaquistão
+    qu: Qasaqsuyu
+    rm: Kasachstan
+    ro: Kazahstan
+    ru: Казахстан
+    rw: Kazakisitani
+    sa: कजाकस्थान
+    se: Kazakstan
+    sh: Kazahstan
+    si: කසක්ස්තානය
+    sk: Kazachstan
+    sl: Kazahstan
+    so: Kasakhstan
+    sq: Kazakistani
+    sr: Казахстан
+    ss: IKhazakhi
+    su: Kazastan
+    sv: Kazakhstan
+    sw: Kazakhstan
+    ta: கசக்ஸ்தான்
+    te: కజకస్తాన్
+    tg: Қазоқистон
+    th: ประเทศคาซัคสถาน
+    tk: Gazagystan
+    tl: Kazakhstan
+    tr: Kazakistan
+    tt: Казакъстан
+    ug: قازاقىستان
+    uk: Казахстан
+    ur: قازقستان
+    uz: Qozogʻiston
+    vi: Kazakhstan
+    vo: Kazakistän
+    wo: Kasakistaan
+    yi: קאזאכסטאן
+    yo: Kàsàkstán
+    za: Hahsazgwswhdanj
+    zh: 哈萨克斯坦/哈薩克
diff --git a/settings/country-names/la.yaml b/settings/country-names/la.yaml
new file mode 100644 (file)
index 0000000..2ea1dbe
--- /dev/null
@@ -0,0 +1,123 @@
+name: 
+    default: ປະເທດລາວ
+    af: Laos
+    am: ላዎስ
+    an: Laos
+    ar: لاوس
+    az: Laos
+    ba: Лаос
+    be: Лаос
+    bg: Лаос
+    bi: Laos
+    bn: লাওস
+    bo: ལའོ་སུ།
+    br: Laos
+    bs: Laos
+    ca: Laos
+    ce: Лаос
+    cs: Laos
+    cv: Лаос
+    cy: Laos
+    da: Laos
+    de: Laos
+    dv: ލާއޯސް
+    el: Λάος
+    en: Laos
+    eo: Laoso
+    es: Laos
+    et: Laos
+    eu: Laos
+    fa: لائوس
+    fi: Laos
+    fo: Laos
+    fr: Laos
+    fy: Laos
+    ga: Laos
+    gd: Làthos
+    gl: Laos
+    gu: લાઓસ
+    gv: Yn Laos
+    he: לאוס
+    hi: लाओस
+    hr: Laos
+    ht: Laos
+    hu: Laosz
+    hy: Լաոս
+    ia: Laos
+    id: Laos
+    ie: Laos
+    io: Laos
+    is: Laos
+    it: Laos
+    ja: ラオス
+    jv: Laos
+    ka: ლაოსი
+    ki: Laos
+    kk: Лаос
+    km: ឡាវ
+    kn: ಲಾವೋಸ್
+    ko: 라오스
+    ku: Laos
+    kv: Лаос
+    kw: Pow Lao
+    la: Laotia
+    lb: Laos
+    li: Laos
+    ln: Laos
+    lo: ປະເທດລາວ
+    lt: Laosas
+    lv: Laosa
+    mi: Rāoho
+    mk: Лаос
+    ml: ലാവോസ്
+    mn: Лаос
+    mr: लाओस
+    ms: Laos
+    my: လာအိုနိုင်ငံ
+    na: Raot
+    nl: Laos
+    nn: Laos
+    "no": Laos
+    nv: Lááʼos
+    oc: Laos
+    or: ଲାଓସ
+    os: Лаос
+    pa: ਲਾਓਸ
+    pl: Laos
+    ps: لاووس
+    pt: Laos
+    qu: Law suyu
+    ro: Laos
+    ru: Лаос
+    rw: Lawosi
+    sa: लाओस
+    se: Laos
+    sh: Laos
+    si: ලාඕසය
+    sk: Laos
+    sl: Laos
+    so: Laos
+    sq: Laosi
+    sr: Лаос
+    ss: ILawoso
+    su: Laos
+    sv: Laos
+    sw: Laos
+    ta: லாவோஸ்
+    te: లావోస్
+    tg: Лаос
+    th: ประเทศลาว
+    tk: Laos
+    tl: Laos
+    tr: Laos
+    tt: Лаос
+    ug: لائوس
+    uk: Лаос
+    ur: لاؤس
+    uz: Laos
+    vi: Lào
+    vo: Laosän
+    wo: Réewum Lawos
+    yo: Láọ̀s
+    za: Lao
+    zh: 老挝/寮國
diff --git a/settings/country-names/lb.yaml b/settings/country-names/lb.yaml
new file mode 100644 (file)
index 0000000..2c65bd6
--- /dev/null
@@ -0,0 +1,124 @@
+name: 
+    default: لبنان
+    af: Libanon
+    am: ሊባኖስ
+    an: Liban
+    ar: لبنان
+    az: Livan
+    ba: Ливан
+    be: Ліван
+    bg: Ливан
+    bm: Lubenan
+    bn: লেবানন
+    bo: ལེ་པ་ནོན།
+    br: Liban
+    bs: Liban
+    ca: Líban
+    ce: Ливан
+    cs: Libanon
+    cv: Ливан
+    cy: Libanus
+    da: Libanon
+    de: Libanon
+    dv: ލުބުނާން
+    dz: ལེ་བཱ་ནཱོན་
+    el: Λίβανος
+    en: Lebanon
+    eo: Libano
+    es: Líbano
+    et: Liibanon
+    eu: Libano
+    fa: لبنان
+    fi: Libanon
+    fo: Libanon
+    fr: Liban
+    fy: Libanon
+    ga: An Liobáin
+    gd: Leabanon
+    gl: Líbano
+    gn: Lívano
+    gu: લેબેનાન
+    gv: Yn Livaan
+    he: לבנון
+    hi: लेबनान
+    hr: Libanon
+    ht: Liban
+    hu: Libanon
+    hy: Լիբանան
+    ia: Libano
+    id: Lebanon
+    ie: Libano
+    io: Libano
+    is: Líbanon
+    it: Libano
+    ja: レバノン
+    jv: Libanon
+    ka: ლიბანი
+    kk: Ливан
+    kl: Lebanon
+    km: លីបង់
+    ko: 레바논
+    ku: Libnan
+    kv: Ливан
+    kw: Lebnon
+    ky: Ливан
+    la: Libanus
+    lb: Libanon
+    li: Libanon
+    lt: Libanas
+    lv: Libāna
+    mi: Repanona
+    mk: Либан
+    ml: ലെബനാൻ
+    mn: Ливан
+    mr: लेबेनॉन
+    ms: Lubnan
+    mt: Libanu
+    my: လက်ဘနွန်နိုင်ငံ
+    na: Ribanon
+    nb: Libanon
+    nl: Libanon
+    nn: Libanon
+    "no": Libanon
+    nv: Łíbanoo
+    oc: Liban
+    or: ଲେବନାନ
+    os: Ливан
+    pa: ਲਿਬਨਾਨ
+    pl: Liban
+    ps: لېبنان
+    pt: Líbano
+    qu: Libanu
+    ro: Liban
+    ru: Ливан
+    rw: Libani
+    sa: लेबनान
+    se: Libanon
+    sh: Libanon
+    sk: Libanon
+    sl: Libanon
+    so: Lubnaan
+    sq: Libani
+    sr: Либан
+    ss: ILibhanoni
+    su: Libanon
+    sv: Libanon
+    sw: Lebanoni
+    ta: லெபனான்
+    te: లెబనాన్
+    tg: Лубнон
+    th: ประเทศเลบานอน
+    tk: Liwan
+    tl: Libano
+    tr: Lübnan
+    tt: Ливан
+    ug: لىۋان
+    uk: Ліван
+    ur: لبنان
+    uz: Livan
+    vi: Liban
+    vo: Libanän
+    wo: Libaa
+    yi: לבנון
+    yo: Lẹ́bánọ́nì
+    zh: 黎巴嫩
diff --git a/settings/country-names/lc.yaml b/settings/country-names/lc.yaml
new file mode 100644 (file)
index 0000000..02e7d24
--- /dev/null
@@ -0,0 +1,43 @@
+name: 
+    default: Saint Lucia
+    af: Sint Lucia
+    ar: سانت لوسيا
+    be: Святая Лусія
+    br: Saint Lucia
+    cs: Svatá Lucie
+    da: Saint Lucia
+    de: St. Lucia
+    el: Αγία Λουκία
+    en: Saint Lucia
+    eo: Sankta Lucio
+    es: Santa Lucía
+    fa: سنت لوسیا
+    fi: Saint Lucia
+    fr: Sainte-Lucie
+    fy: Sint Lusia
+    ga: San Lucia
+    gd: Naomh Lùisia
+    he: סנט לוסיה
+    hr: Sveta Lucija
+    hu: Saint Lucia
+    is: Sankti Lúsía
+    it: Santa Lucia
+    ja: セントルシア
+    la: Sancta Lucia
+    li: Santa Lucia
+    lt: Sent Lusija
+    lv: Sentlūsija
+    mn: Сент Люсиа
+    nl: Saint Lucia
+    pl: Saint Lucia
+    pt: Santa Lúcia
+    ru: Сент-Люсия
+    se: Saint Lucia
+    sk: Svätá Lucia
+    sl: Sveta Lucija
+    sv: Saint Lucia
+    ta: செயிண்ட் லூசியா
+    th: ประเทศเซนต์ลูเซีย
+    uk: Сент-Люсія
+    vo: Sanlusiyän
+    zh: 圣卢西亚岛
diff --git a/settings/country-names/li.yaml b/settings/country-names/li.yaml
new file mode 100644 (file)
index 0000000..3455c3b
--- /dev/null
@@ -0,0 +1,46 @@
+name: 
+    default: Liechtenstein
+    ar: ليختنشتاين
+    be: Лiхтэнштэйн
+    br: Liechtenstein
+    bs: Lihtenštajn
+    cs: Lichtenštejnsko
+    de: Liechtenstein
+    el: Λίχτενσταϊν
+    en: Liechtenstein
+    eo: Liĥtenŝtejno
+    fa: لیختن‌اشتاین
+    fi: Liechtenstein
+    fo: Liktinstein
+    fr: Liechtenstein
+    fy: Lychtenstein
+    ga: Lichtinstéin
+    he: ליכטנשטיין
+    hr: Lihtenštajn
+    hu: Liechtenstein
+    ia: Liechtenstein
+    io: Liechtenstein
+    is: Liechtenstein
+    it: Liechtenstein
+    ja: リヒテンシュタイン
+    ku: Lînxiniştayn
+    la: Lichtenstenum
+    lt: Lichtenšteinas
+    lv: Lihtenšteina
+    mi: Rīkeneteina
+    mk: Лихтенштајн
+    mn: Лихтенштейн
+    nl: Liechtenstein
+    pl: Liechtenstein
+    ru: Лихтенштейн
+    se: Liechtenstein
+    sk: Lichtenštajnsko
+    sl: Lihtenštajn
+    sr: Лихтенштајн
+    sv: Liechtenstein
+    ta: லீக்கின்ஸ்டைன்
+    th: ประเทศลิกเตนสไตน์
+    tr: Lihtenştayn
+    uk: Ліхтенштейн
+    vo: Ligtänstän
+    zh: 列支敦士登
diff --git a/settings/country-names/lk.yaml b/settings/country-names/lk.yaml
new file mode 100644 (file)
index 0000000..50e3f55
--- /dev/null
@@ -0,0 +1,126 @@
+name: 
+    default: ශ්‍රී ලංකාව இலங்கை
+    af: Sri Lanka
+    am: ሽሪ ላንካ
+    an: Sri Lanka
+    ar: سريلانكا
+    az: Şri-Lanka
+    ba: Шри-Ланка
+    be: Шры-Ланка
+    bg: Шри Ланка
+    bn: শ্রীলঙ্কা
+    bo: སེང་ག་གླིང་།
+    br: Sri Lanka
+    bs: Šri Lanka
+    ca: Sri Lanka
+    cs: Šrí Lanka
+    cv: Шри-Ланка
+    cy: Sri Lanka
+    da: Sri Lanka
+    de: Sri Lanka
+    dv: އޮޅުދޫކަރަ
+    dz: ཤྲཱྀ་ལངཀ་
+    el: Σρι Λάνκα
+    en: Sri Lanka
+    eo: Sri-Lanko
+    es: Sri Lanka
+    et: Sri Lanka
+    eu: Sri Lanka
+    fa: سری‌لانکا
+    fi: Sri Lanka
+    fo: Sri Lanka
+    fr: Sri Lanka
+    fy: Sry Lanka
+    ga: Srí Lanca
+    gd: Sri Lanca
+    gl: Sri Lanka - Sri Lankā
+    gu: શ્રીલંકા
+    gv: Sri Lanka
+    he: סרי לנקה
+    hi: श्रीलंका
+    hr: Šri Lanka
+    ht: Srilanka
+    hu: Srí Lanka
+    hy: Շրի Լանկա
+    ia: Sri Lanka
+    id: Sri Lanka
+    ie: Sri Lanka
+    io: Sri Lanka
+    is: Srí Lanka
+    it: Sri Lanka
+    ja: スリランカ
+    jv: Sri Lanka
+    ka: შრი-ლანკა
+    ki: Sri Lanka
+    kk: Шри-Ланка
+    km: ស្រីលង្កា
+    kn: ಶ್ರೀಲಂಕಾ
+    ko: 스리랑카
+    ku: Srî Lanka
+    kv: Шри-Ланка
+    kw: Shri Lanka
+    la: Taprobane
+    lb: Sri Lanka
+    li: Sri Lanka
+    ln: Sri Lanka
+    lt: Šri Lanka
+    lv: Šrilanka
+    mg: Sri Lanka
+    mi: Hīraka
+    mk: Шри Ланка
+    ml: ശ്രീലങ്ക
+    mn: Шри Ланка
+    mr: श्रीलंका
+    ms: Sri Lanka
+    mt: Sri Lanka
+    my: သီရိလင်္ကာနိုင်ငံ
+    na: Sri Lanka
+    ne: श्रीलंका
+    nl: Sri Lanka
+    nn: Sri Lanka
+    "no": Sri Lanka
+    nv: Swii Lankʼa
+    oc: Sri Lanka
+    om: Sirilaankaa
+    or: ଶ୍ରୀଲଙ୍କା
+    os: Шри-Ланка
+    pa: ਸ੍ਰੀਲੰਕਾ
+    pl: Sri Lanka
+    ps: سریلانکا
+    pt: Seri-Lanca
+    qu: Sri Lanka
+    ro: Sri Lanka
+    ru: Шри-Ланка
+    rw: Siri Lanka
+    sa: श्रीलङ्का
+    se: Sri Lanka
+    sh: Šri Lanka
+    si: ශ්‍රී ලංකාව
+    sk: Srí Lanka
+    sl: Šrilanka
+    sm: Sri Lanka
+    so: Siri Lanka
+    sq: Sri Lanka
+    sr: Шри Ланка
+    ss: Siri Lanka
+    su: Sri Langka
+    sv: Sri Lanka
+    sw: Sri Lanka
+    ta: இலங்கை
+    te: శ్రీలంక
+    tg: Шри-Ланка
+    th: ประเทศศรีลังกา
+    tk: Şri-Lanka
+    tl: Sri Lanka
+    tr: Sri Lanka
+    tt: Шри-Ланка
+    ug: سرىلانكا
+    uk: Шрі-Ланка
+    ur: سری لنکا
+    uz: Shri-Lanka
+    vi: Sri Lanka
+    vo: Sri-Lankän
+    wo: Siri Laanka
+    yi: סרי לאנקא
+    yo: Sri Lanka
+    zh: 斯里蘭卡
diff --git a/settings/country-names/lr.yaml b/settings/country-names/lr.yaml
new file mode 100644 (file)
index 0000000..c551a76
--- /dev/null
@@ -0,0 +1,124 @@
+name: 
+    default: Liberia
+    af: Liberië
+    am: ላይቤሪያ
+    an: Liberia
+    ar: ليبيريا
+    az: Liberiya
+    ba: Либерия
+    be: Ліберыя
+    bg: Либерия
+    bm: Liberia
+    bn: লাইবেরিয়া
+    bo: ལི་བེ་རི་ཡ།
+    br: Liberia
+    bs: Liberija
+    ca: Libèria
+    ce: Либери
+    cs: Libérie
+    cv: Либери
+    cy: Liberia
+    da: Liberia
+    de: Liberia
+    dv: ލައިބީރިއާ
+    ee: Liberia
+    el: Λιβερία
+    en: Liberia
+    eo: Liberio
+    es: Liberia
+    et: Libeeria
+    eu: Liberia
+    fa: لیبریا
+    ff: Labiriyaa
+    fi: Liberia
+    fo: Liberia
+    fr: Liberia
+    fy: Libearia
+    ga: An Libéir
+    gd: Libèiria
+    gl: Liberia
+    gv: Yn Laibeer
+    he: ליבריה
+    hi: लाइबेरिया
+    hr: Liberija
+    ht: Liberya
+    hu: Libéria
+    hy: Լիբերիա
+    ia: Liberia
+    id: Liberia
+    ie: Liberia
+    io: Liberia
+    is: Líbería
+    it: Liberia
+    ja: リベリア
+    jv: Liberia
+    ka: ლიბერია
+    kg: Liberia
+    kk: Либерия
+    kn: ಲೈಬೀರಿಯ
+    ko: 라이베리아
+    ku: Lîberya
+    kw: Liberi
+    la: Liberia
+    lb: Liberia
+    li: Liberia
+    ln: Liberia
+    lt: Liberija
+    lv: Libērija
+    mi: Raipiri
+    mk: Либерија
+    ml: ലൈബീരിയ
+    mn: Либери
+    mr: लायबेरिया
+    ms: Liberia
+    mt: Liberja
+    my: လိုက်ဘေးရီးယားနိုင်ငံ
+    nl: Liberia
+    nn: Liberia
+    "no": Liberia
+    oc: Libèria
+    or: ଲାଇବେରିଆ
+    os: Либери
+    pl: Liberia
+    ps: لايبېريا
+    pt: Libéria
+    qu: Libirya
+    rm: Liberia
+    ro: Liberia
+    ru: Либерия
+    rw: Liberiya
+    sa: लायबीरिया
+    sc: Libèria
+    se: Liberia
+    sg: Liberïa
+    sh: Liberija
+    sk: Libéria
+    sl: Liberija
+    sn: Liberia
+    so: Liberia
+    sq: Liberia
+    sr: Либерија
+    ss: ILibheriya
+    st: Liberia
+    su: Liberia
+    sv: Liberia
+    sw: Liberia
+    ta: லைபீரியா
+    tg: Либерия
+    th: ประเทศไลบีเรีย
+    tk: Liberiýa
+    tl: Liberia
+    tr: Liberya
+    ts: Layiberiya
+    tt: Либерия
+    ug: لىبېرىيە
+    uk: Ліберія
+    ur: لائبیریا
+    uz: Liberiya
+    vi: Liberia
+    vo: Liberän
+    wo: Libeeria
+    yi: ליבעריע
+    yo: Làìbéríà
+    zh: 利比里亚
+    zu: ILiberia
diff --git a/settings/country-names/ls.yaml b/settings/country-names/ls.yaml
new file mode 100644 (file)
index 0000000..e513350
--- /dev/null
@@ -0,0 +1,125 @@
+name: 
+    default: Lesotho
+    af: Lesotho
+    am: ሌሶቶ
+    an: Lesoto
+    ar: ليسوتو
+    az: Lesoto
+    ba: Лесото
+    be: Лесота
+    bg: Лесото
+    bm: Lesoto
+    bn: লেসোথো
+    bo: ལི་སོ་ཐོ།
+    br: Lesotho
+    bs: Lesoto
+    ca: Lesotho
+    ce: Лесото
+    cs: Lesotho
+    cv: Лесото
+    cy: Lesotho
+    da: Lesotho
+    de: Lesotho
+    dv: ލެސޯތޯ
+    ee: Lesotho
+    el: Λεσότο
+    en: Lesotho
+    eo: Lesoto
+    es: Lesoto
+    et: Lesotho
+    eu: Lesotho
+    fa: لسوتو
+    fi: Lesotho
+    fo: Lesoto
+    fr: Lesotho
+    fy: Lesoto
+    ga: Leosóta
+    gd: Leasoto
+    gl: Lesoto
+    gv: Lesoto
+    he: לסוטו
+    hi: लेसोथो
+    hr: Lesoto
+    ht: Lezoto
+    hu: Lesotho
+    hy: Լեսոթո
+    ia: Lesotho
+    id: Lesotho
+    ie: Lesotho
+    io: Lesotho
+    is: Lesótó
+    it: Lesotho
+    ja: レソト
+    jv: Lesotho
+    ka: ლესოთო
+    kg: Lesotho
+    kk: Лесото
+    kn: ಲೆಸೊಥೊ
+    ko: 레소토
+    ku: Lesoto
+    kw: Lesotho
+    la: Lesothum
+    lb: Lesotho
+    li: Lesotho
+    ln: Lesoto
+    lt: Lesotas
+    lv: Lesoto
+    mi: Teroto
+    mk: Лесото
+    ml: ലെസോത്തോ
+    mn: Лесото
+    mr: लेसोथो
+    ms: Lesotho
+    mt: Lesoto
+    my: လီဆိုသိုနိုင်ငံ
+    na: Resoto
+    nl: Lesotho
+    nn: Lesotho
+    "no": Lesotho
+    nv: Sotho Dineʼé Bikéyah
+    oc: Lesotho
+    or: ଲିସୁଟୁ
+    os: Лесото
+    pa: ਲਿਸੋਥੋ
+    pl: Lesotho
+    pt: Lesoto
+    qu: Suthusuyu
+    ro: Lesotho
+    ru: Лесото
+    rw: Lesoto
+    sa: लेसोथो
+    se: Lesotho
+    sg: Lesôtho
+    sh: Lesoto
+    sk: Lesotho
+    sl: Lesoto
+    sn: Lesotho
+    so: Lesotho
+    sq: Lesoto
+    sr: Лесото
+    ss: ÉLusûtfu
+    st: Lesotho
+    su: Lésotho
+    sv: Lesotho
+    sw: Lesotho
+    ta: லெசோத்தோ
+    tg: Лесото
+    th: ประเทศเลโซโท
+    tk: Lesoto
+    tl: Lesoto
+    tn: Lesotho
+    tr: Lesotho
+    ts: Lesotho
+    tt: Лесото
+    ug: لېسوتو
+    uk: Лесото
+    ur: لیسوتھو
+    uz: Lesoto
+    ve: Li-Sotho
+    vi: Lesotho
+    vo: Lesotän
+    wo: Lesoto
+    yi: לעסאטא
+    yo: Lèsóthò
+    zh: 莱索托/賴索托
+    zu: OSotho
diff --git a/settings/country-names/lt.yaml b/settings/country-names/lt.yaml
new file mode 100644 (file)
index 0000000..26a84bf
--- /dev/null
@@ -0,0 +1,147 @@
+name: 
+    default: Lietuva
+    ab: Литва
+    af: Litaue
+    ak: Lituania
+    am: ሊትዌኒያ
+    an: Lituania
+    ar: ليتوانيا
+    ay: Lituaña
+    az: Litva
+    ba: Литва
+    be: Літва
+    bg: Литва
+    bi: Litwania
+    bn: লিথুয়ানিয়া
+    bo: ལི་ཐུ་ཨེ་ནི་ཡ།
+    br: Lituania
+    bs: Litvanija
+    ca: Lituània
+    ce: Литва
+    ch: Lituania
+    co: Lituania
+    cs: Litva
+    cu: Литъва
+    cv: Литва
+    cy: Lithwania
+    da: Litauen
+    de: Litauen
+    dv: ލިތުއޭނިއާ
+    dz: ལི་ཐུ་ནི་ཡ།
+    ee: Lithuania
+    el: Λιθουανία
+    en: Lithuania
+    eo: Litovio
+    es: Lituania
+    et: Leedu
+    eu: Lituania
+    fa: لیتوانی
+    ff: Lituwaniya
+    fi: Liettua
+    fj: Lituani
+    fo: Litava
+    fr: Lituanie
+    fy: Litouwen
+    ga: An Liotuáin
+    gd: Liotuàinia
+    gl: Lituania - Lietuva
+    gn: Lituaña
+    gu: લિથુઆનિયા
+    gv: Yn Litaan
+    he: ליטא
+    hi: लिथुआनिया
+    hr: Litva
+    ht: Lityani
+    hu: Litvánia
+    hy: Լիտվա
+    ia: Lituania
+    id: Lituania
+    ie: Lituania
+    io: Lituania
+    is: Litháen
+    it: Lituania
+    iu: ᓕᐋᑐᕙ
+    ja: リトアニア
+    jv: Lituania
+    ka: ლიტვა
+    kg: Lietuva
+    ki: Lithuania
+    kk: Литва
+    kl: Litaueni
+    ko: 리투아니아
+    ku: Lîtvanya
+    kv: Литва
+    kw: Lithouani
+    ky: Литва
+    la: Lituania
+    lb: Litauen
+    lg: Lithueenia
+    li: Litauwe
+    ln: Litwani
+    lt: Lietuva
+    lv: Lietuva
+    mg: Litoania
+    mi: Rituānia
+    mk: Литванија
+    ml: ലിത്വാനിയ
+    mn: Литва
+    mr: लिथुएनिया
+    ms: Lithuania
+    mt: Litwanja
+    my: လစ်သူယေးနီးယားနိုင်ငံ
+    na: Rituainiya
+    ne: लिथुआनिया
+    nl: Litouwen
+    nn: Litauen
+    "no": Litauen
+    nv: Łitʼoowę́ęya
+    ny: Lithuania
+    oc: Lituània
+    or: ଲିଥୁଆନିଆ
+    os: Литва
+    pl: Litwa
+    ps: لېتوانيا
+    pt: Lituânia
+    qu: Lituwa
+    rm: Lituania
+    rn: Lituania
+    ro: Lituania
+    ru: Литва
+    rw: Lituwaniya
+    sa: लेतुवा
+    sc: Lituània
+    se: Lietuva
+    sg: Lituanïi
+    sh: Litvanija
+    sk: Litva
+    sl: Litva
+    so: Lithuaniya
+    sq: Lituania
+    sr: Литванија
+    ss: Lithuwani
+    st: Lituania
+    su: Lituania
+    sv: Litauen
+    sw: Lituanya
+    ta: லித்துவேனியா
+    te: లిథువేనియా
+    tg: Литва
+    th: ประเทศลิทัวเนีย
+    tk: Litwa
+    tl: Litwaniya
+    tr: Litvanya
+    ts: Lithuania
+    tt: Литва
+    ug: لىتۋا
+    uk: Литва
+    ur: لتھووینیا
+    uz: Litva
+    ve: Lituania
+    vi: Litva
+    vo: Lietuvän
+    wa: Litwaneye
+    wo: Lituwaani
+    yi: ליטע
+    yo: Lituéníà
+    zh: 立陶宛
+    zu: ILithuwaniya
diff --git a/settings/country-names/lu.yaml b/settings/country-names/lu.yaml
new file mode 100644 (file)
index 0000000..c4e0e4e
--- /dev/null
@@ -0,0 +1,129 @@
+name: 
+    default: Lëtzebuerg
+    af: Luxemburg
+    am: ሉክሰምበርግ
+    an: Luxemburgo
+    ar: لوكسمبورغ
+    az: Lüksemburq
+    ba: Люксембург
+    be: Люксембург
+    bg: Люксембург
+    bi: Luxembourg
+    bn: লুক্সেমবুর্গ
+    bo: ལུ་སེམ་བའུརག
+    br: Luksembourg
+    bs: Luksemburg
+    ca: Luxemburg
+    ce: Люксембург
+    co: Lussemburgu
+    cs: Lucembursko
+    cu: Люѯємбоургъ
+    cv: Люксембург
+    cy: Lwcsembwrg
+    da: Luxembourg
+    de: Luxemburg
+    ee: Luxembourg
+    el: Λουξεμβούργο
+    en: Luxembourg
+    eo: Luksemburgio
+    es: Luxemburgo
+    et: Luksemburg
+    eu: Luxenburgo
+    fa: لوکزامبورگ
+    fi: Luxemburg
+    fo: Luksemburg
+    fr: Luxembourg
+    fy: Lúksemboarch
+    ga: Lucsamburg
+    gd: Lucsamburg
+    gl: Luxemburgo
+    gn: Luxemburgo
+    gu: લક્ઝેમ્બર્ગ
+    gv: Lucsemburg
+    he: לוקסמבורג
+    hi: लक्ज़मबर्ग
+    hr: Luksemburg
+    ht: Liksanbou
+    hu: Luxemburg
+    hy: Լյուքսեմբուրգ
+    ia: Luxemburg
+    id: Luksemburg
+    ie: Luxemburgia
+    io: Luxemburgia
+    is: Lúxemborg
+    it: Lussemburgo
+    ja: ルクセンブルク
+    jv: Luksemburg
+    ka: ლუქსემბურგი
+    kg: Luxembourg
+    kk: Люксембург
+    kl: Luxembourg
+    ko: 룩셈부르크
+    ku: Lûksembûrg
+    kv: Люксембург
+    kw: Lushaborg
+    ky: Люксембург
+    la: Luxemburgum
+    lb: Lëtzebuerg
+    li: Luxembörg
+    ln: Luksamburg
+    lt: Liuksemburgas
+    lv: Luksemburga
+    mg: Loksemborga
+    mi: Rakapuō
+    mk: Луксембург
+    ml: ലക്സംബർഗ്
+    mn: Люксембург
+    mr: लक्झेंबर्ग
+    ms: Luxembourg
+    mt: Lussemburgu
+    my: လူဇင်ဘတ်နိုင်ငံ
+    na: Ruketemburg
+    ne: लक्जेम्बर्ग
+    nl: Luxemburg
+    nn: Luxembourg
+    "no": Luxembourg
+    nv: Látsębooʼ
+    oc: Luxemborg
+    or: ଲକ୍ସମବର୍ଗ
+    os: Люксембург
+    pa: ਲਕਸਮਬਰਗ
+    pl: Luksemburg
+    ps: لوګزامبورګ
+    pt: Luxemburgo
+    qu: Luksimbur
+    rm: Luxemburg
+    ro: Luxemburg
+    ru: Люксембург
+    rw: Lugizamburu
+    sa: लक्सम्बर्ग
+    sc: Lussemburgu
+    se: Luxemburg
+    sh: Luksemburg
+    sk: Luxembursko
+    sl: Luksemburg
+    so: Luksemburg
+    sq: Luksemburgu
+    sr: Луксембург
+    ss: Lusembogu
+    su: Luksemburg
+    sv: Luxemburg
+    sw: Luxemburg
+    ta: லக்சம்பர்க்
+    tg: Люксембург
+    th: ประเทศลักเซมเบิร์ก
+    tk: Lýuksemburg
+    tl: Luxembourg
+    tr: Lüksemburg
+    tt: Люксембург
+    ug: ليۇكسېمبۇرگ
+    uk: Люксембург
+    ur: لکسمبرگ
+    uz: Luksemburg
+    vi: Luxembourg
+    vo: Luxämburgän
+    wa: Grande-Dutcheye do Lussimbork
+    wo: Luksambuur
+    yi: לוקסעמבורג
+    yo: Lúksẹ́mbọ̀rg
+    zh: 盧森堡
diff --git a/settings/country-names/lv.yaml b/settings/country-names/lv.yaml
new file mode 100644 (file)
index 0000000..d4396b2
--- /dev/null
@@ -0,0 +1,152 @@
+name: 
+    default: Latvija
+    ab: Латвиа
+    af: Letland
+    ak: Latvia
+    am: ላትቪያ
+    an: Letonia
+    ar: لاتفيا
+    av: Латвия
+    az: Latviya
+    ba: Латвия
+    be: Латвія
+    bg: Латвия
+    bh: लैटविया
+    bi: Latvia
+    bn: লাতভিয়া
+    bo: ལ་ཊ་ཝིཡ།
+    br: Latvia
+    bs: Latvija
+    ca: Letònia
+    ce: Латви
+    ch: Letonia
+    co: Lettonia
+    cs: Lotyšsko
+    cu: Латвїꙗ
+    cv: Латви
+    cy: Latfia
+    da: Letland
+    de: Lettland
+    dv: ލެޓުވިއާ
+    dz: ལེཊི་བི་ཡ།
+    ee: Latvia
+    el: Λετονία
+    en: Latvia
+    eo: Latvio
+    es: Letonia
+    et: Läti
+    eu: Letonia
+    fa: لتونی
+    ff: Latvia
+    fi: Latvia
+    fo: Lettland
+    fr: Lettonie
+    fy: Letlân
+    ga: An Laitvia
+    gd: An Laitbhe
+    gl: Letonia
+    gn: Letoña
+    gu: લાટવિયા
+    gv: Yn Latvey
+    ha: Laitfiya
+    he: לטביה
+    hi: लातविया
+    hr: Latvija
+    ht: Letoni
+    hu: Lettország
+    hy: Լատվիա
+    ia: Latvia
+    id: Latvia
+    ie: Latvia
+    ig: Latvia
+    io: Latvia
+    is: Lettland
+    it: Lettonia
+    ja: ラトビア
+    jv: Latvia
+    ka: ლატვია
+    kg: Latvia
+    kk: Латвия
+    kl: Letlandi
+    kn: ಲಾಟ್ವಿಯ
+    ko: 라트비아
+    ku: Letonya
+    kv: Латвия
+    kw: Latvi
+    ky: Латвия
+    la: Lettonia
+    lb: Lettland
+    lg: Latvia
+    li: Letland
+    ln: Letoni
+    lo: ປະເທດລັດເວຍ
+    lt: Latvija
+    lv: Latvija
+    mg: Latvia
+    mi: Rāwhia
+    mk: Летонија
+    ml: ലാത്‌വിയ
+    mn: Латви
+    mr: लात्व्हिया
+    ms: Latvia
+    mt: Latvja
+    my: လတ်ဗီယာနိုင်ငံ
+    na: Ratebiya
+    ne: लात्भिया
+    nl: Letland
+    nn: Latvia
+    "no": Latvia
+    nv: Létbiiya
+    oc: Letònia
+    om: Laativiyaa
+    or: ଲାଟଭିଆ
+    os: Латви
+    pa: ਲਾਤਵੀਆ
+    pi: लाट्विया
+    pl: Łotwa
+    pt: Letónia
+    qu: Litunya
+    rm: Lettonia
+    ro: Letonia
+    ru: Латвия
+    rw: Lativiya
+    sa: लाट्विया
+    sc: Lettonia
+    se: Latvia
+    sh: Letonija
+    si: ලැට්වියාව
+    sk: Lotyšsko
+    sl: Latvija
+    sm: Lativia
+    sn: Latvia
+    so: Latfiya
+    sq: Letonia
+    sr: Летонија
+    ss: ILathiviya
+    st: Latvia
+    su: Latvia
+    sv: Lettland
+    sw: Latvia
+    ta: லாத்வியா
+    te: లాట్వియా
+    tg: Латвия
+    th: ประเทศลัตเวีย
+    tk: Latwiýa
+    tl: Latbiya
+    tr: Letonya
+    ts: Latvia
+    tt: Латвия
+    tw: Latvia
+    ug: لاتۋىيە
+    uk: Латвія
+    ur: لٹویا
+    uz: Latviya
+    vi: Latvia
+    vo: Latviyän
+    wa: Letoneye
+    wo: Letóoni
+    yi: לעטלאנד
+    yo: Látfíà
+    za: Latvia
+    zh: 拉脫維亞
+    zu: ILatviya
diff --git a/settings/country-names/ly.yaml b/settings/country-names/ly.yaml
new file mode 100644 (file)
index 0000000..e010401
--- /dev/null
@@ -0,0 +1,135 @@
+name: 
+    default: ليبيا
+    af: Libië
+    am: ሊቢያ
+    an: Libia
+    ar: ليبيا
+    az: Liviya
+    ba: Ливия
+    be: Лівія
+    bg: Либия
+    bm: Libya
+    bn: লিবিয়া
+    bo: ལི་པི་ཡ།
+    br: Libia
+    bs: Libija
+    ca: Líbia
+    ce: Ливи
+    cs: Libye
+    cv: Ливи
+    cy: Libya
+    da: Libyen
+    de: Libyen
+    dv: ލީބިޔާ
+    ee: Libya
+    el: Λιβύη
+    en: Libya
+    eo: Libio
+    es: Libia
+    et: Liibüa
+    eu: Libia
+    fa: لیبی
+    fi: Libya
+    fo: Libya
+    fr: Libye
+    fy: Lybje
+    ga: An Libia
+    gd: Libia
+    gl: Libia
+    gn: Livia
+    gv: Yn Leeb
+    ha: Libya
+    he: לוב
+    hi: लीबिया
+    hr: Libija
+    ht: Libi
+    hu: Líbia
+    hy: Լիբիա
+    ia: Libya
+    id: Libya
+    ie: Libya
+    io: Libia
+    is: Líbýa
+    it: Libia
+    ja: リビア
+    jv: Libya
+    ka: ლიბია
+    kg: Libia
+    kk: Ливия
+    kl: Libya
+    kn: ಲಿಬಿಯಾ
+    ko: 리비아
+    ks: لِبیا
+    ku: Lîbya
+    kw: Libi
+    ky: Ливия
+    la: Libya
+    lb: Libyen
+    li: Libië
+    ln: Libîya
+    lt: Libija
+    lv: Lībija
+    mg: Libia
+    mi: Rīpia
+    mk: Либија
+    ml: ലിബിയ
+    mn: Ливи
+    mr: लीबिया
+    ms: Libya
+    mt: Libja
+    my: လစ်ဗျားနိုင်ငံ
+    ne: लिबिया
+    nl: Libië
+    nn: Libya
+    "no": Libya
+    nv: Łíbya
+    oc: Libia
+    or: ଲିବିଆ
+    os: Ливи
+    pa: ਲੀਬੀਆ
+    pl: Libia
+    ps: لېبيا
+    pt: Líbia
+    qu: Libya
+    ro: Libia
+    ru: Ливия
+    rw: Libiya
+    sa: लिबिया
+    sc: Lìbia
+    se: Libya
+    sg: Libïi
+    sh: Libija
+    si: ලිබියාව
+    sk: Líbya
+    sl: Libija
+    sm: Libya
+    sn: Libya
+    so: Libiya
+    sq: Libia
+    sr: Либија
+    ss: ILibhiya
+    su: Libya
+    sv: Libyen
+    sw: Libya
+    ta: லிபியா
+    te: లిబియా
+    tg: Либия
+    th: ประเทศลิเบีย
+    ti: ሊቢያ
+    tk: Liwiýa
+    tl: Libya
+    tr: Libya
+    ts: Libiya
+    tt: Ливия
+    ug: لىۋىيە
+    uk: Лівія
+    ur: لیبیا
+    uz: Liviya
+    vi: Libya
+    vo: Lübän
+    wa: Libeye
+    wo: Libi
+    yi: ליביע
+    yo: Líbyà
+    zh: 利比亚
+    zu: ILibiya
diff --git a/settings/country-names/ma.yaml b/settings/country-names/ma.yaml
new file mode 100644 (file)
index 0000000..ac3a07f
--- /dev/null
@@ -0,0 +1,128 @@
+name: 
+    default: Maroc ⵍⵎⵖⵔⵉⴱ المغرب
+    af: Marokko
+    am: ሞሮኮ
+    an: Marruecos
+    ar: المغرب
+    az: Mərakeş
+    ba: Марокко
+    be: Марока
+    bg: Мароко
+    bm: Maroko
+    bn: মরোক্কো
+    bo: མོ་རོ་ཁོ།
+    br: Maroko
+    bs: Maroko
+    ca: Marroc
+    ce: Марокко
+    cs: Maroko
+    cv: Марокко
+    cy: Moroco
+    da: Marokko
+    de: Marokko
+    dv: މައުރިބު
+    el: Μαρόκο
+    en: Morocco
+    eo: Maroko
+    es: Marruecos
+    et: Maroko
+    eu: Maroko
+    fa: مراکش
+    fi: Marokko
+    fo: Marokko
+    fr: Maroc
+    fy: Marokko
+    ga: Maracó
+    gd: Maroco
+    gl: Marrocos
+    gv: Yn Varoc
+    he: מרוקו
+    hi: मोरक्को
+    hr: Maroko
+    ht: Mawòk
+    hu: Marokkó
+    hy: Մարոկկո
+    ia: Marocco
+    id: Maroko
+    ie: Morocco
+    io: Maroko
+    is: Marokkó
+    it: Marocco
+    ja: モロッコ
+    jv: Maroko
+    ka: მაროკო
+    kg: Maroko
+    kk: Мағрибия
+    kn: ಮೊರಾಕೊ
+    ko: 모로코
+    ks: मोराको
+    ku: Maroko
+    kw: Marokk
+    ky: Марокко
+    la: Marocum
+    lb: Marokko
+    li: Marokko
+    ln: Marɔkɛ
+    lt: Marokas
+    lv: Maroka
+    mg: Marôka
+    mi: Marako
+    mk: Мароко
+    ml: മൊറോക്കൊ
+    mn: Марокко
+    mr: मोरोक्को
+    ms: Maghribi
+    mt: Marokk
+    my: မော်ရိုကိုနိုင်ငံ
+    nl: Marokko
+    nn: Marokko
+    "no": Marokko
+    nv: Moroko
+    oc: Marròc
+    or: ମୋରୋକୋ
+    os: Марокко
+    pa: ਮੋਰਾਕੋ
+    pl: Maroko
+    ps: مراکش
+    pt: Marrocos
+    qu: Maruku
+    ro: Maroc
+    ru: Марокко
+    rw: Maroke
+    sa: मोराको
+    sc: Marocco
+    se: Marokko
+    sg: Marôko
+    sh: Maroko
+    sk: Maroko
+    sl: Maroko
+    sn: Morocco
+    so: Marooko
+    sq: Maroku
+    sr: Мароко
+    ss: IMorokho
+    su: Maroko
+    sv: Marocko
+    sw: Moroko
+    ta: மொரோக்கோ
+    te: మొరాకో
+    tg: Марокаш
+    th: ประเทศโมร็อกโก
+    ti: ሞሮኮ
+    tk: Marokko
+    tl: Maruekos
+    tr: Fas
+    ts: Morocco
+    tt: Марокко
+    ug: ماراكەش
+    uk: Марокко
+    ur: مراکش
+    uz: Marokash
+    vi: Maroc
+    vo: Marokän
+    wa: Marok
+    wo: Marok
+    yi: מאראקא
+    yo: Mòrókò
+    zh: 摩洛哥
+    zu: IMorokho
diff --git a/settings/country-names/mc.yaml b/settings/country-names/mc.yaml
new file mode 100644 (file)
index 0000000..c0d7f06
--- /dev/null
@@ -0,0 +1,142 @@
+name: 
+    default: Monaco
+    af: Monaco
+    ak: Mɔnako
+    am: ሞናኮ
+    an: Múnegu
+    ar: موناكو
+    az: Monako
+    ba: Монако
+    be: Манака
+    bg: Монако
+    bi: Monaco
+    bm: Monako
+    bn: মোনাকো
+    bo: མོ་ན་ཁོ།
+    br: Monako
+    bs: Monako
+    ca: Mònaco
+    ce: Монако
+    cs: Monako
+    cu: Монако
+    cv: Монако
+    cy: Monaco
+    da: Monaco
+    de: Monaco
+    dv: މޮނާކޯ
+    dz: མོ་ན་ཀོ
+    ee: Monaco
+    el: Μονακό
+    en: Monaco
+    eo: Monako
+    es: Mónaco
+    et: Monaco
+    eu: Monako
+    fa: موناکو
+    ff: Monaakoo
+    fi: Monaco
+    fo: Monako
+    fr: Monaco
+    fy: Monako
+    ga: Monacó
+    gd: Monaco
+    gl: Mónaco
+    gu: મોનૅકો
+    gv: Monaco
+    ha: Monako
+    he: מונקו
+    hi: मोनैको
+    hr: Monako
+    ht: Monako
+    hu: Monaco
+    hy: Մոնակո
+    ia: Monaco
+    id: Monako
+    ie: Mónaco
+    io: Monako
+    is: Mónakó
+    it: Monaco
+    ja: モナコ
+    jv: Monako
+    ka: მონაკო
+    kg: Monako
+    ki: Monako
+    kk: Монако
+    kl: Monaco
+    km: ម៉ូណាកូ
+    kn: ಮೊನಾಕೊ
+    ko: 모나코
+    ks: موناکو
+    ku: Monako
+    kv: Монако
+    kw: Monako
+    la: Monoecus
+    lb: Monaco
+    lg: Monako
+    li: Monaco
+    ln: Monaco
+    lo: ໂມນາໂກ
+    lt: Monakas
+    lv: Monako
+    mg: Mônakô
+    mi: Manako
+    mk: Монако
+    ml: മൊണാക്കോ
+    mn: Монако
+    mr: मोनॅको
+    ms: Monaco
+    mt: Monako
+    my: နိုင်ငံ
+    na: Monako
+    ne: मोनाको
+    nl: Monaco
+    nn: Monaco
+    "no": Monaco
+    oc: Mónegue
+    or: ମୋନାକୋ
+    os: Монако
+    pa: ਮੋਨਾਕੋ
+    pl: Monako
+    pt: Mónaco
+    qu: Munaku
+    rm: Monaco
+    rn: Monako
+    ro: Monaco
+    ru: Монако
+    rw: Monako
+    sa: मोनाको
+    se: Monaco
+    sg: Monaköo
+    sh: Monako
+    si: මොනාකෝව
+    sk: Monako
+    sl: Monako
+    so: Monako
+    sq: Monako
+    sr: Монако
+    ss: IMonakho
+    su: Monako
+    sv: Monaco
+    sw: Monako
+    ta: மொனாக்கோ
+    te: మొనాకో
+    tg: Монако
+    th: ประเทศโมนาโก
+    ti: ሞናኮ
+    tk: Monako
+    tl: Monako
+    to: Manako
+    tr: Monako
+    tt: Монако
+    tw: Monako
+    ug: موناكو
+    uk: Монако
+    ur: موناکو
+    uz: Monako
+    vi: Monaco
+    vo: Monakän
+    wo: Monaako
+    yi: מאנאקא
+    yo: Mónakò
+    zh: 摩纳哥
+    zu: i-Monaco
diff --git a/settings/country-names/md.yaml b/settings/country-names/md.yaml
new file mode 100644 (file)
index 0000000..a274b80
--- /dev/null
@@ -0,0 +1,127 @@
+name: 
+    default: Moldova
+    ab: Молдова
+    af: Moldowa
+    am: ሞልዶቫ
+    an: Moldavia
+    ar: مولدوفا
+    az: Moldova
+    ba: Молдова
+    be: Малдова
+    bg: Молдова
+    bi: Moldova
+    bn: মলদোভা
+    bo: མོལ་དོ་ཝ།
+    br: Moldova
+    bs: Moldavija
+    ca: Moldàvia
+    ce: Молдави
+    co: Moldavia
+    cs: Moldavsko
+    cu: Молдова
+    cv: Молдави
+    cy: Moldofa
+    da: Moldova
+    de: Moldawien
+    dv: މޮލްޑޯވާ
+    ee: Moldova
+    el: Μολδαβία
+    en: Moldova
+    eo: Moldavio
+    es: Moldavia
+    et: Moldova
+    eu: Moldavia
+    fa: مولداوی
+    fi: Moldova
+    fo: Moldova
+    fr: Moldavie
+    fy: Moldaavje
+    ga: An Mholdóiv
+    gd: Moldàibhia
+    gl: Moldavia
+    gu: મોલ્દોવા
+    gv: Moldova
+    he: מולדובה
+    hi: मॉल्डोवा
+    hr: Moldova
+    ht: Moldavi
+    hu: Moldova
+    hy: Մոլդովա
+    ia: Moldova
+    id: Moldova
+    ie: Moldavia
+    io: Moldova
+    is: Moldóva
+    it: Moldavia
+    ja: モルドバ
+    jv: Moldova
+    ka: მოლდოვა
+    kg: Moldova
+    kk: Молдова
+    kl: Moldova
+    kn: ಮಾಲ್ಡೋವ
+    ko: 몰도바
+    ku: Moldova
+    kv: Молдова
+    kw: Moldova
+    ky: Молдова
+    la: Moldavia
+    lb: Moldawien
+    li: Moldavië
+    lt: Moldavija
+    lv: Moldova
+    mi: Te Whenua o Morotawa
+    mk: Молдавија
+    ml: മൊൾഡോവ
+    mn: Молдав
+    mo: Мoldova
+    mr: मोल्दोव्हा
+    ms: Moldova
+    mt: Moldova
+    my: မော်လ်ဒိုဗာနိုင်ငံ
+    na: Mordowa
+    ne: मोल्दोवा
+    nl: Moldavië
+    nn: Moldova
+    "no": Moldova
+    oc: Moldàvia
+    or: ମାଲଡୋଭା
+    os: Молдави
+    pa: ਮੋਲਦੋਵਾ
+    pl: Mołdawia
+    pt: Moldávia
+    qu: Mulduwa
+    ro: Moldova
+    ru: Молдавия
+    rw: Molidova
+    sa: मोल्दोवा
+    se: Moldova
+    sh: Moldavija
+    sk: Moldavsko
+    sl: Moldavija
+    so: Moldofa
+    sq: Moldavia
+    sr: Молдавија
+    ss: IMolidiva
+    st: Moldova
+    su: Moldova
+    sv: Moldavien
+    sw: Moldova
+    ta: மல்தோவா
+    te: మోల్డోవా
+    tg: Молдова
+    th: ประเทศมอลโดวา
+    tk: Moldawiýa
+    tl: Moldavia
+    tr: Moldova
+    tt: Молдавия
+    ug: مولدوۋا
+    uk: Молдова
+    ur: مالدووا
+    uz: Moldova
+    vi: Moldova
+    vo: Moldovän
+    wo: Moldaawi
+    yi: מאלדאווע
+    yo: Móldófà
+    zh: 摩尔多瓦
diff --git a/settings/country-names/me.yaml b/settings/country-names/me.yaml
new file mode 100644 (file)
index 0000000..1b30909
--- /dev/null
@@ -0,0 +1,126 @@
+name: 
+    default: Crna Gora / Црна Гора
+    af: Montenegro
+    am: ሞንቴኔግሮ
+    an: Montenegro
+    ar: الجبل الأسود
+    av: Чеэраб Меэр
+    az: Monteneqro
+    ba: Черногория
+    be: Чарнагорыя
+    bg: Черна гора
+    bi: Montenegro
+    bn: মন্টিনিগ্রো
+    bo: མོན་ཊེནིག་རོ།
+    br: Montenegro
+    bs: Crna Gora
+    ca: Montenegro
+    ce: Iаьржалаьмни
+    cs: Černá Hora
+    cu: Чрьна Гора
+    cv: Черногори
+    cy: Montenegro
+    da: Montenegro
+    de: Montenegro
+    dv: މޮންޓެނީގުރޯ
+    ee: Montenegro
+    el: Μαυροβούνιο
+    en: Montenegro
+    eo: Montenegro
+    es: Montenegro
+    et: Montenegro
+    eu: Montenegro
+    fa: مونته‌نگرو
+    fi: Montenegro
+    fo: Montenegro
+    fr: Monténégro
+    fy: Montenegro
+    ga: Montainéagró
+    gd: Am Monadh Neagrach
+    gl: Montenegro
+    gu: મોન્ટેનીગ્રો
+    gv: Montenegro
+    he: מונטנגרו
+    hr: Crna Gora
+    ht: Montenegwo
+    hu: Montenegró
+    hy: Չեռնոգորիա
+    ia: Montenegro
+    id: Montenegro
+    ie: Montenegro
+    io: Montenegro
+    is: Svartfjallaland
+    it: Montenegro
+    ja: モンテネグロ
+    jv: Montenégro
+    ka: ჩერნოგორია
+    kg: Monte Negro
+    kk: Черногория
+    kl: Montenegro
+    kn: ಮಾಂಟೆನೆಗ್ರೊ
+    ko: 몬테네그로
+    ku: Montenegro
+    kv: Черногория
+    kw: Montenegro
+    ky: Монтенегро
+    la: Mons Niger
+    lb: Montenegro
+    li: Montenegro
+    ln: Montenegro
+    lt: Juodkalnija
+    lv: Melnkalne
+    mi: Monotenīkoro
+    mk: Црна Гора
+    ml: മോണ്ടെനെഗ്രൊ
+    mn: Монтенегро
+    mr: माँटेनिग्रो
+    ms: Montenegro
+    mt: Montenegro
+    my: မွန်တီနီဂရိုးနိုင်ငံ
+    na: Montenegro
+    ne: मोन्टेनेग्रो
+    nl: Montenegro
+    nn: Montenegro
+    "no": Montenegro
+    nv: Dziłizhin Bikéyah
+    oc: Montenegro
+    or: ମୋଣ୍ଟେନେଗ୍ରୋ
+    os: Черногори
+    pa: ਮੋਂਟੇਨੇਗਰੋ
+    pl: Czarnogóra
+    ps: مانتېنېګرو
+    pt: Montenegro
+    qu: Yanaurqu
+    ro: Muntenegru
+    ru: Черногория
+    rw: Montenegoro
+    sc: Montenegro
+    se: Montenegro
+    sh: Crna Gora
+    sk: Čierna Hora
+    sl: Črna gora
+    sm: Montenegro
+    so: Montenegro
+    sq: Mali i Zi
+    sr: Црна Гора
+    ss: IMonthenekho
+    su: Monténégro
+    sv: Montenegro
+    sw: Montenegro
+    ta: மொண்டெனேகுரோ
+    tg: Монтенегро
+    th: ประเทศมอนเตเนโกร
+    tk: Çernogoriýa
+    tl: Montenegro
+    tr: Karadağ
+    tt: Монтенегро
+    ug: چېرنوگورىيە
+    uk: Чорногорія
+    ur: مونٹینیگرو
+    uz: Chernogoriya
+    vi: Montenegro
+    vo: Montenegrän
+    wo: Montenegro
+    yi: מאנטענעגרא
+    yo: Montenẹ́grò
+    zh: 蒙特內哥羅
diff --git a/settings/country-names/mf.yaml b/settings/country-names/mf.yaml
new file mode 100644 (file)
index 0000000..53c4ce5
--- /dev/null
@@ -0,0 +1,2 @@
+name: 
+    default: Saint Martin
diff --git a/settings/country-names/mg.yaml b/settings/country-names/mg.yaml
new file mode 100644 (file)
index 0000000..6504818
--- /dev/null
@@ -0,0 +1,136 @@
+name: 
+    default: Madagasikara
+    af: Madagaskar
+    am: ማዳጋስካር
+    an: Madagascar
+    ar: مدغشقر
+    az: Madaqaskar
+    ba: Мадагаскар
+    be: Мадагаскар
+    bg: Мадагаскар
+    bm: Madagaskar
+    bn: মাদাগাস্কার
+    bo: མ་ད་གཱ་སི་ཀར།
+    br: Madagaskar
+    bs: Madagaskar
+    ca: Madagascar
+    ce: Мадагаскар
+    cs: Madagaskar
+    cv: Мадагаскар
+    cy: Madagascar
+    da: Madagaskar
+    de: Madagaskar
+    dv: މަޑަގަސްކަރަ
+    ee: Madagascar
+    el: Μαδαγασκάρη
+    en: Madagascar
+    eo: Madagaskaro
+    es: Madagascar
+    et: Madagaskar
+    eu: Madagaskar
+    fa: ماداگاسکار
+    fi: Madagaskar
+    fj: Madagasikar
+    fo: Madagaskar
+    fr: Madagascar
+    fy: Madagaskar
+    ga: Madagascar
+    gd: Madagascar
+    gl: Madagascar
+    gn: Madagaka
+    gu: મડાગાસ્કર
+    gv: Madagascar
+    he: מדגסקר
+    hi: मेडागास्कर
+    hr: Madagaskar
+    ht: Madagaskar
+    hu: Madagaszkár
+    hy: Մադագասկար
+    ia: Madagascar
+    id: Madagaskar
+    ie: Madagascar
+    io: Madagaskar
+    is: Madagaskar
+    it: Madagascar
+    ja: マダガスカル
+    jv: Madagaskar
+    ka: მადაგასკარი
+    kg: Malagasi
+    ki: Madagascar
+    kk: Мадагаскар
+    kl: Madagascar
+    kn: ಮಡಾಗಾಸಿಕರ
+    ko: 마다가스카르
+    ku: Madagaskar
+    kw: Madagaskar
+    ky: Мадагаскар
+    la: Madagascaria
+    lb: Madagaskar
+    li: Madagaskar
+    ln: Madagasikari
+    lt: Madagaskaras
+    lv: Madagaskara
+    mg: Madagasikara
+    mi: Marakāhia
+    mk: Мадагаскар
+    ml: മഡഗാസ്കർ
+    mn: Мадагаскар
+    mr: मादागास्कर
+    ms: Madagaskar
+    mt: Madagaskar
+    my: မဒါဂတ်စကားနိုင်ငံ
+    nl: Madagaskar
+    nn: Madagaskar
+    "no": Madagaskar
+    nv: Madaʼgéésgáá
+    oc: Madagascar
+    om: Madagascar
+    or: ମେଡାଗାସ୍କର
+    os: Мадагаскар
+    pa: ਮਾਦਾਗਾਸਕਰ
+    pl: Madagaskar
+    ps: مادغاسکر
+    pt: Madagáscar
+    qu: Madagaskar
+    ro: Madagascar
+    ru: Мадагаскар
+    rw: Madagasikari
+    sa: मडगास्कर
+    sc: Madagascàr
+    se: Madagaskar
+    sg: Madagaskära
+    sh: Madagaskar
+    si: මැඩගස්කරය
+    sk: Madagaskar
+    sl: Madagaskar
+    sm: Madagascar
+    sn: Madagascar
+    so: Madagaskar
+    sq: Madagaskari
+    sr: Мадагаскар
+    ss: IMadagasikha
+    su: Madagaskar
+    sv: Madagaskar
+    sw: Madagaska
+    ta: மடகாசுகர்
+    te: మడగాస్కర్
+    tg: Мадагаскар
+    th: ประเทศมาดากัสการ์
+    ti: ማዳጋስካር
+    tk: Madagaskar
+    tl: Madagaskar
+    tr: Madagaskar
+    ts: Madagascar
+    tt: Мадагаскар
+    ty: Madagascar
+    ug: ماداگاسكار
+    uk: Мадагаскар
+    ur: مڈغاسکر
+    uz: Madagaskar
+    vi: Madagascar
+    vo: Malagaseän
+    wo: Madagaskaar
+    yi: מאדאגאסקאר
+    yo: Madagáskàr
+    zh: 马达加斯加
+    zu: IMadagasika
diff --git a/settings/country-names/mh.yaml b/settings/country-names/mh.yaml
new file mode 100644 (file)
index 0000000..d460e19
--- /dev/null
@@ -0,0 +1,51 @@
+name: 
+    default: Ṃajeḷ
+    af: Marshalleilande
+    ar: جزر مارشال
+    be: Маршалавы астравы
+    br: Inizi Marshall
+    ca: Illes Marshall
+    cy: Ynysoedd Marshall
+    da: Marshalløerne
+    de: Marshallinseln
+    en: Marshall Islands
+    eo: Marŝaloj
+    es: Islas Marshall
+    et: Marshalli Saared
+    fa: جزایر مارشال
+    fi: Marshallinsaaret
+    fr: Îles Marshall
+    fy: de Marshalleilannen
+    ga: Oileáin Marshall
+    gd: Na h-Eileanan Mharshall
+    he: איי מרשל
+    hr: Maršalovi Otoci
+    hu: Marshall-szigetek
+    ia: Insulas Marshall
+    id: Kepulauan Marshall
+    io: Insuli Marshall
+    is: Marshalleyjar
+    it: Isole Marshall
+    la: Insulae Marsalienses
+    lb: Marshallinselen
+    li: Marshall-eilen
+    lt: Maršalo salos
+    lv: Māršala salas
+    mk: Маршалски Острови
+    mn: Маршаллын арлууд
+    nl: Marshalleilanden
+    oc: Illas Marshall
+    pl: Wyspy Marshalla
+    pt: Ilhas Marshall
+    ru: Маршалловы Острова
+    se: Marshallsullot
+    sk: Mashallove ostrovy
+    sl: Marshallovi otoki
+    sv: Marshallöarna
+    ta: மார்சல் தீவுகள்
+    th: สาธารณรัฐหมู่เกาะมาร์แชลล์
+    tr: Marshall Adaları
+    uk: Маршаллові Острови
+    vi: Quần đảo Marshall
+    vo: Marjaluäns
+    zh: 马绍尔群岛
diff --git a/settings/country-names/mk.yaml b/settings/country-names/mk.yaml
new file mode 100644 (file)
index 0000000..4783ed4
--- /dev/null
@@ -0,0 +1,145 @@
+name: 
+    default: Северна Македонија
+    af: Masedonië
+    ak: Masedonia
+    am: ማሴዶንያ
+    an: Republica de Macedonia
+    ar: شمال مقدونيا
+    az: Masedoniya
+    ba: Македония Республикаһы
+    be: Македонія
+    bg: Северна Македония
+    bi: Macedonia
+    bm: Macedɔni
+    bn: মেসিডোনিয়া[FYROM]
+    bo: མ་སེ་ཌོ་ནིཡ། (རྒྱལ་ཁབ།)
+    br: Makedonia
+    bs: Sjeverna Makedonija
+    ca: Macedònia del Nord
+    ce: Македони
+    cs: Severní Makedonie
+    cu: Макєдонїꙗ
+    cv: Македони Республики
+    cy: Gogledd Macedonia
+    da: Nordmakedonien
+    de: Nordmazedonien
+    dv: މެސެޑޯނިއާ
+    dz: མ་སེ་ཌོ་ནི་ཡ་ [ཡུ་གོ་སླཱ་བི་ཡ]
+    ee: Makedonia
+    el: Βόρεια Μακεδονία
+    en: North Macedonia
+    eo: Nord-Makedonio
+    es: Macedonia del Norte
+    et: Põhja-Makedoonia
+    eu: Ipar Mazedonia
+    fa: مقدونیه شمالی
+    ff: Meceduwaan
+    fi: Makedonia
+    fo: Makedónia
+    fr: Macédoine du Nord
+    fy: Noard-Masedoanje
+    ga: An Mhacadóin
+    gd: Masadoinia a Tuath
+    gl: Macedonia do Norte
+    gn: Masendoña
+    gu: મેસેડોનિયા
+    gv: Massadoan Hwoaie
+    ha: Masedoniya
+    he: מקדוניה הצפונית
+    hi: उत्तर मेसीडोनिया
+    hr: Sjeverna Makedonija
+    ht: Repiblik d Masedoni
+    hu: Észak-Macedónia
+    hy: Մակեդոնիայի Հանրապետություն
+    ia: Macedonia
+    id: Republik Makedonia
+    ie: Macedonia
+    io: Republiko Macedonia
+    is: Makedónía
+    it: Macedonia del Nord
+    ja: 北マケドニア
+    jv: Républik Makedonia
+    ka: მაკედონია
+    kg: Makedonia
+    ki: Masedonia
+    kk: Македония Республикасы
+    kl: Makedonia
+    km: ម៉ាសេដ្វាន
+    kn: ಮ್ಯಾಸಿಡೋನಿಯ
+    ko: 북마케도니아
+    ks: مٮ۪سوڑونِیا
+    ku: Komara Makedonyayê
+    kv: Македония Республика
+    kw: Repoblek Makedoni
+    la: Macedonia Septentrionalis
+    lb: Nordmazedonien
+    lg: Masedoniya
+    li: Noord-Macedonië
+    ln: Masedoni
+    lo: ມາຊີໂດເນຍ
+    lt: Šiaurės Makedonija
+    lv: Ziemeļmaķedonija
+    mg: Makedonia
+    mi: Makerōnia
+    mk: Северна Македонија
+    ml: റിപ്പബ്ലിക് ഓഫ് മാസിഡോണിയ
+    mn: Бүгд Найрамдах Македон Улс
+    mr: मॅसिडोनिया
+    ms: Republik Macedonia
+    mt: Repubblika tal-Maċedonja
+    my: မက်စီဒိုးနီးယားနိုင်ငံ
+    na: Matedoniya
+    ne: म्यासेडोनिया
+    nl: Noord-Macedonië
+    nn: Nord-Makedonia
+    "no": Nord-Makedonia
+    oc: Republica de Macedònia
+    or: ମାସିଡୋନିଆ
+    os: Республикæ Македони
+    pa: ਮਕਦੂਨੀਆ ਗਣਰਾਜ
+    pl: Macedonia Północna
+    ps: د مقدونيې ولسمشريزه
+    pt: Macedónia do Norte
+    qu: Makidunya
+    rm: Macedonia
+    rn: Masedoniya
+    ro: Macedonia de Nord
+    ru: Северная Македония
+    rw: Masedoniya
+    sa: मेसेडोनिया
+    sc: Matzedònia
+    se: Davvi-Makedonia
+    sg: Maseduäni
+    sh: Severna Makedonija
+    si: මැසිඩෝනියාන [FYROM]
+    sk: Severné Macedónsko
+    sl: Makedonija
+    sn: Macedonia
+    so: Makedonia
+    sq: Maqedonia e Veriut
+    sr: Северна Македонија
+    ss: IMakhedoniya
+    su: Makédonia
+    sv: Nordmakedonien
+    sw: Jamhuri ya Masedonia
+    ta: மாக்கடோனியக் குடியரசு
+    te: మేసిడోనియా
+    tg: Ҷумҳурии Мақдуния
+    th: ประเทศมาซิโดเนีย
+    ti: ማከዶኒያ
+    tk: Makedoniýa Respublikasy
+    tl: Republika ng Masedonya
+    to: Masitōnia [FYROM]
+    tr: Kuzey Makedonya
+    tt: Македония Җөмһүрияте
+    ug: ماكېدونىيە
+    uk: Північна Македонія
+    ur: شمالی مقدونیہ
+    uz: Makedoniya Respublikasi
+    vi: Bắc Macedonia
+    vo: Nolüda-Makedoniyän
+    wo: Réewum Maseduwaan
+    yi: רעפובליק פון מאקעדאניע
+    yo: Orílẹ̀-èdè Olómìnira ilẹ̀ Makẹdóníà
+    zh: 北马其顿共和国
+    zu: isi-Macedonia [FYROM]
diff --git a/settings/country-names/ml.yaml b/settings/country-names/ml.yaml
new file mode 100644 (file)
index 0000000..b957d70
--- /dev/null
@@ -0,0 +1,128 @@
+name: 
+    default: Mali
+    af: Mali
+    am: ማሊ
+    an: Mali
+    ar: مالي
+    az: Mali
+    ba: Мали
+    be: Малі
+    bg: Мали
+    bm: Mali
+    bn: মালি
+    bo: མ་ལི།
+    br: Mali
+    bs: Mali
+    ca: Mali
+    ce: Мали
+    cs: Mali
+    cv: Мали
+    cy: Mali
+    da: Mali
+    de: Mali
+    dv: މާލީ
+    ee: Mali
+    el: Μάλι
+    en: Mali
+    eo: Malio
+    es: Malí
+    et: Mali
+    eu: Mali
+    fa: مالی
+    ff: Maali
+    fi: Mali
+    fo: Mali
+    fr: Mali
+    fy: Maly
+    ga: Mailí
+    gd: Màili
+    gl: Malí
+    gv: Malee
+    ha: Mali
+    he: מאלי
+    hi: माली
+    hr: Mali
+    ht: Mali
+    hu: Mali
+    hy: Մալի
+    ia: Mali
+    id: Mali
+    ie: Mali
+    io: Mali
+    is: Malí
+    it: Mali
+    ja: マリ共和国
+    jv: Mali
+    ka: მალი
+    kg: Mali
+    kk: Мали
+    kn: ಮಾಲಿ
+    ko: 말리
+    ku: Malî
+    kw: Mali
+    la: Malium
+    lb: Mali
+    li: Mali
+    ln: Mali
+    lt: Malis
+    lv: Mali
+    mi: Māri
+    mk: Мали
+    ml: മാലി
+    mn: Мали
+    mr: माली
+    ms: Mali
+    mt: Mali
+    my: မာလီနိုင်ငံ
+    nl: Mali
+    nn: Mali
+    "no": Mali
+    oc: Mali
+    or: ମାଲି
+    os: Мали
+    pa: ਮਾਲੀ
+    pl: Mali
+    ps: مالي
+    pt: Mali
+    qu: Mali
+    ro: Mali
+    ru: Мали
+    rw: Mali
+    sa: माली
+    sc: Mali
+    se: Mali
+    sg: Malïi
+    sh: Mali
+    si: මාලි
+    sk: Mali
+    sl: Mali
+    sn: Mali
+    so: Maali
+    sq: Mali
+    sr: Мали
+    ss: IMali
+    st: Mali
+    su: Mali
+    sv: Mali
+    sw: Mali
+    ta: மாலி
+    tg: Малӣ
+    th: ประเทศมาลี
+    ti: ማሊ
+    tk: Mali
+    tl: Mali
+    tr: Mali
+    ts: Mali
+    tt: Мали
+    ug: مالى
+    uk: Малі
+    ur: مالی
+    uz: Mali
+    vi: Mali
+    vo: Maliyän
+    wa: Mali
+    wo: Mali
+    yi: מאלי
+    yo: Málì
+    zh: 马里共和国
+    zu: IMali
diff --git a/settings/country-names/mm.yaml b/settings/country-names/mm.yaml
new file mode 100644 (file)
index 0000000..865f7db
--- /dev/null
@@ -0,0 +1,128 @@
+name: 
+    default: မြန်မာ
+    af: Mianmar
+    am: ምየንማ
+    an: Myanmar
+    ar: بورما
+    az: Myanma
+    ba: Мьянма
+    be: М'янма
+    bg: Мианмар
+    bi: Burma
+    bn: মায়ানমার
+    bo: བྷར་མ།
+    br: Myanmar
+    bs: Mijanmar
+    ca: Myanmar
+    ce: Мьянма
+    cs: Myanmar
+    cv: Мьянма
+    cy: Myanmar
+    da: Myanmar
+    de: Myanmar
+    dv: ބަރުމާ
+    dz: མེ་མར་
+    el: Μιανμάρ
+    en: Myanmar
+    eo: Birmo / Mjanmao
+    es: Myanmar
+    et: Birma
+    eu: Myanmar
+    fa: میانمار
+    fi: Myanmar
+    fo: Burma
+    fr: Birmanie
+    fy: Birma
+    ga: Maenmar
+    gd: Mianmar
+    gl: Myanmar
+    gu: બર્મા
+    gv: Myanmar
+    he: מיאנמר
+    hi: म्यान्मार
+    hr: Mijanmar
+    ht: Bimani
+    hu: Mianmar
+    hy: Մյանմա
+    ia: Birmania
+    id: Myanmar
+    ie: Myanmar
+    io: Myanmar
+    is: Búrma
+    it: Birmania
+    ja: ミャンマー
+    jv: Myanmar
+    ka: მიანმარი
+    ki: Myanmar
+    kk: Мианма
+    km: មីយ៉ាន់ម៉ា
+    kn: ಮಯನ್ಮಾರ್
+    ko: 미얀마
+    ku: Myanmar
+    kv: Мьянма
+    kw: Byrmani
+    ky: Мьянма
+    la: Birmania
+    lb: Myanmar
+    li: Myanmar
+    lo: ປະເທດມຽນມາ
+    lt: Mianmaras
+    lv: Mjanma
+    mg: Myanmara
+    mi: Pēma
+    mk: Мјанмар
+    ml: മ്യാന്മാർ
+    mn: Мьянмар
+    mr: म्यानमार
+    ms: Myanmar
+    mt: Myanmar
+    my: မြန်မာ
+    na: Miyanmar
+    ne: म्यानमार
+    nl: Myanmar
+    nn: Myanmar
+    "no": Myanmar
+    oc: Birmania
+    or: ବର୍ମା
+    os: Мьянмæ
+    pa: ਮਿਆਂਮਾਰ
+    pl: Mjanma
+    ps: ميانمار
+    pt: Birmânia
+    qu: Myanmar
+    ro: Birmania
+    ru: Мьянма
+    rw: Mayanimari
+    sa: म्यान्मार
+    sc: Birmania
+    se: Myanmar
+    sh: Mianmar
+    si: බුරුමය
+    sk: Mjanmarsko
+    sl: Mjanmar
+    so: Myanmar
+    sq: Birmania
+    sr: Мјанмар
+    ss: IMayanima
+    su: Myanmar
+    sv: Myanmar
+    sw: Myanmar
+    ta: மியான்மர்
+    te: మయన్మార్
+    tg: Мянма
+    th: ประเทศพม่า
+    tk: Mýanma
+    tl: Myanmar
+    tr: Myanmar
+    tt: Мьянма
+    ug: بىرما
+    uk: М'янма
+    ur: میانمار
+    uz: Birma
+    vi: Myanma
+    vo: Mianmarän
+    wo: Miyanmaar
+    yi: מיאנמאר
+    yo: Myanmar
+    za: Mienjdien
+    zh: 缅甸
diff --git a/settings/country-names/mn.yaml b/settings/country-names/mn.yaml
new file mode 100644 (file)
index 0000000..fa9a3a3
--- /dev/null
@@ -0,0 +1,131 @@
+name: 
+    default: Монгол улс ᠮᠤᠩᠭᠤᠯ ᠤᠯᠤᠰ
+    af: Mongolië
+    am: ሞንጎልያ
+    an: Mongolia
+    ar: منغوليا
+    as: মঙ্গোলিয়া
+    az: Monqolustan
+    ba: Монголия
+    be: Манголія
+    bg: Монголия
+    bn: মঙ্গোলিয়া
+    bo: མོང་གོལ།
+    br: Mongolia
+    bs: Mongolija
+    ca: Mongòlia
+    ce: Монголи
+    cs: Mongolsko
+    cu: Мѫголи
+    cv: Монголи
+    cy: Mongolia
+    da: Mongoliet
+    de: Mongolei
+    dv: މޮންގޯލިއާ
+    dz: སོག་པོ་
+    ee: Mongolia
+    el: Μογγολία
+    en: Mongolia
+    eo: Mongolio
+    es: Mongolia
+    et: Mongoolia
+    eu: Mongolia
+    fa: مغولستان
+    fi: Mongolia
+    fo: Mongolia
+    fr: Mongolie
+    fy: Mongoalje
+    ga: An Mhongóil
+    gd: Mongòilia
+    gl: Mongolia
+    gn: Mongolia
+    gu: મંગોલિયા
+    gv: Yn Vongoil
+    he: מונגוליה
+    hi: मंगोलिया
+    hr: Mongolija
+    ht: Mongoli
+    hu: Mongólia
+    hy: Մոնղոլիա
+    ia: Mongolia
+    id: Mongolia
+    ie: Mongolia
+    io: Mongolia
+    is: Mongólía
+    it: Mongolia
+    ja: モンゴル国
+    jv: Mongolia
+    ka: მონღოლეთი
+    kk: Моңғолия
+    kl: Mongolia
+    km: ម៉ុងហ្គោលី
+    kn: ಮಂಗೋಲಿಯ
+    ko: 몽골
+    ku: Mongolya
+    kv: Монголия
+    kw: Mongoli
+    ky: Моңголстан
+    la: Mongolia
+    lb: Mongolei
+    li: Mongolië
+    ln: Mongolí
+    lt: Mongolija
+    lv: Mongolija
+    mi: Mongōria
+    mk: Монголија
+    ml: മംഗോളിയ
+    mn: Монгол улс ᠮᠤᠩᠭᠤᠯ ᠤᠯᠤᠰ
+    mo: Монголия
+    mr: मंगोलिया
+    ms: Mongolia
+    my: မွန်ဂိုးလီးယားနိုင်ငံ
+    na: Mongoriya
+    ne: मङ्गोलिया
+    nl: Mongolië
+    nn: Mongolia
+    "no": Mongolia
+    nv: Chʼah Diʼilii Bikéyah
+    oc: Mongolia
+    or: ମଙ୍ଗୋଲିଆ
+    os: Мангол
+    pa: ਮੰਗੋਲੀਆ
+    pl: Mongolia
+    ps: مغولستان
+    pt: Mongólia
+    qu: Mungul suyu
+    ro: Mongolia
+    ru: Монголия
+    rw: Mongoliya
+    sa: मंगोलिया
+    se: Mongolia
+    sh: Mongolija
+    si: මොංගෝලියාව
+    sk: Mongolsko
+    sl: Mongolija
+    sm: Mogitolia
+    so: Mongolia
+    sq: Mongolia
+    sr: Монголија
+    ss: IMongoliya
+    su: Mongolia
+    sv: Mongoliet
+    sw: Mongolia
+    ta: மங்கோலியா
+    te: మంగోలియా
+    tg: Муғулистон
+    th: ประเทศมองโกเลีย
+    tk: Mongoliýa
+    tl: Monggolya
+    tr: Moğolistan
+    tt: Монголия
+    ug: موڭغۇلىيە
+    uk: Монголія
+    ur: منگولیا
+    uz: Moʻgʻuliston
+    vi: Mông Cổ
+    vo: Mongolän
+    wo: Mongoli
+    yi: מאנגאליי
+    yo: Mòngólíà
+    za: Mungzguj
+    zh: 蒙古国
diff --git a/settings/country-names/mo.yaml b/settings/country-names/mo.yaml
new file mode 100644 (file)
index 0000000..62f35d5
--- /dev/null
@@ -0,0 +1,2 @@
+name: 
+    default: Macao
diff --git a/settings/country-names/mp.yaml b/settings/country-names/mp.yaml
new file mode 100644 (file)
index 0000000..136ec99
--- /dev/null
@@ -0,0 +1,2 @@
+name: 
+    default: Northern Mariana Islands
diff --git a/settings/country-names/mq.yaml b/settings/country-names/mq.yaml
new file mode 100644 (file)
index 0000000..e038d6b
--- /dev/null
@@ -0,0 +1,30 @@
+name: 
+    default: Martinique
+    ar: مارتينيك
+    be: Марцініка
+    br: Martinik
+    ca: Martinica
+    da: Martinique
+    el: Μαρτινίκα
+    en: Martinique
+    eo: Martiniko
+    es: Martinica
+    fa: مارتینیک
+    fi: Martinique
+    fr: Martinique
+    fy: Martinyk
+    he: מרטיניק
+    hr: Martinik
+    hu: Martinique
+    id: Martinik
+    is: Martinique
+    it: Martinica
+    la: Martinica
+    lt: Martinika
+    lv: Martinika
+    mn: Мартиник
+    pl: Martynika
+    ru: Мартиника
+    sv: Martinique
+    uk: Мартиніка
+    zh: 馬提尼克
diff --git a/settings/country-names/mr.yaml b/settings/country-names/mr.yaml
new file mode 100644 (file)
index 0000000..ebc42f1
--- /dev/null
@@ -0,0 +1,129 @@
+name: 
+    default: موريتانيا
+    af: Mauritanië
+    am: ሞሪታኒያ
+    an: Mauritania
+    ar: موريتانيا
+    az: Mavritaniya
+    be: Маўрытанія
+    bg: Мавритания
+    bm: Moritani
+    bn: মৌরিতানিয়া
+    bo: མའུ་རི་ཏ་ནི་ཡ།
+    br: Maouritania
+    bs: Mauritanija
+    ca: Mauritània
+    ce: Мавритани
+    cs: Mauritánie
+    cv: Мавритани
+    cy: Mauritania
+    da: Mauretanien
+    de: Mauretanien
+    dv: މޮރިޓާނިއާ
+    ee: Mauritania
+    el: Μαυριτανία
+    en: Mauritania
+    eo: Maŭritanio
+    es: Mauritania
+    et: Mauritaania
+    eu: Mauritania
+    fa: موریتانی
+    ff: Muritani
+    fi: Mauritania
+    fo: Móritania
+    fr: Mauritanie
+    fy: Mauritaanje
+    ga: An Mháratáin
+    gd: Moratainia
+    gl: Mauritania
+    gv: Yn Varitaan
+    ha: Muritaniya
+    he: מאוריטניה
+    hi: मॉरीतानिया
+    hr: Mauretanija
+    ht: Moritani
+    hu: Mauritánia
+    hy: Մավրիտանիա
+    ia: Mauritania
+    id: Mauritania
+    ie: Mauritania
+    io: Mauritania
+    is: Máritanía
+    it: Mauritania
+    ja: モーリタニア
+    jv: Mauritania
+    ka: მავრიტანია
+    kg: Muritania
+    kk: Мавритания
+    kn: ಮಾರಿಟಾನಿಯ
+    ko: 모리타니
+    ku: Morîtanya
+    kw: Moritani
+    la: Mauritania
+    lb: Mauretanien
+    li: Mauritanië
+    ln: Moritani
+    lt: Mauritanija
+    lv: Mauritānija
+    mg: Maoritania
+    mi: Mauritānia
+    mk: Мавританија
+    ml: മൗറിത്താനിയ
+    mn: Мавритан
+    mr: मॉरिटानिया
+    ms: Mauritania
+    mt: Mawritanja
+    my: မော်ရီတေးနီးယားနိုင်ငံ
+    nl: Mauritanië
+    nn: Mauritania
+    "no": Mauritania
+    nv: Moowitéínya
+    oc: Mauritània
+    or: ମୋରିତାନିଆ
+    os: Мавритани
+    pa: ਮੌਰੀਤਾਨੀਆ
+    pl: Mauretania
+    ps: موریتاني
+    pt: Mauritânia
+    qu: Muritanya
+    ro: Mauritania
+    ru: Мавритания
+    rw: Moritaniya
+    sa: मारिटेनिया
+    sc: Mauritània
+    se: Mauritánia
+    sg: Moritanïi
+    sk: Mauritánia
+    sl: Mavretanija
+    sn: Mauritania
+    so: Mauritania
+    sq: Mauritania
+    sr: Мауританија
+    ss: IMolithaniya
+    st: Mauritania
+    su: Mauritania
+    sv: Mauretanien
+    sw: Mauritania
+    ta: மூரித்தானியா
+    te: మౌరిటానియ
+    tg: Мавритания
+    th: ประเทศมอริเตเนีย
+    ti: ሞሪታኒያ
+    tk: Mawritaniýa
+    tl: Mauritania
+    tr: Moritanya
+    ts: Maritana
+    tt: Мавритания
+    ug: ماۋرىتانىيە
+    uk: Мавританія
+    ur: موریتانیہ
+    uz: Mavritaniya
+    vi: Mauritanie
+    vo: Moritän
+    wa: Moritanreye
+    wo: Gànnaar
+    xh: Mauritania
+    yi: מאריטאניע
+    yo: Mauritáníà
+    zh: 毛里塔尼亚
+    zu: IMoritaniya
diff --git a/settings/country-names/ms.yaml b/settings/country-names/ms.yaml
new file mode 100644 (file)
index 0000000..e0601a6
--- /dev/null
@@ -0,0 +1,80 @@
+name: 
+    default: Montserrat
+    af: Montserrat
+    an: Isla de Montserrat
+    ar: مونتسرات
+    az: Montserrat
+    ba: Монтсеррат
+    be: Мантсерат
+    bg: Монсерат
+    br: Enez Montserrat
+    bs: Monserat
+    ca: Illa de Montserrat
+    cs: Montserrat
+    cy: Montserrat
+    da: Montserrat
+    de: Montserrat
+    dv: މޮންސެރާޓު
+    el: Μοντσερράτ
+    en: Montserrat
+    eo: Moncerato
+    es: Montserrat
+    et: Montserrat
+    eu: Montserrat
+    fa: مونتسرات
+    fi: Montserrat
+    fr: Montserrat
+    ga: Montsarat
+    gl: Illa Montserrat
+    he: מונטסראט
+    hi: मॉण्टसेराट
+    hr: Montserrat
+    ht: Montserrat
+    hu: Montserrat
+    hy: Մոնտսերատ
+    id: Montserrat
+    io: Montserrat
+    is: Montserrat
+    it: Montserrat
+    ja: モントセラト
+    jv: Montserrat
+    ka: მონსერატი
+    ko: 몬트세랫
+    kw: Montserrat
+    la: Montserrat
+    lb: Montserrat
+    li: Montserrat
+    lt: Montseratas
+    lv: Montserrata
+    mk: Монтсерат
+    mn: Монтсеррат
+    mr: माँटसेराट
+    ms: Montserrat
+    nl: Montserrat
+    nn: Montserrat
+    "no": Montserrat
+    oc: Montserrat
+    pa: ਮਾਂਟਸਰਾਤ
+    pl: Montserrat
+    pt: Montserrat
+    ro: Montserrat
+    ru: Монтсеррат
+    rw: Monserati
+    sh: Montserrat
+    sk: Montserrat
+    sl: Montserrat
+    sq: Montserrati
+    sr: Монтсерат
+    su: Montserrat
+    sv: Montserrat
+    ta: மொன்செராட்
+    th: มอนต์เซอร์รัต
+    tl: Montserrat
+    tr: Montserrat
+    ug: مونتسەررات
+    uk: Монтсеррат
+    ur: مانٹسریٹ
+    vi: Montserrat
+    wo: Montserrat
+    yo: Montserrat
+    zh: 蒙塞拉特島
diff --git a/settings/country-names/mt.yaml b/settings/country-names/mt.yaml
new file mode 100644 (file)
index 0000000..0e9658c
--- /dev/null
@@ -0,0 +1,79 @@
+name: 
+    default: Malta
+    ak: Mɔlta
+    am: ማልታ
+    ar: مالطا
+    be: Мальта
+    bg: Малта
+    bm: Malti
+    bn: মাল্টা
+    bo: མལ་ཊ།
+    br: Malta
+    ca: Malta
+    cs: Malta
+    de: Malta
+    dz: མཱལ་ཊ
+    ee: Malta nutome
+    el: Μάλτα
+    en: Malta
+    eo: Malto
+    es: Malta
+    fa: مالت
+    ff: Malte
+    fi: Malta
+    fr: Malte
+    ga: Málta
+    gu: માલ્ટા
+    gv: Yn Valta
+    he: מלטה
+    hi: माल्टा
+    hr: Malta
+    hu: Málta
+    hy: Մալթա
+    ia: Malta
+    io: Malta
+    is: Malta
+    it: Malta
+    ja: マルタ
+    ka: მალტა
+    km: ម៉ាល់តា
+    kn: ಮಾಲ್ಟಾ
+    ko: 몰타
+    ks: مالٹا
+    ku: Malta
+    la: Melita
+    lg: Malita
+    ln: Malitɛ
+    lo: ມັນຕາ
+    lv: Malta
+    mk: Малта
+    ml: മാൾട്ട
+    mn: Мальта
+    mr: माल्टा
+    ne: माल्टा
+    "no": Malta
+    or: ମାଲ୍ଟା
+    pl: Malta
+    rn: Malita
+    ru: Мальта
+    se: Malta
+    sg: Mâlta
+    si: මෝල්ටාව
+    sk: Malta
+    so: Maalda
+    sq: Maltë
+    sr: Малта
+    sv: Malta
+    ta: மால்டா
+    te: మాల్టా
+    tg: Малта
+    th: ประเทศมอลตา
+    ti: ማልታ
+    to: Malita
+    uk: Мальта
+    ur: مالٹا
+    vi: Malta
+    vo: Malteän
+    yo: Orílẹ́ède Malata
+    zh: 马尔他
+    zu: i-Malta
diff --git a/settings/country-names/mu.yaml b/settings/country-names/mu.yaml
new file mode 100644 (file)
index 0000000..1739a9e
--- /dev/null
@@ -0,0 +1,100 @@
+name: 
+    default: Mauritius
+    af: Mauritius
+    am: ሞሪሸስ
+    an: Mauricio
+    ar: موريشيوس
+    az: Mavriki
+    be: Маўрыкій
+    bg: Мавриций
+    bn: মরিশাস
+    bo: མའུ་རི་ཊིའུ་སུ།
+    br: Maoris
+    bs: Mauricijus
+    ca: Maurici
+    cs: Mauricius
+    cv: Маврики
+    da: Mauritius
+    de: Mauritius
+    dv: މޮރިޝަސް
+    el: Μαυρίκιος
+    en: Mauritius
+    eo: Maŭricio
+    es: Mauricio
+    eu: Maurizio
+    fa: موریس
+    fi: Mauritius
+    fo: Móritius
+    fr: Maurice
+    fy: Mauritsius
+    ga: Oileán Mhuirís
+    gd: Na h-Eileanan Mhoiriseas
+    gl: Mauricio - Maurice
+    gv: Ellan Wirrish
+    he: מאוריציוס
+    hi: मॉरिशस
+    hr: Mauricijus
+    ht: Moris
+    hu: Mauritius
+    hy: Մավրիկիոս
+    ia: Mauritio
+    io: Maurico
+    is: Máritíus
+    ja: モーリシャス
+    ka: მავრიკი
+    kk: Маврикий
+    kn: ಮಾರಿಷಸ್
+    ko: 모리셔스
+    ku: Maurîtius
+    kw: Ynys Morrys
+    la: Mauritia
+    ln: Morisi
+    lt: Mauricijus
+    lv: Maurīcija
+    mg: Maorisy
+    mk: Маврициус
+    ml: മൗറീഷ്യസ്
+    mn: Маврикий
+    mr: मॉरिशस
+    mt: Mawrizji
+    my: မောရစ်ရှနိုင်ငံ
+    ne: मौरिसस
+    nl: Mauritius
+    oc: Maurici
+    or: ମରିସସ
+    os: Маврикий
+    pa: ਮਾਰੀਸ਼ਸ
+    pl: Mauritius
+    ps: ماوریتوس
+    pt: Maurícia
+    qu: Mawrisyu
+    ru: Маврикий
+    rw: Morise
+    sa: मारिषस्
+    sc: Mauritzius
+    se: Mauritius
+    sg: Mörîsi
+    si: මුරුසි සමුහාණ්ඩුව
+    sk: Maurícius
+    sl: Mavricij
+    sq: Mauritiusi
+    sr: Маурицијус
+    ss: IMorishiyasi
+    sv: Mauritius
+    sw: Morisi
+    ta: மொரிசியசு
+    te: మారిషస్
+    tg: Маврикия
+    th: ประเทศมอริเชียส
+    tk: Mawrikiý
+    tl: Maurisyo
+    tt: Маврикий
+    ug: ماۋرىتىئۇس
+    uk: Маврикій
+    ur: موریشس
+    uz: Mavritsiya
+    vo: Moriseän
+    wo: Móoris
+    yo: Mọ́rísì
+    zh: 毛里求斯
+    zu: IMorishisi
diff --git a/settings/country-names/mv.yaml b/settings/country-names/mv.yaml
new file mode 100644 (file)
index 0000000..6f318a2
--- /dev/null
@@ -0,0 +1,102 @@
+name: 
+    default: ދިވެހިރާއްޖެ
+    af: Maldive
+    am: ማልዲቭስ
+    ar: ملديف
+    az: Maldiv
+    be: Мальдывы
+    bg: Малдиви
+    bm: Maldivi
+    bn: মালদ্বীপ
+    bo: མལ་དྭིབ།
+    br: Maldivez
+    bs: Maldivi
+    ca: Maldives
+    cs: Maledivy
+    da: Maldiverne
+    de: Malediven
+    dv: ދިވެހިރާއްޖެ
+    dz: མཱལ་དིབས
+    ee: maldivesdukɔ
+    el: Μαλδίβες
+    en: Maldives
+    eo: Maldivoj
+    es: Maldivas
+    et: Maldiivid
+    eu: Maldivak
+    fa: مالدیو
+    ff: Maldiiwe
+    fi: Malediivit
+    fo: Maldivuoyggjarnar
+    fr: Maldives
+    fy: de Maldiven
+    ga: Oileáin Mhaildíve
+    gd: Na h-Eileanan Mhaladaibh
+    gl: Maldivas
+    gu: માલદિવ્સ
+    gv: Ny Maldeevaghyn
+    ha: Maldibi
+    he: מלדיבים
+    hi: मालदीव
+    hr: Maldivi
+    hu: Maldív-szigetek
+    hy: Մալդիվներ
+    id: Maladewa
+    ig: Maldivesa
+    io: Maldivi
+    is: Maldíveyjar
+    it: Maldive
+    ka: მალდივის კუნძულები
+    ki: Modivu
+    km: ម៉ាល់ឌីវ
+    kn: ಮಾಲ್ಡಿವ್ಸ್
+    ks: مالدیٖو
+    ku: Maldîv
+    la: Insulae Maldivae
+    lb: Malediven
+    lg: Bizinga by'eMalidive
+    ln: Madívɛ
+    lo: ມັນດິຟ
+    lt: Maldyvai
+    lv: Maldīvija
+    mg: Maldiva
+    mk: Малдиви
+    ml: മാലിദ്വീപ്
+    mn: Мальдив
+    mr: मालदीव्ज
+    ms: Maldiv
+    my: မော်လဒိုက်
+    ne: माल्दिभ्स
+    nl: Malediven
+    nn: Maldivane
+    "no": Maldivene
+    or: ମାଳଦ୍ବୀପ
+    pl: Malediwy
+    pt: Maldivas
+    rm: Maldivas
+    rn: Moludave
+    ro: Maldive
+    ru: Мальдивы
+    se: Malediivvat
+    sg: Maldîva
+    si: මාල දිවයින
+    sk: Maledivy
+    sl: Maldivi
+    so: Maaldiqeen
+    sq: Maldivit
+    sr: Малдиви
+    sv: Maldiverna
+    sw: Modivu
+    ta: மாலத்தீவு
+    te: మాల్దీవులు
+    th: ประเทศมัลดีฟส์
+    ti: ማልዲቭስ
+    to: Malativisi
+    tr: Maldivler
+    tt: Мальдивлар
+    uk: Мальдіви
+    ur: مالدیو
+    vo: Maldivuäns
+    yo: Orílẹ́ède Maladifi
+    zh: 马尔代夫/馬爾地夫
+    zu: i-Maldives
diff --git a/settings/country-names/mw.yaml b/settings/country-names/mw.yaml
new file mode 100644 (file)
index 0000000..048bd8e
--- /dev/null
@@ -0,0 +1,125 @@
+name: 
+    default: Malawi
+    af: Malawi
+    am: ማላዊ
+    an: Malawi
+    ar: مالاوي
+    az: Malavi
+    ba: Малави
+    be: Малаві
+    bg: Малави
+    bm: Malawi
+    bn: মালাউই
+    bo: མ་ལ་ཝི།
+    br: Malawi
+    bs: Malavi
+    ca: Malawi
+    ce: Малави
+    cs: Malawi
+    cv: Малави
+    cy: Malawi
+    da: Malawi
+    de: Malawi
+    dv: މަލާވީ
+    ee: Malawi
+    el: Μαλάουι
+    en: Malawi
+    eo: Malavio
+    es: Malaui
+    et: Malawi
+    eu: Malawi
+    fa: مالاوی
+    fi: Malawi
+    fo: Malavi
+    fr: Malawi
+    fy: Malawy
+    ga: An Mhaláiv
+    gd: Malabhaidh
+    gl: Malaui - Malawi
+    gv: Malawi
+    he: מלאווי
+    hi: मलावी
+    hr: Malavi
+    ht: Malawi
+    hu: Malawi
+    hy: Մալավի
+    ia: Malawi
+    id: Malawi
+    ie: Malawi
+    io: Malawi
+    is: Malaví
+    it: Malawi
+    ja: マラウイ
+    jv: Malawi
+    ka: მალავი
+    kg: Malawi
+    ki: Malawi
+    kk: Малави
+    kn: ಮಲಾವಿ
+    ko: 말라위
+    ku: Malavî
+    kw: Malawi
+    la: Malavium
+    lb: Malawi
+    li: Malawi
+    ln: Malawi
+    lt: Malavis
+    lv: Malāvija
+    mg: Malawi
+    mi: Marāwi
+    mk: Малави
+    ml: മലാവി
+    mn: Малави
+    mr: मलावी
+    ms: Malawi
+    mt: Malawi
+    my: မာလဝီနိုင်ငံ
+    nl: Malawi
+    nn: Malawi
+    "no": Malawi
+    nv: Malááwii
+    ny: Malaŵi
+    oc: Malawi
+    os: Малави
+    pa: ਮਲਾਵੀ
+    pl: Malawi
+    ps: مالاوي
+    pt: Malawi
+    qu: Malawi
+    ro: Malawi
+    ru: Малави
+    rw: Malawi
+    sa: मलावी
+    sc: Malawi
+    se: Malawi
+    sg: Malawïi
+    sh: Malavi
+    sk: Malawi
+    sl: Malavi
+    sn: Malawi
+    so: Malaawi
+    sq: Malavi
+    sr: Малави
+    ss: IMalawi
+    su: Malawi
+    sv: Malawi
+    sw: Malawi
+    ta: மலாவி
+    tg: Малави
+    th: ประเทศมาลาวี
+    ti: ማላዊ
+    tk: Malawi
+    tl: Malawi
+    tr: Malavi
+    ts: Malawi
+    ug: مالاۋى
+    uk: Малаві
+    ur: ملاوی
+    uz: Malavi
+    vi: Malawi
+    vo: Malaviyän
+    wo: Malawi
+    yi: מאלאווי
+    yo: Màláwì
+    zh: 马拉维
+    zu: IMalawi
diff --git a/settings/country-names/mx.yaml b/settings/country-names/mx.yaml
new file mode 100644 (file)
index 0000000..51a0f46
--- /dev/null
@@ -0,0 +1,136 @@
+name: 
+    default: México
+    af: Meksiko
+    am: ሜክሲኮ
+    an: Mexico
+    ar: المكسيك
+    ay: Mïxiku
+    az: Meksika
+    ba: Мексика
+    be: Мексіка
+    bg: Мексико
+    bi: Mexico
+    bm: Mɛkisiki
+    bn: মেক্সিকো
+    bo: མེག་སི་ཀོ།
+    br: Mec'hiko
+    bs: Meksiko
+    ca: Mèxic
+    ce: Мексика
+    co: Messicu
+    cs: Mexiko
+    cv: Мексика
+    cy: Mexico
+    da: Mexico
+    de: Mexiko
+    dv: މެކްސިކޯ
+    dz: མེཀ་སི་ཀོ
+    ee: Mexico
+    el: Μεξικό
+    en: Mexico
+    eo: Meksiko
+    es: México
+    et: Mehhiko
+    eu: Mexiko
+    fa: مکزیک
+    fi: Meksiko
+    fo: Meksiko
+    fr: Mexique
+    fy: Meksiko
+    ga: Meicsiceo
+    gd: Meagsago
+    gl: México
+    gn: Méjiko
+    gu: મેક્સિકો
+    gv: Meksico
+    he: מקסיקו
+    hi: मेक्सिको
+    hr: Meksiko
+    ht: Meksik
+    hu: Mexikó
+    hy: Մեքսիկա
+    ia: Mexico
+    id: Meksiko
+    ik: Mexiqo
+    io: Mexikia
+    is: Mexíkó
+    it: Messico
+    iu: ᒦᒃᓰᖂ
+    ja: メキシコ
+    jv: Mèksiko
+    ka: მექსიკა
+    kk: Мексика
+    kl: Mexico
+    km: ម៉ិកស៊ិក
+    kn: ಮೆಕ್ಸಿಕೋ
+    ko: 멕시코
+    ku: Meksîk
+    kv: Мексика
+    kw: Meksiko
+    ky: Мексика
+    la: Mexicum
+    lb: Mexiko
+    li: Mexico
+    ln: Mexiko
+    lt: Meksika
+    lv: Meksika
+    mg: Meksika
+    mi: Mēhiko
+    mk: Мексико
+    ml: മെക്സിക്കോ
+    mn: Мексик
+    mr: मेक्सिको
+    ms: Mexico
+    mt: Messiku
+    my: မက္ကဆီကိုနိုင်ငံ
+    na: Meketiko
+    ne: मेक्सिको
+    nl: Mexico
+    nn: Mexico
+    "no": Mexico
+    nv: Méhigo
+    oc: Mexic
+    or: ମେକ୍ସିକୋ
+    os: Мексикæ
+    pa: ਮੈਕਸੀਕੋ
+    pl: Meksyk
+    pt: México
+    qu: Mishiku
+    rm: Mexico
+    ro: Mexic
+    ru: Мексика
+    rw: Megizike
+    sc: Mèssico
+    se: Meksiko
+    sh: Meksiko
+    sk: Mexiko
+    sl: Mehika
+    sm: Mexico
+    sn: Mexico
+    so: Meksiko
+    sq: Meksika
+    sr: Мексико
+    ss: IMekisikho
+    su: Méksiko
+    sv: Mexico
+    sw: Mexiko
+    ta: மெக்சிக்கோ
+    te: మెక్సికో
+    tg: Мексика
+    th: ประเทศเม็กซิโก
+    tk: Meksika
+    tl: Mehiko
+    tr: Meksika
+    tt: Мексика
+    tw: Mexico
+    ug: مېكسىكا
+    uk: Мексика
+    ur: میکسیکو
+    uz: Meksika
+    vi: México
+    vo: Mäxikän
+    wo: Meksik
+    yi: מעקסיקא
+    yo: Mẹ́ksíkò
+    zh: 墨西哥
+    zu: IMekisiko
diff --git a/settings/country-names/my.yaml b/settings/country-names/my.yaml
new file mode 100644 (file)
index 0000000..8e9ca68
--- /dev/null
@@ -0,0 +1,126 @@
+name: 
+    default: Malaysia
+    af: Maleisië
+    am: ማሌዢያ
+    an: Malaisia
+    ar: ماليزيا
+    az: Malayziya
+    ba: Малайзия
+    be: Малайзія
+    bg: Малайзия
+    bn: মালয়েশিয়া
+    bo: མ་ལ་ཤི་ཡ།
+    br: Malaysia
+    bs: Malezija
+    ca: Malàisia
+    ce: Малайзи
+    cs: Malajsie
+    cv: Малайзи
+    cy: Malaysia
+    da: Malaysia
+    de: Malaysia
+    dv: މެލޭޝިޔާ
+    dz: མ་ལེ་ཤི་ཡ་
+    el: Μαλαισία
+    en: Malaysia
+    eo: Malajzio
+    es: Malasia
+    et: Malaisia
+    eu: Malaysia
+    fa: مالزی
+    fi: Malesia
+    fo: Maleisia
+    fr: Malaisie
+    fy: Maleizje
+    ga: An Mhalaeisia
+    gd: Malaidhsia
+    gl: Malaisia
+    gu: મલેશિયા
+    gv: Yn Valaysia
+    he: מלזיה
+    hi: मलेशिया
+    hr: Malezija
+    ht: Malezi
+    hu: Malajzia
+    hy: Մալազիա
+    ia: Malaysia
+    id: Malaysia
+    ie: Malaysia
+    io: Malaizia
+    is: Malasía
+    it: Malesia
+    ja: マレーシア
+    jv: Malaysia
+    ka: მალაიზია
+    ki: Malaysia
+    kk: Малайзия
+    km: ម៉ាឡេស៊ី
+    kn: ಮಲೇಶಿಯ
+    ko: 말레이시아
+    ku: Malezya
+    kv: Малайзия
+    kw: Malaysi
+    ky: Малайзия
+    la: Malaesia
+    lb: Malaysia
+    li: Maleisië
+    lo: ປະເທດມາເລເຊຍ
+    lt: Malaizija
+    lv: Malaizija
+    mi: Marēhia
+    mk: Малезија
+    ml: മലേഷ്യ
+    mn: Малайз
+    mr: मलेशिया
+    ms: Maleisië
+    mt: Malażja
+    my: မလေးရှားနိုင်ငံ
+    na: Maraidja
+    ne: मलेशिया
+    nl: Maleisië
+    nn: Malaysia
+    "no": Malaysia
+    nv: Maléízha
+    oc: Malàisia
+    or: ମାଲେସିଆ
+    os: Малайзи
+    pa: ਮਲੇਸ਼ੀਆ
+    pl: Malezja
+    pt: Malásia
+    qu: Malasya
+    ro: Malaezia
+    ru: Малайзия
+    rw: Malesiya
+    sa: मलयेशिया
+    se: Malesia
+    sg: Malezïi
+    sh: Malezija
+    sk: Malajzia
+    sl: Malezija
+    so: Malaysiya
+    sq: Malajzia
+    sr: Малезија
+    ss: IMaleshiya
+    su: Malaysia
+    sv: Malaysia
+    sw: Malaysia
+    ta: மலேசியா
+    te: మలేషియా
+    tg: Малайзия
+    th: ประเทศมาเลเซีย
+    tk: Malaýziýa
+    tl: Malasya
+    tr: Malezya
+    tt: Малайзия
+    tw: Malaysia
+    ug: مالايسىيا
+    uk: Малайзія
+    ur: ملائیشیا
+    uz: Malayziya
+    vi: Malaysia
+    vo: Malaysiyän
+    wo: Maleesi
+    yi: מאלייזיע
+    yo: Malaysia
+    za: Majlaizsihya
+    zh: 马来西亚
diff --git a/settings/country-names/mz.yaml b/settings/country-names/mz.yaml
new file mode 100644 (file)
index 0000000..c58ea0f
--- /dev/null
@@ -0,0 +1,126 @@
+name: 
+    default: Moçambique
+    af: Mosambiek
+    am: ሞዛምቢክ
+    an: Mozambique
+    ar: موزمبيق
+    az: Mozambik
+    ba: Мозамбик
+    be: Мазамбік
+    bg: Мозамбик
+    bm: Mozanbik
+    bn: মোজাম্বিক
+    bo: མོ་ཛམ་བིཀ།
+    br: Mozambik
+    bs: Mozambik
+    ca: Moçambic
+    ce: Мозамбик
+    co: Mozambicu
+    cs: Mosambik
+    cv: Мозамбик
+    cy: Mosambic
+    da: Mozambique
+    de: Mosambik
+    dv: މުސިންބީ
+    el: Μοζαμβίκη
+    en: Mozambique
+    eo: Mozambiko
+    es: Mozambique
+    et: Mosambiik
+    eu: Mozambike
+    fa: موزامبیک
+    fi: Mosambik
+    fo: Mosambik
+    fr: Mozambique
+    fy: Mozambyk
+    ga: Poblacht Mhósaimbíc
+    gd: Mòsaimbic
+    gl: Mozambique
+    gn: Mosambike
+    gv: Yn Vosambeeck
+    he: מוזמביק
+    hi: मोज़ाम्बीक
+    hr: Mozambik
+    ht: Mozanbik
+    hu: Mozambik
+    hy: Մոզամբիկ
+    ia: Mozambique
+    id: Mozambik
+    ie: Mozambique
+    io: Mozambik
+    is: Mósambík
+    it: Mozambico
+    ja: モザンビーク
+    jv: Mozambik
+    ka: მოზამბიკი
+    kg: Musambiki
+    kk: Мозамбик
+    kn: ಮೊಜಾಂಬಿಕ್
+    ko: 모잠비크
+    ku: Mozambîk
+    kw: Mosambik
+    la: Mozambicum
+    lb: Mosambik
+    li: Mozambique
+    ln: Mozambíki
+    lt: Mozambikas
+    lv: Mozambika
+    mg: Mozambika
+    mi: Mohapiki
+    mk: Мозамбик
+    ml: മൊസാംബിക്ക്
+    mn: Мозамбик
+    mr: मोझांबिक
+    ms: Mozambique
+    mt: Możambik
+    my: မိုဇမ်ဘစ်နိုင်ငံ
+    nl: Mozambique
+    nn: Mosambik
+    "no": Mosambik
+    ny: Mozambique
+    oc: Moçambic
+    or: ମୋଜାମ୍ବିକ
+    os: Мозамбик
+    pa: ਮੋਜ਼ੈਂਬੀਕ
+    pl: Mozambik
+    ps: موزمبيق
+    pt: Moçambique
+    qu: Musambik
+    ro: Mozambic
+    ru: Мозамбик
+    rw: Mozambike
+    sa: मोजम्बीक
+    sc: Mozambico
+    se: Mosambik
+    sg: Mözämbîka
+    sh: Mozambik
+    sk: Mozambik
+    sl: Mozambik
+    sn: Mozambique
+    so: Musanbiig
+    sq: Mozambiku
+    sr: Мозамбик
+    ss: IMozambikhi
+    su: Mosambik
+    sv: Moçambique
+    sw: Msumbiji
+    ta: மொசாம்பிக்
+    tg: Мозамбик
+    th: ประเทศโมซัมบิก
+    ti: ሞዛምቢክ
+    tk: Mozambik
+    tl: Musambik
+    tr: Mozambik
+    ts: Mozambique
+    ug: موزامبىك
+    uk: Мозамбік
+    ur: موزمبیق
+    uz: Mozambik
+    ve: Mozambikwi
+    vi: Mozambique
+    vo: Mozambikän
+    wo: Mosambik
+    yi: מאזאמביק
+    yo: Mòsámbìk
+    zh: 莫桑比克
+    zu: IMozambiki
diff --git a/settings/country-names/na.yaml b/settings/country-names/na.yaml
new file mode 100644 (file)
index 0000000..c08bfca
--- /dev/null
@@ -0,0 +1,129 @@
+name: 
+    default: Namibia
+    af: Namibië
+    am: ናሚቢያ
+    an: Namibia
+    ar: ناميبيا
+    az: Namibiya
+    ba: Намибия
+    be: Намібія
+    bg: Намибия
+    bm: Namibia
+    bn: নামিবিয়া
+    bo: ན་མི་བྷི་ཡ།
+    br: Namibia
+    bs: Namibija
+    ca: Namíbia
+    ce: Намиби
+    cs: Namibie
+    cv: Намиби
+    cy: Namibia
+    da: Namibia
+    de: Namibia
+    el: Ναμίμπια
+    en: Namibia
+    eo: Namibio
+    es: Namibia
+    et: Namiibia
+    eu: Namibia
+    fa: نامیبیا
+    fi: Namibia
+    fo: Namibia
+    fr: Namibie
+    fy: Namybje
+    ga: An Namaib
+    gd: Naimibia
+    gl: Namibia
+    gv: Yn Nameeb
+    he: נמיביה
+    hi: नामीबिया
+    hr: Namibija
+    ht: Namibi
+    hu: Namíbia
+    hy: Նամիբիա
+    ia: Namibia
+    id: Namibia
+    ie: Namibia
+    io: Namibia
+    is: Namibía
+    it: Namibia
+    ja: ナミビア
+    jv: Namibia
+    ka: ნამიბია
+    kg: Namibia
+    ki: Namibia
+    kk: Намибия
+    kn: ನಮೀಬಿಯ
+    ko: 나미비아
+    ku: Namîbya
+    kw: Namibi
+    la: Namibia
+    lb: Namibien
+    li: Namibië
+    ln: Namibia
+    lt: Namibija
+    lv: Namībija
+    mg: Namibia
+    mi: Namīpia
+    mk: Намибија
+    ml: നമീബിയ
+    mn: Намиби
+    mr: नामिबिया
+    ms: Namibia
+    mt: Namibja
+    my: နမီးဘီးယားနိုင်ငံ
+    nl: Namibië
+    nn: Namibia
+    "no": Namibia
+    nv: Namííbya
+    oc: Namibia
+    or: ନାମିବିଆ
+    os: Намиби
+    pa: ਨਮੀਬੀਆ
+    pl: Namibia
+    ps: نېمبیا
+    pt: Namíbia
+    qu: Namiwya
+    rm: Namibia
+    ro: Namibia
+    ru: Намибия
+    rw: Namibiya
+    sa: नमीबिया
+    sc: Namìbia
+    se: Namibia
+    sg: Namibùii
+    sh: Namibija
+    sk: Namíbia
+    sl: Namibija
+    sn: Namibia
+    so: Nambiya
+    sq: Namibia
+    sr: Намибија
+    ss: INamibiya
+    st: Namibia
+    su: Namibia
+    sv: Namibia
+    sw: Namibia
+    ta: நமீபியா
+    te: నమీబియా
+    tg: Намибия
+    th: ประเทศนามิเบีย
+    ti: ናሚቢያ
+    tk: Namibiýa
+    tl: Namibya
+    tn: Namibia
+    tr: Namibya
+    ts: Namibia
+    tt: Намибия
+    ug: نامىبىيە
+    uk: Намібія
+    ur: نمیبیا
+    uz: Namibiya
+    ve: Namibia
+    vi: Namibia
+    vo: Namibiyän
+    wo: Namibi
+    yi: נאמיביע
+    yo: Nàmíbíà
+    zh: 纳米比亚
+    zu: INamibhiya
diff --git a/settings/country-names/nc.yaml b/settings/country-names/nc.yaml
new file mode 100644 (file)
index 0000000..cb5d3fb
--- /dev/null
@@ -0,0 +1,37 @@
+name: 
+    default: Nouvelle-Calédonie
+    af: Nieu-Caledonia
+    ar: كاليدونيا الجديدة
+    be: Новая Каледонія
+    br: Kaledonia Nevez
+    ca: Nova Caledònia
+    cy: Caledonia Newydd
+    da: Ny Kaledonien
+    de: Neukaledonien
+    el: Νέα Καληδονία
+    en: New Caledonia
+    eo: Nov-Kaledonio
+    es: Nueva Caledonia
+    fa: کالدونیای جدید
+    fi: Uusi-Kaledonia
+    fr: Nouvelle-Calédonie
+    ga: An Nua-Chaladóin
+    he: קלדוניה החדשה
+    hr: Nova Kaledonija
+    hu: Új-Kaledónia
+    id: Kaledonia Baru
+    is: Nýja-Kaledónía
+    it: Nuova Caledonia
+    la: Nova Caledonia
+    lt: Naujoji Kaledonija
+    lv: Jaunkaledonija
+    mn: Шинэ Каледони
+    nl: Nieuw-Caledonië
+    pl: Nowa Kaledonia
+    ru: Новая Каледония
+    sl: Nova Kaledonija
+    sv: Nya Kaledonien
+    th: นิวแคลิโดเนีย
+    tr: Yeni Kaledonya
+    uk: Нова Каледонія
+    zh: 新喀里多尼亚
diff --git a/settings/country-names/ne.yaml b/settings/country-names/ne.yaml
new file mode 100644 (file)
index 0000000..cabcaa0
--- /dev/null
@@ -0,0 +1,125 @@
+name: 
+    default: Niger
+    af: Niger
+    am: ኒጄር
+    an: Nícher
+    ar: النيجر
+    az: Niger
+    ba: Нигер
+    be: Нігер
+    bg: Нигер
+    bm: Nijer
+    bn: নাইজার
+    bo: ནི་ཇར།
+    br: Niger
+    bs: Niger
+    ca: Níger
+    ce: Нигер
+    cs: Niger
+    cy: Niger
+    da: Niger
+    de: Niger
+    dv: ނީޖަރު
+    ee: Niger
+    el: Νίγηρας
+    en: Niger
+    eo: Niĝero
+    es: Níger
+    et: Niger
+    eu: Niger
+    fa: نیجر
+    fi: Niger
+    fo: Niger
+    fr: Niger
+    fy: Niger
+    ga: An Nígir
+    gd: Nìgeir
+    gl: Níxer
+    gu: નાઈજર
+    gv: Yn Neegeyr
+    ha: Nijar
+    he: ניז'ר
+    hi: नाइजर
+    hr: Niger
+    ht: Nijè
+    hu: Niger
+    hy: Նիգեր
+    ia: Niger
+    id: Niger
+    ie: Niger
+    ig: Niger
+    io: Nijer
+    is: Níger
+    it: Niger
+    ja: ニジェール
+    jv: Niger
+    ka: ნიგერი
+    kg: Nijer
+    kk: Нигер
+    ko: 니제르
+    ku: Nîjer
+    kw: Pow Nijer
+    la: Niger
+    lb: Niger
+    li: Niger
+    ln: Nizer
+    lt: Nigeris
+    lv: Nigēra
+    mi: Ngāika
+    mk: Нигер
+    ml: നീഷർ
+    mn: Нигер
+    mr: नायजर
+    ms: Niger
+    mt: Niġer
+    my: နိုင်ဂျာနိုင်ငံ
+    nl: Niger
+    nn: Niger
+    "no": Niger
+    oc: Nigèr
+    or: ନାଇଜର
+    os: Нигер
+    pa: ਨਾਈਜਰ
+    pl: Niger
+    ps: نایجېر
+    pt: Níger
+    qu: Niqir
+    ro: Niger
+    ru: Нигер
+    rw: Nigeri
+    sa: नीजे
+    sc: Nixèr
+    se: Niger
+    sg: Nizëre
+    sh: Niger
+    si: නයිජර්
+    sk: Niger
+    sl: Niger
+    sn: Niger
+    so: Nayjar
+    sq: Nigeri
+    sr: Нигер
+    ss: INayijari
+    su: Niger
+    sv: Niger
+    sw: Niger
+    ta: நைஜர்
+    te: నైజర్
+    tg: Ниҷер
+    th: ประเทศไนเจอร์
+    ti: ናይጀር
+    tk: Niger
+    tl: Niyer
+    tr: Nijer
+    ts: Niger
+    ug: نىگېر
+    uk: Нігер
+    ur: نائجر
+    uz: Niger
+    vi: Niger
+    vo: Nigerän
+    wo: Niseer
+    yi: ניזשער
+    yo: Nìjẹ̀r
+    zh: 尼日尔
+    zu: INayighe
diff --git a/settings/country-names/nf.yaml b/settings/country-names/nf.yaml
new file mode 100644 (file)
index 0000000..ded79bb
--- /dev/null
@@ -0,0 +1,36 @@
+name: 
+    default: Norfolk Island
+    af: Norfolkeiland
+    ar: جزيرة نورفولك
+    be: Норфалк
+    br: Enez Norfolk
+    ca: Illa Norfolk
+    cy: Ynys Norfolk
+    da: Norfolk-øen
+    de: Norfolkinsel
+    en: Norfolk Island
+    eo: Norfolkinsulo
+    es: Isla Norfolk
+    et: Norfolki saar
+    fi: Norfolkinsaari
+    fr: Île Norfolk
+    fy: Norfolk
+    ga: Oileán Norfolk
+    he: האי נורפוק
+    hr: Otok Norfolk
+    hu: Norfolk-sziget
+    id: Pulau Norfolk
+    is: Norfolkeyja
+    it: Isola Norfolk
+    la: Insula Norfolcia
+    lt: Norfolko sala
+    lv: Norfolkas sala
+    mn: Норфолк Арал
+    nl: Norfolk
+    pl: Wyspa Norfolk
+    ru: Остров Норфолк
+    sv: Norfolkön
+    tr: Norfolk Adası
+    uk: Острів Норфолк
+    vi: Đảo Norfolk
+    zh: 诺福克岛
diff --git a/settings/country-names/ng.yaml b/settings/country-names/ng.yaml
new file mode 100644 (file)
index 0000000..ac0d177
--- /dev/null
@@ -0,0 +1,135 @@
+name: 
+    default: Nigeria
+    af: Nigerië
+    ak: Nigeria
+    am: ናይጄሪያ
+    an: Nicheria
+    ar: نيجيريا
+    az: Nigeriya
+    ba: Нигерия
+    be: Нігерыя
+    bg: Нигерия
+    bm: Nijeria
+    bn: নাইজেরিয়া
+    bo: ནི་ཇི་རི་ཡ།
+    br: Nigeria
+    bs: Nigerija
+    ca: Nigèria
+    ce: Нигери
+    cs: Nigérie
+    cv: Нигери
+    cy: Nigeria
+    da: Nigeria
+    de: Nigeria
+    dv: ނައިޖީރިއާ
+    ee: Nigeria
+    el: Νιγηρία
+    en: Nigeria
+    eo: Niĝerio
+    es: Nigeria
+    et: Nigeeria
+    eu: Nigeria
+    fa: نیجریه
+    ff: Niiseriya
+    fi: Nigeria
+    fo: Nigeria
+    fr: Nigéria
+    fy: Nigearia
+    ga: An Nigéir
+    gd: Nìgeiria
+    gl: Nixeria
+    gn: Niheria
+    gu: નાઈજેરિયા
+    gv: Yn Naigeer
+    ha: Nijeriya
+    he: ניגריה
+    hi: नाईजीरिया
+    hr: Nigerija
+    ht: Nijerya
+    hu: Nigéria
+    hy: Նիգերիա
+    ia: Nigeria
+    id: Nigeria
+    ie: Nigeria
+    ig: Naigeria
+    io: Nigeria
+    is: Nígería
+    it: Nigeria
+    ja: ナイジェリア
+    jv: Nigeria
+    ka: ნიგერია
+    kg: Nizeria
+    kk: Нигерия
+    kn: ನೈಜೀರಿಯ
+    ko: 나이지리아
+    ks: نایجیرِیا
+    ku: Nîjerya
+    kw: Nijeri
+    la: Nigeria
+    lb: Nigeria
+    li: Nigeria
+    ln: Nizeria
+    lt: Nigerija
+    lv: Nigērija
+    mg: Nizeria
+    mi: Ngāitiria
+    mk: Нигерија
+    ml: നൈജീരിയ
+    mn: Нигери
+    mr: नायजेरिया
+    ms: Nigeria
+    mt: Niġerja
+    my: နိုင်ဂျီးရီးယားနိုင်ငံ
+    ne: नाइजेरिया
+    nl: Nigeria
+    nn: Nigeria
+    "no": Nigeria
+    oc: Nigèria
+    or: ନାଇଜେରିଆ
+    os: Нигери
+    pa: ਨਾਈਜੀਰੀਆ
+    pl: Nigeria
+    ps: نايجېريا
+    pt: Nigéria
+    qu: Niqirya
+    ro: Nigeria
+    ru: Нигерия
+    rw: Nijeriya
+    sa: नैजीरिया
+    sc: Nigéria
+    se: Nigeria
+    sg: Nizerïa
+    sh: Nigerija
+    sk: Nigéria
+    sl: Nigerija
+    sn: Nigeria
+    so: Nayjeeriya
+    sq: Nigeria
+    sr: Нигерија
+    ss: INayijeriya
+    su: Nigeria
+    sv: Nigeria
+    sw: Nigeria
+    ta: நைஜீரியா
+    te: నైజీరియా
+    tg: Ниҷерия
+    th: ประเทศไนจีเรีย
+    ti: ናይጂሪያ
+    tk: Nigeriýa
+    tl: Nigerya
+    tr: Nijerya
+    ts: Nigeria
+    tt: Нигерия
+    ug: نىگېرىيە
+    uk: Нігерія
+    ur: نائجیریا
+    uz: Nigeriya
+    vi: Nigeria
+    vo: Nigeriyän
+    wa: Nidjeria
+    xh: INigeria
+    yi: ניגעריע
+    yo: Nàìjíríà
+    za: Nizywlihya
+    zh: 奈及利亞
+    zu: INigeria
diff --git a/settings/country-names/ni.yaml b/settings/country-names/ni.yaml
new file mode 100644 (file)
index 0000000..52b0dd0
--- /dev/null
@@ -0,0 +1,119 @@
+name: 
+    default: Nicaragua
+    af: Nicaragua
+    am: ኒካራጓ
+    an: Nicaragua
+    ar: نيكاراجوا
+    ay: Nikarwa
+    az: Nikaraqua
+    ba: Никарагуа
+    be: Нікарагуа
+    bg: Никарагуа
+    bm: Nikaragwa
+    bn: নিকারাগুয়া
+    bo: ནི་ཀ་ར་གུ་ཝ།
+    br: Nicaragua
+    bs: Nikaragva
+    ca: Nicaragua
+    ce: Никарагуа
+    cs: Nikaragua
+    cy: Nicaragua
+    da: Nicaragua
+    de: Nicaragua
+    dv: ނިކަރާގުއާ
+    ee: Nicaragua
+    el: Νικαράγουα
+    en: Nicaragua
+    eo: Nikaragvo
+    es: Nicaragua
+    et: Nicaragua
+    eu: Nikaragua
+    fa: نیکاراگوئه
+    fi: Nicaragua
+    fo: Nikaragua
+    fr: Nicaragua
+    fy: Nikaragûa
+    ga: Nicearagua
+    gd: Niocaragua
+    gl: Nicaragua
+    gn: Nikaragua
+    gv: Yn Nickeraag
+    he: ניקרגואה
+    hi: निकारागुआ
+    hr: Nikaragva
+    ht: Nikaragwa
+    hu: Nicaragua
+    hy: Նիկարագուա
+    ia: Nicaragua
+    id: Nikaragua
+    ie: Nicaragua
+    io: Nikaragua
+    is: Níkaragva
+    it: Nicaragua
+    ja: ニカラグア
+    jv: Nikaragua
+    ka: ნიკარაგუა
+    kk: Никарагуа
+    ko: 니카라과
+    ku: Nîkaragua
+    kv: Никарагуа
+    kw: Nikaragwa
+    la: Nicaragua
+    lb: Nicaragua
+    li: Nicaragua
+    ln: Nikalagwa
+    lt: Nikaragva
+    lv: Nikaragva
+    mg: Nicaragua
+    mi: Nikarāhua
+    mk: Никарагва
+    ml: നിക്കരാഗ്വ
+    mn: Никарагуа
+    mr: निकाराग्वा
+    ms: Nicaragua
+    mt: Nikaragwa
+    my: နီကာရာဂွါနိုင်ငံ
+    ne: निकाराग्वा
+    nl: Nicaragua
+    nn: Nicaragua
+    "no": Nicaragua
+    oc: Nicaragua
+    or: ନିକାରାଗୁଆ
+    os: Никарагуæ
+    pa: ਨਿਕਾਰਾਗੁਆ
+    pl: Nikaragua
+    ps: نیکاراګوا
+    pt: Nicarágua
+    qu: Nikarawa
+    ro: Nicaragua
+    ru: Никарагуа
+    rw: Nikaragwa
+    sa: निकारगुवा
+    se: Nicaragua
+    sh: Nikaragva
+    sk: Nikaragua
+    sl: Nikaragva
+    so: Nikaragua
+    sq: Nikaraguaja
+    sr: Никарагва
+    ss: INikhalaga
+    su: Nikaragua
+    sv: Nicaragua
+    sw: Nikaragua
+    ta: நிக்கராகுவா
+    tg: Никарагуа
+    th: ประเทศนิการากัว
+    tl: Nicaragua
+    tr: Nikaragua
+    tt: Никарагуа
+    ug: نىكاراگۇئا
+    uk: Нікарагуа
+    ur: نکاراگوا
+    uz: Nikaragua
+    vi: Nicaragua
+    vo: Nikaraguvän
+    wo: Nikaraaguwa
+    yi: ניקאראגוא
+    yo: Nikarágúà
+    zh: 尼加拉瓜
+    zu: Nicaragua
diff --git a/settings/country-names/nl.yaml b/settings/country-names/nl.yaml
new file mode 100644 (file)
index 0000000..919e086
--- /dev/null
@@ -0,0 +1,140 @@
+name: 
+    default: Nederland
+    af: Nederland
+    am: ሆላንድ
+    an: Países Baixos
+    ar: هولندا
+    ay: Aynacha Jach'a Markanaka
+    az: Niderland
+    ba: Нидерландтар
+    be: Нідэрланды
+    bg: Нидерландия
+    bh: एम्सटर्डम
+    bi: Netherlands
+    bn: নেদারল্যান্ডস
+    bo: ཧོ་ལན།
+    br: Izelvroioù
+    bs: Holandija
+    ca: Països Baixos
+    ce: Нидерландаш
+    co: Paesi Bassi
+    cs: Nizozemsko
+    cu: Нидєрландꙑ
+    cv: Нидерландсем
+    cy: Yr Iseldiroedd
+    da: Holland
+    de: Niederlande
+    dv: ނެދަލޭންޑު
+    dz: ནེ་དར་ལེནཌསི་
+    ee: Netherlands
+    el: Κάτω Χώρες
+    en: Netherlands
+    eo: Nederlando
+    es: Países Bajos
+    et: Holland
+    eu: Herbehereak
+    fa: هلند
+    ff: Holannda
+    fi: Alankomaat
+    fo: Niðurlond
+    fr: Pays-Bas
+    fy: Nederlân
+    ga: An Ísiltír
+    gd: Na Tìrean Ìsle
+    gl: Países Baixos
+    gn: Tetãnguéra Yvýi
+    gu: નેધરલેંડ
+    gv: Yn Çheer Injil
+    he: הולנד
+    hi: नीदरलैण्ड
+    hr: Nizozemska
+    ht: Peyiba
+    hu: Hollandia
+    hy: Նիդերլանդներ
+    ia: Pais Basse
+    id: Belanda
+    ie: Nederland
+    io: Nederlando
+    is: Holland
+    it: Paesi Bassi
+    ja: オランダ
+    jv: Walanda
+    ka: ნიდერლანდი
+    kg: Pays-Bas
+    kk: Нидерланд
+    kl: Hollandi
+    kn: ನೆದರ್‍ಲ್ಯಾಂಡ್ಸ್
+    ko: 네덜란드
+    ks: नेदरलैंड्स
+    ku: Holenda
+    kv: Нидерландъяс
+    kw: Iseldiryow
+    ky: Нидерландтар
+    la: Nederlandia
+    lb: Holland
+    li: Nederland
+    ln: Holanda
+    lt: Nyderlandai
+    lv: Nīderlande
+    mi: Hōrana
+    mk: Холандија
+    ml: നെതർലന്റ്സ്
+    mn: Нидерланд
+    mr: नेदरलँड्स
+    ms: Belanda
+    mt: Pajjiżi l-Baxxi
+    my: နယ်သာလန်နိုင်ငံ
+    na: Eben Eyong
+    ne: नेदरल्याण्ड्स
+    nl: Nederland
+    nn: Nederland
+    "no": Nederland
+    nv: Tsin Bikeeʼ Dineʼé Bikéyah
+    oc: Païses Basses
+    os: Нидерландтæ
+    pa: ਨੀਦਰਲੈਂਡ
+    pl: Królestwo Niderlandów
+    ps: هالنډ
+    pt: Países Baixos
+    qu: Urasuyu
+    rm: Pajais Bass
+    ro: Țările de Jos
+    ru: Нидерланды
+    rw: Ubuholandi
+    sa: नेदरलैंड्स
+    sc: Logos Bascios
+    se: Vuolleeatnamat
+    sh: Holandija
+    si: නෙදර්ලන්තය
+    sk: Holandsko
+    sl: Nizozemska
+    so: Holland
+    sq: Holanda
+    sr: Холандија
+    ss: IDashi
+    st: Hôlanê
+    su: Walanda
+    sv: Nederländerna
+    sw: Uholanzi
+    ta: நெதர்லாந்து
+    te: నెదర్లాండ్
+    tg: Нидерланд
+    th: ประเทศเนเธอร์แลนด์
+    tk: Niderlandlar
+    tl: Olanda
+    to: Holani
+    tr: Hollanda
+    tt: Нидерландлар
+    ug: گوللاندىيە
+    uk: Нідерланди
+    ur: ہالینڈ
+    uz: Niderlandlar
+    vi: Hà Lan
+    vo: Nedän
+    wa: Bas Payis
+    wo: Olaand
+    xh: ENetherlands
+    yi: האלאנד
+    yo: Nẹ́dálándì
+    zh: 荷蘭
+    zu: Netherlands
diff --git a/settings/country-names/no.yaml b/settings/country-names/no.yaml
new file mode 100644 (file)
index 0000000..8325329
--- /dev/null
@@ -0,0 +1,142 @@
+name:
+    default: Norge
+    af: Noorweë
+    am: ኖርዌይ
+    an: Noruega
+    ar: النرويج
+    ay: Nurweka
+    az: Norveç
+    ba: Норвегия
+    be: Нарвегія
+    bg: Норвегия
+    bi: Norway
+    bm: Norwij
+    bn: নরওয়ে
+    bo: ནོར་ཝེ།
+    br: Norvegia
+    bs: Norveška
+    ca: Noruega
+    ce: Норвеги
+    co: Nurvegia
+    cs: Norsko
+    cu: Норєгъ
+    cv: Норвеги
+    cy: Norwy
+    da: Norge
+    de: Norwegen
+    dv: ނޯވޭ
+    dz: ནོ་ཝེ་
+    ee: Norway
+    el: Νορβηγία
+    en: Norway
+    eo: Norvegio
+    es: Noruega
+    et: Norra
+    eu: Norvegia
+    fa: نروژ
+    fi: Norja
+    fo: Noregur
+    fr: Norvège
+    fy: Noarwegen
+    ga: An Iorua
+    gd: Nirribhidh
+    gl: Noruega
+    gn: Noruega
+    gu: નોર્વે
+    gv: Norlynn
+    he: נורבגיה
+    hi: नॉर्वे
+    hr: Norveška
+    ht: Nòvèj
+    hu: Norvégia
+    hy: Նորվեգիա
+    ia: Norvegia
+    id: Norwegia
+    ie: Norvegia
+    io: Norvegia
+    is: Noregur
+    it: Norvegia
+    iu: ᓄᕐᒋ
+    ja: ノルウェー
+    jv: Norwégia
+    ka: ნორვეგია
+    kg: Norge
+    kk: Норвегия
+    kl: Norge
+    kn: ನಾರ್ವೇ
+    ko: 노르웨이
+    ku: Norwêc
+    kv: Норвегия
+    kw: Norgagh
+    ky: Норвегия
+    la: Norvegia
+    lb: Norwegen
+    li: Noorwege
+    ln: Norvej
+    lt: Norvegija
+    lv: Norvēģija
+    mg: Norvezy
+    mi: Nōwei
+    mk: Норвешка
+    ml: നോർവെ
+    mn: Норвеги
+    mr: नॉर्वे
+    ms: Norway
+    mt: Norveġja
+    my: နော်ဝေနိုင်ငံ
+    na: Norwei
+    nb: Norge
+    ne: नर्वे
+    nl: Noorwegen
+    nn: Noreg
+    "no": Norge
+    oc: Norvègia
+    om: Norway
+    or: ନରୱେ
+    os: Норвеги
+    pa: ਨਾਰਵੇ
+    pl: Norwegia
+    ps: ناروې
+    pt: Noruega
+    qu: Nurwiga
+    rm: Norvegia
+    rn: Noruega
+    ro: Norvegia
+    ru: Норвегия
+    rw: Noruveje
+    sa: नार्वे
+    sc: Norvegia
+    se: Norga
+    sh: Norveška
+    sk: Nórsko
+    sl: Norveška
+    so: Norway
+    sq: Norvegjia
+    sr: Норвешка
+    ss: INoweyi
+    su: Norwégia
+    sv: Norge
+    sw: Norwei
+    ta: நோர்வே
+    te: నార్వే
+    tg: Норвегия
+    th: ประเทศนอร์เวย์
+    tk: Norwegiýa
+    tl: Noruwega
+    tr: Norveç
+    ts: Norge
+    tt: Норвегия
+    ug: نورۋېگىيە
+    uk: Норвегія
+    ur: ناروے
+    uz: Norvegiya
+    vi: Na Uy
+    vo: Norgän
+    wa: Norvedje
+    wo: Noorwees
+    yi: נארוועגיע
+    yo: Nọ́rwèy
+    za: Nozveih
+    zh: 挪威
+    zu: INoki
+
diff --git a/settings/country-names/np.yaml b/settings/country-names/np.yaml
new file mode 100644 (file)
index 0000000..919f7c9
--- /dev/null
@@ -0,0 +1,29 @@
+name: 
+    default: Nepal
+    ar: نيبال
+    be: Непал
+    br: Nepal
+    el: Νεπάλ
+    en: Nepal
+    eo: Nepalo
+    fa: نپال
+    fi: Nepal
+    fr: Népal
+    ga: Neipeal
+    gd: Neapàl
+    he: נפאל
+    hu: Nepál
+    is: Nepal
+    it: Nepal
+    ja: ネパール
+    la: Nepalia
+    lt: Nepalas
+    lv: Nepāla
+    mn: Балба
+    ne: नेपाल
+    pl: Nepal
+    ru: Непал
+    sv: Nepal
+    th: ประเทศเนปาล
+    uk: Непал
+    zh: 尼泊尔
diff --git a/settings/country-names/nr.yaml b/settings/country-names/nr.yaml
new file mode 100644 (file)
index 0000000..659f2c0
--- /dev/null
@@ -0,0 +1,43 @@
+name: 
+    default: Naoero
+    am: ናውሩ
+    ar: ناورو
+    be: Наўру
+    bg: Науру
+    bn: নাউরু
+    br: Nauru
+    cs: Nauru
+    da: Nauru
+    de: Nauru
+    dv: ނައުރޫ
+    el: Ναουρού
+    en: Nauru
+    eo: Nauro
+    fa: نائورو
+    fi: Nauru
+    fr: Nauru
+    fy: Naurû
+    ga: Nárú
+    he: נאורו
+    hi: नाउरु
+    hr: Nauru
+    hu: Nauru
+    is: Nárú
+    ja: ナウル
+    li: Naoeroe
+    lv: Nauru
+    ml: നൗറു
+    mn: Науру
+    mt: Nawru
+    pl: Nauru
+    ru: Науру
+    se: Nauru
+    sk: Nauru
+    sq: Naurua
+    sv: Nauru
+    ta: நவூரு
+    th: ประเทศนาอูรู
+    uk: Науру
+    ur: ناورو
+    vo: Naureän
+    zh: 諾魯
diff --git a/settings/country-names/nu.yaml b/settings/country-names/nu.yaml
new file mode 100644 (file)
index 0000000..52db44b
--- /dev/null
@@ -0,0 +1,48 @@
+name: 
+    default: Niuē
+    ar: نييوي
+    be: Ніуэ
+    bg: Ниуе
+    br: Niue
+    cs: Niue
+    da: Niue
+    de: Niue
+    dv: ނީއު
+    el: Νιούε
+    en: Niue
+    eo: Niuo
+    es: Niue
+    fa: نیووی
+    fi: Niue
+    fr: Niue
+    fy: Niûé
+    ga: Niue
+    he: ניואה
+    hr: Niue
+    hu: Niue
+    is: Niue
+    ja: ニウエ
+    ka: ნიუე
+    kk: Ниуе
+    ko: 니우에
+    ku: Niûe
+    lt: Niujė
+    lv: Niue
+    mk: Ниуе
+    ml: നിയുവെ
+    mn: Ниуэ
+    mr: न्युए
+    os: Ниуэ
+    pl: Niue
+    ru: Ниуэ
+    rw: Niyuwe
+    sk: Niue
+    sr: Нијуе
+    sv: Niue
+    ta: நியுவே
+    th: นีอูเอ
+    ug: Niué Arili
+    uk: Ніуе
+    ur: نیووے
+    wo: Niwe
+    zh: 紐埃
diff --git a/settings/country-names/nz.yaml b/settings/country-names/nz.yaml
new file mode 100644 (file)
index 0000000..29a4482
--- /dev/null
@@ -0,0 +1,126 @@
+name: 
+    default: New Zealand / Aotearoa
+    af: Nieu-Seeland
+    am: ኒው ዚላንድ
+    an: Nueva Zelanda
+    ar: نيوزيلندا
+    az: Yeni Zelandiya
+    ba: Яңы Зеландия
+    be: Новая Зеландыя
+    bg: Нова Зеландия
+    bi: Niu Zilan
+    bm: New Zealand
+    bn: নিউজিল্যান্ড
+    bo: ནིའུ་ཛི་ལེན་ཌི།
+    br: Zeland-Nevez
+    bs: Novi Zeland
+    ca: Nova Zelanda
+    cs: Nový Zéland
+    cv: Çĕнĕ Зеланди
+    cy: Seland Newydd
+    da: New Zealand
+    de: Neuseeland
+    dv: ނިއުޒިލޭންޑު
+    dz: ནིའུ་ཛི་ལེནཌ་
+    el: Νέα Ζηλανδία
+    en: New Zealand
+    eo: Nov-Zelando
+    es: Nueva Zelanda
+    et: Uus-Meremaa
+    eu: Zeelanda Berria
+    fa: نیوزیلند
+    fi: Uusi-Seelanti
+    fo: Nýsæland
+    fr: Nouvelle-Zélande
+    fy: Nij-Seelân
+    ga: An Nua-Shéalainn
+    gd: Sealainn Nuadh
+    gl: Nova Zelandia
+    gv: Yn Teelynn Noa
+    he: ניו זילנד
+    hi: न्यूज़ीलैण्ड
+    hr: Novi Zeland
+    ht: Nouvèl Zelann
+    hu: Új-Zéland
+    hy: Նոր Զելանդիա
+    ia: Nove Zelanda
+    id: Selandia Baru
+    ie: Nov-Zeland
+    io: Nova-Zelando
+    is: Nýja-Sjáland
+    it: Nuova Zelanda
+    ja: ニュージーランド
+    jv: Sélandia Anyar
+    ka: ახალი ზელანდია
+    kk: Жаңа Зеландия
+    kl: New Zealand
+    km: នូវែលសេឡង់
+    kn: ನ್ಯೂ ಜೀಲ್ಯಾಂಡ್
+    ko: 뉴질랜드
+    ku: Nû Zelenda
+    kv: Выль Зеландия
+    kw: Mordir Nowydh
+    la: Nova Zelandia
+    lb: Neiséiland
+    li: Nui-Zieland
+    lo: ປະເທດນູແວນ ເຊລັງ
+    lt: Naujoji Zelandija
+    lv: Jaunzēlande
+    mi: Aotearoa
+    mk: Нов Зеланд
+    ml: ന്യൂസീലൻഡ്
+    mn: Шинэ Зеланд
+    mr: न्यू झीलँड
+    ms: New Zealand
+    mt: New Zealand
+    my: နယူးဇီလန်နိုင်ငံ
+    na: Niu Djiran
+    ne: न्यू जील्याण्ड
+    nl: Nieuw-Zeeland
+    nn: New Zealand
+    "no": New Zealand
+    oc: Nòva Zelanda
+    or: ନିଉଜିଲ୍ୟାଣ୍ଡ
+    os: Ног Зеланди
+    pa: ਨਿਊਜ਼ੀਲੈਂਡ
+    pl: Nowa Zelandia
+    pt: Nova Zelândia
+    qu: Musuq Silanda
+    rm: Nova Zelanda
+    ro: Noua Zeelandă
+    ru: Новая Зеландия
+    rw: Nuveli Zelande
+    sa: न्यू-जीलैंड
+    se: Aotearoa
+    sh: Novi Zeland
+    sk: Nový Zéland
+    sl: Nova Zelandija
+    sm: Niu Sila
+    so: New Zealand
+    sq: Zelanda e Re
+    sr: Нови Зеланд
+    su: Selandia Anyar
+    sv: Nya Zeeland
+    sw: New Zealand
+    ta: நியூசிலாந்து
+    te: న్యూజీలాండ్
+    tg: Зеландияи Нав
+    th: ประเทศนิวซีแลนด์
+    tk: Täze Zelandiýa
+    tl: New Zealand
+    tr: Yeni Zelanda
+    tt: Яңа Зеландия
+    ty: Aotearoa
+    ug: يېڭى زېلاندىيە
+    uk: Нова Зеландія
+    ur: نیوزی لینڈ
+    uz: Yangi Zelandiya
+    vi: New Zealand
+    vo: Nula-Seleäns
+    wa: Nouve Zelande
+    wo: Seland-Gu-Bees
+    yi: ניו זילאנד
+    yo: New Zealand
+    za: Saen Saelanz
+    zh: 新西兰
+    zu: INyuzilandi
diff --git a/settings/country-names/om.yaml b/settings/country-names/om.yaml
new file mode 100644 (file)
index 0000000..a27ecc9
--- /dev/null
@@ -0,0 +1,120 @@
+name: 
+    default: عمان
+    af: Oman
+    am: ኦማን
+    an: Omán
+    ar: عمان
+    az: Oman
+    ba: Оман
+    be: Аман
+    bg: Оман
+    bn: ওমান
+    bo: ཨོ་མན།
+    br: Oman
+    bs: Oman
+    ca: Oman
+    ce: Оман
+    cs: Omán
+    cv: Оман
+    cy: Oman
+    da: Oman
+    de: Oman
+    dv: ޢުމާން
+    el: Ομάν
+    en: Oman
+    eo: Omano
+    es: Omán
+    et: Omaan
+    eu: Oman
+    fa: عمان
+    fi: Oman
+    fr: Oman
+    fy: Oman
+    ga: Óman
+    gd: Omàn
+    gl: Omán
+    gn: Omã
+    gu: ઓમાન
+    gv: Yn Omaan
+    he: עומאן
+    hi: ओमान
+    hr: Oman
+    ht: Omàn
+    hu: Omán
+    hy: Օման
+    ia: Oman
+    id: Oman
+    ie: Oman
+    io: Oman
+    is: Óman
+    it: Oman
+    ja: オマーン
+    jv: Oman
+    ka: ომანი
+    kk: Оман
+    kl: Oman
+    kn: ಒಮಾನ್
+    ko: 오만
+    ku: Oman
+    kv: Оман
+    kw: Oman
+    la: Omania
+    lb: Oman
+    li: Omaan
+    ln: Oman
+    lt: Omanas
+    lv: Omāna
+    mi: Omāna
+    mk: Оман
+    ml: ഒമാൻ
+    mn: Оман
+    mr: ओमान
+    ms: Oman
+    my: အိုမန်နိုင်ငံ
+    na: Oman
+    nl: Oman
+    nn: Oman
+    "no": Oman
+    nv: Omą́ą́
+    oc: Oman
+    or: ଓମାନ
+    os: Оман
+    pa: ਓਮਾਨ
+    pl: Oman
+    ps: عمان
+    pt: Omã
+    qu: Uman
+    ro: Oman
+    ru: Оман
+    rw: Omani
+    sa: ओमान
+    se: Oman
+    sh: Oman
+    si: ඕමානය
+    sk: Omán
+    sl: Oman
+    so: Cumaan
+    sq: Omani
+    sr: Оман
+    ss: IMani
+    su: Oman
+    sv: Oman
+    sw: Omani
+    ta: ஓமான்
+    te: ఒమన్
+    tg: Оман
+    th: ประเทศโอมาน
+    tk: Oman
+    tl: Oman
+    tr: Umman
+    tt: Оман
+    ug: ئومان
+    uk: Оман
+    ur: سلطنت عمان
+    uz: Oman
+    vi: Oman
+    vo: Lomän
+    wo: Omaan
+    yi: אמאן
+    yo: Oman
+    zh: 阿曼
diff --git a/settings/country-names/pa.yaml b/settings/country-names/pa.yaml
new file mode 100644 (file)
index 0000000..1cba5e5
--- /dev/null
@@ -0,0 +1,123 @@
+name: 
+    default: Panamá
+    af: Panama
+    am: ፓናማ
+    an: Panamá
+    ar: بنما
+    ay: Panama
+    az: Panama
+    ba: Панама
+    be: Панама
+    bg: Панама
+    bm: Panama
+    bn: পানামা
+    bo: པ་ན་མ།
+    br: Panamá
+    bs: Panama
+    ca: Panamà
+    ce: Панама
+    cs: Panama
+    cv: Панама
+    cy: Panama
+    da: Panama
+    de: Panama
+    dv: ޕެނަމާ
+    ee: Panama
+    el: Παναμάς
+    en: Panama
+    eo: Panamo
+    es: Panamá
+    et: Panama
+    eu: Panama
+    fa: پاناما
+    fi: Panama
+    fo: Panama
+    fr: Panamá
+    fy: Panama
+    ga: Panama
+    gd: Panama
+    gl: Panamá
+    gn: Panama
+    gu: પનામા
+    gv: Yn Phanamaa
+    he: פנמה
+    hi: पनामा
+    hr: Panama
+    ht: Panama
+    hu: Panama
+    hy: Պանամա
+    ia: Panama
+    id: Panama
+    ie: Panamá
+    io: Panama
+    is: Panama
+    it: Panamá
+    ja: パナマ
+    jv: Panama
+    ka: პანამა
+    ki: Panama
+    kk: Панама
+    kn: ಪನಾಮಾ
+    ko: 파나마
+    ku: Panama
+    kw: Panama
+    la: Panama
+    lb: Panama
+    li: Panama
+    ln: Panama
+    lt: Panama
+    lv: Panama
+    mg: Panama
+    mi: Panama
+    mk: Панама
+    ml: പനാമ
+    mn: Панам
+    mr: पनामा
+    ms: Panama
+    mt: Panama
+    my: ပနားမားနိုင်ငံ
+    ne: पानामा
+    nl: Panama
+    nn: Panama
+    "no": Panama
+    oc: Panamà
+    or: ପାନାମା
+    os: Панамæ
+    pa: ਪਨਾਮਾ
+    pl: Panama
+    ps: پاناما
+    pt: Panamá
+    qu: Panama
+    ro: Panama
+    ru: Панама
+    rw: Panama
+    sa: पानामा
+    se: Panama
+    sh: Panama
+    sk: Panama
+    sl: Panama
+    so: Banama
+    sq: Panamaja
+    sr: Панама
+    ss: IPhanama
+    su: Panama
+    sv: Panama
+    sw: Panama
+    ta: பனாமா
+    te: పనామా
+    tg: Панама
+    th: ประเทศปานามา
+    tl: Panama
+    tr: Panama
+    tt: Панама
+    ug: پاناما
+    uk: Панама
+    ur: پاناما
+    uz: Panama
+    vi: Panama
+    vo: Panamän
+    wo: Panamaa
+    yi: פאנאמא
+    yo: Panamá
+    zh: 巴拿马
+    zu: Panama
diff --git a/settings/country-names/pe.yaml b/settings/country-names/pe.yaml
new file mode 100644 (file)
index 0000000..de39e9f
--- /dev/null
@@ -0,0 +1,137 @@
+name: 
+    default: Perú
+    ab: Перу
+    af: Peru
+    ak: Peru
+    am: ፔሩ
+    an: Perú
+    ar: بيرو
+    ay: Piruw
+    az: Peru
+    ba: Перу
+    be: Перу
+    bg: Перу
+    bi: Peru
+    bm: Peru
+    bn: পেরু
+    bo: པེ་རུ།
+    br: Perou
+    bs: Peru
+    ca: Perú
+    ce: Перу
+    ch: Perú
+    co: Perù
+    cs: Peru
+    cv: Перу
+    cy: Periw
+    da: Peru
+    de: Peru
+    dv: ޕެރޫ
+    ee: Peru
+    el: Περού
+    en: Peru
+    eo: Peruo
+    es: Perú
+    et: Peruu
+    eu: Peru
+    fa: پرو
+    ff: Peru
+    fi: Peru
+    fo: Peru
+    fr: Pérou
+    fy: Perû
+    ga: Peiriú
+    gd: Pearù
+    gl: Perú
+    gn: Perũ
+    gu: પેરુ
+    gv: Yn Pheroo
+    he: פרו
+    hi: पेरू
+    hr: Peru
+    ht: Pewou
+    hu: Peru
+    hy: Պերու
+    ia: Peru
+    id: Peru
+    ie: Perú
+    io: Peru
+    is: Perú
+    it: Perù
+    iu: ᐱᕉ
+    ja: ペルー
+    jv: Peru
+    ka: პერუ
+    ki: Peru
+    kk: Перу
+    kl: Peru
+    kn: ಪೆರು
+    ko: 페루
+    ku: Perû
+    kv: Перу
+    kw: Perou
+    ky: Перу
+    la: Peruvia
+    lb: Peru
+    li: Peru
+    ln: Peru
+    lt: Peru
+    lv: Peru
+    mi: Perū
+    mk: Перу
+    ml: പെറു
+    mn: Перу
+    mr: पेरू
+    ms: Peru
+    mt: Perù
+    my: ပီရူးနိုင်ငံ
+    na: Peru
+    ne: पेरू
+    nl: Peru
+    nn: Peru
+    "no": Peru
+    oc: Peró
+    or: ପେରୁ
+    os: Перу
+    pa: ਪੇਰੂ
+    pl: Peru
+    ps: پيرو
+    pt: Peru
+    qu: Piruw
+    rm: Peru
+    ro: Peru
+    ru: Перу
+    rw: Peru
+    sa: पेरु
+    se: Peru
+    sh: Peru
+    si: පේරූ
+    sk: Peru
+    sl: Peru
+    sn: Peru
+    so: Peru
+    sq: Peruja
+    sr: Перу
+    ss: IPheru
+    su: Péru
+    sv: Peru
+    sw: Peru
+    ta: பெரு
+    te: పెరూ
+    tg: Перу
+    th: ประเทศเปรู
+    tk: Peru
+    tl: Peru
+    tr: Peru
+    tt: Перу
+    ug: پېرۇ
+    uk: Перу
+    ur: پیرو
+    uz: Peru
+    vi: Peru
+    vo: Peruvän
+    wo: Peru
+    yi: פערו
+    yo: Perú
+    zh: 秘鲁
+    zu: Peru
diff --git a/settings/country-names/pf.yaml b/settings/country-names/pf.yaml
new file mode 100644 (file)
index 0000000..506d677
--- /dev/null
@@ -0,0 +1,77 @@
+name: 
+    default: Polynésie française
+    af: Franse Polynesië
+    an: Polinesia Franzesa
+    ar: بولونيزيا الفرنسية
+    az: Fransa Polineziyası
+    be: Французская Палінезія
+    bg: Френска Полинезия
+    br: Polinezia Frañs
+    bs: Francuska Polinezija
+    ca: Polinèsia Francesa
+    cs: Francouzská Polynésie
+    cy: Polynesia Ffrengig
+    da: Fransk Polynesien
+    de: Französisch-Polynesien
+    dv: ފަރަންސޭސި ޕޮލިނޭޝިއާ
+    el: Γαλλική Πολυνησία
+    en: French Polynesia
+    eo: Franca Polinezio
+    es: Polinesia Francesa
+    et: Prantsuse Polüneesia
+    eu: Frantziar Polinesia
+    fa: پلی‌نزی فرانسه
+    fi: Ranskan Polynesia
+    fr: Polynésie française
+    fy: Frânsk Polyneezje
+    ga: Polainéis na Fraince
+    gd: French Polynesia
+    gl: Polinesia francesa
+    he: פולינזיה הצרפתית
+    hi: फ्रेंच पोलीनेशिया
+    hr: Francuska Polinezija
+    hu: Francia Polinézia
+    id: Polinesia Perancis
+    io: Franca Polinezia
+    is: Franska Pólýnesía
+    it: Polinesia francese
+    ja: フランス領ポリネシア
+    jv: Polinesia Perancis
+    kk: Франция Полинезиясы
+    ko: 프랑스령 폴리네시아
+    kw: Polynesi Frynkek
+    la: Polynesia Francica
+    lb: Franséisch-Polynesien
+    lt: Prancūzijos Polinezija
+    lv: Franču Polinēzija
+    mi: Porinīhia Wīwī
+    mk: Француска Полинезија
+    mn: Францын Полинез
+    mr: फ्रेंच पॉलिनेशिया
+    ms: Polinesia Perancis
+    nl: Frans-Polynesië
+    nn: Fransk Polynesia
+    "no": Fransk Polynesia
+    oc: Polinesia Francesa
+    os: Францы Полинези
+    pl: Polinezja Francuska
+    pt: Polinésia Francesa
+    qu: Phransis Pulinisya
+    ro: Polinezia Franceză
+    ru: Французская Полинезия
+    se: Frankriikka Polynesia
+    sh: Francuska Polinezija
+    sk: Francúzska Polynézia
+    sl: Francoska Polinezija
+    sr: Француска Полинезија
+    sv: Franska Polynesien
+    sw: Polynesia ya Kifaransa
+    ta: பிரெஞ்சு பொலினீசியா
+    th: เฟรนช์โปลินีเซีย
+    tr: Fransız Polinezyası
+    ty: Pōrīnetia Farāni
+    ug: Fransiyige Qarashliq Polinéziye
+    uk: Французька Полінезія
+    vi: Polynésie thuộc Pháp
+    wo: Polineesi gu Faraas
+    zh: 法属波利尼西亚
diff --git a/settings/country-names/pg.yaml b/settings/country-names/pg.yaml
new file mode 100644 (file)
index 0000000..b7e3050
--- /dev/null
@@ -0,0 +1,110 @@
+name: 
+    default: Papua Niugini
+    af: Papoea-Nieu-Guinee
+    am: ፓፑዋ ኒው ጊኒ
+    an: Papua y Nueva Guinea
+    ar: بابوا غينيا الجديدة
+    az: Papua-Yeni Qvineya
+    ba: Папуа — Яңы Гвинея
+    be: Папуа — Новая Гвінея
+    bg: Папуа Нова Гвинея
+    bi: Papua New Guinea
+    bn: পাপুয়া নিউ গিনি
+    bo: པ་པུ་འ་ནིའུ་གི་ནེ།
+    br: Papoua Ginea-Nevez
+    bs: Papua Nova Gvineja
+    ca: Papua Nova Guinea
+    ce: Папуа — Керла Гвине
+    cs: Papua Nová Guinea
+    cu: Папоуа · Нова Гвинєꙗ
+    cy: Papua Guinea Newydd
+    da: Papua Ny Guinea
+    de: Papua-Neuguinea
+    dv: ޕަޕުއާ ނިއު ގިނީ
+    el: Παπούα Νέα Γουινέα
+    en: Papua New Guinea
+    eo: Papuo-Nov-Gvineo
+    es: Papua-Nueva Guinea
+    et: Paapua Uus-Guinea
+    eu: Papua Ginea Berria
+    fa: پاپوآ گینه نو
+    fi: Papua-Uusi-Guinea
+    fo: Papua Nýguinea
+    fr: Papouasie-Nouvelle-Guinée
+    fy: Papoea Nij-Guineä
+    ga: Nua-Ghuine Phapua
+    gd: Gini Nuadh Phaputhach
+    gl: Papúa Nova Guinea
+    gv: Papooey Guinea Noa
+    he: פפואה גינאה החדשה
+    hi: पापुआ न्यू गिनी
+    hr: Papua Nova Gvineja
+    ht: Papwazi-Nouvèl-Gine
+    hu: Pápua Új-Guinea
+    hy: Պապուա Նոր Գվինեա
+    ia: Papua Nove Guinea
+    id: Papua Nugini
+    io: Papua-Nova-Guinea
+    is: Papúa Nýja-Gínea
+    it: Papua Nuova Guinea
+    ja: パプアニューギニア
+    jv: Papua Nugini
+    ka: პაპუა-ახალი გვინეა
+    kk: Папуа Жаңа Гвинея
+    kn: ಪಾಪುಅ ನ್ಯೂ ಗಿನಿ
+    ko: 파푸아 뉴기니
+    ku: Papua Gîneya Nû
+    ky: Папуа-Жаӊы-Гвинея.
+    la: Papua Nova Guinea
+    lb: Papua-Neiguinea
+    li: Papoea-Nui-Guinea
+    lt: Papua Naujoji Gvinėja
+    lv: Papua-Jaungvineja
+    mi: Papua Nūkini
+    mk: Папуа Нова Гвинеја
+    ml: പാപുവ ന്യൂ ഗിനിയ
+    mn: Папуа-Шинэ Гвиней
+    mr: पापुआ न्यू गिनी
+    ms: Papua New Guinea
+    mt: Papwa Gwinea l-Ġdida
+    my: ပါပူအာနယူးဂီနီနိုင်ငံ
+    na: Papua New Guinea
+    nl: Papoea-Nieuw-Guinea
+    nn: Papua Ny-Guinea
+    "no": Papua Ny-Guinea
+    nv: Páápowa Bigíní Ániidí
+    oc: Papoa-Nòva Guinèa
+    os: Папуæ — Ног Гвиней
+    pa: ਪਾਪੂਆ ਨਿਊ ਗਿਨੀ
+    pl: Papua-Nowa Gwinea
+    pt: Papua-Nova Guiné
+    qu: Papwa Ñukini
+    ro: Papua Noua Guinee
+    ru: Папуа - Новая Гвинея
+    rw: Papuwa Nuveli Gineya
+    sa: पपुवा न्यू गिनी
+    se: Papua-Ođđa-Guinea
+    sg: Papû Finî Ginëe
+    sh: Papua Nova Gvineja
+    sk: Papua-Nová Guinea
+    sl: Papua Nova Gvineja
+    sm: Papua
+    sq: Papua Guinea e Re
+    sr: Папуа Нова Гвинеја
+    su: Papua Nugini
+    sv: Papua Nya Guinea
+    sw: Papua Guinea Mpya
+    ta: பப்புவா நியூ கினி
+    th: ประเทศปาปัวนิวกินี
+    tl: Papua Bagong Ginea
+    tr: Papua Yeni Gine
+    tt: Папуа — Яңа Гвинея
+    ug: پاپۇئا يېڭى گۋىنېيە
+    uk: Папуа Нова Ґвінея
+    ur: پاپوا نیو گنی
+    uz: Papua Yangi Gvineya
+    vi: Papua New Guinea
+    vo: Papuveän Nula-Gineyän
+    wo: Papuwaasi-Gine-Gu-Bees
+    yo: Papua Guinea Titun
+    zh: 巴布亚新几内亚 / 巴布亞紐幾內亞 / 巴布亞新畿內亞
diff --git a/settings/country-names/ph.yaml b/settings/country-names/ph.yaml
new file mode 100644 (file)
index 0000000..9b173f5
--- /dev/null
@@ -0,0 +1,126 @@
+name: 
+    default: Philippines
+    af: Filippyne
+    am: ፊሊፒንስ
+    an: Filipinas
+    ar: الفلبين
+    az: Filippin
+    be: Філіпіны
+    bg: Филипини
+    bn: ফিলিপাইন
+    bo: ཧྥི་ལི་པིན།
+    br: Filipinez
+    bs: Filipini
+    ca: Filipines
+    ce: Филиппин
+    cs: Filipíny
+    cv: Филиппин
+    cy: Pilipinas
+    da: Filippinerne
+    de: Philippinen
+    dv: ފިލިޕީންސް
+    el: Φιλιππίνες
+    en: Philippines
+    eo: Filipinoj
+    es: Filipinas
+    et: Filipiinid
+    eu: Filipinak
+    fa: فیلیپین
+    fi: Filippiinit
+    fo: Filipsoyggjar
+    fr: Philippines
+    fy: Filipinen
+    ga: Na hOileáin Fhilipíneacha
+    gd: Na h-Eileanan Filipineach
+    gl: Filipinas
+    gn: Filipina
+    gu: ફીલીપાઈન્સ
+    gv: Ny h-Ellanyn Philippeenagh
+    he: הפיליפינים
+    hi: फ़िलीपीन्स
+    hr: Filipini
+    ht: Filipin
+    hu: Fülöp-szigetek
+    hy: Ֆիլիպիններ
+    ia: Philippinas
+    id: Filipina
+    ie: Filipines
+    io: Filipini
+    is: Filippseyjar
+    it: Filippine
+    ja: フィリピン
+    jv: Filipina
+    ka: ფილიპინები
+    kk: Филиппиндер
+    kl: Philippines
+    km: ហ្វីលីពីន
+    kn: ಫಿಲಿಪ್ಪೀನ್ಸ್
+    ko: 필리핀
+    ku: Filîpîn
+    kv: Филиппинъяс
+    kw: Filipinys
+    la: Philippinae
+    lb: Philippinen
+    li: Filipiene
+    lt: Filipinai
+    lv: Filipīnas
+    mg: Filipina
+    mi: Piripīni
+    mk: Филипини
+    ml: ഫിലിപ്പീൻസ്
+    mn: Филиппин
+    mr: फिलिपाईन्स
+    ms: Filipina
+    my: ဖိလစ်ပိုင်နိုင်ငံ
+    na: Eben Piripin
+    ne: फिलिपिन्स
+    nl: Filipijnen
+    nn: Filippinane
+    "no": Filippinene
+    nv: Kéyah Dańlíinii
+    oc: Filipinas
+    or: ଫିଲିପାଇନ୍ସ
+    os: Филиппинтæ
+    pa: ਫ਼ਿਲਪੀਨਜ਼
+    pl: Filipiny
+    ps: فلېپين
+    pt: Filipinas
+    qu: Philipinakuna
+    ro: Filipine
+    ru: Филиппины
+    rw: Filipine
+    sa: कलिंगद्वीप
+    se: Filippiinnat
+    sg: Filipîni
+    sh: Filipini
+    si: පිලිපීනය
+    sk: Filipíny
+    sl: Filipini
+    sm: Filipaina
+    so: Filibiin
+    sq: Filipinet
+    sr: Филипини
+    ss: IFiliphayi
+    su: Pilipina
+    sv: Filippinerna
+    sw: Ufilipino
+    ta: பிலிப்பீன்சு
+    te: ఫిలిప్పీన్స్
+    tg: Филиппин
+    th: ประเทศฟิลิปปินส์
+    tk: Filippinler
+    tl: Pilipinas
+    tr: Filipinler
+    tt: Филиппиннар
+    ug: فىلىپپىن
+    uk: Філіппіни
+    ur: فلپائن
+    uz: Filippin
+    vi: Philippines
+    vo: Filipuäns
+    wa: Filipenes
+    wo: Filipiin
+    yi: פיליפינען
+    yo: Filipínì
+    za: Feihlizbinh
+    zh: 菲律宾 / 菲律賓
diff --git a/settings/country-names/pk.yaml b/settings/country-names/pk.yaml
new file mode 100644 (file)
index 0000000..935b84d
--- /dev/null
@@ -0,0 +1,135 @@
+name: 
+    default: پاکستان
+    af: Pakistan
+    am: ፓኪስታን
+    an: Pakistán
+    ar: باكستان
+    as: পাকিস্তান
+    az: Pakistan
+    ba: Пакистан
+    be: Пакістан
+    bg: Пакистан
+    bh: पाकिस्तान
+    bn: পাকিস্তান
+    bo: པ་ཀི་སི་ཐན
+    br: Pakistan
+    bs: Pakistan
+    ca: Pakistan
+    ce: Пакистан
+    cs: Pákistán
+    cv: Пакистан
+    cy: Pakistan
+    da: Pakistan
+    de: Pakistan
+    dv: ޕާކިސްތާން
+    el: Πακιστάν
+    en: Pakistan
+    eo: Pakistano
+    es: Pakistán
+    et: Pakistan
+    eu: Pakistan
+    fa: پاکستان
+    fi: Pakistan
+    fo: Pakistan
+    fr: Pakistan
+    fy: Pakistan
+    ga: An Phacastáin
+    gd: Pagastàn
+    gl: Paquistán
+    gn: Pakistán
+    gu: પાકિસ્તાન
+    gv: Yn Phakistaan
+    ha: Pakistan
+    he: פקיסטן
+    hi: पाकिस्तान
+    hr: Pakistan
+    ht: Pakistan
+    hu: Pakisztán
+    hy: Պակիստան
+    ia: Pakistan
+    id: Pakistan
+    ie: Pakistan
+    io: Pakistan
+    is: Pakistan
+    it: Pakistan
+    iu: ᐸᑭᔅᑕᓐ
+    ja: パキスタン
+    jv: Pakistan
+    ka: პაკისტანი
+    ki: Pakistan
+    kk: Пәкістан
+    kl: Pakistan
+    km: ប៉ាគីស្ថាន
+    kn: ಪಾಕಿಸ್ತಾನ
+    ko: 파키스탄
+    ks: پاکِستان
+    ku: Pakistan
+    kv: Пакистан
+    kw: Pakistan
+    ky: Пакистан
+    la: Pakistania
+    lb: Pakistan
+    li: Pakistan
+    ln: Pakistáni
+    lt: Pakistanas
+    lv: Pakistāna
+    mi: Pakitāne
+    mk: Пакистан
+    ml: പാകിസ്താൻ
+    mn: Пакистан
+    mr: पाकिस्तान
+    ms: Pakistan
+    mt: Pakistan
+    my: ပါကစ္စတန်နိုင်ငံ
+    na: Pakistan
+    nb: Pakistan
+    ne: पाकिस्तान
+    nl: Pakistan
+    nn: Pakistan
+    "no": Pakistan
+    nv: Eʼeʼaahjí Naakaii Dootłʼizhí Bikéyah
+    oc: Paquistan
+    or: ପାକିସ୍ଥାନ
+    os: Пакистан
+    pa: ਪਾਕਿਸਤਾਨ
+    pl: Pakistan
+    ps: پاکستان
+    pt: Paquistão
+    qu: Pakistan
+    ro: Pakistan
+    ru: Пакистан
+    rw: Pakisitani
+    sa: पाकिस्तानम्
+    sd: پاڪستان
+    se: Pakistan
+    sh: Pakistan
+    si: පාකිස්ථානය
+    sk: Pakistan
+    sl: Pakistan
+    so: Bakistaan
+    sq: Pakistani
+    sr: Пакистан
+    ss: IPhakhistani
+    su: Pakistan
+    sv: Pakistan
+    sw: Pakistan
+    ta: பாக்கித்தான்
+    te: పాకిస్తాన్
+    tg: Покистон
+    th: ประเทศปากีสถาน
+    tk: Päkistan
+    tl: Pakistan
+    tr: Pakistan
+    tt: Пакъстан
+    ug: پاكىستان
+    uk: Пакистан
+    ur: ‏پاکستان‎
+    uz: Pokiston
+    vi: Pakistan
+    vo: Pakistän
+    wa: Pakistan
+    wo: Pakistaan
+    yi: פאקיסטאן
+    yo: Pakístàn
+    zh: 巴基斯坦
+    zu: IPakistani
diff --git a/settings/country-names/pl.yaml b/settings/country-names/pl.yaml
new file mode 100644 (file)
index 0000000..c8330a3
--- /dev/null
@@ -0,0 +1,147 @@
+name: 
+    default: Polska
+    ab: Полша
+    af: Pole
+    ak: Poland
+    am: ፖላንድ
+    an: Polonia
+    ar: بولندا
+    ay: Puluña
+    az: Polşa
+    ba: Польша
+    be: Польшча
+    bg: Полша
+    bi: Poland
+    bn: পোল্যান্ড
+    bo: ཕོ་ལན།
+    br: Polonia
+    bs: Poljska
+    ca: Polònia
+    ce: Польша
+    co: Polonia
+    cs: Polsko
+    cu: Пол҄ьска
+    cv: Польша
+    cy: Gwlad Pwyl
+    da: Polen
+    de: Polen
+    dv: ޕޮލެންޑު
+    ee: Poland
+    el: Πολωνία
+    en: Poland
+    eo: Pollando
+    es: Polonia
+    et: Poola
+    eu: Polonia
+    fa: لهستان
+    ff: Poloonya
+    fi: Puola
+    fo: Pólland
+    fr: Pologne
+    fy: Poalen
+    ga: An Pholainn
+    gd: A' Phòlainn
+    gl: Polonia
+    gn: Poloña
+    gu: પોલેંડ
+    gv: Yn Pholynn
+    ha: Poland
+    he: פולין
+    hi: पोलैंड
+    hr: Poljska
+    ht: Polòy
+    hu: Lengyelország
+    hy: Լեհաստան
+    ia: Polonia
+    id: Polandia
+    ie: Polonia
+    ig: Poland
+    io: Polonia
+    is: Pólland
+    it: Polonia
+    iu: ᐳᓚᓐᑦ
+    ja: ポーランド
+    jv: Polandia
+    ka: პოლონეთი
+    kg: Pologne
+    kk: Польша
+    kl: Poleni
+    km: ប្រទេសប៉ូឡូញ
+    kn: ಪೋಲೆಂಡ್
+    ko: 폴란드
+    ku: Polonya
+    kv: Польша
+    kw: Poloni
+    ky: Польша
+    la: Polonia
+    lb: Polen
+    lg: Bupoolo
+    li: Pole
+    ln: Poloni
+    lt: Lenkija
+    lv: Polija
+    mg: Polonia
+    mi: Pōrana
+    mk: Полска
+    ml: പോളണ്ട്
+    mn: Польш
+    mr: पोलंड
+    ms: Poland
+    mt: Polonja
+    my: ပိုလန်နိုင်ငံ
+    na: Poran
+    ne: पोल्याण्ड
+    nl: Polen
+    nn: Polen
+    "no": Polen
+    nv: Póolish Dineʼé Bikéyah
+    oc: Polonha
+    or: ପୋଲାଣ୍ଡ
+    os: Польшæ
+    pa: ਪੋਲੈਂਡ
+    pl: Polska
+    ps: پولنډ
+    pt: Polónia
+    qu: Pulunya
+    rm: Pologna
+    rn: Polonia
+    ro: Polonia
+    ru: Польша
+    rw: Polonye
+    sa: पोलैंड
+    sc: Polonia
+    se: Polska
+    sg: Pölôni
+    sh: Poljska
+    si: පෝලන්තය
+    sk: Poľsko
+    sl: Poljska
+    sm: Polagi
+    so: Boland
+    sq: Polonia
+    sr: Пољска
+    ss: IPholandi
+    st: Poland
+    su: Polandia
+    sv: Polen
+    sw: Poland
+    ta: போலந்து
+    te: పోలాండ్
+    tg: Лаҳистон
+    th: ประเทศโปแลนด์
+    tk: Polşa
+    tl: Polonya
+    tr: Polonya
+    tt: Польша
+    ug: پولشا
+    uk: Польща
+    ur: پولینڈ
+    uz: Polsha
+    vi: Ba Lan
+    vo: Polän
+    wa: Pologne
+    wo: Poloñ
+    yi: פוילן
+    yo: Polandi
+    zh: 波兰
+    zu: IPolandi
diff --git a/settings/country-names/pm.yaml b/settings/country-names/pm.yaml
new file mode 100644 (file)
index 0000000..876110b
--- /dev/null
@@ -0,0 +1,19 @@
+name: 
+    default: Saint-Pierre-et-Miquelon
+    af: Saint-Pierre et Miquelon
+    be: Святы П’ер і Міквелон
+    da: Saint Pierre og Miquelon
+    de: Saint-Pierre und Miquelon
+    en: Saint Pierre and Miquelon
+    eo: Sankta-Piero kaj Mikelono
+    es: San Pedro y Miguelón
+    fi: Saint-Pierre ja Miquelon
+    fr: Saint-Pierre-et-Miquelon
+    hr: Sveti Petar i Mikelon
+    hu: Saint-Pierre és Miquelon
+    lt: Sen Pjeras ir Mikelonas
+    lv: Senpjēra un Mikelona
+    mn: Сент Пьер ба Микелон
+    sv: Saint-Pierre och Miquelon
+    tr: Saint-Pierre ve Miquelon
+    uk: Сен-П'єр і Мікелон
diff --git a/settings/country-names/pn.yaml b/settings/country-names/pn.yaml
new file mode 100644 (file)
index 0000000..ca005c9
--- /dev/null
@@ -0,0 +1,42 @@
+name: 
+    default: Pitcairn Islands
+    ar: بتكايرن
+    be: Піткерн
+    br: Inizi Pitcairn
+    ca: Illes Pitcairn
+    cs: Pitcairnovy ostrovy
+    cy: Ynysoedd Pitcairn
+    da: Pitcairn
+    de: Pitcairninseln
+    el: Νήσοι Πίτκαιρν
+    en: Pitcairn Islands
+    eo: Pitkarna Insularo
+    es: Islas Pitcairn
+    fa: پیت‌کرن
+    fi: Pitcairn
+    fr: Îles Pitcairn
+    fy: de Pitcairneilannen
+    ga: Oileán Pitcairn
+    gd: Eilean Pitcairn
+    he: פיטקרן
+    hr: Pitcairnovo Otočje
+    hu: Pitcairn-szigetek
+    id: Kepulauan Pitcairn
+    is: Pitcairn
+    it: Isole Pitcairn
+    la: Pitcairn Insulae
+    lt: Pitkerno salos
+    lv: Pitkērna
+    mi: Pitikeina
+    mk: Питкерн
+    mn: Питкэрн Арлууд
+    nl: Pitcairneilanden
+    pl: Wyspy Pitcairn
+    ru: Острова Питкэрн
+    sl: Pitcairnovi otoki
+    sv: Pitcairnöarna
+    th: หมู่เกาะพิตแคร์น
+    tr: Pitcairn Adaları
+    uk: Острови Піткерн
+    vi: Quần đảo Pitcairn
+    zh: 皮特凯恩群岛
diff --git a/settings/country-names/pr.yaml b/settings/country-names/pr.yaml
new file mode 100644 (file)
index 0000000..ad5c34c
--- /dev/null
@@ -0,0 +1,2 @@
+name: 
+    default: Puerto Rico
diff --git a/settings/country-names/ps.yaml b/settings/country-names/ps.yaml
new file mode 100644 (file)
index 0000000..ffaea4e
--- /dev/null
@@ -0,0 +1,2 @@
+name: 
+    default: Palestinian Territory
diff --git a/settings/country-names/pt.yaml b/settings/country-names/pt.yaml
new file mode 100644 (file)
index 0000000..36ccb6d
--- /dev/null
@@ -0,0 +1,139 @@
+name: 
+    default: Portugal
+    af: Portugal
+    am: ፖርቱጋል
+    an: Portugal
+    ar: البرتغال
+    ay: Purtuwal
+    az: Portuqaliya
+    ba: Португалия
+    be: Партугалія
+    bg: Португалия
+    bi: Portugal
+    bn: পর্তুগাল
+    bo: པོ་ཅུ་གྷལ།
+    br: Portugal
+    bs: Portugal
+    ca: Portugal
+    ce: Португали
+    co: Portugallu
+    cs: Portugalsko
+    cu: Портогалїꙗ
+    cv: Португали
+    cy: Portiwgal
+    da: Portugal
+    de: Portugal
+    dv: ޕޯޗުގަލް
+    dz: པོར་ཅུ་གལ་
+    ee: Portugal
+    el: Πορτογαλία
+    en: Portugal
+    eo: Portugalio
+    es: Portugal
+    et: Portugal
+    eu: Portugal
+    fa: پرتغال
+    fi: Portugali
+    fo: Portugal
+    fr: Portugal
+    fy: Portegal
+    ga: An Phortaingéil
+    gd: A' Phortagail
+    gl: Portugal
+    gn: Poytuga
+    gu: પોર્ટુગલ
+    gv: Yn Phortiugal
+    he: פורטוגל
+    hi: पुर्तगाल
+    hr: Portugal
+    ht: Pòtigal
+    hu: Portugália
+    hy: Պորտուգալիա
+    ia: Portugal
+    id: Portugal
+    ie: Portugal
+    io: Portugal
+    is: Portúgal
+    it: Portogallo
+    ja: ポルトガル
+    jv: Portugal
+    ka: პორტუგალია
+    kg: Mputulukesi
+    kk: Португалия
+    kl: Portugal
+    km: ប្រទេស ព័រទុយហ្គាល់
+    kn: ಪೋರ್ಚುಗಲ್
+    ko: 포르투갈
+    ku: Portûgal
+    kv: Португалия
+    kw: Portyngal
+    ky: Португалия
+    la: Portugallia
+    lb: Portugal
+    li: Portugal
+    ln: Pulutugal
+    lt: Portugalija
+    lv: Portugāle
+    mg: Pôrtogaly
+    mi: Potukara
+    mk: Португалија
+    ml: പോർച്ചുഗൽ
+    mn: Португал
+    mr: पोर्तुगाल
+    ms: Portugal
+    mt: Portugall
+    my: ပေါ်တူဂီနိုင်ငံ
+    na: Portsiugar
+    ne: पोर्चुगल
+    nl: Portugal
+    nn: Portugal
+    "no": Portugal
+    oc: Portugal
+    or: ପର୍ତ୍ତୁଗାଲ
+    os: Португали
+    pl: Portugalia
+    ps: پرتګال
+    pt: Portugal
+    qu: Purtugal
+    rm: Portugal
+    rn: Portugal
+    ro: Portugalia
+    ru: Португалия
+    rw: Porutigali
+    sa: पुर्तगाल
+    sc: Portogallo
+    se: Portugal
+    sh: Portugal
+    si: පෘතුගාලය
+    sk: Portugalsko
+    sl: Portugalska
+    sm: Portugal
+    so: Bortuqaal
+    sq: Portugalia
+    sr: Португалија
+    ss: IPhuthukezi
+    st: Portugal
+    su: Portugal
+    sv: Portugal
+    sw: Ureno
+    ta: போர்த்துகல்
+    te: పోర్చుగల్
+    tg: Португалия
+    th: ประเทศโปรตุเกส
+    tk: Portugaliýa
+    tl: Portugal
+    tr: Portekiz
+    tt: Португалия
+    ty: Pōtītī
+    ug: Portugaliye
+    uk: Португалія
+    ur: پرتگال
+    uz: Portugaliya
+    vi: Bồ Đào Nha
+    vo: Portugän
+    wa: Portugal
+    wo: Portugaal
+    yi: פארטוגאל
+    yo: Pọ́rtúgàl
+    zh: 葡萄牙
+    zu: IPhothugali
diff --git a/settings/country-names/pw.yaml b/settings/country-names/pw.yaml
new file mode 100644 (file)
index 0000000..788b287
--- /dev/null
@@ -0,0 +1,25 @@
+name: 
+    default: Belau
+    ar: بالاو
+    cs: Palau
+    de: Palau
+    en: Palau
+    eo: Palaŭo
+    fr: Palaos
+    hr: Palau
+    ia: Palau
+    io: Palau
+    lt: Palau
+    mi: Pārau
+    oc: Belau
+    pl: Palau
+    ru: Палау
+    se: Palau
+    sk: Palau
+    sl: Palau
+    sr: Палау
+    ta: பலாவு
+    uk: Палау
+    vi: Palau
+    vo: Palauäns
+    zh: 帕劳 / 帛琉
diff --git a/settings/country-names/py.yaml b/settings/country-names/py.yaml
new file mode 100644 (file)
index 0000000..d81925d
--- /dev/null
@@ -0,0 +1,118 @@
+name: 
+    default: Paraguay
+    af: Paraguay
+    am: ፓራጓይ
+    an: Paraguai
+    ar: باراغواي
+    ay: Parawayi
+    az: Paraqvay
+    ba: Парагвай
+    be: Парагвай
+    bg: Парагвай
+    bi: Paraguay
+    bn: প্যারাগুয়ে
+    bo: པ་ར་གུ་ཡེ།
+    br: Paraguay
+    bs: Paragvaj
+    ca: Paraguai
+    ce: Парагвай
+    co: Paraguay
+    cs: Paraguay
+    cv: Парагвай
+    cy: Paraguay
+    da: Paraguay
+    de: Paraguay
+    dv: ޕެރަގުއޭ
+    ee: Paraguay
+    el: Παραγουάη
+    en: Paraguay
+    eo: Paragvajo
+    es: Paraguay
+    et: Paraguay
+    eu: Paraguai
+    fa: پاراگوئه
+    fi: Paraguay
+    fo: Paraguei
+    fr: Paraguay
+    fy: Paraguay
+    ga: Paragua
+    gd: Paraguaidh
+    gl: Paraguai
+    gn: Paraguái
+    gv: Yn Pharaguay
+    he: פרגוואי
+    hi: पैराग्वे
+    hr: Paragvaj
+    ht: Paragwe
+    hu: Paraguay
+    hy: Պարագվայ
+    ia: Paraguay
+    id: Paraguay
+    ie: Paraguay
+    io: Paraguay
+    is: Paragvæ
+    it: Paraguay
+    ja: パラグアイ
+    jv: Paraguay
+    ka: პარაგვაი
+    kk: Парагвай
+    kl: Paraguay
+    kn: ಪೆರಗ್ವೆ
+    ko: 파라과이
+    ku: Paraguay
+    kw: Paragway
+    la: Paraquaria
+    lb: Paraguay
+    li: Paraguay
+    ln: Palagway
+    lt: Paragvajus
+    lv: Paragvaja
+    mk: Парагвај
+    ml: പരഗ്വെ
+    mn: Парагвай
+    mr: पेराग्वे
+    ms: Paraguay
+    mt: Paragwaj
+    my: ပါရာဂွေးနိုင်ငံ
+    ne: पाराग्वे
+    nl: Paraguay
+    nn: Paraguay
+    "no": Paraguay
+    oc: Paraguai
+    or: ପାରାଗୁଏ
+    os: Парагвай
+    pa: ਪੈਰਾਗੁਏ
+    pl: Paragwaj
+    pt: Paraguai
+    qu: Parawayi
+    rm: Paraguay
+    ro: Paraguay
+    ru: Парагвай
+    rw: Paragwe
+    sa: पेरेग्वाय
+    se: Paraguay
+    sh: Paragvaj
+    sk: Paraguaj
+    sl: Paragvaj
+    so: Paraguay
+    sq: Paraguaji
+    sr: Парагвај
+    su: Paraguay
+    sv: Paraguay
+    sw: Paraguay
+    ta: பரகுவை
+    tg: Парагвай
+    th: ประเทศปารากวัย
+    tl: Paraguay
+    tr: Paraguay
+    tt: Парагвай
+    ug: پاراگۋاي
+    uk: Парагвай
+    ur: پیراگوئے
+    uz: Paragvay
+    vi: Paraguay
+    vo: Paragvän
+    wo: Paraguwaay
+    yi: פאראגוויי
+    yo: Paragúáì
+    zh: 巴拉圭
diff --git a/settings/country-names/qa.yaml b/settings/country-names/qa.yaml
new file mode 100644 (file)
index 0000000..311d9d2
--- /dev/null
@@ -0,0 +1,120 @@
+name: 
+    default: قطر
+    af: Katar
+    am: ቃጣር
+    an: Qatar
+    ar: قطر
+    as: কাটাৰ
+    az: Qətər
+    be: Катар
+    bg: Катар
+    bn: কাতার
+    bo: ཁ་ཏར།
+    br: Katar
+    bs: Katar
+    ca: Qatar
+    ce: Катар
+    cs: Katar
+    cv: Катар
+    cy: Qatar
+    da: Qatar
+    de: Katar
+    dv: ޤަޠަރު
+    dz: ཀ་ཏར་
+    ee: Qatar
+    el: Κατάρ
+    en: Qatar
+    eo: Kataro
+    es: Catar
+    et: Katar
+    eu: Qatar
+    fa: قطر
+    fi: Qatar
+    fo: Katar
+    fr: Qatar
+    fy: Katar
+    ga: Catar
+    gd: Catar
+    gl: Qatar - قطر
+    gu: કતાર (અરબસ્તાન)
+    gv: Yn Chatar
+    he: קטאר
+    hi: क़तर
+    hr: Katar
+    ht: Katar
+    hu: Katar
+    hy: Քաթար
+    id: Qatar
+    ie: Katar
+    io: Katar
+    is: Katar
+    it: Qatar
+    ja: カタール
+    jv: Qatar
+    ka: კატარი
+    kk: Катар
+    kl: Qatar
+    kn: ಕಟಾರ್
+    ko: 카타르
+    ku: Qeter
+    kv: Катар
+    kw: Katar
+    la: Quataria
+    lb: Katar
+    li: Katar
+    ln: Katar
+    lt: Kataras
+    lv: Katara
+    mi: Katā
+    mk: Катар
+    ml: ഖത്തർ
+    mn: Катар
+    mr: कतार
+    ms: Qatar
+    mt: Qatar
+    my: ကာတာနိုင်ငံ
+    na: Qatar
+    nl: Qatar
+    nn: Qatar
+    "no": Qatar
+    nv: Kʼatár
+    oc: Qatar
+    or: କତର
+    os: Катар
+    pa: ਕਤਰ
+    pl: Katar
+    ps: قطر
+    pt: Catar
+    qu: Qatar
+    ro: Qatar
+    ru: Катар
+    rw: Katari
+    sa: कतार
+    se: Qatar
+    sk: Katar (štát)
+    sl: Katar
+    so: Qatar
+    sq: Katari
+    sr: Катар
+    ss: IKhathari
+    su: Qatar
+    sv: Qatar
+    sw: Qatar
+    ta: கத்தார்
+    te: కతర్
+    tg: Қатар
+    th: ประเทศกาตาร์
+    tk: Katar
+    tl: Katar
+    tr: Katar
+    tt: Катар
+    ug: قاتار
+    uk: Катар
+    ur: قطر
+    uz: Qatar
+    vi: Qatar
+    vo: Katarän
+    wo: Kataar
+    yi: קאטאר
+    yo: Katar
+    zh: 卡塔尔
diff --git a/settings/country-names/re.yaml b/settings/country-names/re.yaml
new file mode 100644 (file)
index 0000000..21da86d
--- /dev/null
@@ -0,0 +1,29 @@
+name: 
+    default: Réunion
+    af: Réunion
+    ar: ريونيون
+    be: Руньён
+    br: Ar Reunion
+    ca: Illa de la Reunió
+    da: Reunion
+    el: Ρεϊνιόν
+    eo: Reunio
+    es: La Reunión
+    fa: رئونیون
+    fi: Réunion
+    fr: La Réunion
+    he: ראוניון
+    hu: Réunion
+    is: Réunion
+    it: Riunione
+    la: Reunio
+    lt: Reunionas
+    lv: Reinjona
+    mn: Реюньон
+    pl: Reunion
+    ru: Реюньон
+    sl: Reunion
+    sv: Réunion
+    th: เรอูนียง
+    uk: Реюньйон
+    zh: 留尼汪
diff --git a/settings/country-names/ro.yaml b/settings/country-names/ro.yaml
new file mode 100644 (file)
index 0000000..c5ca6b9
--- /dev/null
@@ -0,0 +1,133 @@
+name: 
+    default: România
+    af: Roemenië
+    am: ሮማንያ
+    an: Rumanía
+    ar: رومانيا
+    ay: Rumanya
+    az: Rumıniya
+    ba: Румыния
+    be: Румынія
+    bg: Румъния
+    bi: Romania
+    bn: রোমানিয়া
+    bo: རོ་མ་ནི་ཡ།
+    br: Roumania
+    bs: Rumunija
+    ca: Romania
+    ce: Румыни
+    co: Romania
+    cs: Rumunsko
+    cu: Роумꙑнїꙗ
+    cv: Румыни
+    cy: Rwmania
+    da: Rumænien
+    de: Rumänien
+    dv: ރުމޭނިއާ
+    ee: Romania
+    el: Ρουμανία
+    en: Romania
+    eo: Rumanio
+    es: Rumanía
+    et: Rumeenia
+    eu: Errumania
+    fa: رومانی
+    fi: Romania
+    fo: Rumenia
+    fr: Roumanie
+    fy: Roemeenje
+    ga: An Rómáin
+    gd: Romàinia
+    gl: Romanía
+    gn: Rrumaña
+    gu: રોમાનિયા
+    gv: Yn Romaan
+    he: רומניה
+    hi: रोमानिया
+    hr: Rumunjska
+    ht: Woumani
+    hu: Románia
+    hy: Ռումինիա
+    ia: Romania
+    id: Rumania
+    ie: Rumania
+    io: Rumania
+    is: Rúmenía
+    it: Romania
+    ja: ルーマニア
+    jv: Rumania
+    ka: რუმინეთი
+    kg: Romania
+    kk: Румыния
+    kl: Rumænia
+    kn: ರೊಮಾನಿಯ
+    ko: 루마니아
+    ku: Romanya
+    kv: Румыния
+    kw: Roumani
+    ky: Румыния
+    la: Romania
+    lb: Rumänien
+    li: Roemenië
+    ln: Rumania
+    lt: Rumunija
+    lv: Rumānija
+    mi: Romeinia
+    mk: Романија
+    ml: റൊമാനിയ
+    mn: Румын
+    mr: रोमेनिया
+    ms: Romania
+    mt: Rumanija
+    my: ရိုမေးနီးယားနိုင်ငံ
+    na: Romania
+    ne: रोमानिया
+    nl: Roemenië
+    nn: Romania
+    "no": Romania
+    nv: Wooméiniya
+    oc: Romania
+    or: ରୋମାନିଆ
+    os: Румыни
+    pa: ਰੋਮਾਨੀਆ
+    pl: Rumunia
+    ps: رومانیا
+    pt: Roménia
+    qu: Rumanya
+    rm: Rumenia
+    ro: România
+    ru: Румыния
+    rw: Romaniya
+    sc: Romania
+    se: Romania
+    sh: Rumunija
+    si: රුමේනියාව
+    sk: Rumunsko
+    sl: Romunija
+    sm: Romania
+    so: Romania
+    sq: Rumania
+    sr: Румунија
+    ss: IRomaniya
+    su: Romania
+    sv: Rumänien
+    sw: Romania
+    ta: உருமேனியா
+    te: రొమేనియా
+    tg: Руминия
+    th: ประเทศโรมาเนีย
+    tk: Rumyniýa
+    tl: Rumanya
+    tr: Romanya
+    tt: Румыния
+    ug: Ruminiye
+    uk: Румунія
+    ur: رومانیہ
+    uz: Ruminiya
+    vi: Romania
+    vo: Rumän
+    wa: Roumaneye
+    wo: Romaani
+    yi: רומעניע
+    yo: Románíà
+    zh: 羅馬尼亞
diff --git a/settings/country-names/rs.yaml b/settings/country-names/rs.yaml
new file mode 100644 (file)
index 0000000..960c59e
--- /dev/null
@@ -0,0 +1,135 @@
+name: 
+    default: Србија
+    af: Serwië
+    am: ሰርቢያ
+    an: Serbia
+    ar: صربيا
+    ay: Sirwiya
+    az: Serbiya
+    ba: Сербия
+    be: Сербія
+    bg: Сърбия
+    bi: Serbia
+    bn: সার্বিয়া
+    bo: སེར་བྷི་ཡ།
+    br: Serbia
+    bs: Srbija
+    ca: Sèrbia
+    ce: Серби
+    co: Serbia
+    cs: Srbsko
+    cu: Срьбїꙗ
+    cv: Серби
+    cy: Serbia
+    da: Serbien
+    de: Serbien
+    dv: ސާބިއާ
+    ee: Serbia
+    el: Σερβία
+    en: Serbia
+    eo: Serbio
+    es: Serbia
+    et: Serbia
+    eu: Serbia
+    fa: صربستان
+    fi: Serbia
+    fo: Serbia
+    fr: Serbie
+    fy: Servje
+    ga: An tSeirbia
+    gd: An t-Sèirb
+    gl: Serbia
+    gn: Sevia
+    gv: Yn Serb
+    he: סרביה
+    hi: सर्बिया
+    hr: Srbija
+    ht: Sèbi
+    hu: Szerbia
+    hy: Սերբիա
+    ia: Serbia
+    id: Serbia
+    ie: Serbia
+    io: Serbia
+    is: Serbía
+    it: Serbia
+    ja: セルビア
+    jv: Serbia
+    ka: სერბეთი
+    kg: Serbie
+    kk: Сербия
+    kl: Serbia
+    ko: 세르비아
+    ku: Serbistan
+    kv: Сербия
+    kw: Serbi
+    ky: Сербия
+    la: Serbia
+    lb: Serbien
+    li: Servië
+    ln: Serbia
+    lt: Serbija
+    lv: Serbija
+    mg: Serbia
+    mi: Serbia
+    mk: Србија
+    ml: സെർബിയ
+    mn: Серби
+    mr: सर्बिया
+    ms: Serbia
+    mt: Serbja
+    my: ဆားဘီးယားနိုင်ငံ
+    na: Terbiya
+    nb: Serbia
+    ne: सर्बिया
+    nl: Servië
+    nn: Serbia
+    "no": Serbia
+    oc: Serbia
+    or: ସର୍ବିଆ
+    os: Серби
+    pa: ਸਰਬੀਆ
+    pl: Serbia
+    ps: سربيا
+    pt: Sérvia
+    qu: Sirbya
+    rm: Serbia
+    ro: Serbia
+    ru: Сербия
+    rw: Seribiya
+    sa: सर्बिया
+    sc: Sèrbia
+    se: Serbia
+    sh: Srbija
+    sk: Srbsko
+    sl: Srbija
+    sm: Serbia
+    so: Serbia
+    sq: Serbia
+    sr: Србија
+    ss: ISebhiya
+    st: Serbia
+    su: Sérbia
+    sv: Serbien
+    sw: Serbia
+    ta: செர்பியா
+    te: సెర్బియా
+    tg: Сербия
+    th: ประเทศเซอร์เบีย
+    tk: Serbiýa
+    tl: Serbiya
+    tr: Sırbistan
+    tt: Сербия
+    tw: Serbia
+    ty: Terepia
+    ug: Sérbiye
+    uk: Сербія
+    ur: سربیا
+    uz: Serbiya
+    vi: Serbia
+    vo: Särbän
+    wo: Seerbi
+    yi: סערביע
+    yo: Sérbíà
+    zh: 塞爾維亞
+    zu: ISerbiya
diff --git a/settings/country-names/ru.yaml b/settings/country-names/ru.yaml
new file mode 100644 (file)
index 0000000..b5c25ea
--- /dev/null
@@ -0,0 +1,168 @@
+name: 
+    default: Россия
+    ab: Урыстәыла
+    af: Rusland
+    ak: Russia
+    am: ሩሲያ
+    an: Rusia
+    ar: روسيا
+    as: ৰুশিযা
+    av: Россиялъул Федерация
+    ay: Rusiya
+    az: Rusiya
+    ba: Рәсәй
+    be: Расія
+    bg: Русия
+    bi: Rusia
+    bm: Risila
+    bn: রাশিয়া
+    bo: ཨུ་རུ་སུ།
+    br: Rusia
+    bs: Rusija
+    ca: Rússia
+    ce: Росси
+    ch: Russia
+    co: Russia
+    cs: Rusko
+    cu: Рѡсїꙗ
+    cv: Раççей Патшалăхĕ
+    cy: Rwsia
+    da: Rusland
+    de: Russland
+    dv: ރޫސީވިލާތް
+    dz: ར་ཤི་ཡཱན་ཕེ་ཌི་རེ་ཤཱན
+    ee: Russia
+    el: Ρωσία
+    en: Russia
+    eo: Rusio
+    es: Rusia
+    et: Venemaa
+    eu: Errusia
+    fa: روسیه
+    ff: Roosiya
+    fi: Venäjä
+    fo: Russland
+    fr: Russie
+    fy: Ruslân
+    ga: An Rúis
+    gd: An Ruis
+    gl: Rusia
+    gn: Rrúsia
+    gu: રશિયા
+    gv: Yn Roosh
+    ha: Rasha
+    he: רוסיה
+    hi: रूस
+    hr: Ruska Federacija
+    ht: Risi
+    hu: Oroszország
+    hy: Ռուսաստան
+    ia: Russia
+    id: Rusia
+    ie: Russia
+    ig: Mpaghara Russia
+    ik: Russia
+    io: Rusia
+    is: Rússland
+    it: Russia
+    iu: ᐅᓛᓴ
+    ja: ロシア
+    jv: Rusia
+    ka: რუსეთი
+    kg: Rusia
+    ki: Russia
+    kk: Ресей
+    kl: Ruslandi
+    km: រុស្ស៊ី
+    kn: ರಷ್ಯಾ
+    ko: 러시아
+    ks: روٗس
+    ku: Rûsya
+    kv: Рочму
+    kw: Russi
+    ky: Орусия
+    la: Russia
+    lb: Russland
+    lg: Rwasha
+    li: Rusland
+    ln: Rusí
+    lo: ລັດເຊັຽ
+    lt: Rusija
+    lv: Krievija
+    mg: Rosia
+    mi: Ruhia
+    mk: Русија
+    ml: റഷ്യ
+    mn: Оросын Холбооны Улс
+    mo: Русия
+    mr: रशिया
+    ms: Rusia
+    mt: Russja
+    my: ရုရှားနိုင်ငံ
+    na: Ratsiya
+    ne: रुस
+    nl: Rusland
+    nn: Russland
+    "no": Russland
+    nv: Biʼééʼ Łichííʼí Bikéyah
+    ny: Russia
+    oc: Russia
+    om: Raashiyaa
+    or: ଋଷିଆ
+    os: Уæрæсе
+    pa: ਰੂਸ
+    pl: Rosja
+    ps: روسیه
+    pt: Rússia
+    qu: Rusiya
+    rm: Russia
+    rn: Uburusiya
+    ro: Rusia
+    ru: Россия
+    rw: Uburusiya
+    sc: Rùssia
+    sd: روس
+    se: Ruošša
+    sg: Rusïi
+    sh: Rusija
+    si: රුසියාව
+    sk: Rusko
+    sl: Rusija
+    sm: Lusia
+    sn: Russia
+    so: Ruushka
+    sq: Rusia
+    sr: Русија
+    ss: IRashiya
+    st: Russia
+    su: Rusia
+    sv: Ryssland
+    sw: Shirikisho la Urusi
+    ta: உருசியா
+    te: రష్యా
+    tg: Русия
+    th: ประเทศรัสเซีย
+    ti: ራሻ
+    tk: Russiýa
+    tl: Pederasyong Ruso
+    to: Lūsia
+    tr: Rusya Federasyonu
+    ts: Russia
+    tt: Русия
+    tw: Russia
+    ty: Rūtia
+    ug: روسىيە
+    uk: Росія
+    ur: روس
+    uz: Rossiya Federatsiyasi
+    ve: Rashia
+    vi: Liên bang Nga
+    vo: Rusän
+    wa: Federåcion d' Rûsseye
+    wo: Federaasioŋ bu Riisi
+    xh: IRashiya
+    yi: רוסלאנד
+    yo: Rọ́síà
+    za: Ezlozswh Lienzbangh
+    zh: 俄罗斯/俄羅斯
+    zu: IRashiya
diff --git a/settings/country-names/rw.yaml b/settings/country-names/rw.yaml
new file mode 100644 (file)
index 0000000..6edd64e
--- /dev/null
@@ -0,0 +1,128 @@
+name: 
+    default: Rwanda
+    af: Rwanda
+    am: ሩዋንዳ
+    an: Ruanda
+    ar: رواندا
+    az: Ruanda
+    ba: Руанда
+    be: Руанда
+    bg: Руанда
+    bm: Rwanda
+    bn: রুয়ান্ডা
+    bo: རུ་ཝན་ཌ།
+    br: Rwanda
+    bs: Ruanda
+    ca: Rwanda
+    ce: Руанда
+    cs: Rwanda
+    cv: Руанда
+    cy: Rwanda
+    da: Rwanda
+    de: Ruanda
+    dv: ރުވާންޑާ
+    ee: Rwanda
+    el: Ρουάντα
+    en: Rwanda
+    eo: Ruando
+    es: Ruanda
+    et: Rwanda
+    eu: Ruanda
+    fa: رواندا
+    fi: Ruanda
+    fo: Ruanda
+    fr: Rwanda
+    fy: Rûanda
+    ga: Ruanda
+    gd: Rubhanda
+    gl: Ruanda
+    gv: Rooandey
+    he: רואנדה
+    hi: रवाण्डा
+    hr: Ruanda
+    ht: Rwanda
+    hu: Ruanda
+    hy: Ռուանդա
+    ia: Ruanda
+    id: Rwanda
+    ie: Rwanda
+    io: Ruanda
+    is: Rúanda
+    it: Ruanda
+    ja: ルワンダ
+    jv: Rwanda
+    ka: რუანდა
+    kg: Rwanda
+    ki: Rwanda
+    kk: Руанда
+    kn: ರ್ವಾಂಡ
+    ko: 르완다
+    ku: Rwanda
+    kw: Rwanda
+    la: Ruanda
+    lb: Ruanda
+    li: Rwanda
+    ln: Rwanda
+    lt: Ruanda
+    lv: Ruanda
+    mk: Руанда
+    ml: റുവാണ്ട
+    mn: Руанда
+    mr: ऱ्वान्डा
+    ms: Rwanda
+    mt: Rwanda
+    my: ရဝမ်ဒါနိုင်ငံ
+    ne: रुवाण्डा
+    nl: Rwanda
+    nn: Rwanda
+    "no": Rwanda
+    nv: Wánda Dineʼé Bikéyah
+    oc: Rwanda
+    or: ରଵାଣ୍ଡା
+    os: Руандæ
+    pa: ਰਵਾਂਡਾ
+    pl: Rwanda
+    ps: راونډا
+    pt: Ruanda
+    qu: Rwanda
+    rn: Rwanda
+    ro: Rwanda
+    ru: Руанда
+    rw: Rwanda
+    sa: रवाण्डा
+    sc: Ruanda
+    se: Rwanda
+    sg: Ruandäa
+    sh: Ruanda
+    si: රුවන්ඩා ජනරජය
+    sk: Rwanda
+    sl: Ruanda
+    sn: Rwanda
+    so: Ruwanda
+    sq: Ruanda
+    sr: Руанда
+    ss: IRuwanda
+    su: Rwanda
+    sv: Rwanda
+    sw: Rwanda
+    ta: ருவாண்டா
+    te: రువాండా
+    tg: Руанда
+    th: ประเทศรวันดา
+    ti: ሩዋንዳ
+    tk: Ruanda
+    tl: Ruwanda
+    tr: Ruanda
+    ts: Rwanda
+    tt: Руанда
+    ug: رۋاندا
+    uk: Руанда
+    ur: روانڈا
+    uz: Ruanda
+    vi: Rwanda
+    vo: Ruandän
+    wo: Ruwandaa
+    yi: רוואנדע
+    yo: Rùwándà
+    zh: 卢旺达
+    zu: IRuwanda
diff --git a/settings/country-names/sa.yaml b/settings/country-names/sa.yaml
new file mode 100644 (file)
index 0000000..dfb0bf0
--- /dev/null
@@ -0,0 +1,128 @@
+name: 
+    default: السعودية
+    af: Saoedi-Arabië
+    am: ሳዑዲ አረቢያ
+    an: Arabia Saudí
+    ar: السعودية
+    av: СагIудиязул ГIарабия
+    az: Səudiyyə Ərəbistanı
+    ba: Сәғүд Ғәрәбстаны
+    be: Саудаўская Аравія
+    bg: Саудитска Арабия
+    bm: Saudia Arabu ka Faamamara
+    bn: সৌদি আরব
+    bo: སའུ་དི་ཨ་ར་པི་ཡ།
+    br: Arabia Saoudat
+    bs: Saudijska Arabija
+    ca: Aràbia Saudita
+    ce: СаӀудийн Ӏаьрбийчоь
+    cs: Saúdská Arábie
+    cv: Сауд Аравийĕ
+    cy: Saudi Arabia
+    da: Saudi-Arabien
+    de: Saudi-Arabien
+    dv: ސައޫދީ އަރަބިއްޔާ
+    dz: སའུ་དི་ཨེ་ར་སྦི་ཡ་
+    el: Σαουδική Αραβία
+    en: Saudi Arabia
+    eo: Sauda Arabio
+    es: Arabia Saudita
+    et: Saudi Araabia
+    eu: Saudi Arabia
+    fa: عربستان سعودی
+    fi: Saudi-Arabia
+    fo: Saudi-Arabia
+    fr: Arabie saoudite
+    fy: Saûdy-Araabje
+    ga: An Araib Shádach
+    gd: Aràibia nan Sabhd
+    gl: Arabia Saudí
+    gn: Aravia Saudíta
+    gu: સાઉદી અરેબિયા
+    gv: Yn Araab Saudi
+    he: ערב הסעודית
+    hi: सउदी अरब
+    hr: Saudijska Arabija
+    ht: Arabi Sawoudit
+    hu: Szaúd-Arábia
+    hy: Սաուդյան Արաբիա
+    ia: Arabia Saudita
+    id: Arab Saudi
+    ie: Saudi Arabia
+    io: Saudia Arabia
+    is: Sádí-Arabía
+    it: Arabia Saudita
+    ja: サウジアラビア
+    jv: Arab Saudi
+    ka: საუდის არაბეთი
+    kk: Сауд Арабиясы
+    kl: Saudi Arabia
+    km: អារ៉ាប៊ីសាអូឌីត
+    kn: ಸೌದಿ ಅರೆಬಿಯ
+    ko: 사우디아라비아
+    ku: Erebistana Siyûdî
+    kv: Саудса Аравия
+    kw: Arabi Saoudek
+    ky: Сауд Арабия Падышалыгы
+    la: Arabia Saudiana
+    lb: Saudi-Arabien
+    li: Saoedi-Arabië
+    ln: Saudi Arabia
+    lt: Saudo Arabija
+    lv: Saūda Arābija
+    mk: Саудиска Арабија
+    ml: സൗദി അറേബ്യ
+    mn: Саудын Араб
+    mr: सौदी अरेबिया
+    ms: Arab Saudi
+    mt: Arabja Sawdija
+    my: ဆော်ဒီအာရေဗျနိုင်ငံ
+    na: Taudiarabiya
+    ne: साउदी अरब
+    nl: Saoedi-Arabië
+    nn: Saudi-Arabia
+    "no": Saudi-Arabia
+    nv: Ásáí Bikéyah Saʼoodí
+    oc: Arabia Saudita
+    or: ସାଉଦି ଆରବ
+    os: Сауды Арави
+    pa: ਸਉਦੀ ਅਰਬ
+    pl: Arabia Saudyjska
+    ps: سعودي عربستان
+    pt: Arábia Saudita
+    qu: Sawud Arabya
+    rm: Arabia Saudita
+    ro: Arabia Saudită
+    ru: Саудовская Аравия
+    rw: Arabiya Sawudite
+    sa: सऊदी अरब
+    se: Saudi-Arábia
+    sh: Saudijska Arabija
+    si: සවුදි අරාබියාව
+    sk: Saudská Arábia
+    sl: Saudova Arabija
+    so: Sacuudi Carabiya
+    sq: Arabia Saudite
+    sr: Саудијска Арабија
+    ss: I-Arabhiya
+    su: Saudi Arabia
+    sv: Saudiarabien
+    sw: Saudia
+    ta: சவூதி அரேபியா
+    te: సౌదీ అరేబియా
+    tg: Арабистони Саудӣ
+    th: ประเทศซาอุดีอาระเบีย
+    tk: Saud Arabystany
+    tl: Arabyang Saudi
+    tr: Suudi Arabistan
+    tt: Согуд Гарәбстаны
+    ug: سەئۇدى ئەرەبىستان
+    uk: Саудівська Аравія
+    ur: سعودی عرب
+    uz: Saudiya Arabistoni
+    vi: Ả Rập Saudi
+    vo: Sauda-Larabän
+    wo: Araabi Sawdit
+    yi: סאודי אראביע
+    yo: Sáúdí Arábíà
+    zh: 沙特阿拉伯
diff --git a/settings/country-names/sb.yaml b/settings/country-names/sb.yaml
new file mode 100644 (file)
index 0000000..d632cb5
--- /dev/null
@@ -0,0 +1,108 @@
+name: 
+    default: Solomon Islands
+    af: Solomoneilande
+    am: ሰለሞን ደሴቶች
+    an: Islas Salomón
+    ar: جزر سليمان
+    az: Solomon adaları
+    be: Саламонавы Астравы
+    bg: Соломонови острови
+    bn: সলোমন দ্বীপপুঞ্জ
+    bo: སོ་ལོ་མོན་གླིང་ཕྲན་ཚོ་ཁག
+    br: Inizi Solomon
+    bs: Solomonska Ostrva
+    ca: Salomó
+    ce: Соломонан гӀайреш
+    cs: Šalomounovy ostrovy
+    cv: Соломон Утравĕсем
+    cy: Ynysoedd Solomon
+    da: Salomonøerne
+    de: Salomonen
+    dv: ސޮލޮމޮން ޖަޒީރާ
+    el: Νήσοι Σολομώντα
+    en: Solomon Islands
+    eo: Salomonoj
+    es: Islas Salomón
+    et: Saalomoni Saared
+    eu: Salomon Uharteak
+    fa: جزایر سلیمان
+    fi: Salomonsaaret
+    fo: Sálomonoyggjarnar
+    fr: Salomon
+    fy: Salomonseilannen
+    ga: Oileáin Sholamón
+    gd: Na h-Eileanan Sholaimh
+    gl: Illas Salomón
+    gv: Ny h-Ellanyn Holomon
+    he: איי שלמה
+    hi: सोलोमन द्वीपसमूह
+    hr: Solomonski Otoci
+    ht: Salomon
+    hu: Salamon-szigetek
+    hy: Սողոմոնյան Կղզիներ
+    id: Kepulauan Solomon
+    io: Salomon Insuli
+    is: Salómonseyjar
+    it: Isole Salomone
+    ja: ソロモン諸島
+    jv: Kapuloan Solomon
+    ka: სოლომონის კუნძულები
+    kk: Соломон Аралдары
+    kn: ಸಾಲೊಮನ್ ದ್ವೀಪಗಳು
+    ko: 솔로몬 제도
+    ku: Giravên Salomon
+    kw: Ynysow Salamon
+    la: Insulae Salomonis
+    lb: Salomonen
+    li: Salomonseilen
+    lt: Saliamono Salos
+    lv: Zālamana Salas
+    mk: Соломонски Острови
+    ml: സോളമൻ ദ്വീപുകൾ
+    mr: सॉलोमन द्वीपसमूह
+    ms: Kepulauan Solomon
+    mt: Gżejjer Solomon
+    my: ဆော်လမွန်အိုင်းလန်းနိုင်ငံ
+    ne: सोलोमन द्धीप
+    nl: Salomonseilanden
+    nn: Salomonøyane
+    "no": Salomonøyene
+    nv: Sólomon Tó Bináhaazyínígíí
+    oc: Illas Salamon
+    or: ସୋଲୋମନ ଆୟରଲ୍ୟାଣ୍ଡ
+    os: Соломоны сакъадæхтæ
+    pa: ਸੋਲੋਮਨ ਟਾਪੂ
+    pl: Wyspy Salomona
+    pt: Ilhas Salomão
+    qu: Salumun wat'akuna
+    ro: Insulele Solomon
+    ru: Соломоновы Острова
+    rw: Ibirwa bya Solomoni
+    sa: सोलोमन-द्वीप
+    se: Salomonsullot
+    sh: Solomonski Otoci
+    si: සොලමන් දුපත්
+    sk: Šalamúnove ostrovy
+    sl: Salomonovi otoki
+    sm: Solomon Islands
+    so: Jasiiradaha Solomon
+    sq: Ishujt Solomon
+    sr: Соломонска Острва
+    su: Kapuloan Solomon
+    sv: Salomonöarna
+    sw: Visiwa vya Solomon
+    ta: சொலமன் தீவுகள்
+    te: సోలమన్ దీవులు
+    tg: Ҷазираҳои Соломон
+    th: หมู่เกาะโซโลมอน
+    tl: Kapuluang Solomon
+    tr: Solomon Adaları
+    ug: سولومون تاقىم ئاراللىرى
+    uk: Соломонові Острови
+    ur: جزائر سلیمان
+    uz: Solomon Orollari
+    vi: Quần đảo Solomon
+    vo: Solomonuäns
+    wo: Duni Solomon
+    yo: Àwọn Erékùsù Sólómọ́nì
+    zh: 所罗门群岛
diff --git a/settings/country-names/sc.yaml b/settings/country-names/sc.yaml
new file mode 100644 (file)
index 0000000..bfd763e
--- /dev/null
@@ -0,0 +1,119 @@
+name: 
+    default: Sesel
+    af: Seychelle
+    am: ሲሸልስ
+    an: Seychelles
+    ar: سيشيل
+    az: Seyşel adaları
+    be: Сейшэльскія Астравы
+    bg: Сейшели
+    bm: Seshel
+    bn: সেশেল
+    bo: སེ་ཞེལ།
+    br: Sechelez
+    bs: Sejšeli
+    ca: Seychelles
+    ce: Сейшелан гlайреш
+    cs: Seychely
+    cv: Сейшел утравĕсем
+    cy: Seychelles
+    da: Seychellerne
+    de: Seychellen
+    dv: ތޭންގަދީބު
+    el: Σεϋχέλλες
+    en: Seychelles
+    eo: Sejŝeloj
+    es: Seychelles
+    et: Seišellid
+    eu: Seychelleak
+    fa: سیشل
+    fi: Seychellit
+    fo: Seyskelloyggjar
+    fr: Seychelles
+    fy: Seysjellen
+    ga: Na Séiséil
+    gd: Na h-Eileanan Sheiseall
+    gl: Seixeles - Seychelles
+    gv: Ny h-Ellanyn Heshell
+    he: סיישל
+    hi: सेशेल्स
+    hr: Sejšeli
+    ht: Sechèl
+    hu: Seychelle-szigetek
+    ia: Seychelles
+    id: Seychelles
+    ie: Seychelles
+    io: Seycheli
+    is: Seychelles-eyjar
+    it: Seychelles
+    ja: セーシェル
+    jv: Seychelles
+    ka: სეიშელის კუნძულები
+    kg: Seychell
+    kk: Сейшель Аралдары
+    kn: ಸೆಶೆಲ್ಸ್
+    ko: 세이셸
+    ku: Seyşel
+    kw: Seychellys
+    la: Insulae Seisellenses
+    lb: Seychellen
+    li: Seychelle
+    ln: Seyshel
+    lt: Seišeliai
+    lv: Seišelas
+    mg: Seychelles
+    mk: Сејшели
+    ml: സെയ്‌ഷെൽസ്
+    mn: Сейшелийн арлууд
+    mr: सेशेल्स
+    ms: Seychelles
+    mt: Seychelles
+    my: ဆေးရှဲနိုင်ငံ
+    nl: Seychellen
+    nn: Seychellane
+    "no": Seychellene
+    nv: Seishel
+    oc: Seichèlas
+    or: ସେସେଲଜ
+    os: Сейшелтæ
+    pa: ਸੇਸ਼ੈਲ
+    pl: Seszele
+    ps: سیشل
+    pt: Seychelles
+    qu: Sichillakuna
+    rm: Seychellas
+    ro: Seychelles
+    ru: Сейшелы
+    rw: Seyishele
+    sa: सेशेल
+    sc: Seychelles
+    se: Seychellat
+    sg: Sëyshêle
+    sk: Seychely
+    sl: Sejšeli
+    sn: Seychelles
+    so: Seyshelles
+    sq: Sejshellet
+    sr: Сејшели
+    ss: ISeyishelesi
+    su: Seychéll
+    sv: Seychellerna
+    sw: Shelisheli
+    ta: சீசெல்சு
+    tg: Ҷазираҳои Сейшел
+    th: ประเทศเซเชลส์
+    tk: Seýşel Adalary
+    tl: Seyshels
+    tr: Seyşeller
+    ts: Seychelles
+    tt: Сейшел утраулары
+    ug: سېيشېل ئاراللىرى
+    uk: Сейшельські Острови
+    ur: سیچیلیس
+    uz: Seyshell orollari
+    vi: Seychelles
+    vo: Säceluäns
+    wo: Seysel
+    yo: Ṣèíhẹ́lẹ́sì
+    zh: 塞舌尔
+    zu: IsiSeyisheli
diff --git a/settings/country-names/sd.yaml b/settings/country-names/sd.yaml
new file mode 100644 (file)
index 0000000..48ddf92
--- /dev/null
@@ -0,0 +1,137 @@
+name: 
+    default: السودان
+    af: Soedan
+    ak: Sudan
+    am: ሱዳን
+    an: Sudán
+    ar: السودان
+    az: Sudan
+    ba: Судан
+    be: Судан
+    bg: Судан
+    bm: Sudan
+    bn: সুদান
+    bo: སུའུ་ཏན།
+    br: Soudan
+    bs: Sudan
+    ca: Sudan
+    ce: Судан
+    cs: Súdán
+    cv: Судан
+    cy: Sudan
+    da: Sudan
+    de: Sudan
+    dv: ސޫދާން
+    ee: Sudan
+    el: Σουδάν
+    en: Sudan
+    eo: Sudano
+    es: Sudán
+    et: Sudaan
+    eu: Sudan
+    fa: سودان
+    fi: Sudan
+    fo: Sudan
+    fr: Soudan
+    fy: Sûdan
+    ga: An tSúdáin
+    gd: Sudan
+    gl: Sudán
+    gn: Sudano
+    gu: સુદાન
+    gv: Yn Toodaan
+    ha: Sudan
+    he: סודאן
+    hi: सूडान
+    hr: Sudan
+    ht: Soudan
+    hu: Szudán
+    hy: Սուդան
+    ia: Sudan
+    id: Sudan
+    ie: Sudan
+    ig: Sudan
+    io: Sudan
+    is: Súdan
+    it: Sudan
+    ja: スーダン
+    jv: Sudan
+    ka: სუდანი
+    kg: Sudan
+    ki: Sũdana
+    kk: Судан
+    kn: ಸುಡಾನ್
+    ko: 수단
+    ku: Sûdan
+    kw: Soudan
+    ky: Судан
+    la: Sudania
+    lb: Sudan
+    li: Soedan
+    ln: Sudani
+    lt: Sudanas
+    lv: Sudāna
+    mi: Hūtāne
+    mk: Судан
+    ml: സുഡാൻ
+    mn: Судан
+    mr: सुदान
+    ms: Sudan
+    mt: Sudan
+    my: ဆူဒန်နိုင်ငံ
+    na: Tudan
+    nl: Soedan
+    nn: Sudan
+    "no": Sudan
+    nv: Soodą́ą
+    ny: Sudan
+    oc: Sodan
+    om: Sudaan
+    or: ସୁଦାନ
+    os: Судан
+    pa: ਸੁਡਾਨ
+    pl: Sudan
+    ps: سوډان
+    pt: Sudão
+    qu: Sudan
+    rm: Sudan
+    ro: Sudan
+    ru: Судан
+    rw: Sudani
+    sa: सूडान
+    sc: Sudan
+    sd: سوڊان
+    se: Sudan
+    sg: Sudäan
+    sh: Sudan
+    sk: Sudán
+    sl: Sudan
+    sm: Sudan
+    sn: Sudan
+    so: Suudaan
+    sq: Sudani
+    sr: Судан
+    ss: ISudani
+    su: Sudan
+    sv: Sudan
+    sw: Sudan
+    ta: சூடான்
+    te: సూడాన్
+    tg: Судон
+    th: ประเทศซูดาน
+    ti: ሱዳን
+    tk: Sudan
+    tl: Sudan
+    tr: Sudan
+    ts: Sudan
+    tt: Судан
+    ug: سۇدان
+    uk: Судан
+    ur: سوڈان
+    uz: Sudan
+    vi: Sudan
+    vo: Sudän
+    wo: Sudaan
+    yi: סודאן
+    yo: Sudan
+    zh: 苏丹共和国
diff --git a/settings/country-names/se.yaml b/settings/country-names/se.yaml
new file mode 100644 (file)
index 0000000..01a689b
--- /dev/null
@@ -0,0 +1,142 @@
+name: 
+    default: Sverige
+    ab: Швециа
+    af: Swede
+    ak: Sweden
+    am: ስዊድን
+    an: Suecia
+    ar: السويد
+    az: İsveç
+    ba: Швеция
+    be: Швецыя
+    bg: Швеция
+    bi: Sweden
+    bm: Swedi
+    bn: সুইডেন
+    bo: སི་ཝེ་དེན།
+    br: Sveden
+    bs: Švedska
+    ca: Suècia
+    ce: Швеци
+    co: Svezia
+    cs: Švédsko
+    cu: Свєньско
+    cv: Швеци
+    cy: Sweden
+    da: Sverige
+    de: Schweden
+    dv: ސުވިޑަން
+    dz: སུའི་ཌན་
+    ee: Sweden
+    el: Σουηδία
+    en: Sweden
+    eo: Svedio
+    es: Suecia
+    et: Rootsi
+    eu: Suedia
+    fa: سوئد
+    fi: Ruotsi
+    fo: Svøríki
+    fr: Suède
+    fy: Sweden
+    ga: An tSualainn
+    gd: An t-Suain
+    gl: Suecia
+    gn: Suesia
+    gu: સ્વિડન
+    gv: Yn Toolynn
+    he: שבדיה
+    hi: स्वीडन
+    hr: Švedska
+    ht: Syèd
+    hu: Svédország
+    hy: Շվեդիա
+    ia: Svedia
+    id: Swedia
+    ie: Svedia
+    io: Suedia
+    is: Svíþjóð
+    it: Svezia
+    iu: ᔅᕗᕆᑭ
+    ja: スウェーデン
+    jv: Swédia
+    ka: შვედეთი
+    kg: Suedi
+    ki: Sweden
+    kk: Швеция
+    kl: Svenskit Nunaat
+    km: ស៊ុយអែត
+    kn: ಸ್ವೀಡನ್
+    ko: 스웨덴
+    ku: Swêd
+    kv: Швеция
+    kw: Swedherwyk
+    ky: Швеция
+    la: Suecia
+    lb: Schweden
+    lg: Swiiden
+    li: Zwede
+    ln: Swédi
+    lt: Švedija
+    lv: Zviedrija
+    mg: Soeda
+    mi: Huītene
+    mk: Шведска
+    ml: സ്വീഡൻ
+    mn: Швед
+    mr: स्वीडन
+    ms: Sweden
+    mt: Żvezja
+    my: ဆွီဒင်နိုင်ငံ
+    na: Widen
+    ne: स्वीडेन
+    nl: Zweden
+    nn: Sverige
+    "no": Sverige
+    oc: Suècia
+    or: ସ୍ଵିଡେନ
+    os: Швеци
+    pa: ਸਵੀਡਨ
+    pl: Szwecja
+    ps: سويډن
+    pt: Suécia
+    qu: Suwidsuyu
+    rm: Svezia
+    ro: Suedia
+    ru: Швеция
+    rw: Suwede
+    sa: स्वीडन
+    sc: Isvetzia
+    se: Ruoŧŧa
+    sh: Švedska
+    sk: Švédsko
+    sl: Švedska
+    sm: Sweden
+    so: Iswiidhan
+    sq: Suedia
+    sr: Шведска
+    ss: ISwideni
+    su: Swédia
+    sv: Sverige
+    sw: Uswidi
+    ta: சுவீடன்
+    te: స్వీడన్
+    tg: Шветсия
+    th: ประเทศสวีเดน
+    tk: Şwesiýa
+    tl: Suwesya
+    tr: İsveç
+    tt: Швеция
+    tw: Sweden
+    ug: شۋېتسىيە
+    uk: Швеція
+    ur: سویڈن
+    uz: Shvetsiya
+    vi: Thụy Điển
+    vo: Svedän
+    wa: Suwedwesse
+    wo: Suweed
+    yi: שוועדן
+    yo: Swídìn
+    zh: 瑞典
+    zu: ISwidi
diff --git a/settings/country-names/sg.yaml b/settings/country-names/sg.yaml
new file mode 100644 (file)
index 0000000..e176141
--- /dev/null
@@ -0,0 +1,130 @@
+name: 
+    default: Singapore
+    af: Singapoer
+    am: ሲንጋፖር
+    an: Singapur
+    ar: سنغافورة
+    az: Sinqapur
+    ba: Сингапур
+    be: Сінгапур
+    bg: Сингапур
+    bi: Singapore
+    bn: সিঙ্গাপুর
+    bo: སེང་ག་ཕོར།
+    br: Singapour
+    bs: Singapur
+    ca: Singapur
+    ce: Сингапур
+    cs: Singapur
+    cv: Сингапур
+    cy: Singapore
+    da: Singapore
+    de: Singapur
+    dv: ސިންގަޕޫރު
+    el: Σιγκαπούρη
+    en: Singapore
+    eo: Singapuro
+    es: Singapur
+    et: Singapur
+    eu: Singapur
+    fa: سنگاپور
+    ff: Sinngapuur
+    fi: Singapore
+    fo: Singapor
+    fr: Singapour
+    fy: Singapoer
+    ga: Singeapór
+    gd: Singeapòr
+    gl: Singapur
+    gu: સિંગાપુર
+    gv: Singapore
+    ha: Singapore
+    he: סינגפור
+    hi: सिंगापुर
+    hr: Singapur
+    ht: Sengapou
+    hu: Szingapúr
+    hy: Սինգապուրի Հանրապետություն
+    ia: Singapur
+    id: Singapura
+    ie: Singapor
+    io: Singapur
+    is: Singapúr
+    it: Singapore
+    ja: シンガポール
+    jv: Singapura
+    ka: სინგაპური
+    ki: Singapore
+    kk: Сингапур
+    kl: Singapore
+    km: សិង្ហបុរី
+    kn: ಸಿಂಗಾಪುರ್
+    ko: 싱가포르
+    ku: Singapûr
+    kv: Сингапур
+    kw: Singapour
+    ky: Сингапур
+    la: Singapura
+    lb: Singapur
+    li: Singapore
+    ln: Singapur
+    lt: Singapūras
+    lv: Singapūra
+    mg: Singapaoro
+    mi: Hingapoa
+    mk: Сингапур
+    ml: സിംഗപ്പൂർ
+    mn: Сингапур
+    mr: सिंगापूर
+    ms: Singapura
+    mt: Singapor
+    my: စင်ကာပူနိုင်ငံ
+    na: Tsingapoar
+    ne: सिंगापुर
+    nl: Singapore
+    nn: Singapore
+    "no": Singapore
+    nv: Sį́ʼgaboo
+    oc: Singapor
+    or: ସିଙ୍ଗାପୁର
+    os: Сингапур
+    pa: ਸਿੰਘਾਪੁਰ
+    pl: Singapur
+    ps: سينګاپور
+    pt: Singapura
+    qu: Singapur
+    ro: Singapore
+    ru: Сингапур
+    rw: Singapore
+    sa: सिङ्गापुरम्
+    se: Singapore
+    sg: Sïngäpûru
+    sh: Singapur
+    sk: Singapur
+    sl: Singapur
+    sm: Sigapoa
+    so: Singabuur
+    sq: Singapori
+    sr: Сингапур
+    ss: ISingapholo
+    su: Singapura
+    sv: Singapore
+    sw: Singapuri
+    ta: சிங்கப்பூர்
+    te: సింగపూరు
+    tg: Сингапур
+    th: ประเทศสิงคโปร์
+    tk: Singapur
+    tl: Singapore
+    tr: Singapur
+    tt: Сингапур
+    ug: سىنگاپور
+    uk: Сінгапур
+    ur: سنگاپور
+    uz: Singapur
+    vi: Singapore
+    vo: Singapurän
+    wo: Singapoor
+    yi: סינגאפור
+    yo: Singapore
+    zh: 新加坡
diff --git a/settings/country-names/sh.yaml b/settings/country-names/sh.yaml
new file mode 100644 (file)
index 0000000..2abb4b7
--- /dev/null
@@ -0,0 +1,25 @@
+name: 
+    default: Saint Helena, Ascension and Tristan da Cunha
+    ar: سانت هيلينا، أسينسيون وتريستان دا كونها
+    cs: Svatá Helena, Ascension a Tristan da Cunha
+    de: St. Helena, Ascension und Tristan da Cunha
+    el: Αγία Ελένη, Ασενσιόν και Τριστάν ντα Κούνια
+    en: Saint Helena, Ascension and Tristan da Cunha
+    eo: Sankta Heleno, Ascension kaj Tristan da Cunha
+    es: Santa Elena, Ascensión y Tristán de Acuña
+    fa: سنت هلنا، اسنشن و تریستان دا کونا
+    fr: Sainte-Hélène, Ascension et Tristan da Cunha
+    hr: Sveta Helena
+    hu: Szent Ilona, Ascension és Tristan da Cunha
+    it: Sant'Elena, Ascensione e Tristan da Cunha
+    lt: Šventoji Elena, Dangun Žengimo ir Tristanas da Kunja
+    mk: Света Елена, Успение и Тристан да Куња
+    nl: Sint-Helena, Ascension en Tristan da Cunha
+    pt: Santa Helena, Ascensão e Tristão da Cunha
+    ru: Острова Святой Елены, Вознесения и Тристан-да-Кунья
+    sk: Svätá Helena, Ascension a Tristan da Cunha
+    sr: Света Хелена, Асенсион, и Тристан да Куња
+    tr: Saint Helena, Ascension ve Tristan da Cunha
+    uk: Острови Святої Єлени, Вознесіння і Тристан-да-Кунья
+    vi: Saint Helena, Ascension và Tristan da Cunha
+    zh: 圣赫勒拿、阿森松和特里斯坦-达库尼亚
diff --git a/settings/country-names/si.yaml b/settings/country-names/si.yaml
new file mode 100644 (file)
index 0000000..2998010
--- /dev/null
@@ -0,0 +1,129 @@
+name: 
+    default: Slovenija
+    af: Slowenië
+    am: ስሎቬኒያ
+    an: Eslovenia
+    ar: سلوفينيا
+    az: Sloveniya
+    ba: Словения
+    be: Славенія
+    bg: Словения
+    bi: Slovenia
+    bn: স্লোভেনিয়া
+    bo: སི་ལོ་ཝེ་ནི་ཡ།
+    br: Slovenia
+    bs: Slovenija
+    ca: Eslovènia
+    ce: Словени
+    co: Sluvenia
+    cs: Slovinsko
+    cu: Їллѷрїиска Словѣнїꙗ
+    cv: Словени
+    cy: Slofenia
+    da: Slovenien
+    de: Slowenien
+    dv: ސުލޮވީނިއާ
+    ee: Slovenia
+    el: Σλοβενία
+    en: Slovenia
+    eo: Slovenio
+    es: Eslovenia
+    et: Sloveenia
+    eu: Eslovenia
+    fa: اسلوونی
+    fi: Slovenia
+    fo: Slovenia
+    fr: Slovénie
+    fy: Sloveenje
+    ga: An tSlóivéin
+    gd: Sloibhìnia
+    gl: Eslovenia
+    gn: Eloveña
+    gu: સ્લોવેનિયા
+    gv: Yn Clovean
+    he: סלובניה
+    hi: स्लोवेनिया
+    hr: Slovenija
+    ht: Sloveni
+    hu: Szlovénia
+    hy: Սլովենիա
+    ia: Slovenia
+    id: Slovenia
+    ie: Slovenia
+    io: Slovenia
+    is: Slóvenía
+    it: Slovenia
+    ja: スロベニア
+    jv: Slovénia
+    ka: სლოვენია
+    kg: Slovenia
+    kk: Словения
+    kl: Slovenia
+    ko: 슬로베니아
+    ku: Slovenya
+    kv: Словения
+    kw: Sloveni
+    la: Slovenia
+    lb: Slowenien
+    li: Slovenië
+    ln: Slovenia
+    lt: Slovėnija
+    lv: Slovēnija
+    mi: Horowinia
+    mk: Словенија
+    ml: സ്ലൊവീന്യ
+    mn: Словен
+    mr: स्लोव्हेनिया
+    ms: Slovenia
+    mt: Slovenja
+    my: ဆလိုဗေးနီးယားနိုင်ငံ
+    na: Tsirobeniya
+    ne: स्लोभेनिया
+    nl: Slovenië
+    nn: Slovenia
+    "no": Slovenia
+    nv: Słobíín Bikéyah
+    oc: Eslovènia
+    or: ସ୍ଲୋଭେନିଆ
+    os: Словени
+    pl: Słowenia
+    ps: سلووانیا
+    pt: Eslovénia
+    qu: Isluwinya
+    rm: Slovenia
+    ro: Slovenia
+    ru: Словения
+    rw: Siloveniya
+    sa: स्लोवीनिया
+    sc: Islovènia
+    se: Slovenia
+    sh: Slovenija
+    sk: Slovinsko
+    sl: Slovenija
+    sm: Slovenia
+    so: Isloveeniya
+    sq: Sllovenia
+    sr: Словенија
+    ss: Siloveni
+    st: Slovenia
+    su: Slovénia
+    sv: Slovenien
+    sw: Slovenia
+    ta: சுலோவீனியா
+    te: స్లోవేనియా
+    tg: Словения
+    th: ประเทศสโลวีเนีย
+    tk: Sloweniýa
+    tl: Eslobenya
+    tr: Slovenya
+    tt: Словения
+    ug: Slowéniye
+    uk: Словенія
+    ur: سلووینیا
+    uz: Sloveniya
+    vi: Slovenia
+    vo: Sloveniyän
+    wo: Esloweeni
+    yi: סלאוועניע
+    yo: Sloféníà
+    zh: 斯洛文尼亞
diff --git a/settings/country-names/sj.yaml b/settings/country-names/sj.yaml
new file mode 100644 (file)
index 0000000..f8ff8ec
--- /dev/null
@@ -0,0 +1,2 @@
+name: 
+    default: Svalbard and Jan Mayen
diff --git a/settings/country-names/sk.yaml b/settings/country-names/sk.yaml
new file mode 100644 (file)
index 0000000..8197c62
--- /dev/null
@@ -0,0 +1,128 @@
+name: 
+    default: Slovensko
+    af: Slowakye
+    am: ስሎቫኪያ
+    an: Eslovaquia
+    ar: سلوفاكيا
+    az: Slovakiya
+    ba: Словакия
+    be: Славакія
+    bg: Словакия
+    bi: Slovakia
+    bn: স্লোভাকিয়া
+    bo: སི་ལོ་ཕ་ཁེ།
+    br: Slovakia
+    bs: Slovačka
+    ca: Eslovàquia
+    ce: Словаки
+    co: Sluvacchia
+    cs: Slovensko
+    cu: Словѣньско
+    cv: Словаки
+    cy: Slofacia
+    da: Slovakiet
+    de: Slowakei
+    dv: ސުލޮވާކިއާ
+    ee: Slovakia
+    el: Σλοβακία
+    en: Slovakia
+    eo: Slovakio
+    es: Eslovaquia
+    et: Slovakkia
+    eu: Eslovakia
+    fa: اسلواکی
+    fi: Slovakia
+    fo: Slovakia
+    fr: Slovaquie
+    fy: Slowakije
+    ga: An tSlóvaic
+    gd: An t-Slòbhac
+    gl: Eslovaquia
+    gn: Elovakia
+    gu: સ્લોવાકિયા
+    gv: Yn Clovack
+    he: סלובקיה
+    hi: स्लोवाकिया
+    hr: Slovačka
+    ht: Slovaki
+    hu: Szlovákia
+    hy: Սլովակիա
+    ia: Slovachia
+    id: Slowakia
+    ie: Slovacia
+    io: Slovakia
+    is: Slóvakía
+    it: Slovacchia
+    ja: スロバキア
+    jv: Slowakia
+    ka: სლოვაკეთი
+    kg: Slovakia
+    kk: Словакия
+    kl: Slovakia
+    ko: 슬로바키아
+    ku: Slovakya
+    kv: Словакия
+    kw: Slovaki
+    ky: Словакия
+    la: Slovacia
+    lb: Slowakei
+    li: Slowakieë
+    ln: Slovakia
+    lt: Slovakija
+    lv: Slovākija
+    mi: Horowākia
+    mk: Словачка
+    ml: സ്ലോവാക്യ
+    mn: Словак
+    mr: स्लोव्हाकिया
+    ms: Slovakia
+    mt: Slovakkja
+    my: ဆလိုဗားကီးယားနိုင်ငံ
+    na: Slowakia
+    ne: स्लोभाकिया
+    nl: Slowakije
+    nn: Slovakia
+    "no": Slovakia
+    nv: Słóbaʼ Bikéyah
+    oc: Eslovaquia
+    or: ସ୍ଲୋଭାକିଆ
+    os: Словаки
+    pl: Słowacja
+    ps: سلواکيا
+    pt: Eslováquia
+    qu: Isluwakya
+    rm: Slovachia
+    ro: Slovacia
+    ru: Словакия
+    rw: Silovakiya
+    sa: स्लोवाकिया
+    se: Slovakia
+    sh: Slovačka
+    sk: Slovensko
+    sl: Slovaška
+    so: Islofaakiya
+    sq: Sllovakia
+    sr: Словачка
+    ss: Silovakhi
+    st: Slovakia
+    su: Slovakia
+    sv: Slovakien
+    sw: Slovakia
+    ta: சிலோவாக்கியா
+    tg: Словакия
+    th: ประเทศสโลวาเกีย
+    tk: Slowakiýa
+    tl: Eslobakya
+    tr: Slovakya
+    tt: Словакия
+    ug: سلوۋاكىيە
+    uk: Словаччина
+    ur: سلوواکیہ
+    uz: Slovakiya
+    vi: Slovakia
+    vo: Slovakiyän
+    wo: Eslowaaki
+    yi: סלאוואקיי
+    yo: Slofákíà
+    zh: 斯洛伐克
+    zu: ISlovaki
diff --git a/settings/country-names/sl.yaml b/settings/country-names/sl.yaml
new file mode 100644 (file)
index 0000000..8a948ea
--- /dev/null
@@ -0,0 +1,124 @@
+name: 
+    default: Sierra Leone
+    af: Sierra Leone
+    ak: Sierra Leone
+    am: ሴየራ ሌዎን
+    an: Sierra Leone
+    ar: سيراليون
+    az: Syerra-Leone
+    ba: Сьерра-Леоне
+    be: Сьера-Леонэ
+    bg: Сиера Леоне
+    bm: Sera Leon
+    bn: সিয়েরা লিওন
+    bo: སི་ར་ལེ་ཨོན།
+    br: Sierra Leone
+    bs: Sijera Leone
+    ca: Sierra Leone
+    ce: Сьерра-Леоне
+    cs: Sierra Leone
+    cy: Sierra Leone
+    da: Sierra Leone
+    de: Sierra Leone
+    dv: ސެރެލިއޯން
+    ee: Sierra Leone
+    el: Σιέρα Λεόνε
+    en: Sierra Leone
+    eo: Siera-Leono
+    es: Sierra Leona
+    et: Sierra Leone
+    eu: Sierra Leona
+    fa: سیرالئون
+    ff: Sarliyon
+    fi: Sierra Leone
+    fo: Sierra Leona
+    fr: Sierra Leone
+    fy: Sierra Leöane
+    ga: Siarra Leon
+    gd: Siarra Leòmhann
+    gl: Serra Leoa
+    gv: Sierra Leone
+    he: סיירה לאונה
+    hi: सिएरा लियोन
+    hr: Sijera Leone
+    ht: Syera Leòn
+    hu: Sierra Leone
+    hy: Սիերա Լեոնե
+    id: Sierra Leone
+    ie: Sierra Leone
+    io: Sierra Leone
+    is: Síerra Leóne
+    it: Sierra Leone
+    ja: シエラレオネ
+    jv: Sierra Leone
+    ka: სიერა-ლეონე
+    kg: Siera Leone
+    kk: Сиерра-Леоне
+    kn: ಸಿಯೆರ್ರಾ ಲಿಯೋನ್
+    ko: 시에라리온
+    ku: Sierra Leone
+    kw: Sierra Leon
+    la: Mons Leoninus
+    lb: Sierra Leone
+    li: Sierra Leone
+    ln: Sierra Leone
+    lt: Siera Leonė
+    lv: Sjerraleone
+    mi: Te Araone
+    mk: Сиера Леоне
+    ml: സീറാ ലിയോൺ
+    mn: Сьерра-Леоне
+    mr: सियेरा लिओन
+    ms: Sierra Leone
+    mt: Sierra Leone
+    my: ဆီရာလီယွန်နိုင်ငံ
+    nl: Sierra Leone
+    nn: Sierra Leone
+    "no": Sierra Leone
+    nv: Náshdóítsoh Bitsiijįʼ Daditłʼooʼígíí Bidził
+    oc: Sierra Leone
+    or: ସିଏରା ଲିଓନ
+    os: Сьеррæ-Леоне
+    pa: ਸਿਏਰਾ ਲਿਓਨ
+    pl: Sierra Leone
+    ps: سېرالیون
+    pt: Serra Leoa
+    qu: Liyun Urqu
+    ro: Sierra Leone
+    ru: Сьерра-Леоне
+    rw: Siyera Lewone
+    sa: सियारा-लियोन
+    sc: Sierra Leone
+    se: Sierra Leone
+    sg: Sierä-Leône
+    sh: Sijera Leone
+    si: සියෙරා ලියෝන්
+    sk: Sierra Leone
+    sl: Sierra Leone
+    sn: Sierra Leone
+    so: Sierra Leone
+    sq: Siera Leone
+    sr: Сијера Леоне
+    ss: ISiriya-Liyoni
+    su: Sierra Leone
+    sv: Sierra Leone
+    sw: Sierra Leone
+    ta: சியேரா லியோனி
+    tg: Сиерра Леоне
+    th: ประเทศเซียร์ราลีโอน
+    tk: Sýerra-Leone
+    tl: Bulubunduking Leona
+    tr: Sierra Leone
+    ts: Siyera Liyona
+    tw: Sierra Leone
+    ug: سيېررا لېئونې
+    uk: Сьєрра-Леоне
+    ur: سیرالیون
+    uz: Syerra Leone
+    vi: Sierra Leone
+    vo: Sieraleonän
+    wo: Siraa Leyoon
+    yi: סיערע לעאנע
+    yo: Siẹrra Léònè
+    zh: 塞拉利昂
+    zu: ISiera Liyoni
diff --git a/settings/country-names/sm.yaml b/settings/country-names/sm.yaml
new file mode 100644 (file)
index 0000000..2475226
--- /dev/null
@@ -0,0 +1,40 @@
+name: 
+    default: San Marino
+    ar: سان مارينو
+    be: Сан-Марына
+    bg: Сан Марино
+    br: San Marino
+    cs: San Marino
+    da: San Marino
+    de: San Marino
+    el: Άγιος Μαρίνος
+    en: San Marino
+    eo: San-Marino
+    fa: سان مارینو
+    fi: San Marino
+    fr: Saint-Marin
+    fy: San Marino
+    ga: San Mairíne
+    he: סן מרינו
+    hr: San Marino
+    hu: San Marino
+    ia: San Marino
+    io: San Marino
+    is: San Marínó
+    it: San Marino
+    la: Sancti Marini
+    lt: San Marinas
+    mi: Hato Marino
+    mn: Сан-Марино
+    nl: San Marino
+    pl: San Marino
+    pt: San Marino
+    ru: Сан-Марино
+    se: San Marino
+    sk: San Maríno
+    sv: San Marino
+    ta: சான் மரீனோ
+    th: ประเทศซานมารีโน
+    uk: Сан-Маріно
+    vo: Sanmarinän
+    zh: 圣马力诺
diff --git a/settings/country-names/sn.yaml b/settings/country-names/sn.yaml
new file mode 100644 (file)
index 0000000..ae8d263
--- /dev/null
@@ -0,0 +1,130 @@
+name: 
+    default: Sénégal
+    af: Senegal
+    am: ሴኔጋል
+    an: Senegal
+    ar: السنغال
+    az: Seneqal
+    ba: Сенегал
+    be: Сенегал
+    bg: Сенегал
+    bm: Senegal
+    bn: সেনেগাল
+    bo: སི་ནི་གཱལ།
+    br: Senegal
+    bs: Senegal
+    ca: Senegal
+    ce: Сенегал
+    cs: Senegal
+    cv: Сенегал
+    cy: Sénégal
+    da: Senegal
+    de: Senegal
+    dv: ސެނެގާލް
+    ee: Senegal
+    el: Σενεγάλη
+    en: Senegal
+    eo: Senegalo
+    es: Senegal
+    et: Senegal
+    eu: Senegal
+    fa: سنگال
+    ff: Senegaal
+    fi: Senegal
+    fo: Senegal
+    fr: Sénégal
+    fy: Senegal
+    ga: An tSeineagáil
+    gd: Seanagal
+    gl: Senegal
+    gv: Yn Tenegaal
+    ha: Senegal
+    he: סנגל
+    hi: सेनेगल
+    hr: Senegal
+    ht: Senegal
+    hu: Szenegál
+    hy: Սենեգալ
+    ia: Senegal
+    id: Senegal
+    ie: Senegal
+    io: Senegal
+    is: Senegal
+    it: Senegal
+    ja: セネガル
+    jv: Senegal
+    ka: სენეგალი
+    kg: Senangale
+    kk: Сенегал
+    kn: ಸೆನೆಗಲ್
+    ko: 세네갈
+    ku: Senegal
+    kw: Senegal
+    ky: Сенегал
+    la: Senegalia
+    lb: Senegal
+    li: Senegal
+    ln: Senegale
+    lt: Senegalas
+    lv: Senegāla
+    mi: Henekara
+    mk: Сенегал
+    ml: സെനെഗൽ
+    mn: Сенегал
+    mr: सेनेगाल
+    ms: Senegal
+    mt: Senegal
+    my: ဆီနီဂေါနိုင်ငံ
+    na: Senegal
+    nl: Senegal
+    nn: Senegal
+    "no": Senegal
+    oc: Senegal
+    or: ସେନେଗାଲ
+    os: Сенегал
+    pa: ਸੇਨੇਗਲ
+    pl: Senegal
+    ps: سېنېګال
+    pt: Senegal
+    qu: Sinigal
+    ro: Senegal
+    ru: Сенегал
+    rw: Senegali
+    sa: सेनेगल
+    sc: Senegàl
+    sd: سينيگال
+    se: Senegal
+    sg: Senegäle
+    sh: Senegal
+    sk: Senegal
+    sl: Senegal
+    sn: Senegal
+    so: Sinigaal
+    sq: Senegali
+    sr: Сенегал
+    st: Senegal
+    su: Sénégal
+    sv: Senegal
+    sw: Senegal
+    ta: செனிகல்
+    te: సెనెగల్
+    tg: Сенегал
+    th: ประเทศเซเนกัล
+    ti: ሴኔጋል
+    tk: Senegal
+    tl: Senegal
+    tr: Senegal
+    ts: Senegal
+    tt: Сенегал
+    ug: سېنېگال
+    uk: Сенегал
+    ur: سینیگال
+    uz: Senegal
+    vi: Sénégal
+    vo: Senegalän
+    wa: Senegal
+    wo: Senegaal
+    yi: סענעגאל
+    yo: Sẹ̀nẹ̀gàl
+    zh: 塞内加尔
+    zu: ISenegal
diff --git a/settings/country-names/so.yaml b/settings/country-names/so.yaml
new file mode 100644 (file)
index 0000000..04b4b0b
--- /dev/null
@@ -0,0 +1,131 @@
+name: 
+    default: Soomaaliya الصومال
+    af: Somalië
+    am: ሶማሊያ
+    an: Somalia
+    ar: الصومال
+    az: Somali
+    ba: Сомали
+    be: Самалі
+    bg: Сомалия
+    bn: সোমালিয়া
+    bo: སོ་མ་ལི།
+    br: Somalia
+    bs: Somalija
+    ca: Somàlia
+    ce: Сомали
+    cs: Somálsko
+    cy: Somalia
+    da: Somalia
+    de: Somalia
+    dv: ސޯމާލިއާ
+    ee: Somalia
+    el: Σομαλία
+    en: Somalia
+    eo: Somalio
+    es: Somalia
+    et: Somaalia
+    eu: Somalia
+    fa: سومالی
+    fi: Somalia
+    fo: Somalia
+    fr: Somalie
+    fy: Somaalje
+    ga: An tSomáil
+    gd: Somàilia
+    gl: Somalia
+    gv: Yn Tomaal
+    he: סומליה
+    hi: सोमालिया
+    hr: Somalija
+    ht: Somali
+    hu: Szomália
+    hy: Սոմալի
+    ia: Somalia
+    id: Somalia
+    ie: Somalia
+    io: Somalia
+    is: Sómalía
+    it: Somalia
+    ja: ソマリア
+    jv: Somalia
+    ka: სომალი
+    kg: Sômâlia
+    ki: Somalia
+    kk: Сомали
+    kn: ಸೊಮಾಲಿಯ
+    ko: 소말리아
+    ku: Somalya
+    kw: Somali
+    la: Somalia
+    lb: Somalia
+    li: Somalië
+    ln: Somalia
+    lt: Somalis
+    lv: Somālija
+    mg: Somalia
+    mi: Hūmārie
+    mk: Сомалија
+    ml: സൊമാലിയ
+    mn: Сомали
+    mr: सोमालिया प्रजासत्ताक
+    ms: Somalia
+    mt: Somalja
+    my: ဆိုမာလီယာနိုင်ငံ
+    na: Tomariya
+    nl: Somalië
+    nn: Somalia
+    "no": Somalia
+    nv: Soomáálii Bikéyah
+    oc: Somalia
+    om: Somaaliyaa
+    or: ସୋମାଲିଆ
+    os: Сомали
+    pa: ਸੋਮਾਲੀਆ
+    pl: Somalia
+    ps: سومالیا
+    pt: Somália
+    qu: Sumalya
+    rm: Somalia
+    ro: Somalia
+    ru: Сомали
+    rw: Somaliya
+    sa: सोमालिया
+    sc: Somàlia
+    se: Somália
+    sg: Somalïi
+    sh: Somalija
+    si: සෝමාලියාව
+    sk: Somálsko
+    sl: Somalija
+    sm: Somalia
+    sn: Somalia
+    so: Soomaaliya
+    sq: Somalia
+    sr: Сомалија
+    ss: ISomaliya
+    st: Somalia
+    su: Somalia
+    sv: Somalia
+    sw: Somalia
+    ta: சோமாலியா
+    te: సొమాలియా
+    tg: Сумолӣ
+    th: ประเทศโซมาเลีย
+    ti: ሶማሊያ
+    tk: Somali
+    tl: Somalya
+    tr: Somali
+    ts: Somalia
+    tt: Сомали
+    ug: سومالى
+    uk: Сомалі
+    ur: صومالیہ
+    uz: Somali
+    vi: Somalia
+    vo: Somalän
+    wo: Somali
+    yi: סאמאליע
+    yo: Sòmálíà
+    zh: 索马里
+    zu: ISomalia
diff --git a/settings/country-names/sr.yaml b/settings/country-names/sr.yaml
new file mode 100644 (file)
index 0000000..f87b558
--- /dev/null
@@ -0,0 +1,117 @@
+name: 
+    default: Suriname
+    af: Suriname
+    am: ሱሪናም
+    an: Surinam
+    ar: سورينام
+    ay: Suriname
+    az: Surinam
+    ba: Суринам
+    be: Сурынам
+    bg: Суринам
+    bn: সুরিনাম
+    bo: སུ་རི་ནེམ།
+    br: Surinam
+    bs: Surinam
+    ca: Surinam
+    ce: Суринам
+    cs: Surinam
+    cv: Суринам
+    cy: Suriname
+    da: Surinam
+    de: Suriname
+    dv: ސުރިނާމް
+    ee: Suriname
+    el: Σουρινάμ
+    en: Suriname
+    eo: Surinamo
+    es: Surinam
+    et: Suriname
+    eu: Surinam
+    fa: سورینام
+    fi: Suriname
+    fo: Surinam
+    fr: Suriname
+    fy: Suriname
+    ga: Suranam
+    gd: Suranam
+    gl: Suriname
+    gn: Surinam
+    gu: સુરીનામ
+    gv: Yn Toorinam
+    he: סורינאם
+    hi: सूरीनाम
+    hr: Surinam
+    ht: Sirinam
+    hu: Suriname
+    hy: Սուրինամ
+    id: Suriname
+    ie: Surinam
+    io: Surinam
+    is: Súrínam
+    it: Suriname
+    ja: スリナム
+    jv: Suriname
+    ka: სურინამი
+    kk: Суринам
+    kl: Suriname
+    kn: ಸುರಿನಾಮ್
+    ko: 수리남
+    ku: Sûrînam
+    kw: Surinam
+    la: Surinamia
+    lb: Surinam
+    li: Suriname
+    ln: Suriname
+    lt: Surinamas
+    lv: Surinama
+    mi: Hurināme
+    mk: Суринам
+    ml: സുരിനാം
+    mn: Суринам
+    mr: सुरिनाम
+    ms: Suriname
+    mt: Surinam
+    my: ဆူရာနမ်နိုင်ငံ
+    nl: Suriname
+    nn: Surinam
+    "no": Surinam
+    nv: Sówinam
+    oc: Surinam
+    or: ସରିନମ
+    os: Суринам
+    pa: ਸੂਰੀਨਾਮ
+    pl: Surinam
+    ps: سورينام
+    pt: Suriname
+    qu: Surinam
+    rm: Suriname
+    ro: Surinam
+    ru: Суринам
+    rw: Surinamu
+    se: Suriname
+    sh: Surinam
+    sk: Surinam
+    sl: Surinam
+    so: Surinam
+    sq: Surinami
+    sr: Суринам
+    su: Suriname
+    sv: Surinam
+    sw: Surinam
+    ta: சுரிநாம்
+    te: సురినామ్
+    th: ประเทศซูรินาเม
+    tl: Surinam
+    tr: Surinam
+    tt: Суринам
+    ug: سۇرىنام
+    uk: Суринам
+    ur: سرینام
+    uz: Surinam
+    vi: Suriname
+    vo: Surinän
+    wo: Surinaam
+    yi: סורינאם
+    yo: Sùrìnámù
+    zh: 蘇利南
diff --git a/settings/country-names/ss.yaml b/settings/country-names/ss.yaml
new file mode 100644 (file)
index 0000000..54c3aef
--- /dev/null
@@ -0,0 +1,108 @@
+name: 
+    default: South Sudan
+    af: Suid-Soedan
+    am: ደቡብ ሱዳን
+    an: Sudán d'o Sud
+    ar: جنوب السودان
+    av: Югалъулаб Судан
+    az: Cənubi Sudan
+    be: Паўднёвы Судан
+    bg: Южен Судан
+    bn: দক্ষিণ সুদান
+    br: Soudan ar Su
+    bs: Južni Sudan
+    ca: Sudan del Sud
+    cs: Jižní Súdán
+    cv: Кăнтăр Судан
+    cy: De Sudan
+    da: Sydsudan
+    de: Südsudan
+    el: Νότιο Σουδάν
+    en: South Sudan
+    eo: Suda Sudano
+    es: Sudán del Sur
+    et: Lõuna-Sudaan
+    eu: Hego Sudan
+    fa: سودان جنوبی
+    fi: Etelä-Sudan
+    fo: Suðursudan
+    fr: Sud-Soudan
+    fy: Súd-Sûdan
+    ga: An tSúdáin Theas
+    gd: Sudàn a Deas
+    gl: Sudán do Sur
+    gv: Yn Toodaan Yiass
+    he: דרום סודאן
+    hi: दक्षिण सूडान
+    hr: Južni Sudan
+    hu: Dél-Szudán
+    hy: Հարավային Սուդան
+    ia: Sudan del Sud
+    id: Sudan Selatan
+    ie: Sud-Sudan
+    io: Sud-Sudan
+    is: Suður-Súdan
+    it: Sudan del Sud
+    ja: 南部スーダン
+    jv: Sudan Kidul
+    ka: სამხრეთი სუდანი
+    kk: Оңтүстік Судан
+    ko: 남수단
+    ku: Sûdana Başûr
+    kv: Лунвыв Судан
+    kw: Soudan Soth
+    ky: Түштүк Судан
+    la: Sudania Australis
+    lb: Südsudan
+    li: Zuid-Soedan
+    lt: Pietų Sudanas
+    lv: Dienvidsudāna
+    mk: Јужен Судан
+    ml: ദക്ഷിണ സുഡാൻ
+    mr: दक्षिण सुदान
+    ms: Sudan Selatan
+    my: တောင်ဆူဒန်နိုင်ငံ
+    na: South Sudan
+    nl: Zuid-Soedan
+    nn: Sør-Sudan
+    "no": Sør-Sudan
+    nv: Shádiʼááhjí Soodą́ą
+    oc: Sodan del Sud
+    or: ଦକ୍ଷିନ ସୁଦାନ
+    pa: ਦੱਖਣੀ ਸੁਡਾਨ
+    pl: Sudan Południowy
+    ps: سوېلي سوډان
+    pt: Sudão do Sul
+    qu: Urin Sudan
+    rm: Sudan dal Sid
+    ro: Sudanul de Sud
+    ru: Южный Судан
+    sc: Sudan Meridionali
+    se: Lulli-Sudan
+    sg: Sudäan-Mbongo
+    sh: Južni Sudan
+    sk: Južný Sudán
+    sl: Južni Sudan
+    sn: South Sudan
+    so: Koonfur Suudaan
+    sq: Sudani i Jugut
+    sr: Јужни Судан
+    su: Sudan Kidul
+    sv: Sydsudan
+    sw: Sudan Kusini
+    ta: தெற்கு சூடான்
+    te: దక్షిణ సూడాన్
+    th: ประเทศเซาท์ซูดาน
+    tk: Günorta Sudan
+    tl: Timog Sudan
+    tr: Güney Sudan
+    tt: Көньяк Судан
+    uk: Південний Судан
+    ur: جنوبی سوڈان
+    uz: Janubiy Sudan
+    vi: Nam Sudan
+    vo: Sulüda-Sudän
+    yi: דרום סודאן
+    yo: Gúúsù Sudan
+    zh: 南蘇丹
+    zu: ISudan yaseNingizimu
diff --git a/settings/country-names/st.yaml b/settings/country-names/st.yaml
new file mode 100644 (file)
index 0000000..0e09d17
--- /dev/null
@@ -0,0 +1,48 @@
+name: 
+    default: São Tomé e Príncipe
+    af: São Tomé en Principe
+    ar: سان تومي وبرينسيبي
+    br: São Tomé ha Príncipe
+    ca: São Tomé i Príncipe
+    cs: Svatý Tomáš a Princův ostrov
+    cy: São Tomé a Príncipe
+    da: São Tomé og Príncipe
+    de: São Tomé und Príncipe
+    el: Σάο Τομέ και Πρίνσιπε
+    en: São Tomé and Príncipe
+    eo: Sao-Tomeo kaj Principeo
+    es: Santo Tomé y Príncipe
+    et: São Tomé ja Príncipe
+    fa: سائوتومه و پرینسیپ
+    fi: São Tomé ja Príncipe
+    fr: Sao Tomé-et-Principe
+    fy: Sao Tomee en Prinsipe
+    ga: São Tomé agus Príncipe
+    gd: São Tomé agus Príncipe
+    he: סאו טומה ופרינסיפה
+    hr: Sveti Toma i Princip
+    hu: São Tomé és Príncipe
+    id: Sao Tome dan Principe
+    io: San-Tome e Principe
+    is: Saó Tóme og Prinsípe
+    la: Insulae Sancti Thomae et Principis
+    lb: São Tomé a Príncipe
+    li: São Tomé en Príncipe
+    lt: Sao Tomė ir Prinsipė
+    mn: Сан-Томе ба Принсипи
+    nl: Sao Tomé en Principe
+    pl: Wyspy Świętego Tomasza i Książęca
+    pt: São Tomé e Príncipe
+    ru: Сан-Томе и Принсипи
+    se: São Tomé ja Príncipe
+    sk: Svätý Tomáš a Princov ostrov
+    sl: Sveti Tomaž in Princ
+    sr: Сао Томе и Принсипе
+    sv: São Tomé och Príncipe
+    ta: சாவோ தொமே மற்றும் பிரின்சிப்பி
+    th: ประเทศเซาตูเมและปรินซิปี
+    tr: São Tomé ve Príncipe
+    uk: Сан-Томе і Принсіпі
+    vi: São Tomé và Príncipe
+    vo: Saluda-Tomeän e Prinsipeän
+    zh: 圣多美和普林西比
diff --git a/settings/country-names/sv.yaml b/settings/country-names/sv.yaml
new file mode 100644 (file)
index 0000000..b529dc8
--- /dev/null
@@ -0,0 +1,119 @@
+name: 
+    default: El Salvador
+    af: El Salvador
+    am: ኤል ሳልቫዶር
+    an: El Salvador
+    ar: السلفادور
+    ay: El Salvador
+    az: Salvador
+    ba: Сальвадор
+    be: Сальвадор
+    bg: Салвадор
+    bm: El Salvador
+    bn: এল সালভাদোর
+    bo: ཨིལ་སལ་ཝ་ཌོར།
+    br: El Salvador
+    bs: El Salvador
+    ca: El Salvador
+    ce: Сальвадор
+    cs: Salvador
+    cy: El Salvador
+    da: El Salvador
+    de: El Salvador
+    dv: އެލްސެލްވަޑޯރު
+    ee: El Salvador
+    el: Ελ Σαλβαδόρ
+    en: El Salvador
+    eo: Salvadoro
+    es: República de El Salvador
+    et: El Salvador
+    eu: El Salvador
+    fa: السالوادور
+    fi: El Salvador
+    fo: El Salvador
+    fr: Salvador
+    fy: El Salvador
+    ga: An tSalvadóir
+    gd: El Salbhador
+    gl: O Salvador
+    gn: Salvador
+    gv: Yn Salvador
+    he: אל סלוודור
+    hi: अल साल्वाडोर
+    hr: Salvador
+    ht: Salvadò
+    hu: Salvador
+    hy: Սալվադոր
+    ia: El Salvador
+    id: El Salvador
+    io: Salvadoria
+    is: El Salvador
+    it: El Salvador
+    ja: エルサルバドル
+    jv: El Salvador
+    ka: სალვადორი
+    kk: Эль-Сальвадор Республикасы
+    kn: ಎಲ್ ಸಾಲ್ವಡಾರ್
+    ko: 엘살바도르
+    ku: El Salvador
+    kw: El Salvador
+    la: Salvatoria
+    lb: El Salvador
+    li: El Salvador
+    ln: El Salvador
+    lt: Salvadoras
+    lv: Salvadora
+    mi: Te Whakaora
+    mk: Ел Салвадор
+    ml: എൽ സാൽവദോർ
+    mn: Эль Сальвадор
+    mr: एल साल्व्हाडोर
+    ms: El Salvador
+    mt: El Salvador
+    my: အယ်ဆာဗေဒိုနိုင်ငံ
+    na: Ersarbador
+    ne: एल साल्भादोर
+    nl: El Salvador
+    nn: El Salvador
+    "no": El Salvador
+    oc: Lo Salvador
+    or: ଏଲ ସାଲଭାଡୋର
+    os: Сальвадор
+    pa: ਸਾਲਵਾਦੋਰ
+    pl: Salwador
+    ps: اېلسلوادور
+    pt: El Salvador
+    qu: Salwadur
+    ro: El Salvador
+    ru: Сальвадор
+    rw: Saluvadoro
+    sa: एल-साल्वाडोर
+    se: El Salvador
+    sh: Salvador
+    si: එල් සැල්ව‍ඩෝ
+    sk: Salvádor
+    sl: Salvador
+    so: El Salfador
+    sq: Salvadori
+    sr: Салвадор
+    ss: ISalivado
+    su: Él Salvador
+    sv: El Salvador
+    sw: El Salvador
+    ta: எல் சால்வடோர்
+    tg: Салвадор
+    th: ประเทศเอลซัลวาดอร์
+    tl: El Salvador
+    tr: El Salvador
+    tt: Сальвадор
+    ug: ئەل سالۋادور
+    uk: Сальвадор
+    ur: ایل سیلواڈور
+    uz: El Salvador
+    vi: El Salvador
+    vo: Salvadorän
+    wo: Salbadoor
+    yi: על סאלוואדאר
+    yo: El Salfador
+    zh: 萨尔瓦多
+    zu: El Salvador
diff --git a/settings/country-names/sx.yaml b/settings/country-names/sx.yaml
new file mode 100644 (file)
index 0000000..cbea3c0
--- /dev/null
@@ -0,0 +1,2 @@
+name: 
+    default: Sint Maarten
diff --git a/settings/country-names/sy.yaml b/settings/country-names/sy.yaml
new file mode 100644 (file)
index 0000000..a8ea281
--- /dev/null
@@ -0,0 +1,129 @@
+name: 
+    default: سوريا
+    af: Sirië
+    am: ሶርያ
+    an: Siria
+    ar: سوريا
+    av: Сирия
+    az: Suriya
+    ba: Сирия
+    be: Сірыя
+    bg: Сирия
+    bm: Suriya
+    bn: সিরিয়া
+    bo: སི་རི་ཡ།
+    br: Siria
+    bs: Sirija
+    ca: República Àrab Siriana
+    ce: Шема
+    cs: Sýrie
+    cu: Сѷрїꙗ
+    cv: Сири
+    cy: Syria
+    da: Syrien
+    de: Syrien
+    dv: ސޫރިޔާ
+    el: Συρία
+    en: Syria
+    eo: Sirio
+    es: Siria
+    et: Süüria
+    eu: Siria
+    fa: سوریه
+    fi: Syyria
+    fo: Sýria
+    fr: Syrie
+    fy: Syrje
+    ga: An tSiria
+    gd: Siria
+    gl: Siria - سورية
+    gu: સિરિયા
+    gv: Yn Teer
+    he: סוריה
+    hi: सीरिया
+    hr: Sirija
+    ht: Siri
+    hu: Szíria
+    hy: Սիրիա
+    ia: Syria
+    id: Suriah
+    ie: Siria
+    io: Siria
+    is: Sýrland
+    it: Siria
+    ja: シリア
+    jv: Suriah
+    ka: სირია
+    ki: Syria
+    kk: Сирия
+    kl: Syria
+    kn: ಸಿರಿಯಾ
+    ko: 시리아
+    ku: Sûrî
+    kv: Сирия
+    kw: Syri
+    ky: Сирия
+    la: Syria
+    lb: Syrien
+    li: Syrië
+    ln: Sirí
+    lt: Sirija
+    lv: Sīrija
+    mg: Siria
+    mi: Hiria
+    mk: Сирија
+    ml: സിറിയ
+    mn: Сири
+    mr: सीरिया
+    ms: Syria
+    my: ဆီးရီးယားနိုင်ငံ
+    na: Syria
+    ne: सीरिया
+    nl: Syrië
+    nn: Syria
+    "no": Syria
+    nv: Sííwiya
+    oc: Siria
+    or: ସିରିଆ
+    os: Сири
+    pa: ਸੀਰੀਆ
+    pl: Syria
+    ps: سوريه
+    pt: Síria
+    qu: Sirya
+    ro: Siria
+    ru: Сирия
+    rw: Siriya
+    sa: सिरिया
+    sc: Siria
+    sd: شام
+    se: Syria
+    sh: Sirija
+    sk: Sýria
+    sl: Sirija
+    so: Suuriya
+    sq: Siria
+    sr: Сирија
+    ss: ISiriya
+    su: Suriah
+    sv: Syrien
+    sw: Syria
+    ta: சிரியா
+    te: సిరియా
+    tg: Сурия
+    th: ประเทศซีเรีย
+    tk: Siriýa
+    tl: Sirya
+    tr: Suriye
+    tt: Сүрия
+    ug: سۇرىيە
+    uk: Сирія
+    ur: شام
+    uz: Suriya
+    vi: Syria
+    vo: Süriyän
+    wa: Sireye
+    wo: Siri
+    yi: סיריע
+    yo: Síríà
+    zh: 叙利亚/敘利亞
diff --git a/settings/country-names/sz.yaml b/settings/country-names/sz.yaml
new file mode 100644 (file)
index 0000000..0a4bcab
--- /dev/null
@@ -0,0 +1,140 @@
+name: 
+    default: eSwatini
+    af: Swaziland
+    am: ስዋዚላንድ
+    an: Swazilandia
+    ar: سوازيلاند
+    ay: Suasïsuiu
+    az: Svazilend
+    ba: Свазиленд
+    be: Эсваціні
+    bg: Есватини
+    bm: Swazilandi
+    bn: সোয়াজিল্যান্ড
+    bo: སུ་ཝ་ཛི་ལནཌ།
+    br: Swaziland
+    bs: Svazilend
+    ca: Swazilàndia
+    cs: Svazijsko
+    cy: Gwlad Swazi
+    da: Swaziland
+    de: Eswatini
+    dv: ސުވާޒިލޭންޑު
+    dz: སུ་ཝ་ཛི་ལེནཌ
+    ee: Swaziland
+    el: Σουαζιλάνδη
+    en: Eswatini
+    eo: Svazilando
+    es: Suazilandia
+    et: Svaasimaa
+    eu: Swazilandia
+    fa: سوازیلند
+    ff: Swaasilannda
+    fi: Swazimaa
+    fo: Svasiland
+    fr: Swaziland
+    fy: Swazilân
+    ga: An tSuasalainn
+    gd: Dùthaich nan Suasaidh
+    gl: Suacilandia - Swaziland
+    gu: સ્વાઝીલેન્ડ
+    gv: Yn Çheer Swassee
+    ha: Suwazilan
+    he: סווזילנד
+    hi: स्वाज़ीलैण्ड
+    hr: Svazi
+    ht: Swazilann
+    hu: Szváziföld
+    hy: Սվազիլենդ
+    ia: Swazilandia
+    id: Swaziland
+    ie: Swaziland
+    io: Swazilando
+    is: Svasíland
+    it: Swaziland
+    ja: スワジランド
+    jv: Swaziland
+    ka: სვაზილენდი
+    kg: Swati
+    ki: Uswazi
+    kk: Суазиланд
+    kl: Swazilandi
+    km: សូហ្ស៉ីឡង់
+    kn: ಸ್ವಾಜಿಲ್ಯಾಂಡ್
+    ko: 스와질란드
+    ks: سُوزِلینٛڑ
+    ku: Swaziland
+    kw: Pow Swati
+    la: Swazia
+    lb: Swasiland
+    lg: Swazirandi
+    li: Swaziland
+    ln: Swaziland
+    lo: ສະວາຊິແລນ
+    lt: Svazilandas
+    lv: Svazilenda
+    mg: Soazilandy
+    mi: Warerangi
+    mk: Свазиленд
+    ml: സ്വാസിലാന്റ്
+    mn: Свазиланд
+    mr: स्वाझीलँड
+    ms: Swaziland
+    mt: Sważiland
+    my: ဆွာဇီလန်နိုင်ငံ
+    ne: स्वाजिल्याण्ड
+    nl: Swaziland
+    nn: Eswatini
+    "no": Eswatini
+    nv: Swáazi Dineʼé Bikéyah
+    oc: Swaziland
+    or: ସ୍ଵାଜିଲ୍ୟାଣ୍ଡ
+    os: Свазиленд
+    pa: ਸਵਾਜ਼ੀਲੈਂਡ
+    pl: Eswatini
+    ps: سوازيلانډ
+    pt: eSwatini
+    qu: Swasisuyu
+    rn: Suwazilandi
+    ro: eSwatini
+    ru: Эсватини
+    rw: Swazilande
+    sa: स्वाजीलैंड
+    sc: Swaziland
+    se: Swazieana
+    sg: Swäzïlânde
+    sh: Svazilend
+    si: ස්වාසිලන්තය
+    sk: Svazijsko
+    sl: Esvatini
+    sn: Swaziland
+    so: Swasiland
+    sq: Suazilendi
+    sr: Есватини
+    ss: eSwatini
+    su: Swaziland
+    sv: Swaziland
+    sw: Uswazi
+    ta: சுவாசிலாந்து
+    te: స్వాజీలేండ్
+    tg: Свазиленд
+    th: ประเทศสวาซิแลนด์
+    ti: ስዋዚላንድ
+    tk: Swazilend
+    tl: Suwasilandya
+    to: Suasileni
+    tr: Esvatini
+    ts: Swaziland
+    tt: Свазиленд
+    ug: سۋازىلېند
+    uk: Есватіні
+    ur: سوازی لینڈ
+    uz: Svazilend
+    ve: Swazini
+    vi: Eswatini
+    vo: Svasiyän
+    wo: Suwaasilaand
+    yi: סוואזילאנד
+    yo: Swásílándì
+    zh: 斯威士兰/斯威士蘭/史瓦濟蘭
+    zu: ISwazilandi
diff --git a/settings/country-names/tc.yaml b/settings/country-names/tc.yaml
new file mode 100644 (file)
index 0000000..944d744
--- /dev/null
@@ -0,0 +1,68 @@
+name: 
+    default: Turks and Caicos Islands
+    af: Turks en Caicos Eilande
+    an: Islas Turcas e Caicos
+    ar: جزر تركس وكايكوس
+    bg: Търкс и Кайкос
+    bn: টার্কস্‌ ও কেইকোস দ্বীপপুঞ্জ
+    br: Inizi  Turks ha Caicos
+    bs: Ostrva Turks i Caicos
+    ca: Illes Turks i Caicos
+    cs: Turks a Caicos
+    cv: Тĕркс тата Кайкос
+    cy: Ynysoedd Turks a Caicos
+    da: Turks- og Caicosøerne
+    de: Turks- und Caicosinseln
+    dv: ޓާކަސް އަދި ކައިކޯ ޖަޒީރާ
+    el: Τερκς και Κάικος
+    en: Turks and Caicos Islands
+    eo: Turkoj kaj Kajkoj
+    es: Islas Turcas y Caicos
+    et: Turks ja Caicos
+    eu: Turks eta Caicos uharteak
+    fa: جزایر تورکس و کایکوس
+    fi: Turks- ja Caicossaaret
+    fr: Îles Turques-et-Caïques
+    fy: Turks- en Kaikoseilannen
+    ga: Oileáin na dTurcach agus Caicos
+    gd: Oileáin na dTurcach agus Caicos
+    gl: Turks e Caicos
+    he: איי טרקס וקייקוס
+    hi: टर्क्स और केकोस द्वीप-समूह
+    hr: Otočje Turks i Caicos
+    hu: Turks- és Caicos-szigetek
+    id: Kepulauan Turks dan Caicos
+    io: Turks e Kaikos-Insuli
+    is: Turks- og Caicoseyjar
+    it: Turks e Caicos
+    ja: タークス・カイコス諸島
+    jv: Kapuloan Turks lan Caicos
+    ko: 터크스 케이커스 제도
+    kw: Turks ha Kaykos
+    lt: Terksas ir Kaikosas
+    lv: Tērksas un Kaikosas
+    mn: Туркс ба Кайкосын Арлууд
+    mr: टर्क्स आणि कैकास द्वीपसमूह
+    ms: Kepulauan Turks dan Caicos
+    nl: Turks- en Caicoseilanden
+    nn: Turks- og Caicosøyane
+    "no": Turks- og Caicosøyene
+    pl: Turks i Caicos
+    pt: Ilhas Turcas e Caicos
+    ro: Insulele Turks şi Caicos
+    ru: Тёркс и Кайкос
+    sh: Turks i Caicos Otoci
+    sk: Turks a Caicos
+    sl: Otoki Turks in Caicos
+    sq: Turks dhe Kaikos
+    sr: Туркс и Кајкос
+    sv: Turks- och Caicosöarna
+    sw: Visiwa vya Turks na Caicos
+    ta: துர்கசு கைகோசு தீவுகள்
+    th: หมู่เกาะเติร์กและไคคอส
+    tr: Turks ve Caicos Adaları
+    ug: Turks we Kaykos Taqim Aralliri
+    uk: Острови Теркс і Кайкос
+    vi: Quần đảo Turks và Caicos
+    wo: Turks and Caicos Islands
+    zh: 特克斯和凱科斯群島
diff --git a/settings/country-names/td.yaml b/settings/country-names/td.yaml
new file mode 100644 (file)
index 0000000..1fec17f
--- /dev/null
@@ -0,0 +1,130 @@
+name: 
+    default: Tchad تشاد
+    af: Tsjad
+    am: ቻድ
+    an: Chad
+    ar: تشاد
+    az: Çad
+    ba: Чад
+    be: Чад
+    bg: Чад
+    bm: Cad
+    bn: চাদ
+    bo: ཆཱ་ཌ།
+    br: Tchad
+    bs: Čad
+    ca: Txad
+    ce: Чад
+    cs: Čad
+    cv: Чад
+    cy: Tchad
+    da: Tchad
+    de: Tschad
+    dv: ޝާދު
+    ee: Chad
+    el: Τσαντ
+    en: Chad
+    eo: Ĉado
+    es: Chad
+    et: Tšaad
+    eu: Txad
+    fa: چاد
+    fi: Tšad
+    fo: Kjad
+    fr: Tchad
+    fy: Tsjaad
+    ga: Sead
+    gd: An t-Siad
+    gl: Chad - Tchad
+    gu: ચૅડ
+    gv: Shad
+    ha: Cadi
+    he: צ'אד
+    hi: चाड
+    hr: Čad
+    ht: Tchad
+    hu: Csád
+    hy: Չադ
+    ia: Tchad
+    id: Chad
+    ie: Chad
+    ig: Chad
+    io: Chad
+    is: Tsjad
+    it: Ciad
+    ja: チャド
+    jv: Chad
+    ka: ჩადი
+    kg: Tasadi
+    kk: Чад
+    ko: 차드
+    ku: Çad
+    kw: Chad
+    la: Tzadia
+    lb: Tschad
+    li: Tsjaad
+    ln: Tshadi
+    lt: Čadas
+    lv: Čada
+    mi: Kāta
+    mk: Чад
+    ml: ഛാഡ്
+    mn: Чад
+    mr: चाड
+    ms: Chad
+    mt: Ċad
+    my: ချဒ်သမ္မတနိုင်ငံ
+    na: Tsiad
+    nl: Tsjaad
+    nn: Tsjad
+    "no": Tsjad
+    oc: Chad
+    or: ଚାଡ
+    os: Чад
+    pa: ਚਾਡ
+    pl: Czad
+    ps: چاډ
+    pt: Chade
+    qu: Chad
+    rm: Tschad
+    ro: Ciad
+    ru: Чад
+    rw: Cade
+    sa: चाड
+    sc: Chad
+    se: Chad
+    sg: Sâde
+    sh: Čad
+    si: චෑඩ්
+    sk: Čad
+    sl: Čad
+    sn: Chad
+    so: Jad
+    sq: Çadi
+    sr: Чад
+    ss: IShedi
+    su: Chad
+    sv: Tchad
+    sw: Chad
+    ta: சாட்
+    te: చాద్
+    tg: Чад
+    th: ประเทศชาด
+    ti: ቻድ
+    tk: Çad
+    tl: Tsad
+    tr: Çad
+    ts: Chad
+    tt: Чад
+    ug: چاد
+    uk: Чад
+    ur: چاڈ
+    uz: Chad
+    vi: Tchad
+    vo: Tjadän
+    wa: Tchad
+    wo: Cadd
+    yi: טשאד
+    yo: Tsad
+    zh: 乍得
+    zu: ITshedi
diff --git a/settings/country-names/tf.yaml b/settings/country-names/tf.yaml
new file mode 100644 (file)
index 0000000..81bc153
--- /dev/null
@@ -0,0 +1,48 @@
+name: 
+    default: Terres australes et antarctiques françaises
+    af: Franse Suidelike en Antarktiese Gebiede
+    an: Territorios Australs Franzeses
+    ar: الأراضي الجنوبية الفرنسية
+    be: Французскія Паўднёвыя тэрыторыі
+    bg: Френски южни и антарктически територии
+    br: Douaroù Aostral hag Antarktikel Frañs
+    ca: Terres Australs i Antàrtiques Franceses
+    cs: Francouzská jižní a antarktická území
+    da: Franske sydlige og Antarktiske territorier
+    de: Französische Süd- und Antarktisgebiete
+    el: Γαλλικά νότια και ανταρκτικά εδάφη
+    en: French Southern Lands
+    eo: Francaj Sudaj Teritorioj
+    es: Tierras Australes y Antárticas Francesas
+    eu: Frantziaren lurralde austral eta antartikoak
+    fi: Ranskan eteläiset ja antarktiset alueet
+    fr: Terres australes et antarctiques françaises
+    fy: Frânske Súdlike en Antarktyske Lannen
+    gl: Terras Austrais e Antárticas Francesas
+    hr: Francuski južni i antarktički teritoriji
+    hu: Francia déli és antarktiszi területek
+    id: Daratan Selatan dan Antarktika Perancis
+    is: Frönsku suðlægu landsvæðin
+    it: Terre Australi e Antartiche Francesi
+    ja: フランス領南方・南極地域
+    ko: 프랑스령 남부와 남극 지역
+    kw: Tiryow Deghow hag Antarktik Frynkek
+    lt: Prancūzijos Pietų Sritys
+    lv: Francijas Dienvidjūru un Antarktikas Zemes
+    nl: Franse Zuidelijke en Antarctische Gebieden
+    "no": De franske sørterritorier
+    oc: Tèrras Australas e Antarticas Francesas
+    pl: Francuskie Terytoria Południowe i Antarktyczne
+    pt: Terras Austrais e Antárticas Francesas
+    ro: Teritoriile australe şi antarctice franceze
+    ru: Французские Южные и Антарктические территории
+    sh: Francuske Južne Teritorije
+    sk: Francúzske južné a antarktické územia
+    sl: Francoske južne in antarktične dežele
+    sr: Француске јужне и антарктичке земље
+    sv: Franska sydterritorierna
+    ta: பிரெஞ்சு தென்னக நிலங்களும் அண்டாடிக் நிலமும்
+    tr: Fransız Güney ve Antarktika Toprakları
+    uk: Французькі Південні та Антарктичні території
+    vi: Vùng đất phía Nam và châu Nam Cực thuộc Pháp
+    zh: 法属南部领地
diff --git a/settings/country-names/tg.yaml b/settings/country-names/tg.yaml
new file mode 100644 (file)
index 0000000..4089912
--- /dev/null
@@ -0,0 +1,128 @@
+name: 
+    default: Togo
+    af: Togo
+    ak: Togo
+    am: ቶጎ
+    an: Togo
+    ar: توغو
+    az: Toqo
+    ba: Того
+    be: Тога
+    bg: Того
+    bm: Togo
+    bn: টোগো
+    bo: ཊོ་གོ
+    br: Togo
+    bs: Togo
+    ca: Togo
+    ce: Того
+    cs: Togo
+    cv: Того
+    cy: Togo
+    da: Togo
+    de: Togo
+    dv: ޓޯގޯ
+    ee: Togo
+    el: Τόγκο
+    en: Togo
+    eo: Togolando
+    es: Togo
+    et: Togo
+    eu: Togo
+    fa: توگو
+    fi: Togo
+    fr: Togo
+    fy: Togo
+    ga: Tóga
+    gd: Tògo
+    gl: Togo
+    gu: ટોગો
+    gv: Yn Togo
+    ha: Togo
+    he: טוגו
+    hi: टोगो
+    hr: Togo
+    ht: Togo
+    hu: Togo
+    hy: Տոգո
+    id: Togo
+    ie: Togo
+    ig: Togo
+    io: Togo
+    is: Tógó
+    it: Togo
+    ja: トーゴ
+    jv: Togo
+    ka: ტოგო
+    kk: Того
+    kn: ಟೊಗೊ
+    ko: 토고
+    ku: Togo
+    kw: Togo
+    la: Togum
+    lb: Togo
+    li: Togo
+    ln: Togo
+    lt: Togas
+    lv: Togo
+    mi: Toko
+    mk: Того
+    ml: ടോഗോ
+    mn: Того
+    mr: टोगो
+    ms: Togo
+    mt: Togo
+    my: တိုဂိုနိုင်ငံ
+    na: Togo
+    nl: Togo
+    nn: Togo
+    "no": Togo
+    nv: Tʼóogo
+    oc: Tògo
+    or: ଟୋଗୋ
+    os: Того
+    pa: ਟੋਗੋ
+    pl: Togo
+    pt: Togo
+    qu: Tugu
+    rm: Togo
+    ro: Togo
+    ru: Того
+    rw: Togo
+    sa: टोगो
+    sc: Togo
+    se: Togo
+    sg: Togö
+    sh: Togo
+    si: ටෝගෝ
+    sk: Togo
+    sl: Togo
+    sn: Togo
+    so: Togo
+    sq: Togo
+    sr: Того
+    ss: IThogo
+    st: Togo
+    su: Togo
+    sv: Togo
+    sw: Togo
+    ta: டோகோ
+    tg: Того
+    th: ประเทศโตโก
+    ti: ቶጎ
+    tk: Togo
+    tl: Togo
+    tr: Togo
+    ts: Togo
+    tw: Togo
+    ug: توگو
+    uk: Того
+    ur: ٹوگو
+    uz: Togo
+    vi: Togo
+    vo: Togoän
+    wo: Togóo
+    yi: טאגא
+    yo: Tógò
+    zh: 多哥
+    zu: ITogo
diff --git a/settings/country-names/th.yaml b/settings/country-names/th.yaml
new file mode 100644 (file)
index 0000000..f0527bd
--- /dev/null
@@ -0,0 +1,131 @@
+name: 
+    default: ประเทศไทย
+    af: Thailand
+    am: ታይላንድ
+    an: Tailandia
+    ar: تايلاند
+    as: থাইলেণ্ড
+    az: Tailand
+    ba: Таиланд
+    be: Тайланд
+    bg: Тайланд
+    bn: থাইল্যান্ড
+    bo: ཐའི་ལེན།
+    br: Thailand
+    bs: Tajland
+    ca: Tailàndia
+    ce: Таиланд
+    cs: Thajsko
+    cv: Таиланд
+    cy: Gwlad Thai
+    da: Thailand
+    de: Thailand
+    dv: ސިޔާމު
+    dz: ཐཱའི་ལེནཌ
+    el: Ταϊλάνδη
+    en: Thailand
+    eo: Tajlando
+    es: Tailandia
+    et: Tai
+    eu: Thailandia
+    fa: تایلند
+    fi: Thaimaa
+    fo: Teiland
+    fr: Thaïlande
+    fy: Tailân
+    ga: An Téalainn
+    gd: Dùthaich nan Tàidh
+    gl: Tailandia
+    gn: Tailandia
+    gu: થાઇલેન્ડ
+    gv: Yn Çheer Thai
+    he: תאילנד
+    hi: थाईलैण्ड
+    hr: Tajland
+    ht: Tayilann
+    hu: Thaiföld
+    hy: Թաիլանդ
+    ia: Thailanda
+    id: Thailand
+    ie: Thailand
+    io: Tailando
+    is: Taíland
+    it: Thailandia
+    ja: タイ王国
+    jv: Thailand
+    ka: ტაილანდი
+    ki: Thailand
+    kk: Тайланд
+    kl: Thailandi
+    km: ថៃ
+    kn: ಥೈಲ್ಯಾಂಡ್
+    ko: 태국
+    ks: تھائی لینڈ
+    ku: Taylenda
+    kv: Таиланд
+    kw: Pow Tay
+    la: Thailandia
+    lb: Thailand
+    li: Thailand
+    lo: ປະເທດໄທ
+    lt: Tailandas
+    lv: Taizeme
+    mg: Tailandy
+    mi: Tairana
+    mk: Тајланд
+    ml: തായ്‌ലാന്റ്
+    mn: Тайланд
+    mr: थायलंड
+    ms: Thailand
+    my: ထိုင်းနိုင်ငံ
+    na: Thailand
+    ne: थाइल्याण्ड
+    nl: Thailand
+    nn: Thailand
+    "no": Thailand
+    nv: Tʼáí Bikéyah
+    oc: Tailàndia
+    or: ଥାଇଲାଣ୍ଡ
+    os: Таиланд
+    pa: ਥਾਈਲੈਂਡ
+    pl: Tajlandia
+    ps: تايلنډ
+    pt: Tailândia
+    qu: Thaysuyu
+    ro: Thailanda
+    ru: Таиланд
+    rw: Tayilande
+    sa: श्यामदेश
+    sd: ٿائيلينڊ
+    se: Thaieana
+    sg: Tailânde
+    sh: Tajland
+    sk: Thajsko
+    sl: Tajska
+    so: Tayland
+    sq: Tajlanda
+    sr: Тајланд
+    ss: IThayilandi
+    su: Thailand
+    sv: Thailand
+    sw: Uthai
+    ta: தாய்லாந்து
+    te: థాయిలాండ్
+    tg: Таиланд
+    th: Muang Thai
+    tk: Tailand
+    tl: Taylandiya
+    tr: Tayland
+    tt: Таиланд
+    tw: Thailand
+    ug: تايلاند
+    uk: Таїланд
+    ur: تھائی لینڈ
+    uz: Tailand
+    vi: Thái Lan
+    vo: Tayän
+    wo: Taaylaand
+    yi: טיילאנד
+    yo: Tháílàndì
+    za: Daigoz
+    zh: 泰国
diff --git a/settings/country-names/tj.yaml b/settings/country-names/tj.yaml
new file mode 100644 (file)
index 0000000..5ca5ea8
--- /dev/null
@@ -0,0 +1,122 @@
+name: 
+    default: Тоҷикистон
+    af: Tadjikistan
+    am: ታጂኪስታን
+    an: Tachiquistán
+    ar: طاجيكستان
+    ay: Tayiksuyu
+    az: Tacikistan
+    ba: Тажикстан
+    be: Таджыкістан
+    bg: Таджикистан
+    bn: তাজিকিস্তান
+    bo: ཐ་ཇི་ཁེ་སི་ཏན།
+    br: Tadjikistan
+    bs: Tadžikistan
+    ca: Tadjikistan
+    ce: Таджикистан
+    cs: Tádžikistán
+    cu: Таджикистанъ
+    cv: Таджикистан
+    cy: Tajikistan
+    da: Tadsjikistan
+    de: Tadschikistan
+    dv: ތަޖިކިސްތާން
+    dz: ཏ་ཇག་ཀིསི་ཏཱན་
+    ee: Tajikistan
+    el: Τατζικιστάν
+    en: Tajikistan
+    eo: Taĝikio
+    es: Tayikistán
+    et: Tadžikistan
+    eu: Tajikistan
+    fa: تاجیکستان
+    fi: Tadžikistan
+    fo: Tadsjikistan
+    fr: Tadjikistan
+    fy: Tadzjikistan
+    ga: An Táidsíceastáin
+    gd: Taidigeastàn
+    gl: Taxiquistán
+    gu: તાજિકિસ્તાન
+    gv: Yn Tajikistaan
+    he: טג'יקיסטן
+    hi: ताजिकिस्तान
+    hr: Tadžikistan
+    ht: Tadjikistan
+    hu: Tádzsikisztán
+    hy: Տաջիկստան
+    ia: Tajikistan
+    id: Tajikistan
+    ie: Tadjikistan
+    io: Tajikistan
+    is: Tadsjikistan
+    it: Tagikistan
+    ja: タジキスタン
+    jv: Tajikistan
+    ka: ტაჯიკეთი
+    kk: Тәжікстан
+    km: តាជីគីស្ថាន
+    kn: ತಜಿಕಿಸ್ತಾನ್
+    ko: 타지키스탄
+    ku: Tacîkistan
+    kv: Таджикистан
+    kw: Pow Tajik
+    ky: Тажикстан
+    la: Tadzikistania
+    lb: Tadjikistan
+    li: Tadzjikistan
+    lt: Tadžikija
+    lv: Tadžikistāna
+    mk: Таџикистан
+    ml: താജിക്കിസ്ഥാൻ
+    mn: Тажикистан
+    mr: ताजिकिस्तान
+    ms: Tajikistan
+    my: တာဂျစ်ကစ္စတန်နိုင်ငံ
+    na: Tadjikitan
+    nl: Tadzjikistan
+    nn: Tadsjikistan
+    "no": Tadsjikistan
+    nv: Tʼajiʼ Bikéyah
+    oc: Tatgiquistan
+    or: ତାଜିକିସ୍ତାନ
+    os: Таджикистан
+    pl: Tadżykistan
+    ps: تاجيکستان
+    pt: Tajiquistão
+    qu: Tayiksuyu
+    ro: Tadjikistan
+    ru: Таджикистан
+    rw: Tajikisitani
+    sa: ताजिकिस्थान
+    se: Tažikistan
+    sh: Tadžikistan
+    si: ටජිකිස්ථාන්
+    sk: Tadžikistan
+    sl: Tadžikistan
+    so: Tadsjikistan
+    sq: Taxhikistani
+    sr: Таџикистан
+    ss: IThajiki
+    su: Tajikistan
+    sv: Tadzjikistan
+    sw: Tajikistan
+    ta: தஜிகிஸ்தான்
+    te: తజికిస్తాన్
+    tg: Тоҷикистон
+    th: ประเทศทาจิกิสถาน
+    tk: Täjigistan
+    tl: Tayikistan
+    tr: Tacikistan
+    tt: Таҗикстан
+    ug: تاجىكىستان
+    uk: Таджикистан
+    ur: تاجکستان
+    uz: Tojikiston
+    vi: Tajikistan
+    vo: Tacikistän
+    wo: Tajikistaan
+    yi: טאדזשיקיסטאן
+    yo: Tajikistan
+    zh: 塔吉克斯坦
diff --git a/settings/country-names/tk.yaml b/settings/country-names/tk.yaml
new file mode 100644 (file)
index 0000000..1dd288c
--- /dev/null
@@ -0,0 +1,69 @@
+name: 
+    default: Tokelau
+    am: ቶክላው
+    ar: توكلو
+    be: Такелаў
+    bg: Токелау
+    bm: Tokelo
+    bn: টোকেলাউ
+    br: Tokelau
+    ca: Tokelau
+    cs: Tokelau
+    da: Tokelau
+    de: Tokelau
+    dz: ཏོ་ཀེ་ལའུ་ མཚོ་གླིང
+    ee: Tokelau nutome
+    el: Τοκελάου
+    en: Tokelau
+    eo: Tokelao
+    es: Tokelau
+    fa: توکلائو
+    ff: Tokelaaw
+    fi: Tokelau
+    fr: Tokelau
+    fy: Tokelaû
+    ga: Oileáin Tócalá
+    gu: ટોકેલાઉ
+    ha: Takelau
+    he: טוקלאו
+    hi: तोकेलाउ
+    hr: Tokelau
+    hu: Tokelau-szigetek
+    is: Tókelá
+    ja: トケラウ
+    km: តូខេឡៅ
+    kn: ಟೊಕೆಲಾವ್
+    ko: 토켈라우
+    ks: توکیلاو
+    ku: Tokelau
+    lg: Tokelawu
+    lo: ໂຕເກເລົາ
+    lt: Tokelau
+    lv: Tokelau
+    mg: Tokelao
+    mk: Токелау
+    ml: ടൊകെലാവു
+    mn: Токелау
+    mr: तोकेलाउ
+    mt: Tokelaw
+    ne: तोगो
+    "no": Tokelau
+    or: ଟୋକେଲାଉ
+    pl: Tokelau
+    pt: Toquelau
+    rn: Tokelawu
+    ru: Токелау
+    si: ටොකලාවු
+    sk: Tokelau
+    sr: Токелау
+    sv: Tokelauöarna
+    ta: டோகேலோ
+    te: టోకేలావ్
+    th: โตเกเลา
+    ti: ቶክላው
+    uk: Токелау
+    ur: ٹوکیلاؤ
+    vi: Tokelau
+    yo: Orílẹ́ède Tokelau
+    zh: 托克劳
+    zu: i-Tokelau
diff --git a/settings/country-names/tl.yaml b/settings/country-names/tl.yaml
new file mode 100644 (file)
index 0000000..fbf2da4
--- /dev/null
@@ -0,0 +1,49 @@
+name: 
+    default: Timór Lorosa'e
+    af: Oos-Timor
+    ar: جمهورية تيمور
+    br: Timor ar Reter
+    ca: Timor Oriental
+    cs: Východní Timor
+    cy: Dwyrain Timor
+    da: Østtimor
+    de: Osttimor
+    el: Ανατολικό Τιμόρ
+    en: East Timor
+    eo: Orienta Timoro
+    es: Timor Oriental
+    et: Ida-Timor
+    fa: تیمور شرقی
+    fi: Itä-Timor
+    fr: Timor oriental
+    fy: East-Timor
+    ga: An Tíomór Thoir
+    gd: Tiomor an Ear
+    he: מזרח טימור
+    hr: Istočni Timor
+    hu: Kelet-Timor
+    id: Timor Leste
+    is: Austur-Tímor
+    it: Timor Est
+    la: Timoria Orientalis
+    li: Oos-Timor
+    lt: Rytų Timoras
+    mn: Зүүн Тимор
+    ms: Timor Timur
+    nl: Oost-Timor
+    "no": Øst-Timor
+    pl: Timor Wschodni
+    pt: Timor-Leste
+    ru: Восточный Тимор
+    se: Nuorta-Timor
+    sk: Východný Timor
+    sl: Vzhodni Timor
+    sv: Östtimor
+    ta: கிழக்குத் திமோர்
+    th: ประเทศติมอร์ตะวันออก
+    tl: Silangan Timor
+    tr: Doğu Timor
+    tt: Көнчыгыш Тимор
+    uk: Східний Тимор
+    vi: Đông Timor
+    zh: 东帝汶 / 東帝汶
diff --git a/settings/country-names/tm.yaml b/settings/country-names/tm.yaml
new file mode 100644 (file)
index 0000000..aa11853
--- /dev/null
@@ -0,0 +1,121 @@
+name: 
+    default: Türkmenistan
+    af: Turkmenistan
+    am: ቱርክመኒስታን
+    an: Turkmenistán
+    ar: تركمانستان
+    av: Туркменистан
+    az: Türkmənistan
+    ba: Төрөкмәнстан
+    be: Туркменістан
+    bg: Туркменистан
+    bn: তুর্কমেনিস্তান
+    bo: ཏུརཀ་མེ་ནི་སུཏན།
+    br: Turkmenistan
+    bs: Turkmenistan
+    ca: Turkmenistan
+    co: Turkmenistan
+    cs: Turkmenistán
+    cv: Туркменистан
+    cy: Turkmenistan
+    da: Turkmenistan
+    de: Turkmenistan
+    dv: ތުރުކުމެނިސްތާން
+    ee: Turkmenistan
+    el: Τουρκμενιστάν
+    en: Turkmenistan
+    eo: Turkmenio
+    es: Turkmenistán
+    et: Türkmenistan
+    eu: Turkmenistan
+    fa: ترکمنستان
+    fi: Turkmenistan
+    fo: Turkmenistan
+    fr: Turkménistan
+    fy: Turkmenistan
+    ga: An Tuircméanastáin
+    gd: Turcmanastàn
+    gl: Turcomenistán
+    gu: તુર્કમેનિસ્તાન
+    gv: Yn Turkmenistaan
+    he: טורקמניסטן
+    hi: तुर्कमेनिस्तान
+    hr: Turkmenistan
+    ht: Tirkmenistan
+    hu: Türkmenisztán
+    hy: Թուրքմենստան
+    ia: Turkmenistan
+    id: Turkmenistan
+    ie: Turkmenistan
+    io: Turkmenistan
+    is: Túrkmenistan
+    it: Turkmenistan
+    ja: トルクメニスタン
+    jv: Turkmenistan
+    ka: თურქმენეთი
+    kk: Түрікменстан
+    km: តួរមិនីស្ថាន
+    kn: ತುರ್ಕಮೆನಿಸ್ತಾನ್
+    ko: 투르크메니스탄
+    ku: Tirkmenistan
+    kv: Туркменистан
+    kw: Pow Turkmen
+    ky: Түркмөнстан
+    la: Turcomannia
+    li: Turkmenistan
+    ln: Turkmenistáni
+    lt: Turkmėnija
+    lv: Turkmenistāna
+    mk: Туркменистан
+    ml: തുർക്‌മെനിസ്ഥാൻ
+    mn: Туркменистан
+    mr: तुर्कमेनिस्तान
+    ms: Turkmenistan
+    my: တာ့ခ်မင်နစ္စတန်နိုင်ငံ
+    na: Turkmenistan
+    ne: तुर्कमेनिस्तान
+    nl: Turkmenistan
+    nn: Turkmenistan
+    "no": Turkmenistan
+    nv: Tʼóokmen Bikéyah
+    oc: Turcmenistan
+    or: ତୁର୍କମେନିସ୍ଥାନ
+    os: Туркмени
+    pa: ਤੁਰਕਮੇਨਸਤਾਨ
+    pl: Turkmenistan
+    ps: ترکمنستان
+    pt: Turquemenistão
+    qu: Turkminsuyu
+    ro: Turkmenistan
+    ru: Туркменистан
+    rw: Turukimenisitani
+    sa: तुर्कमिनिस्थान
+    se: Turkmenistan
+    sh: Turkmenistan
+    sk: Turkménsko
+    sl: Turkmenistan
+    so: Turkmenistan
+    sq: Turkmenistani
+    sr: Туркменистан
+    ss: IThumekhi
+    su: Turkménistan
+    sv: Turkmenistan
+    sw: Turkmenistan
+    ta: துருக்மெனிஸ்தான்
+    te: తుర్కమేనిస్తాన్
+    tg: Туркманистон
+    th: ประเทศเติร์กเมนิสถาน
+    tk: Türkmenistan
+    tl: Turkmenistan
+    tr: Türkmenistan
+    tt: Төрекмәнстан
+    ug: تۈركمەنىستان
+    uk: Туркменістан
+    ur: ترکمانستان
+    uz: Turkmaniston
+    vi: Turkmenistan
+    vo: Turkmenän
+    wo: Turkumenistaan
+    yi: טורקמעניסטאן
+    yo: Turkmẹ́nìstán
+    zh: 土库曼斯坦
diff --git a/settings/country-names/tn.yaml b/settings/country-names/tn.yaml
new file mode 100644 (file)
index 0000000..134143b
--- /dev/null
@@ -0,0 +1,129 @@
+name: 
+    default: تونس
+    af: Tunisië
+    am: ቱኒዚያ
+    an: Tunicia
+    ar: تونس
+    az: Tunis
+    ba: Тунис
+    be: Туніс
+    bg: Тунис
+    bm: Tunizi
+    bn: তিউনিসিয়া
+    bo: ཏུ་ནི་ཤི་ཡ།
+    br: Tunizia
+    bs: Tunis
+    ca: Tunísia
+    ce: Тунис
+    cs: Tunisko
+    cv: Тунис
+    cy: Tunisia
+    da: Tunesien
+    de: Tunesien
+    dv: ތޫނިސް
+    ee: Tunisia
+    el: Τυνησία
+    en: Tunisia
+    eo: Tunizio
+    es: Túnez
+    et: Tuneesia
+    eu: Tunisia
+    fa: تونس
+    fi: Tunisia
+    fo: Tunesia
+    fr: Tunisie
+    fy: Tuneezje
+    ga: An Túinéis
+    gd: Tuinisia
+    gl: Tunisia
+    gu: ટ્યુનિશિયા
+    gv: Yn Tooneesh
+    he: תוניסיה
+    hi: ट्यूनिशिया
+    hr: Tunis
+    ht: Tinizi
+    hu: Tunézia
+    hy: Թունիս
+    id: Tunisia
+    ie: Tunisia
+    io: Tunizia
+    is: Túnis
+    it: Tunisia
+    ja: チュニジア
+    jv: Tunisia
+    ka: ტუნისი
+    kg: Tunisia
+    kk: Тунис
+    kn: ಟುನೀಶಿಯ
+    ko: 튀니지
+    ks: تونس
+    ku: Tûnis
+    kw: Tunisi
+    ky: Тунис
+    la: Tunesia
+    lb: Tunesien
+    li: Tunesië
+    ln: Tunisia
+    lt: Tunisas
+    lv: Tunisija
+    mg: Tonizia
+    mi: Tūnihia
+    mk: Тунис
+    ml: ടുണീഷ്യ
+    mn: Тунис
+    mr: ट्युनिसिया
+    ms: Tunisia
+    mt: Tuneżija
+    my: တူနီးရှားနိုင်ငံ
+    nl: Tunesië
+    nn: Tunisia
+    "no": Tunisia
+    oc: Tunisia
+    or: ଟ୍ୟୁନିସିଆ
+    os: Тунис
+    pa: ਤੁਨੀਸੀਆ
+    pl: Tunezja
+    ps: تونس
+    pt: Tunísia
+    qu: Tunisya
+    rm: Tunesia
+    ro: Tunisia
+    ru: Тунис
+    rw: Tunisiya
+    sa: टुनिशिया
+    sc: Tunisia
+    se: Tunisia
+    sg: Tunizïi
+    sh: Tunis
+    sk: Tunisko
+    sl: Tunizija
+    sn: Tunisia
+    so: Tunisiya
+    sq: Tunizia
+    sr: Тунис
+    ss: IThunisiya
+    su: Tunisia
+    sv: Tunisien
+    sw: Tunisia
+    ta: துனீசியா
+    te: ట్యునీషియా
+    tg: Тунис
+    th: ประเทศตูนิเซีย
+    ti: ቱኒዢያ
+    tk: Tunis
+    tl: Tunisya
+    tr: Tunus
+    ts: Tunisia
+    tt: Тунис
+    ug: تۇنىس
+    uk: Туніс
+    ur: تونس
+    uz: Tunis
+    vi: Tunisia
+    vo: Tünisän
+    wa: Tunizeye
+    wo: Tiniisi
+    yi: טוניסיע
+    yo: Tùnísíà
+    zh: 突尼西亞
+    zu: ITunisia
diff --git a/settings/country-names/to.yaml b/settings/country-names/to.yaml
new file mode 100644 (file)
index 0000000..0da4dd5
--- /dev/null
@@ -0,0 +1,112 @@
+name: 
+    default: Tonga
+    af: Tonga
+    am: ቶንጋ
+    an: Tonga
+    ar: تونجا
+    az: Tonqa
+    ba: Тонга
+    be: Тонга
+    bg: Тонга
+    bn: টোঙ্গা
+    bo: ཊོང་ག
+    br: Tonga
+    bs: Tonga
+    ca: Tonga
+    ce: Тонга
+    cs: Tonga
+    cu: Тонга
+    cy: Tonga
+    da: Tonga
+    de: Tonga
+    dv: ޓޮންގާ
+    el: Τόνγκα
+    en: Tonga
+    eo: Tongo
+    es: Tonga
+    et: Tonga
+    eu: Tonga
+    fa: تونگا
+    fi: Tonga
+    fo: Tonga
+    fr: Tonga
+    fy: Tonga
+    ga: Tonga
+    gd: Tonga
+    gl: Tonga
+    gv: Yn Tongey
+    he: טונגה
+    hi: टोंगा
+    hr: Tonga
+    ht: Tonga
+    hu: Tonga
+    hy: Տոնգա
+    ia: Tonga
+    id: Tonga
+    io: Tonga
+    is: Tonga
+    it: Tonga
+    ja: トンガ
+    jv: Tonga
+    ka: ტონგა
+    kk: Тонга
+    kn: ಟೋಂಗಾ
+    ko: 통가
+    ku: Tonga
+    kw: Tonga
+    la: Tonga
+    lb: Tonga
+    li: Tonga
+    lt: Tonga
+    lv: Tonga
+    mk: Тонга
+    ml: ടോങ്ക
+    mn: Тонга
+    mr: टोंगा
+    ms: Tonga
+    mt: Tonga
+    my: တုံဂါနိုင်ငံ
+    nl: Tonga
+    nn: Tonga
+    "no": Tonga
+    nv: Tʼónga
+    oc: Tònga
+    or: ଟୋଙ୍ଗା
+    os: Тонгæ
+    pa: ਟੋਂਗਾ
+    pl: Tonga
+    pt: Tonga
+    qu: Tunqa
+    rm: Tonga
+    ro: Tonga
+    ru: Тонга
+    rw: Tonga
+    sa: टोंगा
+    se: Tonga
+    sh: Tonga
+    sk: Tonga
+    sl: Tonga
+    sm: Toga
+    sq: Tonga
+    sr: Тонга
+    su: Tonga
+    sv: Tonga
+    sw: Tonga
+    ta: தொங்கா
+    tg: Тонга
+    th: ประเทศตองกา
+    tl: Tonga
+    to: Tonga
+    tr: Tonga
+    ts: Tonga
+    tw: Tonga
+    ty: To’a
+    ug: Ton’ga
+    uk: Тонга
+    ur: ٹونگا
+    uz: Tonga
+    vi: Tonga
+    vo: Tonguäns
+    wo: Tonga
+    yo: Tóngà
+    zh: 東加
diff --git a/settings/country-names/tr.yaml b/settings/country-names/tr.yaml
new file mode 100644 (file)
index 0000000..c7ee70c
--- /dev/null
@@ -0,0 +1,144 @@
+name: 
+    default: Türkiye
+    ab: Ҭырқәтәыла
+    af: Turkye
+    ak: Turki
+    am: ቱርክ
+    an: Turquía
+    ar: تركيا
+    av: Туркия
+    ay: Turkiya
+    az: Türkiyə
+    ba: Төркиә
+    be: Турцыя
+    bg: Турция
+    bi: Turkey
+    bn: তুরস
+    bo: ཏུར་ཀི།
+    br: Turkia
+    bs: Turska
+    ca: Turquia
+    ce: Туркойчоь
+    cs: Turecko
+    cu: Тѷрци
+    cv: Турци
+    cy: Twrci
+    da: Tyrkiet
+    de: Türkei
+    dv: ތުރުކީވިލާތް
+    ee: Turkey
+    el: Τουρκία
+    en: Turkey
+    eo: Turkio
+    es: Turquía
+    et: Türgi
+    eu: Turkia
+    fa: ترکیه
+    fi: Turkki
+    fo: Turkaland
+    fr: Turquie
+    fy: Turkije
+    ga: An Tuirc
+    gd: An Tuirc
+    gl: Turquía
+    gn: Tuykia
+    gu: તુર્કસ્તાન
+    gv: Yn Turkee
+    ha: Turkiyya
+    he: טורקיה
+    hi: तुर्की
+    hr: Turska
+    ht: Tiki
+    hu: Törökország
+    hy: Թուրքիա
+    ia: Turchia
+    id: Turki
+    ie: Turcia
+    ik: Turkey
+    io: Turkia
+    is: Tyrkland
+    it: Turchia
+    ja: トルコ
+    jv: Turki
+    ka: თურქეთი
+    kg: Turki
+    ki: Turkey
+    kk: Түркия
+    kl: Tyrkia
+    kn: ಟರ್ಕಿ
+    ko: 터키
+    ku: Tirkiye
+    kv: Турция
+    kw: Turki
+    ky: Түркия Республикасы
+    la: Turcia
+    lb: Tierkei
+    lg: Buturuki
+    li: Turkije
+    ln: Turkí
+    lt: Turkija
+    lv: Turcija
+    mg: Torkia
+    mi: Tākei
+    mk: Турција
+    ml: തുർക്കി
+    mn: Турк
+    mr: तुर्कस्तान
+    ms: Turki
+    mt: Turkija
+    my: တူရကီနိုင်ငံ
+    na: Terki
+    ne: टर्की
+    nl: Turkije
+    nn: Tyrkia
+    "no": Tyrkia
+    nv: Tʼóok Bikéyah
+    oc: Turquia
+    or: ତୁର୍କୀ
+    os: Турк
+    pa: ਤੁਰਕੀ
+    pl: Turcja
+    ps: تورکيه
+    pt: Turquia
+    qu: Turkiya
+    rm: Tirchia
+    rn: Turukiya
+    ro: Turcia
+    ru: Турция
+    rw: Turukiya
+    sa: तुर्की
+    sc: Turkia
+    se: Durka
+    sh: Turska
+    si: තුර්කිය
+    sk: Turecko
+    sl: Turčija
+    so: Turki
+    sq: Turqia
+    sr: Турска
+    ss: IThekhi
+    su: Turki
+    sv: Turkiet
+    sw: Uturuki
+    ta: துருக்கி
+    te: టర్కీ
+    tg: Туркия
+    th: ประเทศตุรกี
+    tk: Türkiýe
+    tl: Turkiya
+    tr: Türkiye
+    tt: Төркия
+    tw: Turkey
+    ug: تۈركىيە جۇمھۇرىيىتى
+    uk: Туреччина
+    ur: ترکی
+    uz: Turkiya
+    vi: Thổ Nhĩ Kỳ
+    vo: Türkän
+    wa: Tourkeye
+    wo: Tirki
+    yi: טערקיי
+    yo: Túrkì
+    za: Dujwjgiz
+    zh: 土耳其
+    zu: ITheki
diff --git a/settings/country-names/tt.yaml b/settings/country-names/tt.yaml
new file mode 100644 (file)
index 0000000..fa68f7d
--- /dev/null
@@ -0,0 +1,46 @@
+name: 
+    default: Trinidad and Tobago
+    af: Trinidad en Tobago
+    ar: ترينيداد وتوباغو
+    be: Трынідад і Табага
+    br: Trinidad-ha-Tobago
+    ca: Trinitat i Tobago
+    cs: Trinidad a Tobago
+    cy: Trinidad a Tobago
+    da: Trinidad og Tobago
+    de: Trinidad und Tobago
+    en: Trinidad and Tobago
+    eo: Trinidado kaj Tobago
+    es: Trinidad y Tobago
+    et: Trinidad ja Tobago
+    fa: ترینیداد و توباگو
+    fi: Trinidad ja Tobago
+    fr: Trinité-et-Tobago
+    fy: Trinidad en Tobago
+    ga: Oileán na Tríonóide agus Tobága
+    gd: Trianaid agus Tobago
+    he: טרינידד וטובגו
+    hr: Trinidad i Tobago
+    hu: Trinidad és Tobago
+    id: Trinidad dan Tobago
+    is: Trínidad og Tóbagó
+    it: Trinidad e Tobago
+    ja: トリニダード・トバゴ
+    la: Trinitas et Tabacum
+    lt: Trinidadas ir Tobagas
+    mn: Тринидад ба Тобаго
+    nl: Trinidad en Tobago
+    pl: Trynidad i Tobago
+    pt: Trindade e Tobago
+    ru: Тринидад и Тобаго
+    se: Trinidad ja Tobago
+    sk: Trinidad a Tobago
+    sl: Trinidad in Tobago
+    sv: Trinidad och Tobago
+    ta: டிரினிடாட் மற்றும் டொபாகோ
+    th: ประเทศตรินิแดดและโตเบโก
+    tr: Trinidad ve Tobago
+    uk: Тринідад і Тобаго
+    vi: Trinidad và Tobago
+    vo: Trinidadeän e Tobageäns
+    zh: 特立尼达和多巴哥
diff --git a/settings/country-names/tv.yaml b/settings/country-names/tv.yaml
new file mode 100644 (file)
index 0000000..f82e53c
--- /dev/null
@@ -0,0 +1,75 @@
+name: 
+    default: Tuvalu
+    am: ቱቫሉ
+    ar: توفالو
+    be: Тувалу
+    bg: Тувалу
+    bn: টুভালু
+    bo: ཐུ་ཝ་ལུ།
+    br: Tuvalu
+    ca: Tuvalu
+    cs: Tuvalu
+    cy: Twfalw
+    da: Tuvalu
+    de: Tuvalu
+    dz: ཏུ་ཝ་ལུ
+    ee: Tuvalu nutome
+    el: Τουβαλού
+    en: Tuvalu
+    eo: Tuvalo
+    es: Tuvalu
+    fa: تووالو
+    ff: Tuwaluu
+    fi: Tuvalu
+    fr: Tuvalu
+    fy: Tûvalû
+    ga: Tuvalu
+    gd: Tubhalu
+    gu: તુવાલુ
+    gv: Tuvalu
+    ha: Tubalu
+    he: טובלו
+    hi: तुवालु
+    hr: Tuvalu
+    hu: Tuvalu
+    hy: Տուվալու
+    is: Túvalú
+    ja: ツバル
+    ka: ტუვალუ
+    km: ទូវ៉ាលូ
+    kn: ಟುವಾಲು
+    ko: 투발루
+    ks: توٗوالوٗ
+    ku: Tûvalû
+    lo: ຕູວາລູ
+    lt: Tuvalu
+    lv: Tuvalu
+    mg: Tovalò
+    mk: Тувалу
+    ml: തുവാലു
+    mn: Тувалу
+    mr: टुवालु
+    ne: तुभालु
+    "no": Tuvalu
+    oc: Tuvalu
+    or: ଟୁଭାଲୁ
+    pl: Tuvalu
+    pt: Tuvalu
+    ru: Тувалу
+    se: Tuvalu
+    sg: Tüvalü
+    si: ටුවාලූ
+    sk: Tuvalu
+    sr: Тувалу
+    sv: Tuvalu
+    ta: துவாலூ
+    te: టువాలు
+    th: ประเทศตูวาลู
+    ti: ቱቫሉ
+    to: Tūvalu
+    uk: Тувалу
+    ur: ٹووالو
+    vo: Tuvaluäns
+    yo: Orílẹ́ède Tufalu
+    zh: 吐瓦鲁
+    zu: i-Tuvalu
diff --git a/settings/country-names/tw.yaml b/settings/country-names/tw.yaml
new file mode 100644 (file)
index 0000000..03ac094
--- /dev/null
@@ -0,0 +1,138 @@
+name: 
+    default: 臺灣
+    af: Taiwan
+    ak: Taiwan
+    am: ታይዋን
+    an: Taiwán
+    ar: تايوان
+    as: টাইৱান
+    az: Tayvan
+    be: Тайв́ань
+    bg: Тайван
+    bh: ताइवान
+    bm: Tayiwani
+    bn: তাইওয়ান
+    bo: ཐེ་ཝན
+    br: Taiwan
+    bs: Tajvan
+    ca: Taiwan
+    ce: Тайвань
+    cs: Tchaj-wan
+    cv: Тайва́нь
+    cy: Taiwan
+    da: Taiwan
+    de: Taiwan
+    dv: ޖުމްހޫރީ ޗައިނާ
+    dz: ཏའི་ཝཱན་
+    ee: Taiwan
+    el: Ταϊβάν
+    en: Taiwan
+    eo: Tajvano
+    es: Taiwán
+    et: Taiwan
+    eu: Taiwan
+    fa: تایوان
+    ff: Taywaan
+    fi: Taiwan
+    fo: Teivan
+    fr: Taïwan
+    fy: Taiwan
+    ga: an Téaváin
+    gd: Taidh-Bhàn
+    gl: Taiwán
+    gu: તાઇવાન
+    gv: yn Taiwaan
+    he: טאיוואן
+    hi: ताइवान
+    hr: Tajvan
+    ht: Taywann
+    hu: Tajvan
+    hy: Թայվան
+    ia: Taiwan
+    id: Taiwan
+    ie: Taiwan
+    io: Taiwan
+    is: Taívan
+    it: Taiwan
+    ja: 台湾
+    jv: Taiwan
+    ka: ტაივანი
+    ki: Taiwani
+    kk: Тайвань
+    kl: Taiwan
+    km: តៃវ៉ាន់
+    kn: ಟೈವಾನ್
+    ko: 타이완
+    ku: Taywan
+    kw: Taywan
+    ky: Тайвань
+    la: Taivania
+    lb: Taiwan
+    lg: Tayiwani
+    li: Taiwan
+    ln: Taiwan
+    lo: ໄຕ້ຫວັນ
+    lt: Taivanas
+    lv: Taivāna
+    mg: Taiwan
+    mi: Taiwana
+    mk: Тајван
+    ml: തായ്വാൻ
+    mn: Тайвань
+    mr: तैवान
+    ms: Taiwan
+    mt: Tajwan
+    my: ထိုင်ဝမ်
+    ne: ताइवान
+    nl: Taiwan
+    nn: Taiwan
+    "no": Taiwan
+    oc: Taiwan
+    or: ତାଇୱାନ
+    os: Тайван
+    pa: ਤਾਈਵਾਨ
+    pi: तैवान
+    pl: Tajwan
+    ps: تایوان
+    pt: Taiwan
+    qu: Taiwán
+    rm: Taiwan
+    rn: Tayiwani
+    ro: Taiwan
+    ru: Тайвань
+    rw: Tayiwani
+    sa: तैवान
+    se: Taiwan
+    sg: Tâiwâni
+    sh: Tajvan
+    si: තායිවානය
+    sk: Taiwan
+    sl: Tajvan
+    sn: Taiwan
+    so: Taywan
+    sq: Tajvani
+    sr: Тајван
+    ss: iThayiwani
+    su: Tiongkok
+    sv: Taiwan
+    sw: Taiwan
+    te: తైవాన్
+    tg: Тайва́н
+    th: ไต้หวัน
+    tk: Taýwan
+    tl: Taiwan
+    to: Taiuani
+    tr: Tayvan
+    tt: Тайва́нь
+    ug: تەيۋەن
+    uk: Тайва́нь
+    ur: تائیوان
+    uz: Tayvan
+    vi: Đài Loan
+    vo: Tayvän
+    wo: Taaywaan
+    yi: טייוואַן
+    yo: Taiwan
+    za: Daizvanh
+    zh: 臺灣
+    zu: i-Taiwan
diff --git a/settings/country-names/tz.yaml b/settings/country-names/tz.yaml
new file mode 100644 (file)
index 0000000..eb266f4
--- /dev/null
@@ -0,0 +1,136 @@
+name: 
+    default: Tanzania
+    af: Tanzanië
+    ak: Tanzania
+    am: ታንዛኒያ
+    an: Tanzania
+    ar: تنزانيا
+    az: Tanzaniya
+    ba: Танзания
+    be: Танзанія
+    bg: Танзания
+    bm: Tanzania
+    bn: তানজানিয়া
+    bo: ཏན་ཛ་ནི་ཡ།
+    br: Tanzania
+    bs: Tanzanija
+    ca: Tanzània
+    ce: Танзани
+    cs: Tanzanie
+    cv: Танзани
+    cy: Tanzania
+    da: Tanzania
+    de: Tansania
+    dv: ޓެންޒޭނިއާ
+    ee: Tanzania
+    el: Τανζανία
+    en: Tanzania
+    eo: Tanzanio
+    es: Tanzania
+    et: Tansaania
+    eu: Tanzania
+    fa: تانزانیا
+    fi: Tansania
+    fo: Tansania
+    fr: Tanzanie
+    fy: Tanzania
+    ga: An Tansáin
+    gd: Tansainìa
+    gl: Tanzania
+    gu: ટાન્ઝાનિયા
+    gv: Tanzania
+    he: טנזניה
+    hi: तंज़ानिया
+    hr: Tanzanija
+    ht: Tanzani
+    hu: Tanzánia
+    hy: Տանզանիա
+    ia: Tanzania
+    id: Tanzania
+    ie: Tanzania
+    io: Tanzania
+    is: Tansanía
+    it: Tanzania
+    ja: タンザニア
+    jv: Tanzania
+    ka: ტანზანია
+    kg: Tanzania
+    ki: Tanzania
+    kk: Танзания
+    kl: Tanzania
+    kn: ಟಾಂಜಾನಿಯ
+    ko: 탄자니아
+    ku: Tanzanya
+    kw: Tanzania
+    la: Tanzania
+    lb: Tansania
+    li: Tanzania
+    ln: Tanzania
+    lt: Tanzanija
+    lv: Tanzānija
+    mg: Tanzania
+    mi: Tānahia
+    mk: Танзанија
+    ml: ടാൻസാനിയ
+    mn: Танзани
+    mr: टांझानिया
+    ms: Tanzania
+    mt: Tanżanija
+    my: တန်ဇေးနီးယားနိုင်ငံ
+    ne: तन्जानिया
+    nl: Tanzania
+    nn: Tanzania
+    "no": Tanzania
+    nv: Tʼanzanííya
+    ny: Tanzania
+    oc: Tanzania
+    om: Tanzania
+    or: ତାଞ୍ଜାନିଆ
+    os: Танзани
+    pa: ਤਨਜ਼ਾਨੀਆ
+    pl: Tanzania
+    pt: Tanzânia
+    qu: Tansanya
+    rm: Tansania
+    rn: Tanzaniya
+    ro: Tanzania
+    ru: Танзания
+    rw: Tanzaniya
+    sa: टंजानिया
+    sc: Tanzània
+    se: Tanzania
+    sg: Tanzanïi
+    sh: Tanzanija
+    sk: Tanzánia
+    sl: Tanzanija
+    sn: Tanzania
+    so: Tansaaniya
+    sq: Tanzania
+    sr: Танзанија
+    ss: IThanzaniya
+    st: Tanzania
+    su: Tanzania
+    sv: Tanzania
+    sw: Tanzania
+    ta: தன்சானியா
+    te: టాంజానియా
+    tg: Танзания
+    th: ประเทศแทนซาเนีย
+    ti: ታንዛኒያ
+    tk: Tanzaniýa
+    tl: Tanzania
+    tr: Tanzanya
+    ts: Tanzania
+    tt: Танзания
+    tw: Tanzania
+    ug: تانزانىيە
+    uk: Танзанія
+    ur: تنزانیہ
+    uz: Tanzaniya
+    vi: Tanzania
+    vo: Tansanän
+    wo: Tansani
+    yi: טאנזאניע
+    yo: Tànsáníà
+    zh: 坦桑尼亚
+    zu: ITanzania
diff --git a/settings/country-names/ua.yaml b/settings/country-names/ua.yaml
new file mode 100644 (file)
index 0000000..640ee11
--- /dev/null
@@ -0,0 +1,137 @@
+name: 
+    default: Україна
+    ab: Украина
+    af: Oekraïne
+    am: ዩክሬን
+    an: Ucraína
+    ar: أوكرانيا
+    az: Ukrayna
+    ba: Украина
+    be: Украіна
+    bg: Украйна
+    bi: Ukraine
+    bn: ইউক্রেন
+    bo: ཨུཀ་རཡི་ནི།
+    br: Ukraina
+    bs: Ukrajina
+    ca: Ucraïna
+    ce: Украина
+    cs: Ukrajina
+    cu: Оукраина
+    cv: Украина
+    cy: Wcráin
+    da: Ukraine
+    de: Ukraine
+    dv: ޔުކްރެއިން
+    ee: Ukraine
+    el: Ουκρανία
+    en: Ukraine
+    eo: Ukrainio
+    es: Ucrania
+    et: Ukraina
+    eu: Ukraina
+    fa: اوکراین
+    fi: Ukraina
+    fo: Ukraina
+    fr: Ukraine
+    fy: Oekraïne
+    ga: An Úcráin
+    gd: An Ucràin
+    gl: Ucraína
+    gn: Ukyaña
+    gu: યુક્રેન
+    gv: Yn Ookraan
+    he: אוקראינה
+    hi: युक्रेन
+    hr: Ukrajina
+    ht: Ikrèn
+    hu: Ukrajna
+    hy: Ուկրաինա
+    ia: Ukraina
+    id: Ukraina
+    ie: Ucraina
+    ig: Yukrain
+    io: Ukrainia
+    is: Úkraína
+    it: Ucraina
+    ja: ウクライナ
+    jv: Ukraina
+    ka: უკრაინა
+    kg: Ukrayina
+    kk: Украина
+    kl: Ukraine
+    km: អ៊ុយក្រែន
+    kn: ಯುಕ್ರೇನ್
+    ko: 우크라이나
+    ku: Ûkrayna
+    kv: Украина
+    kw: Ukrayn
+    ky: Украина
+    la: Ucraina
+    lb: Ukrain
+    li: Oekraïne
+    ln: Ukraine
+    lt: Ukraina
+    lv: Ukraina
+    mg: Okraina
+    mi: Ūkareinga
+    mk: Украина
+    ml: ഉക്രൈൻ
+    mn: Украйн
+    mr: युक्रेन
+    ms: Ukraine
+    mt: Ukrajna
+    my: ယူကရိန်းနိုင်ငံ
+    na: Ukraine
+    ne: युक्रेन
+    nl: Oekraïne
+    nn: Ukraina
+    "no": Ukraina
+    nv: Yóókwein
+    oc: Ucraïna
+    or: ୟୁକ୍ରେନ
+    os: Украинæ
+    pa: ਯੂਕ੍ਰੇਨ
+    pl: Ukraina
+    ps: اوکراین
+    pt: Ucrânia
+    qu: Ukranya
+    rm: Ucraina
+    ro: Ucraina
+    ru: Украина
+    rw: Ikerene
+    sc: Ucraina
+    se: Ukraina
+    sh: Ukrajina
+    sk: Ukrajina
+    sl: Ukrajina
+    sm: Ukraine
+    sn: Ukraine
+    so: Ukrain
+    sq: Ukraina
+    sr: Украјина
+    ss: IYukhureni
+    su: Ukraina
+    sv: Ukraina
+    sw: Ukraine
+    ta: உக்ரைன்
+    te: ఉక్రెయిన్
+    tg: Украйина
+    th: ประเทศยูเครน
+    tk: Ukraina
+    tl: Ukranya
+    tr: Ukrayna
+    ts: Ukraine
+    tt: Украина
+    tw: Ukraine
+    ug: ئۇكرائىنا
+    uk: Україна
+    ur: یوکرین
+    uz: Ukraina
+    vi: Ukraina
+    vo: Lukrayän
+    wa: Oucrinne
+    wo: Ukreen
+    yi: אוקראינע
+    yo: Ukréìn
+    zh: 乌克兰/烏克蘭
diff --git a/settings/country-names/ug.yaml b/settings/country-names/ug.yaml
new file mode 100644 (file)
index 0000000..628beae
--- /dev/null
@@ -0,0 +1,127 @@
+name: 
+    default: Uganda
+    af: Uganda
+    am: ዩጋንዳ
+    an: Uganda
+    ar: أوغندا
+    az: Uqanda
+    ba: Уганда
+    be: Уганда
+    bg: Уганда
+    bm: Uganda
+    bn: উগান্ডা
+    bo: ཨུ་གན་ད།
+    br: Ouganda
+    bs: Uganda
+    ca: Uganda
+    ce: Уганда
+    cs: Uganda
+    cv: Уганда
+    cy: Uganda
+    da: Uganda
+    de: Uganda
+    dv: ޔުގެންޑާ
+    ee: Uganda
+    el: Ουγκάντα
+    en: Uganda
+    eo: Ugando
+    es: Uganda
+    et: Uganda
+    eu: Uganda
+    fa: اوگاندا
+    fi: Uganda
+    fo: Uganda
+    fr: Ouganda
+    fy: Uganda
+    ga: Uganda
+    gd: Uganda
+    gl: Uganda
+    gv: Ooganda
+    ha: Uganda
+    he: אוגנדה
+    hi: युगाण्डा
+    hr: Uganda
+    ht: Ouganda
+    hu: Uganda
+    hy: Ուգանդա
+    ia: Uganda
+    id: Uganda
+    ie: Uganda
+    io: Uganda
+    is: Úganda
+    it: Uganda
+    ja: ウガンダ
+    jv: Uganda
+    ka: უგანდა
+    kg: Uganda
+    ki: Uganda
+    kk: Уганда
+    kl: Uganda
+    kn: ಉಗಾಂಡ
+    ko: 우간다
+    ku: Ûganda
+    kw: Ouganda
+    la: Uganda
+    lb: Uganda
+    lg: Yuganda
+    li: Oeganda
+    ln: Uganda
+    lt: Uganda
+    lv: Uganda
+    mi: Ukānga
+    mk: Уганда
+    ml: ഉഗാണ്ട
+    mn: Уганда
+    mr: युगांडा
+    ms: Uganda
+    mt: Uganda
+    my: ယူဂန်းဒါးနိုင်ငံ
+    nl: Oeganda
+    nn: Uganda
+    "no": Uganda
+    nv: Yogénda
+    oc: Oganda
+    or: ଉଗାଣ୍ଡା
+    os: Угандæ
+    pa: ਯੁਗਾਂਡਾ
+    pl: Uganda
+    pt: Uganda
+    qu: Uganda
+    rm: Uganda
+    ro: Uganda
+    ru: Уганда
+    rw: Ubugande
+    sc: Uganda
+    se: Uganda
+    sg: Ugandäa
+    sh: Uganda
+    sk: Uganda
+    sl: Uganda
+    sn: Uganda
+    so: Yugandha
+    sq: Uganda
+    sr: Уганда
+    ss: IBuganda
+    su: Uganda
+    sv: Uganda
+    sw: Uganda
+    ta: உகாண்டா
+    te: ఉగాండా
+    tg: Уганда
+    th: ประเทศยูกันดา
+    tk: Uganda
+    tl: Uganda
+    tr: Uganda
+    ts: Uganda
+    tt: Уганда
+    ug: ئۇگاندا
+    uk: Уганда
+    ur: یوگنڈا
+    uz: Uganda
+    vi: Uganda
+    vo: Lugandayän
+    wo: Ugandaa
+    yi: אוגאנדע
+    yo: Ùgándà
+    zh: 乌干达
+    zu: IYuganda
diff --git a/settings/country-names/um.yaml b/settings/country-names/um.yaml
new file mode 100644 (file)
index 0000000..8de08ff
--- /dev/null
@@ -0,0 +1,2 @@
+name: 
+    default: United States Minor Outlying Islands
diff --git a/settings/country-names/us.yaml b/settings/country-names/us.yaml
new file mode 100644 (file)
index 0000000..1497a27
--- /dev/null
@@ -0,0 +1,166 @@
+short_name:
+    default: USA
+name:
+    default: United States
+    ab: Америка Еиду Аштатқәа
+    af: Verenigde State van Amerika
+    am: የተባበሩት የአሜሪካ ግዛቶች
+    an: Estatos Unitos d'America
+    ar: الولايات المتّحدة الأمريكيّة
+    as: মাৰ্কিন যুক্তৰাষ্ট্ৰ
+    av: Америкалъул Цолъарал Штатал
+    ay: Istadus Unidus
+    az: Amerika Birləşmiş Ştatları
+    ba: Америка Ҡушма Штаттары
+    be: Злучаныя Штаты Амерыкі
+    bg: Съединени американски щати
+    bi: Yunaeted Stet blong Amerika
+    bm: Amerika ka Kelenyalen Jamanaw
+    bn: মার্কিন যুক্তরাষ্ট্র
+    bo: ཨ་མེ་རི་ཁ་རྒྱལ་ཕྲན་མཉམ་འབྲེལ་རྒྱལ་ཁབ།
+    br: Stadoù-Unanet Amerika
+    bs: Sjedinjene Američke Države
+    ca: Estats Units d'Amèrica
+    ce: Iамерка пачхьалк
+    co: Stati Uniti d'America
+    cs: Spojené státy americké
+    cu: Амєрика́ньскꙑ Ѥдьнѥнꙑ́ Дрьжа́вꙑ
+    cv: Америкăри Пĕрлешӳллĕ Штатсем
+    cy: Unol Daleithiau America
+    da: Amerikas Forenede Stater
+    de: Vereinigte Staaten von Amerika
+    dv: އެމެރިކާ
+    dz: ཡུ་ནའིཊེཊ་སི་ཊེས
+    ee: United States
+    el: Ηνωμένες Πολιτείες της Αμερικής
+    en: United States
+    eo: Usono
+    es: Estados Unidos de América
+    et: Ameerika Ühendriigid
+    eu: Ameriketako Estatu Batuak
+    fa: ایالات متحده آمریکا
+    ff: Dowlaaji Dentuɗi
+    fi: Amerikan yhdysvallat
+    fo: Sambandsríkið Amerika
+    fr: États-Unis d'Amérique
+    fy: Feriene Steaten fan Amearika
+    ga: Stáit Aontaithe Mheiriceá
+    gd: Na Stàitean Aonaichte
+    gl: Estados Unidos de América
+    gn: Tetã peteĩ reko Amérikagua
+    gu: સંયુક્ત રાજ્ય અમેરિકા
+    gv: Steatyn Unnaneysit America
+    ha: kunkiyar taraiyar Amurika
+    he: ארצות הברית
+    hi: संयुक्त राज्य अमेरिका
+    hr: Sjedinjene Američke Države
+    ht: Etazini
+    hu: Amerikai Egyesült Államok
+    hy: Ամերիկայի Միացյալ Նահանգներ
+    ia: Statos Unite de America
+    id: Amerika Serikat
+    ie: Unit States de America
+    ig: Njikota Obodo Amerika
+    ik: United States of America
+    io: Unionita Stati di Amerika
+    is: Bandaríki Norður-Ameríku
+    it: Stati Uniti d'America
+    iu: ᐊᒥᐊᓕᑲ
+    ja: アメリカ合衆国
+    jv: Amérika Sarékat
+    ka: ამერიკის შეერთებული შტატები
+    ki: United States
+    kk: Америка Құрама Штаттары
+    kl: Naalagaaffeqatigiit
+    km: សហរដ្ឋអាមេរិក
+    kn: ಅಮೇರಿಕ ಸಂಯುಕ್ತ ಸಂಸ್ಥಾನ
+    ko: 미국
+    ks: संयुक्त राज्य अमेरिका
+    ku: Dewletên Yekbûyî yên Amerîkayê
+    kv: Америкаса Ӧтувтӧм Штатъяс
+    kw: Statys Unys Amerika
+    ky: Америка Кошмо Штаттары
+    la: Civitates Foederatae Americae
+    lb: Vereenegt Staate vun Amerika
+    lg: Amereka
+    li: Vereinegde State van Amerika
+    ln: Lisangá lya Ameríka
+    lo: ສະຫະລັດອາເມລິກາ
+    lt: Jungtinės Amerikos Valstijos
+    lv: Amerikas Savienotās Valstis
+    mg: Etazonia
+    mi: Amerika
+    mk: Соединети Американски Држави
+    ml: അമേരിക്കന് ഐക്യനാടുകള്
+    mn: Америкийн Нэгдсэн Улс
+    mo: Стателе Уните але Америчий
+    mr: अमेरिकेची संयुक्त संस्थाने
+    ms: Amerika Syarikat
+    mt: Stati Uniti tal-Amerika
+    my: အမေရိကန်ပြည်ထောင်စု
+    na: Eben Merika
+    nb: USA
+    ne: संयुक्त राज्य अमेरिका
+    nl: Verenigde Staten
+    nn: USA
+    "no": Amerikas forente stater
+    nv: Wááshindoon Bikéyah Ałhidadiidzooígíí
+    oc: Estats Units d'America
+    om: USA
+    or: ଯୁକ୍ତରାଷ୍ଟ୍ର ଆମେରିକା
+    os: Америкæйы Иугонд Штаттæ
+    pa: ਸੰਯੁਕਤ ਰਾਜ ਅਮਰੀਕਾ
+    pl: Stany Zjednoczone
+    ps: د امريکا متحده ايالات
+    pt: Estados Unidos da América
+    qu: Hukllachasqa Amirika Suyukuna
+    rm: Stadis Unids da l'America
+    rn: Leta Zunze Ubumwe za Amerika
+    ro: Statele Unite ale Americii
+    ru: Соединённые Штаты Америки
+    rw: Leta Zunze Ubumwe z’Amerika
+    sa: संयुक्तानि राज्यानि
+    sc: Istados Unidos de America
+    sd: آمريڪا
+    se: Amerihká ovttastuvvan stáhtat
+    sg: ÂKödörö-ôko tî Amerîka
+    sh: Sjedinjene Američke Države
+    si: අ'මෙරිකාවේ එක්සත් රාජ්යයන්
+    sk: Spojené štáty americké
+    sl: Združene države Amerike
+    sm: Iunaite Sitete o Amerika
+    sn: United States of America
+    so: Mareykanka
+    sq: Shtetet e Bashkuara të Amerikës
+    sr: Сједињене Америчке Државе
+    ss: IMelika
+    su: Amérika Sarikat
+    sv: Amerikas Förenta Stater
+    sw: Muungano wa Madola ya Amerika
+    ta: அமெரிக்க ஐக்கிய நாடு
+    te: అమెరికా సంయుక్త రాష్ట్రాలు
+    tg: Иёлоти Муттаҳидаи Амрико
+    th: สหรัฐอเมริกา
+    tk: Amerikanyň Birleşen Ştatlary
+    tl: Estados Unidos
+    tn: USA
+    to: Puleʻanga Fakataha 'o 'Amelika
+    tr: Amerika Birleşik Devletleri
+    ts: United States
+    tt: Америка Кушма Штатлары
+    tw: USA
+    ty: Fenua Marite
+    ug: ئامېرىكا قوشما شتاتلىرى
+    uk: Сполучені Штати Америки
+    ur: ریاستہائے متحدہ امریکہ
+    uz: Amerika Qoʻshma Shtatlari
+    vi: Hoa Kỳ
+    vo: Lamerikän
+    wa: Estats Unis d' Amerike
+    wo: Diwaan-yu-Bennoo yu Aamerig
+    xh: IYunayithedi Steyitsi
+    yi: פאראייניקטע שטאטן פון אמעריקע
+    yo: Àwọn Ìpínlẹ̀ Aṣọ̀kan Amẹ́ríkà
+    za: Meijgoz
+    zh: 美利坚合众国/美利堅合眾國
+    zu: IMelika
diff --git a/settings/country-names/uy.yaml b/settings/country-names/uy.yaml
new file mode 100644 (file)
index 0000000..886c4cd
--- /dev/null
@@ -0,0 +1,143 @@
+name: 
+    default: Uruguay
+    af: Uruguay
+    ak: Yurugwae
+    am: ኡራጓይ
+    an: Uruguai
+    ar: أوروغواي
+    ay: Uruwayi
+    az: Uruqvay
+    ba: Уругвай
+    be: Уругвай
+    bg: Уругвай
+    bi: Uruguay
+    bm: Urugwayi
+    bn: উরুগুয়ে
+    bo: ཨུ་རུ་གུ་ཡེ།
+    br: Uruguay
+    bs: Urugvaj
+    ca: Uruguai
+    ce: Уругвай
+    co: Uruguay
+    cs: Uruguay
+    cu: Оуроугваи
+    cv: Уругвай
+    cy: Uruguay
+    da: Uruguay
+    de: Uruguay
+    dv: އުރުގުއޭ
+    dz: ཡུ་རུ་གུ་ཝའི
+    ee: uruguaydukɔ
+    el: Ουρουγουάη
+    en: Uruguay
+    eo: Urugvajo
+    es: Uruguay
+    et: Uruguay
+    eu: Uruguai
+    fa: اروگوئه
+    ff: Uruguwaay
+    fi: Uruguay
+    fo: Uruguei
+    fr: Uruguay
+    fy: Urûguay
+    ga: Uragua
+    gd: Uruguaidh
+    gl: Uruguai
+    gn: Uruguái
+    gu: ઉરુગ્વે
+    gv: Yn Ooraguay
+    ha: Yurugai
+    he: אורוגוואי
+    hi: उरुग्वे
+    hr: Urugvaj
+    ht: Irigwe
+    hu: Uruguay
+    hy: Ուրուգվայ
+    ia: Uruguay
+    id: Uruguay
+    ie: Uruguay
+    io: Uruguay
+    is: Úrúgvæ
+    it: Uruguay
+    ja: ウルグアイ
+    jv: Uruguay
+    ka: ურუგვაი
+    ki: Urugwai
+    kk: Уругвай
+    kl: Uruguay
+    km: អ៊ុយរុយហ្គាយ
+    kn: ಉರುಗ್ವೆ
+    ko: 우루과이
+    ks: یوٗروگے
+    ku: Ûrûguay
+    kw: Urugway
+    la: Uraquaria
+    lb: Uruguay
+    lg: Wurugwayi
+    li: Urugay
+    ln: Ulugwai
+    lo: ອຸລຸກວຍ
+    lt: Urugvajus
+    lv: Urugvaja
+    mg: Orogoay
+    mi: Urukoi
+    mk: Уругвај
+    ml: ഉറുഗ്വേ
+    mn: Уругвай
+    mr: उरुग्वे
+    ms: Uruguay
+    mt: Urugwaj
+    my: ဥရုဂွေးနိုင်ငံ
+    ne: उरुग्वाइ
+    nl: Uruguay
+    nn: Uruguay
+    "no": Uruguay
+    nv: Táłtłʼááh Chʼosh Bitooh (Kéyah Dah Siʼánígíí)
+    oc: Uruguai
+    or: ଉରୁଗୁଏ
+    os: Уругвай
+    pa: ਉਰੂਗੁਏ
+    pl: Urugwaj
+    ps: یوروګوای
+    pt: Uruguai
+    qu: Uruwayi
+    rm: Uruguay
+    rn: Irigwe
+    ro: Uruguay
+    ru: Уругвай
+    rw: Irigwe
+    sa: उरुग्वाय
+    sc: Uruguay
+    se: Uruguay
+    sg: Uruguëe
+    sh: Urugvaj
+    si: උරුගුවායි
+    sk: Uruguaj
+    sl: Urugvaj
+    so: Uruguwaay
+    sq: Uruguaji
+    sr: Уругвај
+    su: Uruguay
+    sv: Uruguay
+    sw: Urugwai
+    ta: உருகுவை
+    te: ఉరుగువే
+    tg: Уругуай
+    th: ประเทศอุรุกวัย
+    ti: ኡራጓይ
+    tl: Urugway
+    to: ʻUlukuei
+    tr: Uruguay
+    tt: Уругвай
+    ug: ئۇرۇگۋاي
+    uk: Уругвай
+    ur: یوراگوئے
+    uz: Urugvay
+    vi: Uruguay
+    vo: Luruguyän
+    wa: Ourougway
+    wo: Uruguwaay
+    yi: אורוגוויי
+    yo: Urugúáì
+    zh: 乌拉圭
+    zu: i-Uruguay
diff --git a/settings/country-names/uz.yaml b/settings/country-names/uz.yaml
new file mode 100644 (file)
index 0000000..2f7b1ee
--- /dev/null
@@ -0,0 +1,121 @@
+name: 
+    default: Oʻzbekiston
+    af: Oesbekistan
+    am: ኡዝቤኪስታን
+    an: Uzbekistán
+    ar: أوزبكستان
+    az: Özbəkistan
+    ba: Үзбәкстан
+    be: Узбекістан
+    bg: Узбекистан
+    bn: উজবেকিস্তান
+    bo: ཨུ་ཟ་བྷེ་ཁི་སི་ཐན།
+    br: Ouzbekistan
+    bs: Uzbekistan
+    ca: Uzbekistan
+    ce: Узбекистан
+    cs: Uzbekistán
+    cv: Ӳспекстан
+    cy: Uzbekistan
+    da: Usbekistan
+    de: Usbekistan
+    dv: އުޒްބެކިސްތާން
+    dz: ཨུཛ་བེ་ཀིསི་ཏཱན་
+    ee: Uzbekistan
+    el: Ουζμπεκιστάν
+    en: Uzbekistan
+    eo: Uzbekio
+    es: Uzbekistán
+    et: Usbekistan
+    eu: Uzbekistan
+    fa: ازبکستان
+    fi: Uzbekistan
+    fo: Usbekistan
+    fr: Ouzbékistan
+    fy: Oezbekistan
+    ga: An Úisbéiceastáin
+    gd: Usbagastàn
+    gl: Uzbequistán
+    gu: ઉઝબેકિસ્તાન
+    gv: Yn Oosbeckistaan
+    he: אוזבקיסטן
+    hi: उज़्बेकिस्तान
+    hr: Uzbekistan
+    ht: Ouzbekistan
+    hu: Üzbegisztán
+    hy: Ուզբեկստան
+    ia: Uzbekistan
+    id: Uzbekistan
+    ie: Uzbekistan
+    io: Uzbekistan
+    is: Úsbekistan
+    it: Uzbekistan
+    ja: ウズベキスタン
+    jv: Uzbekistan
+    ka: უზბეკეთი
+    kk: Өзбекстан
+    kn: ಉಜ್ಬೇಕಿಸ್ಥಾನ್
+    ko: 우즈베키스탄
+    ku: Ûzbêkistan
+    kv: Узбекистан
+    kw: Pow Ousbek
+    ky: Өзбекстан
+    la: Uzbecia
+    lb: Usbekistan
+    li: Oesbekistan
+    ln: Uzbekistáni
+    lt: Uzbekija
+    lv: Uzbekistāna
+    mk: Узбекистан
+    ml: ഉസ്ബെക്കിസ്ഥാൻ
+    mn: Узбекистан
+    mr: उझबेकिस्तान
+    ms: Uzbekistan
+    my: ဥဇဘက်ကစ္စတန်နိုင်ငံ
+    na: Uzbekistan
+    nl: Oezbekistan
+    nn: Usbekistan
+    "no": Usbekistan
+    nv: Ózbeʼ Bikéyah
+    oc: Ozbequistan
+    or: ଉଜବେକିସ୍ଥାନ
+    os: Узбекистан
+    pa: ਉਜ਼ਬੇਕਿਸਤਾਨ
+    pl: Uzbekistan
+    ps: اوزبکستان
+    pt: Uzbequistão
+    qu: Usbiksuyu
+    ro: Uzbekistan
+    ru: Узбекистан
+    rw: Uzubekisitani
+    sa: उजबेकिस्थान
+    sd: ازبڪستان
+    se: Uzbekistan
+    sh: Uzbekistan
+    sk: Uzbekistan
+    sl: Uzbekistan
+    so: Usbekistan
+    sq: Uzbekistani
+    sr: Узбекистан
+    ss: IZubekhi
+    su: Uzbékistan
+    sv: Uzbekistan
+    sw: Uzbekistan
+    ta: உசுபெக்கிசுத்தான்
+    te: ఉజ్బెకిస్తాన్
+    tg: Ӯзбакистон
+    th: ประเทศอุซเบกิสถาน
+    tk: Özbegistan
+    tl: Uzbekistan
+    tr: Özbekistan
+    tt: Үзбәкстан
+    ug: ئۆزبېكىستان
+    uk: Узбекистан
+    ur: ازبکستان
+    uz: Oʻzbekiston
+    vi: Uzbekistan
+    vo: Lusbekän
+    wo: Usbekistaan
+    yi: אוזבעקיסטאן
+    yo: Ùsbẹ̀kìstán
+    zh: 乌兹别克斯坦
diff --git a/settings/country-names/va.yaml b/settings/country-names/va.yaml
new file mode 100644 (file)
index 0000000..fd1b2ea
--- /dev/null
@@ -0,0 +1,133 @@
+name: 
+    default: Civitas Vaticana
+    af: Vatikaanstad
+    am: ቫቲካን ከተማ
+    an: Ciudat d'o Vaticano
+    ar: الفاتيكان
+    az: Vatikan
+    ba: Ватикан
+    be: Ватыкан
+    bg: Ватикан
+    bi: Vatican Siti
+    bn: ভ্যাটিকান সিটি
+    bo: ཝ་ཏི་ཀན་གྲོང་ཁྱོར།
+    br: Keoded ar Vatikan
+    bs: Vatikan
+    ca: Ciutat del Vaticà
+    ce: Ватикан
+    co: Cità di u Vaticanu
+    cs: Vatikán
+    cu: Ватиканъ
+    cv: Ватикан
+    cy: Y Fatican
+    da: Vatikanstaten
+    de: Staat Vatikanstadt
+    dv: ވެޓިކަން ސިޓީ
+    dz: བ་ཊི་ཀཱན།
+    ee: Vatican City
+    el: Βατικανό
+    en: Vatican City
+    eo: Vatikano
+    es: Ciudad del Vaticano
+    et: Vatikan
+    eu: Vatikano Hiria
+    fa: واتیکان
+    fi: Vatikaanivaltio
+    fo: Vatikanið
+    fr: Cité du Vatican
+    fy: Fatikaanstêd
+    ga: Cathair na Vatacáine
+    gd: Cathair na Bhatacain
+    gl: Cidade do Vaticano
+    gn: Táva Vatikano
+    gv: Ard-valley yn Phaab
+    he: קריית הוותיקן
+    hi: वैटिकन सिटी
+    hr: Vatikan
+    ht: Vatikan
+    hu: Vatikán
+    hy: Վատիկան
+    ia: Citate Vatican
+    id: Vatikan
+    ie: Vaticano
+    io: Vatikano
+    is: Vatíkanið
+    it: Città del Vaticano
+    ja: バチカン
+    jv: Vatikan
+    ka: ვატიკანი
+    kg: Vatican
+    kk: Ватикан
+    kl: Vatikani
+    km: បុរីវ៉ាទីកង់
+    kn: ವ್ಯಾಟಿಕನ್ ನಗರ
+    ko: 바티칸 시국
+    ku: Vatîkan
+    kv: Ватикан
+    kw: Cita Vatikan
+    ky: Ватикан
+    la: Status Civitatis Vaticanæ
+    lb: Vatikanstad
+    li: Vaticaanstad
+    ln: Vatikáni
+    lt: Vatikanas
+    lv: Vatikāns
+    mi: Poho o Pita
+    mk: Ватикан
+    ml: വത്തിക്കാൻ നഗരം
+    mn: Ватикан
+    mr: व्हॅटिकन सिटी
+    ms: Kota Vatican
+    mt: Belt tal-Vatikan
+    my: ဗာတီကန်စီးတီး
+    na: Batikan
+    ne: भ्याटिकन सिटी
+    nl: Vaticaanstad
+    nn: Vatikanstaten
+    "no": Vatikanstaten
+    nv: Bádikin Sídii
+    oc: Vatican
+    or: ଭାଟିକାନ ସିଟି
+    os: Ватикан
+    pa: ਵੈਟੀਕਨ ਸ਼ਹਿਰ
+    pl: Watykan
+    ps: واټيکان ښار
+    pt: Vaticano
+    qu: Watikanu llaqta
+    rm: Citad dal Vatican
+    ro: Vatican
+    ru: Ватикан
+    rw: Vatikani
+    sa: वैटिकन
+    sc: Tzitade de su Vaticanu
+    se: Vatikána
+    sh: Vatikan
+    si: වතිකානුව
+    sk: Vatikán
+    sl: Vatikan
+    so: Faatikan
+    sq: Vatikani
+    sr: Ватикан
+    ss: IVathikhi
+    su: Vatikan
+    sv: Vatikanstaten
+    sw: Vatikani
+    ta: வத்திக்கான் நகர்
+    te: వాటికన్ నగరం
+    tg: Вотикон
+    th: นครรัฐวาติกัน
+    tk: Watikan
+    tl: Lungsod ng Vaticano
+    tr: Vatikan
+    tt: Ватикан
+    ug: Watikan Shehiri
+    uk: Ватикан
+    ur: ویٹیکن سٹی
+    uz: Vatikan shahri
+    vi: Thành Vatican
+    vo: Vatikän
+    wo: Watikaa
+    yi: וואטיקאן
+    yo: Ìlú Fatikan
+    zh: 梵蒂冈
+    zu: Indolobha yaseVathikhani
diff --git a/settings/country-names/vc.yaml b/settings/country-names/vc.yaml
new file mode 100644 (file)
index 0000000..0887ea4
--- /dev/null
@@ -0,0 +1,47 @@
+name: 
+    default: Saint Vincent and the Grenadines
+    af: Sint Vincent en die Grenadines
+    ar: سانت فنسنت وجزر غرينادين
+    be: Святы Вінцэнт і Грэнадзіны
+    br: Sant-Visant hag ar Grenadinez
+    ca: Saint Vincent i les Grenadines
+    cs: Svatý Vincent a Grenadiny
+    cy: Saint Vincent a'r Grenadines
+    da: Saint Vincent og Grenadinerne
+    de: St. Vincent und die Grenadinen
+    el: Άγιος Βικέντιος και Γρεναδίνες
+    en: Saint Vincent and the Grenadines
+    eo: Sankta Vincento kaj Grenadinoj
+    es: San Vicente y las Granadinas
+    fa: سنت وینسنت و گرنادین
+    fi: Saint Vincent ja Grenadiinit
+    fr: Saint-Vincent-et-les Grenadines
+    fy: Sint Finsint en de Grenadinen
+    ga: San Uinseann agus na Greanáidíní
+    gd: Naomh Bhionsant agus Eileanan Greanadach
+    he: סנט וינסנט והגרנדינים
+    hr: Sveti Vincent i Grenadini
+    hu: Saint Vincent és a Grenadine-szigetek
+    id: Saint Vincent dan Grenadines
+    is: Sankti Vinsent og Grenadíneyjar
+    it: Saint Vincent e Grenadine
+    ja: セントビンセント及びグレナディーン諸島
+    lb: Saint Vincent an d’Grenadinen
+    li: Saint-Vincent
+    lt: Sent Vinsentas ir Grenadinai
+    mn: Сент-Винсент ба Гренадин
+    nl: Saint Vincent en de Grenadines
+    pl: Saint Vincent i Grenadyny
+    pt: São Vicente e Granadinas
+    ru: Сент-Винсент и Гренадины
+    se: Saint Vincent ja Grenadiinnat
+    sk: Svätý Vincent a Grenadíny
+    sl: Sveti Vincencij in Grenadine
+    sv: Saint Vincent och Grenadinerna
+    ta: செயின்ட் வின்செண்டு மற்றும் கிரெனடீன்கள்
+    th: ประเทศเซนต์วินเซนต์และเกรนาดีนส์
+    tr: Saint Vincent ve Grenadinler
+    uk: Сент-Вінсент і Гренадини
+    vi: Saint Vincent và Grenadines
+    vo: Saluda-Vinsenteän e Grenadineäns
+    zh: 圣文森特和格林纳丁斯
diff --git a/settings/country-names/ve.yaml b/settings/country-names/ve.yaml
new file mode 100644 (file)
index 0000000..cd006d5
--- /dev/null
@@ -0,0 +1,129 @@
+name: 
+    default: Venezuela
+    af: Venezuela
+    am: ቬኔዝዌላ
+    an: Venezuela
+    ar: فنزويلا
+    av: Венесуэла
+    ay: Winïxwila
+    az: Venesuela
+    ba: Венесуэла
+    be: Венесуэла
+    bg: Венецуела
+    bi: Venezuela
+    bm: Venezuela
+    bn: ভেনেজুয়েলা
+    bo: ཝེ་ནེ་ཟུའེ་ལ།
+    br: Venezuela
+    bs: Venecuela
+    ca: Veneçuela
+    ce: Венесуэла
+    co: Venezuela
+    cs: Venezuela
+    cv: Венесуэла
+    cy: Venezuela
+    da: Venezuela
+    de: Venezuela
+    dv: ވެނެޒުއޭލާ
+    ee: Venezuela
+    el: Βενεζουέλα
+    en: Venezuela
+    eo: Venezuelo
+    es: Venezuela
+    et: Venezuela
+    eu: Venezuela
+    fa: ونزوئلا
+    fi: Venezuela
+    fo: Venesuela
+    fr: Venezuela
+    fy: Fenezuëla
+    ga: Veiniséala
+    gd: A' Bheiniseala
+    gl: Venezuela
+    gn: Venesuéla
+    gu: વેનેઝુએલા
+    gv: Yn Veneswaaley
+    he: ונצואלה
+    hi: वेनेज़ुएला
+    hr: Venezuela
+    ht: Venezwela
+    hu: Venezuela
+    hy: Վենեսուելա
+    ia: Venezuela
+    id: Venezuela
+    ie: Venezuela
+    io: Venezuela
+    is: Venesúela
+    it: Venezuela
+    ja: ベネズエラ
+    jv: Venezuela
+    ka: ვენესუელა
+    kk: Венесуэла
+    kn: ವೆನೆಜುವೆಲಾ
+    ko: 베네수엘라
+    ku: Venezuela
+    kw: Veneswela
+    la: Venetiola
+    lb: Venezuela
+    li: Venezuela
+    ln: Venezwela
+    lt: Venesuela
+    lv: Venecuēla
+    mg: Venezoela
+    mi: Wenehūera
+    mk: Венецуела
+    ml: വെനിസ്വേല
+    mn: Венесуэл
+    mr: व्हेनेझुएला
+    ms: Venezuela
+    mt: Veneżwela
+    my: ဗင်နီဇွဲလားနိုင်ငံ
+    ne: भेनेजुएला
+    nl: Venezuela
+    nn: Venezuela
+    "no": Venezuela
+    nv: Táłkááʼ Bighan Dineʼé Bikéyah
+    oc: Veneçuèla
+    or: ଭେନେଜୁଏଲା
+    os: Венесуэлæ
+    pa: ਵੈਨੇਜ਼ੁਏਲਾ
+    pl: Wenezuela
+    pt: Venezuela
+    qu: Winisuyla
+    rm: Venezuela
+    rn: Venezuela
+    ro: Venezuela
+    ru: Венесуэла
+    rw: Venezuwela
+    sa: वेनेज्वेला
+    se: Venezuela
+    sh: Venezuela
+    sk: Venezuela
+    sl: Venezuela
+    sm: Venesuela
+    so: Fanansuwela
+    sq: Venezuela
+    sr: Венецуела
+    su: Vénézuéla
+    sv: Venezuela
+    sw: Venezuela
+    ta: வெனிசுவேலா
+    tg: Венесуэла
+    th: ประเทศเวเนซุเอลา
+    tk: Wenesuela
+    tl: Venezuela
+    tr: Venezuela
+    tt: Венесуэла
+    ug: ۋېنېسۇئېلا
+    uk: Венесуела
+    ur: وینیزویلا
+    uz: Venesuela
+    ve: Venezuela
+    vi: Venezuela
+    vo: Venesolän
+    wa: Venezwela
+    wo: Benesuwela
+    yi: ווענעזועלע
+    yo: Fenesuela
+    zh: 委內瑞拉
+    zu: Venezuela
diff --git a/settings/country-names/vg.yaml b/settings/country-names/vg.yaml
new file mode 100644 (file)
index 0000000..35430a2
--- /dev/null
@@ -0,0 +1,45 @@
+name: 
+    default: British Virgin Islands
+    af: Brits-Maagde-eilande
+    ar: جزر فيرجن البريطانية
+    be: Брытанскія Вірджынскія астравы
+    br: Inizi Gwerc’h Breizhveuriat
+    ca: Illes Verges Britàniques
+    cs: Britské Panenské ostrovy
+    da: Britiske Jomfruøer
+    de: Britische Jungferninseln
+    en: British Virgin Islands
+    eo: Britaj Virgulinsuloj
+    es: Islas Vírgenes Británicas
+    et: Briti Neitsisaared
+    eu: Birjina uharte britainiarrak
+    fa: جزایر ویرجین بریتانیا
+    fi: Brittiläiset Neitsytsaaret
+    fr: Îles Vierges britanniques
+    ga: Oileáin Bhriotanacha na Maighdean
+    he: איי הבתולה הבריטיים
+    hr: Britanski Djevičanski Otoci
+    hu: Brit Virgin-szigetek
+    id: Kepulauan Virgin Britania Raya
+    is: Bresku Jómfrúaeyjar
+    it: Isole Vergini Britanniche
+    ja: イギリス領ヴァージン諸島
+    la: Britannicae Virginis Insulae
+    lb: Britesch Joffereninselen
+    lt: Britų Mergelių salos
+    lv: Britu Virdžīnu salas
+    mk: Британски Девствени Острови
+    mn: Виржиний Арлууд, Британийн
+    nl: Britse Maagdeneilanden
+    pl: Brytyjskie Wyspy Dziewicze
+    pt: Ilhas Virgens Britânicas
+    ru: Британские Виргинские острова
+    sk: Britské Panenské ostrovy
+    sl: Britanski Deviški otoki
+    sr: Британска Девичанска Острва
+    sv: Brittiska Jungfruöarna
+    th: หมู่เกาะบริติชเวอร์จิน
+    tr: Birleşik Krallık Virgin Adaları
+    uk: Британські Віргінські острови
+    vi: Quần đảo Virgin thuộc Anh
+    zh: 英属维尔京群岛
diff --git a/settings/country-names/vi.yaml b/settings/country-names/vi.yaml
new file mode 100644 (file)
index 0000000..b12702b
--- /dev/null
@@ -0,0 +1,2 @@
+name: 
+    default: United States Virgin Islands
diff --git a/settings/country-names/vn.yaml b/settings/country-names/vn.yaml
new file mode 100644 (file)
index 0000000..bea8204
--- /dev/null
@@ -0,0 +1,149 @@
+name: 
+    default: Việt Nam
+    af: Viëtnam
+    ak: Vietnam
+    am: ቬት ናም
+    an: Vietnam
+    ar: فيتنام
+    av: Вьетнам
+    ay: Vietnam
+    az: Vyetnam
+    ba: Вьетнам
+    be: В'етнам
+    bg: Виетнам
+    bi: Vietnam
+    bm: Vietnam
+    bn: ভিয়েতনাম
+    bo: ཝི་ཏི་ནམ།
+    br: Viêt Nam
+    bs: Vijetnam
+    ca: Vietnam
+    ce: Вьетнам
+    ch: Vietnam
+    cs: Vietnam
+    cv: Вьетнам
+    cy: Fietnam
+    da: Vietnam
+    de: Vietnam
+    dv: ވިއެޓުނާމު
+    ee: Vietnam
+    el: Βιετνάμ
+    en: Vietnam
+    eo: Vjetnamio
+    es: Vietnam
+    et: Vietnam
+    eu: Vietnam
+    fa: ویتنام
+    ff: Vietnam
+    fi: Vietnam
+    fo: Vjetnam
+    fr: Viêt Nam
+    fy: Fjetnam
+    ga: Vítneam
+    gd: Bhiet-Nam
+    gl: Vietnam
+    gn: Vietnam
+    gu: વિયેતનામ
+    gv: Yn Vietnam
+    he: וייטנאם
+    hi: वियतनाम
+    hr: Vijetnam
+    ht: Vyetnam
+    hu: Vietnám
+    hy: Վիետնամ
+    ia: Vietnam
+    id: Vietnam
+    ie: Viet-Nam
+    ik: Vietnam
+    io: Vietnam
+    is: Víetnam
+    it: Vietnam
+    ja: ベトナム
+    jv: Viètnam
+    ka: ვიეტნამი
+    kg: Vietnam
+    ki: Vietnam
+    kk: Вьетнам
+    kl: Vietnam
+    km: វៀតណាម
+    kn: ವಿಯೆಟ್ನಾಮ್
+    ko: 베트남
+    ku: Viyetnam
+    kv: Вьетнам
+    kw: Vietnam
+    ky: Вьетнам
+    la: Vietnamia
+    lb: Vietnam
+    li: Vietnam
+    ln: Vietnami
+    lo: ປະເທດຫວຽດນາມ
+    lt: Vietnamas
+    lv: Vjetnama
+    mg: Vietnam
+    mi: Witināma
+    mk: Виетнам
+    ml: വിയറ്റ്നാം
+    mn: Вьетнам
+    mr: व्हियेतनाम
+    ms: Vietnam
+    mt: Vjetnam
+    my: ဗီယက်နမ်နိုင်ငံ
+    na: Bitinam
+    ne: भियतनाम
+    nl: Vietnam
+    nn: Vietnam
+    "no": Vietnam
+    nv: Biʼednam
+    oc: Vietnam
+    om: Veetinaam
+    or: ଭିଏତନାମ
+    os: Вьетнам
+    pa: ਵੀਅਤਨਾਮ
+    pl: Wietnam
+    pt: Vietname
+    qu: Witnam
+    rm: Vietnam
+    rn: Vietnam
+    ro: Vietnam
+    ru: Вьетнам
+    rw: Viyetinamu
+    sa: चम्पादेश
+    sc: Vietnam
+    se: Vietnam
+    sh: Vijetnam
+    si: වියට්නාමය
+    sk: Vietnam
+    sl: Vietnam
+    sm: Vietnam
+    sn: Vietnam
+    so: Fiyetnam
+    sq: Vietnami
+    sr: Вијетнам
+    ss: IViyethina
+    st: Vietnam
+    su: Viétnam
+    sv: Vietnam
+    sw: Vietnam
+    ta: வியட்நாம்
+    te: వియత్నాం
+    tg: Ветнам
+    th: ประเทศเวียดนาม
+    tk: Wýetnam
+    tl: Vietnam
+    tr: Vietnam
+    tt: Вьетнам
+    tw: Vietnam
+    ug: ۋيېتنام
+    uk: В'єтнам
+    ur: ویتنام
+    uz: Vyetnam
+    ve: Viëtnam
+    vi: Việt Nam
+    vo: Vietnamän
+    wa: Vietnam
+    wo: Wiyetnaam
+    yi: וויעטנאם
+    yo: Fiẹtnám
+    za: Yiednamz
+    zh: 越南
+    zu: IViyetnami
diff --git a/settings/country-names/vu.yaml b/settings/country-names/vu.yaml
new file mode 100644 (file)
index 0000000..c308754
--- /dev/null
@@ -0,0 +1,73 @@
+name: 
+    default: Vanuatu
+    ab: Вануату
+    ar: فانواتو
+    be: Вануату
+    bg: Вануату
+    bn: ভানুয়াটু
+    bo: ཝ་ནུའ་ཏུ།
+    br: Vanuatu
+    ce: Вануату
+    cs: Vanuatu
+    da: Vanuatu
+    de: Vanuatu
+    dv: ވަނުއާޓޫ
+    el: Βανουάτου
+    en: Vanuatu
+    eo: Vanuatuo
+    es: Vanuatu
+    fa: وانواتو
+    fi: Vanuatu
+    fr: Vanuatu
+    fy: Fanuatû
+    ga: Vanuatú
+    gd: Bhanuatu
+    he: ונואטו
+    hi: वानूअतु
+    hr: Vanuatu
+    ht: Vanwatou
+    hu: Vanuatu
+    hy: Վանուատու
+    is: Vanúatú
+    ja: バヌアツ
+    ka: ვანუატუ
+    kk: Вануату
+    kn: ವನುವಾಟು
+    ko: 바누아투
+    ku: Vanûatû
+    ky: Вануату
+    lt: Vanuatu
+    mk: Вануату
+    ml: വാനുവാടു
+    mn: Вануату
+    mr: व्हानुआतू
+    mt: Vanwatu
+    my: ဗနွားတူနိုင်ငံ
+    na: Banuatu
+    ne: भानुअटु
+    nv: Banoʼáátʼoo
+    oc: Vanuatu
+    or: ଭାନୁଆଟୁ
+    os: Вануату
+    pa: ਵਨੁਆਤੂ
+    pl: Vanuatu
+    pt: Vanuatu
+    qu: Wanwatu
+    ru: Вануату
+    rw: Vanuwatu
+    se: Vanuatu
+    sk: Vanuatu
+    sr: Вануату
+    sv: Vanuatu
+    ta: வனுவாட்டு
+    te: వనాటు
+    tg: Вануату
+    th: ประเทศวานูอาตู
+    tt: Вануату
+    ug: ۋانۇئاتۇ
+    uk: Вануату
+    ur: وانواتو
+    vo: Vanuatuäns
+    wo: Wanuatu
+    yo: Fanuatu
+    zh: 瓦努阿图
diff --git a/settings/country-names/wf.yaml b/settings/country-names/wf.yaml
new file mode 100644 (file)
index 0000000..253665d
--- /dev/null
@@ -0,0 +1,68 @@
+name: 
+    default: Wallis-et-Futuna
+    af: Wallis-en-Futuna
+    an: Wallis e Futuna
+    ar: جزر واليس وفوتونا
+    be: Уоліс і Футуна
+    bg: Уолис и Футуна
+    br: Wallis ha Futuna
+    ca: Wallis i Futuna
+    cs: Wallis a Futuna
+    cy: Wallis a Futuna
+    da: Wallis og Futuna
+    de: Wallis und Futuna
+    dv: ވާލީ އަދި ފުތޫނާ
+    el: Ουώλλις και Φουτούνα
+    en: Wallis and Futuna Islands
+    eo: Valiso kaj Futuno
+    es: Wallis y Futuna
+    et: Wallis ja Futuna
+    eu: Wallis eta Futuna
+    fa: والیس و فوتونا
+    fi: Wallis- ja Futunasaaret
+    fr: Wallis-et-Futuna
+    fy: Wallis en Fûtûna
+    ga: Vailís agus Futúna
+    gl: Wallis e Futuna
+    he: ואליס ופוטונה
+    hr: Wallis i Futuna
+    hu: Wallis és Futuna
+    id: Wallis dan Futuna
+    io: Wallis e Futuna Insuli
+    is: Wallis- og Fútúnaeyjar
+    it: Wallis e Futuna
+    ja: ウォリス・フツナ
+    jv: Wallis lan Futuna
+    ko: 왈리스 퓌튀나
+    kw: Wallis ha Futuna
+    la: Vallis et Futuna
+    lb: Wallis a Futuna
+    lt: Walliso ir Futuna salos
+    lv: Volisa un Futuna
+    mn: Уоллис ба Футуна
+    mr: वालिस व फुतुना
+    ms: Wallis dan Futuna
+    nl: Wallis en Futuna
+    nn: Wallis- og Futunaøyane
+    "no": Wallis- og Futunaøyene
+    oc: Wallis e Futuna
+    pl: Wallis i Futuna
+    pt: Wallis e Futuna
+    ro: Wallis şi Futuna
+    ru: Уоллис и Футуна
+    se: Wallis ja Futuna
+    sh: Wallis i Futuna
+    sk: Wallis a Futuna
+    sl: Wallis in Futuna
+    sm: Wallis and Futuna
+    sr: Валис и Футуна
+    sv: Wallis- och Futunaöarna
+    sw: Wallis na Futuna
+    ta: வலிசும் புட்டூனாவும்
+    th: หมู่เกาะวาลลิสและหมู่เกาะฟุตูนา
+    tr: Wallis ve Futuna Adaları
+    ug: Wallis we Futuna Taqim Aralliri
+    uk: Волліс і Футуна
+    vi: Wallis và Futuna
+    wo: Wallis ak Futuna
+    zh: 瓦利斯和富图纳群岛
diff --git a/settings/country-names/ws.yaml b/settings/country-names/ws.yaml
new file mode 100644 (file)
index 0000000..a7fb21a
--- /dev/null
@@ -0,0 +1,82 @@
+name: 
+    default: Sāmoa
+    am: ሳሞአ
+    ar: ساموا
+    be: Самоа
+    bg: Самоа
+    bm: Samowa
+    bn: সামোয়া
+    bo: ནུ་བ་ས་མོ་འ།
+    br: Samoa
+    ca: Samoa
+    cs: Samoa
+    da: Samoa
+    de: Samoa
+    dz: ས་མོ་ཨ
+    ee: Samoa nutome
+    el: Σαμόα
+    en: Samoa
+    eo: Samoo
+    es: Samoa
+    et: Samoa
+    fa: ساموآ
+    ff: Samowaa
+    fi: Samoa
+    fo: Sámoa
+    fr: Samoa
+    fy: Samoä
+    ga: Samó
+    gd: Samotha
+    gu: સમોઆ
+    gv: Samoa
+    ha: Samowa
+    he: סמואה
+    hi: समोआ
+    hr: Samoa
+    hu: Szamoa
+    hy: Սամոա
+    ia: Samoa
+    io: Samoa
+    is: Samóa
+    it: Samoa
+    ja: サモア
+    ka: სამოა
+    km: សាមូអា
+    kn: ಸಮೋವಾ
+    ko: 사모아
+    ks: سیمووا
+    ku: Samoa
+    lg: Samowa
+    li: Samoa
+    lo: ຊາມົວ
+    lv: Samoa
+    mi: Hāmoa
+    mk: Самоа
+    ml: സാമോവ
+    mn: Самоа
+    mr: सामोआ
+    ne: सामोआ
+    nl: Samoa
+    "no": Samoa
+    or: ସାମୋଆ
+    pl: Samoa
+    rn: Samowa
+    ru: Самоа
+    se: Samoa
+    sg: Samoäa
+    si: සැමෝවා
+    sk: Samoa
+    sl: Samoa
+    sr: Самоа
+    sv: Samoa
+    ta: சமோவா
+    te: సమోవా
+    th: ประเทศซามัว
+    ti: ሳሞአ
+    to: Haʻamoa
+    uk: Самоа
+    ur: ساموآ
+    vo: Samovuäns
+    yo: Orílẹ́ède Samọ
+    zh: 萨摩亚
+    zu: i-Samoa
diff --git a/settings/country-names/xk.yaml b/settings/country-names/xk.yaml
new file mode 100644 (file)
index 0000000..1633036
--- /dev/null
@@ -0,0 +1,116 @@
+name: 
+    default: Kosova / Kosovo
+    af: Kosovo
+    am: ኮሶቮ
+    an: Kosovo
+    ar: كوسوفو
+    ay: Kusuwu
+    az: Kosovo
+    ba: Косово
+    be: Косава
+    bg: Косово
+    bn: কসোভো
+    bo: ཁོ་སོ་ཝོ།
+    br: Kosovo
+    bs: Kosovo
+    ca: Kosovo
+    ce: Косово
+    cs: Kosovo
+    cv: Косово
+    cy: Cosofo
+    da: Kosovo
+    de: Kosovo
+    el: Κοσσυφοπέδιο
+    en: Kosovo
+    eo: Kosovo
+    es: Kosovo
+    et: Kosovo
+    eu: Kosovo
+    fa: کوزوو
+    fi: Kosovo
+    fo: Kosovo
+    fr: Kosovo
+    fy: Kosovo
+    ga: An Chosaiv
+    gd: Cosobho
+    gl: Kosovo
+    gn: Kosovo
+    gv: Kosovo
+    he: קוסובו
+    hi: कोसोवो गणराज्य
+    hr: Kosovo
+    hu: Koszovó
+    hy: Կոսովոն
+    ia: Kosovo
+    id: Kosovo
+    ie: Kosovo
+    ig: Kosovo
+    io: Kosovo
+    is: Kosóvó
+    it: Kosovo
+    ja: コソボ
+    jv: Kosovo
+    ka: კოსოვო
+    kk: Косово
+    kl: Kosovo
+    kn: ಕೊಸೊವೊ
+    ko: 코소보
+    ku: Kosova
+    kv: Косово
+    kw: Kosova
+    ky: Косово
+    la: Kosovia
+    lb: Kosovo
+    li: Kosovo
+    lo: ປະເທດໂກໂຊໂວ
+    lt: Kosovas
+    lv: Kosova
+    mk: Косово
+    ml: കൊസോവോ
+    mn: Косово
+    mr: कोसोव्हो
+    ms: Kosovo
+    mt: Kosovo
+    my: ကိုဆိုဗို
+    na: Kosovo
+    nl: Kosovo
+    nn: Kosovo
+    "no": Kosovo
+    ny: Kosovo
+    oc: Kosova
+    os: Косово
+    pa: ਕੋਸੋਵੋ ਗਣਰਾਜ
+    pl: Kosowo
+    pt: Kosovo
+    qu: Kusuwu
+    rm: Cosovo
+    ro: Kosovo
+    ru: Косово
+    rw: Kosovo
+    sc: Kòssovu
+    sh: Kosovo
+    si: කොසෝවො
+    sk: Kosovo
+    sl: Kosovo
+    sm: Kosovo
+    sn: Kosovo
+    so: Kosofo
+    sq: Kosovo
+    sr: Косово
+    su: Kosovo
+    sv: Kosovo
+    sw: Kosovo
+    ta: கொசோவோ
+    te: కొసావో
+    th: ประเทศคอซอวอ
+    tl: Kosovo
+    tr: Kosova
+    ts: Kosovo
+    tt: Косово Җөмһүрияте
+    uk: Косово
+    ur: کوسووہ
+    uz: Kosovo
+    vi: Kosovo
+    vo: Kosovän
+    yo: Kósófò
+    zh: 科索沃
diff --git a/settings/country-names/ye.yaml b/settings/country-names/ye.yaml
new file mode 100644 (file)
index 0000000..adfad6b
--- /dev/null
@@ -0,0 +1,127 @@
+name: 
+    default: اليمن
+    af: Jemen
+    am: የመን (አገር)
+    an: Yemen
+    ar: اليمن
+    az: Yəmən
+    ba: Йемен
+    be: Емен
+    bg: Йемен
+    bn: ইয়েমেন
+    bo: ཡེ་མེན།
+    br: Yemen
+    bs: Jemen
+    ca: Iemen
+    ce: Йемен
+    co: Yemen
+    cs: Jemen
+    cv: Йемен
+    cy: Yemen
+    da: Yemen
+    de: Jemen
+    dv: ޔަމަން
+    el: Υεμένη
+    en: Yemen
+    eo: Jemeno
+    es: Yemen
+    et: Jeemen
+    eu: Yemen
+    fa: یمن
+    fi: Jemen
+    fo: Jemen
+    fr: Yémen
+    fy: Jemen
+    ga: Poblacht Éimin
+    gd: Iemen
+    gl: Iemen - اليمن
+    gn: Jemẽ
+    gu: યેમેન
+    gv: Yn Yeaman
+    he: תימן
+    hi: यमन
+    hr: Jemen
+    ht: Yemèn
+    hu: Jemen
+    hy: Եմեն
+    ia: Yemen
+    id: Yaman
+    ie: Yemen
+    io: Yemen
+    is: Jemen
+    it: Yemen
+    ja: イエメン
+    jv: Yaman
+    ka: იემენი
+    ki: Yemen
+    kk: Йемен
+    kl: Yemen
+    kn: ಯೆಮೆನ್
+    ko: 예멘
+    ks: یَمَن
+    ku: Yemen
+    kv: Йемен
+    kw: Yemen
+    ky: Йемен
+    la: Iemenia
+    lb: Jemen
+    li: Jeme
+    ln: Yeméni
+    lt: Jemenas
+    lv: Jemena
+    mk: Јемен
+    ml: യെമൻ
+    mn: Йемен
+    mr: येमेनचे प्रजासत्ताक
+    ms: Yaman
+    mt: Jemen
+    my: ယီမင်နိုင်ငံ
+    na: Yemen
+    ne: गणतन्त्र यमन
+    nl: Jemen
+    nn: Jemen
+    "no": Jemen
+    nv: Shádiʼááhjí Ásáí Bikéyah
+    oc: Iemèn
+    or: ୟେମେନ
+    os: Йемен
+    pa: ਯਮਨ
+    pl: Jemen
+    ps: یمن
+    pt: Iémen
+    qu: Yaman
+    ro: Yemen
+    ru: Йемен
+    rw: Yemeni
+    sa: यमन
+    sd: يمن
+    se: Jemen
+    sh: Jemen
+    sk: Jemen
+    sl: Jemen
+    so: Yemen
+    sq: Jemeni
+    sr: Јемен
+    ss: IYemeni
+    su: Yaman
+    sv: Jemen
+    sw: Yemen
+    ta: யெமன்
+    te: యెమన్
+    tg: Яман
+    th: ประเทศเยเมน
+    tk: Ýemen
+    tl: Yemen
+    tr: Yemen
+    tt: Йәмән
+    ug: يەمەن
+    uk: Ємен
+    ur: یمن
+    uz: Yaman
+    vi: Yemen
+    vo: Yämän
+    wo: Yaman
+    yi: תימן
+    yo: Yemen
+    zh: 也门
+    zu: IYemen
diff --git a/settings/country-names/yt.yaml b/settings/country-names/yt.yaml
new file mode 100644 (file)
index 0000000..945bfc2
--- /dev/null
@@ -0,0 +1,2 @@
+name: 
+    default: Mayotte
diff --git a/settings/country-names/za.yaml b/settings/country-names/za.yaml
new file mode 100644 (file)
index 0000000..728a91b
--- /dev/null
@@ -0,0 +1,149 @@
+name: 
+    default: South Africa
+    af: Suid-Afrika
+    ak: Afrika Anaafo
+    am: ደቡብ አፍሪካ
+    an: Sudafrica
+    ar: جنوب أفريقيا
+    az: Cənub Afrika
+    be: Паўднёва-Афрыканская Рэспубліка
+    bg: Южна Африка
+    bm: Worodugu Afriki
+    bn: দক্ষিণ আফ্রিকা
+    bo: ལྷོ་ ཨཕྲི་ཀ།
+    br: Suafrika
+    bs: Južna Afrika
+    ca: Sud-àfrica
+    ce: Къилба-Африкин Республика
+    cs: Jižní Afrika
+    cv: Кăнтăр Африка
+    cy: De Affrica
+    da: Sydafrika
+    de: Südafrika
+    dv: ދެކުނު އެފްރިކާ
+    dz: སཱའུཐ་ ཨཕ་རི་ཀ
+    ee: Anyiehe Afrika nutome
+    el: Νότια Αφρική
+    en: South Africa
+    eo: Sud-Afriko
+    es: Sudáfrica
+    et: Lõuna-Aafrika Vabariik
+    eu: Hegoafrika
+    fa: آفریقای جنوبی
+    ff: Afrik bŋ Worgo
+    fi: Etelä-Afrikka
+    fo: Suðurafrika
+    fr: Afrique du Sud
+    fy: Súd-Afrika
+    ga: An Afraic Theas
+    gd: Afraga a Deas
+    gl: Suráfrica
+    gn: Yvyafrika
+    gu: દક્ષિણ આફ્રિકા
+    gv: Yn Affrick Yiass
+    ha: Afirka ta Kudu
+    he: דרום אפריקה
+    hi: दक्षिण अफ़्रीका
+    hr: Južna Afrika
+    ht: Afrik disid
+    hu: Dél-Afrika
+    hy: Հարավային Աֆրիկա
+    ia: Africa del Sud
+    id: Afrika Selatan
+    ie: Sudafrica
+    io: Sud-Afrika
+    is: Suður-Afríka
+    it: Sudafrica
+    ja: 南アフリカ
+    jv: Afrika Kidul
+    ka: სამხრეთ აფრიკა
+    kg: Afelika ya Sudi
+    ki: Abĩrika Kusini
+    kk: Оңтүстік Африка
+    km: អាព្រិក​ភាគ​ខាង​ត្បូង
+    kn: ದಕ್ಷಿಣ ಆಫ್ರಿಕಾ
+    ko: 남아프리카
+    ks: جَنوٗبی اَفریٖکا
+    ku: Afrîkaya Başûr
+    kv: Лунвыв Африкаса Республика
+    kw: Afrika Dhyhow
+    ky: Африкаанс тили
+    la: Africa Australis
+    lb: Südafrika
+    lg: Sawusafirika
+    li: Zuud-Afrika
+    ln: Sidafríka
+    lo: ອາຟະລິກາໃຕ້
+    lt: Pietų Afrika
+    lv: Dienvidāfrika
+    mg: Afrika Atsimo
+    mi: Awherika ki te Tonga
+    mk: Јужна Африка
+    ml: ദക്ഷിണാഫ്രിക്ക
+    mn: Өмнөд Африк
+    mr: दक्षिण अफ्रिका
+    ms: Afrika Selatan
+    mt: Afrika t’Isfel
+    my: တောင်အာဖရိက
+    ne: दक्षिण अफ्रिका
+    nl: Zuid-Afrika
+    nn: Sør-Afrika
+    "no": Sør-Afrika
+    nv: Kéyah Naakai Łizhinii Bikéyah Shádiʼááhjí Siʼánígíí
+    ny: South Africa
+    oc: Sud d'Africa
+    or: ଦକ୍ଷିଣ ଆଫ୍ରିକା
+    os: Хуссар Африкæйы
+    pa: ਦੱਖਣੀ ਅਫ਼ਰੀਕਾ
+    pl: Republika Południowej Afryki
+    ps: سویلي افریقا
+    pt: África do Sul
+    qu: Urin Aphrika
+    rm: Africa dal Sid
+    rn: Afurika y'Epfo
+    ro: Africa de Sud
+    ru: Южная Африка
+    rw: Afurika y’Epfo
+    sa: दक्षिण-आफ्रिका
+    sc: Sudàfrica
+    se: Lulli-Afrihká
+    sg: Afrîka-Mbongo
+    sh: Južna Afrika
+    si: දකුණු අප්‍රිකාව
+    sk: Južná Afrika
+    sl: Južna Afrika
+    sn: South Africa
+    so: Koonfur Afrika
+    sq: Afrika e Jugut
+    sr: Јужна Африка
+    ss: INingizimu Afrika
+    st: Afrika Borwa
+    su: Afrika Kidul
+    sv: Sydafrika
+    sw: Afrika Kusini
+    ta: தென் ஆப்பிரிக்கா
+    te: దక్షిణ ఆఫ్రికా రాజ్యం
+    tg: Африқои Ҷанубӣ
+    th: แอฟริกาใต้
+    ti: ደቡብ አፍሪካ
+    tk: Günorta Afrika
+    tl: Timog Aprika
+    tn: Aferika Borwa
+    to: ʻAfilika tonga
+    tr: Güney Afrika
+    ts: Afrika-Dzonga
+    tt: Көньяк Африка
+    ug: جەنۇبىي ئافرىقا
+    uk: Південна Африка
+    ur: جنوبی افریقہ
+    uz: Janubiy Afrika
+    ve: Afurika Tshipembe
+    vi: Nam Phi
+    vo: Sulüdafrikän
+    wa: Nonne-Afrike
+    wo: Afrig gu Bëj-saalum
+    xh: uMzantsi Afrika
+    yi: דרום אפריקע
+    yo: Gúúsù Áfríkà
+    zh: 南非
+    zu: iNingizimu Afrika
diff --git a/settings/country-names/zm.yaml b/settings/country-names/zm.yaml
new file mode 100644 (file)
index 0000000..fb58f5a
--- /dev/null
@@ -0,0 +1,125 @@
+name: 
+    default: Zambia
+    af: Zambië
+    am: ዛምቢያ
+    an: Zambia
+    ar: زامبيا
+    az: Zambiya
+    ba: Замбия
+    be: Замбія
+    bg: Замбия
+    bm: Zanbia
+    bn: জাম্বিয়া
+    bo: ཛམ་བི་ཡ།
+    br: Zambia
+    bs: Zambija
+    ca: Zàmbia
+    ce: Замби
+    cs: Zambie
+    cv: Замби
+    cy: Zambia
+    da: Zambia
+    de: Sambia
+    dv: ޒެމްބިއާ
+    ee: Zambia
+    el: Ζάμπια
+    en: Zambia
+    eo: Zambio
+    es: Zambia
+    et: Sambia
+    eu: Zambia
+    fa: زامبیا
+    fi: Sambia
+    fo: Sambia
+    fr: Zambie
+    fy: Sambia
+    ga: An tSaimbia
+    gd: Saimbia
+    gl: Zambia
+    gv: Yn Tambia
+    he: זמביה
+    hi: ज़ाम्बिया
+    hr: Zambija
+    ht: Zanbi
+    hu: Zambia
+    hy: Զամբիա
+    id: Zambia
+    ie: Zambia
+    io: Zambia
+    is: Sambía
+    it: Zambia
+    ja: ザンビア
+    jv: Zambia
+    ka: ზამბია
+    kg: Zambia
+    kk: Замбия
+    km: ប្រទេសហ្សំប៊ី
+    ko: 잠비아
+    ku: Zambiya
+    kw: Zambi
+    la: Zambia
+    lb: Sambia
+    li: Zambia
+    ln: Zambia
+    lt: Zambija
+    lv: Zambija
+    mi: Tāmipia
+    mk: Замбија
+    ml: സാംബിയ
+    mn: Замби
+    mr: झांबिया
+    ms: Zambia
+    mt: Żambja
+    my: ဇမ်ဘီယာနိုင်ငံ
+    nl: Zambia
+    nn: Zambia
+    "no": Zambia
+    ny: Zambia
+    oc: Zambia
+    or: ଜାମ୍ବିଆ
+    os: Замби
+    pa: ਜ਼ਾਂਬੀਆ
+    pl: Zambia
+    ps: زېمبيا
+    pt: Zâmbia
+    qu: Sambya
+    ro: Zambia
+    ru: Замбия
+    rw: Zambiya
+    sa: जाम्बिया
+    sc: Zàmbia
+    se: Zambia
+    sg: Zambïi
+    sh: Zambija
+    sk: Zambia
+    sl: Zambija
+    sn: Zambia
+    so: Saambiya
+    sq: Zambia
+    sr: Замбија
+    ss: IZambiya
+    su: Zambia
+    sv: Zambia
+    sw: Zambia
+    ta: சாம்பியா
+    te: జాంబియా
+    tg: Замбия
+    th: ประเทศแซมเบีย
+    ti: ዛምቢያ
+    tk: Zambiýa
+    tl: Sambya
+    tn: Zambia
+    tr: Zambiya
+    ts: Zambia
+    tt: Замбия
+    ug: زامبىيە
+    uk: Замбія
+    ur: زیمبیا
+    uz: Zambiya
+    vi: Zambia
+    vo: Zambiyän
+    wo: Saambi
+    yi: זאמביע
+    yo: Sámbíà
+    zh: 赞比亚
+    zu: IZambiya
diff --git a/settings/country-names/zw.yaml b/settings/country-names/zw.yaml
new file mode 100644 (file)
index 0000000..1a32943
--- /dev/null
@@ -0,0 +1,131 @@
+name: 
+    default: Zimbabwe
+    af: Zimbabwe
+    am: ዚምባብዌ
+    an: Zimbabwe
+    ar: زيمبابوي
+    az: Zimbabve
+    ba: Зимбабве
+    be: Зімбабвэ
+    bg: Зимбабве
+    bm: Zimbabwe
+    bn: জিম্বাবুয়ে
+    bo: ཛིམ་བབ་ཝི།
+    br: Zimbabwe
+    bs: Zimbabve
+    ca: Zimbabwe
+    ce: Зимбабве
+    cs: Zimbabwe
+    cv: Зимбабве
+    cy: Zimbabwe
+    da: Zimbabwe
+    de: Simbabwe
+    dv: ޒިމްބާބުވޭ
+    dz: ཛིམ་བབ་ཝེ་
+    ee: Zimbabwe
+    el: Ζιμπάμπουε
+    en: Zimbabwe
+    eo: Zimbabvo
+    es: Zimbabue
+    et: Zimbabwe
+    eu: Zimbabwe
+    fa: زیمبابوه
+    fi: Zimbabwe
+    fo: Simbabvi
+    fr: Zimbabwe
+    fy: Simbabwe
+    ga: An tSiombáib
+    gd: Siombabue
+    gl: Cimbabue
+    gv: Yn Çhimbabwe
+    he: זימבבואה
+    hi: ज़िम्बाब्वे
+    hr: Zimbabve
+    ht: Zimbabwe
+    hu: Zimbabwe
+    hy: Զիմբաբվե
+    id: Zimbabwe
+    ie: Zimbabwe
+    io: Zimbabwe
+    is: Simbabve
+    it: Zimbabwe
+    ja: ジンバブエ
+    jv: Zimbabwe
+    ka: ზიმბაბვე
+    kg: Zimbabwe
+    ki: Zimbabwe
+    kk: Зимбабве
+    kn: ಜಿಂಬಾಬ್ವೆ
+    ko: 짐바브웨
+    ku: Zîmbabwe
+    kw: Zimbabwe
+    la: Zimbabua
+    lb: Simbabwe
+    li: Zimbabwe
+    ln: Zimbabwe
+    lt: Zimbabvė
+    lv: Zimbabve
+    mi: Timuwawe
+    mk: Зимбабве
+    ml: സിംബാബ്വെ
+    mn: Зимбабве
+    mr: झिंबाब्वे
+    ms: Zimbabwe
+    mt: Żimbabwe
+    my: ဇင်ဘာဘွေနိုင်ငံ
+    ne: जिम्बाब्वे
+    nl: Zimbabwe
+    nn: Zimbabwe
+    "no": Zimbabwe
+    nv: Hooghan Tsé Bee Ádaalyaaí Bikéyah
+    ny: Zimbabwe
+    oc: Zimbabwe
+    or: ଜିମ୍ବାୱେ
+    os: Зимбабве
+    pa: ਜ਼ਿੰਬਾਬਵੇ
+    pl: Zimbabwe
+    ps: زېمبابوې
+    pt: Zimbabué
+    qu: Simbabwi
+    ro: Zimbabwe
+    ru: Зимбабве
+    rw: Zimbabwe
+    sa: जिम्बाबवे
+    sc: Zimbabwe
+    se: Zimbabwe
+    sg: Zimbäbwe
+    sh: Zimbabve
+    si: සිම්බාබ්වේ
+    sk: Zimbabwe
+    sl: Zimbabve
+    sn: Zimbabwe
+    so: Simbaabwi
+    sq: Zimbabveja
+    sr: Зимбабве
+    ss: IZimbabhwe
+    su: Zimbabwé
+    sv: Zimbabwe
+    sw: Zimbabwe
+    ta: சிம்பாப்வே
+    te: జింబాబ్వే
+    tg: Зимбабве
+    th: ประเทศซิมบับเว
+    ti: ዚምባብዌ
+    tk: Zimbabwe
+    tl: Simbabwe
+    tn: Zimbabwe
+    tr: Zimbabve
+    ts: Zimbabwe
+    tt: Зимбабве
+    ug: زىمبابۋې
+    uk: Зімбабве
+    ur: زمبابوے
+    uz: Zimbabve
+    ve: Zimbagwe
+    vi: Zimbabwe
+    vo: Zimbabiyän
+    wo: Simbaawee
+    yi: זימבאבווע
+    yo: Sìmbábúè
+    zh: 辛巴威
+    zu: IZimbabwe
index dcbb1847f8fd1d7158d4dae8122081346e061e34..b0bacdfcc5d4dc60c944d4a14cfaf9e455a897d8 100644 (file)
 ad:
     partition: 35
     languages: ca
+    names: !include country-names/ad.yaml
+    postcode:
+      pattern: "(ddd)"
+      output: AD\1
+
 
 # United Arab Emirates (الإمارات العربية المتحدة)
 ae:
     partition: 83
     languages: ar
+    names: !include country-names/ae.yaml
+    postcode: no
+
 
 # Afghanistan (افغانستان)
 af:
     partition: 30
     languages: fa, ps
+    names: !include country-names/af.yaml
+    postcode:
+      pattern: "dddd"
+
 
 # Antigua and Barbuda (Antigua and Barbuda)
 ag:
     partition: 205
     languages: en
+    names: !include country-names/ag.yaml
+    postcode: no
+
 
 # Anguilla (Anguilla)
 ai:
     partition: 175
     languages: en
+    names: !include country-names/ai.yaml
+    postcode:
+      pattern: "2640"
+      output: AI-2640
+
 
 # Albania (Shqipëria)
 al:
     partition: 9
     languages: sq
+    names: !include country-names/al.yaml
+    postcode:
+      pattern: "dddd"
+
 
 # Armenia (Հայաստան)
 am:
     partition: 33
     languages: hy
+    names: !include country-names/am.yaml
+    postcode:
+      pattern: "dddd"
+
 
 # Netherlands Antilles (De Nederlandse Antillen)
 an:
     partition: 58
     languages: nl, en, pap
+    names: !include country-names/an.yaml
+
 
 # Angola (Angola)
 ao:
     partition: 85
     languages: pt
+    names: !include country-names/ao.yaml
+    postcode: no
+
 
 #  (Antarctica)
 aq:
     partition: 181
     languages: en, es, fr, ru
+    names: !include country-names/aq.yaml
+    postcode: no
+
 
 # Argentina (Argentina)
 ar:
     partition: 39
     languages: es
+    names: !include country-names/ar.yaml
+    postcode:
+      pattern: "l?dddd(?:lll)?"
+
 
 #  (American Samoa)
 as:
     partition: 182
     languages: en, sm
+    names: !include country-names/as.yaml
+
 
 # Austria (Österreich)
 at:
     partition: 245
     languages: de
+    names: !include country-names/at.yaml
+    postcode:
+      pattern: "dddd"
+
 
 # Australia (Australia)
 au:
     partition: 139
     languages: en
+    names: !include country-names/au.yaml
+    postcode:
+      pattern: "dddd"
+
 
 #  (Aruba)
 aw:
     partition: 183
     languages: nl, pap
+    names: !include country-names/aw.yaml
+    postcode: no
+
 
 #  (Aland Islands)
 ax:
     partition: 184
     languages: sv
+    names: !include country-names/ax.yaml
+
 
 # Azerbaijan (Azərbaycan)
 az:
     partition: 119
     languages: az
+    names: !include country-names/az.yaml
+    postcode:
+      pattern: "dddd"
+
 
 # Bosnia and Herzegovina (Bosna i Hercegovina / Босна и Херцеговина)
 ba:
     partition: 6
     languages: bs, hr, sr
+    names: !include country-names/ba.yaml
+    postcode:
+      pattern: "ddddd"
+
 
 # Barbados (Barbados)
 bb:
     partition: 206
     languages: en
+    names: !include country-names/bb.yaml
+    postcode:
+      pattern: "(ddddd)"
+      output: BB\1
+
 
 # Bangladesh (Bangladesh)
 bd:
     partition: 158
     languages: bn
+    names: !include country-names/bd.yaml
+    postcode:
+      pattern: "dddd"
+
 
 # Belgium (België / Belgique / Belgien)
 be:
     partition: 15
     languages: nl, fr, de
+    names: !include country-names/be.yaml
+    postcode:
+      pattern: "dddd"
+
 
 # Burkina Faso (Burkina Faso)
 bf:
     partition: 225
     languages: fr
+    names: !include country-names/bf.yaml
+    postcode: no
+
 
 # Bulgaria (Бългaрия)
 bg:
     partition: 140
     languages: bg
+    names: !include country-names/bg.yaml
+    postcode:
+      pattern: "dddd"
+
 
 # Bahrain (البحرين)
 bh:
     partition: 62
     languages: ar
+    names: !include country-names/bh.yaml
+    postcode:
+      pattern: "d?ddd"
+
 
 # Burundi (Burundi)
 bi:
     partition: 61
     languages: fr
+    names: !include country-names/bi.yaml
+    postcode: no
+
 
 # Benin (Bénin)
 bj:
     partition: 224
     languages: fr
+    names: !include country-names/bj.yaml
+    postcode: no
+
 
 #  (Saint Barthélemy)
 bl:
     partition: 204
     languages: fr
+    names: !include country-names/bl.yaml
+
 
 # Bermuda (Bermuda)
 bm:
     partition: 176
     languages: en
+    names: !include country-names/bm.yaml
+    postcode:
+      pattern: "(ll)[ -]?(dd)"
+      output: \1 \2
+
 
 # Brunei (Brunei)
 bn:
     partition: 86
     languages: ms
+    names: !include country-names/bn.yaml
+    postcode:
+      pattern: "(ll) ?(dddd)"
+      output: \1\2
+
 
 # Bolivia (Bolivia)
 bo:
     partition: 120
     languages: es, qu, gn, ay
+    names: !include country-names/bo.yaml
+    postcode: no
+
 
 # Caribbean Netherlands (Caribisch Nederland)
 bq:
     partition: 250
     languages: nl
+    names: !include country-names/bq.yaml
+
 
 # Brazil (Brasil)
 br:
     partition: 121
     languages: pt
+    names: !include country-names/br.yaml
+    postcode:
+      pattern: "(ddddd)-?(ddd)"
+      output: \1-\2
+
 
 # The Bahamas (The Bahamas)
 bs:
     partition: 207
     languages: en
+    names: !include country-names/bs.yaml
+    postcode: no
+
 
 # Bhutan (འབྲུག་ཡུལ་)
 bt:
     partition: 87
     languages: dz
+    names: !include country-names/bt.yaml
+    postcode:
+      pattern: "ddddd"
+
 
 #  (Bouvet Island)
 bv:
     partition: 185
     languages: "no"
+    names: !include country-names/bv.yaml
+
 
 # Botswana (Botswana)
 bw:
     partition: 122
     languages: en, tn
+    names: !include country-names/bw.yaml
+    postcode: no
+
 
 # Belarus (Беларусь)
 by:
     partition: 40
     languages: be, ru
+    names: !include country-names/by.yaml
+    postcode:
+      pattern: "dddddd"
+
 
 # Belize (Belize)
 bz:
     partition: 208
     languages: en
+    names: !include country-names/bz.yaml
+    postcode: no
+
 
 # Canada (Canada)
 ca:
     partition: 244
     languages: en, fr
+    names: !include country-names/ca.yaml
+    postcode:
+      pattern: "(ldl) ?(dld)"
+      output: \1 \2
+
 
 # Cocos (Keeling) Islands (Cocos (Keeling) Islands)
 cc:
     partition: 118
     languages: en
+    names: !include country-names/cc.yaml
+
 
 # Democratic Republic of the Congo (République démocratique du Congo)
 cd:
     partition: 229
     languages: fr
+    names: !include country-names/cd.yaml
+    postcode: no
+
 
 # Central African Republic (Ködörösêse tî Bêafrîka - République Centrafricaine)
 cf:
     partition: 227
-    languages: fr,sg
+    languages: fr, sg
+    names: !include country-names/cf.yaml
+    postcode: no
+
 
 # Congo-Brazzaville (Congo)
 cg:
     partition: 230
     languages: fr
+    names: !include country-names/cg.yaml
+    postcode: no
+
 
 # Switzerland (Schweiz/Suisse/Svizzera/Svizra)
 ch:
     partition: 5
     languages: de, fr, it, rm
+    names: !include country-names/ch.yaml
+    postcode:
+      pattern: "dddd"
+
 
 # Côte d'Ivoire (Côte d’Ivoire)
 ci:
     partition: 228
     languages: fr
+    names: !include country-names/ci.yaml
+    postcode: no
+
 
 # Cook Islands (Kūki 'Āirani)
 ck:
     partition: 41
     languages: en, rar
+    names: !include country-names/ck.yaml
+    postcode: no
+
 
 # Chile (Chile)
 cl:
     partition: 88
     languages: es
+    names: !include country-names/cl.yaml
+    postcode:
+      pattern: "ddddddd"
+
 
 # Cameroon (Cameroun)
 cm:
     partition: 141
     languages: fr, en
+    names: !include country-names/cm.yaml
+    postcode: no
+
 
 # China (中国)
 cn:
     partition: 117
     languages: zh
+    names: !include country-names/cn.yaml
+    postcode:
+      pattern: "dddddd"
+
 
 # Colombia (Colombia)
 co:
     partition: 133
     languages: es
+    names: !include country-names/co.yaml
+    postcode:
+      pattern: "dddddd"
+
 
 # Costa Rica (Costa Rica)
 cr:
     partition: 64
     languages: es
+    names: !include country-names/cr.yaml
+    postcode:
+      pattern: "ddddd"
+
 
 # Cuba (Cuba)
 cu:
     partition: 42
     languages: es
+    names: !include country-names/cu.yaml
+    postcode:
+      pattern: "ddddd"
+
 
 # Cape Verde (Cabo Verde)
 cv:
     partition: 89
     languages: pt
+    names: !include country-names/cv.yaml
+    postcode:
+      pattern: "dddd"
+
 
 # Curaçao (Curaçao)
 cw:
     partition: 248
     languages: nl, en
+    names: !include country-names/cw.yaml
+
 
 # Christmas Island (Christmas Island)
 cx:
     partition: 177
     languages: en
+    names: !include country-names/cx.yaml
+
 
 # Cyprus (Κύπρος - Kıbrıs)
 cy:
     partition: 114
     languages: el, tr
+    names: !include country-names/cy.yaml
+    postcode:
+      pattern: "(?:99|d)ddd"
+
 
 # Czechia (Česko)
 cz:
     partition: 124
     languages: cs
+    names: !include country-names/cz.yaml
+    postcode:
+      pattern: "(ddd) ?(dd)"
+      output: \1 \2
+
 
 # Germany (Deutschland)
 de:
     partition: 3
     languages: de
+    names: !include country-names/de.yaml
+    postcode:
+      pattern: "ddddd"
+
 
 # Djibouti (Djibouti جيبوتي)
 dj:
     partition: 43
     languages: fr, ar, so, aa
+    names: !include country-names/dj.yaml
+    postcode: no
+
 
 # Denmark (Danmark)
 dk:
     partition: 160
     languages: da
+    names: !include country-names/dk.yaml
+    postcode:
+      pattern: "dddd"
+
 
 # Dominica (Dominica)
 dm:
     partition: 209
     languages: en
+    names: !include country-names/dm.yaml
+    postcode: no
+
 
 # Dominican Republic (República Dominicana)
 do:
     partition: 37
     languages: es
+    names: !include country-names/do.yaml
+    postcode:
+      pattern: "ddddd"
+
 
 # Algeria (Algérie / ⵍⵣⵣⴰⵢⴻⵔ / الجزائر)
 dz:
     partition: 19
     languages: ar, ber, fr
+    names: !include country-names/dz.yaml
+    postcode:
+      pattern: "ddddd"
+
 
 # Ecuador (Ecuador)
 ec:
     partition: 78
     languages: es
+    names: !include country-names/ec.yaml
+    postcode:
+      pattern: "dddddd"
+
 
 # Estonia (Eesti)
 ee:
     partition: 125
     languages: et
+    names: !include country-names/ee.yaml
+    postcode:
+      pattern: "ddddd"
+
 
 # Egypt (مصر)
 eg:
     partition: 16
     languages: ar
+    names: !include country-names/eg.yaml
+    postcode:
+      pattern: "ddddd"
+
 
 # Sahrawi Arab Democratic Republic (الجمهورية العربية الصحراوية الديمقراطية)
 eh:
     partition: 186
     languages: ar, es, fr
+    names: !include country-names/eh.yaml
+
 
 # Eritrea (ኤርትራ Eritrea إرتريا)
 er:
     partition: 142
     languages: ti, ar, en
+    names: !include country-names/er.yaml
+    postcode: no
+
 
 # Spain (España)
 es:
     partition: 31
     languages: es, ast, ca, eu, gl
+    names: !include country-names/es.yaml
+    postcode:
+      pattern: "ddddd"
+
 
 # Ethiopia (ኢትዮጵያ)
 et:
     partition: 90
     languages: am, om
+    names: !include country-names/et.yaml
+    postcode:
+      pattern: "dddd"
+
 
 # Finland (Suomi)
 fi:
     partition: 20
     languages: fi, sv, se
+    names: !include country-names/fi.yaml
+    postcode:
+      pattern: "ddddd"
+
 
 # Fiji (Viti)
 fj:
     partition: 210
     languages: en
+    names: !include country-names/fj.yaml
+    postcode: no
+
 
 # Falkland Islands (Falkland Islands)
 fk:
     partition: 91
     languages: en
+    names: !include country-names/fk.yaml
+    postcode:
+      pattern: "FIQQ 1ZZ"
+
 
 # Federated States of Micronesia (Micronesia)
 fm:
     partition: 217
     languages: en
+    names: !include country-names/fm.yaml
+    postcode:
+      pattern: "ddddd"
+
 
 # Faroe Islands (Føroyar)
 fo:
     partition: 10
     languages: fo, da
+    names: !include country-names/fo.yaml
+    postcode:
+      pattern: "ddd"
+
 
 # France (France)
 fr:
     partition: 4
     languages: fr
+    names: !include country-names/fr.yaml
+    postcode:
+      pattern: "ddddd"
+
 
 # Gabon (Gabon)
 ga:
     partition: 239
     languages: fr
+    names: !include country-names/ga.yaml
+    postcode: no
+
 
 # United Kingdom (United Kingdom)
 gb:
     partition: 1
     languages: en
+    names: !include country-names/gb.yaml
+    postcode:
+      pattern: "(l?ld[A-Z0-9]?) ?(dll)"
+      output: \1 \2
+
 
 # Grenada (Grenada)
 gd:
     partition: 143
     languages: en
+    names: !include country-names/gd.yaml
+    postcode: no
+
 
 # Georgia (საქართველო)
 ge:
     partition: 21
     languages: ka
+    names: !include country-names/ge.yaml
+    postcode:
+      pattern: "dddd"
+
 
 # French Guiana (Guyane Française)
 gf:
     partition: 231
     languages: fr
+    names: !include country-names/gf.yaml
+
 
 # Guernsey (Guernsey)
 gg:
     partition: 77
     languages: en
+    names: !include country-names/gg.yaml
+    postcode:
+      pattern: "(GYdd?) ?(dll)"
+      output: \1 \2
+
 
 # Ghana (Ghana)
 gh:
     partition: 211
     languages: en
+    names: !include country-names/gh.yaml
+    postcode:
+      pattern: "ll-d?ddd-dddd"
+
 
 # Gibraltar (Gibraltar)
 gi:
     partition: 138
     languages: en
+    names: !include country-names/gi.yaml
+    postcode:
+      pattern: "(GX11) ?(1AA)"
+      output: GX11 1AA
+
 
 # Greenland (Kalaallit Nunaat)
 gl:
     partition: 111
     languages: kl, da
+    names: !include country-names/gl.yaml
+    postcode:
+      pattern: "dddd"
+
 
 # The Gambia (Gambia)
 gm:
     partition: 212
     languages: en
+    names: !include country-names/gm.yaml
+    postcode: no
+
 
 # Guinea (Guinée)
 gn:
     partition: 240
     languages: fr
+    names: !include country-names/gn.yaml
+    postcode:
+      pattern: "ddd"
+
 
 # Guadeloupe (Guadeloupe)
 gp:
     partition: 232
     languages: fr
+    names: !include country-names/gp.yaml
+
 
 # Equatorial Guinea (Guinea Ecuatorial)
 gq:
     partition: 12
     languages: es, fr, pt
+    names: !include country-names/gq.yaml
+    postcode: no
+
 
 # Greece (Ελλάς)
 gr:
     partition: 22
     languages: el
+    names: !include country-names/gr.yaml
+    postcode:
+      pattern: "(ddd) ?(dd)"
+      output: \1 \2
+
 
 # South Georgia and the South Sandwich Islands (South Georgia and the South Sandwich Islands)
 gs:
     partition: 44
     languages: en
+    names: !include country-names/gs.yaml
+    postcode:
+      pattern: "(SIQQ) ?(1ZZ)"
+      output: \1 \2
+
 
 # Guatemala (Guatemala)
 gt:
     partition: 57
     languages: es
+    names: !include country-names/gt.yaml
+    postcode:
+      pattern: "ddddd"
+
 
 # Guam (Guam)
 gu:
     partition: 187
     languages: en, ch
+    names: !include country-names/gu.yaml
+
 
 # Guinea-Bissau (Guiné-Bissau)
 gw:
     partition: 8
     languages: pt
+    names: !include country-names/gw.yaml
+    postcode:
+      pattern: "dddd"
+
 
 # Guyana (Guyana)
 gy:
     partition: 213
     languages: en
+    names: !include country-names/gy.yaml
+    postcode: no
+
 
 #  (Hong Kong)
 hk:
     partition: 188
     languages: zh-hant, en
+    names: !include country-names/hk.yaml
+
 
 #  (Heard Island and MaxDonald Islands)
 hm:
     partition: 189
     languages: en
+    names: !include country-names/hm.yaml
+
 
 # Honduras (Honduras)
 hn:
     partition: 56
     languages: es
+    names: !include country-names/hn.yaml
+    postcode:
+      pattern: "ddddd"
+
 
 # Croatia (Hrvatska)
 hr:
     partition: 92
     languages: hr
+    names: !include country-names/hr.yaml
+    postcode:
+      pattern: "ddddd"
+
 
 # Haiti (Ayiti)
 ht:
     partition: 29
     languages: fr, ht
+    names: !include country-names/ht.yaml
+    postcode:
+      pattern: "dddd"
+
 
 # Hungary (Magyarország)
 hu:
     partition: 45
     languages: hu
+    names: !include country-names/hu.yaml
+    postcode:
+      pattern: "dddd"
+
 
 # Indonesia (Indonesia)
 id:
     partition: 110
     languages: id
+    names: !include country-names/id.yaml
+    postcode:
+      pattern: "ddddd"
+
 
 # Ireland (Éire / Ireland)
 ie:
     partition: 46
     languages: en, ga
+    names: !include country-names/ie.yaml
+    postcode:
+      pattern: "(ldd) ?([0123456789ACDEFHKNPRTVWXY]{4})"
+      output: \1 \2
+
 
 # Israel (ישראל)
 il:
     partition: 65
     languages: he
+    names: !include country-names/il.yaml
+    postcode:
+      pattern: "ddddddd"
+
 
 # Isle of Man (Isle of Man)
 im:
     partition: 190
     languages: en
+    names: !include country-names/im.yaml
+    postcode:
+      pattern: "(IMdd?) ?(dll)"
+      output: \1 \2
+
 
 # India (India)
 in:
     partition: 128
     languages: hi, en
+    names: !include country-names/in.yaml
+    postcode:
+      pattern: "(ddd) ?(ddd)"
+      output: \1\2
+
 
 # British Indian Ocean Territory (British Indian Ocean Territory)
 io:
     partition: 13
     languages: en
+    names: !include country-names/io.yaml
+    postcode:
+      pattern: "(BBND) ?(1ZZ)"
+      output: \1 \2
+
 
 # Iraq (العراق)
 iq:
     partition: 144
     languages: ar, ku
+    names: !include country-names/iq.yaml
+    postcode:
+      pattern: "ddddd"
+
 
 # Iran (ایران)
 ir:
     partition: 80
     languages: fa
+    names: !include country-names/ir.yaml
+    postcode:
+      pattern: "(ddddd)[-_ ]?(ddddd)"
+      output: \1-\2
+
 
 # Iceland (Ísland)
 is:
     partition: 134
     languages: is
+    names: !include country-names/is.yaml
+    postcode:
+      pattern: "ddd"
+
 
 # Italy (Italia)
 it:
     partition: 28
     languages: it, de, fr
+    names: !include country-names/it.yaml
+    postcode:
+      pattern: "ddddd"
+
 
 # Jersey (Jersey)
 je:
     partition: 123
     languages: en
+    names: !include country-names/je.yaml
+    postcode:
+      pattern: "(JEdd?) ?(dll)"
+      output: \1 \2
+
 
 # Jamaica (Jamaica)
 jm:
     partition: 214
     languages: en
+    names: !include country-names/jm.yaml
+    postcode: no
+
 
 # Jordan (الأردن)
 jo:
     partition: 17
     languages: ar
+    names: !include country-names/jo.yaml
+    postcode:
+      pattern: "ddddd"
+
 
 # Japan (日本)
 jp:
     partition: 11
     languages: ja
+    names: !include country-names/jp.yaml
+    postcode:
+      pattern: "(ddd)-?(dddd)"
+      output: \1-\2
+
 
 # Kenya (Kenya)
 ke:
     partition: 126
     languages: sw, en
+    names: !include country-names/ke.yaml
+    postcode:
+      pattern: "ddddd"
+
 
 # Kyrgyzstan (Кыргызстан)
 kg:
     partition: 93
     languages: ky, ru
+    names: !include country-names/kg.yaml
+    postcode:
+      pattern: "dddddd"
+
 
 # Cambodia (ព្រះរាជាណាចក្រ​កម្ពុជា)
 kh:
     partition: 159
     languages: km
+    names: !include country-names/kh.yaml
+    postcode:
+      pattern: "dddddd"
+
 
 # Kiribati (Kiribati)
 ki:
     partition: 215
     languages: en
+    names: !include country-names/ki.yaml
+    postcode: no
+
 
 # Comoros (Comores Komori جزر القمر)
 km:
     partition: 47
     languages: ar, fr, sw
+    names: !include country-names/km.yaml
+    postcode: no
+
 
 # Saint Kitts and Nevis (Saint Kitts and Nevis)
 kn:
     partition: 84
     languages: en
+    names: !include country-names/kn.yaml
+    postcode:
+      pattern: "dddd"
+
 
 # North Korea (조선민주주의인민공화국)
 kp:
     partition: 48
     languages: ko
+    names: !include country-names/kp.yaml
+    postcode: no
+
 
 # South Korea (대한민국)
 kr:
     partition: 49
     languages: ko, en
+    names: !include country-names/kr.yaml
+    postcode:
+      pattern: "ddddd"
+
 
 # Kuwait (الكويت)
 kw:
     partition: 127
     languages: ar
+    names: !include country-names/kw.yaml
+    postcode:
+      pattern: "ddddd"
+
 
 # Cayman Islands (Cayman Islands)
 ky:
     partition: 38
     languages: en
+    names: !include country-names/ky.yaml
+    postcode:
+      pattern: "(d)-(dddd)"
+      output: KY\1-\2
+
 
 # Kazakhstan (Қазақстан)
 kz:
     partition: 94
     languages: kk, ru
+    names: !include country-names/kz.yaml
+    postcode:
+      pattern: "(?:lddldld|dddddd)"
+
 
 # Laos (ປະເທດລາວ)
 la:
     partition: 145
     languages: lo
+    names: !include country-names/la.yaml
+    postcode:
+      pattern: "ddddd"
+
 
 # Lebanon (لبنان)
 lb:
     partition: 66
     languages: ar, fr
+    names: !include country-names/lb.yaml
+    postcode:
+      pattern: "(dddd)(?: ?dddd)?"
+
 
 # Saint Lucia (Saint Lucia)
 lc:
     partition: 146
     languages: en
+    names: !include country-names/lc.yaml
+    postcode:
+      pattern: "(dd) ?(ddd)"
+      output: LC\1 \2
+
 
 # Liechtenstein (Liechtenstein)
 li:
     partition: 246
     languages: de
+    names: !include country-names/li.yaml
+    postcode:
+      pattern: "dddd"
+
 
 # Sri Lanka (ශ්‍රී ලංකාව இலங்கை)
 lk:
     partition: 95
     languages: si, ta
+    names: !include country-names/lk.yaml
+    postcode:
+      pattern: "ddddd"
+
 
 # Liberia (Liberia)
 lr:
     partition: 216
     languages: en
+    names: !include country-names/lr.yaml
+    postcode:
+      pattern: "dddd"
+
 
 # Lesotho (Lesotho)
 ls:
     partition: 136
     languages: en, st
+    names: !include country-names/ls.yaml
+    postcode:
+      pattern: "ddd"
+
 
 # Lithuania (Lietuva)
 lt:
     partition: 67
     languages: lt
+    names: !include country-names/lt.yaml
+    postcode:
+      pattern: "ddddd"
+
 
 # Luxembourg (Lëtzebuerg)
 lu:
     partition: 74
     languages: lb, fr, de
+    names: !include country-names/lu.yaml
+    postcode:
+      pattern: "dddd"
+
 
 # Latvia (Latvija)
 lv:
     partition: 162
     languages: lv
+    names: !include country-names/lv.yaml
+    postcode:
+      pattern: "(dddd)"
+      output: LV-\1
+
 
 # Libya (ليبيا)
 ly:
     partition: 163
     languages: ar
+    names: !include country-names/ly.yaml
+    postcode: no
+
 
 # Morocco (Maroc ⵍⵎⵖⵔⵉⴱ المغرب)
 ma:
     partition: 23
     languages: fr, zgh, ar
+    names: !include country-names/ma.yaml
+    postcode:
+      pattern: "ddddd"
+
 
 # Monaco (Monaco)
 mc:
     partition: 242
     languages: fr
+    names: !include country-names/mc.yaml
+    postcode:
+      pattern: "980dd"
+
 
 # Moldova (Moldova)
 md:
     partition: 147
     languages: ro, ru, uk
+    names: !include country-names/md.yaml
+    postcode:
+      pattern: "(dddd)"
+      output: MD-\1
+
 
 # Montenegro (Crna Gora / Црна Гора)
 me:
     partition: 180
     languages: srp, sr, hr, bs, sq
+    names: !include country-names/me.yaml
+    postcode:
+      pattern: "ddddd"
+
 
 # Saint Martin (Saint Martin)
 mf:
     partition: 203
     languages: fr
+    names: !include country-names/mf.yaml
+
 
 # Madagascar (Madagasikara)
 mg:
     partition: 164
     languages: mg, fr
+    names: !include country-names/mg.yaml
+    postcode:
+      pattern: "ddd"
+
 
 # Marshall Islands (Ṃajeḷ)
 mh:
     partition: 105
     languages: en, mh
+    names: !include country-names/mh.yaml
+    postcode:
+      pattern: "ddddd"
+
 
 # North Macedonia (Северна Македонија)
 mk:
     partition: 69
     languages: mk
+    names: !include country-names/mk.yaml
+    postcode:
+      pattern: "dddd"
+
 
 # Mali (Mali)
 ml:
     partition: 241
     languages: fr
+    names: !include country-names/ml.yaml
+    postcode: no
+
 
 # Myanmar (မြန်မာ)
 mm:
     partition: 148
     languages: my
+    names: !include country-names/mm.yaml
+    postcode:
+      pattern: "ddddd"
+
 
 # Mongolia (Монгол улс ᠮᠤᠩᠭᠤᠯ ᠤᠯᠤᠰ)
 mn:
     partition: 167
     languages: mn
+    names: !include country-names/mn.yaml
+    postcode:
+      pattern: "ddddd"
+
 
 # Macao (Macao)
 mo:
     partition: 191
     languages: zh-hant, pt
+    names: !include country-names/mo.yaml
+    postcode: no
+
 
 # Northern Mariana Islands (Northern Mariana Islands)
 mp:
     partition: 192
     languages: ch, en
+    names: !include country-names/mp.yaml
+
 
 # Martinique (Martinique)
 mq:
     partition: 233
     languages: fr
+    names: !include country-names/mq.yaml
+
 
 # Mauritania (موريتانيا)
 mr:
     partition: 149
     languages: ar, fr
+    names: !include country-names/mr.yaml
+    postcode: no
+
 
 # Montserrat (Montserrat)
 ms:
     partition: 73
     languages: en
+    names: !include country-names/ms.yaml
+
 
 # Malta (Malta)
 mt:
     partition: 165
     languages: mt, en
+    names: !include country-names/mt.yaml
+    postcode:
+      pattern: "(lll) ?(dddd)"
+      output: \1 \2
+
 
 # Mauritius (Mauritius)
 mu:
     partition: 150
     languages: mfe, fr, en
+    names: !include country-names/mu.yaml
+    postcode:
+      pattern: "ddddd"
+
 
 # Maldives (ދިވެހިރާއްޖެ)
 mv:
     partition: 96
     languages: dv
+    names: !include country-names/mv.yaml
+    postcode:
+      pattern: "ddddd"
+
 
 # Malawi (Malawi)
 mw:
     partition: 97
     languages: en, ny
+    names: !include country-names/mw.yaml
+    postcode: no
+
 
 # Mexico (México)
 mx:
     partition: 166
     languages: es
+    names: !include country-names/mx.yaml
+    postcode:
+      pattern: "ddddd"
+
 
 # Malaysia (Malaysia)
 my:
     partition: 7
     languages: ms
+    names: !include country-names/my.yaml
+    postcode:
+      pattern: "ddddd"
+
 
 # Mozambique (Moçambique)
 mz:
     partition: 98
     languages: pt
+    names: !include country-names/mz.yaml
+    postcode:
+      pattern: "(dddd)(?:-dd)?"
+
 
 # Namibia (Namibia)
 na:
     partition: 99
     languages: en, sf, de
+    names: !include country-names/na.yaml
+    postcode:
+      pattern: "ddddd"
+
 
 # New Caledonia (Nouvelle-Calédonie)
 nc:
     partition: 234
     languages: fr
+    names: !include country-names/nc.yaml
+
 
 # Niger (Niger)
 ne:
     partition: 226
     languages: fr
+    names: !include country-names/ne.yaml
+    postcode:
+      pattern: "dddd"
+
 
 # Norfolk Island (Norfolk Island)
 nf:
     partition: 100
     languages: en, pih
+    names: !include country-names/nf.yaml
+
 
 # Nigeria (Nigeria)
 ng:
     partition: 218
     languages: en
+    names: !include country-names/ng.yaml
+    postcode:
+      pattern: "dddddd"
+
 
 # Nicaragua (Nicaragua)
 ni:
     partition: 151
     languages: es
+    names: !include country-names/ni.yaml
+    postcode:
+      pattern: "ddddd"
+
 
 # Netherlands (Nederland)
 nl:
     partition: 63
     languages: nl
+    names: !include country-names/nl.yaml
+    postcode:
+      pattern: "(dddd) ?(ll)"
+      output: \1 \2
+
 
 # Norway (Norge)
 "no":
     partition: 60
     languages: nb, nn, no, se
+    names: !include country-names/no.yaml
+    postcode:
+      pattern: "dddd"
+
 
 # Nepal (Nepal)
 np:
     partition: 50
     languages: ne
+    names: !include country-names/np.yaml
+    postcode:
+      pattern: "ddddd"
+
 
 # Nauru (Naoero)
 nr:
     partition: 70
     languages: na, en
+    names: !include country-names/nr.yaml
+    postcode: no
+
 
 # Niue (Niuē)
 nu:
     partition: 178
     languages: niu, en
+    names: !include country-names/nu.yaml
+    postcode: no
+
 
 # New Zealand (New Zealand / Aotearoa)
 nz:
     partition: 27
     languages: mi, en
+    names: !include country-names/nz.yaml
+    postcode:
+      pattern: "dddd"
+
 
 # Oman (عمان)
 om:
     partition: 137
     languages: ar
+    names: !include country-names/om.yaml
+    postcode:
+      pattern: "ddd"
+
 
 # Panama (Panamá)
 pa:
     partition: 152
     languages: es
+    names: !include country-names/pa.yaml
+    postcode:
+      pattern: "dddd"
+
 
 # Peru (Perú)
 pe:
     partition: 51
     languages: es
+    names: !include country-names/pe.yaml
+    postcode:
+      pattern: "ddddd"
+
 
 # French Polynesia (Polynésie française)
 pf:
     partition: 202
     languages: fr
+    names: !include country-names/pf.yaml
+
 
 # Papua New Guinea (Papua Niugini)
 pg:
     partition: 71
     languages: en, tpi, ho
+    names: !include country-names/pg.yaml
+    postcode:
+      pattern: "ddd"
+
 
 # Philippines (Philippines)
 ph:
     partition: 26
     languages: en, tl
+    names: !include country-names/ph.yaml
+    postcode:
+      pattern: "dddd"
+
 
 # Pakistan (پاکستان)
 pk:
     partition: 14
-    languages: en, ur
+    languages: en, ur, pnb, sd, ps, bal
+    names: !include country-names/pk.yaml
+    postcode:
+      pattern: "ddddd"
+
 
 # Poland (Polska)
 pl:
     partition: 168
     languages: pl
+    names: !include country-names/pl.yaml
+    postcode:
+      pattern: "(dd)[ -]?(ddd)"
+      output: \1-\2
+
 
 # Saint Pierre and Miquelon (Saint-Pierre-et-Miquelon)
 pm:
     partition: 236
     languages: fr
+    names: !include country-names/pm.yaml
+
 
 # Pitcairn Islands (Pitcairn Islands)
 pn:
     partition: 113
     languages: en, pih
+    names: !include country-names/pn.yaml
+    postcode:
+      pattern: "(PCRN) ?(1ZZ)"
+      output: \1 \2
+
 
 # Puerto Rico (Puerto Rico)
 pr:
     partition: 193
     languages: es, en
+    names: !include country-names/pr.yaml
+
 
 # Palestinian Territory (Palestinian Territory)
 ps:
     partition: 194
     languages: ar, he
+    names: !include country-names/ps.yaml
+    postcode:
+      pattern: "ddd"
+
 
 # Portugal (Portugal)
 pt:
     partition: 34
     languages: pt
+    names: !include country-names/pt.yaml
+    postcode:
+      pattern: "dddd(?:-ddd)?"
+
 
 # Palau (Belau)
 pw:
     partition: 195
     languages: en, pau, ja, sov, tox
+    names: !include country-names/pw.yaml
+    postcode:
+      pattern: "969(39|40)"
+
 
 # Paraguay (Paraguay)
 py:
     partition: 101
     languages: es, gn
+    names: !include country-names/py.yaml
+    postcode:
+      pattern: "dddddd"
+
 
 # Qatar (قطر)
 qa:
     partition: 169
     languages: ar
+    names: !include country-names/qa.yaml
+    postcode: no
+
 
 #  (Réunion)
 re:
     partition: 235
     languages: fr
+    names: !include country-names/re.yaml
+
 
 # Romania (România)
 ro:
     partition: 170
     languages: ro
+    names: !include country-names/ro.yaml
+    postcode:
+      pattern: "dddddd"
+
 
 # Serbia (Србија)
 rs:
     partition: 59
     languages: sr
+    names: !include country-names/rs.yaml
+    postcode:
+      pattern: "ddddd"
+
 
 # Russia (Россия)
 ru:
     partition: 135
     languages: ru
+    names: !include country-names/ru.yaml
+    postcode:
+      pattern: "dddddd"
+
 
 # Rwanda (Rwanda)
 rw:
     partition: 102
     languages: rw, fr, en
+    names: !include country-names/rw.yaml
+    postcode: no
+
 
 # Saudi Arabia (السعودية)
 sa:
     partition: 52
     languages: ar
+    names: !include country-names/sa.yaml
+    postcode:
+      pattern: "ddddd(?:-dddd)?"
+
 
 # Solomon Islands (Solomon Islands)
 sb:
     partition: 201
     languages: en
+    names: !include country-names/sb.yaml
+    postcode: no
+
 
 # Seychelles (Sesel)
 sc:
     partition: 79
     languages: fr, en, crs
+    names: !include country-names/sc.yaml
+    postcode: no
+
 
 # Sudan (السودان)
 sd:
     partition: 72
     languages: ar, en
+    names: !include country-names/sd.yaml
+    postcode:
+      pattern: "ddddd"
+
 
 # Sweden (Sverige)
 se:
     partition: 112
     languages: sv
+    names: !include country-names/se.yaml
+    postcode:
+      pattern: "(ddd) ?(dd)"
+      output: \1 \2
+
 
 # Singapore (Singapore)
 sg:
     partition: 115
     languages: zh-hans, en, ms, ta
+    names: !include country-names/sg.yaml
+    postcode:
+      pattern: "dddddd"
+
 
 # Saint Helena, Ascension and Tristan da Cunha (Saint Helena, Ascension and Tristan da Cunha)
 sh:
     partition: 196
     languages: en
+    names: !include country-names/sh.yaml
+    postcode:
+      pattern: "(ASCN|STHL|TDCU) ?(1ZZ)"
+      output: \1 \2
+
 
 # Slovenia (Slovenija)
 si:
     partition: 36
     languages: sl
+    names: !include country-names/si.yaml
+    postcode:
+      pattern: "dddd"
+
 
 #  (Svalbard and Jan Mayen)
 sj:
     partition: 197
     languages: "no"
+    names: !include country-names/sj.yaml
+
 
 # Slovakia (Slovensko)
 sk:
     partition: 172
     languages: sk
+    names: !include country-names/sk.yaml
+    postcode:
+      pattern: "(ddd) ?(dd)"
+      output: \1 \2
+
 
 # Sierra Leone (Sierra Leone)
 sl:
     partition: 219
     languages: en
+    names: !include country-names/sl.yaml
+    postcode: no
+
 
 # San Marino (San Marino)
 sm:
     partition: 153
     languages: it
+    names: !include country-names/sm.yaml
+    postcode:
+      pattern: "4789d"
+
 
 # Senegal (Sénégal)
 sn:
     partition: 237
     languages: fr
+    names: !include country-names/sn.yaml
+    postcode:
+      pattern: "ddddd"
+
 
 # Somalia (Soomaaliya الصومال)
 so:
     partition: 154
     languages: so, ar
+    names: !include country-names/so.yaml
+    postcode:
+      pattern: "(ll) ?(ddddd)"
+      output: \1 \2
+
 
 # Suriname (Suriname)
 sr:
     partition: 24
     languages: nl
+    names: !include country-names/sr.yaml
+    postcode: no
+
 
 # South Sudan (South Sudan)
 ss:
     partition: 247
     languages: en
+    names: !include country-names/ss.yaml
+    postcode: no
+
 
 # São Tomé and Príncipe (São Tomé e Príncipe)
 st:
     partition: 53
     languages: pt
+    names: !include country-names/st.yaml
+    postcode: no
+
 
 # El Salvador (El Salvador)
 sv:
     partition: 103
     languages: es
+    names: !include country-names/sv.yaml
+    postcode:
+      pattern: "dddd"
+
 
 #  (Sint Maarten)
 sx:
     partition: 249
     languages: nl, en
+    names: !include country-names/sx.yaml
+
 
 # Syria (سوريا)
 sy:
     partition: 104
     languages: ar
+    names: !include country-names/sy.yaml
+    postcode: no
+
 
 # Eswatini (eSwatini)
 sz:
     partition: 82
     languages: en, ss
+    names: !include country-names/sz.yaml
+    postcode:
+      pattern: "lddd"
+
 
 # Turks and Caicos Islands (Turks and Caicos Islands)
 tc:
     partition: 106
     languages: en
+    names: !include country-names/tc.yaml
+    postcode:
+      pattern: "(TKCA) ?(1ZZ)"
+      output: \1 \2
+
 
 # Chad (Tchad تشاد)
 td:
     partition: 68
     languages: fr, ar
+    names: !include country-names/td.yaml
+    postcode: no
+
 
 # French Southern Lands (Terres australes et antarctiques françaises)
 tf:
     partition: 132
     languages: fr
+    names: !include country-names/tf.yaml
+
 
 # Togo (Togo)
 tg:
     partition: 243
     languages: fr
+    names: !include country-names/tg.yaml
+    postcode: no
+
 
 # Thailand (ประเทศไทย)
 th:
     partition: 32
     languages: th
+    names: !include country-names/th.yaml
+    postcode:
+      pattern: "ddddd"
+
 
 # Tajikistan (Тоҷикистон)
 tj:
     partition: 129
     languages: tg, ru
+    names: !include country-names/tj.yaml
+    postcode:
+      pattern: "dddddd"
+
 
 # Tokelau (Tokelau)
 tk:
     partition: 179
     languages: tkl, en, sm
+    names: !include country-names/tk.yaml
+    postcode: no
+
 
 # East Timor (Timór Lorosa'e)
 tl:
     partition: 161
     languages: pt, tet
+    names: !include country-names/tl.yaml
+    postcode: no
+
 
 # Turkmenistan (Türkmenistan)
 tm:
     partition: 54
     languages: tk
+    names: !include country-names/tm.yaml
+    postcode:
+      pattern: "dddddd"
+
 
 # Tunisia (تونس)
 tn:
     partition: 18
     languages: ar, fr
+    names: !include country-names/tn.yaml
+    postcode:
+      pattern: "dddd"
+
 
 # Tonga (Tonga)
 to:
     partition: 220
     languages: en
+    names: !include country-names/to.yaml
+    postcode: no
+
 
 # Turkey (Türkiye)
 tr:
     partition: 81
     languages: tr
+    names: !include country-names/tr.yaml
+    postcode:
+      pattern: "ddddd"
+
 
 # Trinidad and Tobago (Trinidad and Tobago)
 tt:
     partition: 221
     languages: en
+    names: !include country-names/tt.yaml
+    postcode:
+      pattern: "dddddd"
+
 
 # Tuvalu (Tuvalu)
 tv:
     partition: 156
     languages: en
+    names: !include country-names/tv.yaml
+    postcode: no
+
 
 # Taiwan (臺灣)
 tw:
     partition: 25
     languages: zh-hant
+    names: !include country-names/tw.yaml
+    postcode:
+      pattern: "ddd(?:ddd?)?"
+
 
 # Tanzania (Tanzania)
 tz:
     partition: 130
     languages: sw, en
+    names: !include country-names/tz.yaml
+    postcode:
+      pattern: "ddddd"
+
 
 # Ukraine (Україна)
 ua:
     partition: 173
     languages: uk
+    names: !include country-names/ua.yaml
+    postcode:
+      pattern: "d?ddddd"
+
 
 # Uganda (Uganda)
 ug:
     partition: 155
     languages: en, sw
+    names: !include country-names/ug.yaml
+    postcode: no
+
 
 #  (United States Minor Outlying Islands)
 um:
     partition: 198
     languages: en
+    names: !include country-names/um.yaml
+    postcode:
+      pattern: "96898"
+
 
 # United States (United States)
 us:
     partition: 2
     languages: en
+    names: !include country-names/us.yaml
+    postcode:
+      pattern: "ddddd"
+
 
 # Uruguay (Uruguay)
 uy:
     partition: 174
     languages: es
+    names: !include country-names/uy.yaml
+    postcode:
+      pattern: "ddddd"
+
 
 # Uzbekistan (Oʻzbekiston)
 uz:
     partition: 157
     languages: uz, kaa
+    names: !include country-names/uz.yaml
+    postcode:
+      pattern: "dddddd"
+
 
 # Vatican City (Civitas Vaticana)
 va:
     partition: 107
     languages: it
+    names: !include country-names/va.yaml
+    postcode:
+      pattern: "00120"
+
 
 # Saint Vincent and the Grenadines (Saint Vincent and the Grenadines)
 vc:
     partition: 171
     languages: en
+    names: !include country-names/vc.yaml
+    postcode:
+      pattern: "(dddd)"
+      output: VC\1
+
 
 # Venezuela (Venezuela)
 ve:
     partition: 108
     languages: es
+    names: !include country-names/ve.yaml
+    postcode:
+      pattern: "dddd"
+
 
 # British Virgin Islands (British Virgin Islands)
 vg:
     partition: 109
     languages: en
+    names: !include country-names/vg.yaml
+    postcode:
+      pattern: "(dddd)"
+      output: VG\1
+
 
 #  (United States Virgin Islands)
 vi:
     partition: 199
     languages: en
+    names: !include country-names/vi.yaml
+
 
 # Vietnam (Việt Nam)
 vn:
     partition: 75
     languages: vi
+    names: !include country-names/vn.yaml
+    postcode:
+      pattern: "ddddd"
+
 
 # Vanuatu (Vanuatu)
 vu:
     partition: 116
     languages: bi, en, fr
+    names: !include country-names/vu.yaml
+    postcode: no
+
 
 # Wallis and Futuna Islands (Wallis-et-Futuna)
 wf:
     partition: 238
     languages: fr
+    names: !include country-names/wf.yaml
+
 
 # Samoa (Sāmoa)
 ws:
     partition: 131
     languages: sm, en
+    names: !include country-names/ws.yaml
+
 
 # Kosovo (Kosova / Kosovo)
 xk:
     partition: 59
     languages: sq, sr
+    names: !include country-names/xk.yaml
+    postcode:
+      pattern: "ddddd"
+
 
 # Yemen (اليمن)
 ye:
     partition: 55
     languages: ar
+    names: !include country-names/ye.yaml
+    postcode: no
+
 
 # Mayotte (Mayotte)
 yt:
     partition: 200
     languages: fr
+    names: !include country-names/yt.yaml
+
 
 # South Africa (South Africa)
 za:
     partition: 76
     languages: en, af, st, tn, xh, zu
+    names: !include country-names/za.yaml
+    postcode:
+      pattern: "dddd"
+
 
 # Zambia (Zambia)
 zm:
     partition: 222
     languages: en
+    names: !include country-names/zm.yaml
+    postcode:
+      pattern: "dddd"
+
 
 # Zimbabwe (Zimbabwe)
 zw:
     partition: 223
     languages: en, sn, nd
-
+    names: !include country-names/zw.yaml
+    postcode: no
index 00f5569ae0894db7aa1179cd39bb635ad98042eb..3115f4382aacf582c5a1054e78c03130bde9f00f 100644 (file)
@@ -21,8 +21,8 @@ NOMINATIM_DATABASE_MODULE_PATH=
 # Tokenizer used for normalizing and parsing queries and names.
 # The tokenizer is set up during import and cannot be changed afterwards
 # without a reimport.
-# Currently available tokenizers: legacy
-NOMINATIM_TOKENIZER="legacy"
+# Currently available tokenizers: icu, legacy
+NOMINATIM_TOKENIZER="icu"
 
 # Number of occurrences of a word before it is considered frequent.
 # Similar to the concept of stop words. Frequent partial words get ignored
@@ -74,8 +74,6 @@ NOMINATIM_HTTP_PROXY_PASSWORD=
 # HTTPS_PROXY="http://user:pass@10.10.1.10:1080"
 
 # Location of the osm2pgsql binary.
-# When empty, osm2pgsql is expected to reside in the osm2pgsql directory in
-# the project directory.
 # EXPERT ONLY. You should usually use the supplied osm2pgsql.
 NOMINATIM_OSM2PGSQL_BINARY=
 
index e5cbeb6f54ffcef3c3c0340e078c76f6084123e0..212fdcb9e2f7d29cac379c0a58e9041e2819912d 100644 (file)
@@ -7,9 +7,9 @@ normalization:
     - "'nº' > 'no'"
     - "ª > a"
     - "º > o"
-    - "[[:Punctuation:][:Symbol:]]  > ' '"
-    - "ß > 'ss'" # German szet is unimbigiously equal to double ss
-    - "[^[:Letter:] [:Number:] [:Space:]] >"
+    - "[[:Punctuation:][:Symbol:]\u02bc]  > ' '"
+    - "ß > 'ss'" # German szet is unambiguously equal to double ss
+    - "[^[:alnum:] [:Canonical_Combining_Class=Virama:] [:Space:]] >"
     - "[:Lm:] >"
     - ":: [[:Number:]] Latin ()"
     - ":: [[:Number:]] Ascii ();"
@@ -25,6 +25,16 @@ transliteration:
     - "[^a-z0-9[:Space:]] >"
     - ":: NFC ()"
 sanitizers:
+    - step: clean-housenumbers
+      filter-kind:
+        - housenumber
+        - conscriptionnumber
+        - streetnumber
+      convert-to-name:
+        - (\A|.*,)[^\d,]{3,}(,.*|\Z)
+    - step: clean-postcodes
+      convert-to-address: yes
+      default-pattern: "[A-Z0-9- ]{3,12}"
     - step: split-name-list
     - step: strip-brace-terms
     - step: tag-analyzer-by-language
@@ -34,6 +44,10 @@ sanitizers:
       mode: append
 token-analysis:
     - analyzer: generic
+    - id: "@housenumber"
+      analyzer: housenumbers
+    - id: "@postcode"
+      analyzer: postcodes
     - id: bg
       analyzer: generic
       mode: variant-only
@@ -59,6 +73,13 @@ token-analysis:
       mode: variant-only
       variants:
           - !include icu-rules/variants-de.yaml
+      mutations:
+          - pattern: ä
+            replacements: ["ä", "ae"]
+          - pattern: ö
+            replacements: ["ö", "oe"]
+          - pattern: ü
+            replacements: ["ü", "ue"]
     - id: el
       analyzer: generic
       mode: variant-only
index d872e2890c68a0e4abd61f507b7d57107cd04a33..b4457fa584f3686055a57fdbcd1ed8ca0d298e04 100644 (file)
     }
 },
 {
-    "keys" : ["name:prefix", "name:suffix", "name:prefix:*", "name:suffix:*",
-              "name:etymology", "name:signed", "name:botanical", "*wikidata"],
+    "keys" : ["*:prefix", "*:suffix", "name:prefix:*", "name:suffix:*",
+              "name:etymology", "name:signed", "name:botanical", "*:wikidata",
+              "addr:street:name", "addr:street:type"],
     "values" : {
         "" : "skip"
     }
 },
 {
     "keys" : ["ref", "int_ref", "nat_ref", "reg_ref", "loc_ref", "old_ref",
-              "iata", "icao", "pcode"],
+              "iata", "icao", "pcode", "ISO3166-2"],
     "values" : {
         "" : "ref"
     }
index 4e41763f276554c3e11f6b96060f12b09b20a61c..37d03a83d8cc8795be2ef20174df89a35d073efc 100644 (file)
@@ -5,15 +5,16 @@
     }
 },
 {
-    "keys" : ["name:prefix", "name:suffix", "name:prefix:*", "name:suffix:*",
-              "name:etymology", "name:signed", "name:botanical", "*wikidata"],
+    "keys" : ["*:prefix", "*:suffix", "name:prefix:*", "name:suffix:*",
+              "name:etymology", "name:signed", "name:botanical", "*:wikidata",
+              "addr:street:name", "addr:street:type"],
     "values" : {
         "" : "skip"
     }
 },
 {
     "keys" : ["ref", "int_ref", "nat_ref", "reg_ref", "loc_ref", "old_ref",
-              "iata", "icao", "pcode"],
+              "iata", "icao", "pcode", "ISO3166-2"],
     "values" : {
         "" : "ref"
     }
index ce32ae1e670d936260833fdbabcb0d082c6adede..76146de2629f5adaaf153ec062ab01f3dcb41983 100644 (file)
@@ -6,15 +6,16 @@
     }
 },
 {
-    "keys" : ["name:prefix", "name:suffix", "name:prefix:*", "name:suffix:*",
-              "name:etymology", "name:signed", "name:botanical", "wikidata", "*:wikidata"],
+    "keys" : ["*:prefix", "*:suffix", "name:prefix:*", "name:suffix:*",
+              "name:etymology", "name:signed", "name:botanical", "wikidata", "*:wikidata",
+              "addr:street:name", "addr:street:type"],
     "values" : {
         "" : "extra"
     }
 },
 {
     "keys" : ["ref", "int_ref", "nat_ref", "reg_ref", "loc_ref", "old_ref",
-              "iata", "icao", "pcode", "pcode:*"],
+              "iata", "icao", "pcode", "pcode:*", "ISO3166-2"],
     "values" : {
         "" : "ref"
     }
         "" : "main,with_name"
     }
 },
-{
-    "keys" : ["amenity"],
-    "values" : {
-        "restaurant" : "main,operator",
-        "fuel" : "main,operator"
-    }
-},
 {
     "keys" : ["aeroway", "amenity", "club", "craft", "leisure",
               "office", "mountain_pass"],
     "keys" : ["shop"],
     "values" : {
         "no" : "skip",
-        "" : "main,operator"
+        "" : "main"
     }
 },
 {
     "values" : {
         "yes" : "skip",
         "no" : "skip",
-        "" : "main,operator"
+        "" : "main"
     }
 },
 {
     }
 },
 {
-    "keys" : ["junction"],
+    "keys" : ["junction", "healthcare"],
     "values" : {
         "" : "main,fallback,with_name"
     }
index 2e2f25f0e938f8f30742e2e727b4174fe2f80cee..ed874a177ae3f5f4aaf59d572555bb190dead2a1 100644 (file)
@@ -6,15 +6,16 @@
     }
 },
 {
-    "keys" : ["name:prefix", "name:suffix", "name:prefix:*", "name:suffix:*",
-              "name:etymology", "name:signed", "name:botanical", "wikidata", "*:wikidata"],
+    "keys" : ["*:prefix", "*:suffix", "name:prefix:*", "name:suffix:*",
+              "name:etymology", "name:signed", "name:botanical", "wikidata", "*:wikidata",
+              "addr:street:name", "addr:street:type"],
     "values" : {
         "" : "extra"
     }
 },
 {
     "keys" : ["ref", "int_ref", "nat_ref", "reg_ref", "loc_ref", "old_ref",
-              "iata", "icao", "pcode", "pcode:*"],
+              "iata", "icao", "pcode", "pcode:*", "ISO3166-2"],
     "values" : {
         "" : "ref"
     }
         "" : "main,with_name"
     }
 },
-{
-    "keys" : ["amenity"],
-    "values" : {
-        "restaurant" : "main,operator",
-        "fuel" : "main,operator"
-    }
-},
 {
     "keys" : ["aeroway", "amenity", "club", "craft", "leisure",
               "office", "mountain_pass"],
     "keys" : ["shop"],
     "values" : {
         "no" : "skip",
-        "" : "main,operator"
+        "" : "main"
     }
 },
 {
     "values" : {
         "yes" : "skip",
         "no" : "skip",
-        "" : "main,operator"
+        "" : "main"
     }
 },
 {
     }
 },
 {
-    "keys" : ["junction"],
+    "keys" : ["junction", "healthcare"],
     "values" : {
         "" : "main,fallback,with_name"
     }
index 77cf4790f3db436642ada5ef5c4cf8e59511abc0..a1b0e8d611dc9d3d32bc22f13d4410a56231e830 100644 (file)
@@ -5,15 +5,16 @@
     }
 },
 {
-    "keys" : ["name:prefix", "name:suffix", "name:prefix:*", "name:suffix:*",
-              "name:etymology", "name:signed", "name:botanical", "*wikidata"],
+    "keys" : ["*:prefix", "*:suffix", "name:prefix:*", "name:suffix:*",
+              "name:etymology", "name:signed", "name:botanical", "*:wikidata",
+              "addr:street:name", "addr:street:type"],
     "values" : {
         "" : "skip"
     }
 },
 {
     "keys" : ["ref", "int_ref", "nat_ref", "reg_ref", "loc_ref", "old_ref",
-              "iata", "icao", "pcode"],
+              "iata", "icao", "pcode", "ISO3166-2"],
     "values" : {
         "" : "ref"
     }
index 32aa6dfa79d1f9010d1dad29b47fbfcd98ca681f..1b426ec9451185bb2a106b95fdcdb7d5be73fe6a 100644 (file)
@@ -1,3 +1,3 @@
 [behave]
 show_skipped=False
-tags=~@Fail
+default_tags=~@Fail
index 303af2c35734120872587911f1d7282a15f24c39..a2b0f033739e7088fd843874ae77a92a87aee206 100644 (file)
@@ -10,7 +10,7 @@ Feature: Reverse geocoding
           | way      | place    | house |
         And result addresses contain
           | house_number | road                | postcode | country_code |
-          | 697          | Upper Kingston Road | 36067    | us |
+          | 707          | Upper Kingston Road | 36067    | us |
 
     @Tiger
     Scenario: No TIGER house number for zoom < 18
index b3df7d1952b1ca4a90d383ce6db5361f695b7363..300948a9a0765f2c40adea52c5d9dbd6a3587e90 100644 (file)
@@ -34,6 +34,7 @@ Feature: Search queries
           | postcode     | 9495 |
           | country      | Liechtenstein |
           | country_code | li |
+          | ISO3166-2-lvl8 | LI-09 |
 
     Examples:
           | format |
@@ -367,3 +368,10 @@ Feature: Search queries
           | Triesenberg |
 
 
+    Scenario: Array parameters are ignored
+        When sending json search query "Vaduz" with address
+          | countrycodes[] | polygon_svg[] | limit[] | polygon_threshold[] |
+          | IT             | 1             | 3       | 3.4                 |
+        Then result addresses contain
+          | ID | country_code |
+          | 0  | li           |
index 8b70dac188ad968e36a9f2d80c3fb21021064b0b..d378d3f8d882af004ebe1e3182565fa927fec615 100644 (file)
@@ -15,6 +15,7 @@ Feature: Search queries
           | postcode     | 9497 |
           | country      | Liechtenstein |
           | country_code | li |
+          | ISO3166-2-lvl8  | LI-10 |
 
     Scenario: House number interpolation
         When sending json search query "Grosssteg 1023, Triesenberg" with address
@@ -41,6 +42,7 @@ Feature: Search queries
           | town          | Triesenberg |
           | country       | Liechtenstein |
           | country_code  | li |
+          | ISO3166-2-lvl8  | LI-10 |
 
     Scenario Outline: Housenumber 0 can be found
         When sending <format> search query "Gnalpstrasse 0" with address
index b2437d71cf60282feeca558c8191ad73179134d5..e72ff448a87893ea1352e661ac7ad1aa26fdb557 100644 (file)
@@ -74,20 +74,22 @@ Feature: Address computation
 
     Scenario: boundary areas are preferred over place nodes in the address
         Given the grid
-            | 1 |   |   |   |   |   | 3 |
-            |   | 5 |   |   |   |   |   |
-            |   | 6 |   |   |   |   |   |
-            | 2 |   |   |   |   |   | 4 |
+            | 1 |   |   |   | 10 |   | 3 |
+            |   | 5 |   |   |    |   |   |
+            |   | 6 |   |   |    |   |   |
+            | 2 |   |   |   | 11 |   | 4 |
         And the named places
-            | osm | class    | type    | admin | geometry |
-            | N1  | place    | square  | 15    | 5 |
-            | N2  | place    | city    | 15    | 6 |
-            | R1  | place    | city    | 8     | (1,2,4,3,1) |
+            | osm | class    | type           | admin | geometry |
+            | N1  | place    | square         | 15    | 5 |
+            | N2  | place    | city           | 15    | 6 |
+            | R1  | place    | city           | 8     | (1,2,4,3,1) |
+            | R2  | boundary | administrative | 9     | (1,10,11,2,1) |
         When importing
         Then place_addressline contains
             | object | address | isaddress | cached_rank_address |
             | N1     | R1      | True      | 16                  |
-            | N1     | N2      | False     | 16                  |
+            | N1     | R2      | True      | 18                  |
+            | N1     | N2      | False     | 18                  |
 
     Scenario: place nodes outside a smaller ranked area are ignored
         Given the grid
@@ -251,38 +253,52 @@ Feature: Address computation
             | W1     | W10     |
 
     Scenario: buildings with only addr:postcodes do not appear in the address of a way
-        Given the scene admin-areas
+        Given the grid with origin DE
+            | 1 |   |   |   |   | 8 |   | 6 |   | 2 |
+            |   |10 |11 |   |   |   |   |   |   |   |
+            |   |13 |12 |   |   |   |   |   |   |   |
+            | 20|   |   | 21|   |   |   |   |   |   |
+            |   |   |   |   |   |   |   |   |   |   |
+            |   |   |   |   |   | 9 |   |   |   |   |
+            | 4 |   |   |   |   |   |   | 7 |   | 3 |
         And the named places
-            | osm | class    | type           | admin | addr+postcode | geometry |
-            | R1  | boundary | administrative | 6     | 112           | :b0      |
-            | R34 | boundary | administrative | 8     | 112 DE        | :b1:E    |
-            | R4  | boundary | administrative | 10    | 112 DE 34     | :b2:N    |
+            | osm | class    | type           | admin | addr+postcode | geometry   |
+            | R1  | boundary | administrative | 6     | 10000         | (1,2,3,4,1)|
+            | R34 | boundary | administrative | 8     | 11200         | (1,6,7,4,1)|
+            | R4  | boundary | administrative | 10    | 11230         | (1,8,9,4,1)|
         And the named places
             | osm | class    | type           | geometry |
-            | W93 | highway  | residential    | :w2N     |
+            | W93 | highway  | residential    | 20,21    |
         And the places
             | osm | class    | type        | addr+postcode | geometry |
-            | W22 | place    | postcode    | 445023        | :building:w2N |
+            | W22 | place    | postcode    | 11234         | (10,11,12,13,10) |
         When importing
         Then place_addressline doesn't contain
             | object | address  |
             | W93    | W22      |
 
     Scenario: postcode boundaries do appear in the address of a way
-        Given the scene admin-areas
+       Given the grid with origin DE
+            | 1 |   |   |   |   | 8 |   | 6 |   | 2 |
+            |   |10 |11 |   |   |   |   |   |   |   |
+            |   |13 |12 |   |   |   |   |   |   |   |
+            | 20|   |   | 21|   |   |   |   |   |   |
+            |   |   |   |   |   |   |   |   |   |   |
+            |   |   |   |   |   | 9 |   |   |   |   |
+            | 4 |   |   |   |   |   |   | 7 |   | 3 |
         And the named places
-            | osm | class    | type           | admin | addr+postcode | geometry |
-            | R1  | boundary | administrative | 6     | 112           | :b0      |
-            | R34 | boundary | administrative | 8     | 112 DE        | :b1:E    |
+            | osm | class    | type           | admin | addr+postcode | geometry    |
+            | R1  | boundary | administrative | 6     | 10000         | (1,2,3,4,1) |
+            | R34 | boundary | administrative | 8     | 11000         | (1,6,7,4,1) |
         And the places
             | osm | class    | type        | addr+postcode | geometry |
-            | R4  | boundary | postal_code | 112 DE 34     | :b2:N    |
+            | R4  | boundary | postal_code | 11200         | (1,8,9,4,1) |
         And the named places
             | osm | class    | type           | geometry |
-            | W93 | highway  | residential    | :w2N     |
+            | W93 | highway  | residential    | 20,21    |
         And the places
             | osm | class    | type        | addr+postcode | geometry |
-            | W22 | place    | postcode    | 445023        | :building:w2N |
+            | W22 | place    | postcode    | 11234         | (10,11,12,13,10) |
         When importing
         Then place_addressline contains
             | object | address |
@@ -506,3 +522,23 @@ Feature: Address computation
         Then results contain
            | osm | display_name               |
            | N2  | Leftside, Wonderway, Left |
+
+
+    Scenario: addr:* tags always match the closer area
+        Given the grid
+            | 1 |   |   |   |  2 |   | 5 |
+            |   |   |   |   |    |   |   |
+            |   | 10| 11|   |    |   |   |
+            | 4 |   |   |   |  3 |   | 6 |
+        And the places
+            | osm | class    | type           | admin | name  | geometry    |
+            | R1  | boundary | administrative | 8     | Left  | (1,2,3,4,1) |
+            | R2  | boundary | administrative | 8     | Left  | (2,3,6,5,2) |
+        And the places
+            | osm | class   | type    | name      | addr+city | geometry |
+            | W1  | highway | primary | Wonderway | Left      | 10,11    |
+        When importing
+        Then place_addressline doesn't contain
+            | object | address |
+            | W1     | R2      |
+
index 354d5c2f7262224aad612346805fb582f612b475..070baeef17fe1f7354bb66563f0242ccfc8c9843 100644 (file)
@@ -21,9 +21,12 @@ Feature: Country handling
             | osm | display_name |
             | N1  | Wenig, Loudou |
     Scenario: OSM country relations outside expected boundaries are ignored
+        Given the grid
+            | 1 |  | 2 |
+            | 4 |  | 3 |
         Given the places
             | osm  | class    | type           | admin | name+name:xy | country | geometry |
-            | R1   | boundary | administrative | 2     | Loudou       | de      | poly-area:0.1 |
+            | R1   | boundary | administrative | 2     | Loudou       | de      | (1,2,3,4,1) |
         Given the places
             | osm  | class    | type          | name  | geometry   |
             | N1   | place    | town          | Wenig | country:de |
@@ -35,9 +38,11 @@ Feature: Country handling
             | osm | display_name |
             | N1  | Wenig, Germany |
     Scenario: Pre-defined country names are used
+        Given the grid with origin CH
+            | 1 |
         Given the places
             | osm  | class    | type          | name  | geometry   |
-            | N1   | place    | town          | Ingb  | country:ch |
+            | N1   | place    | town          | Ingb  | 1          |
         When importing
         And sending search query "Ingb"
             | accept-language |
index 181e87eec56f3b471616cf883964f4e84eb4bd2b..8c136d076ad63b9ed7de92fa44be03f0d7c8bbe4 100644 (file)
@@ -3,230 +3,261 @@ Feature: Import of address interpolations
     Tests that interpolated addresses are added correctly
 
     Scenario: Simple even interpolation line with two points
+        Given the grid with origin 1,1
+          | 1 |  | 9 |  | 2 |
         Given the places
-          | osm | class | type   | housenr | geometry |
-          | N1  | place | house  | 2       | 1 1 |
-          | N2  | place | house  | 6       | 1 1.001 |
+          | osm | class | type   | housenr |
+          | N1  | place | house  | 2       |
+          | N2  | place | house  | 6       |
         And the places
           | osm | class | type   | addr+interpolation | geometry |
-          | W1  | place | houses | even    | 1 1, 1 1.001 |
+          | W1  | place | houses | even               | 1,2      |
         And the ways
           | id | nodes |
           | 1  | 1,2 |
         When importing
         Then W1 expands to interpolation
           | start | end | geometry |
-          | 2     | 6   | 1 1, 1 1.001 |
+          | 4     | 4   | 9 |
 
     Scenario: Backwards even two point interpolation line
+        Given the grid with origin 1,1
+          | 1 | 8 | 9 | 2 |
         Given the places
-          | osm | class | type   | housenr | geometry |
-          | N1  | place | house  | 2       | 1 1 |
-          | N2  | place | house  | 6       | 1 1.001 |
+          | osm | class | type   | housenr |
+          | N1  | place | house  | 2       |
+          | N2  | place | house  | 8       |
         And the places
           | osm | class | type   | addr+interpolation | geometry |
-          | W1  | place | houses | even    | 1 1.001, 1 1 |
+          | W1  | place | houses | even    | 1,2 |
         And the ways
           | id | nodes |
           | 1  | 2,1 |
         When importing
         Then W1 expands to interpolation
           | start | end | geometry |
-          | 2     | 6   | 1 1, 1 1.001 |
+          | 4     | 6   | 8,9 |
 
     Scenario: Simple odd two point interpolation
+        Given the grid with origin 1,1
+          | 1 | 8 |  |  | 9 | 2 |
         Given the places
-          | osm | class | type   | housenr | geometry |
-          | N1  | place | house  | 1       | 1 1 |
-          | N2  | place | house  | 11      | 1 1.001 |
+          | osm | class | type   | housenr |
+          | N1  | place | house  | 1       |
+          | N2  | place | house  | 11      |
         And the places
           | osm | class | type   | addr+interpolation | geometry |
-          | W1  | place | houses | odd     | 1 1, 1 1.001 |
+          | W1  | place | houses | odd                | 1,2      |
         And the ways
           | id | nodes |
           | 1  | 1,2 |
         When importing
         Then W1 expands to interpolation
           | start | end | geometry |
-          | 1     | 11  | 1 1, 1 1.001 |
+          | 3     | 9   | 8,9      |
 
     Scenario: Simple all two point interpolation
+        Given the grid with origin 1,1
+          | 1 | 8 | 9 | 2 |
         Given the places
-          | osm | class | type   | housenr | geometry |
-          | N1  | place | house  | 1       | 1 1 |
-          | N2  | place | house  | 3       | 1 1.001 |
+          | osm | class | type   | housenr |
+          | N1  | place | house  | 1       |
+          | N2  | place | house  | 4       |
         And the places
           | osm | class | type   | addr+interpolation | geometry |
-          | W1  | place | houses | all     | 1 1, 1 1.001 |
+          | W1  | place | houses | all                | 1,2      |
         And the ways
           | id | nodes |
           | 1  | 1,2 |
         When importing
         Then W1 expands to interpolation
           | start | end | geometry |
-          | 1     | 3   | 1 1, 1 1.001 |
+          | 2     | 3   | 8,9 |
 
     Scenario: Even two point interpolation line with intermediate empty node
+        Given the grid
+          | 1 | 8 |  | 3 | 9 | 2 |
         Given the places
-          | osm | class | type   | housenr | geometry |
-          | N1  | place | house  | 2       | 1 1 |
-          | N2  | place | house  | 10      | 1.001 1.001 |
+          | osm | class | type   | housenr |
+          | N1  | place | house  | 2       |
+          | N2  | place | house  | 12      |
         And the places
           | osm | class | type   | addr+interpolation | geometry |
-          | W1  | place | houses | even    | 1 1, 1 1.001, 1.001 1.001 |
+          | W1  | place | houses | even               | 1,3,2    |
         And the ways
           | id | nodes |
           | 1  | 1,3,2 |
         When importing
         Then W1 expands to interpolation
           | start | end | geometry |
-          | 2     | 10  | 1 1, 1 1.001, 1.001 1.001 |
+          | 4     | 10  | 8,3,9 |
 
     Scenario: Even two point interpolation line with intermediate duplicated empty node
+        Given the grid
+          | 1 | 8 | 3 | 9 | 2 |
         Given the places
-          | osm | class | type   | housenr | geometry |
-          | N1  | place | house  | 2       | 1 1 |
-          | N2  | place | house  | 10      | 1.001 1.001 |
+          | osm | class | type   | housenr |
+          | N1  | place | house  | 2       |
+          | N2  | place | house  | 10      |
         And the places
           | osm | class | type   | addr+interpolation | geometry |
-          | W1  | place | houses | even    | 1 1, 1 1.001, 1.001 1.001 |
+          | W1  | place | houses | even               | 1,3,2 |
         And the ways
           | id | nodes |
           | 1  | 1,3,3,2 |
         When importing
         Then W1 expands to interpolation
           | start | end | geometry |
-          | 2     | 10  | 1 1, 1 1.001, 1.001 1.001 |
+          | 4     | 8   | 8,3,9 |
 
     Scenario: Simple even three point interpolation line
+        Given the grid
+          | 1 | 8 |  | 9 | 3 | 7 | 2 |
         Given the places
-          | osm | class | type   | housenr | geometry |
-          | N1  | place | house  | 2       | 1 1 |
-          | N2  | place | house  | 14      | 1.001 1.001 |
-          | N3  | place | house  | 10      | 1 1.001 |
+          | osm | class | type   | housenr |
+          | N1  | place | house  | 2       |
+          | N2  | place | house  | 14      |
+          | N3  | place | house  | 10      |
         And the places
           | osm | class | type   | addr+interpolation | geometry |
-          | W1  | place | houses | even    | 1 1, 1 1.001, 1.001 1.001 |
+          | W1  | place | houses | even               | 1,3,2    |
         And the ways
           | id | nodes |
           | 1  | 1,3,2 |
         When importing
         Then W1 expands to interpolation
           | start | end | geometry |
-          | 2     | 10  | 1 1, 1 1.001 |
-          | 10    | 14  | 1 1.001, 1.001 1.001 |
+          | 4     |  8  | 8,9 |
+          | 12    | 12  | 7 |
 
     Scenario: Simple even four point interpolation line
+        Given the grid
+          | 1 | 10 |   | 11 | 3 |
+          |   |    |   |    | 12|
+          |   |    | 4 | 13 | 2 |
         Given the places
-          | osm | class | type  | housenr | geometry |
-          | N1  | place | house | 2       | 1 1 |
-          | N2  | place | house | 14      | 1.001 1.001 |
-          | N3  | place | house | 10      | 1 1.001 |
-          | N4  | place | house | 18      | 1.001 1.002 |
+          | osm | class | type  | housenr |
+          | N1  | place | house | 2       |
+          | N2  | place | house | 14      |
+          | N3  | place | house | 10      |
+          | N4  | place | house | 18      |
         And the places
           | osm | class | type   | addr+interpolation | geometry |
-          | W1  | place | houses | even    | 1 1, 1 1.001, 1.001 1.001, 1.001 1.002 |
+          | W1  | place | houses | even               | 1,3,2,4  |
         And the ways
           | id | nodes |
           | 1  | 1,3,2,4 |
         When importing
         Then W1 expands to interpolation
           | start | end | geometry |
-          | 2     | 10  | 1 1, 1 1.001 |
-          | 10    | 14  | 1 1.001, 1.001 1.001 |
-          | 14    | 18  | 1.001 1.001, 1.001 1.002 |
+          | 4     | 8   | 10,11    |
+          | 12    | 12  | 12       |
+          | 16    | 16  | 13       |
 
     Scenario: Reverse simple even three point interpolation line
+        Given the grid
+          | 1 | 8  |  | 9 | 3 | 7 | 2 |
         Given the places
-          | osm | class | type  | housenr | geometry |
-          | N1  | place | house | 2       | 1 1 |
-          | N2  | place | house | 14      | 1.001 1.001 |
-          | N3  | place | house | 10      | 1 1.001 |
+          | osm | class | type  | housenr |
+          | N1  | place | house | 2       |
+          | N2  | place | house | 14      |
+          | N3  | place | house | 10      |
         And the places
           | osm | class | type   | addr+interpolation | geometry |
-          | W1  | place | houses | even    | 1.001 1.001, 1 1.001, 1 1 |
+          | W1  | place | houses | even               | 2,3,1    |
         And the ways
           | id | nodes |
           | 1  | 2,3,1 |
         When importing
         Then W1 expands to interpolation
           | start | end | geometry |
-          | 2     | 10  | 1 1, 1 1.001 |
-          | 10    | 14  | 1 1.001, 1.001 1.001 |
+          | 4     |  8  | 8,9      |
+          | 12    | 12  | 7        |
 
     Scenario: Even three point interpolation line with odd center point
+        Given the grid
+          | 1 |  | 10 |  |  | 11 | 3 | 2 |
         Given the places
-          | osm | class | type  | housenr | geometry |
-          | N1  | place | house | 2       | 1 1 |
-          | N2  | place | house | 8       | 1.001 1.001 |
-          | N3  | place | house | 7       | 1 1.001 |
+          | osm | class | type  | housenr |
+          | N1  | place | house | 2       |
+          | N2  | place | house | 8       |
+          | N3  | place | house | 7       |
         And the places
           | osm | class | type   | addr+interpolation | geometry |
-          | W1  | place | houses | even    | 1 1, 1 1.001, 1.001 1.001 |
+          | W1  | place | houses | even               | 1,3,2    |
         And the ways
           | id | nodes |
           | 1  | 1,3,2 |
         When importing
         Then W1 expands to interpolation
           | start | end | geometry |
-          | 2     | 7   | 1 1, 1 1.001 |
-          | 7     | 8   | 1 1.001, 1.001 1.001 |
+          | 4     | 6   | 10,11 |
 
     Scenario: Interpolation line with self-intersecting way
+        Given the grid
+          | 1  | 9 | 2 |
+          |    |   | 8 |
+          |    |   | 3 |
         Given the places
-          | osm | class | type  | housenr | geometry |
-          | N1  | place | house | 2       | 0 0 |
-          | N2  | place | house | 6       | 0 0.001 |
-          | N3  | place | house | 10      | 0 0.002 |
+          | osm | class | type  | housenr |
+          | N1  | place | house | 2       |
+          | N2  | place | house | 6       |
+          | N3  | place | house | 10      |
         And the places
           | osm | class | type   | addr+interpolation | geometry |
-          | W1  | place | houses | even    | 0 0, 0 0.001, 0 0.002, 0 0.001 |
+          | W1  | place | houses | even               | 1,2,3,2  |
         And the ways
           | id | nodes |
           | 1  | 1,2,3,2 |
         When importing
         Then W1 expands to interpolation
           | start | end | geometry |
-          | 2     | 6   | 0 0, 0 0.001 |
-          | 6     | 10  | 0 0.001, 0 0.002 |
-          | 6     | 10  | 0 0.001, 0 0.002 |
+          | 4     | 4   | 9        |
+          | 8     | 8   | 8        |
+          | 8     | 8   | 8        |
 
     Scenario: Interpolation line with self-intersecting way II
+        Given the grid
+          | 1  | 9 | 2 |
+          |    |   | 3 |
         Given the places
-          | osm | class | type  | housenr | geometry |
-          | N1  | place | house | 2       | 0 0 |
-          | N2  | place | house | 6       | 0 0.001 |
+          | osm | class | type  | housenr |
+          | N1  | place | house | 2       |
+          | N2  | place | house | 6       |
         And the places
           | osm | class | type   | addr+interpolation | geometry |
-          | W1  | place | houses | even    | 0 0, 0 0.001, 0 0.002, 0 0.001 |
+          | W1  | place | houses | even               | 1,2,3,2  |
         And the ways
           | id | nodes |
           | 1  | 1,2,3,2 |
         When importing
         Then W1 expands to interpolation
           | start | end | geometry |
-          | 2     | 6   | 0 0, 0 0.001 |
+          | 4     | 4   | 9        |
 
     Scenario: addr:street on interpolation way
-        Given the scene parallel-road
+        Given the grid
+          |    | 1 |  | 2 |    |
+          | 10 |   |  |   | 11 |
+          | 20 |   |  |   | 21 |
         And the places
           | osm | class | type  | housenr | geometry |
-          | N1  | place | house | 2       | :n-middle-w |
-          | N2  | place | house | 6       | :n-middle-e |
-          | N3  | place | house | 12      | :n-middle-w |
-          | N4  | place | house | 16      | :n-middle-e |
+          | N1  | place | house | 2       | 1        |
+          | N2  | place | house | 6       | 2        |
+          | N3  | place | house | 12      | 1        |
+          | N4  | place | house | 16      | 2        |
         And the places
           | osm | class   | type    | addr+interpolation | street       | geometry |
-          | W10 | place   | houses  | even    |              | :w-middle |
-          | W11 | place   | houses  | even    | Cloud Street | :w-middle |
+          | W10 | place   | houses  | even               |              | 1,2      |
+          | W11 | place   | houses  | even               | Cloud Street | 1,2      |
         And the places
           | osm | class   | type     | name         | geometry |
-          | W2  | highway | tertiary | Sun Way      | :w-north |
-          | W3  | highway | tertiary | Cloud Street | :w-south |
+          | W2  | highway | tertiary | Sun Way      | 10,11    |
+          | W3  | highway | tertiary | Cloud Street | 20,21    |
         And the ways
           | id | nodes |
-          | 10  | 1,100,101,102,2 |
-          | 11  | 3,200,201,202,4 |
+          | 10 | 1,2   |
+          | 11 | 3,4   |
         When importing
         Then placex contains
           | object | parent_place_id |
@@ -236,10 +267,10 @@ Feature: Import of address interpolations
           | N4     | W3 |
         Then W10 expands to interpolation
           | parent_place_id | start | end |
-          | W2              | 2     | 6 |
+          | W2              | 4     | 4 |
         Then W11 expands to interpolation
           | parent_place_id | start | end |
-          | W3              | 12    | 16 |
+          | W3              | 14    | 14 |
         When sending search query "16 Cloud Street"
         Then results contain
          | ID | osm_type | osm_id |
@@ -250,25 +281,28 @@ Feature: Import of address interpolations
          | 0  | W        | 11 |
 
     Scenario: addr:street on housenumber way
-        Given the scene parallel-road
+        Given the grid
+          |    | 1 |  | 2 |    |
+          | 10 |   |  |   | 11 |
+          | 20 |   |  |   | 21 |
         And the places
           | osm | class | type  | housenr | street       | geometry |
-          | N1  | place | house | 2       |              | :n-middle-w |
-          | N2  | place | house | 6       |              | :n-middle-e |
-          | N3  | place | house | 12      | Cloud Street | :n-middle-w |
-          | N4  | place | house | 16      | Cloud Street | :n-middle-e |
+          | N1  | place | house | 2       |              | 1        |
+          | N2  | place | house | 6       |              | 2        |
+          | N3  | place | house | 12      | Cloud Street | 1        |
+          | N4  | place | house | 16      | Cloud Street | 2        |
         And the places
           | osm | class   | type    | addr+interpolation | geometry |
-          | W10 | place   | houses  | even               | :w-middle |
-          | W11 | place   | houses  | even               | :w-middle |
+          | W10 | place   | houses  | even               | 1,2      |
+          | W11 | place   | houses  | even               | 1,2      |
         And the places
           | osm | class   | type     | name         | geometry |
-          | W2  | highway | tertiary | Sun Way      | :w-north |
-          | W3  | highway | tertiary | Cloud Street | :w-south |
+          | W2  | highway | tertiary | Sun Way      | 10,11    |
+          | W3  | highway | tertiary | Cloud Street | 20,21    |
         And the ways
           | id  | nodes |
-          | 10  | 1,100,101,102,2 |
-          | 11  | 3,200,201,202,4 |
+          | 10  | 1,2 |
+          | 11  | 3,4 |
         When importing
         Then placex contains
           | object | parent_place_id |
@@ -278,10 +312,10 @@ Feature: Import of address interpolations
           | N4     | W3 |
         Then W10 expands to interpolation
           | parent_place_id | start | end |
-          | W2              | 2     | 6 |
+          | W2              | 4     | 4 |
         Then W11 expands to interpolation
           | parent_place_id | start | end |
-          | W3              | 12    | 16 |
+          | W3              | 14    | 14 |
         When sending search query "16 Cloud Street"
         Then results contain
          | ID | osm_type | osm_id |
@@ -306,8 +340,8 @@ Feature: Import of address interpolations
         When importing
         Then W1 expands to interpolation
           | start | end | geometry |
-          | 2     | 6   | 144.9629794 -37.7630755, 144.9630541 -37.7628174 |
-          | 6     | 10  | 144.9630541 -37.7628174, 144.9632341 -37.76163 |
+          | 4     | 4   | 144.963016 -37.762946 |
+          | 8     | 8   | 144.963144 -37.7622237 |
 
     Scenario: Place with missing address information
         Given the grid
@@ -326,7 +360,7 @@ Feature: Import of address interpolations
         When importing
         Then W1 expands to interpolation
           | start | end | geometry |
-          | 23    | 29  | 1,2,3 |
+          | 25    | 27  | 0.000016 0,0.00002 0,0.000033 0 |
 
     Scenario: Ways without node entries are ignored
         Given the places
@@ -335,32 +369,37 @@ Feature: Import of address interpolations
         When importing
         Then W1 expands to no interpolation
 
-    Scenario: Ways without nodes without housenumbers are ignored
+    Scenario: Ways with nodes without housenumbers are ignored
+        Given the grid
+          | 1  |  |  2 |
+        Given the places
+          | osm | class | type   |
+          | N1  | place | house  |
+          | N2  | place | house  |
         Given the places
           | osm | class | type   | housenr | geometry |
-          | N1  | place | house  |         | 1 1 |
-          | N2  | place | house  |         | 1 1.001 |
-          | W1  | place | houses | even    | 1 1, 1 1.001 |
+          | W1  | place | houses | even    | 1,2 |
         When importing
         Then W1 expands to no interpolation
 
     Scenario: Two point interpolation starting at 0
+        Given the grid with origin 1,1
+          | 1 | 10 |  |  | 11 | 2 |
         Given the places
-          | osm | class | type   | housenr | geometry |
-          | N1  | place | house  | 0       | 1 1 |
-          | N2  | place | house  | 2       | 1 1.001 |
+          | osm | class | type   | housenr |
+          | N1  | place | house  | 0       |
+          | N2  | place | house  | 10      |
         And the places
           | osm | class | type   | addr+interpolation | geometry |
-          | W1  | place | houses | even     | 1 1, 1 1.001 |
+          | W1  | place | houses | even               | 1,2      |
         And the ways
           | id | nodes |
           | 1  | 1,2 |
         When importing
         Then W1 expands to interpolation
           | start | end | geometry |
-          | 0     | 2   | 1 1, 1 1.001 |
+          | 2     | 8   | 10,11 |
         When sending jsonv2 reverse coordinates 1,1
         Then results contain
           | ID | osm_type | osm_id | type  | display_name |
-          | 0  | way      | 1      | house | 0 |
-
+          | 0  | node     | 1      | house | 0 |
index 915c13b3a9e184376a12792ba3d49e38338af9e5..0fb3f76dbb2365d429c2a6ab275d6b22386925b0 100644 (file)
@@ -3,11 +3,14 @@ Feature: Linking of places
     Tests for correctly determining linked places
 
     Scenario: Only address-describing places can be linked
-        Given the scene way-area-with-center
+        Given the grid
+         | 1 |  |   |  | 2 |
+         |   |  | 9 |  |   |
+         | 4 |  |   |  | 3 |
         And the places
          | osm  | class   | type   | name  | geometry |
-         | R13  | landuse | forest | Garbo | :area |
-         | N256 | natural | peak   | Garbo | :inner-C |
+         | R13  | landuse | forest | Garbo | (1,2,3,4,1) |
+         | N256 | natural | peak   | Garbo | 9 |
         When importing
         Then placex contains
          | object  | linked_place_id |
@@ -15,14 +18,14 @@ Feature: Linking of places
          | N256    | - |
 
     Scenario: Postcode areas cannot be linked
-        Given the grid
+        Given the grid with origin US
          | 1 |   | 2 |
          |   | 9 |   |
          | 4 |   | 3 |
         And the named places
          | osm | class    | type        | addr+postcode  | extra+wikidata | geometry    |
-         | R13 | boundary | postal_code | 123            | Q87493         | (1,2,3,4,1) |
-         | N25 | place    | suburb      | 123            | Q87493         | 9 |
+         | R13 | boundary | postal_code | 12345          | Q87493         | (1,2,3,4,1) |
+         | N25 | place    | suburb      | 12345          | Q87493         | 9 |
         When importing
         Then placex contains
          | object | linked_place_id |
@@ -30,13 +33,16 @@ Feature: Linking of places
          | N25    | - |
 
      Scenario: Waterways are linked when in waterway relations
-        Given the scene split-road
+        Given the grid
+         | 1 |  |   |  | 3 | 4  |  |   |  | 6 |
+         |   |  | 2 |  |   | 10 |  | 5 |  |   |
+         |   |  |   |  |   | 11 |  |   |  |   |
         And the places
          | osm | class    | type  | name  | geometry |
-         | W1  | waterway | river | Rhein | :w-2 |
-         | W2  | waterway | river | Rhein | :w-3 |
-         | R13 | waterway | river | Rhein | :w-1 + :w-2 + :w-3 |
-         | R23 | waterway | river | Limmat| :w-4a |
+         | W1  | waterway | river | Rhein | 1,2,3    |
+         | W2  | waterway | river | Rhein | 3,4,5    |
+         | R13 | waterway | river | Rhein | 1,2,3,4,5,6 |
+         | R23 | waterway | river | Limmat| 4,10,11  |
         And the relations
          | id | members                          | tags+type |
          | 13 | R23:tributary,W1,W2:main_stream  | waterway |
@@ -53,13 +59,16 @@ Feature: Linking of places
          | R |
 
     Scenario: Relations are not linked when in waterway relations
-        Given the scene split-road
+        Given the grid
+         | 1 |  |   |  | 3 | 4  |  |   |  | 6 |
+         |   |  | 2 |  |   | 10 |  | 5 |  |   |
+         |   |  |   |  |   | 11 |  |   |  |   |
         And the places
          | osm | class    | type   | name  | geometry |
-         | W1  | waterway | stream | Rhein | :w-2 |
-         | W2  | waterway | river  | Rhein | :w-3 |
-         | R1  | waterway | river  | Rhein | :w-1 + :w-2 + :w-3 |
-         | R2  | waterway | river  | Limmat| :w-4a |
+         | W1  | waterway | stream | Rhein | 1,2,3,4 |
+         | W2  | waterway | river  | Rhein | 4,5,6 |
+         | R1  | waterway | river  | Rhein | 1,2,3,4 |
+         | R2  | waterway | river  | Limmat| 4,10,11 |
         And the relations
          | id | members                          | tags+type |
          | 1  | R2                               | waterway  |
@@ -70,12 +79,19 @@ Feature: Linking of places
          | W2     | - |
          | R1     | - |
          | R2     | - |
+        When sending search query "rhein"
+        Then results contain
+          | ID | osm_type |
+          |  0 | R |
+          |  1 | W |
+
 
     Scenario: Empty waterway relations are handled correctly
-        Given the scene split-road
+        Given the grid
+         | 1 |  |   |  | 3 |
         And the places
          | osm | class    | type  | name  | geometry |
-         | R1  | waterway | river | Rhein | :w-1 + :w-2 + :w-3 |
+         | R1  | waterway | river | Rhein | 1,3 |
         And the relations
          | id | members  | tags+type |
          | 1  |          | waterway |
@@ -85,35 +101,36 @@ Feature: Linking of places
          | R1     | - |
 
     Scenario: Waterways are not linked when the way type is not a river feature
-        Given the scene split-road
+        Given the grid
+         | 1 |   | 2 |
+         |   |   |   |
+         | 3 |   | 4 |
         And the places
          | osm | class    | type     | name  | geometry |
-         | W1  | waterway | lock     | Rhein | :w-2 |
-         | R1  | waterway | river    | Rhein | :w-1 + :w-2 + :w-3 |
+         | W1  | waterway | lock     | Rhein | 3,4 |
+         | R1  | landuse  | meadow   | Rhein | (3,1,2,4,3) |
         And the relations
-         | id | members               | tags+type |
-         | 1  | N23,N34,W1,R45        | multipolygon |
+         | id | members      | tags+type |
+         | 1  | W1,W2        | multipolygon |
         When importing
         Then placex contains
          | object | linked_place_id |
          | W1     | - |
          | R1     | - |
-        When sending search query "rhein"
-        Then results contain
-          | ID | osm_type |
-          |  0 | R |
-          |  1 | W |
 
     Scenario: Side streams are linked only when they have the same name
-        Given the scene split-road
+        Given the grid
+         |   |  |   |   | 8 |   |   |  |
+         | 1 |  | 2 | 3 |   | 4 | 5 | 6|
+         |   |  |   |   |   | 9 |   |  |
         And the places
          | osm | class    | type  | name   | geometry |
-         | W1  | waterway | river | Rhein2 | :w-2 |
-         | W2  | waterway | river | Rhein  | :w-3 |
-         | R1  | waterway | river | Rhein  | :w-1 + :w-2 + :w-3 |
+         | W1  | waterway | river | Rhein2 | 2,8,4 |
+         | W2  | waterway | river | Rhein  | 3,9,5 |
+         | R1  | waterway | river | Rhein  | 1,2,3,4,5,6 |
         And the relations
          | id | members                           | tags+type |
-         | 1  | W1:side_stream,W2:side_stream     | waterway |
+         | 1  | W1:side_stream,W2:side_stream,W3  | waterway |
         When importing
         Then placex contains
          | object | linked_place_id |
@@ -126,27 +143,35 @@ Feature: Linking of places
 
     # github #573
     Scenario: Boundaries should only be linked to places
+        Given the 0.05 grid
+         | 1 |   | 2 |
+         |   | 9 |   |
+         | 4 |   | 3 |
         Given the named places
-         | osm | class    | type           | extra+wikidata | admin | geometry |
-         | R1  | boundary | administrative | 34             | 8     | poly-area:0.1 |
+         | osm | class    | type           | extra+wikidata | admin | geometry    |
+         | R1  | boundary | administrative | 34             | 8     | (1,2,3,4,1) |
         And the named places
-         | osm | class    | type           | geometry |
-         | N3  | natural  | island         | 0.00001 0 |
-         | N3  | place    | city           | 0.00001 0 |
+         | osm | class    | type           |
+         | N9  | natural  | island         |
+         | N9  | place    | city           |
         And the relations
          | id | members  |
-         | 1  | N3:label |
+         | 1  | N9:label |
         When importing
         Then placex contains
          | object     | linked_place_id |
-         | N3:natural | -               |
-         | N3:place   | R1              |
+         | N9:natural | -               |
+         | N9:place   | R1              |
 
     Scenario: Nodes with 'role' label are always linked
+        Given the 0.05 grid
+         | 1 |   | 2 |
+         |   | 9 |   |
+         | 4 |   | 3 |
         Given the places
-         | osm  | class    | type           | admin | name  | geometry |
-         | R13  | boundary | administrative | 6     | Garbo | poly-area:0.1 |
-         | N2   | place    | hamlet         | 15    | Vario | 0.006 0.00001 |
+         | osm  | class    | type           | admin | name  | geometry    |
+         | R13  | boundary | administrative | 6     | Garbo | (1,2,3,4,1) |
+         | N2   | place    | hamlet         | 15    | Vario | 9           |
         And the relations
          | id | members       | tags+type |
          | 13 | N2:label      | boundary |
@@ -155,16 +180,20 @@ Feature: Linking of places
          | object  | linked_place_id |
          | N2      | R13 |
         And placex contains
-         | object | centroid      | name+name | extratags+linked_place |
-         | R13    | 0.006 0.00001 | Garbo     | hamlet |
+         | object | centroid | name+name | extratags+linked_place |
+         | R13    | 9        | Garbo     | hamlet |
 
     Scenario: Boundaries with place tags are linked against places with same type
+        Given the 0.01 grid
+         | 1 |   | 2 |
+         |   | 9 |   |
+         | 4 |   | 3 |
         Given the places
-         | osm  | class    | type           | admin | name   | extra+place | geometry |
-         | R13  | boundary | administrative | 4     | Berlin | city        |poly-area:0.1 |
+         | osm  | class    | type           | admin | name   | extra+place | geometry    |
+         | R13  | boundary | administrative | 4     | Berlin | city        | (1,2,3,4,1) |
         And the places
          | osm  | class    | type           | name   | geometry |
-         | N2   | place    | city           | Berlin | 0.006 0.00001 |
+         | N2   | place    | city           | Berlin | 9 |
         When importing
         Then placex contains
          | object  | linked_place_id |
@@ -187,12 +216,16 @@ Feature: Linking of places
 
 
     Scenario: Boundaries without place tags only link against same admin level
+        Given the 0.05 grid
+         | 1 |   | 2 |
+         |   | 9 |   |
+         | 4 |   | 3 |
         Given the places
          | osm  | class    | type           | admin | name   | geometry |
-         | R13  | boundary | administrative | 4     | Berlin |poly-area:0.1 |
+         | R13  | boundary | administrative | 4     | Berlin | (1,2,3,4,1) |
         And the places
          | osm  | class    | type           | name   | geometry |
-         | N2   | place    | city           | Berlin | 0.006 0.00001 |
+         | N2   | place    | city           | Berlin | 9 |
         When importing
         Then placex contains
          | object  | linked_place_id |
@@ -215,12 +248,16 @@ Feature: Linking of places
 
     # github #1352
     Scenario: Do not use linked centroid when it is outside the area
+        Given the 0.05 grid
+         | 1 |   | 2 |   |
+         |   |   |   | 9 |
+         | 4 |   | 3 |   |
         Given the named places
          | osm  | class    | type           | admin | geometry |
-         | R13  | boundary | administrative | 4     | poly-area:0.01 |
+         | R13  | boundary | administrative | 4     | (1,2,3,4,1) |
         And the named places
          | osm  | class    | type           | geometry |
-         | N2   | place    | city           | 0.1 0.1 |
+         | N2   | place    | city           | 9 |
         And the relations
          | id | members       | tags+type |
          | 13 | N2:label      | boundary |
@@ -233,13 +270,17 @@ Feature: Linking of places
          | R13    | in geometry  |
 
     Scenario: Place nodes can only be linked once
+        Given the 0.02 grid
+         | 1 |   | 2 |   | 5 |
+         |   | 9 |   |   |   |
+         | 4 |   | 3 |   | 6 |
         Given the named places
          | osm  | class    | type | extra+wikidata | geometry |
-         | N2   | place    | city | Q1234          | 0 0 |
+         | N2   | place    | city | Q1234          | 9        |
         And the named places
-         | osm  | class    | type           | extra+wikidata | admin | geometry |
-         | R1   | boundary | administrative | Q1234          | 8     | poly-area:0.1 |
-         | R2   | boundary | administrative | Q1234          | 9     | poly-area:0.01 |
+         | osm  | class    | type           | extra+wikidata | admin | geometry        |
+         | R1   | boundary | administrative | Q1234          | 8     | (1,2,5,6,3,4,1) |
+         | R2   | boundary | administrative | Q1234          | 9     | (1,2,3,4,1)     |
         When importing
         Then placex contains
          | object | linked_place_id |
index bb29d2a314a46f7f917e298c4cf37fa311eb340c..b739cbae0482a65f0824f35b231012bdde387dde 100644 (file)
@@ -58,3 +58,48 @@ Feature: Import and search of names
         | រាជធានីភ្នំពេញ |
         | 東京都 |
         | ပုဗ္ဗသီရိ |
+
+
+    Scenario: German umlauts can be found when expanded
+        Given the places
+            | osm | class | type | name+name:de |
+            | N1  | place | city | Münster      |
+            | N2  | place | city | Köln         |
+            | N3  | place | city | Gräfenroda   |
+        When importing
+        When sending search query "münster"
+        Then results contain
+            | osm |
+            | N1  |
+        When sending search query "muenster"
+        Then results contain
+            | osm |
+            | N1  |
+        When sending search query "munster"
+        Then results contain
+            | osm |
+            | N1  |
+        When sending search query "Köln"
+        Then results contain
+            | osm |
+            | N2  |
+        When sending search query "Koeln"
+        Then results contain
+            | osm |
+            | N2  |
+        When sending search query "Koln"
+        Then results contain
+            | osm |
+            | N2  |
+        When sending search query "gräfenroda"
+        Then results contain
+            | osm |
+            | N3  |
+        When sending search query "graefenroda"
+        Then results contain
+            | osm |
+            | N3  |
+        When sending search query "grafenroda"
+        Then results contain
+            | osm |
+            | N3  |
index b5210f9439b55a5f328d28f0141ac695629a6334..2500d2a908cedb5b592fcf875e144b6087a29540 100644 (file)
@@ -3,16 +3,19 @@ Feature: Parenting of objects
     Tests that the correct parent is chosen
 
     Scenario: Address inherits postcode from its street unless it has a postcode
-        Given the scene roads-with-pois
+        Given the grid with origin DE
+         | 10 |   |   |   |   | 11 |
+         |    |   |   |   |   |    |
+         |    | 1 |   | 2 |   |    |
         And the places
-         | osm | class | type  | housenr | geometry |
-         | N1  | place | house | 4       | :p-N1 |
+         | osm | class | type  | housenr |
+         | N1  | place | house | 4       |
         And the places
-         | osm | class | type  | housenr | postcode | geometry |
-         | N2  | place | house | 5       | 99999    | :p-N1 |
+         | osm | class | type  | housenr | postcode |
+         | N2  | place | house | 5       | 99999    |
         And the places
          | osm | class   | type        | name  | postcode | geometry |
-         | W1  | highway | residential | galoo | 12345    | :w-north |
+         | W1  | highway | residential | galoo | 12345    | 10,11    |
         When importing
         Then placex contains
          | object | parent_place_id |
@@ -21,24 +24,28 @@ Feature: Parenting of objects
         When sending search query "4 galoo"
         Then results contain
          | ID | osm_type | osm_id | display_name |
-         | 0  | N        | 1      | 4, galoo, 12345 |
+         | 0  | N        | 1      | 4, galoo, 12345, Deutschland |
         When sending search query "5 galoo"
         Then results contain
          | ID | osm_type | osm_id | display_name |
-         | 0  | N        | 2      | 5, galoo, 99999 |
+         | 0  | N        | 2      | 5, galoo, 99999, Deutschland |
 
     Scenario: Address without tags, closest street
-        Given the scene roads-with-pois
-        And the places
-         | osm | class | type  | geometry |
-         | N1  | place | house | :p-N1 |
-         | N2  | place | house | :p-N2 |
-         | N3  | place | house | :p-S1 |
-         | N4  | place | house | :p-S2 |
+        Given the grid
+         | 10 |   |   |   |   | 11 |
+         |    | 1 | 2 |   |   |    |
+         |    |   |   | 3 | 4 |    |
+         | 20 |   |   |   |   | 21 |
+        And the places
+         | osm | class | type  |
+         | N1  | place | house |
+         | N2  | place | house |
+         | N3  | place | house |
+         | N4  | place | house |
         And the named places
          | osm | class   | type        | geometry |
-         | W1  | highway | residential | :w-north |
-         | W2  | highway | residential | :w-south |
+         | W1  | highway | residential | 10,11    |
+         | W2  | highway | residential | 20,21    |
         When importing
         Then placex contains
          | object | parent_place_id |
@@ -48,17 +55,23 @@ Feature: Parenting of objects
          | N4     | W2 |
 
     Scenario: Address without tags avoids unnamed streets
-        Given the scene roads-with-pois
-        And the places
-         | osm | class   | type  | geometry |
-         | N1  | place   | house | :p-N1 |
-         | N2  | place   | house | :p-N2 |
-         | N3  | place   | house | :p-S1 |
-         | N4  | place   | house | :p-S2 |
-         | W1  | highway | residential | :w-north |
+        Given the grid
+         | 10 |   |   |   |   | 11 |
+         |    | 1 | 2 |   |   |    |
+         |    |   |   | 3 | 4 |    |
+         | 20 |   |   |   |   | 21 |
+        And the places
+         | osm | class   | type  |
+         | N1  | place   | house |
+         | N2  | place   | house |
+         | N3  | place   | house |
+         | N4  | place   | house |
+        And the places
+         | osm | class   | type        | geometry |
+         | W1  | highway | residential | 10,11    |
         And the named places
          | osm | class   | type        | geometry |
-         | W2  | highway | residential | :w-south |
+         | W2  | highway | residential | 20,21 |
         When importing
         Then placex contains
          | object | parent_place_id |
@@ -68,17 +81,70 @@ Feature: Parenting of objects
          | N4     | W2 |
 
     Scenario: addr:street tag parents to appropriately named street
-        Given the scene roads-with-pois
+        Given the grid
+         | 10 |   |   |   |   | 11 |
+         |    | 1 | 2 |   |   |    |
+         |    |   |   | 3 | 4 |    |
+         | 20 |   |   |   |   | 21 |
+        And the places
+         | osm | class | type  | street|
+         | N1  | place | house | south |
+         | N2  | place | house | north |
+         | N3  | place | house | south |
+         | N4  | place | house | north |
+        And the places
+         | osm | class   | type        | name  | geometry |
+         | W1  | highway | residential | north | 10,11    |
+         | W2  | highway | residential | south | 20,21    |
+        When importing
+        Then placex contains
+         | object | parent_place_id |
+         | N1     | W2 |
+         | N2     | W1 |
+         | N3     | W2 |
+         | N4     | W1 |
+
+    @fail-legacy
+    Scenario: addr:street tag parents to appropriately named street, locale names
+        Given the grid
+         | 10 |   |   |   |   | 11 |
+         |    | 1 | 2 |   |   |    |
+         |    |   |   | 3 | 4 |    |
+         | 20 |   |   |   |   | 21 |
         And the places
-         | osm | class | type  | street| geometry |
-         | N1  | place | house | south | :p-N1 |
-         | N2  | place | house | north | :p-N2 |
-         | N3  | place | house | south | :p-S1 |
-         | N4  | place | house | north | :p-S2 |
+         | osm | class | type  | street| addr+street:de |
+         | N1  | place | house | south | Süd            |
+         | N2  | place | house | north | Nord           |
+         | N3  | place | house | south | Süd            |
+         | N4  | place | house | north | Nord           |
         And the places
          | osm | class   | type        | name  | geometry |
-         | W1  | highway | residential | north | :w-north |
-         | W2  | highway | residential | south | :w-south |
+         | W1  | highway | residential | Nord  | 10,11    |
+         | W2  | highway | residential | Süd   | 20,21    |
+        When importing
+        Then placex contains
+         | object | parent_place_id |
+         | N1     | W2 |
+         | N2     | W1 |
+         | N3     | W2 |
+         | N4     | W1 |
+
+    Scenario: addr:street tag parents to appropriately named street with abbreviation
+        Given the grid
+         | 10 |   |   |   |   | 11 |
+         |    | 1 | 2 |   |   |    |
+         |    |   |   | 3 | 4 |    |
+         | 20 |   |   |   |   | 21 |
+        And the places
+         | osm | class | type  | street   |
+         | N1  | place | house | south st |
+         | N2  | place | house | north st |
+         | N3  | place | house | south st |
+         | N4  | place | house | north st |
+        And the places
+         | osm | class   | type        | name+name:en | geometry |
+         | W1  | highway | residential | north street | 10,11    |
+         | W2  | highway | residential | south street | 20,21    |
         When importing
         Then placex contains
          | object | parent_place_id |
@@ -88,17 +154,21 @@ Feature: Parenting of objects
          | N4     | W1 |
 
     Scenario: addr:street tag parents to next named street
-        Given the scene roads-with-pois
+        Given the grid
+         | 10 |   |   |   |   | 11 |
+         |    | 1 | 2 |   |   |    |
+         |    |   |   | 3 | 4 |    |
+         | 20 |   |   |   |   | 21 |
         And the places
-         | osm | class | type  | street | geometry |
-         | N1  | place | house | abcdef | :p-N1 |
-         | N2  | place | house | abcdef | :p-N2 |
-         | N3  | place | house | abcdef | :p-S1 |
-         | N4  | place | house | abcdef | :p-S2 |
+         | osm | class | type  | street |
+         | N1  | place | house | abcdef |
+         | N2  | place | house | abcdef |
+         | N3  | place | house | abcdef |
+         | N4  | place | house | abcdef |
         And the places
          | osm | class   | type        | name   | geometry |
-         | W1  | highway | residential | abcdef | :w-north |
-         | W2  | highway | residential | abcdef | :w-south |
+         | W1  | highway | residential | abcdef | 10,11    |
+         | W2  | highway | residential | abcdef | 20,21    |
         When importing
         Then placex contains
          | object | parent_place_id |
@@ -108,64 +178,74 @@ Feature: Parenting of objects
          | N4     | W2 |
 
     Scenario: addr:street tag without appropriately named street
-        Given the scene roads-with-pois
+        Given the grid
+         | 10 |   |   |   |   | 11 |
+         |    | 1 |   |   |   |    |
+         |    |   |   | 3 |   |    |
+         | 20 |   |   |   |   | 21 |
         And the places
-         | osm | class | type  | street | geometry |
-         | N1  | place | house | abcdef | :p-N1 |
-         | N2  | place | house | abcdef | :p-N2 |
-         | N3  | place | house | abcdef | :p-S1 |
-         | N4  | place | house | abcdef | :p-S2 |
+         | osm | class | type  | street |
+         | N1  | place | house | abcdef |
+         | N3  | place | house | abcdef |
         And the places
          | osm | class   | type        | name  | geometry |
-         | W1  | highway | residential | abcde | :w-north |
-         | W2  | highway | residential | abcde | :w-south |
+         | W1  | highway | residential | abcde | 10,11    |
+         | W2  | highway | residential | abcde | 20,21    |
         When importing
         Then placex contains
          | object | parent_place_id |
          | N1     | W1 |
-         | N2     | W1 |
          | N3     | W2 |
-         | N4     | W2 |
 
     Scenario: addr:place address
-        Given the scene road-with-alley
+        Given the grid
+         | 10 |   | |   |
+         |    | 1 | | 2 |
+         | 11 |   | |   |
         And the places
-         | osm | class | type   | addr_place | geometry |
-         | N1  | place | house  | myhamlet   | :n-alley |
+         | osm | class | type   | addr_place |
+         | N1  | place | house  | myhamlet   |
         And the places
          | osm | class   | type        | name     | geometry |
-         | N2  | place   | hamlet      | myhamlet | :n-main-west |
-         | W1  | highway | residential | myhamlet | :w-main |
+         | N2  | place   | hamlet      | myhamlet | 2 |
+         | W1  | highway | residential | myhamlet | 10,11 |
         When importing
         Then placex contains
          | object | parent_place_id |
          | N1     | N2 |
 
     Scenario: addr:street is preferred over addr:place
-        Given the scene road-with-alley
+        Given the grid
+         | 10 |  |   |   |
+         |    |  | 1 | 2 |
+         | 11 |  |   |   |
         And the places
-         | osm | class | type   | addr_place | street  | geometry |
-         | N1  | place | house  | myhamlet   | mystreet| :n-alley |
+         | osm | class | type   | addr_place | street  |
+         | N1  | place | house  | myhamlet   | mystreet|
         And the places
          | osm | class   | type        | name     | geometry |
-         | N2  | place   | hamlet      | myhamlet | :n-main-west |
-         | W1  | highway | residential | mystreet | :w-main |
+         | N2  | place   | hamlet      | myhamlet | 2        |
+         | W1  | highway | residential | mystreet | 10,11    |
         When importing
         Then placex contains
          | object | parent_place_id |
          | N1     | W1 |
 
     Scenario: Untagged address in simple associated street relation
-        Given the scene road-with-alley
+        Given the grid
+         | 10 |   |   |   |   | 11 |
+         |    | 2 |   | 3 |   |    |
+         |    |   |   |   |   |    |
+         | 12 | 1 |   |   |   |    |
         And the places
-         | osm | class | type  | geometry |
-         | N1  | place | house | :n-alley |
-         | N2  | place | house | :n-corner |
-         | N3  | place | house | :n-main-west |
+         | osm | class | type  |
+         | N1  | place | house |
+         | N2  | place | house |
+         | N3  | place | house |
         And the places
          | osm | class   | type        | name | geometry |
-         | W1  | highway | residential | foo  | :w-main |
-         | W2  | highway | service     | bar  | :w-alley |
+         | W1  | highway | residential | foo  | 10,11 |
+         | W2  | highway | service     | bar  | 10,12 |
         And the relations
          | id | members            | tags+type |
          | 1  | W1:street,N1,N2,N3 | associatedStreet |
@@ -177,16 +257,22 @@ Feature: Parenting of objects
          | N3     | W1 |
 
     Scenario: Avoid unnamed streets in simple associated street relation
-        Given the scene road-with-alley
+        Given the grid
+         | 10 |   |   |   |   | 11 |
+         |    | 2 |   | 3 |   |    |
+         |    |   |   |   |   |    |
+         | 12 | 1 |   |   |   |    |
         And the places
-         | osm | class | type  | geometry |
-         | N1  | place | house | :n-alley |
-         | N2  | place | house | :n-corner |
-         | N3  | place | house | :n-main-west |
-         | W2  | highway | residential | :w-alley |
+         | osm | class | type  |
+         | N1  | place | house |
+         | N2  | place | house |
+         | N3  | place | house |
+        And the places
+         | osm | class   | type        | geometry |
+         | W2  | highway | residential | 10,12    |
         And the named places
          | osm | class   | type        | geometry |
-         | W1  | highway | residential | :w-main |
+         | W1  | highway | residential | 10,11    |
         And the relations
          | id | members                      | tags+type |
          | 1  | N1,N2,N3,W2:street,W1:street | associatedStreet |
@@ -198,89 +284,107 @@ Feature: Parenting of objects
          | N3     | W1 |
 
     Scenario: Associated street relation overrides addr:street
-        Given the scene road-with-alley
+        Given the grid
+         | 10 |    |   |    | 11 |
+         |    |    |   |    |    |
+         |    |    | 1 |    |    |
+         |    | 20 |   | 21 |    |
         And the places
-         | osm | class | type  | street | geometry |
-         | N1  | place | house | bar    | :n-alley |
+         | osm | class | type  | street |
+         | N1  | place | house | bar    |
         And the places
          | osm | class   | type        | name | geometry |
-         | W1  | highway | residential | foo  | :w-main |
-         | W2  | highway | residential | bar  | :w-alley |
+         | W1  | highway | residential | foo  | 10,11    |
+         | W2  | highway | residential | bar  | 20,21    |
         And the relations
-         | id | members            | tags+type |
-         | 1  | W1:street,N1,N2,N3 | associatedStreet |
+         | id | members      | tags+type |
+         | 1  | W1:street,N1 | associatedStreet |
         When importing
         Then placex contains
          | object | parent_place_id |
          | N1     | W1 |
 
     Scenario: Building without tags, closest street from center point
-        Given the scene building-on-street-corner
+        Given the grid
+         | 10 |  |   |   | 11 |
+         |    |  | 1 | 2 |    |
+         | 12 |  | 4 | 3 |    |
         And the named places
-         | osm | class    | type        | geometry |
-         | W1  | building | yes         | :w-building |
-         | W2  | highway  | primary     | :w-WE |
-         | W3  | highway  | residential | :w-NS |
+         | osm | class    | type        | geometry    |
+         | W1  | building | yes         | (1,2,3,4,1) |
+         | W2  | highway  | primary     | 10,11       |
+         | W3  | highway  | residential | 10,12       |
         When importing
         Then placex contains
          | object | parent_place_id |
          | W1     | W2 |
 
     Scenario: Building with addr:street tags
-        Given the scene building-on-street-corner
+        Given the grid
+         | 10 |  |   |   | 11 |
+         |    |  | 1 | 2 |    |
+         | 12 |  | 4 | 3 |    |
         And the named places
          | osm | class    | type | street | geometry |
-         | W1  | building | yes  | bar    | :w-building |
+         | W1  | building | yes  | foo    | (1,2,3,4,1) |
         And the places
          | osm | class    | type        | name | geometry |
-         | W2  | highway  | primary     | bar  | :w-WE |
-         | W3  | highway  | residential | foo  | :w-NS |
+         | W2  | highway  | primary     | bar  | 10,11    |
+         | W3  | highway  | residential | foo  | 10,12    |
         When importing
         Then placex contains
          | object | parent_place_id |
-         | W1     | W2 |
+         | W1     | W3 |
 
     Scenario: Building with addr:place tags
-        Given the scene building-on-street-corner
+        Given the grid
+         | 10 |   |   |   |   |
+         |    | 1 | 2 |   | 9 |
+         | 11 | 4 | 3 |   |   |
         And the places
          | osm | class    | type        | name | geometry |
-         | N1  | place    | village     | bar  | :n-outer |
-         | W2  | highway  | primary     | bar  | :w-WE |
-         | W3  | highway  | residential | foo  | :w-NS |
+         | N9  | place    | village     | bar  | 9        |
+         | W2  | highway  | primary     | bar  | 10,11    |
         And the named places
-         | osm | class    | type | addr_place | geometry |
-         | W1  | building | yes  | bar        | :w-building |
+         | osm | class    | type | addr_place | geometry    |
+         | W1  | building | yes  | bar        | (1,2,3,4,1) |
         When importing
         Then placex contains
          | object | parent_place_id |
-         | W1     | N1 |
+         | W1     | N9 |
 
     Scenario: Building in associated street relation
-        Given the scene building-on-street-corner
+        Given the grid
+         | 10 |  |   |   | 11 |
+         |    |  | 1 | 2 |    |
+         | 12 |  | 4 | 3 |    |
         And the named places
-         | osm | class    | type | geometry |
-         | W1  | building | yes  | :w-building |
+         | osm | class    | type | geometry    |
+         | W1  | building | yes  | (1,2,3,4,1) |
         And the places
          | osm | class    | type        | name | geometry |
-         | W2  | highway  | primary     | bar  | :w-WE |
-         | W3  | highway  | residential | foo  | :w-NS |
+         | W2  | highway  | primary     | bar  | 10,11 |
+         | W3  | highway  | residential | foo  | 10,12 |
         And the relations
          | id | members            | tags+type |
-         | 1  | W1:house,W2:street | associatedStreet |
+         | 1  | W1:house,W3:street | associatedStreet |
         When importing
         Then placex contains
          | object | parent_place_id |
-         | W1     | W2 |
+         | W1     | W3 |
 
     Scenario: Building in associated street relation overrides addr:street
-        Given the scene building-on-street-corner
+        Given the grid
+         | 10 |  |   |   | 11 |
+         |    |  | 1 | 2 |    |
+         | 12 |  | 4 | 3 |    |
         And the named places
-         | osm | class    | type | street | geometry |
-         | W1  | building | yes  | foo    | :w-building |
+         | osm | class    | type | street | geometry    |
+         | W1  | building | yes  | foo    | (1,2,3,4,1) |
         And the places
          | osm | class    | type        | name | geometry |
-         | W2  | highway  | primary     | bar  | :w-WE |
-         | W3  | highway  | residential | foo  | :w-NS |
+         | W2  | highway  | primary     | bar  | 10,11 |
+         | W3  | highway  | residential | foo  | 10,12 |
         And the relations
          | id | members            | tags+type |
          | 1  | W1:house,W2:street | associatedStreet |
@@ -290,17 +394,19 @@ Feature: Parenting of objects
          | W1     | W2 |
 
     Scenario: Wrong member in associated street relation is ignored
-        Given the scene building-on-street-corner
-        And the named places
+        Given the grid
+         | 10 |   |   |   |   |   |   | 11 |
+         |    | 1 |   | 3 | 4 |   |   |    |
+         |    |   |   | 6 | 5 |   |   |    |
+         And the named places
          | osm | class | type  | geometry |
-         | N1  | place | house | :n-outer |
+         | N1  | place | house | 11       |
         And the named places
-         | osm | class    | type | street | geometry |
-         | W1  | building | yes  | foo    | :w-building |
+         | osm | class    | type | street | geometry    |
+         | W1  | building | yes  | foo    | (3,4,5,6,3) |
         And the places
          | osm | class    | type        | name | geometry |
-         | W2  | highway  | primary     | bar  | :w-WE |
-         | W3  | highway  | residential | foo  | :w-NS |
+         | W3  | highway  | residential | foo  | 10,11    |
         And the relations
          | id | members                      | tags+type |
          | 1  | N1:house,W1:street,W3:street | associatedStreet |
@@ -309,20 +415,46 @@ Feature: Parenting of objects
          | object | parent_place_id |
          | N1     | W3 |
 
+    Scenario: street member in associatedStreet relation can be a relation
+        Given the grid
+          | 1 |   |   | 2 |
+          | 3 |   |   | 4 |
+          |   |   |   |   |
+          |   | 9 |   |   |
+          | 5 |   |   | 6 |
+        And the places
+          | osm | class | type  | housenr | geometry |
+          | N9  | place | house | 34      | 9        |
+        And the named places
+          | osm | class   | type       | name      | geometry    |
+          | R14 | highway | pedestrian | Right St  | (1,2,4,3,1) |
+          | W14 | highway | pedestrian | Left St   | 5,6         |
+        And the relations
+          | id | members             | tags+type |
+          | 1  | N9:house,R14:street | associatedStreet |
+        When importing
+        Then placex contains
+          | object | parent_place_id |
+          | N9     | R14             |
+
     Scenario: POIs in building inherit address
-        Given the scene building-on-street-corner
+        Given the grid
+         | 10 |  |   |   |   |   | 11 |
+         |    |  | 5 | 2 | 6 |   |    |
+         |    |  | 3 | 1 |   |   |    |
+         | 12 |  | 8 |   | 7 |   |    |
         And the named places
-         | osm | class   | type       | geometry |
-         | N1  | amenity | bank       | :n-inner |
-         | N2  | shop    | bakery     | :n-edge-NS |
-         | N3  | shop    | supermarket| :n-edge-WE |
+         | osm | class   | type       |
+         | N1  | amenity | bank       |
+         | N2  | shop    | bakery     |
+         | N3  | shop    | supermarket|
         And the places
-         | osm | class    | type | street | addr_place | housenr | geometry |
-         | W1  | building | yes  | foo    | nowhere    | 3       | :w-building |
+         | osm | class    | type | street | housenr | geometry    |
+         | W1  | building | yes  | foo    | 3       | (5,6,7,8,5) |
         And the places
          | osm | class    | type        | name | geometry |
-         | W2  | highway  | primary     | bar  | :w-WE |
-         | W3  | highway  | residential | foo  | :w-NS |
+         | W2  | highway  | primary     | bar  | 10,11    |
+         | W3  | highway  | residential | foo  | 10,12    |
         When importing
         Then placex contains
          | object | parent_place_id | housenumber |
@@ -330,116 +462,132 @@ Feature: Parenting of objects
          | N1     | W3              | 3 |
          | N2     | W3              | 3 |
          | N3     | W3              | 3 |
+        When sending geocodejson search query "3, foo" with address
+        Then results contain
+         | housenumber |
+         | 3           |
 
     Scenario: POIs don't inherit from streets
-        Given the scene building-on-street-corner
+        Given the grid
+         | 10 |   |   |   | 11 |
+         |    | 5 | 1 | 6 |    |
+         |    | 8 |   | 7 |    |
         And the named places
-         | osm | class   | type       | geometry |
-         | N1  | amenity | bank       | :n-inner |
+         | osm | class   | type  |
+         | N1  | amenity | bank  |
         And the places
-         | osm | class    | type | street | addr_place | housenr | geometry |
-         | W1  | highway  | path | foo    | nowhere    | 3       | :w-building |
+         | osm | class    | type | name | street | housenr | geometry    |
+         | W1  | highway  | path | bar  | foo    | 3       | (5,6,7,8,5) |
         And the places
          | osm | class    | type        | name | geometry |
-         | W3  | highway  | residential | foo  | :w-NS |
+         | W3  | highway  | residential | foo  | 10,11    |
         When importing
         Then placex contains
          | object | parent_place_id | housenumber |
-         | N1     | W3              | None |
+         | N1     | W1              | None |
 
     Scenario: POIs with own address do not inherit building address
-        Given the scene building-on-street-corner
+        Given the grid
+         | 10 |  |   |   |   |   | 11 |
+         |    |  | 6 | 2 | 7 |   |    |
+         |    |  | 3 | 1 |   | 5 |  4 |
+         | 12 |  | 9 |   | 8 |   |    |
         And the named places
-         | osm | class   | type       | street | geometry |
-         | N1  | amenity | bank       | bar    | :n-inner |
+         | osm | class   | type       | street |
+         | N1  | amenity | bank       | bar    |
         And the named places
-         | osm | class   | type       | housenr | geometry |
-         | N2  | shop    | bakery     | 4       | :n-edge-NS |
+         | osm | class   | type       | housenr |
+         | N2  | shop    | bakery     | 4       |
         And the named places
-         | osm | class   | type       | addr_place  | geometry |
-         | N3  | shop    | supermarket| nowhere     | :n-edge-WE |
+         | osm | class   | type       | addr_place  |
+         | N3  | shop    | supermarket| nowhere     |
         And the places
-         | osm | class | type              | name     | geometry |
-         | N4  | place | isolated_dwelling | theplace | :n-outer |
+         | osm | class | type              | name     |
+         | N4  | place | isolated_dwelling | theplace |
+         | N5  | place | isolated_dwelling | nowhere  |
         And the places
-         | osm | class    | type | addr_place | housenr | geometry |
-         | W1  | building | yes  | theplace   | 3       | :w-building |
+         | osm | class    | type | addr_place | housenr | geometry    |
+         | W1  | building | yes  | theplace   | 3       | (6,7,8,9,6) |
         And the places
          | osm | class    | type        | name | geometry |
-         | W2  | highway  | primary     | bar  | :w-WE |
-         | W3  | highway  | residential | foo  | :w-NS |
+         | W2  | highway  | primary     | bar  | 10,11    |
+         | W3  | highway  | residential | foo  | 10,12    |
         When importing
         Then placex contains
          | object | parent_place_id | housenumber |
          | W1     | N4              | 3 |
          | N1     | W2              | None |
-         | N2     | W3              | 4 |
-         | N3     | N4              | None |
+         | N2     | W2              | 4 |
+         | N3     | N5              | None |
 
     Scenario: POIs parent a road if they are attached to it
-        Given the scene points-on-roads
+        Given the grid
+         |    | 10 |    |
+         | 20 | 1  | 21 |
+         |    | 11 |    |
         And the named places
-         | osm | class   | type     | street   | geometry |
-         | N1  | highway | bus_stop | North St | :n-SE |
-         | N2  | highway | bus_stop | South St | :n-NW |
-         | N3  | highway | bus_stop | North St | :n-S-unglued |
-         | N4  | highway | bus_stop | South St | :n-N-unglued |
+         | osm | class   | type     |
+         | N1  | highway | bus_stop |
         And the places
          | osm | class   | type         | name     | geometry |
-         | W1  | highway | secondary    | North St | :w-north |
-         | W2  | highway | unclassified | South St | :w-south |
+         | W1  | highway | secondary    | North St | 10,11 |
+         | W2  | highway | unclassified | South St | 20,1,21 |
         And the ways
          | id | nodes |
-         | 1  | 100,101,2,103,104 |
-         | 2  | 200,201,1,202,203 |
+         | 1  | 10,11 |
+         | 2  | 20,1,21 |
         When importing
         Then placex contains
          | object | parent_place_id |
-         | N1     | W1 |
-         | N2     | W2 |
-         | N3     | W1 |
-         | N4     | W2 |
+         | N1     | W2 |
 
     Scenario: POIs do not parent non-roads they are attached to
-        Given the scene points-on-roads
+        Given the grid
+         | 10 |   | 1 |   |  11 |  | 30 |
+         | 14 |   |   |   |  15 |  |    |
+         | 13 |   | 2 |   |  12 |  | 31 |
         And the named places
-         | osm | class   | type     | street   | geometry |
-         | N1  | highway | bus_stop | North St | :n-SE |
-         | N2  | highway | bus_stop | South St | :n-NW |
+         | osm | class   | type     | street   |
+         | N1  | highway | bus_stop | North St |
+         | N2  | highway | bus_stop | South St |
         And the places
          | osm | class   | type         | name     | geometry |
-         | W1  | landuse | residential  | North St | :w-north |
-         | W2  | waterway| river        | South St | :w-south |
+         | W1  | landuse | residential  | North St | (14,15,12,2,13,14) |
+         | W2  | waterway| river        | South St | 10,1,11  |
+         | W3  | highway | residential  | foo      | 30,31    |
         And the ways
          | id | nodes |
-         | 1  | 100,101,2,103,104 |
-         | 2  | 200,201,1,202,203 |
+         | 1  | 10,11,12,2,13,10 |
+         | 2  | 10,1,11 |
         When importing
         Then placex contains
          | object | parent_place_id |
-         | N1     | 0 |
-         | N2     | 0 |
+         | N1     | W3 |
+         | N2     | W3 |
 
     Scenario: POIs on building outlines inherit associated street relation
-        Given the scene building-on-street-corner
+        Given the grid
+         | 10 |   |   |   | 11 |
+         |    | 5 | 1 | 6 |    |
+         | 12 | 8 |   | 7 |    |
         And the named places
-         | osm | class    | type  | geometry |
-         | N1  | place    | house | :n-edge-NS |
-         | W1  | building | yes   | :w-building |
+         | osm | class    | type  | geometry     |
+         | N1  | place    | house | 1            |
+         | W1  | building | yes   | (5,1,6,7,8,5)|
         And the places
          | osm | class    | type        | name | geometry |
-         | W2  | highway  | primary     | bar  | :w-WE |
-         | W3  | highway  | residential | foo  | :w-NS |
+         | W2  | highway  | primary     | bar  | 10,11    |
+         | W3  | highway  | residential | foo  | 10,12    |
         And the relations
          | id | members            | tags+type |
-         | 1  | W1:house,W2:street | associatedStreet |
+         | 1  | W1:house,W3:street | associatedStreet |
         And the ways
          | id | nodes |
-         | 1  | 100,1,101,102,100 |
+         | 1  | 5,1,6,7,8,5 |
         When importing
         Then placex contains
          | object | parent_place_id |
-         | N1     | W2 |
+         | N1     | W3 |
 
     # github #1056
     Scenario: Full names should be preferably matched for nearest road
index 9b208775703fad191879500cd96398574d84fbc7..e0e8925fd4332000b9ddd80e9d1455ebb6352860 100644 (file)
@@ -55,76 +55,15 @@ Feature: Import into placex
         Then placex has no entry for N1
 
     Scenario: postcode boundary without postcode is dropped
+        Given the 0.01 grid
+          | 1 | 2 |
+          | 3 |   |
         Given the places
-          | osm | class    | type        | name+ref | geometry |
-          | R1  | boundary | postal_code | 554476   | poly-area:0.1 |
+          | osm | class    | type        | name+ref | geometry  |
+          | R1  | boundary | postal_code | 554476   | (1,2,3,1) |
         When importing
         Then placex has no entry for R1
 
-    Scenario: search and address ranks for GB post codes correctly assigned
-        Given the places
-         | osm  | class | type     | postcode | geometry |
-         | N1   | place | postcode | E45 2CD  | country:gb |
-         | N2   | place | postcode | E45 2    | country:gb |
-         | N3   | place | postcode | Y45      | country:gb |
-        When importing
-        Then placex contains
-         | object | addr+postcode | country_code | rank_search | rank_address |
-         | N1     | E45 2CD       | gb           | 25          | 5 |
-         | N2     | E45 2         | gb           | 23          | 5 |
-         | N3     | Y45           | gb           | 21          | 5 |
-
-    Scenario: wrongly formatted GB postcodes are down-ranked
-        Given the places
-         | osm  | class | type     | postcode | geometry |
-         | N1   | place | postcode | EA452CD  | country:gb |
-         | N2   | place | postcode | E45 23   | country:gb |
-        When importing
-        Then placex contains
-         | object | country_code | rank_search | rank_address |
-         | N1     | gb           | 30          | 30 |
-         | N2     | gb           | 30          | 30 |
-
-    Scenario: search and address rank for DE postcodes correctly assigned
-        Given the places
-         | osm | class | type     | postcode | geometry |
-         | N1  | place | postcode | 56427    | country:de |
-         | N2  | place | postcode | 5642     | country:de |
-         | N3  | place | postcode | 5642A    | country:de |
-         | N4  | place | postcode | 564276   | country:de |
-        When importing
-        Then placex contains
-         | object | country_code | rank_search | rank_address |
-         | N1     | de           | 21          | 11 |
-         | N2     | de           | 30          | 30 |
-         | N3     | de           | 30          | 30 |
-         | N4     | de           | 30          | 30 |
-
-    Scenario: search and address rank for other postcodes are correctly assigned
-        Given the places
-         | osm | class | type     | postcode | geometry |
-         | N1  | place | postcode | 1        | country:ca |
-         | N2  | place | postcode | X3       | country:ca |
-         | N3  | place | postcode | 543      | country:ca |
-         | N4  | place | postcode | 54dc     | country:ca |
-         | N5  | place | postcode | 12345    | country:ca |
-         | N6  | place | postcode | 55TT667  | country:ca |
-         | N7  | place | postcode | 123-65   | country:ca |
-         | N8  | place | postcode | 12 445 4 | country:ca |
-         | N9  | place | postcode | A1:bc10  | country:ca |
-        When importing
-        Then placex contains
-         | object | country_code | rank_search | rank_address |
-         | N1     | ca           | 21          | 11 |
-         | N2     | ca           | 21          | 11 |
-         | N3     | ca           | 21          | 11 |
-         | N4     | ca           | 21          | 11 |
-         | N5     | ca           | 21          | 11 |
-         | N6     | ca           | 21          | 11 |
-         | N7     | ca           | 25          | 11 |
-         | N8     | ca           | 25          | 11 |
-         | N9     | ca           | 25          | 11 |
-
     Scenario: search and address ranks for boundaries are correctly assigned
         Given the named places
           | osm | class    | type |
@@ -155,18 +94,19 @@ Feature: Import into placex
           | R41    | 8           | 0 |
 
     Scenario: search and address ranks for highways correctly assigned
-        Given the scene roads-with-pois
+        Given the grid
+          | 10 | 1 | 11 |   | 12 |   | 13 |  | 14 | | 15 |   | 16 |
         And the places
           | osm | class    | type  |
           | N1  | highway  | bus_stop |
         And the places
           | osm | class    | type         | geometry |
-          | W1  | highway  | primary      | :w-south |
-          | W2  | highway  | secondary    | :w-south |
-          | W3  | highway  | tertiary     | :w-south |
-          | W4  | highway  | residential  | :w-north |
-          | W5  | highway  | unclassified | :w-north |
-          | W6  | highway  | something    | :w-north |
+          | W1  | highway  | primary      | 10,11 |
+          | W2  | highway  | secondary    | 11,12 |
+          | W3  | highway  | tertiary     | 12,13 |
+          | W4  | highway  | residential  | 13,14 |
+          | W5  | highway  | unclassified | 14,15 |
+          | W6  | highway  | something    | 15,16 |
         When importing
         Then placex contains
           | object | rank_search | rank_address |
@@ -179,15 +119,18 @@ Feature: Import into placex
           | W6     | 30          | 30 |
 
     Scenario: rank and inclusion of landuses
+        Given the 0.4 grid
+          | 1 | 2 | | | | | | 5 |
+          | 4 | 3 | | | | | | 6 |
         Given the named places
           | osm | class   | type |
           | N2  | landuse | residential |
         And the named places
-          | osm | class   | type        | geometry |
-          | W2  | landuse | residential | 1 1, 1 1.1 |
-          | W4  | landuse | residential | poly-area:0.1 |
-          | R2  | landuse | residential | poly-area:0.05 |
-          | R3  | landuse | forrest     | poly-area:0.5 |
+          | osm | class   | type        | geometry    |
+          | W2  | landuse | residential | 1,2,5       |
+          | W4  | landuse | residential | (1,4,3,1)   |
+          | R2  | landuse | residential | (1,2,3,4,1) |
+          | R3  | landuse | forrest     | (1,5,6,4,1) |
         When importing
         Then placex contains
           | object | rank_search | rank_address |
@@ -198,19 +141,22 @@ Feature: Import into placex
           | R3     | 22          |  0 |
 
     Scenario: rank and inclusion of naturals
+        Given the 0.4 grid
+          | 1 | 2 | | | | | | 5 |
+          | 4 | 3 | | | | | | 6 |
        Given the named places
           | osm | class   | type |
           | N2  | natural | peak |
           | N4  | natural | volcano |
           | N5  | natural | foobar |
        And the named places
-          | osm | class   | type           | geometry |
-          | W2  | natural | mountain_range | 12 12,11 11 |
-          | W3  | natural | foobar         | 13 13,13.1 13 |
-          | R3  | natural | volcano        | poly-area:0.1 |
-          | R4  | natural | foobar         | poly-area:0.5 |
-          | R5  | natural | sea            | poly-area:5.0 |
-          | R6  | natural | sea            | poly-area:0.01 |
+          | osm | class   | type           | geometry    |
+          | W2  | natural | mountain_range | 1,2,5       |
+          | W3  | natural | foobar         | 2,3         |
+          | R3  | natural | volcano        | (1,2,4,1)   |
+          | R4  | natural | foobar         | (1,2,3,4,1) |
+          | R5  | natural | sea            | (1,2,5,6,3,4,1) |
+          | R6  | natural | sea            | (2,3,4,2)   |
        When importing
        Then placex contains
           | object | rank_search | rank_address |
@@ -225,16 +171,19 @@ Feature: Import into placex
           | W3     | 22          | 0 |
 
     Scenario: boundary ways for countries and states are ignored
+        Given the 0.3 grid
+          | 1 | 2 |
+          | 4 | 3 |
         Given the named places
           | osm | class    | type           | admin | geometry |
-          | W4  | boundary | administrative | 2     | poly-area:0.1 |
-          | R4  | boundary | administrative | 2     | poly-area:0.1 |
-          | W5  | boundary | administrative | 3     | poly-area:0.1 |
-          | R5  | boundary | administrative | 3     | poly-area:0.1 |
-          | W6  | boundary | administrative | 4     | poly-area:0.1 |
-          | R6  | boundary | administrative | 4     | poly-area:0.1 |
-          | W7  | boundary | administrative | 5     | poly-area:0.1 |
-          | R7  | boundary | administrative | 5     | poly-area:0.1 |
+          | W4  | boundary | administrative | 2     | (1,2,3,4,1) |
+          | R4  | boundary | administrative | 2     | (1,2,3,4,1) |
+          | W5  | boundary | administrative | 3     | (1,2,3,4,1) |
+          | R5  | boundary | administrative | 3     | (1,2,3,4,1) |
+          | W6  | boundary | administrative | 4     | (1,2,3,4,1) |
+          | R6  | boundary | administrative | 4     | (1,2,3,4,1) |
+          | W7  | boundary | administrative | 5     | (1,2,3,4,1) |
+          | R7  | boundary | administrative | 5     | (1,2,3,4,1) |
        When importing
        Then placex contains exactly
            | object |
index 4c839db00143e004b28f5d98dd6890102475e5e0..4d146d18c191e95a4cad025bf5c823818072b7f6 100644 (file)
@@ -3,128 +3,155 @@ Feature: Import of postcodes
     Tests for postcode estimation
 
     Scenario: Postcodes on the object are preferred over those on the address
-        Given the scene admin-areas
+        Given the grid with origin FR
+            | 1 |    |    |    | 4 |  | 6 | | 8 |
+            |   | 10 |    | 11 |   |  |   | |   |
+            |   |    | 22 |    |   |  |   | |   |
+            | 2 |    |    |    | 3 |  | 5 | | 7 |
         And the named places
-            | osm | class    | type           | admin | addr+postcode | geometry |
-            | R1  | boundary | administrative | 6     | 112           | :b0      |
-            | R34 | boundary | administrative | 8     | 112 DE        | :b1:E    |
-            | R4  | boundary | administrative | 10    | 112 DE 34     | :b2:N    |
+            | osm | class    | type           | admin | addr+postcode | geometry    |
+            | R1  | boundary | administrative | 6     | 10000         | (1,8,7,2,1) |
+            | R34 | boundary | administrative | 8     | 11000         | (1,6,5,2,1) |
+            | R4  | boundary | administrative | 10    | 11200         | (1,4,3,2,1) |
         And the named places
             | osm | class    | type        | addr+postcode | geometry |
-            | W93 | highway  | residential | 112 DE 344    | :w2N     |
-            | W22 | building | yes         | 112 DE 344N   | :building:w2N |
+            | W93 | highway  | residential | 11250         | 10,11    |
+            | N22 | building | yes         | 11254         | 22       |
         When importing
         Then placex contains
-            | object | postcode    |
-            | W22    | 112 DE 344N |
-            | W93    | 112 DE 344  |
-            | R4     | 112 DE 34   |
-            | R34    | 112 DE      |
-            | R1     | 112         |
+            | object | postcode |
+            | N22    | 11254    |
+            | W93    | 11250    |
+            | R4     | 11200    |
+            | R34    | 11000    |
+            | R1     | 10000    |
 
     Scenario: Postcodes from a road are inherited by an attached building
-        Given the scene admin-areas
+        Given the grid with origin DE
+            | 10 |   |   |   | 11 |
+            |    | 1 | 2 |   |    |
+            |    | 4 | 3 |   |    |
         And the named places
             | osm | class    | type        | addr+postcode | geometry |
-            | W93 | highway  | residential | 86034         | :w2N     |
+            | W93 | highway  | residential | 86034         | 10,11    |
         And the named places
-            | osm | class    | type  | geometry |
-            | W22 | building | yes   | :building:w2N |
+            | osm | class    | type  | geometry    |
+            | W22 | building | yes   | (1,2,3,4,1) |
         When importing
         Then placex contains
             | object | postcode | parent_place_id |
             | W22    | 86034    | W93 |
 
     Scenario: Postcodes from the lowest admin area are inherited by ways
-        Given the scene admin-areas
+        Given the grid with origin FR
+            | 1 |    |    |    | 4 |  | 6 | | 8 |
+            |   | 10 |    | 11 |   |  |   | |   |
+            | 2 |    |    |    | 3 |  | 5 | | 7 |
         And the named places
             | osm | class    | type           | admin | addr+postcode | geometry |
-            | R1  | boundary | administrative | 6     | 112           | :b0      |
-            | R34 | boundary | administrative | 8     | 112 DE        | :b1:E    |
-            | R4  | boundary | administrative | 10    | 112 DE 34     | :b2:N    |
+            | R1  | boundary | administrative | 6     | 10000         | (1,8,7,2,1) |
+            | R34 | boundary | administrative | 8     | 11000         | (1,6,5,2,1) |
+            | R4  | boundary | administrative | 10    | 11200         | (1,4,3,2,1) |
         And the named places
             | osm | class    | type           | geometry |
-            | W93 | highway  | residential    | :w2N     |
+            | W93 | highway  | residential    | 10,11    |
         When importing
         Then placex contains
-            | object | postcode  |
-            | W93    | 112 DE 34 |
+            | object | postcode |
+            | W93    | 11200    |
 
     Scenario: Postcodes from the lowest admin area with postcode are inherited by ways
-        Given the scene admin-areas
+        Given the grid with origin FR
+            | 1 |    |    |    | 4 |  | 6 | | 8 |
+            |   | 10 |    | 11 |   |  |   | |   |
+            | 2 |    |    |    | 3 |  | 5 | | 7 |
         And the named places
             | osm | class    | type           | admin | addr+postcode | geometry |
-            | R1  | boundary | administrative | 6     | 112           | :b0      |
-            | R34 | boundary | administrative | 8     | 112 DE        | :b1:E    |
+            | R1  | boundary | administrative | 6     | 10000         | (1,8,7,2,1) |
+            | R34 | boundary | administrative | 8     | 11000         | (1,6,5,2,1) |
         And the named places
-            | osm | class    | type           | admin | geometry |
-            | R4  | boundary | administrative | 10    | :b2:N    |
+            | osm | class    | type           | admin | geometry    |
+            | R4  | boundary | administrative | 10    | (1,4,3,2,1) |
         And the named places
             | osm | class    | type           | geometry |
-            | W93 | highway  | residential    | :w2N     |
+            | W93 | highway  | residential    | 10,11    |
         When importing
         Then placex contains
             | object | postcode | parent_place_id |
-            | W93    | 112 DE   | R4 |
+            | W93    | 11000    | R4 |
 
     Scenario: Postcodes from the lowest admin area are inherited by buildings
-        Given the scene admin-areas
+        Given the grid with origin FR
+            | 1 |    |    |    | 4 |  | 6 | | 8 |
+            |   | 10 |    | 11 |   |  |   | |   |
+            |   | 13 |    | 12 |   |  |   | |   |
+            | 2 |    |    |    | 3 |  | 5 | | 7 |
         And the named places
             | osm | class    | type           | admin | addr+postcode | geometry |
-            | R1  | boundary | administrative | 6     | 112           | :b0      |
-            | R34 | boundary | administrative | 8     | 112 DE        | :b1:E    |
-            | R4  | boundary | administrative | 10    | 112 DE 34     | :b2:N    |
+            | R1  | boundary | administrative | 6     | 10000         | (1,8,7,2,1) |
+            | R34 | boundary | administrative | 8     | 11000         | (1,6,5,2,1) |
+            | R4  | boundary | administrative | 10    | 11200         | (1,4,3,2,1) |
         And the named places
             | osm | class    | type  | geometry |
-            | W22 | building | yes   | :building:w2N |
+            | W22 | building | yes   | (10,11,12,13,10) |
         When importing
         Then placex contains
-            | object | postcode  |
-            | W22    | 112 DE 34 |
+            | object | postcode |
+            | W22    | 11200    |
 
     Scenario: Roads get postcodes from nearby named buildings without other info
-        Given the scene admin-areas
+        Given the grid with origin US
+            | 10 |   |   |   | 11 |
+            |    | 1 | 2 |   |    |
+            |    | 4 | 3 |   |    |
         And the named places
             | osm | class    | type           | geometry |
-            | W93 | highway  | residential    | :w2N     |
+            | W93 | highway  | residential    | 10,11    |
         And the named places
-            | osm | class    | type        | addr+postcode | geometry |
-            | W22 | building | yes         | 445023        | :building:w2N |
+            | osm | class    | type        | addr+postcode | geometry    |
+            | W22 | building | yes         | 45023         | (1,2,3,4,1) |
         When importing
         Then placex contains
             | object | postcode |
-            | W93    | 445023   |
+            | W93    | 45023    |
 
     Scenario: Roads get postcodes from nearby unnamed buildings without other info
-        Given the scene admin-areas
+        Given the grid with origin US
+            | 10 |   |   |   | 11 |
+            |    | 1 | 2 |   |    |
+            |    | 4 | 3 |   |    |
         And the named places
             | osm | class    | type           | geometry |
-            | W93 | highway  | residential    | :w2N     |
-        And the named places
-            | osm | class    | type        | addr+postcode | geometry |
-            | W22 | place    | postcode    | 445023        | :building:w2N |
+            | W93 | highway  | residential    | 10,11    |
+        And the places
+            | osm | class    | type        | addr+postcode | geometry    |
+            | W22 | place    | postcode    | 45023         | (1,2,3,4,1) |
         When importing
         Then placex contains
             | object | postcode |
-            | W93    | 445023   |
+            | W93    | 45023    |
 
     Scenario: Postcodes from admin boundaries are preferred over estimated postcodes
-        Given the scene admin-areas
+        Given the grid with origin FR
+            | 1 |    |    |    | 4 |  | 6 | | 8 |
+            |   | 10 |    | 11 |   |  |   | |   |
+            |   |    | 22 |    |   |  |   | |   |
+            | 2 |    |    |    | 3 |  | 5 | | 7 |
         And the named places
             | osm | class    | type           | admin | addr+postcode | geometry |
-            | R1  | boundary | administrative | 6     | 112           | :b0      |
-            | R34 | boundary | administrative | 8     | 112 DE        | :b1:E    |
-            | R4  | boundary | administrative | 10    | 112 DE 34     | :b2:N    |
+            | R1  | boundary | administrative | 6     | 10000         | (1,8,7,2,1) |
+            | R34 | boundary | administrative | 8     | 11000         | (1,6,5,2,1) |
+            | R4  | boundary | administrative | 10    | 11200         | (1,4,3,2,1) |
         And the named places
             | osm | class    | type           | geometry |
-            | W93 | highway  | residential    | :w2N     |
+            | W93 | highway  | residential    | 10,1     |
         And the named places
-            | osm | class    | type        | addr+postcode | geometry |
-            | W22 | building | yes         | 445023        | :building:w2N |
+            | osm | class    | type        | addr+postcode |
+            | N22 | building | yes         | 45023         |
         When importing
         Then placex contains
-            | object | postcode  |
-            | W93    | 112 DE 34 |
+            | object | postcode |
+            | W93    | 11200    |
 
     Scenario: Postcodes are added to the postcode and word table
         Given the places
@@ -136,21 +163,34 @@ Feature: Import of postcodes
            | de      | 01982    | country:de |
         And there are word tokens for postcodes 01982
 
-    Scenario: Different postcodes with the same normalization can both be found
+
+    @Fail
+    Scenario: search and address ranks for GB post codes correctly assigned
         Given the places
-           | osm | class | type  | addr+postcode | addr+housenumber | geometry |
-           | N34 | place | house | EH4 7EA       | 111              | country:gb |
-           | N35 | place | house | E4 7EA        | 111              | country:gb |
+         | osm  | class | type     | postcode | geometry |
+         | N1   | place | postcode | E45 2CD  | country:gb |
+         | N2   | place | postcode | E45 2    | country:gb |
+         | N3   | place | postcode | Y45      | country:gb |
         When importing
         Then location_postcode contains exactly
-           | country | postcode | geometry |
-           | gb      | EH4 7EA  | country:gb |
-           | gb      | E4 7EA   | country:gb |
-        When sending search query "EH4 7EA"
-        Then results contain
-           | type     | display_name |
-           | postcode | EH4 7EA      |
-        When sending search query "E4 7EA"
+         | postcode | country | rank_search | rank_address |
+         | E45 2CD  | gb      | 25          | 5 |
+         | E45 2    | gb      | 23          | 5 |
+         | Y45      | gb      | 21          | 5 |
+
+    @fail-legacy
+    Scenario: Postcodes outside all countries are not added to the postcode and word table
+        Given the places
+            | osm | class | type  | addr+postcode | addr+housenumber | addr+place  | geometry  |
+            | N34 | place | house | 01982         | 111              | Null Island | 0 0.00001 |
+        And the places
+            | osm | class | type   | name        | geometry |
+            | N1  | place | hamlet | Null Island | 0 0      |
+        When importing
+        Then location_postcode contains exactly
+            | country | postcode | geometry |
+        And there are no word tokens for postcodes 01982
+        When sending search query "111, 01982 Null Island"
         Then results contain
-           | type     | display_name |
-           | postcode | E4 7EA      |
+            | osm | display_name |
+            | N34 | 111, Null Island, 01982 |
index c8b5de5cf9c7d6b9b137c24baa586a2e5c18e838..1d4e2b821bbffe604d446600e7fbb18a68abf9d2 100644 (file)
@@ -16,7 +16,6 @@ Feature: Rank assignment
           | N18  | place     | city      | 0 0 |
           | N19  | place     | island    | 0 0 |
           | N36  | place     | house     | 0 0 |
-          | N38  | place     | houses    | 0 0 |
         And the named places
           | osm  | class     | type      | extra+capital | geometry |
           | N101 | place     | city      | yes           | 0 0 |
@@ -35,7 +34,6 @@ Feature: Rank assignment
           | N19    | 17          | 0 |
           | N101   | 15          | 16 |
           | N36    | 30          | 30 |
-          | N38    | 28          | 0 |
 
     Scenario: Ranks for boundaries are assigned according to admin level
         Given the named places
@@ -199,3 +197,61 @@ Feature: Rank assignment
             | N20    | R22     | 16                  |
             | N20    | R21     | 18                  |
 
+    Scenario: Mixes of admin boundaries and place areas I
+        Given the grid
+          | 1 |   | 10 |  |  | 2 |
+          |   | 9 |    |  |  |   |
+          | 20|   | 21 |  |  |   |
+          | 4 |   | 11 |  |  | 3 |
+        And the places
+          | osm | class    | type           | admin | name           | geometry      |
+          | R1  | boundary | administrative | 5     | Greater London | (1,2,3,4,1)   |
+          | R2  | boundary | administrative | 8     | Kensington     | (1,10,11,4,1) |
+        And the places
+          | osm | class    | type           | name           | geometry    |
+          | R10 | place    | city           | London         | (1,2,3,4,1) |
+          | N9  | place    | town           | Fulham         | 9           |
+          | W1  | highway  | residential    | Lots Grove     | 20,21       |
+        When importing
+        Then placex contains
+         | object | rank_search | rank_address |
+         | R1     | 10          | 10           |
+         | R10    | 16          | 16           |
+         | R2     | 16          | 18           |
+         | N9     | 18          | 18           |
+        And place_addressline contains
+         | object | address | isaddress | cached_rank_address |
+         | W1     | R1      | True      | 10                  |
+         | W1     | R10     | True      | 16                  |
+         | W1     | R2      | True      | 18                  |
+         | W1     | N9      | False     | 18                  |
+
+
+    Scenario: Mixes of admin boundaries and place areas II
+        Given the grid
+          | 1 |   | 10 |  | 5 | 2 |
+          |   | 9 |    |  |   |   |
+          | 20|   | 21 |  |   |   |
+          | 4 |   | 11 |  | 6 | 3 |
+        And the places
+          | osm | class    | type           | admin | name           | geometry    |
+          | R1  | boundary | administrative | 5     | Greater London | (1,2,3,4,1) |
+          | R2  | boundary | administrative | 8     | London         | (1,5,6,4,1) |
+        And the places
+          | osm | class    | type           | name           | geometry      |
+          | R10 | place    | city           | Westminster    | (1,10,11,4,1) |
+          | N9  | place    | town           | Fulham         | 9             |
+          | W1  | highway  | residential    | Lots Grove     | 20,21         |
+        When importing
+        Then placex contains
+         | object | rank_search | rank_address |
+         | R1     | 10          | 10           |
+         | R2     | 16          | 16           |
+         | R10    | 16          | 18           |
+         | N9     | 18          | 18           |
+        And place_addressline contains
+         | object | address | isaddress | cached_rank_address |
+         | W1     | R1      | True      | 10                  |
+         | W1     | R10     | True      | 18                  |
+         | W1     | R2      | True      | 16                  |
+         | W1     | N9      | False     | 18                  |
index a5b07e5cf5e5027919066d8967da19cfccdfdc26..7c75ca4966c497d639ce2f927f3b2772c651d825 100644 (file)
@@ -26,24 +26,28 @@ Feature: Creation of search terms
          | N1     | #Halle Saale, #Halle |
 
     Scenario: Unnamed POIs have no search entry
-        Given the scene roads-with-pois
+        Given the grid
+         |    | 1 |  |    |
+         | 10 |   |  | 11 |
         And the places
-         | osm | class   | type        | geometry |
-         | N1  | place   | house       | :p-N1 |
+         | osm | class   | type        |
+         | N1  | place   | house       |
         And the named places
          | osm | class   | type        | geometry |
-         | W1  | highway | residential | :w-north |
+         | W1  | highway | residential | 10,11    |
         When importing
         Then search_name has no entry for N1
 
     Scenario: Unnamed POI has a search entry when it has unknown addr: tags
-        Given the scene roads-with-pois
+        Given the grid
+         |    | 1 |  |    |
+         | 10 |   |  | 11 |
         And the places
-         | osm | class   | type        | housenr | addr+city | geometry |
-         | N1  | place   | house       | 23      | Walltown  | :p-N1 |
+         | osm | class   | type        | housenr | addr+city |
+         | N1  | place   | house       | 23      | Walltown  |
         And the places
          | osm | class   | type        | name+name   | geometry |
-         | W1  | highway | residential | Rose Street | :w-north |
+         | W1  | highway | residential | Rose Street | 10,11    |
         When importing
         Then search_name contains
          | object | nameaddress_vector |
@@ -62,13 +66,15 @@ Feature: Creation of search terms
          | N1  | 23, Rose Street |
 
     Scenario: Searching for unknown addr: tags also works for multiple words
-        Given the scene roads-with-pois
+        Given the grid
+         |    | 1 |  |    |
+         | 10 |   |  | 11 |
         And the places
-         | osm | class   | type        | housenr | addr+city        | geometry |
-         | N1  | place   | house       | 23      | Little Big Town  | :p-N1 |
+         | osm | class   | type        | housenr | addr+city        |
+         | N1  | place   | house       | 23      | Little Big Town  |
         And the places
          | osm | class   | type        | name+name   | geometry |
-         | W1  | highway | residential | Rose Street | :w-north |
+         | W1  | highway | residential | Rose Street | 10,11    |
         When importing
         Then search_name contains
          | object | nameaddress_vector |
@@ -87,13 +93,15 @@ Feature: Creation of search terms
          | N1  | 23, Rose Street |
 
      Scenario: Unnamed POI has no search entry when it has known addr: tags
-        Given the scene roads-with-pois
+        Given the grid
+         |    | 1 |  |    |
+         | 10 |   |  | 11 |
         And the places
-         | osm | class   | type        | housenr | addr+city | geometry |
-         | N1  | place   | house       | 23      | Walltown  | :p-N1 |
+         | osm | class   | type        | housenr | addr+city |
+         | N1  | place   | house       | 23      | Walltown  |
         And the places
          | osm | class   | type        | name+name   | addr+city | geometry |
-         | W1  | highway | residential | Rose Street | Walltown | :w-north |
+         | W1  | highway | residential | Rose Street | Walltown  | 10,11    |
         When importing
         Then search_name has no entry for N1
         When sending search query "23 Rose Street, Walltown"
@@ -102,29 +110,34 @@ Feature: Creation of search terms
          | N1  | 23, Rose Street |
 
     Scenario: Unnamed POI must have a house number to get a search entry
-        Given the scene roads-with-pois
+        Given the grid
+         |    | 1 |  |    |
+         | 10 |   |  | 11 |
         And the places
-         | osm | class   | type   | addr+city | geometry |
-         | N1  | place   | house  | Walltown  | :p-N1 |
+         | osm | class   | type   | addr+city |
+         | N1  | place   | house  | Walltown  |
         And the places
          | osm | class   | type        | name+name   | geometry |
-         | W1  | highway | residential | Rose Street | :w-north |
+         | W1  | highway | residential | Rose Street | 10,11    |
         When importing
         Then search_name has no entry for N1
 
     Scenario: Unnamed POIs inherit parent name when unknown addr:place is present
-        Given the scene roads-with-pois
+        Given the grid
+         | 100 |    |   |   |    | 101 |
+         |     |    | 1 |   |    |     |
+         | 103 | 10 |   |   | 11 | 102 |
         And the places
-         | osm | class   | type        | housenr | addr+place | geometry |
-         | N1  | place   | house       | 23      | Walltown   | :p-N1 |
+         | osm | class   | type        | housenr | addr+place |
+         | N1  | place   | house       | 23      | Walltown   |
         And the places
          | osm | class   | type        | name+name    | geometry |
-         | W1  | highway | residential | Rose Street  | :w-north |
-         | N2  | place   | city        | Strange Town | :p-N1 |
+         | W1  | highway | residential | Rose Street  | 10,11    |
+         | R1  | place   | city        | Strange Town | (100,101,102,103,100) |
         When importing
         Then placex contains
          | object | parent_place_id |
-         | N1     | N2              |
+         | N1     | R1              |
         When sending search query "23 Rose Street"
         Then exactly 1 results are returned
         And results contain
@@ -144,14 +157,17 @@ Feature: Creation of search terms
          | N1  | 23, Walltown, Strange Town |
 
     Scenario: Named POIs can be searched by housenumber when unknown addr:place is present
-        Given the scene roads-with-pois
+        Given the grid
+         | 100 |    |   |   |    | 101 |
+         |     |    | 1 |   |    |     |
+         | 103 | 10 |   |   | 11 | 102 |
         And the places
-         | osm | class   | type  | name       | housenr | addr+place | geometry |
-         | N1  | place   | house | Blue house | 23      | Walltown   | :p-N1 |
+         | osm | class   | type  | name       | housenr | addr+place |
+         | N1  | place   | house | Blue house | 23      | Walltown   |
         And the places
          | osm | class   | type        | name+name    | geometry |
-         | W1  | highway | residential | Rose Street  | :w-north |
-         | N2  | place   | city        | Strange Town | :p-N1 |
+         | W1  | highway | residential | Rose Street  | 10,11 |
+         | R1  | place   | city        | Strange Town | (100,101,102,103,100) |
         When importing
         When sending search query "23 Walltown, Strange Town"
         Then results contain
@@ -175,14 +191,17 @@ Feature: Creation of search terms
          | N1  | Blue house, 23, Walltown, Strange Town |
 
     Scenario: Named POIs can be found when unknown multi-word addr:place is present
-        Given the scene roads-with-pois
+        Given the grid
+         | 100 |    |   |   |    | 101 |
+         |     |    | 1 |   |    |     |
+         | 103 | 10 |   |   | 11 | 102 |
         And the places
-         | osm | class   | type  | name       | housenr | addr+place | geometry |
-         | N1  | place   | house | Blue house | 23      | Moon sun   | :p-N1 |
+         | osm | class   | type  | name       | housenr | addr+place |
+         | N1  | place   | house | Blue house | 23      | Moon sun   |
         And the places
          | osm | class   | type        | name+name    | geometry |
-         | W1  | highway | residential | Rose Street  | :w-north |
-         | N2  | place   | city        | Strange Town | :p-N1 |
+         | W1  | highway | residential | Rose Street  | 10,11    |
+         | R1  | place   | city        | Strange Town | (100,101,102,103,100) |
         When importing
         When sending search query "23 Moon Sun, Strange Town"
         Then results contain
@@ -194,14 +213,17 @@ Feature: Creation of search terms
          | N1  | Blue house, 23, Moon sun, Strange Town |
 
     Scenario: Unnamed POIs doesn't inherit parent name when addr:place is present only in parent address
-        Given the scene roads-with-pois
+        Given the grid
+         | 100 |    |   |   |    | 101 |
+         |     |    | 1 |   |    |     |
+         | 103 | 10 |   |   | 11 | 102 |
         And the places
-         | osm | class   | type        | housenr | addr+place | geometry |
-         | N1  | place   | house       | 23      | Walltown   | :p-N1 |
+         | osm | class   | type        | housenr | addr+place |
+         | N1  | place   | house       | 23      | Walltown   |
         And the places
          | osm | class   | type        | name+name    | addr+city | geometry |
-         | W1  | highway | residential | Rose Street  | Walltown  | :w-north |
-         | N2  | place   | suburb      | Strange Town | Walltown  | :p-N1 |
+         | W1  | highway | residential | Rose Street  | Walltown  | 10,11    |
+         | R1  | place   | suburb      | Strange Town | Walltown  | (100,101,102,103,100) |
         When importing
         When sending search query "23 Rose Street, Walltown"
         Then exactly 1 result is returned
@@ -215,13 +237,15 @@ Feature: Creation of search terms
          | N1  | 23, Walltown, Strange Town |
 
     Scenario: Unnamed POIs does inherit parent name when unknown addr:place and addr:street is present
-        Given the scene roads-with-pois
+        Given the grid
+         |    | 1 |  |    |
+         | 10 |   |  | 11 |
         And the places
-         | osm | class   | type   | housenr | addr+place | addr+street | geometry |
-         | N1  | place   | house  | 23      | Walltown   | Lily Street | :p-N1 |
+         | osm | class   | type   | housenr | addr+place | addr+street |
+         | N1  | place   | house  | 23      | Walltown   | Lily Street |
         And the places
          | osm | class   | type        | name+name   | geometry |
-         | W1  | highway | residential | Rose Street | :w-north |
+         | W1  | highway | residential | Rose Street | 10,11    |
         When importing
         Then search_name has no entry for N1
         When sending search query "23 Rose Street"
@@ -232,13 +256,15 @@ Feature: Creation of search terms
         Then exactly 0 results are returned
 
     Scenario: An unknown addr:street is ignored
-        Given the scene roads-with-pois
+        Given the grid
+         |    | 1 |  |    |
+         | 10 |   |  | 11 |
         And the places
-         | osm | class   | type   | housenr |  addr+street | geometry |
-         | N1  | place   | house  | 23      |  Lily Street | :p-N1 |
+         | osm | class   | type   | housenr |  addr+street |
+         | N1  | place   | house  | 23      |  Lily Street |
         And the places
          | osm | class   | type        | name+name   | geometry |
-         | W1  | highway | residential | Rose Street | :w-north |
+         | W1  | highway | residential | Rose Street | 10,11    |
         When importing
         Then search_name has no entry for N1
         When sending search query "23 Rose Street"
@@ -249,13 +275,15 @@ Feature: Creation of search terms
         Then exactly 0 results are returned
 
     Scenario: Named POIs get unknown address tags added in the search_name table
-        Given the scene roads-with-pois
+        Given the grid
+         |    | 1 |  |    |
+         | 10 |   |  | 11 |
         And the places
-         | osm | class   | type        | name+name  | housenr | addr+city | geometry |
-         | N1  | place   | house       | Green Moss | 26      | Walltown  | :p-N1 |
+         | osm | class   | type        | name+name  | housenr | addr+city |
+         | N1  | place   | house       | Green Moss | 26      | Walltown  |
         And the places
          | osm | class   | type        | name+name   | geometry |
-         | W1  | highway | residential | Rose Street | :w-north |
+         | W1  | highway | residential | Rose Street | 10,11    |
         When importing
         Then search_name contains
          | object | name_vector | nameaddress_vector |
@@ -282,14 +310,17 @@ Feature: Creation of search terms
          | N1  | Green Moss, 26, Rose Street |
 
     Scenario: Named POI doesn't inherit parent name when addr:place is present only in parent address
-        Given the scene roads-with-pois
+        Given the grid
+         | 100 |    |   |   |    | 101 |
+         |     |    | 1 |   |    |     |
+         | 103 | 10 |   |   | 11 | 102 |
         And the places
-         | osm | class   | type        | name+name  | addr+place | geometry |
-         | N1  | place   | house       | Green Moss | Walltown  | :p-N1 |
+         | osm | class   | type        | name+name  | addr+place |
+         | N1  | place   | house       | Green Moss | Walltown   |
         And the places
          | osm | class   | type        | name+name    | geometry |
-         | W1  | highway | residential | Rose Street  | :w-north |
-         | N2  | place   | suburb      | Strange Town | :p-N1 |
+         | W1  | highway | residential | Rose Street  | 10,11    |
+         | R1  | place   | suburb      | Strange Town | (100,101,102,103,100) |
         When importing
         When sending search query "Green Moss, Rose Street, Walltown"
         Then exactly 0 result is returned
@@ -299,60 +330,71 @@ Feature: Creation of search terms
          | N1  | Green Moss, Walltown, Strange Town |
 
     Scenario: Named POIs inherit address from parent
-        Given the scene roads-with-pois
+        Given the grid
+         |    | 1 |  |    |
+         | 10 |   |  | 11 |
         And the places
          | osm | class   | type        | name     | geometry |
-         | N1  | place   | house       | foo      | :p-N1 |
-         | W1  | highway | residential | the road | :w-north |
+         | N1  | place   | house       | foo      | 1        |
+         | W1  | highway | residential | the road | 10,11    |
         When importing
         Then search_name contains
          | object | name_vector | nameaddress_vector |
          | N1     | foo         | #the road |
 
     Scenario: Some addr: tags are added to address
-        Given the scene roads-with-pois
+        Given the grid
+         |    | 2 | 3 |    |
+         | 10 |   |   | 11 |
         And the places
-         | osm | class   | type        | name     | geometry |
-         | N2  | place   | city        | bonn     | 81 81 |
-         | N3  | place   | suburb      | smalltown| 80 81 |
+         | osm | class   | type        | name     |
+         | N2  | place   | city        | bonn     |
+         | N3  | place   | suburb      | smalltown|
         And the named places
          | osm | class   | type    | addr+city | addr+municipality | addr+suburb | geometry |
-         | W1  | highway | service | bonn      | New York          | Smalltown   | :w-north |
+         | W1  | highway | service | bonn      | New York          | Smalltown   | 10,11    |
         When importing
         Then search_name contains
          | object | nameaddress_vector |
          | W1     | bonn, new, york, smalltown |
 
     Scenario: A known addr:* tag is added even if the name is unknown
-        Given the scene roads-with-pois
+        Given the grid
+         | 10 | | | | 11 |
         And the places
          | osm | class   | type        | name | addr+city | geometry |
-         | W1  | highway | residential | Road | Nandu     | :w-north |
+         | W1  | highway | residential | Road | Nandu     | 10,11    |
         When importing
         Then search_name contains
          | object | nameaddress_vector |
          | W1     | nandu |
 
     Scenario: addr:postcode is not added to the address terms
-        Given the scene roads-with-pois
+        Given the grid with origin DE
+         |    | 1 |  |    |
+         | 10 |   |  | 11 |
         And the places
-         | osm | class   | type        | name+ref  | geometry |
-         | N1  | place   | state       | 12345     | 80 80 |
+         | osm | class   | type        | name+ref  |
+         | N1  | place   | state       | 12345     |
         And the named places
          | osm | class   | type        | addr+postcode | geometry |
-         | W1  | highway | residential | 12345 | :w-north |
+         | W1  | highway | residential | 12345         | 10,11    |
         When importing
         Then search_name contains not
          | object | nameaddress_vector |
          | W1     | 12345 |
 
     Scenario: a linked place does not show up in search name
+        Given the 0.01 grid
+         | 10 |   | 11 |
+         |    | 2 |    |
+         | 13 |   | 12 |
         Given the named places
          | osm  | class    | type           | admin | geometry |
-         | R13  | boundary | administrative | 9     | poly-area:0.01 |
+         | R13  | boundary | administrative | 9     | (10,11,12,13,10) |
         And the named places
-         | osm  | class    | type           | geometry |
-         | N2   | place    | city           | 0.1 0.1 |
+         | osm  | class    | type           |
+         | N2   | place    | city           |
         And the relations
          | id | members       | tags+type |
          | 13 | N2:label      | boundary |
@@ -363,12 +405,13 @@ Feature: Creation of search terms
         And search_name has no entry for N2
 
     Scenario: a linked waterway does not show up in search name
-        Given the scene split-road
+        Given the grid
+         | 1 | | 2 | | 3 |
         And the places
          | osm | class    | type  | name  | geometry |
-         | W1  | waterway | river | Rhein | :w-2 |
-         | W2  | waterway | river | Rhein | :w-3 |
-         | R13 | waterway | river | Rhein | :w-1 + :w-2 + :w-3 |
+         | W1  | waterway | river | Rhein | 1,2      |
+         | W2  | waterway | river | Rhein | 2,3      |
+         | R13 | waterway | river | Rhein | 1,2,3    |
         And the relations
          | id | members            | tags+type |
          | 13 | W1,W2:main_stream  | waterway |
diff --git a/test/bdd/db/query/housenumbers.feature b/test/bdd/db/query/housenumbers.feature
new file mode 100644 (file)
index 0000000..106bc8b
--- /dev/null
@@ -0,0 +1,327 @@
+@DB
+Feature: Searching of house numbers
+    Test for specialised treeatment of housenumbers
+
+    Background:
+        Given the grid
+         | 1 |   | 2 |   | 3 |
+         |   | 9 |   |   |   |
+         |   |   |   |   | 4 |
+
+
+    Scenario: A simple ascii digit housenumber is found
+        Given the places
+         | osm | class    | type | housenr  | geometry |
+         | N1  | building | yes  | 45       | 9        |
+        And the places
+         | osm | class   | type | name       | geometry |
+         | W10 | highway | path | North Road | 1,2,3    |
+        When importing
+        And sending search query "45, North Road"
+        Then results contain
+         | osm |
+         | N1  |
+        When sending search query "North Road 45"
+        Then results contain
+         | osm |
+         | N1  |
+
+
+    @fail-legacy
+    Scenario Outline: Numeral housenumbers in any script are found
+        Given the places
+         | osm | class    | type | housenr  | geometry |
+         | N1  | building | yes  | <number> | 9        |
+        And the places
+         | osm | class   | type | name       | geometry |
+         | W10 | highway | path | North Road | 1,2,3    |
+        When importing
+        And sending search query "45, North Road"
+        Then results contain
+         | osm |
+         | N1  |
+        When sending search query "North Road ④⑤"
+        Then results contain
+         | osm |
+         | N1  |
+        When sending search query "North Road 𑁪𑁫"
+        Then results contain
+         | osm |
+         | N1  |
+
+    Examples:
+        | number |
+        | 45     |
+        | ④⑤     |
+        | 𑁪𑁫     |
+
+
+    Scenario Outline: Each housenumber in a list is found
+        Given the places
+         | osm | class    | type | housenr | geometry |
+         | N1  | building | yes  | <hnrs>  | 9        |
+        And the places
+         | osm | class   | type | name     | geometry |
+         | W10 | highway | path | Multistr | 1,2,3    |
+        When importing
+        When sending search query "2 Multistr"
+        Then results contain
+         | osm |
+         | N1  |
+        When sending search query "4 Multistr"
+        Then results contain
+         | osm |
+         | N1  |
+        When sending search query "12 Multistr"
+        Then results contain
+         | osm |
+         | N1  |
+
+     Examples:
+        | hnrs |
+        | 2;4;12 |
+        | 2,4,12 |
+        | 2, 4, 12 |
+
+
+    @fail-legacy
+    Scenario Outline: Housenumber - letter combinations are found
+        Given the places
+         | osm | class    | type | housenr | geometry |
+         | N1  | building | yes  | <hnr>   | 9        |
+        And the places
+         | osm | class   | type | name     | geometry |
+         | W10 | highway | path | Multistr | 1,2,3    |
+        When importing
+        When sending search query "2A Multistr"
+        Then results contain
+         | osm |
+         | N1  |
+        When sending search query "2 a Multistr"
+        Then results contain
+         | osm |
+         | N1  |
+        When sending search query "2-A Multistr"
+        Then results contain
+         | osm |
+         | N1  |
+        When sending search query "Multistr 2 A"
+        Then results contain
+         | osm |
+         | N1  |
+
+    Examples:
+        | hnr |
+        | 2a  |
+        | 2 A |
+        | 2-a |
+        | 2/A |
+
+
+    Scenario Outline: Number - Number combinations as a housenumber are found
+        Given the places
+         | osm | class    | type | housenr | geometry |
+         | N1  | building | yes  | <hnr>   | 9        |
+        And the places
+         | osm | class   | type | name       | geometry |
+         | W10 | highway | path | Chester St | 1,2,3    |
+        When importing
+        When sending search query "34-10 Chester St"
+        Then results contain
+         | osm |
+         | N1  |
+        When sending search query "34/10 Chester St"
+        Then results contain
+         | osm |
+         | N1  |
+        When sending search query "34 10 Chester St"
+        Then results contain
+         | osm |
+         | N1  |
+        When sending search query "3410 Chester St"
+        Then results contain
+         | osm |
+         | W10 |
+
+    Examples:
+        | hnr   |
+        | 34-10 |
+        | 34 10 |
+        | 34/10 |
+
+
+    @fail-legacy
+    Scenario Outline: a bis housenumber is found
+        Given the places
+         | osm | class    | type | housenr | geometry |
+         | N1  | building | yes  | <hnr>   | 9        |
+        And the places
+         | osm | class   | type | name       | geometry |
+         | W10 | highway | path | Rue Paris | 1,2,3    |
+        When importing
+        When sending search query "Rue Paris 45bis"
+        Then results contain
+         | osm |
+         | N1  |
+        When sending search query "Rue Paris 45 BIS"
+        Then results contain
+         | osm |
+         | N1  |
+        When sending search query "Rue Paris 45BIS"
+        Then results contain
+         | osm |
+         | N1  |
+        When sending search query "Rue Paris 45 bis"
+        Then results contain
+         | osm |
+         | N1  |
+
+    Examples:
+        | hnr   |
+        | 45bis |
+        | 45BIS |
+        | 45 BIS |
+        | 45 bis |
+
+
+    @fail-legacy
+    Scenario Outline: a ter housenumber is found
+        Given the places
+         | osm | class    | type | housenr | geometry |
+         | N1  | building | yes  | <hnr>   | 9        |
+        And the places
+         | osm | class   | type | name       | geometry |
+         | W10 | highway | path | Rue du Berger | 1,2,3    |
+        When importing
+        When sending search query "Rue du Berger 45ter"
+        Then results contain
+         | osm |
+         | N1  |
+        When sending search query "Rue du Berger 45 TER"
+        Then results contain
+         | osm |
+         | N1  |
+        When sending search query "Rue du Berger 45TER"
+        Then results contain
+         | osm |
+         | N1  |
+        When sending search query "Rue du Berger 45 ter"
+        Then results contain
+         | osm |
+         | N1  |
+
+    Examples:
+        | hnr   |
+        | 45ter |
+        | 45TER |
+        | 45 ter |
+        | 45 TER |
+
+
+    @fail-legacy
+    Scenario Outline: a number - letter - number combination housenumber is found
+        Given the places
+         | osm | class    | type | housenr | geometry |
+         | N1  | building | yes  | <hnr>   | 9        |
+        And the places
+         | osm | class   | type | name       | geometry |
+         | W10 | highway | path | Herengracht | 1,2,3    |
+        When importing
+        When sending search query "501-H 1 Herengracht"
+        Then results contain
+         | osm |
+         | N1  |
+        When sending search query "501H-1 Herengracht"
+        Then results contain
+         | osm |
+         | N1  |
+        When sending search query "501H1 Herengracht"
+        Then results contain
+         | osm |
+         | N1  |
+        When sending search query "501-H1 Herengracht"
+        Then results contain
+         | osm |
+         | N1  |
+
+    Examples:
+        | hnr |
+        | 501 H1 |
+        | 501H 1 |
+        | 501/H/1 |
+        | 501h1 |
+
+
+    @fail-legacy
+    Scenario Outline: Russian housenumbers are found
+        Given the places
+         | osm | class    | type | housenr | geometry |
+         | N1  | building | yes  | <hnr>   | 9        |
+        And the places
+         | osm | class   | type | name       | geometry |
+         | W10 | highway | path | Голубинская улица | 1,2,3    |
+        When importing
+        When sending search query "Голубинская улица 55к3"
+        Then results contain
+         | osm |
+         | N1  |
+        When sending search query "Голубинская улица 55 k3"
+        Then results contain
+         | osm |
+         | N1  |
+        When sending search query "Голубинская улица 55 к-3"
+        Then results contain
+         | osm |
+         | N1  |
+
+    Examples:
+        | hnr |
+        | 55к3 |
+        | 55 к3 |
+
+
+    Scenario: A name mapped as a housenumber is found
+        Given the places
+         | osm | class    | type | housenr | geometry |
+         | N1  | building | yes  | Warring | 9        |
+        And the places
+         | osm | class   | type | name       | geometry |
+         | W10 | highway | path | Chester St | 1,2,3    |
+        When importing
+        When sending search query "Chester St Warring"
+        Then results contain
+         | osm |
+         | N1  |
+
+
+    Scenario: Interpolations are found according to their type
+        Given the grid
+         | 10  |  | 11  |
+         | 100 |  | 101 |
+         | 20  |  | 21  |
+        And the places
+         | osm  | class   | type        | name    | geometry |
+         | W100 | highway | residential | Ringstr | 100, 101 |
+        And the places
+         | osm | class | type   | addr+interpolation | geometry |
+         | W10 | place | houses | even               | 10, 11   |
+         | W20 | place | houses | odd                | 20, 21   |
+        And the places
+         | osm | class | type  | housenr | geometry |
+         | N10 | place | house | 10      | 10 |
+         | N11 | place | house | 20      | 11 |
+         | N20 | place | house | 11      | 20 |
+         | N21 | place | house | 21      | 21 |
+        And the ways
+         | id | nodes |
+         | 10 | 10, 11 |
+         | 20 | 20, 21 |
+        When importing
+        When sending search query "Ringstr 12"
+        Then results contain
+         | osm |
+         | W10 |
+        When sending search query "Ringstr 13"
+        Then results contain
+         | osm |
+         | W20 |
diff --git a/test/bdd/db/query/interpolation.feature b/test/bdd/db/query/interpolation.feature
new file mode 100644 (file)
index 0000000..602ac43
--- /dev/null
@@ -0,0 +1,58 @@
+@DB
+Feature: Query of address interpolations
+    Tests that interpolated addresses can be queried correctly
+
+    Background:
+        Given the grid
+          | 1  |  | 2  |  | 3  |
+          | 10 |  | 12 |  | 13 |
+          | 7  |  | 8  |  | 9  |
+
+    Scenario: Find interpolations with single number
+        Given the places
+          | osm | class   | type    | name    | geometry |
+          | W10 | highway | primary | Nickway | 10,12,13 |
+        And the places
+          | osm | class | type   | addr+interpolation | geometry |
+          | W1  | place | houses | odd                | 1,3      |
+        And the places
+          | osm | class | type  | housenr | geometry |
+          | N1  | place | house | 1       | 1        |
+          | N3  | place | house | 5       | 3        |
+        And the ways
+          | id | nodes |
+          | 1  | 1,3   |
+        When importing
+        When sending jsonv2 reverse point 2
+        Then results contain
+          | ID | display_name |
+          | 0  | 3, Nickway   |
+        When sending search query "Nickway 3"
+        Then results contain
+          | osm | display_name |
+          | W1  | 3, Nickway   |
+
+
+    Scenario: Find interpolations with multiple numbers
+        Given the places
+          | osm | class   | type    | name    | geometry |
+          | W10 | highway | primary | Nickway | 10,12,13 |
+        And the places
+          | osm | class | type   | addr+interpolation | geometry |
+          | W1  | place | houses | even               | 1,3      |
+        And the places
+          | osm | class | type  | housenr | geometry |
+          | N1  | place | house | 2       | 1        |
+          | N3  | place | house | 16      | 3        |
+        And the ways
+          | id | nodes |
+          | 1  | 1,3   |
+        When importing
+        When sending jsonv2 reverse point 2
+        Then results contain
+          | ID | display_name | centroid |
+          | 0  | 10, Nickway  | 2 |
+        When sending search query "Nickway 10"
+        Then results contain
+          | osm | display_name  | centroid |
+          | W1  | 10, Nickway   | 2 |
index 4e6c47d88e77056ccf13acdc514a0334f0afd917..351f88710bd0c14de08b99a6e67e0e14b5c444d4 100644 (file)
@@ -3,12 +3,16 @@ Feature: Searching linked places
     Tests that information from linked places can be searched correctly
 
     Scenario: Additional names from linked places are searchable
+        Given the 0.1 grid
+         | 10 |   | 11 |
+         |    | 2 |    |
+         | 13 |   | 12 |
         Given the places
          | osm  | class    | type           | admin | name  | geometry |
-         | R13  | boundary | administrative | 6     | Garbo | poly-area:0.1 |
+         | R13  | boundary | administrative | 6     | Garbo | (10,11,12,13,10) |
         Given the places
-         | osm  | class    | type           | admin | name+name:it | geometry |
-         | N2   | place    | hamlet         | 15    | Vario        | 0.006 0.00001 |
+         | osm  | class    | type           | admin | name+name:it |
+         | N2   | place    | hamlet         | 15    | Vario        |
         And the relations
          | id | members       | tags+type |
          | 13 | N2:label      | boundary |
@@ -17,6 +21,44 @@ Feature: Searching linked places
          | object  | linked_place_id |
          | N2      | R13 |
         When sending search query "Vario"
+         | namedetails |
+         | 1 |
         Then results contain
-         | osm |
-         | R13 |
+         | osm | display_name | namedetails |
+         | R13 | Garbo | "name": "Garbo", "name:it": "Vario" |
+        When sending search query "Vario"
+         | accept-language |
+         | it |
+        Then results contain
+         | osm | display_name |
+         | R13 | Vario |
+
+
+    Scenario: Differing names from linked places are searchable
+        Given the 0.1 grid
+         | 10 |   | 11 |
+         |    | 2 |    |
+         | 13 |   | 12 |
+        Given the places
+         | osm  | class    | type           | admin | name  | geometry |
+         | R13  | boundary | administrative | 6     | Garbo | (10,11,12,13,10) |
+        Given the places
+         | osm  | class    | type           | admin | name  |
+         | N2   | place    | hamlet         | 15    | Vario |
+        And the relations
+         | id | members       | tags+type |
+         | 13 | N2:label      | boundary |
+        When importing
+        Then placex contains
+         | object  | linked_place_id |
+         | N2      | R13 |
+        When sending search query "Vario"
+         | namedetails |
+         | 1 |
+        Then results contain
+         | osm | display_name | namedetails |
+         | R13 | Garbo        | "name": "Garbo", "_place_name": "Vario" |
+        When sending search query "Garbo"
+        Then results contain
+         | osm | display_name |
+         | R13 | Garbo |
index 304496e2aca8fb0732169f4ae95c70ed64bf5465..e5a7a5922b7f18db1abc4fb7a497b01348747938 100644 (file)
@@ -138,10 +138,13 @@ Feature: Import and search of names
          | 0  | N3 |
 
     Scenario: Landuse with name are found
+        Given the grid
+          | 1 | 2 |
+          | 3 |   |
         Given the places
           | osm | class    | type        | name     | geometry |
-          | R1  | natural  | meadow      | landuse1 | (0 0, 1 0, 1 1, 0 1, 0 0) |
-          | R2  | landuse  | industrial  | landuse2 | (0 0, -1 0, -1 -1, 0 -1, 0 0) |
+          | R1  | natural  | meadow      | landuse1 | (1,2,3,1) |
+          | R2  | landuse  | industrial  | landuse2 | (2,3,1,2) |
         When importing
         When sending search query "landuse1"
         Then results contain
@@ -153,23 +156,18 @@ Feature: Import and search of names
          | 0  | R2 |
 
     Scenario: Postcode boundaries without ref
+        Given the grid with origin FR
+          |   | 2 |   |
+          | 1 |   | 3 |
         Given the places
           | osm | class    | type        | postcode | geometry |
-          | R1  | boundary | postal_code | 12345    | (0 0, 1 0, 1 1, 0 1, 0 0) |
+          | R1  | boundary | postal_code | 12345    | (1,2,3,1) |
         When importing
         When sending search query "12345"
         Then results contain
          | ID | osm |
          | 0  | R1 |
 
-    Scenario: Unprintable characters in postcodes are ignored
-        Given the named places
-            | osm  | class   | type   | address |
-            | N234 | amenity | prison | 'postcode' : u'1234\u200e' |
-        When importing
-        And sending search query "1234"
-        Then result 0 has not attributes osm_type
-
     Scenario Outline: Housenumbers with special characters are found
         Given the grid
             | 1 |  |   |  | 2 |
diff --git a/test/bdd/db/query/postcodes.feature b/test/bdd/db/query/postcodes.feature
new file mode 100644 (file)
index 0000000..a3ca703
--- /dev/null
@@ -0,0 +1,97 @@
+@DB
+Feature: Querying fo postcode variants
+
+    Scenario: Postcodes in Singapore (6-digit postcode)
+        Given the grid with origin SG
+            | 10 |   |   |   | 11 |
+        And the places
+            | osm | class   | type | name   | addr+postcode | geometry |
+            | W1  | highway | path | Lorang | 399174        | 10,11    |
+        When importing
+        When sending search query "399174"
+        Then results contain
+            | ID | type     | display_name |
+            | 0  | postcode | 399174       |
+
+
+    @fail-legacy
+    Scenario Outline: Postcodes in the Netherlands (mixed postcode with spaces)
+        Given the grid with origin NL
+            | 10 |   |   |   | 11 |
+        And the places
+            | osm | class   | type | name     | addr+postcode | geometry |
+            | W1  | highway | path | De Weide | 3993 DX       | 10,11    |
+        When importing
+        When sending search query "3993 DX"
+        Then results contain
+            | ID | type     | display_name |
+            | 0  | postcode | 3993 DX      |
+        When sending search query "3993dx"
+        Then results contain
+            | ID | type     | display_name |
+            | 0  | postcode | 3993 DX      |
+
+        Examples:
+            | postcode |
+            | 3993 DX  |
+            | 3993DX   |
+            | 3993 dx  |
+
+
+    @fail-legacy
+    Scenario: Postcodes in Singapore (6-digit postcode)
+        Given the grid with origin SG
+            | 10 |   |   |   | 11 |
+        And the places
+            | osm | class   | type | name   | addr+postcode | geometry |
+            | W1  | highway | path | Lorang | 399174        | 10,11    |
+        When importing
+        When sending search query "399174"
+        Then results contain
+            | ID | type     | display_name |
+            | 0  | postcode | 399174       |
+
+
+    @fail-legacy
+    Scenario Outline: Postcodes in Andorra (with country code)
+        Given the grid with origin AD
+            | 10 |   |   |   | 11 |
+        And the places
+            | osm | class   | type | name   | addr+postcode | geometry |
+            | W1  | highway | path | Lorang | <postcode>    | 10,11    |
+        When importing
+        When sending search query "675"
+        Then results contain
+            | ID | type     | display_name |
+            | 0  | postcode | AD675        |
+        When sending search query "AD675"
+        Then results contain
+            | ID | type     | display_name |
+            | 0  | postcode | AD675        |
+
+        Examples:
+            | postcode |
+            | 675      |
+            | AD 675   |
+            | AD675    |
+
+
+    Scenario: Different postcodes with the same normalization can both be found
+        Given the places
+           | osm | class | type  | addr+postcode | addr+housenumber | geometry |
+           | N34 | place | house | EH4 7EA       | 111              | country:gb |
+           | N35 | place | house | E4 7EA        | 111              | country:gb |
+        When importing
+        Then location_postcode contains exactly
+           | country | postcode | geometry |
+           | gb      | EH4 7EA  | country:gb |
+           | gb      | E4 7EA   | country:gb |
+        When sending search query "EH4 7EA"
+        Then results contain
+           | type     | display_name |
+           | postcode | EH4 7EA      |
+        When sending search query "E4 7EA"
+        Then results contain
+           | type     | display_name |
+           | postcode | E4 7EA       |
+
index bcd73eaf8cc0767ef2fd71f40ff9b4f3d7247fb7..5fef313214bf2f2f7ba78d06fe3e0468c857a847 100644 (file)
@@ -13,9 +13,12 @@ Feature: Searching of simple objects
          | 0  | N1  | place    | village | 10 -10   |
 
      Scenario: Updating postcode in postcode boundaries without ref
+        Given the grid
+          | 1 | 2 |
+          | 4 | 3 |
         Given the places
           | osm | class    | type        | postcode | geometry |
-          | R1  | boundary | postal_code | 12345    | poly-area:1.0 |
+          | R1  | boundary | postal_code | 12345    | (1,2,3,4,1) |
         When importing
         And sending search query "12345"
         Then results contain
@@ -23,9 +26,9 @@ Feature: Searching of simple objects
          | 0  | R1 |
         When updating places
           | osm | class    | type        | postcode | geometry |
-          | R1  | boundary | postal_code | 54321    | poly-area:1.0 |
+          | R1  | boundary | postal_code | 54321    | (1,2,3,4,1) |
         And sending search query "12345"
-        Then result 0 has not attributes osm_type
+        Then exactly 0 results are returned
         When sending search query "54321"
         Then results contain
          | ID | osm |
diff --git a/test/bdd/db/update/country.feature b/test/bdd/db/update/country.feature
new file mode 100644 (file)
index 0000000..794b0d0
--- /dev/null
@@ -0,0 +1,112 @@
+@DB
+Feature: Country handling
+    Tests for update of country information
+
+    Background:
+        Given the 1.0 grid with origin DE
+            | 1 |    | 2 |
+            |   | 10 |   |
+            | 4 |    | 3 |
+
+    @fail-legacy
+    Scenario: When country names are changed old ones are no longer searchable
+        Given the places
+            | osm | class    | type           | admin | name+name:xy | country | geometry |
+            | R1  | boundary | administrative | 2     | Loudou       | de      | (1,2,3,4,1) |
+        Given the places
+            | osm | class    | type          | name  |
+            | N10 | place    | town          | Wenig |
+        When importing
+        When sending search query "Wenig, Loudou"
+        Then results contain
+            | osm |
+            | N10 |
+        When updating places
+            | osm | class    | type           | admin | name+name:xy | country | geometry |
+            | R1  | boundary | administrative | 2     | Germany      | de      | (1,2,3,4,1) |
+        When sending search query "Wenig, Loudou"
+        Then exactly 0 results are returned
+
+    @fail-legacy
+    Scenario: When country names are deleted they are no longer searchable
+        Given the places
+            | osm | class    | type           | admin | name+name:xy | country | geometry |
+            | R1  | boundary | administrative | 2     | Loudou       | de      | (1,2,3,4,1) |
+        Given the places
+            | osm | class    | type          | name  |
+            | N10 | place    | town          | Wenig |
+        When importing
+        When sending search query "Wenig, Loudou"
+        Then results contain
+            | osm |
+            | N10 |
+        When updating places
+            | osm | class    | type           | admin | name+name:en | country | geometry |
+            | R1  | boundary | administrative | 2     | Germany      | de      | (1,2,3,4,1) |
+        When sending search query "Wenig, Loudou"
+        Then exactly 0 results are returned
+        When sending search query "Wenig"
+            | accept-language |
+            | xy,en |
+        Then results contain
+            | osm | display_name |
+            | N10 | Wenig, Germany |
+
+
+    Scenario: Default country names are always searchable
+        Given the places
+            | osm | class    | type          | name  |
+            | N10 | place    | town          | Wenig |
+        When importing
+        When sending search query "Wenig, Germany"
+        Then results contain
+            | osm |
+            | N10 |
+        When sending search query "Wenig, de"
+        Then results contain
+            | osm |
+            | N10 |
+        When updating places
+            | osm  | class    | type           | admin | name+name:en | country | geometry |
+            | R1   | boundary | administrative | 2     | Lilly        | de      | (1,2,3,4,1) |
+        When sending search query "Wenig, Germany"
+            | accept-language |
+            | en,de |
+        Then results contain
+            | osm | display_name |
+            | N10 | Wenig, Lilly |
+        When sending search query "Wenig, de"
+            | accept-language |
+            | en,de |
+        Then results contain
+            | osm | display_name |
+            | N10 | Wenig, Lilly |
+
+
+    @fail-legacy
+    Scenario: When a localised name is deleted, the standard name takes over
+        Given the places
+            | osm | class    | type           | admin | name+name:de | country | geometry |
+            | R1  | boundary | administrative | 2     | Loudou       | de      | (1,2,3,4,1) |
+        Given the places
+            | osm | class    | type          | name  |
+            | N10 | place    | town          | Wenig |
+        When importing
+        When sending search query "Wenig, Loudou"
+            | accept-language |
+            | de,en |
+        Then results contain
+            | osm | display_name |
+            | N10 | Wenig, Loudou |
+        When updating places
+            | osm | class    | type           | admin | name+name:en | country | geometry |
+            | R1  | boundary | administrative | 2     | Germany      | de      | (1,2,3,4,1) |
+        When sending search query "Wenig, Loudou"
+        Then exactly 0 results are returned
+        When sending search query "Wenig"
+            | accept-language |
+            | de,en |
+        Then results contain
+            | osm | display_name |
+            | N10 | Wenig, Deutschland |
+
index 27ac552e4d907315b2c711d756ddefdc317bf9b5..ac6b8a4470220901121ed4b32599594011b9e969 100644 (file)
@@ -3,47 +3,55 @@ Feature: Update of address interpolations
     Test the interpolated address are updated correctly
 
     Scenario: new interpolation added to existing street
-      Given the scene parallel-road
+      Given the grid
+          | 10 |   |    |   | 11 |
+          |    | 1 | 99 | 2 |    |
+          |    |   |    |   |    |
+          | 20 |   |    |   | 21 |
       And the places
           | osm | class   | type         | name         | geometry |
-          | W2  | highway | unclassified | Sun Way      | :w-north |
-          | W3  | highway | unclassified | Cloud Street | :w-south |
+          | W2  | highway | unclassified | Sun Way      | 10,11    |
+          | W3  | highway | unclassified | Cloud Street | 20,21    |
       And the ways
           | id  | nodes |
-          | 10  | 1,100,101,102,2 |
+          | 10  | 1,2   |
       When importing
       Then W10 expands to no interpolation
       When updating places
-          | osm | class | type  | housenr | geometry |
-          | N1  | place | house | 2       | :n-middle-w |
-          | N2  | place | house | 6       | :n-middle-e |
+          | osm | class | type  | housenr |
+          | N1  | place | house | 2       |
+          | N2  | place | house | 6       |
       And updating places
           | osm | class | type   | addr+interpolation | geometry |
-          | W10 | place | houses | even               | :w-middle |
+          | W10 | place | houses | even               | 1,2      |
       Then placex contains
           | object | parent_place_id |
           | N1     | W2 |
           | N2     | W2 |
       And W10 expands to interpolation
-          | parent_place_id | start | end |
-          | W2              | 2     | 6 |
+          | parent_place_id | start | end | geometry |
+          | W2              | 4     | 4   | 99       |
 
     Scenario: addr:street added to interpolation
-      Given the scene parallel-road
+      Given the grid
+          | 10 |   |    |   | 11 |
+          |    | 1 |    | 2 |    |
+          |    |   |    |   |    |
+          | 20 |   |    |   | 21 |
       And the places
-          | osm | class | type  | housenr | geometry |
-          | N1  | place | house | 2       | :n-middle-w |
-          | N2  | place | house | 6       | :n-middle-e |
+          | osm | class | type  | housenr |
+          | N1  | place | house | 2       |
+          | N2  | place | house | 6       |
       And the places
           | osm | class | type   | addr+interpolation | geometry |
-          | W10 | place | houses | even   | :w-middle |
+          | W10 | place | houses | even               | 1,2      |
       And the places
           | osm | class   | type         | name         | geometry |
-          | W2  | highway | unclassified | Sun Way      | :w-north |
-          | W3  | highway | unclassified | Cloud Street | :w-south |
+          | W2  | highway | unclassified | Sun Way      | 10,11    |
+          | W3  | highway | unclassified | Cloud Street | 20,21    |
       And the ways
           | id  | nodes |
-          | 10  | 1,100,101,102,2 |
+          | 10  | 1,2 |
       When importing
       Then placex contains
           | object | parent_place_id |
@@ -51,34 +59,38 @@ Feature: Update of address interpolations
           | N2     | W2 |
       And W10 expands to interpolation
           | parent_place_id | start | end |
-          | W2              | 2     | 6 |
+          | W2              | 4     | 4   |
       When updating places
           | osm | class   | type    | addr+interpolation | street       | geometry |
-          | W10 | place   | houses  | even    | Cloud Street | :w-middle |
+          | W10 | place   | houses  | even               | Cloud Street | 1,2      |
       Then placex contains
           | object | parent_place_id |
           | N1     | W3 |
           | N2     | W3 |
       And W10 expands to interpolation
           | parent_place_id | start | end |
-          | W3              | 2     | 6 |
+          | W3              | 4     | 4   |
 
     Scenario: addr:street added to housenumbers
-      Given the scene parallel-road
+      Given the grid
+          | 10 |   |    |   | 11 |
+          |    | 1 |    | 2 |    |
+          |    |   |    |   |    |
+          | 20 |   |    |   | 21 |
       And the places
-          | osm | class | type  | housenr | geometry |
-          | N1  | place | house | 2       | :n-middle-w |
-          | N2  | place | house | 6       | :n-middle-e |
+          | osm | class | type  | housenr |
+          | N1  | place | house | 2       |
+          | N2  | place | house | 6       |
       And the places
           | osm | class | type   | addr+interpolation | geometry |
-          | W10 | place | houses | even   | :w-middle |
+          | W10 | place | houses | even               | 1,2      |
       And the places
           | osm | class   | type         | name         | geometry |
-          | W2  | highway | unclassified | Sun Way      | :w-north |
-          | W3  | highway | unclassified | Cloud Street | :w-south |
+          | W2  | highway | unclassified | Sun Way      | 10,11    |
+          | W3  | highway | unclassified | Cloud Street | 20,21    |
       And the ways
           | id  | nodes |
-          | 10  | 1,100,101,102,2 |
+          | 10  | 1,2 |
       When importing
       Then placex contains
           | object | parent_place_id |
@@ -86,35 +98,39 @@ Feature: Update of address interpolations
           | N2     | W2 |
       And W10 expands to interpolation
           | parent_place_id | start | end |
-          | W2              | 2     | 6 |
+          | W2              | 4     | 4 |
       When updating places
-          | osm | class | type  | street      | housenr | geometry |
-          | N1  | place | house | Cloud Street| 2       | :n-middle-w |
-          | N2  | place | house | Cloud Street| 6       | :n-middle-e |
+          | osm | class | type  | street      | housenr |
+          | N1  | place | house | Cloud Street| 2       |
+          | N2  | place | house | Cloud Street| 6       |
       Then placex contains
           | object | parent_place_id |
           | N1     | W3 |
           | N2     | W3 |
       And W10 expands to interpolation
           | parent_place_id | start | end |
-          | W3              | 2     | 6 |
+          | W3              | 4     | 4   |
 
     Scenario: interpolation tag removed
-      Given the scene parallel-road
+      Given the grid
+          | 10 |   |    |   | 11 |
+          |    | 1 |    | 2 |    |
+          |    |   |    |   |    |
+          | 20 |   |    |   | 21 |
       And the places
-          | osm | class | type  | housenr | geometry |
-          | N1  | place | house | 2       | :n-middle-w |
-          | N2  | place | house | 6       | :n-middle-e |
+          | osm | class | type  | housenr |
+          | N1  | place | house | 2       |
+          | N2  | place | house | 6       |
       And the places
           | osm | class | type   | addr+interpolation | geometry |
-          | W10 | place | houses | even   | :w-middle |
+          | W10 | place | houses | even               | 1,2      |
       And the places
           | osm | class   | type         | name         | geometry |
-          | W2  | highway | unclassified | Sun Way      | :w-north |
-          | W3  | highway | unclassified | Cloud Street | :w-south |
+          | W2  | highway | unclassified | Sun Way      | 10,11    |
+          | W3  | highway | unclassified | Cloud Street | 20,21    |
       And the ways
           | id  | nodes |
-          | 10  | 1,100,101,102,2 |
+          | 10  | 1,2 |
       When importing
       Then placex contains
           | object | parent_place_id |
@@ -122,7 +138,7 @@ Feature: Update of address interpolations
           | N2     | W2 |
       And W10 expands to interpolation
           | parent_place_id | start | end |
-          | W2              | 2     | 6 |
+          | W2              | 4     | 4   |
       When marking for delete W10
       Then W10 expands to no interpolation
       And placex contains
@@ -131,20 +147,24 @@ Feature: Update of address interpolations
           | N2     | W2 |
 
     Scenario: referenced road added
-      Given the scene parallel-road
+      Given the grid
+          | 10 |   |    |   | 11 |
+          |    | 1 |    | 2 |    |
+          |    |   |    |   |    |
+          | 20 |   |    |   | 21 |
       And the places
-          | osm | class | type  | housenr | geometry |
-          | N1  | place | house | 2       | :n-middle-w |
-          | N2  | place | house | 6       | :n-middle-e |
+          | osm | class | type  | housenr |
+          | N1  | place | house | 2       |
+          | N2  | place | house | 6       |
       And the places
           | osm | class   | type    | addr+interpolation | street      | geometry |
-          | W10 | place   | houses  | even    | Cloud Street| :w-middle |
+          | W10 | place   | houses  | even               | Cloud Street| 1,2      |
       And the places
           | osm | class   | type         | name     | geometry |
-          | W2  | highway | unclassified | Sun Way  | :w-north |
+          | W2  | highway | unclassified | Sun Way  | 10,11    |
       And the ways
           | id  | nodes |
-          | 10  | 1,100,101,102,2 |
+          | 10  | 1,2   |
       When importing
       Then placex contains
           | object | parent_place_id |
@@ -152,34 +172,38 @@ Feature: Update of address interpolations
           | N2     | W2 |
       And W10 expands to interpolation
           | parent_place_id | start | end |
-          | W2              | 2     | 6 |
+          | W2              | 4     | 4 |
       When updating places
           | osm | class   | type         | name         | geometry |
-          | W3  | highway | unclassified | Cloud Street | :w-south |
+          | W3  | highway | unclassified | Cloud Street | 20,21    |
       Then placex contains
           | object | parent_place_id |
           | N1     | W3 |
           | N2     | W3 |
       And W10 expands to interpolation
           | parent_place_id | start | end |
-          | W3              | 2     | 6 |
+          | W3              | 4     | 4   |
 
     Scenario: referenced road deleted
-      Given the scene parallel-road
+      Given the grid
+          | 10 |   |    |   | 11 |
+          |    | 1 |    | 2 |    |
+          |    |   |    |   |    |
+          | 20 |   |    |   | 21 |
       And the places
-          | osm | class | type  | housenr | geometry |
-          | N1  | place | house | 2       | :n-middle-w |
-          | N2  | place | house | 6       | :n-middle-e |
+          | osm | class | type  | housenr |
+          | N1  | place | house | 2       |
+          | N2  | place | house | 6       |
       And the places
           | osm | class   | type    | addr+interpolation | street      | geometry |
-          | W10 | place   | houses  | even    | Cloud Street| :w-middle |
+          | W10 | place   | houses  | even               | Cloud Street| 1,2      |
       And the places
           | osm | class   | type         | name         | geometry |
-          | W2  | highway | unclassified | Sun Way      | :w-north |
-          | W3  | highway | unclassified | Cloud Street | :w-south |
+          | W2  | highway | unclassified | Sun Way      | 10,11    |
+          | W3  | highway | unclassified | Cloud Street | 20,21    |
       And the ways
           | id  | nodes |
-          | 10  | 1,100,101,102,2 |
+          | 10  | 1,2 |
       When importing
       Then placex contains
           | object | parent_place_id |
@@ -187,7 +211,7 @@ Feature: Update of address interpolations
           | N2     | W3 |
       And W10 expands to interpolation
           | parent_place_id | start | end |
-          | W3              | 2     | 6 |
+          | W3              | 4     | 4   |
       When marking for delete W3
       Then placex contains
           | object | parent_place_id |
@@ -195,85 +219,91 @@ Feature: Update of address interpolations
           | N2     | W2 |
       And W10 expands to interpolation
           | parent_place_id | start | end |
-          | W2              | 2     | 6 |
+          | W2              | 4     | 4   |
 
     Scenario: building becomes interpolation
-      Given the scene building-with-parallel-streets
+      Given the grid
+          | 10 |   |    |   | 11 |
+          |    | 1 |    | 2 |    |
+          |    | 4 |    | 3 |    |
       And the places
-          | osm | class    | type  | housenr | geometry |
-          | W1  | place    | house | 3       | :w-building |
+          | osm | class    | type  | housenr | geometry    |
+          | W1  | place    | house | 3       | (1,2,3,4,1) |
       And the places
           | osm | class   | type         | name         | geometry |
-          | W2  | highway | unclassified | Cloud Street | :w-south |
+          | W2  | highway | unclassified | Cloud Street | 10,11    |
       When importing
       Then placex contains
           | object | parent_place_id |
           | W1     | W2 |
       Given the ways
           | id  | nodes |
-          | 1   | 1,100,101,102,2 |
+          | 1   | 1,2   |
       When updating places
-          | osm | class | type  | housenr | geometry |
-          | N1  | place | house | 2       | :n-north-w |
-          | N2  | place | house | 6       | :n-north-e |
+          | osm | class | type  | housenr |
+          | N1  | place | house | 2       |
+          | N2  | place | house | 6       |
       And updating places
           | osm | class   | type    | addr+interpolation | street      | geometry |
-          | W1  | place   | houses  | even    | Cloud Street| :w-north |
+          | W1  | place   | houses  | even               | Cloud Street| 1,2      |
       Then placex has no entry for W1
       And W1 expands to interpolation
           | parent_place_id | start | end |
-          | W2              | 2     | 6 |
+          | W2              | 4     | 4   |
 
     Scenario: interpolation becomes building
-      Given the scene building-with-parallel-streets
+      Given the grid
+          | 10 |   |    |   | 11 |
+          |    | 1 |    | 2 |    |
+          |    | 4 |    | 3 |    |
       And the places
-          | osm | class | type  | housenr | geometry |
-          | N1  | place | house | 2       | :n-north-w |
-          | N2  | place | house | 6       | :n-north-e |
+          | osm | class | type  | housenr |
+          | N1  | place | house | 2       |
+          | N2  | place | house | 6       |
       And the places
           | osm | class   | type         | name         | geometry |
-          | W2  | highway | unclassified | Cloud Street | :w-south |
+          | W2  | highway | unclassified | Cloud Street | 10,11    |
       And the ways
           | id  | nodes |
-          | 1   | 1,100,101,102,2 |
+          | 1   | 1,2 |
       And the places
           | osm | class   | type    | addr+interpolation | street      | geometry |
-          | W1  | place   | houses  | even    | Cloud Street| :w-north |
+          | W1  | place   | houses  | even               | Cloud Street| 1,2      |
       When importing
       Then placex has no entry for W1
       And W1 expands to interpolation
           | parent_place_id | start | end |
-          | W2              | 2     | 6 |
+          | W2              | 4     | 4   |
       When updating places
-          | osm | class    | type  | housenr | geometry |
-          | W1  | place    | house | 3       | :w-building |
+          | osm | class    | type  | housenr | geometry    |
+          | W1  | place    | house | 3       | (1,2,3,4,1) |
       Then placex contains
           | object | parent_place_id |
           | W1     | W2 |
+      And W1 expands to no interpolation
 
     Scenario: housenumbers added to interpolation
-      Given the scene building-with-parallel-streets
+      Given the grid
+          | 10 |   |    |   | 11 |
+          |    | 1 |    | 2 |    |
       And the places
           | osm | class   | type         | name         | geometry |
-          | W2  | highway | unclassified | Cloud Street | :w-south |
+          | W2  | highway | unclassified | Cloud Street | 10,11    |
       And the ways
           | id  | nodes |
-          | 1   | 1,100,101,102,2 |
+          | 1   | 1,2 |
       And the places
           | osm | class   | type    | addr+interpolation | geometry |
-          | W1  | place   | houses  | even    | :w-north |
+          | W1  | place   | houses  | even               | 1,2 |
       When importing
       Then W1 expands to no interpolation
       When updating places
-          | osm | class | type  | housenr | geometry |
-          | N1  | place | house | 2       | :n-north-w |
-          | N2  | place | house | 6       | :n-north-e |
-      And updating places
-          | osm | class   | type    | addr+interpolation | street      | geometry |
-          | W1  | place   | houses  | even    | Cloud Street| :w-north |
+          | osm | class | type  | housenr |
+          | N1  | place | house | 2       |
+          | N2  | place | house | 6       |
       Then W1 expands to interpolation
           | parent_place_id | start | end |
-          | W2              | 2     | 6 |
+          | W2              | 4     | 4   |
 
     Scenario: housenumber added in middle of interpolation
       Given the grid
@@ -294,15 +324,15 @@ Feature: Update of address interpolations
           | N5  | place | house | 10      |
       When importing
       Then W2 expands to interpolation
-          | parent_place_id | start | end | geometry |
-          | W1              | 2     | 10  | 3,4,5    |
+          | parent_place_id | start | end |
+          | W1              | 4     | 8  |
       When updating places
           | osm | class | type  | housenr |
           | N4  | place | house | 6       |
       Then W2 expands to interpolation
-          | parent_place_id | start | end | geometry |
-          | W1              | 2     | 6   | 3,4      |
-          | W1              | 6     | 10  | 4,5      |
+          | parent_place_id | start | end |
+          | W1              | 4     | 4   |
+          | W1              | 8     | 8   |
 
     @Fail
     Scenario: housenumber removed in middle of interpolation
@@ -325,13 +355,13 @@ Feature: Update of address interpolations
           | N5  | place | house | 10      |
       When importing
       Then W2 expands to interpolation
-          | parent_place_id | start | end | geometry |
-          | W1              | 2     | 6   | 3,4      |
-          | W1              | 6     | 10  | 4,5      |
+          | parent_place_id | start | end |
+          | W1              | 4     | 4   |
+          | W1              | 8     | 8   |
       When marking for delete N4
       Then W2 expands to interpolation
-          | parent_place_id | start | end | geometry |
-          | W1              | 2     | 10  | 3,4,5    |
+          | parent_place_id | start | end |
+          | W1              | 4     | 8   |
 
     Scenario: Change the start housenumber
       Given the grid
@@ -352,12 +382,12 @@ Feature: Update of address interpolations
           | N4  | place | house | 6       |
       When importing
       Then W2 expands to interpolation
-          | parent_place_id | start | end | geometry |
-          | W1              | 2     | 6   | 3,4      |
+          | parent_place_id | start | end |
+          | W1              | 4     | 4   |
       When updating places
           | osm | class | type  | housenr |
           | N4  | place | house | 8       |
       Then W2 expands to interpolation
-          | parent_place_id | start | end | geometry |
-          | W1              | 2     | 8   | 3,4      |
+          | parent_place_id | start | end |
+          | W1              | 4     | 6   |
 
index 7a0fa21a829667102a177e9abf3ad3671cd7c1a2..c277e8bd1e69c47f0f256dcecadcdff8030c4996 100644 (file)
@@ -2,15 +2,45 @@
 Feature: Updates of linked places
     Tests that linked places are correctly added and deleted.
 
+    Scenario: Linking is kept when boundary is updated
+        Given the 0.1 grid
+         | 10 |   | 11 |
+         |    | 1 |    |
+         | 13 |   | 12 |
+        Given the places
+            | osm | class | type | name |
+            | N1  | place | city | foo  |
+        And the places
+            | osm | class    | type           | name | admin | geometry |
+            | R1  | boundary | administrative | foo  | 8     | (10,11,12,13,10) |
+        When importing
+        Then placex contains
+         | object | linked_place_id |
+         | N1     | R1 |
+        When updating places
+         | osm | class    | type           | name | name+name:de | admin | geometry |
+         | R1  | boundary | administrative | foo  | Dingens      | 8     | (10,11,12,13,10) |
+        Then placex contains
+         | object | linked_place_id |
+         | N1     | R1 |
+
+
     Scenario: Add linked place when linking relation is renamed
+        Given the 0.1 grid
+         | 10 |   | 11 |
+         |    | 1 |    |
+         | 13 |   | 12 |
         Given the places
-            | osm | class | type | name | geometry |
-            | N1  | place | city | foo  | 0 0 |
+            | osm | class | type | name |
+            | N1  | place | city | foo  |
         And the places
             | osm | class    | type           | name | admin | geometry |
-            | R1  | boundary | administrative | foo  | 8     | poly-area:0.1 |
+            | R1  | boundary | administrative | foo  | 8     | (10,11,12,13,10) |
         When importing
-        And sending search query "foo"
+        Then placex contains
+         | object | linked_place_id |
+         | N1     | R1 |
+        When sending search query "foo"
          | dups |
          | 1    |
         Then results contain
@@ -18,7 +48,7 @@ Feature: Updates of linked places
          | R |
         When updating places
          | osm | class    | type           | name   | admin | geometry |
-         | R1  | boundary | administrative | foobar | 8     | poly-area:0.1 |
+         | R1  | boundary | administrative | foobar | 8     | (10,11,12,13,10) |
         Then placex contains
          | object | linked_place_id |
          | N1     | - |
@@ -30,12 +60,16 @@ Feature: Updates of linked places
          | N |
 
     Scenario: Add linked place when linking relation is removed
+        Given the 0.1 grid
+         | 10 |   | 11 |
+         |    | 1 |    |
+         | 13 |   | 12 |
         Given the places
-            | osm | class | type | name | geometry |
-            | N1  | place | city | foo  | 0 0 |
+            | osm | class | type | name |
+            | N1  | place | city | foo  |
         And the places
             | osm | class    | type           | name | admin | geometry |
-            | R1  | boundary | administrative | foo  | 8     | poly-area:0.1 |
+            | R1  | boundary | administrative | foo  | 8     | (10,11,12,13,10) |
         When importing
         And sending search query "foo"
          | dups |
@@ -55,9 +89,13 @@ Feature: Updates of linked places
          | N |
 
     Scenario: Remove linked place when linking relation is added
+        Given the 0.1 grid
+         | 10 |   | 11 |
+         |    | 1 |    |
+         | 13 |   | 12 |
         Given the places
-            | osm | class | type | name | geometry |
-            | N1  | place | city | foo  | 0 0 |
+            | osm | class | type | name |
+            | N1  | place | city | foo  |
         When importing
         And sending search query "foo"
          | dups |
@@ -67,7 +105,7 @@ Feature: Updates of linked places
          | N |
         When updating places
          | osm | class    | type           | name   | admin | geometry |
-         | R1  | boundary | administrative | foo    | 8     | poly-area:0.1 |
+         | R1  | boundary | administrative | foo    | 8     | (10,11,12,13,10) |
         Then placex contains
          | object | linked_place_id |
          | N1     | R1 |
@@ -79,12 +117,16 @@ Feature: Updates of linked places
          | R |
 
     Scenario: Remove linked place when linking relation is renamed
+        Given the 0.1 grid
+         | 10 |   | 11 |
+         |    | 1 |    |
+         | 13 |   | 12 |
         Given the places
-            | osm | class | type | name | geometry |
-            | N1  | place | city | foo  | 0 0 |
+            | osm | class | type | name |
+            | N1  | place | city | foo  |
         And the places
          | osm | class    | type           | name   | admin | geometry |
-         | R1  | boundary | administrative | foobar | 8     | poly-area:0.1 |
+         | R1  | boundary | administrative | foobar | 8     | (10,11,12,13,10) |
         When importing
         And sending search query "foo"
          | dups |
@@ -94,7 +136,7 @@ Feature: Updates of linked places
          | N |
         When updating places
          | osm | class    | type           | name   | admin | geometry |
-         | R1  | boundary | administrative | foo    | 8     | poly-area:0.1 |
+         | R1  | boundary | administrative | foo    | 8     | (10,11,12,13,10) |
         Then placex contains
          | object | linked_place_id |
          | N1     | R1 |
@@ -106,35 +148,84 @@ Feature: Updates of linked places
          | R |
 
     Scenario: Update linking relation when linkee name is updated
+        Given the 0.1 grid
+         | 10 |   | 11 |
+         |    | 3 |    |
+         | 13 |   | 12 |
         Given the places
          | osm | class    | type           | name | admin | geometry |
-         | R1  | boundary | administrative | rel  | 8     | poly-area:0.1 |
+         | R1  | boundary | administrative | rel  | 8     | (10,11,12,13,10) |
         And the places
-         | osm | class    | type        | name+name:de | admin | geometry |
-         | N3  | place    | city           | pnt  | 30    | 0.00001 0 |
+         | osm | class    | type        | name+name:de |
+         | N3  | place    | city        | pnt          |
         And the relations
          | id | members  |
          | 1  | N3:label |
         When importing
         Then placex contains
-         | object | linked_place_id | name+name:de |
+         | object | linked_place_id | name+_place_name:de |
          | R1     | -               | pnt  |
+        And placex contains
+         | object | linked_place_id | name+name:de |
          | N3     | R1              | pnt  |
         When updating places
-         | osm | class    | type        | name+name:de | admin | geometry |
-         | N3  | place    | city        | newname  | 30    | 0.00001 0 |
+         | osm | class    | type        | name+name:de |
+         | N3  | place    | city        | newname      |
         Then placex contains
          | object | linked_place_id | name+name:de |
          | N3     | R1              | newname  |
+        And placex contains
+         | object | linked_place_id | name+_place_name:de |
          | R1     | -               | newname  |
 
+    Scenario: Update linking relation when linkee name is deleted
+        Given the 0.1 grid
+         | 10 |   | 11 |
+         |    | 3 |    |
+         | 13 |   | 12 |
+        Given the places
+         | osm | class    | type           | name | admin | geometry |
+         | R1  | boundary | administrative | rel  | 8     | (10,11,12,13,10) |
+        And the places
+         | osm | class    | type           | name |
+         | N3  | place    | city           | pnt  |
+        And the relations
+         | id | members  |
+         | 1  | N3:label |
+        When importing
+        Then placex contains
+         | object | linked_place_id | name+_place_name | name+name |
+         | R1     | -               | pnt              | rel       |
+        And placex contains
+         | object | linked_place_id | name+name |
+         | N3     | R1              | pnt  |
+        When sending search query "pnt"
+        Then results contain
+          | osm |
+          | R1  |
+        When updating places
+         | osm | class    | type        | name+name:de |
+         | N3  | place    | city        | depnt        |
+        Then placex contains
+         | object | linked_place_id | name+name:de |
+         | N3     | R1              | depnt  |
+        And placex contains
+         | object | linked_place_id | name+_place_name:de | name+name |
+         | R1     | -               | depnt               | rel       |
+        When sending search query "pnt"
+        Then exactly 0 results are returned
+
     Scenario: Updating linkee extratags keeps linker's extratags
+        Given the 0.1 grid
+         | 10 |   | 11 |
+         |    | 3 |    |
+         | 13 |   | 12 |
         Given the named places
          | osm | class    | type           | extra+wikidata | admin | geometry |
-         | R1  | boundary | administrative | 34             | 8     | poly-area:0.1 |
+         | R1  | boundary | administrative | 34             | 8     | (10,11,12,13,10) |
         And the named places
-         | osm | class    | type           | geometry |
-         | N3  | place    | city           | 0.00001 0 |
+         | osm | class    | type           |
+         | N3  | place    | city           |
         And the relations
          | id | members  |
          | 1  | N3:label |
@@ -143,19 +234,23 @@ Feature: Updates of linked places
          | object | extratags |
          | R1     | 'wikidata' : '34', 'linked_place' : 'city' |
         When updating places
-         | osm | class    | type        | name    | extra+oneway | admin | geometry |
-         | N3  | place    | city        | newname | yes          | 30    | 0.00001 0 |
+         | osm | class    | type        | name    | extra+oneway |
+         | N3  | place    | city        | newname | yes          |
         Then placex contains
          | object | extratags |
          | R1     | 'wikidata' : '34', 'oneway' : 'yes', 'linked_place' : 'city' |
 
     Scenario: Remove linked_place info when linkee is removed
+        Given the 0.1 grid
+         | 10 |   | 11 |
+         |    | 1 |    |
+         | 13 |   | 12 |
         Given the places
-            | osm | class | type | name | geometry |
-            | N1  | place | city | foo  | 0 0 |
+            | osm | class | type | name |
+            | N1  | place | city | foo  |
         And the places
             | osm | class    | type           | name | admin | geometry |
-            | R1  | boundary | administrative | foo  | 8     | poly-area:0.1 |
+            | R1  | boundary | administrative | foo  | 8     | (10,11,12,13,10) |
         When importing
         Then placex contains
             | object | extratags |
@@ -166,19 +261,81 @@ Feature: Updates of linked places
             | R1     |  |
 
     Scenario: Update linked_place info when linkee type changes
+        Given the 0.1 grid
+         | 10 |   | 11 |
+         |    | 1 |    |
+         | 13 |   | 12 |
         Given the places
-            | osm | class | type | name | geometry |
-            | N1  | place | city | foo  | 0 0 |
+            | osm | class | type | name |
+            | N1  | place | city | foo  |
         And the places
             | osm | class    | type           | name | admin | geometry |
-            | R1  | boundary | administrative | foo  | 8     | poly-area:0.1 |
+            | R1  | boundary | administrative | foo  | 8     | (10,11,12,13,10) |
         When importing
         Then placex contains
             | object | extratags |
             | R1     | 'linked_place' : 'city' |
         When updating places
-            | osm | class | type | name | geometry |
-            | N1  | place | town | foo  | 0 0 |
+            | osm | class | type | name |
+            | N1  | place | town | foo  |
         Then placex contains
             | object | extratags |
             | R1     | 'linked_place' : 'town' |
+
+
+    Scenario: Keep linking and ranks when place type changes
+        Given the grid
+            | 1 |   |   | 2 |
+            |   |   | 9 |   |
+            | 4 |   |   | 3 |
+        And the places
+            | osm | class    | type           | name | admin | geometry    |
+            | R1  | boundary | administrative | foo  | 8     | (1,2,3,4,1) |
+        And the places
+            | osm | class | type | name | geometry |
+            | N1  | place | city | foo  | 9        |
+        When importing
+        Then placex contains
+            | object | linked_place_id | rank_address |
+            | N1     | R1              | 16           |
+            | R1     | -               | 16           |
+
+        When updating places
+            | osm | class | type | name | geometry |
+            | N1  | place | town | foo  | 9        |
+        Then placex contains
+            | object | linked_place_id | rank_address |
+            | N1     | R1              | 16           |
+            | R1     | -               | 16           |
+
+
+    Scenario: Invalidate surrounding place nodes when place type changes
+        Given the grid
+            | 1 |   |   | 2 |
+            |   | 8 | 9 |   |
+            | 4 |   |   | 3 |
+        And the places
+            | osm | class    | type           | name | admin | geometry    |
+            | R1  | boundary | administrative | foo  | 8     | (1,2,3,4,1) |
+        And the places
+            | osm | class | type | name | geometry |
+            | N1  | place | town | foo  | 9        |
+            | N2  | place | city | bar  | 8        |
+        And the relations
+         | id | members  |
+         | 1  | N1:label |
+        When importing
+        Then placex contains
+            | object | linked_place_id | rank_address |
+            | N1     | R1              | 16           |
+            | R1     | -               | 16           |
+            | N2     | -               | 18           |
+
+        When updating places
+            | osm | class | type   | name | geometry |
+            | N1  | place | suburb | foo  | 9        |
+        Then placex contains
+            | object | linked_place_id | rank_address |
+            | N1     | R1              | 20           |
+            | R1     | -               | 20           |
+            | N2     | -               | 16           |
index 4023e3f9be29838ae2eced4f5c468968dc65f75a..c6ff13885b9a289f35736294dcc5e5fe4cf130d4 100644 (file)
@@ -3,9 +3,12 @@ Feature: Update of names in place objects
     Test all naming related issues in updates
 
     Scenario: Delete postcode from postcode boundaries without ref
+        Given the grid with origin DE
+          | 1 | 2 |
+          | 4 | 3 |
         Given the places
           | osm | class    | type        | postcode | geometry |
-          | R1  | boundary | postal_code | 12345    | poly-area:0.5 |
+          | R1  | boundary | postal_code | 12345    | (1,2,3,4,1) |
         When importing
         And sending search query "12345"
         Then results contain
@@ -13,6 +16,6 @@ Feature: Update of names in place objects
          | 0  | R1 |
         When updating places
           | osm | class    | type        | geometry |
-          | R1  | boundary | postal_code | poly-area:0.5 |
+          | R1  | boundary | postal_code | (1,2,3,4,1) |
         Then placex has no entry for R1
 
index c962fc7e3fcb085b25b34b10683c1f5849c361bd..1a23d903d37c50dd70525a911082d64dd83b9895 100644 (file)
@@ -2,38 +2,37 @@
 Feature: Update parenting of objects
 
     Scenario: POI inside building inherits addr:street change
-        Given the scene building-on-street-corner
+        Given the grid
+         | 10 |  |   |  |   |   |   | 11 |
+         |    |  | 5 |  |   | 6 |   |    |
+         |    |  |   |  |   |   |   |    |
+         |    |  |   |  | 1 |   |   |    |
+         | 12 |  | 8 |  |   | 7 |   |    |
         And the named places
-         | osm | class   | type       | geometry |
-         | N1  | amenity | bank       | :n-inner |
-         | N2  | shop    | bakery     | :n-edge-NS |
-         | N3  | shop    | supermarket| :n-edge-WE |
+         | osm | class   | type  |
+         | N1  | amenity | bank  |
         And the places
          | osm | class    | type | street  | housenr | geometry |
-         | W1  | building | yes  | nowhere | 3       | :w-building |
+         | W1  | building | yes  | nowhere | 3       | (5,6,7,8,5) |
         And the places
          | osm | class    | type        | name | geometry |
-         | W2  | highway  | primary     | bar  | :w-WE |
-         | W3  | highway  | residential | foo  | :w-NS |
+         | W2  | highway  | primary     | bar  | 10,11 |
+         | W3  | highway  | residential | foo  | 10,12 |
         When importing
         Then placex contains
          | object | parent_place_id | housenumber |
          | W1     | W2              | 3 |
-         | N1     | W3              | 3 |
-         | N2     | W3              | 3 |
-         | N3     | W2              | 3 |
+         | N1     | W2              | 3 |
         When updating places
          | osm | class    | type | street | addr_place | housenr | geometry    |
-         | W1  | building | yes  | foo    | nowhere    | 3       | :w-building |
+         | W1  | building | yes  | foo    | nowhere    | 3       | (5,6,7,8,5) |
         And updating places
-         | osm | class   | type       | name | geometry |
-         | N3  | shop    | supermarket| well | :n-edge-WE |
+         | osm | class   | type | name |
+         | N1  | amenity | bank | well |
         Then placex contains
          | object | parent_place_id | housenumber |
          | W1     | W3              | 3 |
          | N1     | W3              | 3 |
-         | N2     | W3              | 3 |
-         | N3     | W3              | 3 |
 
 
     Scenario: Housenumber is reparented when street gets name matching addr:street
index c2fb30ceb1b1ff479235a4041e4f4187f6e65d1f..c6696ddae8d86090e991cb545d43f4c145cad96a 100644 (file)
@@ -38,13 +38,13 @@ Feature: Update of postcode
         Given the places
            | osm | class | type  | addr+postcode | addr+housenumber | geometry |
            | N34 | place | house | 01982         | 111              |country:de |
-           | N35 | place | house | 01982         | 5                |country:ch |
+           | N35 | place | house | 01982         | 5                |country:fr |
         When importing
         And marking for delete N34
         And updating postcodes
         Then location_postcode contains exactly
            | country | postcode | geometry |
-           | ch      | 01982    | country:ch |
+           | fr      | 01982    | country:fr |
         And there are word tokens for postcodes 01982
 
      Scenario: Updating a postcode is reflected in postcode table
index ccaacad046dac0031bfb618365a78f5486f9bd8c..73abcd223972fd02cd7ea461b780357273ed1bc7 100644 (file)
@@ -3,9 +3,12 @@ Feature: Update of simple objects
     Testing simple updating functionality
 
     Scenario: Do delete small boundary features
+        Given the 1.0 grid
+          | 1 | 2 |
+          | 4 | 3 |
         Given the places
           | osm | class    | type           | admin | geometry |
-          | R1  | boundary | administrative | 3     | poly-area:1.0 |
+          | R1  | boundary | administrative | 3     | (1,2,3,4,1) |
         When importing
         Then placex contains
           | object | rank_search |
@@ -14,24 +17,30 @@ Feature: Update of simple objects
         Then placex has no entry for R1
 
     Scenario: Do not delete large boundary features
+        Given the 2.0 grid
+          | 1 | 2 |
+          | 4 | 3 |
         Given the places
           | osm | class    | type           | admin | geometry |
-          | R1  | boundary | administrative | 3     | poly-area:5.0 |
+          | R1  | boundary | administrative | 3     | (1,2,3,4,1) |
         When importing
         Then placex contains
           | object | rank_search |
           | R1     | 6 |
         When marking for delete R1
-        Then placex contains 
+        Then placex contains
           | object | rank_search |
           | R1     | 6 |
 
     Scenario: Do delete large features of low rank
+        Given the 2.0 grid
+          | 1 | 2 |
+          | 4 | 3 |
         Given the named places
           | osm | class    | type        | geometry |
-          | W1  | place    | house       | poly-area:5.0 |
-          | R1  | natural  | wood        | poly-area:5.0 |
-          | R2  | highway  | residential | poly-area:5.0 |
+          | W1  | place    | house       | (1,2,3,4,1) |
+          | R1  | natural  | wood        | (1,2,3,4,1) |
+          | R2  | highway  | residential | (1,2,3,4,1) |
         When importing
         Then placex contains
           | object | rank_address |
@@ -61,14 +70,12 @@ Feature: Update of simple objects
     Scenario: remove postcode place when house number is added
         Given the places
           | osm | class | type     | postcode | geometry |
-          | N3  | place | postcode | 12345    | 1 -1 |
+          | N3  | place | postcode | 12345    | country:de |
         When importing
-        Then placex contains
-          | object | class | type |
-          | N3     | place | postcode |
+        Then placex has no entry for N3
         When updating places
           | osm | class | type  | postcode | housenr | geometry |
-          | N3  | place | house | 12345    | 13      | 1 -1 |
+          | N3  | place | house | 12345    | 13      | country:de |
         Then placex contains
           | object | class | type |
           | N3     | place | house |
index f179c8f13da343283b0aaf4deb855587a471cd6f..c11a2c8cdbeef9a274782dd158daf448348abb41 100644 (file)
@@ -1,3 +1,9 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# This file is part of Nominatim. (https://nominatim.org)
+#
+# Copyright (C) 2022 by the Nominatim developer community.
+# For a full list of authors see the git log.
 from pathlib import Path
 
 from behave import *
@@ -44,8 +50,13 @@ def before_scenario(context, scenario):
         context.nominatim.setup_api_db()
     elif 'UNKNOWNDB' in context.tags:
         context.nominatim.setup_unknown_db()
-    context.scene = None
 
 def after_scenario(context, scenario):
     if 'DB' in context.tags:
         context.nominatim.teardown_db(context)
+
+
+def before_tag(context, tag):
+    if tag == 'fail-legacy':
+        if context.config.userdata['TOKENIZER'] == 'legacy':
+            context.scenario.skip("Not implemented in legacy tokenizer")
index fd8b83e3c07cfc07a7bfa7329973afae84852a95..794ef5c5f111ef9320c5574cc2d623e3333b795c 100644 (file)
@@ -139,21 +139,3 @@ Feature: Update of relations by osm2pgsql
         Then place contains
           | object | addr+country | name           |
           | R1     | XX           | 'name' : 'Foo' |
-
-    Scenario: Country boundary names are extended when country_code known
-        When loading osm data
-          """
-          n200 Tamenity=prison x0 y0
-          n201 x0 y0.0001
-          n202 x0.0001 y0.0001
-          n203 x0.0001 y0
-          """
-        And updating osm data
-          """
-          w1 Nn200,n201,n202,n203,n200
-          r1 Ttype=boundary,boundary=administrative,name=Foo,country_code=ch,admin_level=2 Mw1@
-          """
-        Then place contains
-            | object | addr+country | name+name:de | name+name |
-            | R1     | ch           | Schweiz      | Foo       |
-
index 15e050072935f79222030f23f13c03af7d58d46f..dbd8993bbb0f7500d6e852a529ec7144b8939038 100644 (file)
@@ -1,4 +1,12 @@
 <?php
+/**
+ * SPDX-License-Identifier: GPL-2.0-only
+ *
+ * This file is part of Nominatim. (https://nominatim.org)
+ *
+ * Copyright (C) 2022 by the Nominatim developer community.
+ * For a full list of authors see the git log.
+ */
 require_once 'SebastianBergmann/CodeCoverage/autoload.php';
 
 
index a0713faefbcb328fef3f1f3082b6b96af20d2699..f214a88627f4fed870c06d2515cd2b9e4f6b4465 100644 (file)
@@ -1,3 +1,9 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# This file is part of Nominatim. (https://nominatim.org)
+#
+# Copyright (C) 2022 by the Nominatim developer community.
+# For a full list of authors see the git log.
 """
 Collection of assertion functions used for the steps.
 """
diff --git a/test/bdd/steps/geometry_alias.py b/test/bdd/steps/geometry_alias.py
new file mode 100644 (file)
index 0000000..a9b4ec8
--- /dev/null
@@ -0,0 +1,262 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# This file is part of Nominatim. (https://nominatim.org)
+#
+# Copyright (C) 2022 by the Nominatim developer community.
+# For a full list of authors see the git log.
+"""
+Collection of aliases for various world coordinates.
+"""
+
+ALIASES = {
+# Country aliases
+'AD': (1.58972, 42.54241),
+'AE': (54.61589, 24.82431),
+'AF': (65.90264, 34.84708),
+'AG': (-61.72430, 17.069),
+'AI': (-63.10571, 18.25461),
+'AL': (19.84941, 40.21232),
+'AM': (44.64229, 40.37821),
+'AO': (16.21924, -12.77014),
+'AQ': (44.99999, -75.65695),
+'AR': (-61.10759, -34.37615),
+'AS': (-170.68470, -14.29307),
+'AT': (14.25747, 47.36542),
+'AU': (138.23155, -23.72068),
+'AW': (-69.98255, 12.555),
+'AX': (19.91839, 59.81682),
+'AZ': (48.38555, 40.61639),
+'BA': (17.18514, 44.25582),
+'BB': (-59.53342, 13.19),
+'BD': (89.75989, 24.34205),
+'BE': (4.90078, 50.34682),
+'BF': (-0.56743, 11.90471),
+'BG': (24.80616, 43.09859),
+'BH': (50.52032, 25.94685),
+'BI': (29.54561, -2.99057),
+'BJ': (2.70062, 10.02792),
+'BL': (-62.79349, 17.907),
+'BM': (-64.77406, 32.30199),
+'BN': (114.52196, 4.28638),
+'BO': (-62.02473, -17.77723),
+'BQ': (-63.14322, 17.566),
+'BR': (-45.77065, -9.58685),
+'BS': (-77.60916, 23.8745),
+'BT': (90.01350, 27.28137),
+'BV': (3.35744, -54.4215),
+'BW': (23.51505, -23.48391),
+'BY': (26.77259, 53.15885),
+'BZ': (-88.63489, 16.33951),
+'CA': (-107.74817, 67.12612),
+'CC': (96.84420, -12.01734),
+'CD': (24.09544, -1.67713),
+'CF': (22.58701, 5.98438),
+'CG': (15.78875, 0.40388),
+'CH': (7.65705, 46.57446),
+'CI': (-6.31190, 6.62783),
+'CK': (-159.77835, -21.23349),
+'CL': (-70.41790, -53.77189),
+'CM': (13.26022, 5.94519),
+'CN': (96.44285, 38.04260),
+'CO': (-72.52951, 2.45174),
+'CR': (-83.83314, 9.93514),
+'CU': (-80.81673, 21.88852),
+'CV': (-24.50810, 14.929),
+'CW': (-68.96409, 12.1845),
+'CX': (105.62411, -10.48417),
+'CY': (32.95922, 35.37010),
+'CZ': (16.32098, 49.50692),
+'DE': (9.30716, 50.21289),
+'DJ': (42.96904, 11.41542),
+'DK': (9.18490, 55.98916),
+'DM': (-61.00358, 15.65470),
+'DO': (-69.62855, 18.58841),
+'DZ': (4.24749, 25.79721),
+'EC': (-77.45831, -0.98284),
+'EE': (23.94288, 58.43952),
+'EG': (28.95293, 28.17718),
+'EH': (-13.69031, 25.01241),
+'ER': (39.01223, 14.96033),
+'ES': (-2.59110, 38.79354),
+'ET': (38.61697, 7.71399),
+'FI': (26.89798, 63.56194),
+'FJ': (177.91853, -17.74237),
+'FK': (-58.99044, -51.34509),
+'FM': (151.95358, 8.5045),
+'FO': (-6.60483, 62.10000),
+'FR': (0.28410, 47.51045),
+'GA': (10.81070, -0.07429),
+'GB': (-0.92823, 52.01618),
+'GD': (-61.64524, 12.191),
+'GE': (44.16664, 42.00385),
+'GF': (-53.46524, 3.56188),
+'GG': (-2.50580, 49.58543),
+'GH': (-0.46348, 7.16051),
+'GI': (-5.32053, 36.11066),
+'GL': (-33.85511, 74.66355),
+'GM': (-16.40960, 13.25),
+'GN': (-13.83940, 10.96291),
+'GP': (-61.68712, 16.23049),
+'GQ': (10.23973, 1.43119),
+'GR': (23.17850, 39.06206),
+'GS': (-36.49430, -54.43067),
+'GT': (-90.74368, 15.20428),
+'GU': (144.73362, 13.44413),
+'GW': (-14.83525, 11.92486),
+'GY': (-58.45167, 5.73698),
+'HK': (114.18577, 22.34923),
+'HM': (73.68230, -53.22105),
+'HN': (-86.95414, 15.23820),
+'HR': (17.49966, 45.52689),
+'HT': (-73.51925, 18.32492),
+'HU': (20.35362, 47.51721),
+'ID': (123.34505, -0.83791),
+'IE': (-9.00520, 52.87725),
+'IL': (35.46314, 32.86165),
+'IM': (-4.86740, 54.023),
+'IN': (88.67620, 27.86155),
+'IO': (71.42743, -6.14349),
+'IQ': (42.58109, 34.26103),
+'IR': (56.09355, 30.46751),
+'IS': (-17.51785, 64.71687),
+'IT': (10.42639, 44.87904),
+'JE': (-2.19261, 49.12458),
+'JM': (-76.84020, 18.3935),
+'JO': (36.55552, 30.75741),
+'JP': (138.72531, 35.92099),
+'KE': (36.90602, 1.08512),
+'KG': (76.15571, 41.66497),
+'KH': (104.31901, 12.95555),
+'KI': (173.63353, 0.139),
+'KM': (44.31474, -12.241),
+'KN': (-62.69379, 17.2555),
+'KP': (126.65575, 39.64575),
+'KR': (127.27740, 36.41388),
+'KW': (47.30684, 29.69180),
+'KY': (-81.07455, 19.29949),
+'KZ': (72.00811, 49.88855),
+'LA': (102.44391, 19.81609),
+'LB': (35.48464, 33.41766),
+'LC': (-60.97894, 13.891),
+'LI': (9.54693, 47.15934),
+'LK': (80.38520, 8.41649),
+'LR': (-11.16960, 4.04122),
+'LS': (28.66984, -29.94538),
+'LT': (24.51735, 55.49293),
+'LU': (6.08649, 49.81533),
+'LV': (23.51033, 56.67144),
+'LY': (15.36841, 28.12177),
+'MA': (-4.03061, 33.21696),
+'MC': (7.47743, 43.62917),
+'MD': (29.61725, 46.66517),
+'ME': (19.72291, 43.02441),
+'MF': (-63.06666, 18.08102),
+'MG': (45.86378, -20.50245),
+'MH': (171.94982, 5.983),
+'MK': (21.42108, 41.08980),
+'ML': (-1.93310, 16.46993),
+'MM': (95.54624, 21.09620),
+'MN': (99.81138, 48.18615),
+'MO': (113.56441, 22.16209),
+'MP': (145.21345, 14.14902),
+'MQ': (-60.81128, 14.43706),
+'MR': (-9.42324, 22.59251),
+'MS': (-62.19455, 16.745),
+'MT': (14.38363, 35.94467),
+'MU': (57.55121, -20.41),
+'MV': (73.39292, 4.19375),
+'MW': (33.95722, -12.28218),
+'MX': (-105.89221, 25.86826),
+'MY': (112.71154, 2.10098),
+'MZ': (37.58689, -13.72682),
+'NA': (16.68569, -21.46572),
+'NC': (164.95322, -20.38889),
+'NE': (10.06041, 19.08273),
+'NF': (167.95718, -29.0645),
+'NG': (10.17781, 10.17804),
+'NI': (-85.87974, 13.21715),
+'NL': (-68.57062, 12.041),
+'NO': (23.11556, 70.09934),
+'NP': (83.36259, 28.13107),
+'NR': (166.93479, -0.5275),
+'NU': (-169.84873, -19.05305),
+'NZ': (167.97209, -45.13056),
+'OM': (56.86055, 20.47413),
+'PA': (-79.40160, 8.80656),
+'PE': (-78.66540, -7.54711),
+'PF': (-145.05719, -16.70862),
+'PG': (146.64600, -7.37427),
+'PH': (121.48359, 15.09965),
+'PK': (72.11347, 31.14629),
+'PL': (17.88136, 52.77182),
+'PM': (-56.19515, 46.78324),
+'PN': (-130.10642, -25.06955),
+'PR': (-65.88755, 18.37169),
+'PS': (35.39801, 32.24773),
+'PT': (-8.45743, 40.11154),
+'PW': (134.49645, 7.3245),
+'PY': (-59.51787, -22.41281),
+'QA': (51.49903, 24.99816),
+'RE': (55.77345, -21.36388),
+'RO': (26.37632, 45.36120),
+'RS': (20.40371, 44.56413),
+'RU': (116.44060, 59.06780),
+'RW': (29.57882, -1.62404),
+'SA': (47.73169, 22.43790),
+'SB': (164.63894, -10.23606),
+'SC': (46.36566, -9.454),
+'SD': (28.14720, 14.56423),
+'SE': (15.68667, 60.35568),
+'SG': (103.84187, 1.304),
+'SH': (-12.28155, -37.11546),
+'SI': (14.04738, 46.39085),
+'SJ': (15.27552, 79.23365),
+'SK': (20.41603, 48.86970),
+'SL': (-11.47773, 8.78156),
+'SM': (12.46062, 43.94279),
+'SN': (-15.37111, 14.99477),
+'SO': (46.93383, 9.34094),
+'SR': (-55.42864, 4.56985),
+'SS': (28.13573, 8.50933),
+'ST': (6.61025, 0.2215),
+'SV': (-89.36665, 13.43072),
+'SX': (-63.15393, 17.9345),
+'SY': (38.15513, 35.34221),
+'SZ': (31.78263, -26.14244),
+'TC': (-71.32554, 21.35),
+'TD': (17.42092, 13.46223),
+'TF': (137.5, -67.5),
+'TG': (1.06983, 7.87677),
+'TH': (102.00877, 16.42310),
+'TJ': (71.91349, 39.01527),
+'TK': (-171.82603, -9.20990),
+'TL': (126.22520, -8.72636),
+'TM': (57.71603, 39.92534),
+'TN': (9.04958, 34.84199),
+'TO': (-176.99320, -23.11104),
+'TR': (32.82002, 39.86350),
+'TT': (-60.70793, 11.1385),
+'TV': (178.77499, -9.41685),
+'TW': (120.30074, 23.17002),
+'TZ': (33.53892, -5.01840),
+'UA': (33.44335, 49.30619),
+'UG': (32.96523, 2.08584),
+'UM': (-169.50993, 16.74605),
+'US': (-116.39535, 40.71379),
+'UY': (-56.46505, -33.62658),
+'UZ': (61.35529, 42.96107),
+'VA': (12.33197, 42.04931),
+'VC': (-61.09905, 13.316),
+'VE': (-64.88323, 7.69849),
+'VG': (-64.62479, 18.419),
+'VI': (-64.88950, 18.32263),
+'VN': (104.20179, 10.27644),
+'VU': (167.31919, -15.88687),
+'WF': (-176.20781, -13.28535),
+'WS': (-172.10966, -13.85093),
+'YE': (45.94562, 16.16338),
+'YT': (44.93774, -12.60882),
+'ZA': (23.19488, -30.43276),
+'ZM': (26.38618, -14.39966),
+'ZW': (30.12419, -19.86907)
+}
index 0a403839e05621f7f4150fe23146eef88e732a7b..a8fda5ffff11bc1567cce52fca55388266f959df 100644 (file)
@@ -1,23 +1,27 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# This file is part of Nominatim. (https://nominatim.org)
+#
+# Copyright (C) 2022 by the Nominatim developer community.
+# For a full list of authors see the git log.
 from pathlib import Path
 import os
 
+from steps.geometry_alias import ALIASES
+
 class GeometryFactory:
-    """ Provides functions to create geometries from scenes and data grids.
+    """ Provides functions to create geometries from coordinates and data grids.
     """
 
     def __init__(self):
-        defpath = Path(__file__) / '..' / '..' / '..' / 'scenes' / 'data'
-        self.scene_path = os.environ.get('SCENE_PATH', defpath.resolve())
-        self.scene_cache = {}
         self.grid = {}
 
-    def parse_geometry(self, geom, scene):
+    def parse_geometry(self, geom):
         """ Create a WKT SQL term for the given geometry.
             The function understands the following formats:
 
-              [<scene>]:<name>
-                 Geometry from a scene. If the scene is omitted, use the
-                 default scene.
+              country:<country code>
+                 Point geoemtry guaranteed to be in the given country
               <P>
                  Point geometry
               <P>,...,<P>
@@ -29,8 +33,10 @@ class GeometryFactory:
            number. In the latter case it must refer to a point in
            a previously defined grid.
         """
-        if geom.find(':') >= 0:
-            return "ST_SetSRID({}, 4326)".format(self.get_scene_geometry(scene, geom))
+        if geom.startswith('country:'):
+            ccode = geom[8:].upper()
+            assert ccode in ALIASES, "Geometry error: unknown country " + ccode
+            return "ST_SetSRID('POINT({} {})'::geometry, 4326)".format(*ALIASES[ccode])
 
         if geom.find(',') < 0:
             out = "POINT({})".format(self.mk_wkt_point(geom))
@@ -41,6 +47,7 @@ class GeometryFactory:
 
         return "ST_SetSRID('{}'::geometry, 4326)".format(out)
 
+
     def mk_wkt_point(self, point):
         """ Parse a point description.
             The point may either consist of 'x y' cooordinates or a number
@@ -58,6 +65,7 @@ class GeometryFactory:
         assert pt is not None, "Scenario error: Point '{}' not found in grid".format(geom)
         return "{} {}".format(*pt)
 
+
     def mk_wkt_points(self, geom):
         """ Parse a list of points.
             The list must be a comma-separated list of points. Points
@@ -65,57 +73,21 @@ class GeometryFactory:
         """
         return ','.join([self.mk_wkt_point(x) for x in geom.split(',')])
 
-    def get_scene_geometry(self, default_scene, name):
-        """ Load the geometry from a scene.
-        """
-        geoms = []
-        for obj in name.split('+'):
-            oname = obj.strip()
-            if oname.startswith(':'):
-                assert default_scene is not None, "Scenario error: You need to set a scene"
-                defscene = self.load_scene(default_scene)
-                wkt = defscene[oname[1:]]
-            else:
-                scene, obj = oname.split(':', 2)
-                scene_geoms = self.load_scene(scene)
-                wkt = scene_geoms[obj]
-
-            geoms.append("'{}'::geometry".format(wkt))
-
-        if len(geoms) == 1:
-            return geoms[0]
-
-        return 'ST_LineMerge(ST_Collect(ARRAY[{}]))'.format(','.join(geoms))
-
-    def load_scene(self, name):
-        """ Load a scene from a file.
-        """
-        if name in self.scene_cache:
-            return self.scene_cache[name]
-
-        scene = {}
-        with open(Path(self.scene_path) / "{}.wkt".format(name), 'r') as fd:
-            for line in fd:
-                if line.strip():
-                    obj, wkt = line.split('|', 2)
-                    scene[obj.strip()] = wkt.strip()
-            self.scene_cache[name] = scene
 
-        return scene
-
-    def set_grid(self, lines, grid_step):
+    def set_grid(self, lines, grid_step, origin=(0.0, 0.0)):
         """ Replace the grid with one from the given lines.
         """
         self.grid = {}
-        y = 0
+        y = origin[1]
         for line in lines:
-            x = 0
+            x = origin[0]
             for pt_id in line:
                 if pt_id.isdigit():
                     self.grid[int(pt_id)] = (x, y)
                 x += grid_step
             y += grid_step
 
+
     def grid_node(self, nodeid):
         """ Get the coordinates for the given grid node.
         """
index 0920a7e2ff00b31b04ccd800e57ca6ed69c18138..3b9f59ebc1626aae952c44116fbf0745b12d0eef 100644 (file)
@@ -1,3 +1,9 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# This file is part of Nominatim. (https://nominatim.org)
+#
+# Copyright (C) 2022 by the Nominatim developer community.
+# For a full list of authors see the git log.
 """
 Classes wrapping HTTP responses from the Nominatim API.
 """
@@ -66,13 +72,14 @@ class GenericResponse:
             self.header['json_func'] = m.group(1)
         self.result = json.JSONDecoder(object_pairs_hook=OrderedDict).decode(code)
         if isinstance(self.result, OrderedDict):
-            self.result = [self.result]
+            if 'error' in self.result:
+                self.result = []
+            else:
+                self.result = [self.result]
 
     def _parse_geojson(self):
         self._parse_json()
-        if 'error' in self.result[0]:
-            self.result = []
-        else:
+        if self.result:
             self.result = list(map(_geojson_result_to_json_result, self.result[0]['features']))
 
     def _parse_geocodejson(self):
@@ -95,6 +102,9 @@ class GenericResponse:
         elif value.startswith("^"):
             assert re.fullmatch(value, self.result[idx][field]), \
                    BadRowValueAssert(self, idx, field, value)
+        elif isinstance(self.result[idx][field], OrderedDict):
+            assert self.result[idx][field] == eval('{' + value + '}'), \
+                   BadRowValueAssert(self, idx, field, value)
         else:
             assert str(self.result[idx][field]) == str(value), \
                    BadRowValueAssert(self, idx, field, value)
@@ -122,7 +132,7 @@ class GenericResponse:
                    "\nBad value for row {} field '{}' in address. Expected: {}, got: {}.\nFull address: {}"""\
                        .format(idx, field, value, address[field], json.dumps(address, indent=4))
 
-    def match_row(self, row):
+    def match_row(self, row, context=None):
         """ Match the result fields against the given behave table row.
         """
         if 'ID' in row.headings:
@@ -145,7 +155,12 @@ class GenericResponse:
                     assert self.result[i]['osm_type'] in (OSM_TYPE[value[0]], value[0]), \
                            BadRowValueAssert(self, i, 'osm_type', value)
                 elif name == 'centroid':
-                    lon, lat = value.split(' ')
+                    if ' ' in value:
+                        lon, lat = value.split(' ')
+                    elif context is not None:
+                        lon, lat = context.osm.grid_node(int(value))
+                    else:
+                        raise RuntimeError("Context needed when using grid coordinates")
                     self.assert_field(i, 'lat', float(lat))
                     self.assert_field(i, 'lon', float(lon))
                 else:
index 76f90cfa316af280262a066bbf5da77ccdb3d45d..e72347885371efe0caa269e2764e7801eee21d52 100644 (file)
@@ -1,3 +1,9 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# This file is part of Nominatim. (https://nominatim.org)
+#
+# Copyright (C) 2022 by the Nominatim developer community.
+# For a full list of authors see the git log.
 from pathlib import Path
 import sys
 import tempfile
@@ -9,7 +15,7 @@ sys.path.insert(1, str((Path(__file__) / '..' / '..' / '..' / '..').resolve()))
 
 from nominatim import cli
 from nominatim.config import Configuration
-from nominatim.db.connection import _Connection
+from nominatim.db.connection import Connection
 from nominatim.tools import refresh
 from nominatim.tokenizer import factory as tokenizer_factory
 from steps.utils import run_script
@@ -55,7 +61,7 @@ class NominatimEnvironment:
             dbargs['user'] = self.db_user
         if self.db_pass:
             dbargs['password'] = self.db_pass
-        conn = psycopg2.connect(connection_factory=_Connection, **dbargs)
+        conn = psycopg2.connect(connection_factory=Connection, **dbargs)
         return conn
 
     def next_code_coverage_file(self):
@@ -89,6 +95,7 @@ class NominatimEnvironment:
 
         self.test_env = dict(self.default_config)
         self.test_env['NOMINATIM_DATABASE_DSN'] = dsn
+        self.test_env['NOMINATIM_LANGUAGES'] = 'en,de,fr,ja'
         self.test_env['NOMINATIM_FLATNODE_FILE'] = ''
         self.test_env['NOMINATIM_IMPORT_STYLE'] = 'full'
         self.test_env['NOMINATIM_USE_US_TIGER_DATA'] = 'yes'
@@ -166,22 +173,23 @@ class NominatimEnvironment:
 
         self.template_db_done = True
 
-        if self._reuse_or_drop_db(self.template_db):
-            return
-
         self.write_nominatim_config(self.template_db)
 
-        try:
-            # execute nominatim import on an empty file to get the right tables
-            with tempfile.NamedTemporaryFile(dir='/tmp', suffix='.xml') as fd:
-                fd.write(b'<osm version="0.6"></osm>')
-                fd.flush()
-                self.run_nominatim('import', '--osm-file', fd.name,
-                                             '--osm2pgsql-cache', '1',
-                                             '--ignore-errors')
-        except:
-            self.db_drop_database(self.template_db)
-            raise
+        if not self._reuse_or_drop_db(self.template_db):
+            try:
+                # execute nominatim import on an empty file to get the right tables
+                with tempfile.NamedTemporaryFile(dir='/tmp', suffix='.xml') as fd:
+                    fd.write(b'<osm version="0.6"></osm>')
+                    fd.flush()
+                    self.run_nominatim('import', '--osm-file', fd.name,
+                                                 '--osm2pgsql-cache', '1',
+                                                 '--ignore-errors',
+                                                 '--offline', '--index-noanalyse')
+            except:
+                self.db_drop_database(self.template_db)
+                raise
+
+        self.run_nominatim('refresh', '--functions')
 
 
     def setup_api_db(self):
@@ -201,7 +209,7 @@ class NominatimEnvironment:
                     self.run_nominatim('add-data', '--tiger-data', str((testdata / 'tiger').resolve()))
                     self.run_nominatim('freeze')
 
-                    if self.tokenizer != 'icu':
+                    if self.tokenizer == 'legacy':
                         phrase_file = str((testdata / 'specialphrases_testdb.sql').resolve())
                         run_script(['psql', '-d', self.api_test_db, '-f', phrase_file])
                     else:
@@ -211,7 +219,7 @@ class NominatimEnvironment:
                     self.db_drop_database(self.api_test_db)
                     raise
 
-        tokenizer_factory.create_tokenizer(self.get_test_config(), init_db=False)
+        tokenizer_factory.get_tokenizer_for_db(self.get_test_config())
 
 
     def setup_unknown_db(self):
index 90f071b282369e944efda0d2bed99b1779883da1..6e7e6a75dc7c787f2883abd475c5b4b79a6712ef 100644 (file)
@@ -1,3 +1,9 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# This file is part of Nominatim. (https://nominatim.org)
+#
+# Copyright (C) 2022 by the Nominatim developer community.
+# For a full list of authors see the git log.
 """
 Helper classes for filling the place table.
 """
@@ -77,7 +83,7 @@ class PlaceColumn:
             self._add_hstore('address', 'country', value)
 
     def _set_key_geometry(self, value):
-        self.geometry = self.context.osm.parse_geometry(value, self.context.scene)
+        self.geometry = self.context.osm.parse_geometry(value)
         assert self.geometry is not None, "Bad geometry: {}".format(value)
 
     def _add_hstore(self, column, key, value):
index 994695870a644c85cbc4a3d30bf4eddff2efd58e..22517338bab04f664198222680f273ae358882a1 100644 (file)
@@ -1,3 +1,9 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# This file is part of Nominatim. (https://nominatim.org)
+#
+# Copyright (C) 2022 by the Nominatim developer community.
+# For a full list of authors see the git log.
 """ Steps that run queries against the API.
 
     Queries may either be run directly via PHP using the query script
@@ -147,6 +153,20 @@ def website_reverse_request(context, fmt, lat, lon):
 
     context.response = ReverseResponse(outp, fmt or 'xml', status)
 
+@when(u'sending (?P<fmt>\S+ )?reverse point (?P<nodeid>.+)')
+def website_reverse_request(context, fmt, nodeid):
+    params = {}
+    if fmt and fmt.strip() == 'debug':
+        params['debug'] = '1'
+    params['lon'], params['lat'] = (f'{c:f}' for c in context.osm.grid_node(int(nodeid)))
+
+
+    outp, status = send_api_query('reverse', params, fmt, context)
+
+    context.response = ReverseResponse(outp, fmt or 'xml', status)
+
+
+
 @when(u'sending (?P<fmt>\S+ )?details query for (?P<query>.*)')
 def website_details_request(context, fmt, query):
     params = {}
@@ -232,7 +252,7 @@ def step_impl(context):
     context.execute_steps("then at least 1 result is returned")
 
     for line in context.table:
-        context.response.match_row(line)
+        context.response.match_row(line, context=context)
 
 @then(u'result (?P<lid>\d+ )?has (?P<neg>not )?attributes (?P<attrs>.*)')
 def validate_attributes(context, lid, neg, attrs):
index d1f27235642f390433552f4177baf6521b80ec43..8fd918f88fe7a3f70083be63650726738390aa9f 100644 (file)
@@ -1,3 +1,9 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# This file is part of Nominatim. (https://nominatim.org)
+#
+# Copyright (C) 2022 by the Nominatim developer community.
+# For a full list of authors see the git log.
 import logging
 from itertools import chain
 
@@ -12,13 +18,19 @@ from nominatim.tokenizer import factory as tokenizer_factory
 def check_database_integrity(context):
     """ Check some generic constraints on the tables.
     """
-    # place_addressline should not have duplicate (place_id, address_place_id)
-    cur = context.db.cursor()
-    cur.execute("""SELECT count(*) FROM
-                    (SELECT place_id, address_place_id, count(*) as c
-                     FROM place_addressline GROUP BY place_id, address_place_id) x
-                   WHERE c > 1""")
-    assert cur.fetchone()[0] == 0, "Duplicates found in place_addressline"
+    with context.db.cursor() as cur:
+        # place_addressline should not have duplicate (place_id, address_place_id)
+        cur.execute("""SELECT count(*) FROM
+                        (SELECT place_id, address_place_id, count(*) as c
+                         FROM place_addressline GROUP BY place_id, address_place_id) x
+                       WHERE c > 1""")
+        assert cur.fetchone()[0] == 0, "Duplicates found in place_addressline"
+
+        # word table must not have empty word_tokens
+        if context.nominatim.tokenizer != 'legacy':
+            cur.execute("SELECT count(*) FROM word WHERE word_token = ''")
+            assert cur.fetchone()[0] == 0, "Empty word tokens found in word table"
+
 
 
 ################################ GIVEN ##################################
@@ -87,32 +99,17 @@ def add_data_to_planet_ways(context):
 def import_and_index_data_from_place_table(context):
     """ Import data previously set up in the place table.
     """
-    nctx = context.nominatim
-
-    tokenizer = tokenizer_factory.create_tokenizer(nctx.get_test_config())
-    context.nominatim.copy_from_place(context.db)
-
-    # XXX use tool function as soon as it is ported
-    with context.db.cursor() as cur:
-        with (context.nominatim.src_dir / 'lib-sql' / 'postcode_tables.sql').open('r') as fd:
-            cur.execute(fd.read())
-        cur.execute("""
-            INSERT INTO location_postcode
-             (place_id, indexed_status, country_code, postcode, geometry)
-            SELECT nextval('seq_place'), 1, country_code,
-                   upper(trim (both ' ' from address->'postcode')) as pc,
-                   ST_Centroid(ST_Collect(ST_Centroid(geometry)))
-              FROM placex
-             WHERE address ? 'postcode' AND address->'postcode' NOT SIMILAR TO '%(,|;)%'
-                   AND geometry IS NOT null
-             GROUP BY country_code, pc""")
-
-    # Call directly as the refresh function does not include postcodes.
-    indexer.LOG.setLevel(logging.ERROR)
-    indexer.Indexer(context.nominatim.get_libpq_dsn(), tokenizer, 1).index_full(analyse=False)
+    context.nominatim.run_nominatim('import', '--continue', 'load-data',
+                                              '--index-noanalyse', '-q',
+                                              '--offline')
 
     check_database_integrity(context)
 
+    # Remove the output of the input, when all was right. Otherwise it will be
+    # output when there are errors that had nothing to do with the import
+    # itself.
+    context.log_capture.buffer.clear()
+
 @when("updating places")
 def update_place_table(context):
     """ Update the place table with the given data. Also runs all triggers
@@ -126,6 +123,12 @@ def update_place_table(context):
     context.nominatim.reindex_placex(context.db)
     check_database_integrity(context)
 
+    # Remove the output of the input, when all was right. Otherwise it will be
+    # output when there are errors that had nothing to do with the import
+    # itself.
+    context.log_capture.buffer.clear()
+
+
 @when("updating postcodes")
 def update_postcodes(context):
     """ Rerun the calculation of postcodes.
@@ -145,6 +148,11 @@ def delete_places(context, oids):
 
     context.nominatim.reindex_placex(context.db)
 
+    # Remove the output of the input, when all was right. Otherwise it will be
+    # output when there are errors that had nothing to do with the import
+    # itself.
+    context.log_capture.buffer.clear()
+
 ################################ THEN ##################################
 
 @then("(?P<table>placex|place) contains(?P<exact> exactly)?")
@@ -262,7 +270,7 @@ def check_location_postcode(context):
         for row in context.table:
             db_row = results.get((row['country'],row['postcode']))
             assert db_row is not None, \
-                "Missing row for country '{r['country']}' postcode '{r['postcode']}'.".format(r=row)
+                f"Missing row for country '{row['country']}' postcode '{row['postcode']}'."
 
             db_row.assert_row(row, ('country', 'postcode'))
 
@@ -280,7 +288,7 @@ def check_word_table_for_postcodes(context, exclude, postcodes):
     plist.sort()
 
     with context.db.cursor(cursor_factory=psycopg2.extras.DictCursor) as cur:
-        if nctx.tokenizer == 'icu':
+        if nctx.tokenizer != 'legacy':
             cur.execute("SELECT word FROM word WHERE type = 'P' and word = any(%s)",
                         (plist,))
         else:
@@ -327,12 +335,13 @@ def check_place_addressline_exclude(context):
     with context.db.cursor(cursor_factory=psycopg2.extras.DictCursor) as cur:
         for row in context.table:
             pid = NominatimID(row['object']).get_place_id(cur)
-            apid = NominatimID(row['address']).get_place_id(cur)
-            cur.execute(""" SELECT * FROM place_addressline
-                            WHERE place_id = %s AND address_place_id = %s""",
-                        (pid, apid))
-            assert cur.rowcount == 0, \
-                "Row found for place %s and address %s" % (row['object'], row['address'])
+            apid = NominatimID(row['address']).get_place_id(cur, allow_empty=True)
+            if apid is not None:
+                cur.execute(""" SELECT * FROM place_addressline
+                                WHERE place_id = %s AND address_place_id = %s""",
+                            (pid, apid))
+                assert cur.rowcount == 0, \
+                    "Row found for place %s and address %s" % (row['object'], row['address'])
 
 @then("W(?P<oid>\d+) expands to(?P<neg> no)? interpolation")
 def check_location_property_osmline(context, oid, neg):
index fb4591bfb53504d45ba8805f592b28a629ad4110..94f727966af621a9011795c4f08c37a85819dc66 100644 (file)
@@ -1,3 +1,9 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# This file is part of Nominatim. (https://nominatim.org)
+#
+# Copyright (C) 2022 by the Nominatim developer community.
+# For a full list of authors see the git log.
 import tempfile
 import random
 import os
@@ -5,6 +11,8 @@ from pathlib import Path
 
 from nominatim.tools.exec_utils import run_osm2pgsql
 
+from geometry_alias import ALIASES
+
 def get_osm2pgsql_options(nominatim_env, fname, append):
     return dict(import_file=fname,
                 osm2pgsql=str(nominatim_env.build_dir / 'osm2pgsql' / 'osm2pgsql'),
@@ -39,12 +47,8 @@ def write_opl_file(opl, grid):
 
         return fd.name
 
-@given(u'the scene (?P<scene>.+)')
-def set_default_scene(context, scene):
-    context.scene = scene
-
-@given(u'the ([0-9.]+ )?grid')
-def define_node_grid(context, grid_step):
+@given(u'the ([0-9.]+ )?grid(?: with origin (?P<origin>.*))?')
+def define_node_grid(context, grid_step, origin):
     """
     Define a grid of node positions.
     Use a table to define the grid. The nodes must be integer ids. Optionally
@@ -55,8 +59,22 @@ def define_node_grid(context, grid_step):
     else:
         grid_step = 0.00001
 
+    if origin:
+        if ',' in origin:
+            # TODO coordinate
+            coords = origin.split(',')
+            if len(coords) != 2:
+                raise RuntimeError('Grid origin expects orgin with x,y coordinates.')
+            origin = (float(coords[0]), float(coords[1]))
+        elif origin in ALIASES:
+            origin = ALIASES[origin]
+        else:
+            raise RuntimeError('Grid origin must be either coordinate or alias.')
+    else:
+        origin = (0.0, 0.0)
+
     context.osm.set_grid([context.table.headings] + [list(h) for h in context.table],
-                         grid_step)
+                         grid_step, origin)
 
 
 @when(u'loading osm data')
index 2e71d943a83cc38587e212c8960cbb8df652f877..cf2e12f127871390126379fb348f2eb2cfeceec1 100644 (file)
@@ -1,3 +1,9 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# This file is part of Nominatim. (https://nominatim.org)
+#
+# Copyright (C) 2022 by the Nominatim developer community.
+# For a full list of authors see the git log.
 """
 Functions to facilitate accessing and comparing the content of DB tables.
 """
@@ -56,11 +62,14 @@ class NominatimID:
                     ','.join(['*'] + (extra_columns or [])), table)
         cur.execute(query, (pid, ))
 
-    def get_place_id(self, cur):
+    def get_place_id(self, cur, allow_empty=False):
         """ Look up the place id for the ID. Throws an assertion if the ID
             is not unique.
         """
         self.query_osm_id(cur, "SELECT place_id FROM placex WHERE {}")
+        if cur.rowcount == 0 and allow_empty:
+            return None
+
         assert cur.rowcount == 1, \
                "Place ID {!s} not unique. Found {} entries.".format(self, cur.rowcount)
 
@@ -148,11 +157,15 @@ class DBRow:
                                         ST_SetSRID('{geomtxt}'::geometry, 4326))""".format(**self.db_row))
                 return cur.fetchone()[0]
 
-        x, y = expected.split(' ')
+        if ' ' in expected:
+            x, y = expected.split(' ')
+        else:
+            x, y = self.context.osm.grid_node(int(expected))
+
         return Almost(float(x)) == self.db_row['cx'] and Almost(float(y)) == self.db_row['cy']
 
     def _has_geometry(self, expected):
-        geom = self.context.osm.parse_geometry(expected, self.context.scene)
+        geom = self.context.osm.parse_geometry(expected)
         with self.context.db.cursor() as cur:
             cur.execute("""SELECT ST_Equals(ST_SnapToGrid({}, 0.00001, 0.00001),
                                    ST_SnapToGrid(ST_SetSRID('{}'::geometry, 4326), 0.00001, 0.00001))""".format(
index 64d020db512b1f4dc13026ebbd9cd7b01ed0b671..e789deff2aeb3424f12826b0fdd2e416ed85b35d 100644 (file)
@@ -1,3 +1,9 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# This file is part of Nominatim. (https://nominatim.org)
+#
+# Copyright (C) 2022 by the Nominatim developer community.
+# For a full list of authors see the git log.
 """
 Various smaller helps for step execution.
 """
index 32f4f457d5676048181e0b2d1df2f81c7b96309f..2041dcb4bff2558ee447ef1fb3c15361090f7b39 100644 (file)
@@ -1,4 +1,12 @@
 <?php
+/**
+ * SPDX-License-Identifier: GPL-2.0-only
+ *
+ * This file is part of Nominatim. (https://nominatim.org)
+ *
+ * Copyright (C) 2022 by the Nominatim developer community.
+ * For a full list of authors see the git log.
+ */
 
 namespace Nominatim;
 
@@ -78,6 +86,8 @@ class AddressDetailsTest extends \PHPUnit\Framework\TestCase
                      'city' => 'London',
                      'state_district' => 'Greater London',
                      'state' => 'England',
+                     'ISO3166-2-lvl4' => 'GB-ENG',
+                     'ISO3166-2-lvl6' => 'GB-LND',
                      'postcode' => 'SW1A 2AA',
                      'country' => 'United Kingdom',
                      'country_code' => 'gb'
index 102569542880220ae58380764515fc2ae2027c32..d2900d822b388bf9c58aea542037f01ec6fd6274 100644 (file)
@@ -1,4 +1,12 @@
 <?php
+/**
+ * SPDX-License-Identifier: GPL-2.0-only
+ *
+ * This file is part of Nominatim. (https://nominatim.org)
+ *
+ * Copyright (C) 2022 by the Nominatim developer community.
+ * For a full list of authors see the git log.
+ */
 
 namespace Nominatim;
 
index b1ff957bd40a4fae5a0eecfb58f11dcdd7b0708c..1c6f763742e4062f77f28d9a09128a7d4a9da231 100644 (file)
@@ -1,4 +1,12 @@
 <?php
+/**
+ * SPDX-License-Identifier: GPL-2.0-only
+ *
+ * This file is part of Nominatim. (https://nominatim.org)
+ *
+ * Copyright (C) 2022 by the Nominatim developer community.
+ * For a full list of authors see the git log.
+ */
 
 namespace Nominatim;
 
index 6e70ac25d7cb5eeef1eaed359de671a147220ce3..e24049ca62229ba212ee3731c49135a8c3d38f88 100644 (file)
@@ -1,4 +1,12 @@
 <?php
+/**
+ * SPDX-License-Identifier: GPL-2.0-only
+ *
+ * This file is part of Nominatim. (https://nominatim.org)
+ *
+ * Copyright (C) 2022 by the Nominatim developer community.
+ * For a full list of authors see the git log.
+ */
 
 namespace Nominatim;
 
index 09860914af4830fb348dba8422d8d0262b0e2d59..dbce890f4ce3ea9477b32d9f8e5c769eb3ac7f97 100644 (file)
@@ -1,4 +1,12 @@
 <?php
+/**
+ * SPDX-License-Identifier: GPL-2.0-only
+ *
+ * This file is part of Nominatim. (https://nominatim.org)
+ *
+ * Copyright (C) 2022 by the Nominatim developer community.
+ * For a full list of authors see the git log.
+ */
 
 namespace Nominatim;
 
index 5111b32641901d8fc9db42007acb4ce70d8a5e5e..5d711240d152f55dcaf622725d8a474216c2a2eb 100644 (file)
@@ -1,4 +1,12 @@
 <?php
+/**
+ * SPDX-License-Identifier: GPL-2.0-only
+ *
+ * This file is part of Nominatim. (https://nominatim.org)
+ *
+ * Copyright (C) 2022 by the Nominatim developer community.
+ * For a full list of authors see the git log.
+ */
 
 namespace Nominatim;
 
@@ -83,33 +91,4 @@ class LibTest extends \PHPUnit\Framework\TestCase
             $this->assertEquals($sQuery, $aRes[0]);
         }
     }
-
-    private function closestHouseNumberEvenOddOther($startnumber, $endnumber, $fraction, $aExpected)
-    {
-        foreach (array('even', 'odd', 'other') as $itype) {
-            $this->assertEquals(
-                $aExpected[$itype],
-                closestHouseNumber(array(
-                                    'startnumber' => $startnumber,
-                                    'endnumber' => $endnumber,
-                                    'fraction' => $fraction,
-                                    'interpolationtype' => $itype
-                                   )),
-                "$startnumber => $endnumber, $fraction, $itype"
-            );
-        }
-    }
-
-    public function testClosestHouseNumber()
-    {
-        $this->closestHouseNumberEvenOddOther(50, 100, 0.5, array('even' => 76, 'odd' => 75, 'other' => 75));
-        // upper bound
-        $this->closestHouseNumberEvenOddOther(50, 100, 1.5, array('even' => 100, 'odd' => 100, 'other' => 100));
-        // lower bound
-        $this->closestHouseNumberEvenOddOther(50, 100, -0.5, array('even' => 50, 'odd' => 50, 'other' => 50));
-        // fraction 0
-        $this->closestHouseNumberEvenOddOther(50, 100, 0, array('even' => 50, 'odd' => 51, 'other' => 50));
-        // start == end
-        $this->closestHouseNumberEvenOddOther(50, 50, 0.5, array('even' => 50, 'odd' => 50, 'other' => 50));
-    }
 }
index 3b06e2740a74a824a69280e5b42fd9f9909bfe78..82716d4de98d68ed29826621759c9d379d1701c4 100644 (file)
@@ -1,4 +1,12 @@
 <?php
+/**
+ * SPDX-License-Identifier: GPL-2.0-only
+ *
+ * This file is part of Nominatim. (https://nominatim.org)
+ *
+ * Copyright (C) 2022 by the Nominatim developer community.
+ * For a full list of authors see the git log.
+ */
 
 namespace Nominatim;
 
@@ -140,7 +148,7 @@ class ParameterParserTest extends \PHPUnit\Framework\TestCase
         $this->assertSame('foo', $oParams->getSet('val1', array('foo', 'bar')));
 
         $this->assertSame(false, $oParams->getSet('val2', array('foo', 'bar')));
-        $this->assertSame(0, $oParams->getSet('val3', array('foo', 'bar')));
+        $this->assertSame(false, $oParams->getSet('val3', array('foo', 'bar')));
     }
 
 
@@ -176,75 +184,48 @@ class ParameterParserTest extends \PHPUnit\Framework\TestCase
         $oParams = new ParameterParser(array('accept-language' => ''));
         $this->assertSame(array(
                            'name:default' => 'name:default',
+                           '_place_name:default' => '_place_name:default',
                            'name' => 'name',
-                           'brand' => 'brand',
-                           'official_name:default' => 'official_name:default',
-                           'short_name:default' => 'short_name:default',
-                           'official_name' => 'official_name',
-                           'short_name' => 'short_name',
-                           'ref' => 'ref',
-                           'type' => 'type'
-                          ), $oParams->getPreferredLanguages('default'));
+                           '_place_name' => '_place_name'
+                          ), array_slice($oParams->getPreferredLanguages('default'), 0, 4));
 
         $oParams = new ParameterParser(array('accept-language' => 'de,en'));
         $this->assertSame(array(
                            'name:de' => 'name:de',
+                           '_place_name:de' => '_place_name:de',
                            'name:en' => 'name:en',
+                           '_place_name:en' => '_place_name:en',
                            'name' => 'name',
-                           'brand' => 'brand',
-                           'official_name:de' => 'official_name:de',
-                           'short_name:de' => 'short_name:de',
-                           'official_name:en' => 'official_name:en',
-                           'short_name:en' => 'short_name:en',
-                           'official_name' => 'official_name',
-                           'short_name' => 'short_name',
-                           'ref' => 'ref',
-                           'type' => 'type'
-                          ), $oParams->getPreferredLanguages('default'));
+                           '_place_name' => '_place_name'
+                          ), array_slice($oParams->getPreferredLanguages('default'), 0, 6));
 
         $oParams = new ParameterParser(array('accept-language' => 'fr-ca,fr;q=0.8,en-ca;q=0.5,en;q=0.3'));
         $this->assertSame(array(
                            'name:fr-ca' => 'name:fr-ca',
+                           '_place_name:fr-ca' => '_place_name:fr-ca',
                            'name:fr' => 'name:fr',
+                           '_place_name:fr' => '_place_name:fr',
                            'name:en-ca' => 'name:en-ca',
+                           '_place_name:en-ca' => '_place_name:en-ca',
                            'name:en' => 'name:en',
+                           '_place_name:en' => '_place_name:en',
                            'name' => 'name',
-                           'brand' => 'brand',
-                           'official_name:fr-ca' => 'official_name:fr-ca',
-                           'short_name:fr-ca' => 'short_name:fr-ca',
-                           'official_name:fr' => 'official_name:fr',
-                           'short_name:fr' => 'short_name:fr',
-                           'official_name:en-ca' => 'official_name:en-ca',
-                           'short_name:en-ca' => 'short_name:en-ca',
-                           'official_name:en' => 'official_name:en',
-                           'short_name:en' => 'short_name:en',
-                           'official_name' => 'official_name',
-                           'short_name' => 'short_name',
-                           'ref' => 'ref',
-                           'type' => 'type',
-                          ), $oParams->getPreferredLanguages('default'));
+                           '_place_name' => '_place_name'
+                          ), array_slice($oParams->getPreferredLanguages('default'), 0, 10));
 
         $oParams = new ParameterParser(array('accept-language' => 'ja_rm,zh_pinyin'));
         $this->assertSame(array(
                            'name:ja_rm' => 'name:ja_rm',
+                           '_place_name:ja_rm' => '_place_name:ja_rm',
                            'name:zh_pinyin' => 'name:zh_pinyin',
+                           '_place_name:zh_pinyin' => '_place_name:zh_pinyin',
                            'name:ja' => 'name:ja',
+                           '_place_name:ja' => '_place_name:ja',
                            'name:zh' => 'name:zh',
+                           '_place_name:zh' => '_place_name:zh',
                            'name' => 'name',
-                           'brand' => 'brand',
-                           'official_name:ja_rm' => 'official_name:ja_rm',
-                           'short_name:ja_rm' => 'short_name:ja_rm',
-                           'official_name:zh_pinyin' => 'official_name:zh_pinyin',
-                           'short_name:zh_pinyin' => 'short_name:zh_pinyin',
-                           'official_name:ja' => 'official_name:ja',
-                           'short_name:ja' => 'short_name:ja',
-                           'official_name:zh' => 'official_name:zh',
-                           'short_name:zh' => 'short_name:zh',
-                           'official_name' => 'official_name',
-                           'short_name' => 'short_name',
-                           'ref' => 'ref',
-                           'type' => 'type',
-                          ), $oParams->getPreferredLanguages('default'));
+                           '_place_name' => '_place_name'
+                          ), array_slice($oParams->getPreferredLanguages('default'), 0, 10));
     }
 
     public function testHasSetAny()
index c18aa762c22d33a4db5b9545fc14a5ece05eeb2f..8b95105e760bb0aa94f973114e63fa87c9bf42ea 100644 (file)
@@ -1,4 +1,12 @@
 <?php
+/**
+ * SPDX-License-Identifier: GPL-2.0-only
+ *
+ * This file is part of Nominatim. (https://nominatim.org)
+ *
+ * Copyright (C) 2022 by the Nominatim developer community.
+ * For a full list of authors see the git log.
+ */
 
 namespace Nominatim;
 
index 1b3462971039f345762c3fa2897df617e8b3a983..b5ef1a7a420d798eae5fcddabe30cf74b6fca0fb 100644 (file)
@@ -1,4 +1,12 @@
 <?php
+/**
+ * SPDX-License-Identifier: GPL-2.0-only
+ *
+ * This file is part of Nominatim. (https://nominatim.org)
+ *
+ * Copyright (C) 2022 by the Nominatim developer community.
+ * For a full list of authors see the git log.
+ */
 
 namespace Nominatim;
 
index 2d81b71d95f0c71c8d11a8bddf28c29948729f96..822194980bab145f0a3bb35539bcf9c5673d1d80 100644 (file)
@@ -1,4 +1,12 @@
 <?php
+/**
+ * SPDX-License-Identifier: GPL-2.0-only
+ *
+ * This file is part of Nominatim. (https://nominatim.org)
+ *
+ * Copyright (C) 2022 by the Nominatim developer community.
+ * For a full list of authors see the git log.
+ */
 
 namespace Nominatim;
 
index 5c9936689ed24e8052e2e36af27b9ad97587d322..69cb51809178352d99bbe4df94599d281934f8ed 100644 (file)
@@ -1,4 +1,12 @@
 <?php
+/**
+ * SPDX-License-Identifier: GPL-2.0-only
+ *
+ * This file is part of Nominatim. (https://nominatim.org)
+ *
+ * Copyright (C) 2022 by the Nominatim developer community.
+ * For a full list of authors see the git log.
+ */
 
 namespace Nominatim;
 
@@ -69,7 +77,7 @@ class SimpleWordListTest extends \PHPUnit\Framework\TestCase
 
         $oList = new SimpleWordList('a b c');
         $this->assertEquals(
-            '(a b c),(a|b c),(a b|c),(a|b|c)',
+            '(a b c),(a b|c),(a|b c),(a|b|c)',
             $this->serializeSets($oList->getWordSets(new TokensFullSet()))
         );
 
@@ -80,6 +88,22 @@ class SimpleWordListTest extends \PHPUnit\Framework\TestCase
         );
     }
 
+    public function testCmpByArraylen()
+    {
+        // Array elements are phrases, we want to sort so longest phrases are first
+        $aList1 = array('hackney', 'bridge', 'london', 'england');
+        $aList2 = array('hackney', 'london', 'bridge');
+        $aList3 = array('bridge', 'hackney', 'london', 'england');
+
+        $this->assertEquals(0, \Nominatim\SimpleWordList::cmpByArraylen($aList1, $aList1));
+
+        // list2 "wins". Less array elements
+        $this->assertEquals(1, \Nominatim\SimpleWordList::cmpByArraylen($aList1, $aList2));
+        $this->assertEquals(-1, \Nominatim\SimpleWordList::cmpByArraylen($aList2, $aList3));
+
+        // list1 "wins". Same number of array elements but longer first element
+        $this->assertEquals(-1, \Nominatim\SimpleWordList::cmpByArraylen($aList1, $aList3));
+    }
 
     public function testMaxWordSets()
     {
index 9e03a970fd2aa1211c234460918dd119cf6a7cc0..5f8bac64eed38149a3bd392643d8d1502a81f20c 100644 (file)
@@ -1,4 +1,12 @@
 <?php
+/**
+ * SPDX-License-Identifier: GPL-2.0-only
+ *
+ * This file is part of Nominatim. (https://nominatim.org)
+ *
+ * Copyright (C) 2022 by the Nominatim developer community.
+ * For a full list of authors see the git log.
+ */
 
 namespace Nominatim;
 
index fdee37234481f629a560118b972defefc9a76459..57e3c58fa08860af7236aa247462625ae962d0c7 100644 (file)
@@ -1,4 +1,12 @@
 <?php
+/**
+ * SPDX-License-Identifier: GPL-2.0-only
+ *
+ * This file is part of Nominatim. (https://nominatim.org)
+ *
+ * Copyright (C) 2022 by the Nominatim developer community.
+ * For a full list of authors see the git log.
+ */
 
 namespace Nominatim;
 
index 0735e661a5b3d3bc5a2b9a83ac559fdd324fdf6b..923e0a2220f0b83186d3b7942e2b9bfc9e568ab6 100644 (file)
@@ -1,4 +1,12 @@
 <?php
+/**
+ * SPDX-License-Identifier: GPL-2.0-only
+ *
+ * This file is part of Nominatim. (https://nominatim.org)
+ *
+ * Copyright (C) 2022 by the Nominatim developer community.
+ * For a full list of authors see the git log.
+ */
 
 namespace Nominatim;
 
index bfdbbf0595c15bb497b040d2cef0da188124366b..7d25451109dd2cfbf32d9b500cb91bc290a0afbb 100644 (file)
@@ -1,4 +1,12 @@
 <?php
+/**
+ * SPDX-License-Identifier: GPL-2.0-only
+ *
+ * This file is part of Nominatim. (https://nominatim.org)
+ *
+ * Copyright (C) 2022 by the Nominatim developer community.
+ * For a full list of authors see the git log.
+ */
     @define('CONST_LibDir', '../../lib-php');
     @define('CONST_DataDir', '../..');
 
index 853a6c0780d54f1fc8a37b6572efe24f8881ab55..22d75c2e2ca138829c6d15ad26f17c1ad5ee7aaf 100644 (file)
 {"place_id":193774423,
  "osm_type":"R",
  "osm_id":65606,
- "name":{"name": "London", "name:be": "Лондан", "name:ca": "Londres", "name:el": "Λονδίνο", "name:en": "London", "name:eo": "Londono", "name:es": "Londres", "name:fa": "لندن", "name:fi": "Lontoo", "name:fr": "Londres", "name:fy": "Londen", "name:gl": "Londres", "name:hi": "लंदन", "name:lt": "Londonas", "name:nl": "Londen", "name:pl": "Londyn", "name:pt": "Londres", "name:ru": "Лондон", "name:uk": "Лондон", "name:vi": "Luân Đôn", "name:zh": "伦敦", "int_name": "London", "name:szl": "Lůndůn", "name:tzl": "Londra", "name:be-tarask": "Лёндан"},
+ "name":{"name": "London", "ISO3166-2": "GB-LND", "name:be": "Лондан", "name:ca": "Londres", "name:el": "Λονδίνο", "name:en": "London", "name:eo": "Londono", "name:es": "Londres", "name:fa": "لندن", "name:fi": "Lontoo", "name:fr": "Londres", "name:fy": "Londen", "name:gl": "Londres", "name:hi": "लंदन", "name:lt": "Londonas", "name:nl": "Londen", "name:pl": "Londyn", "name:pt": "Londres", "name:ru": "Лондон", "name:uk": "Лондон", "name:vi": "Luân Đôn", "name:zh": "伦敦", "int_name": "London", "name:szl": "Lůndůn", "name:tzl": "Londra", "name:be-tarask": "Лёндан"},
  "class":"place",
  "type":"city",
  "admin_level":6,
 {"place_id":194325361,
  "osm_type":"R",
  "osm_id":58447,
- "name":{"name": "England", "name:be": "Англія", "name:br": "Bro-Saoz", "name:ca": "Anglaterra", "name:cs": "Anglie", "name:cy": "Lloegr", "name:de": "England", "name:el": "Αγγλία", "name:en": "England", "name:eo": "Anglujo", "name:es": "Inglaterra", "name:fi": "Englanti", "name:fr": "Angleterre", "name:fy": "Ingelân", "name:ga": "Sasana", "name:gd": "Sasainn", "name:gv": "Sostyn", "name:he": "אנגליה", "name:hu": "Anglia", "name:ia": "Anglaterra", "name:io": "Anglia", "name:it": "Inghilterra", "name:la": "Anglia", "name:lt": "Anglija", "name:nl": "Engeland", "name:pl": "Anglia", "name:pt": "Inglaterra", "name:ru": "Англия", "name:sk": "Anglicko", "name:sv": "England", "name:tr": "İngiltere", "name:uk": "Англія", "name:vi": "Anh", "name:vo": "Linglän", "name:zh": "英格蘭", "name:hsb": "Jendźelska", "name:nds": "England", "name:tok": "ma Inli", "name:tzl": "Anglatzara", "alt_name:eo": "Anglio", "alt_name:ia": "Anglia", "old_name:vi": "Anh Quốc", "alt_name:nds": "Ingland", "name:be-tarask": "Ангельшчына", "name:zh-classical": "英格蘭", "name:zh-simplified": "英格兰", "name:zh-traditional": "英格蘭"},
+ "name":{"ref": "ENG", "ISO3166-2": "GB-ENG", "name": "England", "name:be": "Англія", "name:br": "Bro-Saoz", "name:ca": "Anglaterra", "name:cs": "Anglie", "name:cy": "Lloegr", "name:de": "England", "name:el": "Αγγλία", "name:en": "England", "name:eo": "Anglujo", "name:es": "Inglaterra", "name:fi": "Englanti", "name:fr": "Angleterre", "name:fy": "Ingelân", "name:ga": "Sasana", "name:gd": "Sasainn", "name:gv": "Sostyn", "name:he": "אנגליה", "name:hu": "Anglia", "name:ia": "Anglaterra", "name:io": "Anglia", "name:it": "Inghilterra", "name:la": "Anglia", "name:lt": "Anglija", "name:nl": "Engeland", "name:pl": "Anglia", "name:pt": "Inglaterra", "name:ru": "Англия", "name:sk": "Anglicko", "name:sv": "England", "name:tr": "İngiltere", "name:uk": "Англія", "name:vi": "Anh", "name:vo": "Linglän", "name:zh": "英格蘭", "name:hsb": "Jendźelska", "name:nds": "England", "name:tok": "ma Inli", "name:tzl": "Anglatzara", "alt_name:eo": "Anglio", "alt_name:ia": "Anglia", "old_name:vi": "Anh Quốc", "alt_name:nds": "Ingland", "name:be-tarask": "Ангельшчына", "name:zh-classical": "英格蘭", "name:zh-simplified": "英格兰", "name:zh-traditional": "英格蘭"},
  "class":"boundary",
  "type":"administrative",
  "admin_level":4,
  "rank_address":4,
  "distance":0,
  "localname":"gb"}
-]
\ No newline at end of file
+]
index 79341a00acdb99c3aea5536227bf1dd6b45a2b87..e46d529408f7a4afe52dc458ad08c5599c19d43c 100644 (file)
@@ -1,26 +1,26 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<phpunit backupGlobals="false"
-    backupStaticAttributes="false"
-    colors="true"
-    convertErrorsToExceptions="true"
-    convertNoticesToExceptions="true"
-    convertWarningsToExceptions="true"
-    processIsolation="false"
-    stopOnFailure="false"
-    bootstrap="./bootstrap.php"
-    beStrictAboutTestsThatDoNotTestAnything="true"
-    >
-    <php>
+<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  backupGlobals="false"
+  backupStaticAttributes="false"
+  colors="true"
+  convertErrorsToExceptions="true"
+  convertNoticesToExceptions="true"
+  convertWarningsToExceptions="true"
+  processIsolation="false"
+  stopOnFailure="false"
+  bootstrap="./bootstrap.php"
+  beStrictAboutTestsThatDoNotTestAnything="true"
+  xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/9.3/phpunit.xsd">
+  <coverage>
+    <include>
+      <directory>../../lib-php/</directory>
+    </include>
+  </coverage>
+  <php>
     </php>
-    <testsuites>
-        <testsuite name="Nominatim PHP Test Suite">
-            <directory>./Nominatim</directory>
-        </testsuite>
-    </testsuites>
-    <filter>
-        <whitelist>
-            <directory>../../lib-php/</directory>
-        </whitelist>
-    </filter>
-
+  <testsuites>
+    <testsuite name="Nominatim PHP Test Suite">
+      <directory>./Nominatim</directory>
+    </testsuite>
+  </testsuites>
 </phpunit>
index ebf0cf0cd827148aec9f74c34b391137c5d8b47a..420740cfc65568abf9b2dae1a53e3245ae6a434d 100644 (file)
@@ -1,3 +1,9 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# This file is part of Nominatim. (https://nominatim.org)
+#
+# Copyright (C) 2022 by the Nominatim developer community.
+# For a full list of authors see the git log.
 import pytest
 
 import nominatim.cli
@@ -24,6 +30,7 @@ class DummyTokenizer:
         self.update_sql_functions_called = False
         self.finalize_import_called = False
         self.update_statistics_called = False
+        self.update_word_tokens_called = False
 
     def update_sql_functions(self, *args):
         self.update_sql_functions_called = True
@@ -34,6 +41,9 @@ class DummyTokenizer:
     def update_statistics(self):
         self.update_statistics_called = True
 
+    def update_word_tokens(self):
+        self.update_word_tokens_called = True
+
 
 @pytest.fixture
 def cli_call(src_dir):
index 0a4d064d60c46cd665716248e068739e2bca1d21..07d6c31fded55d7adc57bed1192b56f1e8ff2858 100644 (file)
@@ -1,3 +1,9 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# This file is part of Nominatim. (https://nominatim.org)
+#
+# Copyright (C) 2022 by the Nominatim developer community.
+# For a full list of authors see the git log.
 """
 Tests for command line interface wrapper.
 
@@ -20,6 +26,13 @@ def test_cli_help(cli_call, capsys):
     captured = capsys.readouterr()
     assert captured.out.startswith('usage:')
 
+def test_cli_version(cli_call, capsys):
+    """ Running nominatim tool --version prints a version string.
+    """
+    assert cli_call('--version') == 0
+
+    captured = capsys.readouterr()
+    assert captured.out.startswith('Nominatim version')
 
 @pytest.mark.parametrize("name,oid", [('file', 'foo.osm'), ('diff', 'foo.osc')])
 def test_cli_add_data_file_command(cli_call, mock_func_factory, name, oid):
index f8b6d76d3ca6061c35ee065da2ffddd4cc6594b4..696e2dd2a616ea64b2a5369842db6dfb40b32d8f 100644 (file)
@@ -1,3 +1,9 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# This file is part of Nominatim. (https://nominatim.org)
+#
+# Copyright (C) 2022 by the Nominatim developer community.
+# For a full list of authors see the git log.
 """
 Test for the command line interface wrapper admin subcommand.
 
index 9575d67663c72a43bbffbd2a7f04f12a1b64dbe5..80248ac739359967c6690f6deb72dd53ec8bd55a 100644 (file)
@@ -1,3 +1,9 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# This file is part of Nominatim. (https://nominatim.org)
+#
+# Copyright (C) 2022 by the Nominatim developer community.
+# For a full list of authors see the git log.
 """
 Tests for API access commands of command-line interface wrapper.
 """
@@ -8,15 +14,14 @@ import nominatim.clicmd.api
 
 @pytest.mark.parametrize("endpoint", (('search', 'reverse', 'lookup', 'details', 'status')))
 def test_no_api_without_phpcgi(src_dir, endpoint):
-    with pytest.raises(SystemExit):
-        nominatim.cli.nominatim(module_dir='MODULE NOT AVAILABLE',
-                                osm2pgsql_path='OSM2PGSQL NOT AVAILABLE',
-                                phplib_dir=str(src_dir / 'lib-php'),
-                                data_dir=str(src_dir / 'data'),
-                                phpcgi_path=None,
-                                sqllib_dir=str(src_dir / 'lib-sql'),
-                                config_dir=str(src_dir / 'settings'),
-                                cli_args=[endpoint])
+    assert nominatim.cli.nominatim(module_dir='MODULE NOT AVAILABLE',
+                                   osm2pgsql_path='OSM2PGSQL NOT AVAILABLE',
+                                   phplib_dir=str(src_dir / 'lib-php'),
+                                   data_dir=str(src_dir / 'data'),
+                                   phpcgi_path=None,
+                                   sqllib_dir=str(src_dir / 'lib-sql'),
+                                   config_dir=str(src_dir / 'settings'),
+                                   cli_args=[endpoint]) == 1
 
 
 @pytest.mark.parametrize("params", [('search', '--query', 'new'),
index 230080ffaa1550198ed48621f913979207ebb63c..d545c76051bd478d414f549d673ce4d179823d04 100644 (file)
@@ -1,10 +1,16 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# This file is part of Nominatim. (https://nominatim.org)
+#
+# Copyright (C) 2022 by the Nominatim developer community.
+# For a full list of authors see the git log.
 """
 Tests for import command of the command-line interface wrapper.
 """
 import pytest
 
 import nominatim.tools.database_import
-import nominatim.tools.country_info
+import nominatim.data.country_info
 import nominatim.tools.refresh
 import nominatim.tools.postcodes
 import nominatim.indexer.indexer
@@ -31,7 +37,7 @@ class TestCliImportWithDb:
     def test_import_full(self, mock_func_factory, with_updates, place_table, property_table):
         mocks = [
             mock_func_factory(nominatim.tools.database_import, 'setup_database_skeleton'),
-            mock_func_factory(nominatim.tools.country_info, 'setup_country_tables'),
+            mock_func_factory(nominatim.data.country_info, 'setup_country_tables'),
             mock_func_factory(nominatim.tools.database_import, 'import_osm_data'),
             mock_func_factory(nominatim.tools.refresh, 'import_wikipedia_articles'),
             mock_func_factory(nominatim.tools.database_import, 'truncate_data_tables'),
@@ -40,7 +46,7 @@ class TestCliImportWithDb:
             mock_func_factory(nominatim.tools.database_import, 'create_table_triggers'),
             mock_func_factory(nominatim.tools.database_import, 'create_partition_tables'),
             mock_func_factory(nominatim.tools.database_import, 'create_search_indices'),
-            mock_func_factory(nominatim.tools.country_info, 'create_country_names'),
+            mock_func_factory(nominatim.data.country_info, 'create_country_names'),
             mock_func_factory(nominatim.tools.refresh, 'load_address_levels_from_config'),
             mock_func_factory(nominatim.tools.postcodes, 'update_postcodes'),
             mock_func_factory(nominatim.indexer.indexer.Indexer, 'index_full'),
@@ -70,7 +76,7 @@ class TestCliImportWithDb:
             mock_func_factory(nominatim.tools.database_import, 'truncate_data_tables'),
             mock_func_factory(nominatim.tools.database_import, 'load_data'),
             mock_func_factory(nominatim.tools.database_import, 'create_search_indices'),
-            mock_func_factory(nominatim.tools.country_info, 'create_country_names'),
+            mock_func_factory(nominatim.data.country_info, 'create_country_names'),
             mock_func_factory(nominatim.tools.postcodes, 'update_postcodes'),
             mock_func_factory(nominatim.indexer.indexer.Indexer, 'index_full'),
             mock_func_factory(nominatim.tools.refresh, 'setup_website'),
@@ -88,7 +94,7 @@ class TestCliImportWithDb:
                                       temp_db_conn):
         mocks = [
             mock_func_factory(nominatim.tools.database_import, 'create_search_indices'),
-            mock_func_factory(nominatim.tools.country_info, 'create_country_names'),
+            mock_func_factory(nominatim.data.country_info, 'create_country_names'),
             mock_func_factory(nominatim.indexer.indexer.Indexer, 'index_full'),
             mock_func_factory(nominatim.tools.refresh, 'setup_website'),
             mock_func_factory(nominatim.db.properties, 'set_property')
@@ -109,7 +115,7 @@ class TestCliImportWithDb:
     def test_import_continue_postprocess(self, mock_func_factory):
         mocks = [
             mock_func_factory(nominatim.tools.database_import, 'create_search_indices'),
-            mock_func_factory(nominatim.tools.country_info, 'create_country_names'),
+            mock_func_factory(nominatim.data.country_info, 'create_country_names'),
             mock_func_factory(nominatim.tools.refresh, 'setup_website'),
             mock_func_factory(nominatim.db.properties, 'set_property')
         ]
index 18cc805a4ef8dda535ff2c66e85957586816488a..7f44765bcade9ce08cb4c0f41da6f95f19e822c5 100644 (file)
@@ -1,3 +1,9 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# This file is part of Nominatim. (https://nominatim.org)
+#
+# Copyright (C) 2022 by the Nominatim developer community.
+# For a full list of authors see the git log.
 """
 Tests for command line interface wrapper for refresk command.
 """
@@ -33,6 +39,11 @@ class TestRefresh:
         assert self.tokenizer_mock.update_statistics_called
 
 
+    def test_refresh_word_tokens(self):
+        assert self.call_nominatim('refresh', '--word-tokens') == 0
+        assert self.tokenizer_mock.update_word_tokens_called
+
+
     def test_refresh_postcodes(self, mock_func_factory, place_table):
         func_mock = mock_func_factory(nominatim.tools.postcodes, 'update_postcodes')
         idx_mock = mock_func_factory(nominatim.indexer.indexer.Indexer, 'index_postcodes')
@@ -71,3 +82,24 @@ class TestRefresh:
         assert self.call_nominatim('refresh', '--importance', '--wiki-data') == 0
 
         assert calls == ['import', 'update']
+
+    @pytest.mark.parametrize('params', [('--data-object', 'w234'),
+                                        ('--data-object', 'N23', '--data-object', 'N24'),
+                                        ('--data-area', 'R7723'),
+                                        ('--data-area', 'r7723', '--data-area', 'r2'),
+                                        ('--data-area', 'R9284425', '--data-object', 'n1234567894567')])
+    def test_refresh_objects(self, params, mock_func_factory):
+        func_mock = mock_func_factory(nominatim.tools.refresh, 'invalidate_osm_object')
+
+        assert self.call_nominatim('refresh', *params) == 0
+
+        assert func_mock.called == len(params)/2
+
+
+    @pytest.mark.parametrize('func', ('--data-object', '--data-area'))
+    @pytest.mark.parametrize('param', ('234', 'a55', 'R 453', 'Rel'))
+    def test_refresh_objects_bad_param(self, func, param, mock_func_factory):
+        func_mock = mock_func_factory(nominatim.tools.refresh, 'invalidate_osm_object')
+
+        self.call_nominatim('refresh', func, param) == 1
+        assert func_mock.called == 0
index 920bd67ad708cbf6e5b45eb1c2ebad09f78414a9..9fd4f5b3e7e60eaf900452fde11148420743c328 100644 (file)
@@ -1,3 +1,9 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# This file is part of Nominatim. (https://nominatim.org)
+#
+# Copyright (C) 2022 by the Nominatim developer community.
+# For a full list of authors see the git log.
 """
 Tests for replication command of command-line interface wrapper.
 """
index 69ad01accaf91feb65e8d215f7175b909fd4959f..a9cbb48dd0ed9fb7bee323998aaa3d0e19fc2109 100644 (file)
@@ -1,3 +1,9 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# This file is part of Nominatim. (https://nominatim.org)
+#
+# Copyright (C) 2022 by the Nominatim developer community.
+# For a full list of authors see the git log.
 """
 Test for loading dotenv configuration.
 """
@@ -167,6 +173,23 @@ def test_get_int_empty(make_config):
         config.get_int('DATABASE_MODULE_PATH')
 
 
+@pytest.mark.parametrize("value,outlist", [('sd', ['sd']),
+                                           ('dd,rr', ['dd', 'rr']),
+                                           (' a , b ', ['a', 'b'])])
+def test_get_str_list_success(make_config, monkeypatch, value, outlist):
+    config = make_config()
+
+    monkeypatch.setenv('NOMINATIM_MYLIST', value)
+
+    assert config.get_str_list('MYLIST') == outlist
+
+
+def test_get_str_list_empty(make_config):
+    config = make_config()
+
+    assert config.get_str_list('LANGUAGES') is None
+
+
 def test_get_path_empty(make_config):
     config = make_config()
 
diff --git a/test/python/config/test_config_load_module.py b/test/python/config/test_config_load_module.py
new file mode 100644 (file)
index 0000000..df6c479
--- /dev/null
@@ -0,0 +1,81 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# This file is part of Nominatim. (https://nominatim.org)
+#
+# Copyright (C) 2022 by the Nominatim developer community.
+# For a full list of authors see the git log.
+"""
+Test for loading extra Python modules.
+"""
+from pathlib import Path
+import sys
+
+import pytest
+
+from nominatim.config import Configuration
+
+@pytest.fixture
+def test_config(src_dir, tmp_path):
+    """ Create a configuration object with project and config directories
+        in a temporary directory.
+    """
+    (tmp_path / 'project').mkdir()
+    (tmp_path / 'config').mkdir()
+    conf = Configuration(tmp_path / 'project', src_dir / 'settings')
+    conf.config_dir = tmp_path / 'config'
+    return conf
+
+
+def test_load_default_module(test_config):
+    module = test_config.load_plugin_module('version', 'nominatim')
+
+    assert isinstance(module.NOMINATIM_VERSION, tuple)
+
+def test_load_default_module_with_hyphen(test_config):
+    module = test_config.load_plugin_module('place-info', 'nominatim.data')
+
+    assert isinstance(module.PlaceInfo, object)
+
+
+def test_load_plugin_module(test_config, tmp_path):
+    (tmp_path / 'project' / 'testpath').mkdir()
+    (tmp_path / 'project' / 'testpath' / 'mymod.py')\
+        .write_text("def my_test_function():\n  return 'gjwitlsSG42TG%'")
+
+    module = test_config.load_plugin_module('testpath/mymod.py', 'private.something')
+
+    assert module.my_test_function() == 'gjwitlsSG42TG%'
+
+    # also test reloading module
+    (tmp_path / 'project' / 'testpath' / 'mymod.py')\
+        .write_text("def my_test_function():\n  return 'hjothjorhj'")
+
+    module = test_config.load_plugin_module('testpath/mymod.py', 'private.something')
+
+    assert module.my_test_function() == 'gjwitlsSG42TG%'
+
+
+def test_load_external_library_module(test_config, tmp_path, monkeypatch):
+    MODULE_NAME = 'foogurenqodr4'
+    pythonpath = tmp_path / 'priv-python'
+    pythonpath.mkdir()
+    (pythonpath / MODULE_NAME).mkdir()
+    (pythonpath / MODULE_NAME / '__init__.py').write_text('')
+    (pythonpath / MODULE_NAME / 'tester.py')\
+        .write_text("def my_test_function():\n  return 'gjwitlsSG42TG%'")
+
+    monkeypatch.syspath_prepend(pythonpath)
+
+    module = test_config.load_plugin_module(f'{MODULE_NAME}.tester', 'private.something')
+
+    assert module.my_test_function() == 'gjwitlsSG42TG%'
+
+    # also test reloading module
+    (pythonpath / MODULE_NAME / 'tester.py')\
+        .write_text("def my_test_function():\n  return 'dfigjreigj'")
+
+    module = test_config.load_plugin_module(f'{MODULE_NAME}.tester', 'private.something')
+
+    assert module.my_test_function() == 'gjwitlsSG42TG%'
+
+    del sys.modules[f'{MODULE_NAME}.tester']
index ce96bf0d22c172fb515096885f18dabb7aea0d9b..405262950b78319d2924274ad497f933b03490f2 100644 (file)
@@ -1,3 +1,9 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# This file is part of Nominatim. (https://nominatim.org)
+#
+# Copyright (C) 2022 by the Nominatim developer community.
+# For a full list of authors see the git log.
 import itertools
 import sys
 from pathlib import Path
@@ -205,11 +211,6 @@ def osmline_table(temp_db_with_extensions, table_factory):
                      country_code VARCHAR(2)""")
 
 
-@pytest.fixture
-def word_table(temp_db_conn):
-    return mocks.MockWordTable(temp_db_conn)
-
-
 @pytest.fixture
 def sql_preprocessor_cfg(tmp_path, table_factory, temp_db_with_extensions):
     table_factory('country_name', 'partition INT', ((0, ), (1, ), (2, )))
index 620cdd98511ddfdbd66923c489dafed6e58934ae..73b83b1df840b3842bbb099ce9d5c2cc5c3af887 100644 (file)
@@ -1,3 +1,9 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# This file is part of Nominatim. (https://nominatim.org)
+#
+# Copyright (C) 2022 by the Nominatim developer community.
+# For a full list of authors see the git log.
 """
 Specialised psycopg2 cursor with shortcut functions useful for testing.
 """
diff --git a/test/python/data/test_country_info.py b/test/python/data/test_country_info.py
new file mode 100644 (file)
index 0000000..2234f40
--- /dev/null
@@ -0,0 +1,171 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# This file is part of Nominatim. (https://nominatim.org)
+#
+# Copyright (C) 2022 by the Nominatim developer community.
+# For a full list of authors see the git log.
+"""
+Tests for function that handle country properties.
+"""
+from textwrap import dedent
+import pytest
+
+from nominatim.data import country_info
+
+@pytest.fixture
+def loaded_country(def_config):
+    country_info.setup_country_config(def_config)
+
+
+@pytest.fixture
+def env_with_country_config(project_env):
+
+    def _mk_config(cfg):
+        (project_env.project_dir / 'country_settings.yaml').write_text(dedent(cfg))
+
+        return project_env
+
+    return _mk_config
+
+
+@pytest.mark.parametrize("no_partitions", (True, False))
+def test_setup_country_tables(src_dir, temp_db_with_extensions, dsn, temp_db_cursor,
+                              loaded_country, no_partitions):
+    country_info.setup_country_tables(dsn, src_dir / 'data', no_partitions)
+
+    assert temp_db_cursor.table_exists('country_name')
+    assert temp_db_cursor.table_rows('country_name') == \
+        temp_db_cursor.scalar(
+            'SELECT count(DISTINCT country_code) FROM country_name')
+
+    partitions = temp_db_cursor.row_set(
+        "SELECT DISTINCT partition FROM country_name")
+    if no_partitions:
+        assert partitions == {(0, )}
+    else:
+        assert len(partitions) > 10
+
+    assert temp_db_cursor.table_exists('country_osm_grid')
+    assert temp_db_cursor.table_rows('country_osm_grid') > 100
+
+
+@pytest.mark.parametrize("languages", (None, ['fr', 'en']))
+def test_create_country_names(temp_db_with_extensions, temp_db_conn, temp_db_cursor,
+                              table_factory, tokenizer_mock, languages, loaded_country):
+
+    table_factory('country_name', 'country_code varchar(2), name hstore',
+                  content=(('us', '"name"=>"us1","name:af"=>"us2"'),
+                           ('fr', '"name"=>"Fra", "name:en"=>"Fren"')))
+
+    assert temp_db_cursor.scalar("SELECT count(*) FROM country_name") == 2
+
+    tokenizer = tokenizer_mock()
+
+    country_info.create_country_names(temp_db_conn, tokenizer, languages)
+
+    assert len(tokenizer.analyser_cache['countries']) == 2
+
+    result_set = {k: set(v.values())
+                  for k, v in tokenizer.analyser_cache['countries']}
+
+    if languages:
+        assert result_set == {'us': set(('us', 'us1')),
+                              'fr': set(('fr', 'Fra', 'Fren'))}
+    else:
+        assert result_set == {'us': set(('us', 'us1', 'us2')),
+                              'fr': set(('fr', 'Fra', 'Fren'))}
+
+
+def test_setup_country_names_prefixes(env_with_country_config):
+    config = env_with_country_config("""\
+                                     es:
+                                       names:
+                                         name:
+                                           en: Spain
+                                           de: Spanien
+                                           default: Espagñe
+                                     us:
+                                       names:
+                                         short_name:
+                                           default: USA
+                                         name:
+                                           default: United States
+                                           en: United States
+                                     """)
+    info = country_info._CountryInfo()
+    info.load(config)
+
+    assert info.get('es')['names'] == {"name": "Espagñe",
+                                       "name:en": "Spain",
+                                       "name:de": "Spanien"}
+    assert info.get('us')['names'] == {"name": "United States",
+                                       "name:en": "United States",
+                                       "short_name": "USA"}
+    assert 'names' not in info.get('xx')
+
+
+def test_setup_country_config_languages_not_loaded(env_with_country_config):
+    config = env_with_country_config("""\
+                                     de:
+                                         partition: 3
+                                         names:
+                                             name:
+                                                 default: Deutschland
+                                     """)
+    info = country_info._CountryInfo()
+    info.load(config)
+    assert dict(info.items()) == {'de': {'partition': 3,
+                                  'languages': [],
+                                  'names': {'name': 'Deutschland'}}}
+
+
+def test_setup_country_config_name_not_loaded(env_with_country_config):
+    config = env_with_country_config("""\
+                                     de:
+                                         partition: 3
+                                         languages: de
+                                         names:
+                                     """)
+
+    info = country_info._CountryInfo()
+    info.load(config)
+
+    assert dict(info.items()) == {'de': {'partition': 3,
+                                         'languages': ['de'],
+                                         'names': {}
+                                 }}
+
+
+def test_setup_country_config_names_not_loaded(env_with_country_config):
+    config = env_with_country_config("""
+                                     de:
+                                         partition: 3
+                                         languages: de
+                                     """)
+
+    info = country_info._CountryInfo()
+    info.load(config)
+
+    assert dict(info.items()) == {'de': {'partition': 3,
+                                         'languages': ['de'],
+                                         'names': {}
+                                 }}
+
+
+def test_setup_country_config_special_character(env_with_country_config):
+    config = env_with_country_config("""
+                                     bq:
+                                         partition: 250
+                                         languages: nl
+                                         names: 
+                                             name: 
+                                                 default: "\\N"
+                                     """)
+
+    info = country_info._CountryInfo()
+    info.load(config)
+
+    assert dict(info.items()) == {'bq': {'partition': 250,
+                                         'languages': ['nl'],
+                                         'names': {'name': '\x85'}
+                                 }}
index 7398eac3c0297819adb32a4e9a01b8b1d9ddf2da..9765f2794f0c32867dcc1b0804c9fca4c58f2a71 100644 (file)
@@ -1,3 +1,9 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# This file is part of Nominatim. (https://nominatim.org)
+#
+# Copyright (C) 2022 by the Nominatim developer community.
+# For a full list of authors see the git log.
 """
 Tests for function providing a non-blocking query interface towards PostgreSQL.
 """
index 00c29a43a9a8bdf32f9531199ac0b6335fb5a502..dbba61093816bf7bde2d07f9013eb46eee0972c5 100644 (file)
@@ -1,5 +1,11 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# This file is part of Nominatim. (https://nominatim.org)
+#
+# Copyright (C) 2022 by the Nominatim developer community.
+# For a full list of authors see the git log.
 """
-Tests for specialised conenction and cursor classes.
+Tests for specialised connection and cursor classes.
 """
 import pytest
 import psycopg2
@@ -20,6 +26,16 @@ def test_connection_table_exists(db, table_factory):
     assert db.table_exists('foobar')
 
 
+def test_has_column_no_table(db):
+    assert not db.table_has_column('sometable', 'somecolumn')
+
+
+@pytest.mark.parametrize('name,result', [('tram', True), ('car', False)])
+def test_has_column(db, table_factory, name, result):
+    table_factory('stuff', 'tram TEXT')
+
+    assert db.table_has_column('stuff', name) == result
+
 def test_connection_index_exists(db, table_factory, temp_db_cursor):
     assert not db.index_exists('some_index')
 
index b17d41ea61de1e45c515b765c3b58777de5b6e53..cdd1b7af97244c453538b6cb8e17dcca469d5099 100644 (file)
@@ -1,3 +1,9 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# This file is part of Nominatim. (https://nominatim.org)
+#
+# Copyright (C) 2022 by the Nominatim developer community.
+# For a full list of authors see the git log.
 """
 Tests for property table manpulation.
 """
index 2ca0c66112e8b8f094a2045e681cb3fa6bc10eae..9997367c424e3188c1f9bf043c50dce424d5a97f 100644 (file)
@@ -1,3 +1,9 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# This file is part of Nominatim. (https://nominatim.org)
+#
+# Copyright (C) 2022 by the Nominatim developer community.
+# For a full list of authors see the git log.
 """
 Tests for SQL preprocessing.
 """
index b6f5a7b19132431c7c5192b84258d994678eca47..0cb12e0297889e4714aa302657e8863443b62bfe 100644 (file)
@@ -1,3 +1,9 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# This file is part of Nominatim. (https://nominatim.org)
+#
+# Copyright (C) 2022 by the Nominatim developer community.
+# For a full list of authors see the git log.
 """
 Tests for status table manipulation.
 """
index 9eea7ed101eb1421ad67e69124634d87076f1ab2..e0be962f09e8fe991840d6533b87c3ad05ff9585 100644 (file)
@@ -1,3 +1,9 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# This file is part of Nominatim. (https://nominatim.org)
+#
+# Copyright (C) 2022 by the Nominatim developer community.
+# For a full list of authors see the git log.
 """
 Tests for DB utility functions in db.utils
 """
@@ -59,7 +65,7 @@ class TestCopyBuffer:
 
     @pytest.fixture(autouse=True)
     def setup_test_table(self, table_factory):
-        table_factory(self.TABLE_NAME, 'colA INT, colB TEXT')
+        table_factory(self.TABLE_NAME, 'col_a INT, col_b TEXT')
 
 
     def table_rows(self, cursor):
@@ -86,7 +92,7 @@ class TestCopyBuffer:
             buf.add('foo')
 
             buf.copy_out(temp_db_cursor, self.TABLE_NAME,
-                         columns=['colB'])
+                         columns=['col_b'])
 
         assert self.table_rows(temp_db_cursor) == {(None, 'foo')}
 
@@ -97,7 +103,7 @@ class TestCopyBuffer:
             buf.add(' two ', 2)
 
             buf.copy_out(temp_db_cursor, self.TABLE_NAME,
-                         columns=['colB', 'colA'])
+                         columns=['col_b', 'col_a'])
 
         assert self.table_rows(temp_db_cursor) == {(1, 'one'), (2, ' two ')}
 
@@ -109,7 +115,7 @@ class TestCopyBuffer:
             buf.add('\\N')
 
             buf.copy_out(temp_db_cursor, self.TABLE_NAME,
-                         columns=['colB'])
+                         columns=['col_b'])
 
         assert self.table_rows(temp_db_cursor) == {(None, 'foo\tbar'),
                                                    (None, 'sun\nson'),
@@ -122,7 +128,7 @@ class TestCopyBufferJson:
 
     @pytest.fixture(autouse=True)
     def setup_test_table(self, table_factory):
-        table_factory(self.TABLE_NAME, 'colA INT, colB JSONB')
+        table_factory(self.TABLE_NAME, 'col_a INT, col_b JSONB')
 
 
     def table_rows(self, cursor):
index 6029eb7c6620b5f088f831dec66dede835664340..ed32c650dab3d873ae8dbddbf5fead64ea1e94ac 100644 (file)
@@ -1,7 +1,13 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# This file is part of Nominatim. (https://nominatim.org)
+#
+# Copyright (C) 2022 by the Nominatim developer community.
+# For a full list of authors see the git log.
 """
 Tokenizer for testing.
 """
-from nominatim.indexer.place_info import PlaceInfo
+from nominatim.data.place_info import PlaceInfo
 from nominatim.config import Configuration
 
 def create(dsn, data_dir):
index 9adf969e4e427823fb2427c8933505c17f7b21e2..45c68a33941a2b24141ff1c08e0e82c233efe215 100644 (file)
@@ -1,3 +1,9 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# This file is part of Nominatim. (https://nominatim.org)
+#
+# Copyright (C) 2022 by the Nominatim developer community.
+# For a full list of authors see the git log.
 """
 Tests for running the indexing.
 """
@@ -171,25 +177,16 @@ def test_index_all_by_rank(test_db, threads, test_tokenizer):
         SELECT count(*) FROM placex p WHERE rank_address > 0
           AND indexed_date >= (SELECT min(indexed_date) FROM placex o
                                WHERE p.rank_address < o.rank_address)""") == 0
-    # placex rank < 30 objects come before interpolations
+    # placex address ranked objects come before interpolations
     assert test_db.scalar(
-        """SELECT count(*) FROM placex WHERE rank_address < 30
+        """SELECT count(*) FROM placex WHERE rank_address 0
              AND indexed_date >
                    (SELECT min(indexed_date) FROM location_property_osmline)""") == 0
-    # placex rank = 30 objects come after interpolations
+    # rank 0 comes after all other placex objects
     assert test_db.scalar(
-        """SELECT count(*) FROM placex WHERE rank_address = 30
-             AND indexed_date <
-                   (SELECT max(indexed_date) FROM location_property_osmline)""") == 0
-    # rank 0 comes after rank 29 and before rank 30
-    assert test_db.scalar(
-        """SELECT count(*) FROM placex WHERE rank_address < 30
+        """SELECT count(*) FROM placex WHERE rank_address > 0
              AND indexed_date >
                    (SELECT min(indexed_date) FROM placex WHERE rank_address = 0)""") == 0
-    assert test_db.scalar(
-        """SELECT count(*) FROM placex WHERE rank_address = 30
-             AND indexed_date <
-                   (SELECT max(indexed_date) FROM placex WHERE rank_address = 0)""") == 0
 
 
 @pytest.mark.parametrize("threads", [1, 15])
index 35a99b83641404ec0f0bbf7a8025c1f8580107d9..08fd60a227b0e29be9dbe5777689639641d23d2b 100644 (file)
@@ -1,3 +1,9 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# This file is part of Nominatim. (https://nominatim.org)
+#
+# Copyright (C) 2022 by the Nominatim developer community.
+# For a full list of authors see the git log.
 """
 Legacy word table for testing with functions to prefil and test contents
 of the table.
@@ -52,6 +58,24 @@ class MockIcuWordTable:
         self.conn.commit()
 
 
+    def add_housenumber(self, word_id, word_tokens, word=None):
+        with self.conn.cursor() as cur:
+            if isinstance(word_tokens, str):
+                # old style without analyser
+                cur.execute("""INSERT INTO word (word_id, word_token, type)
+                                  VALUES (%s, %s, 'H')
+                            """, (word_id, word_tokens))
+            else:
+                if word is None:
+                    word = word_tokens[0]
+                for token in word_tokens:
+                    cur.execute("""INSERT INTO word (word_id, word_token, type, word, info)
+                                      VALUES (%s, %s, 'H', %s, jsonb_build_object('lookup', %s))
+                                """, (word_id, token, word, word_tokens[0]))
+
+        self.conn.commit()
+
+
     def count(self):
         with self.conn.cursor() as cur:
             return cur.scalar("SELECT count(*) FROM word")
@@ -62,6 +86,11 @@ class MockIcuWordTable:
             return cur.scalar("SELECT count(*) FROM word WHERE type = 'S'")
 
 
+    def count_housenumbers(self):
+        with self.conn.cursor() as cur:
+            return cur.scalar("SELECT count(*) FROM word WHERE type = 'H'")
+
+
     def get_special(self):
         with self.conn.cursor() as cur:
             cur.execute("SELECT word_token, info, word FROM word WHERE type = 'S'")
index 40fe1044544b3d94582480cd7633b00787ee878e..fa94d0354cb81938e29185b0a433a23e42831f0e 100644 (file)
@@ -1,3 +1,9 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# This file is part of Nominatim. (https://nominatim.org)
+#
+# Copyright (C) 2022 by the Nominatim developer community.
+# For a full list of authors see the git log.
 """
 Legacy word table for testing with functions to prefil and test contents
 of the table.
index d01d5fc259d9399932eb736c1316d9daf59bc5e9..a2fff67794b482decc1a6883e9858b57425e8a80 100644 (file)
@@ -1,3 +1,9 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# This file is part of Nominatim. (https://nominatim.org)
+#
+# Copyright (C) 2022 by the Nominatim developer community.
+# For a full list of authors see the git log.
 """
 Custom mocks for testing.
 """
@@ -8,7 +14,7 @@ import psycopg2.extras
 from nominatim.db import properties
 
 # This must always point to the mock word table for the default tokenizer.
-from mock_legacy_word_table import MockLegacyWordTable as MockWordTable
+from mock_icu_word_table import MockIcuWordTable as MockWordTable
 
 class MockPlacexTable:
     """ A placex table for testing.
@@ -36,6 +42,7 @@ class MockPlacexTable:
                                admin_level smallint,
                                address hstore,
                                extratags hstore,
+                               token_info jsonb,
                                geometry Geometry(Geometry,4326),
                                wikipedia TEXT,
                                country_code varchar(2),
diff --git a/test/python/pytest.ini b/test/python/pytest.ini
new file mode 100644 (file)
index 0000000..15441de
--- /dev/null
@@ -0,0 +1,3 @@
+[pytest]
+markers =
+    sanitizer_params
\ No newline at end of file
diff --git a/test/python/tokenizer/sanitizers/test_clean_housenumbers.py b/test/python/tokenizer/sanitizers/test_clean_housenumbers.py
new file mode 100644 (file)
index 0000000..11a71a5
--- /dev/null
@@ -0,0 +1,68 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# This file is part of Nominatim. (https://nominatim.org)
+#
+# Copyright (C) 2022 by the Nominatim developer community.
+# For a full list of authors see the git log.
+"""
+Tests for the sanitizer that normalizes housenumbers.
+"""
+import pytest
+
+from nominatim.tokenizer.place_sanitizer import PlaceSanitizer
+from nominatim.data.place_info import PlaceInfo
+
+@pytest.fixture
+def sanitize(request, def_config):
+    sanitizer_args = {'step': 'clean-housenumbers'}
+    for mark in request.node.iter_markers(name="sanitizer_params"):
+        sanitizer_args.update({k.replace('_', '-') : v for k,v in mark.kwargs.items()})
+
+    def _run(**kwargs):
+        place = PlaceInfo({'address': kwargs})
+        _, address = PlaceSanitizer([sanitizer_args], def_config).process_names(place)
+
+        return sorted([(p.kind, p.name) for p in address])
+
+    return _run
+
+
+def test_simple_number(sanitize):
+    assert sanitize(housenumber='34') == [('housenumber', '34')]
+
+
+@pytest.mark.parametrize('number', ['1;2;3', '1,2,3', '1; 3 ,2',
+                                    '2,,3,1', '1;2;3;;', ';3;2;1'])
+def test_housenumber_lists(sanitize, number):
+    assert sanitize(housenumber=number) == \
+           [('housenumber', '1'), ('housenumber', '2'), ('housenumber', '3')]
+
+
+@pytest.mark.sanitizer_params(filter_kind=('number', 'streetnumber'))
+def test_filter_kind(sanitize):
+    assert sanitize(housenumber='34', number='4', badnumber='65') == \
+            [('badnumber', '65'), ('housenumber', '34'), ('housenumber', '4')]
+
+
+@pytest.mark.parametrize('number', ('6523', 'n/a', '4'))
+def test_convert_to_name_converted(def_config, number):
+    sanitizer_args = {'step': 'clean-housenumbers',
+                      'convert-to-name': (r'\d+', 'n/a')}
+
+    place = PlaceInfo({'address': {'housenumber': number}})
+    names, address = PlaceSanitizer([sanitizer_args], def_config).process_names(place)
+
+    assert ('housenumber', number) in set((p.kind, p.name) for p in names)
+    assert 'housenumber' not in set(p.kind for p in address)
+
+
+@pytest.mark.parametrize('number', ('a54', 'n.a', 'bow'))
+def test_convert_to_name_unconverted(def_config, number):
+    sanitizer_args = {'step': 'clean-housenumbers',
+                      'convert-to-name': (r'\d+', 'n/a')}
+
+    place = PlaceInfo({'address': {'housenumber': number}})
+    names, address = PlaceSanitizer([sanitizer_args], def_config).process_names(place)
+
+    assert 'housenumber' not in set(p.kind for p in names)
+    assert ('housenumber', number) in set((p.kind, p.name) for p in address)
diff --git a/test/python/tokenizer/sanitizers/test_clean_postcodes.py b/test/python/tokenizer/sanitizers/test_clean_postcodes.py
new file mode 100644 (file)
index 0000000..f2c965a
--- /dev/null
@@ -0,0 +1,102 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# This file is part of Nominatim. (https://nominatim.org)
+#
+# Copyright (C) 2022 by the Nominatim developer community.
+# For a full list of authors see the git log.
+"""
+Tests for the sanitizer that normalizes postcodes.
+"""
+import pytest
+
+from nominatim.tokenizer.place_sanitizer import PlaceSanitizer
+from nominatim.data.place_info import PlaceInfo
+from nominatim.data import country_info
+
+@pytest.fixture
+def sanitize(def_config, request):
+    country_info.setup_country_config(def_config)
+    sanitizer_args = {'step': 'clean-postcodes'}
+    for mark in request.node.iter_markers(name="sanitizer_params"):
+        sanitizer_args.update({k.replace('_', '-') : v for k,v in mark.kwargs.items()})
+
+    def _run(country=None, **kwargs):
+        pi = {'address': kwargs}
+        if country is not None:
+            pi['country_code'] = country
+
+        _, address = PlaceSanitizer([sanitizer_args], def_config).process_names(PlaceInfo(pi))
+
+        return sorted([(p.kind, p.name) for p in address])
+
+    return _run
+
+
+@pytest.mark.parametrize("country", (None, 'ae'))
+def test_postcode_no_country(sanitize, country):
+    assert sanitize(country=country, postcode='23231') == [('unofficial_postcode', '23231')]
+
+
+@pytest.mark.parametrize("country", (None, 'ae'))
+@pytest.mark.sanitizer_params(convert_to_address=False)
+def test_postcode_no_country_drop(sanitize, country):
+    assert sanitize(country=country, postcode='23231') == []
+
+
+@pytest.mark.parametrize("postcode", ('12345', '  12345  ', 'de 12345',
+                                      'DE12345', 'DE 12345', 'DE-12345'))
+def test_postcode_pass_good_format(sanitize, postcode):
+    assert sanitize(country='de', postcode=postcode) == [('postcode', '12345')]
+
+
+@pytest.mark.parametrize("postcode", ('123456', '', '   ', '.....',
+                                      'DE  12345', 'DEF12345', 'CH 12345'))
+@pytest.mark.sanitizer_params(convert_to_address=False)
+def test_postcode_drop_bad_format(sanitize, postcode):
+    assert sanitize(country='de', postcode=postcode) == []
+
+
+@pytest.mark.parametrize("postcode", ('1234', '9435', '99000'))
+def test_postcode_cyprus_pass(sanitize, postcode):
+    assert sanitize(country='cy', postcode=postcode) == [('postcode', postcode)]
+
+
+@pytest.mark.parametrize("postcode", ('91234', '99a45', '567'))
+@pytest.mark.sanitizer_params(convert_to_address=False)
+def test_postcode_cyprus_fail(sanitize, postcode):
+    assert sanitize(country='cy', postcode=postcode) == []
+
+
+@pytest.mark.parametrize("postcode", ('123456', 'A33F2G7'))
+def test_postcode_kazakhstan_pass(sanitize, postcode):
+    assert sanitize(country='kz', postcode=postcode) == [('postcode', postcode)]
+
+
+@pytest.mark.parametrize("postcode", ('V34T6Y923456', '99345'))
+@pytest.mark.sanitizer_params(convert_to_address=False)
+def test_postcode_kazakhstan_fail(sanitize, postcode):
+    assert sanitize(country='kz', postcode=postcode) == []
+
+
+@pytest.mark.parametrize("postcode", ('675 34', '67534', 'SE-675 34', 'SE67534'))
+def test_postcode_sweden_pass(sanitize, postcode):
+    assert sanitize(country='se', postcode=postcode) == [('postcode', '675 34')]
+
+
+@pytest.mark.parametrize("postcode", ('67 345', '671123'))
+@pytest.mark.sanitizer_params(convert_to_address=False)
+def test_postcode_sweden_fail(sanitize, postcode):
+    assert sanitize(country='se', postcode=postcode) == []
+
+
+@pytest.mark.parametrize("postcode", ('AB1', '123-456-7890', '1 as 44'))
+@pytest.mark.sanitizer_params(default_pattern='[A-Z0-9- ]{3,12}')
+def test_postcode_default_pattern_pass(sanitize, postcode):
+    assert sanitize(country='an', postcode=postcode) == [('postcode', postcode.upper())]
+
+
+@pytest.mark.parametrize("postcode", ('C', '12', 'ABC123DEF 456', '1234,5678', '11223;11224'))
+@pytest.mark.sanitizer_params(convert_to_address=False, default_pattern='[A-Z0-9- ]{3,12}')
+def test_postcode_default_pattern_fail(sanitize, postcode):
+    assert sanitize(country='an', postcode=postcode) == []
+
diff --git a/test/python/tokenizer/sanitizers/test_sanitizer_config.py b/test/python/tokenizer/sanitizers/test_sanitizer_config.py
new file mode 100644 (file)
index 0000000..0dbbc7a
--- /dev/null
@@ -0,0 +1,113 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# This file is part of Nominatim. (https://nominatim.org)
+#
+# Copyright (C) 2022 by the Nominatim developer community.
+# For a full list of authors see the git log.
+"""
+Tests for sanitizer configuration helper functions.
+"""
+import pytest
+
+from nominatim.errors import UsageError
+from nominatim.tokenizer.place_sanitizer import PlaceName
+from nominatim.tokenizer.sanitizers.config import SanitizerConfig
+
+def test_string_list_default_empty():
+    assert SanitizerConfig().get_string_list('op') == []
+
+
+def test_string_list_default_none():
+    assert SanitizerConfig().get_string_list('op', default=None) is None
+
+
+def test_string_list_default_something():
+    assert SanitizerConfig().get_string_list('op', default=['a', 'b']) == ['a', 'b']
+
+
+def test_string_list_value_string():
+    assert SanitizerConfig({'op': 't'}).get_string_list('op', default=['a', 'b']) == ['t']
+
+
+def test_string_list_value_list():
+    assert SanitizerConfig({'op': ['1', '2']}).get_string_list('op') == ['1', '2']
+
+
+def test_string_list_value_empty():
+    assert SanitizerConfig({'op': ''}).get_string_list('op', default=['a', 'b']) == []
+
+
+def test_string_list_value_dict():
+    with pytest.raises(UsageError):
+        SanitizerConfig({'op': {'1': 'a'}}).get_string_list('op')
+
+
+def test_string_list_value_int_list():
+    with pytest.raises(UsageError):
+        SanitizerConfig({'op': [1, 2]}).get_string_list('op')
+
+
+@pytest.mark.parametrize('inp', ('fg34', 'f\\f', 'morning [glory]', '56.78'))
+def test_create_split_regex_no_params_unsplit(inp):
+    regex = SanitizerConfig().get_delimiter()
+
+    assert list(regex.split(inp)) == [inp]
+
+
+@pytest.mark.parametrize('inp,outp', [('here,there', ['here', 'there']),
+                                      ('ying;;yang', ['ying', 'yang']),
+                                      (';a; ;c;d,', ['', 'a', '', 'c', 'd', '']),
+                                      ('1,  3  ,5', ['1', '3', '5'])
+                                     ])
+def test_create_split_regex_no_params_split(inp, outp):
+    regex = SanitizerConfig().get_delimiter()
+
+    assert list(regex.split(inp)) == outp
+
+
+@pytest.mark.parametrize('delimiter', ['.', '\\', '[]', '   ', '/.*+'])
+def test_create_split_regex_custom(delimiter):
+    regex = SanitizerConfig({'delimiters': delimiter}).get_delimiter()
+
+    assert list(regex.split(f'out{delimiter}house')) == ['out', 'house']
+    assert list(regex.split('out,house')) == ['out,house']
+
+
+def test_create_split_regex_empty_delimiter():
+    with pytest.raises(UsageError):
+        regex = SanitizerConfig({'delimiters': ''}).get_delimiter()
+
+
+@pytest.mark.parametrize('inp', ('name', 'name:de', 'na\\me', '.*'))
+def test_create_kind_filter_no_params(inp):
+    filt = SanitizerConfig().get_filter_kind()
+
+    assert filt(inp)
+
+
+@pytest.mark.parametrize('kind', ('de', 'name:de', 'ende'))
+def test_create_kind_filter_custom_regex_positive(kind):
+    filt = SanitizerConfig({'filter-kind': '.*de'}).get_filter_kind()
+
+    assert filt(kind)
+
+
+@pytest.mark.parametrize('kind', ('de ', '123', '', 'bedece'))
+def test_create_kind_filter_custom_regex_negative(kind):
+    filt = SanitizerConfig({'filter-kind': '.*de'}).get_filter_kind()
+
+    assert not filt(kind)
+
+
+@pytest.mark.parametrize('kind', ('name', 'fr', 'name:fr', 'frfr', '34'))
+def test_create_kind_filter_many_positive(kind):
+    filt = SanitizerConfig({'filter-kind': ['.*fr', 'name', r'\d+']}).get_filter_kind()
+
+    assert filt(kind)
+
+
+@pytest.mark.parametrize('kind', ('name:de', 'fridge', 'a34', '.*', '\\'))
+def test_create_kind_filter_many_negative(kind):
+    filt = SanitizerConfig({'filter-kind': ['.*fr', 'name', r'\d+']}).get_filter_kind()
+
+    assert not filt(kind)
index ee74546920fd35d8998c29ea128b6f4f9f0c8348..9ca539d57cb529cac93283c813c3f0a7075900a8 100644 (file)
@@ -1,65 +1,79 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# This file is part of Nominatim. (https://nominatim.org)
+#
+# Copyright (C) 2022 by the Nominatim developer community.
+# For a full list of authors see the git log.
 """
-Tests for the sanitizer that splitts multivalue lists.
+Tests for the sanitizer that splits multivalue lists.
 """
 import pytest
 
 from nominatim.tokenizer.place_sanitizer import PlaceSanitizer
-from nominatim.indexer.place_info import PlaceInfo
+from nominatim.data.place_info import PlaceInfo
 
 from nominatim.errors import UsageError
 
-def run_sanitizer_on(**kwargs):
-    place = PlaceInfo({'name': kwargs})
-    name, _ = PlaceSanitizer([{'step': 'split-name-list'}]).process_names(place)
+class TestSplitName:
 
-    return sorted([(p.name, p.kind, p.suffix) for p in name])
+    @pytest.fixture(autouse=True)
+    def setup_country(self, def_config):
+        self.config = def_config
 
 
-def sanitize_with_delimiter(delimiter, name):
-    place = PlaceInfo({'name': {'name': name}})
-    san = PlaceSanitizer([{'step': 'split-name-list', 'delimiters': delimiter}])
-    name, _ = san.process_names(place)
+    def run_sanitizer_on(self, **kwargs):
+        place = PlaceInfo({'name': kwargs})
+        name, _ = PlaceSanitizer([{'step': 'split-name-list'}], self.config).process_names(place)
 
-    return sorted([p.name for p in name])
+        return sorted([(p.name, p.kind, p.suffix) for p in name])
 
 
-def test_simple():
-    assert run_sanitizer_on(name='ABC') == [('ABC', 'name', None)]
-    assert run_sanitizer_on(name='') == [('', 'name', None)]
+    def sanitize_with_delimiter(self, delimiter, name):
+        place = PlaceInfo({'name': {'name': name}})
+        san = PlaceSanitizer([{'step': 'split-name-list', 'delimiters': delimiter}],
+                             self.config)
+        name, _ = san.process_names(place)
 
+        return sorted([p.name for p in name])
 
-def test_splits():
-    assert run_sanitizer_on(name='A;B;C') == [('A', 'name', None),
-                                              ('B', 'name', None),
-                                              ('C', 'name', None)]
-    assert run_sanitizer_on(short_name=' House, boat ') == [('House', 'short_name', None),
-                                                            ('boat', 'short_name', None)]
 
+    def test_simple(self):
+        assert self.run_sanitizer_on(name='ABC') == [('ABC', 'name', None)]
+        assert self.run_sanitizer_on(name='') == [('', 'name', None)]
 
-def test_empty_fields():
-    assert run_sanitizer_on(name='A;;B') == [('A', 'name', None),
-                                             ('B', 'name', None)]
-    assert run_sanitizer_on(name='A; ,B') == [('A', 'name', None),
-                                              ('B', 'name', None)]
-    assert run_sanitizer_on(name=' ;B') == [('B', 'name', None)]
-    assert run_sanitizer_on(name='B,') == [('B', 'name', None)]
 
+    def test_splits(self):
+        assert self.run_sanitizer_on(name='A;B;C') == [('A', 'name', None),
+                                                       ('B', 'name', None),
+                                                       ('C', 'name', None)]
+        assert self.run_sanitizer_on(short_name=' House, boat ') == [('House', 'short_name', None),
+                                                                     ('boat', 'short_name', None)]
 
-def test_custom_delimiters():
-    assert sanitize_with_delimiter(':', '12:45,3') == ['12', '45,3']
-    assert sanitize_with_delimiter('\\', 'a;\\b!#@ \\') == ['a;', 'b!#@']
-    assert sanitize_with_delimiter('[]', 'foo[to]be') == ['be', 'foo', 'to']
-    assert sanitize_with_delimiter(' ', 'morning  sun') == ['morning', 'sun']
 
+    def test_empty_fields(self):
+        assert self.run_sanitizer_on(name='A;;B') == [('A', 'name', None),
+                                                      ('B', 'name', None)]
+        assert self.run_sanitizer_on(name='A; ,B') == [('A', 'name', None),
+                                                       ('B', 'name', None)]
+        assert self.run_sanitizer_on(name=' ;B') == [('B', 'name', None)]
+        assert self.run_sanitizer_on(name='B,') == [('B', 'name', None)]
 
-def test_empty_delimiter_set():
-    with pytest.raises(UsageError):
-        sanitize_with_delimiter('', 'abc')
 
+    def test_custom_delimiters(self):
+        assert self.sanitize_with_delimiter(':', '12:45,3') == ['12', '45,3']
+        assert self.sanitize_with_delimiter('\\', 'a;\\b!#@ \\') == ['a;', 'b!#@']
+        assert self.sanitize_with_delimiter('[]', 'foo[to]be') == ['be', 'foo', 'to']
+        assert self.sanitize_with_delimiter(' ', 'morning  sun') == ['morning', 'sun']
 
-def test_no_name_list():
+
+    def test_empty_delimiter_set(self):
+        with pytest.raises(UsageError):
+            self.sanitize_with_delimiter('', 'abc')
+
+
+def test_no_name_list(def_config):
     place = PlaceInfo({'address': {'housenumber': '3'}})
-    name, address = PlaceSanitizer([{'step': 'split-name-list'}]).process_names(place)
+    name, address = PlaceSanitizer([{'step': 'split-name-list'}], def_config).process_names(place)
 
     assert not name
     assert len(address) == 1
index 50af2449b2eba2e0b407e5771676b140d712ba0c..7fa0a018d7603bf6a80d163e8ec818fc1208bb2e 100644 (file)
@@ -1,44 +1,56 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# This file is part of Nominatim. (https://nominatim.org)
+#
+# Copyright (C) 2022 by the Nominatim developer community.
+# For a full list of authors see the git log.
 """
 Tests for the sanitizer that handles braced suffixes.
 """
 import pytest
 
 from nominatim.tokenizer.place_sanitizer import PlaceSanitizer
-from nominatim.indexer.place_info import PlaceInfo
+from nominatim.data.place_info import PlaceInfo
 
-def run_sanitizer_on(**kwargs):
-    place = PlaceInfo({'name': kwargs})
-    name, _ = PlaceSanitizer([{'step': 'strip-brace-terms'}]).process_names(place)
+class TestStripBrace:
 
-    return sorted([(p.name, p.kind, p.suffix) for p in name])
+    @pytest.fixture(autouse=True)
+    def setup_country(self, def_config):
+        self.config = def_config
 
+    def run_sanitizer_on(self, **kwargs):
+        place = PlaceInfo({'name': kwargs})
+        name, _ = PlaceSanitizer([{'step': 'strip-brace-terms'}], self.config).process_names(place)
 
-def test_no_braces():
-    assert run_sanitizer_on(name='foo', ref='23') == [('23', 'ref', None),
-                                                      ('foo', 'name', None)]
+        return sorted([(p.name, p.kind, p.suffix) for p in name])
 
 
-def test_simple_braces():
-    assert run_sanitizer_on(name='Halle (Saale)', ref='3')\
-      == [('3', 'ref', None), ('Halle', 'name', None), ('Halle (Saale)', 'name', None)]
-    assert run_sanitizer_on(name='ack ( bar')\
-      == [('ack', 'name', None), ('ack ( bar', 'name', None)]
+    def test_no_braces(self):
+        assert self.run_sanitizer_on(name='foo', ref='23') == [('23', 'ref', None),
+                                                               ('foo', 'name', None)]
 
 
-def test_only_braces():
-    assert run_sanitizer_on(name='(maybe)') == [('(maybe)', 'name', None)]
+    def test_simple_braces(self):
+        assert self.run_sanitizer_on(name='Halle (Saale)', ref='3')\
+          == [('3', 'ref', None), ('Halle', 'name', None), ('Halle (Saale)', 'name', None)]
+        assert self.run_sanitizer_on(name='ack ( bar')\
+          == [('ack', 'name', None), ('ack ( bar', 'name', None)]
 
 
-def test_double_braces():
-    assert run_sanitizer_on(name='a((b))') == [('a', 'name', None),
-                                               ('a((b))', 'name', None)]
-    assert run_sanitizer_on(name='a (b) (c)') == [('a', 'name', None),
-                                                  ('a (b) (c)', 'name', None)]
+    def test_only_braces(self):
+        assert self.run_sanitizer_on(name='(maybe)') == [('(maybe)', 'name', None)]
 
 
-def test_no_names():
+    def test_double_braces(self):
+        assert self.run_sanitizer_on(name='a((b))') == [('a', 'name', None),
+                                                        ('a((b))', 'name', None)]
+        assert self.run_sanitizer_on(name='a (b) (c)') == [('a', 'name', None),
+                                                           ('a (b) (c)', 'name', None)]
+
+
+def test_no_names(def_config):
     place = PlaceInfo({'address': {'housenumber': '3'}})
-    name, address = PlaceSanitizer([{'step': 'strip-brace-terms'}]).process_names(place)
+    name, address = PlaceSanitizer([{'step': 'strip-brace-terms'}], def_config).process_names(place)
 
     assert not name
     assert len(address) == 1
index e4a836fa817e6e8ffcc6bd23302cf5f164fc066d..1feecf3f6341b32728ef03ea91ab1a672962bd47 100644 (file)
@@ -1,19 +1,30 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# This file is part of Nominatim. (https://nominatim.org)
+#
+# Copyright (C) 2022 by the Nominatim developer community.
+# For a full list of authors see the git log.
 """
 Tests for the sanitizer that enables language-dependent analyzers.
 """
 import pytest
 
-from nominatim.indexer.place_info import PlaceInfo
+from nominatim.data.place_info import PlaceInfo
 from nominatim.tokenizer.place_sanitizer import PlaceSanitizer
-from nominatim.tools.country_info import setup_country_config
+from nominatim.data.country_info import setup_country_config
 
 class TestWithDefaults:
 
-    @staticmethod
-    def run_sanitizer_on(country, **kwargs):
+    @pytest.fixture(autouse=True)
+    def setup_country(self, def_config):
+        self.config = def_config
+
+
+    def run_sanitizer_on(self, country, **kwargs):
         place = PlaceInfo({'name': {k.replace('_', ':'): v for k, v in kwargs.items()},
                            'country_code': country})
-        name, _ = PlaceSanitizer([{'step': 'tag-analyzer-by-language'}]).process_names(place)
+        name, _ = PlaceSanitizer([{'step': 'tag-analyzer-by-language'}],
+                                 self.config).process_names(place)
 
         return sorted([(p.name, p.kind, p.suffix, p.attr) for p in name])
 
@@ -38,12 +49,17 @@ class TestWithDefaults:
 
 class TestFilterKind:
 
-    @staticmethod
-    def run_sanitizer_on(filt, **kwargs):
+    @pytest.fixture(autouse=True)
+    def setup_country(self, def_config):
+        self.config = def_config
+
+
+    def run_sanitizer_on(self, filt, **kwargs):
         place = PlaceInfo({'name': {k.replace('_', ':'): v for k, v in kwargs.items()},
                            'country_code': 'de'})
         name, _ = PlaceSanitizer([{'step': 'tag-analyzer-by-language',
-                                   'filter-kind': filt}]).process_names(place)
+                                   'filter-kind': filt}],
+                                 self.config).process_names(place)
 
         return sorted([(p.name, p.kind, p.suffix, p.attr) for p in name])
 
@@ -88,14 +104,16 @@ class TestDefaultCountry:
     @pytest.fixture(autouse=True)
     def setup_country(self, def_config):
         setup_country_config(def_config)
+        self.config = def_config
+
 
-    @staticmethod
-    def run_sanitizer_append(mode,  country, **kwargs):
+    def run_sanitizer_append(self, mode,  country, **kwargs):
         place = PlaceInfo({'name': {k.replace('_', ':'): v for k, v in kwargs.items()},
                            'country_code': country})
         name, _ = PlaceSanitizer([{'step': 'tag-analyzer-by-language',
                                    'use-defaults': mode,
-                                   'mode': 'append'}]).process_names(place)
+                                   'mode': 'append'}],
+                                 self.config).process_names(place)
 
         assert all(isinstance(p.attr, dict) for p in name)
         assert all(len(p.attr) <= 1 for p in name)
@@ -105,13 +123,13 @@ class TestDefaultCountry:
         return sorted([(p.name, p.attr.get('analyzer', '')) for p in name])
 
 
-    @staticmethod
-    def run_sanitizer_replace(mode,  country, **kwargs):
+    def run_sanitizer_replace(self, mode,  country, **kwargs):
         place = PlaceInfo({'name': {k.replace('_', ':'): v for k, v in kwargs.items()},
                            'country_code': country})
         name, _ = PlaceSanitizer([{'step': 'tag-analyzer-by-language',
                                    'use-defaults': mode,
-                                   'mode': 'replace'}]).process_names(place)
+                                   'mode': 'replace'}],
+                                 self.config).process_names(place)
 
         assert all(isinstance(p.attr, dict) for p in name)
         assert all(len(p.attr) <= 1 for p in name)
@@ -125,7 +143,8 @@ class TestDefaultCountry:
         place = PlaceInfo({'name': {'name': 'something'}})
         name, _ = PlaceSanitizer([{'step': 'tag-analyzer-by-language',
                                    'use-defaults': 'all',
-                                   'mode': 'replace'}]).process_names(place)
+                                   'mode': 'replace'}],
+                                 self.config).process_names(place)
 
         assert len(name) == 1
         assert name[0].name == 'something'
@@ -193,14 +212,19 @@ class TestDefaultCountry:
 
 class TestCountryWithWhitelist:
 
-    @staticmethod
-    def run_sanitizer_on(mode,  country, **kwargs):
+    @pytest.fixture(autouse=True)
+    def setup_country(self, def_config):
+        self.config = def_config
+
+
+    def run_sanitizer_on(self, mode,  country, **kwargs):
         place = PlaceInfo({'name': {k.replace('_', ':'): v for k, v in kwargs.items()},
                            'country_code': country})
         name, _ = PlaceSanitizer([{'step': 'tag-analyzer-by-language',
                                    'use-defaults': mode,
                                    'mode': 'replace',
-                                   'whitelist': ['de', 'fr', 'ru']}]).process_names(place)
+                                   'whitelist': ['de', 'fr', 'ru']}],
+                                 self.config).process_names(place)
 
         assert all(isinstance(p.attr, dict) for p in name)
         assert all(len(p.attr) <= 1 for p in name)
@@ -232,12 +256,17 @@ class TestCountryWithWhitelist:
 
 class TestWhiteList:
 
-    @staticmethod
-    def run_sanitizer_on(whitelist, **kwargs):
+    @pytest.fixture(autouse=True)
+    def setup_country(self, def_config):
+        self.config = def_config
+
+
+    def run_sanitizer_on(self, whitelist, **kwargs):
         place = PlaceInfo({'name': {k.replace('_', ':'): v for k, v in kwargs.items()}})
         name, _ = PlaceSanitizer([{'step': 'tag-analyzer-by-language',
                                    'mode': 'replace',
-                                   'whitelist': whitelist}]).process_names(place)
+                                   'whitelist': whitelist}],
+                                 self.config).process_names(place)
 
         assert all(isinstance(p.attr, dict) for p in name)
         assert all(len(p.attr) <= 1 for p in name)
index 87d9b5830fcb2151fe6141a473250dbf2656e7d9..166e6ba6388f424dbbd2347751398294eec45a96 100644 (file)
@@ -1,3 +1,9 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# This file is part of Nominatim. (https://nominatim.org)
+#
+# Copyright (C) 2022 by the Nominatim developer community.
+# For a full list of authors see the git log.
 """
 Tests for creating new tokenizers.
 """
@@ -57,13 +63,13 @@ class TestFactory:
         assert tokenizer.init_state == "loaded"
 
 
-    def test_load_no_tokenizer_dir(self):
+    def test_load_repopulate_tokenizer_dir(self):
         factory.create_tokenizer(self.config)
 
-        self.config.project_dir = self.config.project_dir / 'foo'
+        self.config.project_dir = self.config.project_dir
 
-        with pytest.raises(UsageError):
-            factory.get_tokenizer_for_db(self.config)
+        factory.get_tokenizer_for_db(self.config)
+        assert (self.config.project_dir / 'tokenizer').exists()
 
 
     def test_load_missing_property(self, temp_db_cursor):
index 642aaceb82e0f55ac59d03327b252fa53e0d250c..7f0ffce16b5a3aa8c90e228aa9abd9f57cd6097a 100644 (file)
@@ -1,8 +1,15 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# This file is part of Nominatim. (https://nominatim.org)
+#
+# Copyright (C) 2022 by the Nominatim developer community.
+# For a full list of authors see the git log.
 """
 Tests for ICU tokenizer.
 """
 import shutil
 import yaml
+import itertools
 
 import pytest
 
@@ -10,7 +17,7 @@ from nominatim.tokenizer import icu_tokenizer
 import nominatim.tokenizer.icu_rule_loader
 from nominatim.db import properties
 from nominatim.db.sql_preprocessor import SQLPreprocessor
-from nominatim.indexer.place_info import PlaceInfo
+from nominatim.data.place_info import PlaceInfo
 
 from mock_icu_word_table import MockIcuWordTable
 
@@ -65,12 +72,19 @@ def analyzer(tokenizer_factory, test_config, monkeypatch,
 
     def _mk_analyser(norm=("[[:Punctuation:][:Space:]]+ > ' '",), trans=(':: upper()',),
                      variants=('~gasse -> gasse', 'street => st', ),
-                     sanitizers=[]):
+                     sanitizers=[], with_housenumber=False,
+                     with_postcode=False):
         cfgstr = {'normalization': list(norm),
                   'sanitizers': sanitizers,
                   'transliteration': list(trans),
                   'token-analysis': [{'analyzer': 'generic',
                                       'variants': [{'words': list(variants)}]}]}
+        if with_housenumber:
+            cfgstr['token-analysis'].append({'id': '@housenumber',
+                                             'analyzer': 'housenumbers'})
+        if with_postcode:
+            cfgstr['token-analysis'].append({'id': '@postcode',
+                                             'analyzer': 'postcodes'})
         (test_config.project_dir / 'icu_tokenizer.yaml').write_text(yaml.dump(cfgstr))
         tok.loader = nominatim.tokenizer.icu_rule_loader.ICURuleLoader(test_config)
 
@@ -236,28 +250,69 @@ def test_normalize_postcode(analyzer):
         anl.normalize_postcode('38 Б') == '38 Б'
 
 
-def test_update_postcodes_from_db_empty(analyzer, table_factory, word_table):
-    table_factory('location_postcode', 'postcode TEXT',
-                  content=(('1234',), ('12 34',), ('AB23',), ('1234',)))
+class TestPostcodes:
 
-    with analyzer() as anl:
-        anl.update_postcodes_from_db()
+    @pytest.fixture(autouse=True)
+    def setup(self, analyzer, sql_functions):
+        sanitizers = [{'step': 'clean-postcodes'}]
+        with analyzer(sanitizers=sanitizers, with_postcode=True) as anl:
+            self.analyzer = anl
+            yield anl
 
-    assert word_table.count() == 3
-    assert word_table.get_postcodes() == {'1234', '12 34', 'AB23'}
 
+    def process_postcode(self, cc, postcode):
+        return self.analyzer.process_place(PlaceInfo({'country_code': cc,
+                                                      'address': {'postcode': postcode}}))
 
-def test_update_postcodes_from_db_add_and_remove(analyzer, table_factory, word_table):
-    table_factory('location_postcode', 'postcode TEXT',
-                  content=(('1234',), ('45BC', ), ('XX45', )))
-    word_table.add_postcode(' 1234', '1234')
-    word_table.add_postcode(' 5678', '5678')
 
-    with analyzer() as anl:
-        anl.update_postcodes_from_db()
+    def test_update_postcodes_from_db_empty(self, table_factory, word_table):
+        table_factory('location_postcode', 'country_code TEXT, postcode TEXT',
+                      content=(('de', '12345'), ('se', '132 34'),
+                               ('bm', 'AB23'), ('fr', '12345')))
+
+        self.analyzer.update_postcodes_from_db()
+
+        assert word_table.count() == 5
+        assert word_table.get_postcodes() == {'12345', '132 34@132 34', 'AB 23@AB 23'}
+
+
+    def test_update_postcodes_from_db_ambigious(self, table_factory, word_table):
+        table_factory('location_postcode', 'country_code TEXT, postcode TEXT',
+                      content=(('in', '123456'), ('sg', '123456')))
+
+        self.analyzer.update_postcodes_from_db()
+
+        assert word_table.count() == 3
+        assert word_table.get_postcodes() == {'123456', '123456@123 456'}
+
+
+    def test_update_postcodes_from_db_add_and_remove(self, table_factory, word_table):
+        table_factory('location_postcode', 'country_code TEXT, postcode TEXT',
+                      content=(('ch', '1234'), ('bm', 'BC 45'), ('bm', 'XX45')))
+        word_table.add_postcode(' 1234', '1234')
+        word_table.add_postcode(' 5678', '5678')
+
+        self.analyzer.update_postcodes_from_db()
+
+        assert word_table.count() == 5
+        assert word_table.get_postcodes() == {'1234', 'BC 45@BC 45', 'XX 45@XX 45'}
+
+
+    def test_process_place_postcode_simple(self, word_table):
+        info = self.process_postcode('de', '12345')
+
+        assert info['postcode'] == '12345'
+
+        assert word_table.get_postcodes() == {'12345', }
+
+
+    def test_process_place_postcode_with_space(self, word_table):
+        info = self.process_postcode('in', '123 567')
+
+        assert info['postcode'] == '123567'
+
+        assert word_table.get_postcodes() == {'123567@123 567', }
 
-    assert word_table.count() == 3
-    assert word_table.get_postcodes() == {'1234', '45BC', 'XX45'}
 
 
 def test_update_special_phrase_empty_table(analyzer, word_table):
@@ -394,7 +449,9 @@ class TestPlaceAddress:
 
     @pytest.fixture(autouse=True)
     def setup(self, analyzer, sql_functions):
-        with analyzer(trans=(":: upper()", "'🜵' > ' '")) as anl:
+        hnr = {'step': 'clean-housenumbers',
+               'filter-kind': ['housenumber', 'conscriptionnumber', 'streetnumber']}
+        with analyzer(trans=(":: upper()", "'🜵' > ' '"), sanitizers=[hnr]) as anl:
             self.analyzer = anl
             yield anl
 
@@ -425,13 +482,6 @@ class TestPlaceAddress:
         assert word_table.get_postcodes() == {pcode, }
 
 
-    @pytest.mark.parametrize('pcode', ['12:23', 'ab;cd;f', '123;836'])
-    def test_process_place_bad_postcode(self, word_table, pcode):
-        self.process_address(postcode=pcode)
-
-        assert not word_table.get_postcodes()
-
-
     @pytest.mark.parametrize('hnr', ['123a', '1', '101'])
     def test_process_place_housenumbers_simple(self, hnr, getorcreate_hnr_id):
         info = self.process_address(housenumber=hnr)
@@ -440,13 +490,6 @@ class TestPlaceAddress:
         assert info['hnr_tokens'] == "{-1}"
 
 
-    def test_process_place_housenumbers_lists(self, getorcreate_hnr_id):
-        info = self.process_address(conscriptionnumber='1; 2;3')
-
-        assert set(info['hnr'].split(';')) == set(('1', '2', '3'))
-        assert info['hnr_tokens'] == "{-1,-2,-3}"
-
-
     def test_process_place_housenumbers_duplicates(self, getorcreate_hnr_id):
         info = self.process_address(housenumber='134',
                                     conscriptionnumber='134',
@@ -471,9 +514,25 @@ class TestPlaceAddress:
 
 
     def test_process_place_street(self):
+        self.analyzer.process_place(PlaceInfo({'name': {'name' : 'Grand Road'}}))
         info = self.process_address(street='Grand Road')
 
-        assert eval(info['street']) == self.name_token_set('GRAND', 'ROAD')
+        assert eval(info['street']) == self.name_token_set('#Grand Road')
+
+
+    def test_process_place_nonexisting_street(self):
+        info = self.process_address(street='Grand Road')
+
+        assert 'street' not in info
+
+
+    def test_process_place_multiple_street_tags(self):
+        self.analyzer.process_place(PlaceInfo({'name': {'name' : 'Grand Road',
+                                                        'ref': '05989'}}))
+        info = self.process_address(**{'street': 'Grand Road',
+                                      'street:sym_ul': '05989'})
+
+        assert eval(info['street']) == self.name_token_set('#Grand Road', '#05989')
 
 
     def test_process_place_street_empty(self):
@@ -482,12 +541,28 @@ class TestPlaceAddress:
         assert 'street' not in info
 
 
+    def test_process_place_street_from_cache(self):
+        self.analyzer.process_place(PlaceInfo({'name': {'name' : 'Grand Road'}}))
+        self.process_address(street='Grand Road')
+
+        # request address again
+        info = self.process_address(street='Grand Road')
+
+        assert eval(info['street']) == self.name_token_set('#Grand Road')
+
+
     def test_process_place_place(self):
         info = self.process_address(place='Honu Lulu')
 
         assert eval(info['place']) == self.name_token_set('HONU', 'LULU')
 
 
+    def test_process_place_place_extra(self):
+        info = self.process_address(**{'place:en': 'Honu Lulu'})
+
+        assert 'place' not in info
+
+
     def test_process_place_place_empty(self):
         info = self.process_address(place='🜵')
 
@@ -507,9 +582,156 @@ class TestPlaceAddress:
         assert result == {'city': city, 'suburb': city, 'state': state}
 
 
+    def test_process_place_multiple_address_terms(self):
+        info = self.process_address(**{'city': 'Bruxelles', 'city:de': 'Brüssel'})
+
+        result = {k: eval(v) for k,v in info['addr'].items()}
+
+        assert result == {'city': self.name_token_set('Bruxelles')}
+
+
     def test_process_place_address_terms_empty(self):
         info = self.process_address(country='de', city=' ', street='Hauptstr',
                                     full='right behind the church')
 
         assert 'addr' not in info
 
+
+class TestPlaceHousenumberWithAnalyser:
+
+    @pytest.fixture(autouse=True)
+    def setup(self, analyzer, sql_functions):
+        hnr = {'step': 'clean-housenumbers',
+               'filter-kind': ['housenumber', 'conscriptionnumber', 'streetnumber']}
+        with analyzer(trans=(":: upper()", "'🜵' > ' '"), sanitizers=[hnr], with_housenumber=True) as anl:
+            self.analyzer = anl
+            yield anl
+
+
+    @pytest.fixture
+    def getorcreate_hnr_id(self, temp_db_cursor):
+        temp_db_cursor.execute("""CREATE OR REPLACE FUNCTION create_analyzed_hnr_id(norm_term TEXT, lookup_terms TEXT[])
+                                  RETURNS INTEGER AS $$
+                                    SELECT -nextval('seq_word')::INTEGER; $$ LANGUAGE SQL""")
+
+
+    def process_address(self, **kwargs):
+        return self.analyzer.process_place(PlaceInfo({'address': kwargs}))
+
+
+    def name_token_set(self, *expected_terms):
+        tokens = self.analyzer.get_word_token_info(expected_terms)
+        for token in tokens:
+            assert token[2] is not None, "No token for {0}".format(token)
+
+        return set((t[2] for t in tokens))
+
+
+    @pytest.mark.parametrize('hnr', ['123 a', '1', '101'])
+    def test_process_place_housenumbers_simple(self, hnr, getorcreate_hnr_id):
+        info = self.process_address(housenumber=hnr)
+
+        assert info['hnr'] == hnr.upper()
+        assert info['hnr_tokens'] == "{-1}"
+
+
+    def test_process_place_housenumbers_duplicates(self, getorcreate_hnr_id):
+        info = self.process_address(housenumber='134',
+                                    conscriptionnumber='134',
+                                    streetnumber='99a')
+
+        assert set(info['hnr'].split(';')) == set(('134', '99 A'))
+        assert info['hnr_tokens'] == "{-1,-2}"
+
+
+    def test_process_place_housenumbers_cached(self, getorcreate_hnr_id):
+        info = self.process_address(housenumber="45")
+        assert info['hnr_tokens'] == "{-1}"
+
+        info = self.process_address(housenumber="46")
+        assert info['hnr_tokens'] == "{-2}"
+
+        info = self.process_address(housenumber="41;45")
+        assert eval(info['hnr_tokens']) == {-1, -3}
+
+        info = self.process_address(housenumber="41")
+        assert eval(info['hnr_tokens']) == {-3}
+
+
+class TestUpdateWordTokens:
+
+    @pytest.fixture(autouse=True)
+    def setup(self, tokenizer_factory, table_factory, placex_table, word_table):
+        table_factory('search_name', 'place_id BIGINT, name_vector INT[]')
+        self.tok = tokenizer_factory()
+
+
+    @pytest.fixture
+    def search_entry(self, temp_db_cursor):
+        place_id = itertools.count(1000)
+
+        def _insert(*args):
+            temp_db_cursor.execute("INSERT INTO search_name VALUES (%s, %s)",
+                                   (next(place_id), list(args)))
+
+        return _insert
+
+
+    @pytest.fixture(params=['simple', 'analyzed'])
+    def add_housenumber(self, request, word_table):
+        if request.param == 'simple':
+            def _make(hid, hnr):
+                word_table.add_housenumber(hid, hnr)
+        elif request.param == 'analyzed':
+            def _make(hid, hnr):
+                word_table.add_housenumber(hid, [hnr])
+
+        return _make
+
+
+    @pytest.mark.parametrize('hnr', ('1a', '1234567', '34 5'))
+    def test_remove_unused_housenumbers(self, add_housenumber, word_table, hnr):
+        word_table.add_housenumber(1000, hnr)
+
+        assert word_table.count_housenumbers() == 1
+        self.tok.update_word_tokens()
+        assert word_table.count_housenumbers() == 0
+
+
+    def test_keep_unused_numeral_housenumbers(self, add_housenumber, word_table):
+        add_housenumber(1000, '5432')
+
+        assert word_table.count_housenumbers() == 1
+        self.tok.update_word_tokens()
+        assert word_table.count_housenumbers() == 1
+
+
+    def test_keep_housenumbers_from_search_name_table(self, add_housenumber, word_table, search_entry):
+        add_housenumber(9999, '5432a')
+        add_housenumber(9991, '9 a')
+        search_entry(123, 9999, 34)
+
+        assert word_table.count_housenumbers() == 2
+        self.tok.update_word_tokens()
+        assert word_table.count_housenumbers() == 1
+
+
+    def test_keep_housenumbers_from_placex_table(self, add_housenumber, word_table, placex_table):
+        add_housenumber(9999, '5432a')
+        add_housenumber(9990, '34z')
+        placex_table.add(housenumber='34z')
+        placex_table.add(housenumber='25432a')
+
+        assert word_table.count_housenumbers() == 2
+        self.tok.update_word_tokens()
+        assert word_table.count_housenumbers() == 1
+
+
+    def test_keep_housenumbers_from_placex_table_hnr_list(self, add_housenumber, word_table, placex_table):
+        add_housenumber(9991, '9 b')
+        add_housenumber(9990, '34z')
+        placex_table.add(housenumber='9 a;9 b;9 c')
+
+        assert word_table.count_housenumbers() == 2
+        self.tok.update_word_tokens()
+        assert word_table.count_housenumbers() == 1
index 9e5a334bf48b99fe1f39a5d8d1721688376540af..e89d3734b85d7483dcd4ef1f90e2ea807f2491a8 100644 (file)
@@ -1,3 +1,9 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# This file is part of Nominatim. (https://nominatim.org)
+#
+# Copyright (C) 2022 by the Nominatim developer community.
+# For a full list of authors see the git log.
 """
 Tests for converting a config file to ICU rules.
 """
index a16756df6ca1f51beb0e2f00534b13dd35a7919f..57a82b8a0f4aa5af2f1dc6c2377db0fca8d83959 100644 (file)
@@ -1,3 +1,9 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# This file is part of Nominatim. (https://nominatim.org)
+#
+# Copyright (C) 2022 by the Nominatim developer community.
+# For a full list of authors see the git log.
 """
 Test for legacy tokenizer.
 """
@@ -6,7 +12,7 @@ import re
 
 import pytest
 
-from nominatim.indexer.place_info import PlaceInfo
+from nominatim.data.place_info import PlaceInfo
 from nominatim.tokenizer import legacy_tokenizer
 from nominatim.db import properties
 from nominatim.errors import UsageError
@@ -23,7 +29,7 @@ def word_table(temp_db_conn):
 def test_config(project_env, tmp_path):
     module_dir = tmp_path / 'module_src'
     module_dir.mkdir()
-    (module_dir / 'nominatim.so').write_text('TEST nomiantim.so')
+    (module_dir / 'nominatim.so').write_text('TEST nominatim.so')
 
     project_env.lib_dir.module = module_dir
 
@@ -115,7 +121,7 @@ def test_init_new(tokenizer_factory, test_config, monkeypatch,
     outfile = test_config.project_dir / 'module' / 'nominatim.so'
 
     assert outfile.exists()
-    assert outfile.read_text() == 'TEST nomiantim.so'
+    assert outfile.read_text() == 'TEST nominatim.so'
     assert outfile.stat().st_mode == 33261
 
 
@@ -200,7 +206,7 @@ def test_migrate_database(tokenizer_factory, test_config, temp_db_conn, monkeypa
     outfile = test_config.project_dir / 'module' / 'nominatim.so'
 
     assert outfile.exists()
-    assert outfile.read_text() == 'TEST nomiantim.so'
+    assert outfile.read_text() == 'TEST nominatim.so'
     assert outfile.stat().st_mode == 33261
 
 
@@ -251,6 +257,13 @@ def test_update_statistics(word_table, table_factory, temp_db_cursor, tokenizer_
                                           search_name_count > 0""") > 0
 
 
+def test_update_word_tokens(tokenizer_factory):
+    tok = tokenizer_factory()
+
+    # This is a noop and should just pass.
+    tok.update_word_tokens()
+
+
 def test_normalize(analyzer):
     assert analyzer.normalize('TEsT') == 'test'
 
index 389b068cab8e9361afaaf97f8de20b6db288fa00..3dd3033ca6f5031dae5f58276a5bada03e7cbec3 100644 (file)
@@ -1,3 +1,9 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# This file is part of Nominatim. (https://nominatim.org)
+#
+# Copyright (C) 2022 by the Nominatim developer community.
+# For a full list of authors see the git log.
 """
 Tests for execution of the sanitztion step.
 """
@@ -5,7 +11,7 @@ import pytest
 
 from nominatim.errors import UsageError
 import nominatim.tokenizer.place_sanitizer as sanitizer
-from nominatim.indexer.place_info import PlaceInfo
+from nominatim.data.place_info import PlaceInfo
 
 
 def test_placeinfo_clone_new_name():
@@ -41,8 +47,8 @@ def test_placeinfo_has_attr():
     assert not place.has_attr('whatever')
 
 
-def test_sanitizer_default():
-    san = sanitizer.PlaceSanitizer([{'step': 'split-name-list'}])
+def test_sanitizer_default(def_config):
+    san = sanitizer.PlaceSanitizer([{'step': 'split-name-list'}], def_config)
 
     name, address =  san.process_names(PlaceInfo({'name': {'name:de:de': '1;2;3'},
                                                   'address': {'street': 'Bald'}}))
@@ -57,8 +63,8 @@ def test_sanitizer_default():
 
 
 @pytest.mark.parametrize('rules', [None, []])
-def test_sanitizer_empty_list(rules):
-    san = sanitizer.PlaceSanitizer(rules)
+def test_sanitizer_empty_list(def_config, rules):
+    san = sanitizer.PlaceSanitizer(rules, def_config)
 
     name, address =  san.process_names(PlaceInfo({'name': {'name:de:de': '1;2;3'}}))
 
@@ -66,6 +72,6 @@ def test_sanitizer_empty_list(rules):
     assert all(isinstance(n, sanitizer.PlaceName) for n in name)
 
 
-def test_sanitizer_missing_step_definition():
+def test_sanitizer_missing_step_definition(def_config):
     with pytest.raises(UsageError):
-        san = sanitizer.PlaceSanitizer([{'id': 'split-name-list'}])
+        san = sanitizer.PlaceSanitizer([{'id': 'split-name-list'}], def_config)
diff --git a/test/python/tokenizer/token_analysis/test_analysis_postcodes.py b/test/python/tokenizer/token_analysis/test_analysis_postcodes.py
new file mode 100644 (file)
index 0000000..8d966c4
--- /dev/null
@@ -0,0 +1,61 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# This file is part of Nominatim. (https://nominatim.org)
+#
+# Copyright (C) 2022 by the Nominatim developer community.
+# For a full list of authors see the git log.
+"""
+Tests for special postcode analysis and variant generation.
+"""
+import pytest
+
+from icu import Transliterator
+
+import nominatim.tokenizer.token_analysis.postcodes as module
+from nominatim.data.place_name import PlaceName
+from nominatim.errors import UsageError
+
+DEFAULT_NORMALIZATION = """ :: NFD ();
+                            '🜳' > ' ';
+                            [[:Nonspacing Mark:] [:Cf:]] >;
+                            :: lower ();
+                            [[:Punctuation:][:Space:]]+ > ' ';
+                            :: NFC ();
+                        """
+
+DEFAULT_TRANSLITERATION = """ ::  Latin ();
+                              '🜵' > ' ';
+                          """
+
+@pytest.fixture
+def analyser():
+    rules = { 'analyzer': 'postcodes'}
+    config = module.configure(rules, DEFAULT_NORMALIZATION)
+
+    trans = Transliterator.createFromRules("test_trans", DEFAULT_TRANSLITERATION)
+    norm = Transliterator.createFromRules("test_norm", DEFAULT_NORMALIZATION)
+
+    return module.create(norm, trans, config)
+
+
+def get_normalized_variants(proc, name):
+    norm = Transliterator.createFromRules("test_norm", DEFAULT_NORMALIZATION)
+    return proc.compute_variants(norm.transliterate(name).strip())
+
+
+@pytest.mark.parametrize('name,norm', [('12', '12'),
+                                       ('A 34 ', 'A 34'),
+                                       ('34-av', '34-AV')])
+def test_get_canonical_id(analyser, name, norm):
+    assert analyser.get_canonical_id(PlaceName(name=name, kind='', suffix='')) == norm
+
+
+@pytest.mark.parametrize('postcode,variants', [('12345', {'12345'}),
+                                               ('AB-998', {'ab 998', 'ab998'}),
+                                               ('23 FGH D3', {'23 fgh d3', '23fgh d3',
+                                                              '23 fghd3', '23fghd3'})])
+def test_compute_variants(analyser, postcode, variants):
+    out = analyser.compute_variants(postcode)
+
+    assert len(out) == len(set(out))
+    assert set(out) == variants
index 02a95f25b15d9403ba567e867f2e541731be9c06..976bbd1b6515dc325ec4df1ea23753340e8ece3c 100644 (file)
@@ -1,3 +1,9 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# This file is part of Nominatim. (https://nominatim.org)
+#
+# Copyright (C) 2022 by the Nominatim developer community.
+# For a full list of authors see the git log.
 """
 Tests for import name normalisation and variant generation.
 """
@@ -24,23 +30,25 @@ def make_analyser(*variants, variant_only=False):
     rules = { 'analyzer': 'generic', 'variants': [{'words': variants}]}
     if variant_only:
         rules['mode'] = 'variant-only'
-    config = module.configure(rules, DEFAULT_NORMALIZATION)
     trans = Transliterator.createFromRules("test_trans", DEFAULT_TRANSLITERATION)
+    norm = Transliterator.createFromRules("test_norm", DEFAULT_NORMALIZATION)
+    config = module.configure(rules, norm, trans)
 
-    return module.create(trans, config)
+    return module.create(norm, trans, config)
 
 
 def get_normalized_variants(proc, name):
     norm = Transliterator.createFromRules("test_norm", DEFAULT_NORMALIZATION)
-    return proc.get_variants_ascii(norm.transliterate(name).strip())
+    return proc.compute_variants(norm.transliterate(name).strip())
 
 
 def test_no_variants():
     rules = { 'analyzer': 'generic' }
-    config = module.configure(rules, DEFAULT_NORMALIZATION)
     trans = Transliterator.createFromRules("test_trans", DEFAULT_TRANSLITERATION)
+    norm = Transliterator.createFromRules("test_norm", DEFAULT_NORMALIZATION)
+    config = module.configure(rules, norm, trans)
 
-    proc = module.create(trans, config)
+    proc = module.create(norm, trans, config)
 
     assert get_normalized_variants(proc, '大德!') == ['dà dé']
 
@@ -115,7 +123,9 @@ class TestGetReplacements:
     @staticmethod
     def configure_rules(*variants):
         rules = { 'analyzer': 'generic', 'variants': [{'words': variants}]}
-        return module.configure(rules, DEFAULT_NORMALIZATION)
+        trans = Transliterator.createFromRules("test_trans", DEFAULT_TRANSLITERATION)
+        norm = Transliterator.createFromRules("test_norm", DEFAULT_NORMALIZATION)
+        return module.configure(rules, norm, trans)
 
 
     def get_replacements(self, *variants):
diff --git a/test/python/tokenizer/token_analysis/test_generic_mutation.py b/test/python/tokenizer/token_analysis/test_generic_mutation.py
new file mode 100644 (file)
index 0000000..ff4c3a7
--- /dev/null
@@ -0,0 +1,90 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# This file is part of Nominatim. (https://nominatim.org)
+#
+# Copyright (C) 2022 by the Nominatim developer community.
+# For a full list of authors see the git log.
+"""
+Tests for generic token analysis, mutation part.
+"""
+import pytest
+
+from icu import Transliterator
+
+import nominatim.tokenizer.token_analysis.generic as module
+from nominatim.errors import UsageError
+
+DEFAULT_NORMALIZATION = """ '🜳' > ' ';
+                            [[:Nonspacing Mark:] [:Cf:]] >;
+                            :: lower ();
+                            [[:Punctuation:][:Space:]]+ > ' '
+                        """
+
+DEFAULT_TRANSLITERATION = """ ::  Latin ();
+                              '🜵' > ' ';
+                          """
+
+class TestMutationNoVariants:
+
+    def make_analyser(self, *mutations):
+        rules = { 'analyzer': 'generic',
+                  'mutations': [ {'pattern': m[0], 'replacements': m[1]}
+                                 for m in mutations]
+                }
+        trans = Transliterator.createFromRules("test_trans", DEFAULT_TRANSLITERATION)
+        norm = Transliterator.createFromRules("test_norm", DEFAULT_NORMALIZATION)
+        config = module.configure(rules, norm, trans)
+
+        self.analysis = module.create(norm, trans, config)
+
+
+    def variants(self, name):
+        norm = Transliterator.createFromRules("test_norm", DEFAULT_NORMALIZATION)
+        return set(self.analysis.compute_variants(norm.transliterate(name).strip()))
+
+
+    @pytest.mark.parametrize('pattern', ('(capture)', ['a list']))
+    def test_bad_pattern(self, pattern):
+        with pytest.raises(UsageError):
+            self.make_analyser((pattern, ['b']))
+
+
+    @pytest.mark.parametrize('replacements', (None, 'a string'))
+    def test_bad_replacement(self, replacements):
+        with pytest.raises(UsageError):
+            self.make_analyser(('a', replacements))
+
+
+    def test_simple_replacement(self):
+        self.make_analyser(('a', ['b']))
+
+        assert self.variants('none') == {'none'}
+        assert self.variants('abba') == {'bbbb'}
+        assert self.variants('2 aar') == {'2 bbr'}
+
+
+    def test_multichar_replacement(self):
+        self.make_analyser(('1 1', ['1 1 1']))
+
+        assert self.variants('1 1456') == {'1 1 1456'}
+        assert self.variants('1 1 1') == {'1 1 1 1'}
+
+
+    def test_removement_replacement(self):
+        self.make_analyser((' ', [' ', '']))
+
+        assert self.variants('A 345') == {'a 345', 'a345'}
+        assert self.variants('a g b') == {'a g b', 'ag b', 'a gb', 'agb'}
+
+
+    def test_regex_pattern(self):
+        self.make_analyser(('[^a-z]+', ['XXX', ' ']))
+
+        assert self.variants('a-34n12') == {'aXXXnXXX', 'aXXXn', 'a nXXX', 'a n'}
+
+
+    def test_multiple_mutations(self):
+        self.make_analyser(('ä', ['ä', 'ae']), ('ö', ['ö', 'oe']))
+
+        assert self.variants('Längenöhr') == {'längenöhr', 'laengenöhr',
+                                              'längenoehr', 'laengenoehr'}
index f72caf378b2da15c1d470046198b2e9a29ca4d7c..6dd5f2d650b521fd6beba8ebbfd7c98531f6d15e 100644 (file)
@@ -1,3 +1,9 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# This file is part of Nominatim. (https://nominatim.org)
+#
+# Copyright (C) 2022 by the Nominatim developer community.
+# For a full list of authors see the git log.
 import pytest
 
 @pytest.fixture
index c62758ec12beba737fb5e68656f7ba04deb7498e..5e808c6aed5fce51d2c405ad6a70a0a5ed4ca1ac 100644 (file)
@@ -1,3 +1,9 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# This file is part of Nominatim. (https://nominatim.org)
+#
+# Copyright (C) 2022 by the Nominatim developer community.
+# For a full list of authors see the git log.
 """
 Tests for functions to add additional data to the database.
 """
index bd47e0e4632ee76215f9aa61bcf6234a8c752c6a..9c010b9d4b77e00bc784b305eb2c1cfceab3b2be 100644 (file)
@@ -1,3 +1,9 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# This file is part of Nominatim. (https://nominatim.org)
+#
+# Copyright (C) 2022 by the Nominatim developer community.
+# For a full list of authors see the git log.
 """
 Tests for maintenance and analysis functions.
 """
@@ -5,37 +11,62 @@ import pytest
 
 from nominatim.errors import UsageError
 from nominatim.tools import admin
+from nominatim.tokenizer import factory
 
 @pytest.fixture(autouse=True)
-def create_placex_table(placex_table):
+def create_placex_table(project_env, tokenizer_mock, temp_db_cursor, placex_table):
     """ All tests in this module require the placex table to be set up.
     """
+    temp_db_cursor.execute("DROP TYPE IF EXISTS prepare_update_info CASCADE")
+    temp_db_cursor.execute("""CREATE TYPE prepare_update_info AS (
+                             name HSTORE,
+                             address HSTORE,
+                             rank_address SMALLINT,
+                             country_code TEXT,
+                             class TEXT,
+                             type TEXT,
+                             linked_place_id BIGINT
+                           )""")
+    temp_db_cursor.execute("""CREATE OR REPLACE FUNCTION placex_indexing_prepare(p placex,
+                                                     OUT result prepare_update_info)
+                           AS $$
+                           BEGIN
+                             result.address := p.address;
+                             result.name := p.name;
+                             result.class := p.class;
+                             result.type := p.type;
+                             result.country_code := p.country_code;
+                             result.rank_address := p.rank_address;
+                           END;
+                           $$ LANGUAGE plpgsql STABLE;
+                        """)
+    factory.create_tokenizer(project_env)
 
 
-def test_analyse_indexing_no_objects(temp_db_conn):
+def test_analyse_indexing_no_objects(project_env):
     with pytest.raises(UsageError):
-        admin.analyse_indexing(temp_db_conn)
+        admin.analyse_indexing(project_env)
 
 
 @pytest.mark.parametrize("oid", ['1234', 'N123a', 'X123'])
-def test_analyse_indexing_bad_osmid(temp_db_conn, oid):
+def test_analyse_indexing_bad_osmid(project_env, oid):
     with pytest.raises(UsageError):
-        admin.analyse_indexing(temp_db_conn, osm_id=oid)
+        admin.analyse_indexing(project_env, osm_id=oid)
 
 
-def test_analyse_indexing_unknown_osmid(temp_db_conn):
+def test_analyse_indexing_unknown_osmid(project_env):
     with pytest.raises(UsageError):
-        admin.analyse_indexing(temp_db_conn, osm_id='W12345674')
+        admin.analyse_indexing(project_env, osm_id='W12345674')
 
 
-def test_analyse_indexing_with_place_id(temp_db_conn, temp_db_cursor):
+def test_analyse_indexing_with_place_id(project_env, temp_db_cursor):
     temp_db_cursor.execute("INSERT INTO placex (place_id) VALUES(12345)")
 
-    admin.analyse_indexing(temp_db_conn, place_id=12345)
+    admin.analyse_indexing(project_env, place_id=12345)
 
 
-def test_analyse_indexing_with_osm_id(temp_db_conn, temp_db_cursor):
+def test_analyse_indexing_with_osm_id(project_env, temp_db_cursor):
     temp_db_cursor.execute("""INSERT INTO placex (place_id, osm_type, osm_id)
                               VALUES(9988, 'N', 10000)""")
 
-    admin.analyse_indexing(temp_db_conn, osm_id='N10000')
+    admin.analyse_indexing(project_env, osm_id='N10000')
index edba32364c32d33b230dc969b118a1abd6412bd3..d5f7088a4e4f4940613371f28d0d60e1ebc9aadd 100644 (file)
@@ -1,3 +1,9 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# This file is part of Nominatim. (https://nominatim.org)
+#
+# Copyright (C) 2022 by the Nominatim developer community.
+# For a full list of authors see the git log.
 """
 Tests for database integrity checks.
 """
diff --git a/test/python/tools/test_country_info.py b/test/python/tools/test_country_info.py
deleted file mode 100644 (file)
index 66f785c..0000000
+++ /dev/null
@@ -1,55 +0,0 @@
-"""
-Tests for function that handle country properties.
-"""
-
-import pytest
-
-from nominatim.tools import country_info
-
-@pytest.fixture(autouse=True)
-def read_config(def_config):
-    country_info.setup_country_config(def_config)
-
-@pytest.mark.parametrize("no_partitions", (True, False))
-def test_setup_country_tables(src_dir, temp_db_with_extensions, dsn, temp_db_cursor,
-                              def_config, no_partitions):
-    country_info.setup_country_tables(dsn, src_dir / 'data', no_partitions)
-
-    assert temp_db_cursor.table_exists('country_name')
-    assert temp_db_cursor.table_rows('country_name') == \
-             temp_db_cursor.scalar('SELECT count(DISTINCT country_code) FROM country_name')
-
-    partitions = temp_db_cursor.row_set("SELECT DISTINCT partition FROM country_name")
-    if no_partitions:
-        assert partitions == {(0, )}
-    else:
-        assert len(partitions) > 10
-
-    assert temp_db_cursor.table_exists('country_osm_grid')
-    assert temp_db_cursor.table_rows('country_osm_grid') > 100
-
-
-@pytest.mark.parametrize("languages", (None, ' fr,en'))
-def test_create_country_names(temp_db_with_extensions, temp_db_conn, temp_db_cursor,
-                              table_factory, tokenizer_mock, languages):
-
-    table_factory('country_name', 'country_code varchar(2), name hstore',
-                  content=(('us', '"name"=>"us1","name:af"=>"us2"'),
-                           ('fr', '"name"=>"Fra", "name:en"=>"Fren"')))
-
-    assert temp_db_cursor.scalar("SELECT count(*) FROM country_name") == 2
-
-    tokenizer = tokenizer_mock()
-
-    country_info.create_country_names(temp_db_conn, tokenizer, languages)
-
-    assert len(tokenizer.analyser_cache['countries']) == 2
-
-    result_set = {k: set(v.values()) for k, v in tokenizer.analyser_cache['countries']}
-
-    if languages:
-        assert result_set == {'us' : set(('us', 'us1', 'United States')),
-                              'fr' : set(('fr', 'Fra', 'Fren'))}
-    else:
-        assert result_set == {'us' : set(('us', 'us1', 'us2', 'United States')),
-                              'fr' : set(('fr', 'Fra', 'Fren'))}
index 6d6d75fdcb0f4bee7d476981b77e97e6ebadf7a4..68d19a07beb78e0b3b4adffa298016d2da3eff4d 100644 (file)
@@ -1,3 +1,9 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# This file is part of Nominatim. (https://nominatim.org)
+#
+# Copyright (C) 2022 by the Nominatim developer community.
+# For a full list of authors see the git log.
 """
 Tests for functions to import a new database.
 """
@@ -173,7 +179,7 @@ def test_truncate_database_tables(temp_db_conn, temp_db_cursor, table_factory, w
 
 @pytest.mark.parametrize("threads", (1, 5))
 def test_load_data(dsn, place_row, placex_table, osmline_table,
-                   word_table, temp_db_cursor, threads):
+                   temp_db_cursor, threads):
     for func in ('precompute_words', 'getorcreate_housenumber_id', 'make_standard_name'):
         temp_db_cursor.execute(f"""CREATE FUNCTION {func} (src TEXT)
                                   RETURNS TEXT AS $$ SELECT 'a'::TEXT $$ LANGUAGE SQL
index e6289135e7bd0f5da96d55db0e3cb2ee75da8632..26ea92b2c787fb72b6c4a39e64e9646723907cd9 100644 (file)
@@ -1,3 +1,9 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# This file is part of Nominatim. (https://nominatim.org)
+#
+# Copyright (C) 2022 by the Nominatim developer community.
+# For a full list of authors see the git log.
 """
 Tests for tools.exec_utils module.
 """
@@ -116,7 +122,13 @@ class TestRunApiScript:
 
     @staticmethod
     def test_fail_on_error_output(tmp_path):
-        (tmp_path / 'website' / 'bad.php').write_text("<?php\nfwrite(STDERR, 'WARNING'.PHP_EOL);")
+        # Starting PHP 8 the PHP CLI no longer has STDERR defined as constant
+        php = """
+        <?php
+        if(!defined('STDERR')) define('STDERR', fopen('php://stderr', 'wb'));
+        fwrite(STDERR, 'WARNING'.PHP_EOL);
+        """
+        (tmp_path / 'website' / 'bad.php').write_text(php)
 
         assert exec_utils.run_api_script('bad', tmp_path) == 1
 
index 19a06a9f7a49041c81d603f5ede9c57869515fd6..3ebb1730e46bd788e4c4cf24ada301bd94c0d6af 100644 (file)
@@ -1,3 +1,9 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# This file is part of Nominatim. (https://nominatim.org)
+#
+# Copyright (C) 2022 by the Nominatim developer community.
+# For a full list of authors see the git log.
 """
 Tests for freeze functions (removing unused database parts).
 """
@@ -33,17 +39,17 @@ def test_drop_tables(temp_db_conn, temp_db_cursor, table_factory):
         assert not temp_db_cursor.table_exists(table)
 
 def test_drop_flatnode_file_no_file():
-    freeze.drop_flatnode_file('')
+    freeze.drop_flatnode_file(None)
 
 
 def test_drop_flatnode_file_file_already_gone(tmp_path):
-    freeze.drop_flatnode_file(str(tmp_path / 'something.store'))
+    freeze.drop_flatnode_file(tmp_path / 'something.store')
 
 
 def test_drop_flatnode_file_delte(tmp_path):
     flatfile = tmp_path / 'flatnode.store'
     flatfile.write_text('Some content')
 
-    freeze.drop_flatnode_file(str(flatfile))
+    freeze.drop_flatnode_file(flatfile)
 
     assert not flatfile.exists()
index 7c3d0646066b1abb33cfd6d3114edd39a1782679..75a6a066d43f19598d3b0b00b6bf347cb5d7e6ee 100644 (file)
@@ -1,3 +1,9 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# This file is part of Nominatim. (https://nominatim.org)
+#
+# Copyright (C) 2022 by the Nominatim developer community.
+# For a full list of authors see the git log.
 """
     Tests for import special phrases methods
     of the class SPImporter.
@@ -12,16 +18,12 @@ from nominatim.errors import UsageError
 from cursor import CursorForTesting
 
 @pytest.fixture
-def testfile_dir(src_dir):
-    return src_dir / 'test' / 'testfiles'
-
-
-@pytest.fixture
-def sp_importer(temp_db_conn, def_config):
+def sp_importer(temp_db_conn, def_config, monkeypatch):
     """
         Return an instance of SPImporter.
     """
-    loader = SPWikiLoader(def_config, ['en'])
+    monkeypatch.setenv('NOMINATIM_LANGUAGES', 'en')
+    loader = SPWikiLoader(def_config)
     return SPImporter(def_config, temp_db_conn, loader)
 
 
@@ -126,7 +128,7 @@ def test_create_place_classtype_table_and_indexes(
     """
     pairs = set([('class1', 'type1'), ('class2', 'type2')])
 
-    sp_importer._create_place_classtype_table_and_indexes(pairs)
+    sp_importer._create_classtype_table_and_indexes(pairs)
 
     for pair in pairs:
         assert check_table_exist(temp_db_conn, pair[0], pair[1])
@@ -180,8 +182,8 @@ def test_import_phrases(monkeypatch, temp_db_conn, def_config, sp_importer,
     table_factory('place_classtype_amenity_animal_shelter')
     table_factory('place_classtype_wrongclass_wrongtype')
 
-    monkeypatch.setattr('nominatim.tools.special_phrases.sp_wiki_loader.SPWikiLoader._get_wiki_content',
-                        lambda self, lang: xml_wiki_content)
+    monkeypatch.setattr('nominatim.tools.special_phrases.sp_wiki_loader._get_wiki_content',
+                        lambda lang: xml_wiki_content)
 
     tokenizer = tokenizer_mock()
     sp_importer.import_phrases(tokenizer, should_replace)
index 79ec8a0eaa8dbad01db66acca5e1272e43c7b3e8..d102b97da9d3ab10392810b15336e8c7ab281ae0 100644 (file)
@@ -1,3 +1,9 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# This file is part of Nominatim. (https://nominatim.org)
+#
+# Copyright (C) 2022 by the Nominatim developer community.
+# For a full list of authors see the git log.
 """
 Tests for migration functions
 """
@@ -8,6 +14,8 @@ from nominatim.tools import migration
 from nominatim.errors import UsageError
 import nominatim.version
 
+from mock_legacy_word_table import MockLegacyWordTable
+
 class DummyTokenizer:
 
     def update_sql_functions(self, config):
@@ -20,6 +28,10 @@ def postprocess_mock(monkeypatch):
     monkeypatch.setattr(migration.tokenizer_factory, 'get_tokenizer_for_db',
                         lambda *args: DummyTokenizer())
 
+@pytest.fixture
+def legacy_word_table(temp_db_conn):
+    return MockLegacyWordTable(temp_db_conn)
+
 
 def test_no_migration_old_versions(temp_db_with_extensions, table_factory, def_config):
     table_factory('country_name', 'name HSTORE, country_code TEXT')
@@ -150,7 +162,7 @@ def test_add_nominatim_property_table_repeat(temp_db_conn, temp_db_cursor,
 
 
 def test_change_housenumber_transliteration(temp_db_conn, temp_db_cursor,
-                                            word_table, placex_table):
+                                            legacy_word_table, placex_table):
     placex_table.add(housenumber='3A')
 
     temp_db_cursor.execute("""CREATE OR REPLACE FUNCTION make_standard_name(name TEXT)
index a34157690c8bd9350fe1881b442abdc970c4fdde..f5e8f3de0c83c329fce8e2d83a4ecbea0a84ed33 100644 (file)
@@ -1,3 +1,9 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# This file is part of Nominatim. (https://nominatim.org)
+#
+# Copyright (C) 2022 by the Nominatim developer community.
+# For a full list of authors see the git log.
 """
 Tests for functions to maintain the artificial postcode table.
 """
@@ -6,6 +12,7 @@ import subprocess
 import pytest
 
 from nominatim.tools import postcodes
+from nominatim.data import country_info
 import dummy_tokenizer
 
 class MockPostcodeTable:
@@ -58,11 +65,26 @@ class MockPostcodeTable:
 def tokenizer():
     return dummy_tokenizer.DummyTokenizer(None, None)
 
+
 @pytest.fixture
-def postcode_table(temp_db_conn, placex_table, word_table):
+def postcode_table(def_config, temp_db_conn, placex_table):
+    country_info.setup_country_config(def_config)
     return MockPostcodeTable(temp_db_conn)
 
 
+@pytest.fixture
+def insert_implicit_postcode(placex_table, place_row):
+    """
+        Inserts data into the placex and place table
+        which can then be used to compute one postcode.
+    """
+    def _insert_implicit_postcode(osm_id, country, geometry, address):
+        placex_table.add(osm_id=osm_id, country=country, geom=geometry)
+        place_row(osm_id=osm_id, geom='SRID=4326;'+geometry, address=address)
+
+    return _insert_implicit_postcode
+
+
 def test_postcodes_empty(dsn, postcode_table, place_table,
                          tmp_path, tokenizer):
     postcodes.update_postcodes(dsn, tmp_path, tokenizer)
@@ -187,27 +209,30 @@ def test_can_compute(dsn, table_factory):
     table_factory('place')
     assert postcodes.can_compute(dsn)
 
+
 def test_no_placex_entry(dsn, tmp_path, temp_db_cursor, place_row, postcode_table, tokenizer):
     #Rewrite the get_country_code function to verify its execution.
     temp_db_cursor.execute("""
         CREATE OR REPLACE FUNCTION get_country_code(place geometry)
         RETURNS TEXT AS $$ BEGIN 
-        RETURN 'fr';
+        RETURN 'yy';
         END; $$ LANGUAGE plpgsql;
     """)
     place_row(geom='SRID=4326;POINT(10 12)', address=dict(postcode='AB 4511'))
     postcodes.update_postcodes(dsn, tmp_path, tokenizer)
 
-    assert postcode_table.row_set == {('fr', 'AB 4511', 10, 12)}
+    assert postcode_table.row_set == {('yy', 'AB 4511', 10, 12)}
 
-@pytest.fixture
-def insert_implicit_postcode(placex_table, place_row):
-    """
-        Inserts data into the placex and place table
-        which can then be used to compute one postcode.
-    """
-    def _insert_implicit_postcode(osm_id, country, geometry, address):
-        placex_table.add(osm_id=osm_id, country=country, geom=geometry)
-        place_row(osm_id=osm_id, geom='SRID=4326;'+geometry, address=address)
 
-    return _insert_implicit_postcode
+def test_discard_badly_formatted_postcodes(dsn, tmp_path, temp_db_cursor, place_row, postcode_table, tokenizer):
+    #Rewrite the get_country_code function to verify its execution.
+    temp_db_cursor.execute("""
+        CREATE OR REPLACE FUNCTION get_country_code(place geometry)
+        RETURNS TEXT AS $$ BEGIN 
+        RETURN 'fr';
+        END; $$ LANGUAGE plpgsql;
+    """)
+    place_row(geom='SRID=4326;POINT(10 12)', address=dict(postcode='AB 4511'))
+    postcodes.update_postcodes(dsn, tmp_path, tokenizer)
+
+    assert not postcode_table.row_set
index c15c3614fd28c571491cdf1a7a4e1cc27d7fc1ed..ac52aa36091643923d1c6791038b78ddc8f8c8d9 100644 (file)
@@ -1,3 +1,9 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# This file is part of Nominatim. (https://nominatim.org)
+#
+# Copyright (C) 2022 by the Nominatim developer community.
+# For a full list of authors see the git log.
 """
 Test for various refresh functions.
 """
@@ -33,3 +39,47 @@ def test_recompute_importance(placex_table, table_factory, temp_db_conn, temp_db
                                AS $$ SELECT 0.1::float, 'foo'::text $$ LANGUAGE SQL""")
 
     refresh.recompute_importance(temp_db_conn)
+
+
+@pytest.mark.parametrize('osm_type', ('N', 'W', 'R'))
+def test_invalidate_osm_object_simple(placex_table, osm_type, temp_db_conn, temp_db_cursor):
+    placex_table.add(osm_type=osm_type, osm_id=57283)
+
+    refresh.invalidate_osm_object(osm_type, 57283, temp_db_conn, recursive=False)
+    temp_db_conn.commit()
+
+    assert 2 == temp_db_cursor.scalar("""SELECT indexed_status FROM placex
+                                         WHERE osm_type = %s and osm_id = %s""",
+                                      (osm_type, 57283))
+
+
+def test_invalidate_osm_object_nonexisting_simple(placex_table, temp_db_conn, temp_db_cursor):
+    placex_table.add(osm_type='W', osm_id=57283)
+
+    refresh.invalidate_osm_object('N', 57283, temp_db_conn, recursive=False)
+    temp_db_conn.commit()
+
+    assert 0 == temp_db_cursor.scalar("""SELECT count(*) FROM placex
+                                         WHERE indexed_status > 0""")
+
+
+@pytest.mark.parametrize('osm_type', ('N', 'W', 'R'))
+def test_invalidate_osm_object_recursive(placex_table, osm_type, temp_db_conn, temp_db_cursor):
+    placex_table.add(osm_type=osm_type, osm_id=57283)
+
+    temp_db_cursor.execute("""CREATE OR REPLACE FUNCTION place_force_update(placeid BIGINT)
+                              RETURNS BOOLEAN AS $$
+                              BEGIN
+                                UPDATE placex SET indexed_status = 522
+                                WHERE place_id = placeid;
+                                RETURN TRUE;
+                              END;
+                              $$
+                              LANGUAGE plpgsql;""")
+
+    refresh.invalidate_osm_object(osm_type, 57283, temp_db_conn)
+    temp_db_conn.commit()
+
+    assert 522 == temp_db_cursor.scalar("""SELECT indexed_status FROM placex
+                                           WHERE osm_type = %s and osm_id = %s""",
+                                        (osm_type, 57283))
index 40d13641632c749a709c2973a0260823bac0e22b..e35a81901df497c093531bab20b1a167327ec3db 100644 (file)
@@ -1,3 +1,9 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# This file is part of Nominatim. (https://nominatim.org)
+#
+# Copyright (C) 2022 by the Nominatim developer community.
+# For a full list of authors see the git log.
 """
 Tests for function for importing address ranks.
 """
index 9fddcd212960590aff5ee86840b90f1f323e1f94..8d26e7554dd6d1613621133485226dad0015037d 100644 (file)
@@ -1,3 +1,9 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# This file is part of Nominatim. (https://nominatim.org)
+#
+# Copyright (C) 2022 by the Nominatim developer community.
+# For a full list of authors see the git log.
 """
 Tests for creating PL/pgSQL functions for Nominatim.
 """
index 12f5df82bd73fb64d95da518bcffe099dffb5b29..af3804c91cdd1148357db9e9cf4cf5cf7420ad97 100644 (file)
@@ -1,3 +1,9 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# This file is part of Nominatim. (https://nominatim.org)
+#
+# Copyright (C) 2022 by the Nominatim developer community.
+# For a full list of authors see the git log.
 """
 Tests for setting up the website scripts.
 """
index 2bf2901b33a8b8794d05c3e3e637fd0b85147113..2f9c7e866b75da75becfda701f7c0dbb50fff265 100644 (file)
@@ -1,3 +1,9 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# This file is part of Nominatim. (https://nominatim.org)
+#
+# Copyright (C) 2022 by the Nominatim developer community.
+# For a full list of authors see the git log.
 """
 Tests for replication functionality.
 """
index 80d5989e92a89fba67160acba63dfa46a8d08cf7..49d5a85340a8a58cf70d74579cb7f75c7bfdc8df 100644 (file)
@@ -1,3 +1,9 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# This file is part of Nominatim. (https://nominatim.org)
+#
+# Copyright (C) 2022 by the Nominatim developer community.
+# For a full list of authors see the git log.
 """
     Tests for methods of the SPCsvLoader class.
 """
@@ -5,56 +11,39 @@ import pytest
 
 from nominatim.errors import UsageError
 from nominatim.tools.special_phrases.sp_csv_loader import SPCsvLoader
+from nominatim.tools.special_phrases.special_phrase import SpecialPhrase
 
-def test_parse_csv(sp_csv_loader):
+@pytest.fixture
+def sp_csv_loader(src_dir):
     """
-        Test method parse_csv()
-        Should return the right SpecialPhrase objects.
+        Return an instance of SPCsvLoader.
     """
-    phrases = sp_csv_loader.parse_csv()
-    assert check_phrases_content(phrases)
+    csv_path = (src_dir / 'test' / 'testdata' / 'sp_csv_test.csv').resolve()
+    loader = SPCsvLoader(csv_path)
+    return loader
+
 
-def test_next(sp_csv_loader):
+def test_generate_phrases(sp_csv_loader):
     """
-        Test objects returned from the next() method.
-        It should return all SpecialPhrases objects of
-        the sp_csv_test.csv special phrases.
+        Test method parse_csv()
+        Should return the right SpecialPhrase objects.
     """
-    phrases = next(sp_csv_loader)
-    assert check_phrases_content(phrases)
+    phrases = list(sp_csv_loader.generate_phrases())
+
+    assert len(phrases) == 42
+    assert len(set(phrases)) == 41
+
+    assert SpecialPhrase('Billboard', 'advertising', 'billboard', '-') in phrases
+    assert SpecialPhrase('Zip Lines', 'aerialway', 'zip_line', '-') in phrases
 
-def test_check_csv_validity(sp_csv_loader):
+
+def test_invalid_cvs_file():
     """
         Test method check_csv_validity()
         It should raise an exception when file with a
         different exception than .csv is given.
     """
-    sp_csv_loader.csv_path = 'test.csv'
-    sp_csv_loader.check_csv_validity()
-    sp_csv_loader.csv_path = 'test.wrong'
-    with pytest.raises(UsageError):
-        assert sp_csv_loader.check_csv_validity()
-
-def check_phrases_content(phrases):
-    """
-        Asserts that the given phrases list contains
-        the right phrases of the sp_csv_test.csv special phrases.
-    """
-    return  len(phrases) > 1 \
-            and any(p.p_label == 'Billboard'
-                    and p.p_class == 'advertising'
-                    and p.p_type == 'billboard'
-                    and p.p_operator == '-' for p in phrases) \
-            and any(p.p_label == 'Zip Lines'
-                    and p.p_class == 'aerialway'
-                    and p.p_type == 'zip_line'
-                    and p.p_operator == '-' for p in phrases)
+    loader = SPCsvLoader('test.wrong')
 
-@pytest.fixture
-def sp_csv_loader(src_dir):
-    """
-        Return an instance of SPCsvLoader.
-    """
-    csv_path = (src_dir / 'test' / 'testdata' / 'sp_csv_test.csv').resolve()
-    loader = SPCsvLoader(csv_path)
-    return loader
+    with pytest.raises(UsageError, match='not a csv file'):
+        next(loader.generate_phrases())
index f29528a51ec1d3ce8e4624a5b35c5c94d91b57dc..2f47734e079b988519a997f4f10cbbfccd7000a3 100644 (file)
@@ -1,52 +1,41 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# This file is part of Nominatim. (https://nominatim.org)
+#
+# Copyright (C) 2022 by the Nominatim developer community.
+# For a full list of authors see the git log.
 """
     Tests for methods of the SPWikiLoader class.
 """
 import pytest
 from nominatim.tools.special_phrases.sp_wiki_loader import SPWikiLoader
 
-@pytest.fixture
-def xml_wiki_content(src_dir):
-    """
-        return the content of the static xml test file.
-    """
-    xml_test_content = src_dir / 'test' / 'testdata' / 'special_phrases_test_content.txt'
-    return xml_test_content.read_text()
-
 
 @pytest.fixture
-def sp_wiki_loader(monkeypatch, def_config, xml_wiki_content):
+def sp_wiki_loader(src_dir, monkeypatch, def_config):
     """
         Return an instance of SPWikiLoader.
     """
-    loader = SPWikiLoader(def_config, ['en'])
-    monkeypatch.setattr('nominatim.tools.special_phrases.sp_wiki_loader.SPWikiLoader._get_wiki_content',
-                        lambda self, lang: xml_wiki_content)
-    return loader
+    monkeypatch.setenv('NOMINATIM_LANGUAGES', 'en')
+    loader = SPWikiLoader(def_config)
 
+    def _mock_wiki_content(lang):
+        xml_test_content = src_dir / 'test' / 'testdata' / 'special_phrases_test_content.txt'
+        return xml_test_content.read_text()
 
-def test_parse_xml(sp_wiki_loader, xml_wiki_content):
-    """
-        Test method parse_xml()
-        Should return the right SpecialPhrase objects.
-    """
-    phrases = sp_wiki_loader.parse_xml(xml_wiki_content)
-    check_phrases_content(phrases)
+    monkeypatch.setattr('nominatim.tools.special_phrases.sp_wiki_loader._get_wiki_content',
+                        _mock_wiki_content)
+    return loader
 
 
-def test_next(sp_wiki_loader):
+def test_generate_phrases(sp_wiki_loader):
     """
         Test objects returned from the next() method.
         It should return all SpecialPhrases objects of
         the 'en' special phrases.
     """
-    phrases = next(sp_wiki_loader)
-    check_phrases_content(phrases)
+    phrases = list(sp_wiki_loader.generate_phrases())
 
-def check_phrases_content(phrases):
-    """
-        Asserts that the given phrases list contains
-        the right phrases of the 'en' special phrases.
-    """
     assert set((p.p_label, p.p_class, p.p_type, p.p_operator) for p in phrases) ==\
               {('Zip Line', 'aerialway', 'zip_line', '-'),
                ('Zip Lines', 'aerialway', 'zip_line', '-'),
index 2e5240871e099da66ac1678f94b75d391d3af994..f027c4ffef19d1eb877038a57153a982fe4db61a 100644 (file)
@@ -1,3 +1,9 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# This file is part of Nominatim. (https://nominatim.org)
+#
+# Copyright (C) 2022 by the Nominatim developer community.
+# For a full list of authors see the git log.
 """
 Test for tiger data function
 """
diff --git a/test/python/utils/test_centroid.py b/test/python/utils/test_centroid.py
new file mode 100644 (file)
index 0000000..63d967e
--- /dev/null
@@ -0,0 +1,56 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# This file is part of Nominatim. (https://nominatim.org)
+#
+# Copyright (C) 2022 by the Nominatim developer community.
+# For a full list of authors see the git log.
+"""
+Tests for centroid computation.
+"""
+import pytest
+
+from nominatim.utils.centroid import PointsCentroid
+
+def test_empty_set():
+    c = PointsCentroid()
+
+    with pytest.raises(ValueError, match='No points'):
+        c.centroid()
+
+
+@pytest.mark.parametrize("centroid", [(0,0), (-1, 3), [0.0000032, 88.4938]])
+def test_one_point_centroid(centroid):
+    c = PointsCentroid()
+
+    c += centroid
+
+    assert len(c.centroid()) == 2
+    assert c.centroid() == (pytest.approx(centroid[0]), pytest.approx(centroid[1]))
+
+
+def test_multipoint_centroid():
+    c = PointsCentroid()
+
+    c += (20.0, -10.0)
+    assert c.centroid() == (pytest.approx(20.0), pytest.approx(-10.0))
+    c += (20.2, -9.0)
+    assert c.centroid() == (pytest.approx(20.1), pytest.approx(-9.5))
+    c += (20.2, -9.0)
+    assert c.centroid() == (pytest.approx(20.13333), pytest.approx(-9.333333))
+
+
+def test_manypoint_centroid():
+    c = PointsCentroid()
+
+    for _ in range(10000):
+        c += (4.564732, -0.000034)
+
+    assert c.centroid() == (pytest.approx(4.564732), pytest.approx(-0.000034))
+
+
+@pytest.mark.parametrize("param", ["aa", None, 5, [1, 2, 3], (3, None), ("a", 3.9)])
+def test_add_non_tuple(param):
+    c = PointsCentroid()
+
+    with pytest.raises(ValueError, match='2-element tuples'):
+        c += param
diff --git a/test/scenes/bin/Makefile b/test/scenes/bin/Makefile
deleted file mode 100644 (file)
index d508bba..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-CXXFLAGS += -O3
-#CXXFLAGS += -g
-CXXFLAGS += -std=c++11 -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64
-CXXFLAGS += -I../../../../libosmium/include
-
-OS:=$(shell uname -s)
-ifeq ($(OS),Darwin)
-CXXFLAGS += -stdlib=libc++
-LDFLAGS += -stdlib=libc++
-endif
-
-CXXFLAGS_WARNINGS := -Wall -Wextra -pedantic -Wredundant-decls -Wdisabled-optimization -Wctor-dtor-privacy -Wnon-virtual-dtor -Woverloaded-virtual -Wsign-promo -Wold-style-cast
-
-LIB_EXPAT := -lexpat
-LIB_PBF := -pthread -lz -lprotobuf-lite -losmpbf
-LIB_GZIP := -lz
-LIB_BZIP2 := -lbz2
-
-LIB_IO := $(LIB_EXPAT) $(LIB_PBF) $(LIB_GZIP) $(LIB_BZIP2)
-
-all:
-
-osm2wkt: osm2wkt.cc
-       $(CXX) $(CXXFLAGS) $(CXXFLAGS_WARNINGS) -o $@ $< $(LDFLAGS) $(LIB_IO)
-
-scenarios: osm2wkt
-       ./make_scenes.sh
diff --git a/test/scenes/bin/make_scenes.sh b/test/scenes/bin/make_scenes.sh
deleted file mode 100755 (executable)
index 25340b5..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-#!/bin/bash -e
-#
-# Regenerates wkts for scenarios.
-#
-
-datadir="$( cd "$( dirname "$0" )" && cd ../data && pwd )"
-
-if [ ! -d "$datadir" ]; then
- echo "Cannot find data dir."; 
- exit -1;
-fi
-
-echo "Using datadir $datadir"
-cd $datadir
-
-# remove old wkts
-rm -f $datadir/*.wkt
-
-# create wkts from SQL scripts
-for fl in *.sql; do
-    echo "Processing $fl.."
-    cat $fl | psql -d nominatim -t -o ${fl/.sql/.wkt}
-done
-
-# create wkts from .osm files
-for fl in *.osm; do
-    echo "Processing $fl.."
-    ../bin/osm2wkt $fl
-done
diff --git a/test/scenes/bin/osm2wkt.cc b/test/scenes/bin/osm2wkt.cc
deleted file mode 100644 (file)
index 22e74b4..0000000
+++ /dev/null
@@ -1,141 +0,0 @@
-
-// The code in this file is released into the Public Domain.
-
-#include <iostream>
-#include <fstream>
-#include <string>
-#include <unordered_map>
-
-#include <osmium/area/assembler.hpp>
-#include <osmium/area/multipolygon_manager.hpp>
-
-#include <osmium/geom/wkt.hpp>
-#include <osmium/handler.hpp>
-#include <osmium/handler/node_locations_for_ways.hpp>
-#include <osmium/io/any_input.hpp>
-#include <osmium/visitor.hpp>
-#include <osmium/object_pointer_collection.hpp>
-#include <osmium/index/map/sparse_mem_array.hpp>
-#include <osmium/osm/object_comparisons.hpp>
-
-typedef osmium::index::map::SparseMemArray<osmium::unsigned_object_id_type, osmium::Location> index_type;
-
-typedef osmium::handler::NodeLocationsForWays<index_type, index_type> location_handler_type;
-
-struct AbsoluteIdHandler : public osmium::handler::Handler {
-
-    enum { BASE = 100000000 };
-
-    void node(osmium::Node& o) {
-        if (o.id() < 0)
-            o.set_id(BASE-o.id());
-    }
-
-    void way(osmium::Way& o) {
-        if (o.id() < 0)
-            o.set_id(BASE-o.id());
-
-        for (osmium::NodeRef &n: o.nodes())
-            if (n.ref() < 0)
-                n.set_ref(BASE-n.ref());
-    }
-
-    void relation(osmium::Relation& o) {
-        if (o.id() < 0)
-            o.set_id(BASE-o.id());
-
-        for (auto &m : o.members())
-            if (m.ref() < 0)
-                m.set_ref(BASE-m.ref());
-    }
-};
-
-
-class ExportToWKTHandler : public osmium::handler::Handler {
-
-    osmium::geom::WKTFactory<> m_factory;
-    std::unordered_map<std::string, std::ofstream>  m_files;
-
-public:
-
-    void node(const osmium::Node& node) {
-        print_geometry(node.tags(), m_factory.create_point(node));
-    }
-
-    void way(const osmium::Way& way) {
-        if (!way.nodes().empty()
-            && (!way.is_closed() || !way.tags().get_value_by_key("area")))
-            print_geometry(way.tags(), m_factory.create_linestring(way));
-    }
-
-    void area(const osmium::Area& area) {
-        if (!area.from_way() || area.tags().get_value_by_key("area"))
-            print_geometry(area.tags(), m_factory.create_multipolygon(area));
-    }
-
-    void close() {
-        for (auto& fd : m_files)
-            fd.second.close();
-    }
-
-private:
-    void print_geometry(const osmium::TagList& tags, const std::string& wkt) {
-        const char* scenario = tags.get_value_by_key("test:section");
-        const char* id = tags.get_value_by_key("test:id");
-        if (scenario && id) {
-            auto& fd = m_files[std::string(scenario)];
-            if (!fd.is_open())
-                fd.open(std::string(scenario) + ".wkt");
-            fd << id << " |  " << wkt << "\n";
-        }
-    }
-
-}; // class ExportToWKTHandler
-
-int main(int argc, char* argv[]) {
-    if (argc != 2) {
-        std::cerr << "Usage: " << argv[0] << " OSMFILE\n";
-        exit(1);
-    }
-
-    osmium::io::File input_file{argv[1]};
-
-    // need to sort the data first and make ids absolute
-    std::cerr << "Read file...\n";
-    osmium::io::Reader reader{input_file};
-    std::vector<osmium::memory::Buffer> changes;
-    osmium::ObjectPointerCollection objects;
-    AbsoluteIdHandler abshandler;
-    while (osmium::memory::Buffer buffer = reader.read()) {
-            osmium::apply(buffer, abshandler, objects);
-            changes.push_back(std::move(buffer));
-    }
-    reader.close();
-
-    std::cerr << "Sort file...\n";
-    objects.sort(osmium::object_order_type_id_version());
-
-    osmium::area::Assembler::config_type assembler_config;
-    osmium::area::MultipolygonManager<osmium::area::Assembler> mp_manager{assembler_config};
-
-    std::cerr << "Pass 1...\n";
-    index_type index_pos;
-    index_type index_neg;
-    location_handler_type location_handler(index_pos, index_neg);
-    ExportToWKTHandler export_handler;
-    osmium::apply(objects.begin(), objects.end(), location_handler,
-                  export_handler, mp_manager);
-    mp_manager.prepare_for_lookup();
-    std::cerr << "Pass 1 done\n";
-
-
-    std::cerr << "Pass 2...\n";
-    osmium::apply(objects.cbegin(), objects.cend(), mp_manager.handler([&export_handler](osmium::memory::Buffer&& buffer) {
-        osmium::apply(buffer, export_handler);
-    }));
-
-    export_handler.close();
-    std::cerr << "Pass 2 done\n";
-}
-
-
diff --git a/test/scenes/data/admin-areas.wkt b/test/scenes/data/admin-areas.wkt
deleted file mode 100644 (file)
index af741d9..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-c1:N |  POINT(73.8419358 60.0763887)
-c1:E |  POINT(73.8393798 60.0488584)
-c0 |  POINT(73.8679209 60.0588527)
-c2:N |  POINT(73.896249 60.0631047)
-c2:S |  POINT(73.8932671 60.0434346)
-c2:E |  POINT(73.9162704 60.0471569)
-c1:W |  POINT(73.8990179 60.055876)
-c2:W |  POINT(73.8568453 60.0597032)
-w2N |  LINESTRING(73.8836825 60.0612977,73.8880489 60.0598094,73.8953972 60.0601283,73.9033844 60.058959)
-w1W:2W |  LINESTRING(73.8523722 60.0497092,73.85791 60.0520485,73.8617439 60.0573645,73.8706896 60.0554508)
-building:w2N |  LINESTRING(73.8963618 60.0604955,73.8961463 60.0602249,73.8967091 60.0601132,73.8969246 60.0603838,73.8963618 60.0604955)
-b0 |  MULTIPOLYGON(((73.8012539 60.0573645,73.8225532 60.0371591,73.8493903 60.035457,73.8843212 60.0356698,73.9049815 60.0358825,73.9192521 60.0356698,73.9260679 60.0514105,73.9216633 60.0591056,73.9141402 60.0722448,73.8804873 60.070332,73.8719676 60.0917916,73.8255351 60.0875433,73.8084956 60.0758576,73.8012539 60.0573645)))
-b1:N |  MULTIPOLYGON(((73.8012539 60.0573645,73.8447045 60.0611915,73.8692843 60.0674706,73.8804873 60.070332,73.8719676 60.0917916,73.8255351 60.0875433,73.8084956 60.0758576,73.8012539 60.0573645)))
-b2:S |  MULTIPOLYGON(((73.8694117 60.0507725,73.8843212 60.0356698,73.9049815 60.0358825,73.9075368 60.0523758,73.8830432 60.0517295,73.8694117 60.0507725)))
-b1:W |  MULTIPOLYGON(((73.8012539 60.0573645,73.8225532 60.0371591,73.8493903 60.035457,73.8843212 60.0356698,73.8694117 60.0507725,73.8447045 60.0611915,73.8012539 60.0573645)))
-b1:E |  MULTIPOLYGON(((73.8447045 60.0611915,73.8694117 60.0507725,73.8843212 60.0356698,73.9049815 60.0358825,73.9192521 60.0356698,73.9260679 60.0514105,73.9216633 60.0591056,73.9141402 60.0722448,73.8804873 60.070332,73.8692843 60.0674706,73.8447045 60.0611915)))
-b2:E |  MULTIPOLYGON(((73.9049815 60.0358825,73.9192521 60.0356698,73.9260679 60.0514105,73.9216633 60.0591056,73.9075368 60.0523758,73.9049815 60.0358825)))
-b2:N |  MULTIPOLYGON(((73.8692843 60.0674706,73.8830432 60.0517295,73.9075368 60.0523758,73.9216633 60.0591056,73.9141402 60.0722448,73.8804873 60.070332,73.8692843 60.0674706)))
-b2:W |  MULTIPOLYGON(((73.8447045 60.0611915,73.8694117 60.0507725,73.8830432 60.0517295,73.8692843 60.0674706,73.8447045 60.0611915)))
diff --git a/test/scenes/data/admin.osm b/test/scenes/data/admin.osm
deleted file mode 100644 (file)
index bfe4340..0000000
+++ /dev/null
@@ -1,250 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<osm version='0.6' upload='false' generator='JOSM'>
-  <node id='-30473' action='modify' lat='60.07585759191' lon='73.80849562007' />
-  <node id='-30475' action='modify' lat='60.05736451143' lon='73.80125385169' />
-  <node id='-30477' action='modify' lat='60.0371590755' lon='73.82255317047' />
-  <node id='-30479' action='modify' lat='60.03545700058' lon='73.84939031213' />
-  <node id='-30481' action='modify' lat='60.03566976474' lon='73.88432119493' />
-  <node id='-30483' action='modify' lat='60.03566976474' lon='73.91925207773' />
-  <node id='-30485' action='modify' lat='60.05141051018' lon='73.92606785974' />
-  <node id='-30487' action='modify' lat='60.07224481634' lon='73.91414024122' />
-  <node id='-30489' action='modify' lat='60.07033201023' lon='73.88048731755' />
-  <node id='-30491' action='modify' lat='60.09179158393' lon='73.87196759004' />
-  <node id='-30493' action='modify' lat='60.08754327238' lon='73.8255350751' />
-  <node id='-30495' action='modify' lat='60.06119151655' lon='73.844704462' />
-  <node id='-30497' action='modify' lat='60.05077251777' lon='73.86941167178' />
-  <node id='-30499' action='modify' lat='60.05172950176' lon='73.8830432358' />
-  <node id='-30501' action='modify' lat='60.06747055357' lon='73.86928433032' />
-  <node id='-30503' action='modify' lat='60.05910557298' lon='73.92166332136' />
-  <node id='-30505' action='modify' lat='60.05237575233' lon='73.90753676249' />
-  <node id='-30507' action='modify' lat='60.03588252753' lon='73.90498153415' />
-  <node id='-30509' action='modify' lat='60.07638874281' lon='73.84193576355'>
-    <tag k='test:id' v='c1:N' />
-    <tag k='test:section' v='admin-areas' />
-  </node>
-  <node id='-30511' action='modify' lat='60.04885836023' lon='73.8393798453'>
-    <tag k='test:id' v='c1:E' />
-    <tag k='test:section' v='admin-areas' />
-  </node>
-  <node id='-30513' action='modify' lat='60.05885273763' lon='73.86792093246'>
-    <tag k='test:id' v='c0' />
-    <tag k='test:section' v='admin-areas' />
-  </node>
-  <node id='-30515' action='modify' lat='60.06310474639' lon='73.89624902644'>
-    <tag k='test:id' v='c2:N' />
-    <tag k='test:section' v='admin-areas' />
-  </node>
-  <node id='-30517' action='modify' lat='60.04343461246' lon='73.89326712181'>
-    <tag k='test:id' v='c2:S' />
-    <tag k='test:section' v='admin-areas' />
-  </node>
-  <node id='-30519' action='modify' lat='60.04715688821' lon='73.91627038609'>
-    <tag k='test:id' v='c2:E' />
-    <tag k='test:section' v='admin-areas' />
-  </node>
-  <node id='-30521' action='modify' lat='60.05587600549' lon='73.89901793788'>
-    <tag k='test:id' v='c1:W' />
-    <tag k='test:section' v='admin-areas' />
-  </node>
-  <node id='-30523' action='modify' lat='60.05970318321' lon='73.8568452867'>
-    <tag k='test:id' v='c2:W' />
-    <tag k='test:section' v='admin-areas' />
-  </node>
-  <node id='-30525' action='modify' lat='60.06129765646' lon='73.88368253486' />
-  <node id='-30527' action='modify' lat='60.05980943422' lon='73.88804889521' />
-  <node id='-30529' action='modify' lat='60.06012834464' lon='73.89539716019' />
-  <node id='-30531' action='modify' lat='60.05895899137' lon='73.90338440473' />
-  <node id='-30533' action='modify' lat='60.04970916969' lon='73.85237221676' />
-  <node id='-30535' action='modify' lat='60.05204849025' lon='73.85791003964' />
-  <node id='-30537' action='modify' lat='60.05736451143' lon='73.86174391702' />
-  <node id='-30539' action='modify' lat='60.05545084244' lon='73.87068963091' />
-  <node id='-30541' action='modify' lat='60.06049547301' lon='73.89636177639' />
-  <node id='-30543' action='modify' lat='60.06022493568' lon='73.89614625694' />
-  <node id='-30545' action='modify' lat='60.06011324975' lon='73.89670909505' />
-  <node id='-30547' action='modify' lat='60.060383788' lon='73.89692461449' />
-  <node id='100000' action='delete' timestamp='2014-01-01T00:00:00Z' uid='1' user='test' version='1' changeset='1' lat='3.0' lon='2.0' />
-  <node id='100001' action='delete' timestamp='2014-01-01T00:00:00Z' uid='1' user='test' version='1' changeset='1' lat='3.5' lon='2.0' />
-  <node id='100002' action='delete' timestamp='2014-01-01T00:00:00Z' uid='1' user='test' version='1' changeset='1' lat='3.5' lon='2.5' />
-  <node id='100003' action='delete' timestamp='2014-01-01T00:00:00Z' uid='1' user='test' version='1' changeset='1' lat='3.0' lon='2.5' />
-  <way id='-30553' action='modify'>
-    <nd ref='-30489' />
-    <nd ref='-30491' />
-    <nd ref='-30493' />
-    <nd ref='-30473' />
-    <nd ref='-30475' />
-  </way>
-  <way id='-30555' action='modify'>
-    <nd ref='-30495' />
-    <nd ref='-30501' />
-  </way>
-  <way id='-30557' action='modify'>
-    <nd ref='-30495' />
-    <nd ref='-30497' />
-  </way>
-  <way id='-30559' action='modify'>
-    <nd ref='-30497' />
-    <nd ref='-30499' />
-  </way>
-  <way id='-30561' action='modify'>
-    <nd ref='-30499' />
-    <nd ref='-30505' />
-  </way>
-  <way id='-30563' action='modify'>
-    <nd ref='-30505' />
-    <nd ref='-30507' />
-  </way>
-  <way id='-30565' action='modify'>
-    <nd ref='-30503' />
-    <nd ref='-30487' />
-    <nd ref='-30489' />
-  </way>
-  <way id='-30567' action='modify'>
-    <nd ref='-30507' />
-    <nd ref='-30483' />
-    <nd ref='-30485' />
-    <nd ref='-30503' />
-  </way>
-  <way id='-30569' action='modify'>
-    <nd ref='-30481' />
-    <nd ref='-30507' />
-  </way>
-  <way id='-30571' action='modify'>
-    <nd ref='-30475' />
-    <nd ref='-30477' />
-    <nd ref='-30479' />
-    <nd ref='-30481' />
-  </way>
-  <way id='-30573' action='modify'>
-    <nd ref='-30475' />
-    <nd ref='-30495' />
-  </way>
-  <way id='-30575' action='modify'>
-    <nd ref='-30501' />
-    <nd ref='-30489' />
-  </way>
-  <way id='-30577' action='modify'>
-    <nd ref='-30497' />
-    <nd ref='-30481' />
-  </way>
-  <way id='-30579' action='modify'>
-    <nd ref='-30505' />
-    <nd ref='-30503' />
-  </way>
-  <way id='-30581' action='modify'>
-    <nd ref='-30499' />
-    <nd ref='-30501' />
-  </way>
-  <way id='-30583' action='modify'>
-    <nd ref='-30525' />
-    <nd ref='-30527' />
-    <nd ref='-30529' />
-    <nd ref='-30531' />
-    <tag k='test:id' v='w2N' />
-    <tag k='test:section' v='admin-areas' />
-  </way>
-  <way id='-30585' action='modify'>
-    <nd ref='-30533' />
-    <nd ref='-30535' />
-    <nd ref='-30537' />
-    <nd ref='-30539' />
-    <tag k='test:id' v='w1W:2W' />
-    <tag k='test:section' v='admin-areas' />
-  </way>
-  <way id='-30587' action='modify'>
-    <nd ref='-30541' />
-    <nd ref='-30543' />
-    <nd ref='-30545' />
-    <nd ref='-30547' />
-    <nd ref='-30541' />
-    <tag k='test:id' v='building:w2N' />
-    <tag k='test:section' v='admin-areas' />
-  </way>
-  <way id='100000' action='delete' timestamp='2014-01-01T00:00:00Z' uid='1' user='test' version='1' changeset='1'>
-    <tag k='note' v='test area, do not leave' />
-  </way>
-  <relation id='-30590' action='modify'>
-    <member type='way' ref='-30553' role='' />
-    <member type='way' ref='-30571' role='' />
-    <member type='way' ref='-30569' role='' />
-    <member type='way' ref='-30567' role='' />
-    <member type='way' ref='-30565' role='' />
-    <tag k='boundary' v='administrative' />
-    <tag k='test:id' v='b0' />
-    <tag k='test:section' v='admin-areas' />
-    <tag k='type' v='multipolygon' />
-  </relation>
-  <relation id='-30592' action='modify'>
-    <member type='way' ref='-30553' role='' />
-    <member type='way' ref='-30573' role='' />
-    <member type='way' ref='-30555' role='' />
-    <member type='way' ref='-30575' role='' />
-    <tag k='boundary' v='administrative' />
-    <tag k='test:id' v='b1:N' />
-    <tag k='test:section' v='admin-areas' />
-    <tag k='type' v='multipolygon' />
-  </relation>
-  <relation id='-30594' action='modify'>
-    <member type='way' ref='-30571' role='' />
-    <member type='way' ref='-30573' role='' />
-    <member type='way' ref='-30557' role='' />
-    <member type='way' ref='-30577' role='' />
-    <tag k='boundary' v='administrative' />
-    <tag k='test:id' v='b1:W' />
-    <tag k='test:section' v='admin-areas' />
-    <tag k='type' v='multipolygon' />
-  </relation>
-  <relation id='-30596' action='modify'>
-    <member type='way' ref='-30565' role='' />
-    <member type='way' ref='-30567' role='' />
-    <member type='way' ref='-30569' role='' />
-    <member type='way' ref='-30577' role='' />
-    <member type='way' ref='-30557' role='' />
-    <member type='way' ref='-30555' role='' />
-    <member type='way' ref='-30575' role='' />
-    <tag k='boundary' v='administrative' />
-    <tag k='test:id' v='b1:E' />
-    <tag k='test:section' v='admin-areas' />
-    <tag k='type' v='multipolygon' />
-  </relation>
-  <relation id='-30598' action='modify'>
-    <member type='way' ref='-30565' role='' />
-    <member type='way' ref='-30579' role='' />
-    <member type='way' ref='-30561' role='' />
-    <member type='way' ref='-30581' role='' />
-    <member type='way' ref='-30575' role='' />
-    <tag k='boundary' v='administrative' />
-    <tag k='test:id' v='b2:N' />
-    <tag k='test:section' v='admin-areas' />
-    <tag k='type' v='multipolygon' />
-  </relation>
-  <relation id='-30600' action='modify'>
-    <member type='way' ref='-30555' role='' />
-    <member type='way' ref='-30557' role='' />
-    <member type='way' ref='-30559' role='' />
-    <member type='way' ref='-30581' role='' />
-    <tag k='boundary' v='administrative' />
-    <tag k='test:id' v='b2:W' />
-    <tag k='test:section' v='admin-areas' />
-    <tag k='type' v='multipolygon' />
-  </relation>
-  <relation id='-30602' action='modify'>
-    <member type='way' ref='-30577' role='' />
-    <member type='way' ref='-30559' role='' />
-    <member type='way' ref='-30561' role='' />
-    <member type='way' ref='-30563' role='' />
-    <member type='way' ref='-30569' role='' />
-    <tag k='boundary' v='administrative' />
-    <tag k='test:id' v='b2:S' />
-    <tag k='test:section' v='admin-areas' />
-    <tag k='type' v='multipolygon' />
-  </relation>
-  <relation id='-30604' action='modify'>
-    <member type='way' ref='-30579' role='' />
-    <member type='way' ref='-30567' role='' />
-    <member type='way' ref='-30563' role='' />
-    <tag k='boundary' v='administrative' />
-    <tag k='test:id' v='b2:E' />
-    <tag k='test:section' v='admin-areas' />
-    <tag k='type' v='multipolygon' />
-  </relation>
-</osm>
diff --git a/test/scenes/data/building-on-street-corner.wkt b/test/scenes/data/building-on-street-corner.wkt
deleted file mode 100644 (file)
index 24da78f..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-n-edge-NS |  POINT(1.0040019 2.000324)
-n-inner |  POINT(1.0039385 2.0003548)
-n-outer |  POINT(1.0039478 2.0004676)
-n-edge-WE |  POINT(1.0039599 2.0002345)
-w-WE |  LINESTRING(1.0031759 2.0002316,1.0040361 2.0002211,1.0042735 2.0002264)
-w-NS |  LINESTRING(1.0040414 2.0001051,1.0040361 2.0002211,1.0040364 2.0006377)
-w-building |  MULTIPOLYGON(((1.0039037 2.0002347,1.0039599 2.0002345,1.0040016 2.0002344,1.0040019 2.000324,1.0040023 2.0004386,1.0039043 2.0004389,1.0039037 2.0002347)))
diff --git a/test/scenes/data/building-with-parallel-streets.wkt b/test/scenes/data/building-with-parallel-streets.wkt
deleted file mode 100644 (file)
index c84978e..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-n-south-w |  POINT(1.0031633 2.001023)
-n-south-e |  POINT(1.0043359 2.0010068)
-n-north-w |  POINT(1.0031511 2.0012655)
-n-north-e |  POINT(1.0043238 2.0012493)
-w-south |  LINESTRING(1.0031633 2.001023,1.0036943 2.0010149,1.0040717 2.0010203,1.0043359 2.0010068)
-w-north |  LINESTRING(1.0031511 2.0012655,1.0036822 2.0012574,1.0040596 2.0012628,1.0043238 2.0012493)
-w-building |  LINESTRING(1.0036157 2.0011891,1.0036166 2.0010787,1.0038457 2.0010805,1.0038448 2.001191,1.0036157 2.0011891)
diff --git a/test/scenes/data/country.sql b/test/scenes/data/country.sql
deleted file mode 100644 (file)
index b3b451f..0000000
+++ /dev/null
@@ -1 +0,0 @@
-select country_code, st_astext(st_pointonsurface(st_collect(geometry))) from country_osm_grid group by country_code order by country_code
diff --git a/test/scenes/data/country.wkt b/test/scenes/data/country.wkt
deleted file mode 100644 (file)
index dd14d79..0000000
+++ /dev/null
@@ -1,250 +0,0 @@
- ad           | POINT(1.58972361752509 42.54241545)
- ae           | POINT(54.6158905029297 24.8243131637573)
- af           | POINT(65.9026412963867 34.8470859527588)
- ag           | POINT(-61.7243069800293 17.069)
- ai           | POINT(-63.1057155298182 18.2546197)
- al           | POINT(19.8494176864624 40.2123275624912)
- am           | POINT(44.6422958374023 40.3782157897949)
- ao           | POINT(16.2192406654358 -12.7701482772827)
- aq           | POINT(44.999999975 -75.6569557189941)
- ar           | POINT(-61.1075973510742 -34.3761558532715)
- as           | POINT(-170.684700024275 -14.2930755)
- at           | POINT(14.2574706077576 47.3654232025146)
- au           | POINT(138.231559753418 -23.7206888198853)
- aw           | POINT(-69.98255055 12.555)
- ax           | POINT(19.9183956313477 59.81682435)
- az           | POINT(48.385555267334 40.6163997650146)
- ba           | POINT(17.1851491928101 44.2558269500732)
- bb           | POINT(-59.53342165 13.19)
- bd           | POINT(89.759895324707 24.3420524597168)
- be           | POINT(4.90078139305115 50.3468225048828)
- bf           | POINT(-0.567435041069984 11.9047117233276)
- bg           | POINT(24.8061628341675 43.0985908508301)
- bh           | POINT(50.5203291219829 25.94685735)
- bi           | POINT(29.5456137866089 -2.99057915)
- bj           | POINT(2.70062518119812 10.0279288291931)
- bl           | POINT(-62.7934947763772 17.907)
- bm           | POINT(-64.7740692745195 32.30199165)
- bn           | POINT(114.521968608887 4.2863885)
- bo           | POINT(-62.0247344970703 -17.7772369384766)
- bq           | POINT(-63.1432235610045 17.566)
- br           | POINT(-45.7706508636475 -9.5868501663208)
- bs           | POINT(-77.6091675884277 23.8745)
- bt           | POINT(90.0135078430176 27.281379699707)
- bv           | POINT(3.35744155625 -54.4215)
- bw           | POINT(23.5150556564331 -23.4839134216309)
- by           | POINT(26.7725925445557 53.1588516235352)
- bz           | POINT(-88.6348991394043 16.3395160487277)
- ca           | POINT(-107.74817276001 67.1261215209961)
- cc           | POINT(96.8442066294247 -12.0173443)
- cd           | POINT(24.0954418182373 -1.67713665962219)
- cf           | POINT(22.5870132446289 5.98438787460327)
- cg           | POINT(15.7887516021729 0.403886616230011)
- ch           | POINT(7.65705513954163 46.5744686126709)
- ci           | POINT(-6.31190967559814 6.6278383731842)
- ck           | POINT(-159.778351359569 -21.23349585)
- cl           | POINT(-70.4179039001465 -53.7718944549561)
- cm           | POINT(13.260226726532 5.94519567489624)
- cn           | POINT(96.4428558349609 38.0426063537598)
- co           | POINT(-72.5295104980469 2.45174860954285)
- cr           | POINT(-83.8331413269043 9.935142993927)
- cu           | POINT(-80.8167381286621 21.8885278701782)
- cv           | POINT(-24.508106575 14.929)
- cw           | POINT(-68.9640918594077 12.1845)
- cx           | POINT(105.624119513558 -10.48417)
- cy           | POINT(32.959223486499 35.37010195)
- cz           | POINT(16.3209805488586 49.5069274902344)
- de           | POINT(9.30716800689697 50.2128944396973)
- dj           | POINT(42.969040422876 11.41542855)
- dk           | POINT(9.18490123748779 55.9891662597656)
- dm           | POINT(-61.0035801928854 15.6547055)
- do           | POINT(-69.6285591125488 18.5884169089722)
- dz           | POINT(4.24749487638474 25.797215461731)
- ec           | POINT(-77.4583168029785 -0.982844322919846)
- ee           | POINT(23.9428863525391 58.439525604248)
- eg           | POINT(28.952935218811 28.1771860122681)
- eh           | POINT(-13.6903142929077 25.0124177932739)
- er           | POINT(39.0122375488281 14.960337638855)
- es           | POINT(-2.59110307693481 38.7935485839844)
- et           | POINT(38.6169757843018 7.71399855613708)
- fi           | POINT(26.8979873657227 63.5619449615479)
- fj           | POINT(177.918533325195 -17.7423753738403)
- fk           | POINT(-58.9904479980469 -51.3450936007813)
- fm           | POINT(151.9535889125 8.5045)
- fo           | POINT(-6.60483694084778 62.10000995)
- fr           | POINT(0.284105718135834 47.5104522705078)
- ga           | POINT(10.8107047080994 -0.0742915570735931)
- gb           | POINT(-0.928231082856655 52.0161876678467)
- gd           | POINT(-61.6452430375 12.191)
- ge           | POINT(44.1666488647461 42.0038585662842)
- gf           | POINT(-53.4652481079102 3.56188893318176)
- gg           | POINT(-2.50580395030125 49.5854381)
- gh           | POINT(-0.463488027453423 7.16051578521729)
- gi           | POINT(-5.32053155848457 36.1106663)
- gl           | POINT(-33.8551120758057 74.6635551452637)
- gm           | POINT(-16.4096023535368 13.25)
- gn           | POINT(-13.839409828186 10.9629158973694)
- gp           | POINT(-61.6871265247053 16.23049055)
- gq           | POINT(10.2397356033325 1.43119311332703)
- gr           | POINT(23.1785039901733 39.0620670318604)
- gs           | POINT(-36.4943086948773 -54.4306784)
- gt           | POINT(-90.7436828613281 15.2042865753174)
- gu           | POINT(144.733626445767 13.444138)
- gw           | POINT(-14.8352527618408 11.9248690605164)
- gy           | POINT(-58.4516773223877 5.73698806762695)
- hk           | POINT(114.18577775 22.3492361)
- hm           | POINT(73.6823082266602 -53.22105985)
- hn           | POINT(-86.9541435241699 15.2382001876831)
- hr           | POINT(17.499662399292 45.5268955230713)
- ht           | POINT(-73.5192565917969 18.3249206691162)
- hu           | POINT(20.3536291122437 47.5172100067139)
- id           | POINT(123.345050811768 -0.837919592857361)
- ie           | POINT(-9.00520038604736 52.8772506713867)
- il           | POINT(35.4631499949707 32.86165655)
- im           | POINT(-4.86740773691101 54.023)
- in           | POINT(88.6762087020508 27.86155515)
- io           | POINT(71.4274391359073 -6.14349685)
- iq           | POINT(42.5810985565186 34.2610359191895)
- ir           | POINT(56.0935573577881 30.4675178527832)
- is           | POINT(-17.5178508758545 64.7168769836426)
- it           | POINT(10.4263944625854 44.8790493011475)
- je           | POINT(-2.19261599848299 49.1245833)
- jm           | POINT(-76.8402003547852 18.3935)
- jo           | POINT(36.5555210113525 30.7574186325073)
- jp           | POINT(138.725311279297 35.9209995269775)
- ke           | POINT(36.9060287475586 1.08512867614627)
- kg           | POINT(76.1557197570801 41.6649742126465)
- kh           | POINT(104.319019317627 12.9555516242981)
- ki           | POINT(173.633537933333 0.139)
- km           | POINT(44.3147485207764 -12.241)
- kn           | POINT(-62.6937987175 17.2555)
- kp           | POINT(126.655757904053 39.6457576751709)
- kr           | POINT(127.277404785156 36.4138870239258)
- kw           | POINT(47.3068407840576 29.6918055)
- ky           | POINT(-81.0745526670982 19.2994923579778)
- kz           | POINT(72.008113861084 49.8885555267334)
- la           | POINT(102.443916320801 19.8160953521729)
- lb           | POINT(35.4846443715483 33.4176673878926)
- lc           | POINT(-60.978944125 13.891)
- li           | POINT(9.54693948514429 47.15934115)
- lk           | POINT(80.3852043151855 8.41649961471558)
- lr           | POINT(-11.169605255127 4.04122126102448)
- ls           | POINT(28.6698419546997 -29.9453849)
- lt           | POINT(24.5173501968384 55.4929389953613)
- lu           | POINT(6.08649672997471 49.81533445)
- lv           | POINT(23.5103368759155 56.6714401245117)
- ly           | POINT(15.3684158325195 28.1217727661133)
- ma           | POINT(-4.0306156873703 33.2169628143311)
- mc           | POINT(7.47743150426578 43.62917385)
- md           | POINT(29.6172503477783 46.6651745)
- me           | POINT(19.7229134314941 43.02441345)
- mf           | POINT(-63.0666651534257 18.0810209)
- mg           | POINT(45.8637886047363 -20.5024528503418)
- mh           | POINT(171.949820566667 5.983)
- mk           | POINT(21.421085357666 41.0898007597656)
- ml           | POINT(-1.93310506641865 16.4699301719666)
- mm           | POINT(95.5462455749512 21.0962018966675)
- mn           | POINT(99.8113822937012 48.1861572265625)
- mo           | POINT(113.564416766761 22.16209625)
- mp           | POINT(145.213452483189 14.1490205)
- mq           | POINT(-60.8112834227783 14.43706925)
- mr           | POINT(-9.42324566841125 22.5925149917603)
- ms           | POINT(-62.1945521583333 16.745)
- mt           | POINT(14.3836306158583 35.9446731)
- mu           | POINT(57.551211475 -20.41)
- mv           | POINT(73.3929214477539 4.19375014305115)
- mw           | POINT(33.9572296142578 -12.2821822166443)
- mx           | POINT(-105.892219543457 25.8682699203491)
- my           | POINT(112.711540222168 2.10098683834076)
- mz           | POINT(37.5868968963623 -13.7268223762512)
- na           | POINT(16.6856970787048 -21.4657220840454)
- nc           | POINT(164.953224182129 -20.3888988494873)
- ne           | POINT(10.060417175293 19.0827360153198)
- nf           | POINT(167.95718166875 -29.0645)
- ng           | POINT(10.1778125762939 10.1780409812927)
- ni           | POINT(-85.8797492980957 13.2171587944031)
- nl           | POINT(-68.5706209441406 12.041)
- no           | POINT(23.1155624389648 70.0993499755859)
- np           | POINT(83.3625984191895 28.1310758590698)
- nr           | POINT(166.934792270833 -0.5275)
- nu           | POINT(-169.848737911905 -19.05305275)
- nz           | POINT(167.972099304199 -45.1305675506592)
- om           | POINT(56.8605518341064 20.4741315841675)
- pa           | POINT(-79.4016036987305 8.80656003952026)
- pe           | POINT(-78.6654052734375 -7.54711985588074)
- pf           | POINT(-145.057191213086 -16.7086236)
- pg           | POINT(146.646003723145 -7.37427568435669)
- ph           | POINT(121.483592987061 15.0996527671814)
- pk           | POINT(72.1134796142578 31.1462965011597)
- pl           | POINT(17.8813629150391 52.771821975708)
- pm           | POINT(-56.1951589074841 46.7832469)
- pn           | POINT(-130.106425528029 -25.0695595)
- pr           | POINT(-65.8875553967285 18.3716905)
- ps           | POINT(35.3980153741943 32.24773475)
- pt           | POINT(-8.45743942260742 40.1115436553955)
- pw           | POINT(134.496454875 7.3245)
- py           | POINT(-59.5178718566895 -22.4128150939941)
- qa           | POINT(51.4990362304443 24.9981677)
- re           | POINT(55.7734550547607 -21.3638828)
- ro           | POINT(26.3763284683228 45.3612003326416)
- rs           | POINT(20.4037199020386 44.5641384124756)
- ru           | POINT(116.440608978271 59.0678024291992)
- rw           | POINT(29.5788261333252 -1.6240443)
- sa           | POINT(47.7316932678223 22.4379062652588)
- sb           | POINT(164.638946533203 -10.2360653877258)
- sc           | POINT(46.3656697 -9.454)
- sd           | POINT(28.1472072601318 14.5642309188843)
- se           | POINT(15.6866798400879 60.3556804656982)
- sg           | POINT(103.84187219299 1.304)
- sh           | POINT(-12.2815573611979 -37.11546755)
- si           | POINT(14.0473856628607 46.390855)
- sj           | POINT(15.2755260467529 79.2336540222168)
- sk           | POINT(20.416033744812 48.869701385498)
- sl           | POINT(-11.4777312278748 8.78156280517578)
- sm           | POINT(12.4606268797657 43.9427969)
- sn           | POINT(-15.3711128234863 14.9947791099548)
- so           | POINT(46.9338359832764 9.34094429016113)
- sr           | POINT(-55.4286479949951 4.5698549747467)
- ss           | POINT(28.1357345581055 8.50933408737183)
- st           | POINT(6.61025854583333 0.2215)
- sv           | POINT(-89.3666543301004 13.4307287)
- sx           | POINT(-63.1539330807882 17.9345)
- sy           | POINT(38.1551322937012 35.3422107696533)
- sz           | POINT(31.782634398523 -26.14244365)
- tc           | POINT(-71.325541342334 21.35)
- td           | POINT(17.4209251403809 13.4622311592102)
- tf           | POINT(137.5 -67.5)
- tg           | POINT(1.0698350071907 7.87677597999573)
- th           | POINT(102.008777618408 16.4231028556824)
- tj           | POINT(71.9134941101074 39.0152739312988)
- tk           | POINT(-171.826039878679 -9.209903)
- tl           | POINT(126.225208282471 -8.72636747360229)
- tm           | POINT(57.7160358428955 39.9253444671631)
- tn           | POINT(9.04958724975586 34.8419933319092)
- to           | POINT(-176.993202209473 -23.1110429763794)
- tr           | POINT(32.8200283050537 39.8635063171387)
- tt           | POINT(-60.70793924375 11.1385)
- tv           | POINT(178.774993896484 -9.41685771942139)
- tw           | POINT(120.300746917725 23.1700229644775)
- tz           | POINT(33.5389289855957 -5.01840615272522)
- ua           | POINT(33.4433536529541 49.3061904907227)
- ug           | POINT(32.9652328491211 2.08584922552109)
- um           | POINT(-169.509930872296 16.74605815)
- us           | POINT(-116.395355224609 40.7137908935547)
- uy           | POINT(-56.4650554656982 -33.6265888214111)
- uz           | POINT(61.3552989959717 42.9610729217529)
- va           | POINT(12.3319785703086 42.0493197)
- vc           | POINT(-61.0990541737305 13.316)
- ve           | POINT(-64.8832321166992 7.69849991798401)
- vg           | POINT(-64.6247911940199 18.419)
- vi           | POINT(-64.8895090795187 18.3226325)
- vn           | POINT(104.201791331787 10.27644235)
- vu           | POINT(167.319198608398 -15.8868751525879)
- wf           | POINT(-176.207816222208 -13.28535775)
- ws           | POINT(-172.109667323427 -13.850938)
- ye           | POINT(45.945629119873 16.1633830070496)
- yt           | POINT(44.9377459760742 -12.6088246)
- za           | POINT(23.1948881149292 -30.4327602386475)
- zm           | POINT(26.3861808776855 -14.3996663093567)
- zw           | POINT(30.1241998672485 -19.8690795898438)
-
diff --git a/test/scenes/data/parallel-road.wkt b/test/scenes/data/parallel-road.wkt
deleted file mode 100644 (file)
index 355af30..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-n-middle-w |  POINT(1.0065316 2.0003381)
-n-middle-e |  POINT(1.007236 2.0003408)
-w-south |  LINESTRING(1.0065324 2.0001892,1.006676 2.0002786,1.0068195 2.0002786,1.0069171 2.0002515,1.0070417 2.0001892,1.0072422 2.000173)
-w-middle |  LINESTRING(1.0065316 2.0003381,1.006686 2.0004248,1.0069 2.0004167,1.007236 2.0003408)
-w-north |  LINESTRING(1.0065397 2.000418,1.0066833 2.0005074,1.0068269 2.0005074,1.0069244 2.0004803,1.007049 2.000418,1.0072495 2.0004018)
diff --git a/test/scenes/data/points-on-roads.wkt b/test/scenes/data/points-on-roads.wkt
deleted file mode 100644 (file)
index 17990dc..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-n-N-unglued |  POINT(1.004922 2.0005155)
-n-S-unglued |  POINT(1.0046259 2.0002949)
-n-NE |  POINT(1.0050661 2.0006118)
-n-SE |  POINT(1.0051339 2.0003349)
-n-NW |  POINT(1.0047583 2.0004087)
-n-SW |  POINT(1.0047275 2.0003564)
-w-north |  LINESTRING(1.0044996 2.0004302,1.0046259 2.0003841,1.0047583 2.0004087,1.004922 2.0005155,1.0050661 2.0006118,1.0053155 2.0006241)
-w-south |  LINESTRING(1.0045243 2.0002241,1.0046259 2.0002949,1.0047275 2.0003564,1.004826 2.0002918,1.0049368 2.0002641,1.0051339 2.0003349,1.0053278 2.0003687)
diff --git a/test/scenes/data/poly-area.wkt b/test/scenes/data/poly-area.wkt
deleted file mode 100644 (file)
index e65f205..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-0.0001 |  MULTIPOLYGON(((0 0,0.001 0,0.001 0.1,0 0.1,0 0)))
-0.0005 |  MULTIPOLYGON(((0 0,0.005 0,0.005 0.1,0 0.1,0 0)))
-0.001 |  MULTIPOLYGON(((0 0,0.01 0,0.01 0.1,0 0.1,0 0)))
-0.005 |  MULTIPOLYGON(((0 0,0.05 0,0.05 0.1,0 0.1,0 0)))
-0.01 |  MULTIPOLYGON(((0 0,0.1 0,0.1 0.1,0 0.1,0 0)))
-0.05 |  MULTIPOLYGON(((0 0,0.5 0,0.5 0.1,0 0.1,0 0)))
-0.1 |  MULTIPOLYGON(((0 0,0.1 0,0.1 1,0 1,0 0)))
-0.5 |  MULTIPOLYGON(((0 0,0.5 0,0.5 1,0 1,0 0)))
-1.0 |  MULTIPOLYGON(((0 0,1 0,1 1,0 1,0 0)))
-2.0 |  MULTIPOLYGON(((0 0,2 0,2 1,0 1,0 0)))
-5.0 |  MULTIPOLYGON(((0 0,5 0,5 1,0 1,0 0)))
diff --git a/test/scenes/data/poly-areas.osm b/test/scenes/data/poly-areas.osm
deleted file mode 100644 (file)
index c6f6277..0000000
+++ /dev/null
@@ -1,221 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<osm version='0.6' upload='true' generator='JOSM'>
-  <node id='-238' action='modify' visible='true' lat='-0.00661880152' lon='0.00356249245'>
-    <tag k='test:id' v='inner-C' />
-    <tag k='test:section' v='way-area-with-center' />
-  </node>
-  <node id='-231' action='modify' visible='true' lat='-0.00600066098' lon='0.0041244384'>
-    <tag k='test:id' v='outer-C' />
-    <tag k='test:section' v='way-area-with-center' />
-  </node>
-  <node id='-225' action='modify' visible='true' lat='-0.00236518426' lon='0.00188464186'>
-    <tag k='test:id' v='inner-N' />
-    <tag k='test:section' v='way-area-with-center' />
-  </node>
-  <node id='-166' action='modify' visible='true' lat='-0.00951758843' lon='0.00485156509'>
-    <tag k='test:id' v='inner-S' />
-    <tag k='test:section' v='way-area-with-center' />
-  </node>
-  <node id='-137' action='modify' visible='true' lat='-0.00215326117' lon='0.00501050741' />
-  <node id='-135' action='modify' visible='true' lat='-0.00257710735' lon='0.00644098825' />
-  <node id='-133' action='modify' visible='true' lat='-0.00400758819' lon='0.00750060369' />
-  <node id='-131' action='modify' visible='true' lat='-0.00591489597' lon='0.00336810348' />
-  <node id='-129' action='modify' visible='true' lat='-0.00766326144' lon='0.00516944972' />
-  <node id='-127' action='modify' visible='true' lat='-0.00649768446' lon='0.00612310362' />
-  <node id='-125' action='modify' visible='true' lat='-0.00496124208' lon='0.00686483443' />
-  <node id='-123' action='modify' visible='true' lat='-0.00665662678' lon='0.00771252678' />
-  <node id='-121' action='modify' visible='true' lat='-0.0099414346' lon='0.0065469498' />
-  <node id='-119' action='modify' visible='true' lat='-0.01094806925' lon='0.0038979112' />
-  <node id='-117' action='modify' visible='true' lat='-0.01057720386' lon='0.00267935344' />
-  <node id='-115' action='modify' visible='true' lat='-0.00999441537' lon='0.00220252649' />
-  <node id='-113' action='modify' visible='true' lat='-0.00919970381' lon='0.00262637267' />
-  <node id='-111' action='modify' visible='true' lat='-0.00803412684' lon='0.00262637267' />
-  <node id='-109' action='modify' visible='true' lat='-0.00655066523' lon='0.00193762263' />
-  <node id='-107' action='modify' visible='true' lat='-0.00729239604' lon='0.00103694951' />
-  <node id='-105' action='modify' visible='true' lat='-0.00607383829' lon='0.00050714179' />
-  <node id='-103' action='modify' visible='true' lat='-0.00564999211' lon='0.00177868032' />
-  <node id='-101' action='modify' visible='true' lat='-0.00421951128' lon='0.00050714179' />
-  <node id='-99' action='modify' visible='true' lat='-0.00257710735' lon='0.00056012256' />
-  <node id='-98' action='modify' visible='true' lat='-0.00151749191' lon='0.00130185337' />
-  <node id='100' timestamp='2014-01-01T00:00:00Z' uid='1' user='test' visible='true' version='1' changeset='1' lat='0.0' lon='0.0' />
-  <node id='101' timestamp='2014-01-01T00:00:00Z' uid='1' user='test' visible='true' version='1' changeset='1' lat='0.1' lon='0.0' />
-  <node id='102' timestamp='2014-01-01T00:00:00Z' uid='1' user='test' visible='true' version='1' changeset='1' lat='0.1' lon='0.001' />
-  <node id='103' timestamp='2014-01-01T00:00:00Z' uid='1' user='test' visible='true' version='1' changeset='1' lat='0.0' lon='0.001' />
-  <node id='200' timestamp='2014-01-01T00:00:00Z' uid='1' user='test' visible='true' version='1' changeset='1' lat='0.0' lon='0.0' />
-  <node id='201' timestamp='2014-01-01T00:00:00Z' uid='1' user='test' visible='true' version='1' changeset='1' lat='0.1' lon='0.0' />
-  <node id='202' timestamp='2014-01-01T00:00:00Z' uid='1' user='test' visible='true' version='1' changeset='1' lat='0.1' lon='0.005' />
-  <node id='203' timestamp='2014-01-01T00:00:00Z' uid='1' user='test' visible='true' version='1' changeset='1' lat='0.0' lon='0.005' />
-  <node id='300' timestamp='2014-01-01T00:00:00Z' uid='1' user='test' visible='true' version='1' changeset='1' lat='0.0' lon='0.0' />
-  <node id='301' timestamp='2014-01-01T00:00:00Z' uid='1' user='test' visible='true' version='1' changeset='1' lat='0.1' lon='0.0' />
-  <node id='302' timestamp='2014-01-01T00:00:00Z' uid='1' user='test' visible='true' version='1' changeset='1' lat='0.1' lon='0.01' />
-  <node id='303' timestamp='2014-01-01T00:00:00Z' uid='1' user='test' visible='true' version='1' changeset='1' lat='0.0' lon='0.01' />
-  <node id='400' timestamp='2014-01-01T00:00:00Z' uid='1' user='test' visible='true' version='1' changeset='1' lat='0.0' lon='0.0' />
-  <node id='401' timestamp='2014-01-01T00:00:00Z' uid='1' user='test' visible='true' version='1' changeset='1' lat='0.1' lon='0.0' />
-  <node id='402' timestamp='2014-01-01T00:00:00Z' uid='1' user='test' visible='true' version='1' changeset='1' lat='0.1' lon='0.05' />
-  <node id='403' timestamp='2014-01-01T00:00:00Z' uid='1' user='test' visible='true' version='1' changeset='1' lat='0.0' lon='0.05' />
-  <node id='500' timestamp='2014-01-01T00:00:00Z' uid='1' user='test' visible='true' version='1' changeset='1' lat='0.0' lon='0.0' />
-  <node id='501' timestamp='2014-01-01T00:00:00Z' uid='1' user='test' visible='true' version='1' changeset='1' lat='0.1' lon='0.0' />
-  <node id='502' timestamp='2014-01-01T00:00:00Z' uid='1' user='test' visible='true' version='1' changeset='1' lat='0.1' lon='0.1' />
-  <node id='503' timestamp='2014-01-01T00:00:00Z' uid='1' user='test' visible='true' version='1' changeset='1' lat='0.0' lon='0.1' />
-  <node id='600' timestamp='2014-01-01T00:00:00Z' uid='1' user='test' visible='true' version='1' changeset='1' lat='0.0' lon='0.0' />
-  <node id='601' timestamp='2014-01-01T00:00:00Z' uid='1' user='test' visible='true' version='1' changeset='1' lat='0.1' lon='0.0' />
-  <node id='602' timestamp='2014-01-01T00:00:00Z' uid='1' user='test' visible='true' version='1' changeset='1' lat='0.1' lon='0.5' />
-  <node id='603' timestamp='2014-01-01T00:00:00Z' uid='1' user='test' visible='true' version='1' changeset='1' lat='0.0' lon='0.5' />
-  <node id='700' timestamp='2014-01-01T00:00:00Z' uid='1' user='test' visible='true' version='1' changeset='1' lat='0.0' lon='0.0' />
-  <node id='701' timestamp='2014-01-01T00:00:00Z' uid='1' user='test' visible='true' version='1' changeset='1' lat='1.0' lon='0.0' />
-  <node id='702' timestamp='2014-01-01T00:00:00Z' uid='1' user='test' visible='true' version='1' changeset='1' lat='1.0' lon='0.1' />
-  <node id='703' timestamp='2014-01-01T00:00:00Z' uid='1' user='test' visible='true' version='1' changeset='1' lat='0.0' lon='0.1' />
-  <node id='800' timestamp='2014-01-01T00:00:00Z' uid='1' user='test' visible='true' version='1' changeset='1' lat='0.0' lon='0.0' />
-  <node id='801' timestamp='2014-01-01T00:00:00Z' uid='1' user='test' visible='true' version='1' changeset='1' lat='1.0' lon='0.0' />
-  <node id='802' timestamp='2014-01-01T00:00:00Z' uid='1' user='test' visible='true' version='1' changeset='1' lat='1.0' lon='0.5' />
-  <node id='803' timestamp='2014-01-01T00:00:00Z' uid='1' user='test' visible='true' version='1' changeset='1' lat='0.0' lon='0.5' />
-  <node id='900' timestamp='2014-01-01T00:00:00Z' uid='1' user='test' visible='true' version='1' changeset='1' lat='0.0' lon='0.0' />
-  <node id='901' timestamp='2014-01-01T00:00:00Z' uid='1' user='test' visible='true' version='1' changeset='1' lat='1.0' lon='0.0' />
-  <node id='902' timestamp='2014-01-01T00:00:00Z' uid='1' user='test' visible='true' version='1' changeset='1' lat='1.0' lon='1.0' />
-  <node id='903' timestamp='2014-01-01T00:00:00Z' uid='1' user='test' visible='true' version='1' changeset='1' lat='0.0' lon='1.0' />
-  <node id='1000' timestamp='2014-01-01T00:00:00Z' uid='1' user='test' visible='true' version='1' changeset='1' lat='0.0' lon='0.0' />
-  <node id='1001' timestamp='2014-01-01T00:00:00Z' uid='1' user='test' visible='true' version='1' changeset='1' lat='1.0' lon='0.0' />
-  <node id='1002' timestamp='2014-01-01T00:00:00Z' uid='1' user='test' visible='true' version='1' changeset='1' lat='1.0' lon='2.0' />
-  <node id='1003' timestamp='2014-01-01T00:00:00Z' uid='1' user='test' visible='true' version='1' changeset='1' lat='0.0' lon='2.0' />
-  <node id='1100' timestamp='2014-01-01T00:00:00Z' uid='1' user='test' visible='true' version='1' changeset='1' lat='0.0' lon='0.0' />
-  <node id='1101' timestamp='2014-01-01T00:00:00Z' uid='1' user='test' visible='true' version='1' changeset='1' lat='1.0' lon='0.0' />
-  <node id='1102' timestamp='2014-01-01T00:00:00Z' uid='1' user='test' visible='true' version='1' changeset='1' lat='1.0' lon='5.0' />
-  <node id='1103' timestamp='2014-01-01T00:00:00Z' uid='1' user='test' visible='true' version='1' changeset='1' lat='0.0' lon='5.0' />
-  <way id='-100' action='modify' visible='true'>
-    <nd ref='-98' />
-    <nd ref='-99' />
-    <nd ref='-101' />
-    <nd ref='-103' />
-    <nd ref='-105' />
-    <nd ref='-107' />
-    <nd ref='-109' />
-    <nd ref='-111' />
-    <nd ref='-113' />
-    <nd ref='-115' />
-    <nd ref='-117' />
-    <nd ref='-119' />
-    <nd ref='-121' />
-    <nd ref='-123' />
-    <nd ref='-125' />
-    <nd ref='-127' />
-    <nd ref='-129' />
-    <nd ref='-131' />
-    <nd ref='-133' />
-    <nd ref='-135' />
-    <nd ref='-137' />
-    <nd ref='-98' />
-    <tag k='area' v='yes' />
-    <tag k='test:id' v='area' />
-    <tag k='test:section' v='way-area-with-center' />
-  </way>
-  <way id='100' timestamp='2014-01-01T00:00:00Z' uid='1' user='test' visible='true' version='1' changeset='1'>
-    <nd ref='100' />
-    <nd ref='101' />
-    <nd ref='102' />
-    <nd ref='103' />
-    <nd ref='100' />
-    <tag k='area' v='yes' />
-    <tag k='test:id' v='0.0001' />
-    <tag k='test:section' v='poly-area' />
-  </way>
-  <way id='200' timestamp='2014-01-01T00:00:00Z' uid='1' user='test' visible='true' version='1' changeset='1'>
-    <nd ref='200' />
-    <nd ref='201' />
-    <nd ref='202' />
-    <nd ref='203' />
-    <nd ref='200' />
-    <tag k='area' v='yes' />
-    <tag k='test:id' v='0.0005' />
-    <tag k='test:section' v='poly-area' />
-  </way>
-  <way id='300' timestamp='2014-01-01T00:00:00Z' uid='1' user='test' visible='true' version='1' changeset='1'>
-    <nd ref='300' />
-    <nd ref='301' />
-    <nd ref='302' />
-    <nd ref='303' />
-    <nd ref='300' />
-    <tag k='area' v='yes' />
-    <tag k='test:id' v='0.001' />
-    <tag k='test:section' v='poly-area' />
-  </way>
-  <way id='400' timestamp='2014-01-01T00:00:00Z' uid='1' user='test' visible='true' version='1' changeset='1'>
-    <nd ref='400' />
-    <nd ref='401' />
-    <nd ref='402' />
-    <nd ref='403' />
-    <nd ref='400' />
-    <tag k='area' v='yes' />
-    <tag k='test:id' v='0.005' />
-    <tag k='test:section' v='poly-area' />
-  </way>
-  <way id='500' timestamp='2014-01-01T00:00:00Z' uid='1' user='test' visible='true' version='1' changeset='1'>
-    <nd ref='500' />
-    <nd ref='501' />
-    <nd ref='502' />
-    <nd ref='503' />
-    <nd ref='500' />
-    <tag k='area' v='yes' />
-    <tag k='test:id' v='0.01' />
-    <tag k='test:section' v='poly-area' />
-  </way>
-  <way id='600' timestamp='2014-01-01T00:00:00Z' uid='1' user='test' visible='true' version='1' changeset='1'>
-    <nd ref='600' />
-    <nd ref='601' />
-    <nd ref='602' />
-    <nd ref='603' />
-    <nd ref='600' />
-    <tag k='area' v='yes' />
-    <tag k='test:id' v='0.05' />
-    <tag k='test:section' v='poly-area' />
-  </way>
-  <way id='700' timestamp='2014-01-01T00:00:00Z' uid='1' user='test' visible='true' version='1' changeset='1'>
-    <nd ref='700' />
-    <nd ref='701' />
-    <nd ref='702' />
-    <nd ref='703' />
-    <nd ref='700' />
-    <tag k='area' v='yes' />
-    <tag k='test:id' v='0.1' />
-    <tag k='test:section' v='poly-area' />
-  </way>
-  <way id='800' timestamp='2014-01-01T00:00:00Z' uid='1' user='test' visible='true' version='1' changeset='1'>
-    <nd ref='800' />
-    <nd ref='801' />
-    <nd ref='802' />
-    <nd ref='803' />
-    <nd ref='800' />
-    <tag k='area' v='yes' />
-    <tag k='test:id' v='0.5' />
-    <tag k='test:section' v='poly-area' />
-  </way>
-  <way id='900' timestamp='2014-01-01T00:00:00Z' uid='1' user='test' visible='true' version='1' changeset='1'>
-    <nd ref='900' />
-    <nd ref='901' />
-    <nd ref='902' />
-    <nd ref='903' />
-    <nd ref='900' />
-    <tag k='area' v='yes' />
-    <tag k='test:id' v='1.0' />
-    <tag k='test:section' v='poly-area' />
-  </way>
-  <way id='1000' timestamp='2014-01-01T00:00:00Z' uid='1' user='test' visible='true' version='1' changeset='1'>
-    <nd ref='1000' />
-    <nd ref='1001' />
-    <nd ref='1002' />
-    <nd ref='1003' />
-    <nd ref='1000' />
-    <tag k='area' v='yes' />
-    <tag k='test:id' v='2.0' />
-    <tag k='test:section' v='poly-area' />
-  </way>
-  <way id='1100' timestamp='2014-01-01T00:00:00Z' uid='1' user='test' visible='true' version='1' changeset='1'>
-    <nd ref='1100' />
-    <nd ref='1101' />
-    <nd ref='1102' />
-    <nd ref='1103' />
-    <nd ref='1100' />
-    <tag k='area' v='yes' />
-    <tag k='test:id' v='5.0' />
-    <tag k='test:section' v='poly-area' />
-  </way>
-</osm>
diff --git a/test/scenes/data/road-with-alley.wkt b/test/scenes/data/road-with-alley.wkt
deleted file mode 100644 (file)
index 100b373..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-n-main-east |  POINT(1.0024481 2.0003542)
-n-main-west |  POINT(1.001552 2.0002662)
-n-alley |  POINT(1.0019235 2.0005463)
-n-corner |  POINT(1.0019235 2.0003542)
-w-alley |  LINESTRING(1.0019594 2.0003086,1.0019594 2.0005756)
-w-main |  LINESTRING(1.0013435 2.0003118,1.0016759 2.0003053,1.0019594 2.0003086,1.0021255 2.0003151,1.0023699 2.0003118,1.0026078 2.0002988)
diff --git a/test/scenes/data/roads-with-pois.wkt b/test/scenes/data/roads-with-pois.wkt
deleted file mode 100644 (file)
index d4addbb..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-p-N2 |  POINT(1.0003904 2.0003399)
-p-S1 |  POINT(1.0008104 2.0002927)
-p-N1 |  POINT(1.0005321 2.0005288)
-p-S2 |  POINT(1.0006398 2.0001064)
-w-north |  LINESTRING(1.0001174 2.0004055,1.0004298 2.0003976,1.0006608 2.0004579,1.0010624 2.0005419)
-w-south |  LINESTRING(1.0001384 2.0001903,1.0007212 2.0001982,1.0010677 2.0002192)
diff --git a/test/scenes/data/roads.osm b/test/scenes/data/roads.osm
deleted file mode 100644 (file)
index b7614f7..0000000
+++ /dev/null
@@ -1,405 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<osm version='0.6' upload='false' generator='JOSM'>
-  <node id='-11' action='modify' visible='true' lat='2.0006515863' lon='1.0057464449'>
-    <tag k='name' v='split-road' />
-  </node>
-  <node id='-13' action='modify' visible='true' lat='2.00053508276' lon='1.00574909433' />
-  <node id='-15' action='modify' visible='true' lat='2.00054302619' lon='1.00589746199' />
-  <node id='-17' action='modify' visible='true' lat='2.00054302619' lon='1.0060511285' />
-  <node id='-19' action='modify' visible='true' lat='2.00053243496' lon='1.00613061118' />
-  <node id='-21' action='modify' visible='true' lat='2.00052449153' lon='1.00551064629' />
-  <node id='-23' action='modify' visible='true' lat='2.00056685646' lon='1.00560867493' />
-  <node id='-25' action='modify' visible='true' lat='2.00056156084' lon='1.00568550818' />
-  <node id='-27' action='modify' visible='true' lat='2.00050066126' lon='1.00573584721' />
-  <node id='-29' action='modify' visible='true' lat='2.00050595688' lon='1.0059107091' />
-  <node id='-31' action='modify' visible='true' lat='2.00051125249' lon='1.00605377792' />
-  <node id='-33' action='modify' visible='true' lat='2.00049536565' lon='1.00613591002' />
-  <node id='-35' action='modify' visible='true' lat='2.0005139003' lon='1.00628427769' />
-  <node id='-37' action='modify' visible='true' lat='2.00047153538' lon='1.00637170863' />
-  <node id='-39' action='modify' visible='true' lat='2.00029678005' lon='1.00635846152' />
-  <node id='-41' action='modify' visible='true' lat='2.00026235854' lon='1.00628162826' />
-  <node id='-43' action='modify' visible='true' lat='2.00033914498' lon='1.00619949616' />
-  <node id='-45' action='modify' visible='true' lat='2.00035767963' lon='1.00610411695' />
-  <node id='-47' action='modify' visible='true' lat='2.00034973621' lon='1.00600343889' />
-  <node id='-49' action='modify' visible='true' lat='2.00032590594' lon='1.0058868643' />
-  <node id='-51' action='modify' visible='true' lat='2.0002808932' lon='1.00579413451' />
-  <node id='-53' action='modify' visible='true' lat='2.00027824539' lon='1.00563516915' />
-  <node id='-55' action='modify' visible='true' lat='2.00036032744' lon='1.00547090495' />
-  <node id='-57' action='modify' visible='true' lat='2.00072654218' lon='1.00470543134'>
-    <tag k='name' v='points-on-road' />
-  </node>
-  <node id='-59' action='modify' visible='true' lat='2.00051552538' lon='1.00492201384' />
-  <node id='-61' action='modify' visible='true' lat='2.00051552538' lon='1.00492201384'>
-    <tag k='test:id' v='n-N-unglued' />
-    <tag k='test:section' v='points-on-roads' />
-  </node>
-  <node id='-63' action='modify' visible='true' lat='2.00029485534' lon='1.00462587591'>
-    <tag k='test:id' v='n-S-unglued' />
-    <tag k='test:section' v='points-on-roads' />
-  </node>
-  <node id='-65' action='modify' visible='true' lat='2.00029485534' lon='1.00462587591' />
-  <node id='-67' action='modify' visible='true' lat='2.00061177404' lon='1.00506613814'>
-    <tag k='test:id' v='n-NE' />
-    <tag k='test:section' v='points-on-roads' />
-  </node>
-  <node id='-69' action='modify' visible='true' lat='2.00033485479' lon='1.00513387079'>
-    <tag k='test:id' v='n-SE' />
-    <tag k='test:section' v='points-on-roads' />
-  </node>
-  <node id='-71' action='modify' visible='true' lat='2.00062408156' lon='1.00531551745' />
-  <node id='-73' action='modify' visible='true' lat='2.00040869993' lon='1.00475826245'>
-    <tag k='test:id' v='n-NW' />
-    <tag k='test:section' v='points-on-roads' />
-  </node>
-  <node id='-75' action='modify' visible='true' lat='2.00038408489' lon='1.00462587591' />
-  <node id='-77' action='modify' visible='true' lat='2.00043023809' lon='1.00449964688' />
-  <node id='-79' action='modify' visible='true' lat='2.00036870048' lon='1.00532783248' />
-  <node id='-81' action='modify' visible='true' lat='2.00026408654' lon='1.00493683035' />
-  <node id='-83' action='modify' visible='true' lat='2.00029177846' lon='1.00482599511' />
-  <node id='-85' action='modify' visible='true' lat='2.00035639296' lon='1.00472747489'>
-    <tag k='test:id' v='n-SW' />
-    <tag k='test:section' v='points-on-roads' />
-  </node>
-  <node id='-87' action='modify' visible='true' lat='2.00022408708' lon='1.00452427693' />
-  <node id='-89' action='modify' visible='true' lat='2.00071561841' lon='1.00183227343'>
-    <tag k='name' v='road-with-alley' />
-  </node>
-  <node id='-91' action='modify' visible='true' lat='2.00072864414' lon='1.00046699629'>
-    <tag k='name' v='roads-with-pois' />
-  </node>
-  <node id='-93' action='modify' visible='true' lat='2.00035415446' lon='1.00244811443'>
-    <tag k='test:id' v='n-main-east' />
-    <tag k='test:section' v='road-with-alley' />
-  </node>
-  <node id='-95' action='modify' visible='true' lat='2.00026623078' lon='1.00155204948'>
-    <tag k='test:id' v='n-main-west' />
-    <tag k='test:section' v='road-with-alley' />
-  </node>
-  <node id='-97' action='modify' visible='true' lat='2.00054628396' lon='1.00192350914'>
-    <tag k='test:id' v='n-alley' />
-    <tag k='test:section' v='road-with-alley' />
-  </node>
-  <node id='-99' action='modify' visible='true' lat='2.00035415446' lon='1.00192350914'>
-    <tag k='test:id' v='n-corner' />
-    <tag k='test:section' v='road-with-alley' />
-  </node>
-  <node id='-101' action='modify' visible='true' lat='2.00057559185' lon='1.00195935173' />
-  <node id='-103' action='modify' visible='true' lat='2.00029879511' lon='1.00260777692' />
-  <node id='-105' action='modify' visible='true' lat='2.00031182084' lon='1.0023699124' />
-  <node id='-107' action='modify' visible='true' lat='2.00031507727' lon='1.00212553105' />
-  <node id='-109' action='modify' visible='true' lat='2.00030856441' lon='1.00195935173' />
-  <node id='-111' action='modify' visible='true' lat='2.00030530797' lon='1.00167586937' />
-  <node id='-113' action='modify' visible='true' lat='2.00031182084' lon='1.00134351073' />
-  <node id='-115' action='modify' visible='true' lat='2.00040546963' lon='1.00011736285'>
-    <tag k='test:section' v='roads-with-pois' />
-  </node>
-  <node id='-117' action='modify' visible='true' lat='2.00039759893' lon='1.00042975784'>
-    <tag k='test:section' v='roads-with-pois' />
-  </node>
-  <node id='-119' action='modify' visible='true' lat='2.000457941' lon='1.00066077263'>
-    <tag k='test:section' v='roads-with-pois' />
-  </node>
-  <node id='-121' action='modify' visible='true' lat='2.00054189517' lon='1.00106242333'>
-    <tag k='test:section' v='roads-with-pois' />
-  </node>
-  <node id='-123' action='modify' visible='true' lat='2.00019033703' lon='1.00013836419'>
-    <tag k='test:section' v='roads-with-pois' />
-  </node>
-  <node id='-125' action='modify' visible='true' lat='2.00019820773' lon='1.00072115149'>
-    <tag k='test:section' v='roads-with-pois' />
-  </node>
-  <node id='-127' action='modify' visible='true' lat='2.00021919628' lon='1.00106767367'>
-    <tag k='test:section' v='roads-with-pois' />
-  </node>
-  <node id='-129' action='modify' visible='true' lat='2.00033988043' lon='1.00039038032'>
-    <tag k='test:id' v='p-N2' />
-    <tag k='test:section' v='roads-with-pois' />
-  </node>
-  <node id='-131' action='modify' visible='true' lat='2.0002926562' lon='1.0008104072'>
-    <tag k='test:id' v='p-S1' />
-    <tag k='test:section' v='roads-with-pois' />
-  </node>
-  <node id='-133' action='modify' visible='true' lat='2.00052877733' lon='1.0005321394'>
-    <tag k='test:id' v='p-N1' />
-    <tag k='test:section' v='roads-with-pois' />
-  </node>
-  <node id='-135' action='modify' visible='true' lat='2.00010638283' lon='1.00063977128'>
-    <tag k='test:id' v='p-S2' />
-    <tag k='test:section' v='roads-with-pois' />
-  </node>
-  <node id='-137' action='modify' visible='true' lat='2.00072116924' lon='1.00358286582'>
-    <tag k='name' v='building-on-street-corner' />
-  </node>
-  <node id='-139' action='modify' visible='true' lat='2.00023163534' lon='1.00317592051' />
-  <node id='-141' action='modify' visible='true' lat='2.00022108767' lon='1.00403607904' />
-  <node id='-143' action='modify' visible='true' lat='2.0002263615' lon='1.00427354612' />
-  <node id='-145' action='modify' visible='true' lat='2.00010506339' lon='1.00404135609' />
-  <node id='-147' action='modify' visible='true' lat='2.00063772026' lon='1.00403639915' />
-  <node id='-149' action='modify' visible='true' lat='2.00043885695' lon='1.0039042871' />
-  <node id='-151' action='modify' visible='true' lat='2.00043855477' lon='1.00400225362' />
-  <node id='-153' action='modify' visible='true' lat='2.0002343878' lon='1.00400162309' />
-  <node id='-155' action='modify' visible='true' lat='2.00023468998' lon='1.00390365657' />
-  <node id='-157' action='modify' visible='true' lat='2.00032403886' lon='1.00400189996'>
-    <tag k='test:id' v='n-edge-NS' />
-    <tag k='test:section' v='building-on-street-corner' />
-  </node>
-  <node id='-159' action='modify' visible='true' lat='2.00035479802' lon='1.00393848586'>
-    <tag k='test:id' v='n-inner' />
-    <tag k='test:section' v='building-on-street-corner' />
-  </node>
-  <node id='-161' action='modify' visible='true' lat='2.00046760515' lon='1.00394781445'>
-    <tag k='test:id' v='n-outer' />
-    <tag k='test:section' v='building-on-street-corner' />
-  </node>
-  <node id='-163' action='modify' visible='true' lat='2.00023451637' lon='1.00395994156'>
-    <tag k='test:id' v='n-edge-WE' />
-    <tag k='test:section' v='building-on-street-corner' />
-  </node>
-  <node id='-165' action='modify' visible='true' lat='2.0001892102' lon='1.00653236169' />
-  <node id='-167' action='modify' visible='true' lat='2.00027856164' lon='1.00667595302' />
-  <node id='-169' action='modify' visible='true' lat='2.00027856164' lon='1.00681954435' />
-  <node id='-171' action='modify' visible='true' lat='2.00025148545' lon='1.00691707809' />
-  <node id='-173' action='modify' visible='true' lat='2.0001892102' lon='1.00704170453' />
-  <node id='-175' action='modify' visible='true' lat='2.00017296448' lon='1.00724219054' />
-  <node id='-177' action='modify' visible='true' lat='2.00062243814' lon='1.00685396461'>
-    <tag k='name' v='parallel-road' />
-  </node>
-  <node id='-179' action='modify' visible='true' lat='2.00033813812' lon='1.00653156143'>
-    <tag k='test:id' v='n-middle-w' />
-    <tag k='test:section' v='parallel-road' />
-  </node>
-  <node id='-181' action='modify' visible='true' lat='2.00042478194' lon='1.00668598984' />
-  <node id='-183' action='modify' visible='true' lat='2.00041665908' lon='1.00690002221' />
-  <node id='-185' action='modify' visible='true' lat='2.00034084574' lon='1.00723597174'>
-    <tag k='test:id' v='n-middle-e' />
-    <tag k='test:section' v='parallel-road' />
-  </node>
-  <node id='-187' action='modify' visible='true' lat='2.00041801289' lon='1.00653968924' />
-  <node id='-189' action='modify' visible='true' lat='2.00050736432' lon='1.00668328057' />
-  <node id='-191' action='modify' visible='true' lat='2.00050736432' lon='1.00682687191' />
-  <node id='-193' action='modify' visible='true' lat='2.00048028813' lon='1.00692440564' />
-  <node id='-195' action='modify' visible='true' lat='2.00041801289' lon='1.00704903208' />
-  <node id='-197' action='modify' visible='true' lat='2.00040176717' lon='1.00724951809' />
-  <node id='-199' action='modify' visible='true' lat='2.00102300625' lon='1.00316327416'>
-    <tag k='test:id' v='n-south-w' />
-    <tag k='test:section' v='building-with-parallel-streets' />
-  </node>
-  <node id='-201' action='modify' visible='true' lat='2.00101492424' lon='1.00369431688' />
-  <node id='-203' action='modify' visible='true' lat='2.00102031225' lon='1.00407170765' />
-  <node id='-205' action='modify' visible='true' lat='2.00100684223' lon='1.00433588118'>
-    <tag k='test:id' v='n-south-e' />
-    <tag k='test:section' v='building-with-parallel-streets' />
-  </node>
-  <node id='-207' action='modify' visible='true' lat='2.00148637497' lon='1.00362153438'>
-    <tag k='name' v='building-with-parallel-streets' />
-  </node>
-  <node id='-209' action='modify' visible='true' lat='2.00126546664' lon='1.00315114374'>
-    <tag k='test:id' v='n-north-w' />
-    <tag k='test:section' v='building-with-parallel-streets' />
-  </node>
-  <node id='-211' action='modify' visible='true' lat='2.00125738463' lon='1.00368218646' />
-  <node id='-213' action='modify' visible='true' lat='2.00126277264' lon='1.00405957723' />
-  <node id='-215' action='modify' visible='true' lat='2.00124930262' lon='1.00432375077'>
-    <tag k='test:id' v='n-north-e' />
-    <tag k='test:section' v='building-with-parallel-streets' />
-  </node>
-  <node id='-217' action='modify' visible='true' lat='2.00118914388' lon='1.00361572227' />
-  <node id='-219' action='modify' visible='true' lat='2.0010786539' lon='1.00361659971' />
-  <node id='-221' action='modify' visible='true' lat='2.001080471' lon='1.003845694' />
-  <node id='-223' action='modify' visible='true' lat='2.00119096098' lon='1.00384481656' />
-  <node id='100000' timestamp='2014-01-01T00:00:00Z' uid='1' user='test' visible='true' version='1' changeset='1' lat='2.0' lon='1.0' />
-  <node id='100001' timestamp='2014-01-01T00:00:00Z' uid='1' user='test' visible='true' version='1' changeset='1' lat='3.0' lon='1.0' />
-  <node id='100002' timestamp='2014-01-01T00:00:00Z' uid='1' user='test' visible='true' version='1' changeset='1' lat='3.0' lon='2.0' />
-  <node id='100003' timestamp='2014-01-01T00:00:00Z' uid='1' user='test' visible='true' version='1' changeset='1' lat='2.0' lon='2.0' />
-  <way id='-229' action='modify' visible='true'>
-    <nd ref='-25' />
-    <nd ref='-23' />
-    <nd ref='-21' />
-    <tag k='test:id' v='w-5' />
-    <tag k='test:section' v='split-road' />
-  </way>
-  <way id='-231' action='modify' visible='true'>
-    <nd ref='-35' />
-    <nd ref='-33' />
-    <nd ref='-31' />
-    <nd ref='-29' />
-    <nd ref='-27' />
-    <nd ref='-25' />
-    <tag k='test:id' v='w-4a' />
-    <tag k='test:section' v='split-road' />
-  </way>
-  <way id='-233' action='modify' visible='true'>
-    <nd ref='-43' />
-    <nd ref='-41' />
-    <nd ref='-39' />
-    <nd ref='-37' />
-    <nd ref='-35' />
-    <tag k='test:id' v='w-3' />
-    <tag k='test:section' v='split-road' />
-  </way>
-  <way id='-235' action='modify' visible='true'>
-    <nd ref='-51' />
-    <nd ref='-49' />
-    <nd ref='-47' />
-    <nd ref='-45' />
-    <nd ref='-43' />
-    <tag k='test:id' v='w-2' />
-    <tag k='test:section' v='split-road' />
-  </way>
-  <way id='-237' action='modify' visible='true'>
-    <nd ref='-35' />
-    <nd ref='-19' />
-    <nd ref='-17' />
-    <nd ref='-15' />
-    <nd ref='-13' />
-    <nd ref='-25' />
-    <tag k='test:id' v='w-4b' />
-    <tag k='test:section' v='split-road' />
-  </way>
-  <way id='-239' action='modify' visible='true'>
-    <nd ref='-55' />
-    <nd ref='-53' />
-    <nd ref='-51' />
-    <tag k='test:id' v='w-1' />
-    <tag k='test:section' v='split-road' />
-  </way>
-  <way id='-241' action='modify' visible='true'>
-    <nd ref='-77' />
-    <nd ref='-75' />
-    <nd ref='-73' />
-    <nd ref='-59' />
-    <nd ref='-67' />
-    <nd ref='-71' />
-    <tag k='test:id' v='w-north' />
-    <tag k='test:section' v='points-on-roads' />
-  </way>
-  <way id='-243' action='modify' visible='true'>
-    <nd ref='-87' />
-    <nd ref='-65' />
-    <nd ref='-85' />
-    <nd ref='-83' />
-    <nd ref='-81' />
-    <nd ref='-69' />
-    <nd ref='-79' />
-    <tag k='test:id' v='w-south' />
-    <tag k='test:section' v='points-on-roads' />
-  </way>
-  <way id='-245' action='modify' visible='true'>
-    <nd ref='-109' />
-    <nd ref='-101' />
-    <tag k='test:id' v='w-alley' />
-    <tag k='test:section' v='road-with-alley' />
-  </way>
-  <way id='-247' action='modify' visible='true'>
-    <nd ref='-113' />
-    <nd ref='-111' />
-    <nd ref='-109' />
-    <nd ref='-107' />
-    <nd ref='-105' />
-    <nd ref='-103' />
-    <tag k='test:id' v='w-main' />
-    <tag k='test:section' v='road-with-alley' />
-  </way>
-  <way id='-249' action='modify' visible='true'>
-    <nd ref='-115' />
-    <nd ref='-117' />
-    <nd ref='-119' />
-    <nd ref='-121' />
-    <tag k='test:id' v='w-north' />
-    <tag k='test:section' v='roads-with-pois' />
-  </way>
-  <way id='-251' action='modify' visible='true'>
-    <nd ref='-123' />
-    <nd ref='-125' />
-    <nd ref='-127' />
-    <tag k='test:id' v='w-south' />
-    <tag k='test:section' v='roads-with-pois' />
-  </way>
-  <way id='-253' action='modify' visible='true'>
-    <nd ref='-139' />
-    <nd ref='-141' />
-    <nd ref='-143' />
-    <tag k='test:id' v='w-WE' />
-    <tag k='test:section' v='building-on-street-corner' />
-  </way>
-  <way id='-255' action='modify' visible='true'>
-    <nd ref='-145' />
-    <nd ref='-141' />
-    <nd ref='-147' />
-    <tag k='test:id' v='w-NS' />
-    <tag k='test:section' v='building-on-street-corner' />
-  </way>
-  <way id='-257' action='modify' visible='true'>
-    <nd ref='-149' />
-    <nd ref='-151' />
-    <nd ref='-157' />
-    <nd ref='-153' />
-    <nd ref='-163' />
-    <nd ref='-155' />
-    <nd ref='-149' />
-    <tag k='area' v='yes' />
-    <tag k='test:id' v='w-building' />
-    <tag k='test:section' v='building-on-street-corner' />
-  </way>
-  <way id='-259' action='modify' visible='true'>
-    <nd ref='-165' />
-    <nd ref='-167' />
-    <nd ref='-169' />
-    <nd ref='-171' />
-    <nd ref='-173' />
-    <nd ref='-175' />
-    <tag k='test:id' v='w-south' />
-    <tag k='test:section' v='parallel-road' />
-  </way>
-  <way id='-261' action='modify' visible='true'>
-    <nd ref='-179' />
-    <nd ref='-181' />
-    <nd ref='-183' />
-    <nd ref='-185' />
-    <tag k='test:id' v='w-middle' />
-    <tag k='test:section' v='parallel-road' />
-  </way>
-  <way id='-263' action='modify' visible='true'>
-    <nd ref='-187' />
-    <nd ref='-189' />
-    <nd ref='-191' />
-    <nd ref='-193' />
-    <nd ref='-195' />
-    <nd ref='-197' />
-    <tag k='test:id' v='w-north' />
-    <tag k='test:section' v='parallel-road' />
-  </way>
-  <way id='-265' action='modify' visible='true'>
-    <nd ref='-199' />
-    <nd ref='-201' />
-    <nd ref='-203' />
-    <nd ref='-205' />
-    <tag k='test:id' v='w-south' />
-    <tag k='test:section' v='building-with-parallel-streets' />
-  </way>
-  <way id='-267' action='modify' visible='true'>
-    <nd ref='-209' />
-    <nd ref='-211' />
-    <nd ref='-213' />
-    <nd ref='-215' />
-    <tag k='test:id' v='w-north' />
-    <tag k='test:section' v='building-with-parallel-streets' />
-  </way>
-  <way id='-269' action='modify' visible='true'>
-    <nd ref='-217' />
-    <nd ref='-219' />
-    <nd ref='-221' />
-    <nd ref='-223' />
-    <nd ref='-217' />
-    <tag k='test:id' v='w-building' />
-    <tag k='test:section' v='building-with-parallel-streets' />
-  </way>
-  <way id='100000' timestamp='2014-01-01T00:00:00Z' uid='1' user='test' visible='true' version='1' changeset='1'>
-    <nd ref='100000' />
-    <nd ref='100001' />
-    <nd ref='100002' />
-    <nd ref='100003' />
-    <nd ref='100000' />
-    <tag k='note' v='test area, do not leave' />
-  </way>
-</osm>
diff --git a/test/scenes/data/split-road.wkt b/test/scenes/data/split-road.wkt
deleted file mode 100644 (file)
index 4435a13..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-w-5 |  LINESTRING(1.0056855 2.0005616,1.0056087 2.0005669,1.0055106 2.0005245)
-w-4a |  LINESTRING(1.0062843 2.0005139,1.0061359 2.0004954,1.0060538 2.0005113,1.0059107 2.000506,1.0057358 2.0005007,1.0056855 2.0005616)
-w-3 |  LINESTRING(1.0061995 2.0003391,1.0062816 2.0002624,1.0063585 2.0002968,1.0063717 2.0004715,1.0062843 2.0005139)
-w-2 |  LINESTRING(1.0057941 2.0002809,1.0058869 2.0003259,1.0060034 2.0003497,1.0061041 2.0003577,1.0061995 2.0003391)
-w-4b |  LINESTRING(1.0062843 2.0005139,1.0061306 2.0005324,1.0060511 2.000543,1.0058975 2.000543,1.0057491 2.0005351,1.0056855 2.0005616)
-w-1 |  LINESTRING(1.0054709 2.0003603,1.0056352 2.0002782,1.0057941 2.0002809)
diff --git a/test/scenes/data/way-area-with-center.wkt b/test/scenes/data/way-area-with-center.wkt
deleted file mode 100644 (file)
index ed34cd3..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-inner-S |  POINT(0.0048516 -0.0095176)
-inner-N |  POINT(0.0018846 -0.0023652)
-outer-C |  POINT(0.0041244 -0.0060007)
-inner-C |  POINT(0.0035625 -0.0066188)
-area |  MULTIPOLYGON(((0.0005071 -0.0060738,0.0010369 -0.0072924,0.0019376 -0.0065507,0.0026264 -0.0080341,0.0026264 -0.0091997,0.0022025 -0.0099944,0.0026794 -0.0105772,0.0038979 -0.0109481,0.0065469 -0.0099414,0.0077125 -0.0066566,0.0068648 -0.0049612,0.0061231 -0.0064977,0.0051694 -0.0076633,0.0033681 -0.0059149,0.0075006 -0.0040076,0.006441 -0.0025771,0.0050105 -0.0021533,0.0013019 -0.0015175,0.0005601 -0.0025771,0.0005071 -0.0042195,0.0017787 -0.00565,0.0005071 -0.0060738)))
index 3dab967b940e0dc519ea6d011d32f095b03ea24a..147526de4e577438da119ddb49b9c36cfd4fcd8b 100644 (file)
@@ -18,6 +18,7 @@ Zipline near,aerialway,zip_line,near,N
 Ziplines near,aerialway,zip_line,near,Y 
 Zipwire,aerialway,zip_line,-,N 
 Zipwires,aerialway,zip_line,-,Y 
+Zipwires,aerialway,zip_line,name,Y 
 Zipwire in,aerialway,zip_line,in,N 
 Zipwires in,aerialway,zip_line,in,Y 
 Zipwire near,aerialway,zip_line,near,N 
index e790ca583febc3992b32dcb6dd606b99ac8ba3f9..e5f340b9a34b0adc198d9e5c29a031bf5b2765da 100644 (file)
@@ -70,7 +70,7 @@
 <model>wikitext</model>
 <format>text/x-wiki</format>
 <text bytes="158218" sha1="cst5x7tt58izti1pxzgljf27tx8qjcj" xml:space="preserve">
-== en == {| class="wikitable sortable" |- ! Word / Phrase !! Key !! Value !! Operator !! Plural |- | Zip Line || aerialway || zip_line || - || N |- | Zip Lines || aerialway || zip_line || - || Y |- | Zip Line in || aerialway || zip_line || in || N |- | Zip Lines in || aerialway || zip_line || in || Y |- | Zip Line near || aerialway || zip_line || near || N |- | Animal shelter || amenity || animal_shelter || - || N |- | Animal shelters || amenity || animal_shelter || - || Y |- | Animal shelter in || amenity || animal_shelter || in || N |- | Animal shelters in || amenity || animal_shelter || in || Y |- | Animal shelter near || amenity || animal_shelter || near|| N |- | Animal shelters near || amenity || animal_shelter || NEAR|| Y |- | Drinking Water near || amenity || drinking_water || near || N |- | Water || amenity || drinking_water || - || N |- | Water in || amenity || drinking_water || In || N |- | Water near || amenity || drinking_water || near || N |- | Embassy || amenity || embassy || - || N |- | Embassys || amenity || embassy || - || Y |- | Embassies || amenity || embassy || - || Y |- |Coworkings near |amenity |coworking_space |near |Y |} [[Category:Word list]]
+== en == {| class="wikitable sortable" |- ! Word / Phrase !! Key !! Value !! Operator !! Plural |- | Zip Line || aerialway || zip_line || - || N |- | Zip Lines || aerialway || zip_line || - || Y |- | Zip Line in || aerialway || zip_line || in || N |- | Zip Lines in || aerialway || zip_line || in || Y |- | Zip Line near || aerialway || zip_line || near || N |- | Animal shelter || amenity || animal_shelter || - || N |- | Animal shelters || amenity || animal_shelter || - || Y |- | Animal shelter in || amenity || animal_shelter || in || N |- | Animal shelters in || amenity || animal_shelter || in || Y |- | Animal shelter near || amenity || animal_shelter || near|| N |- | Animal shelters near || amenity || animal_shelter || NEAR|| Y |- | Drinking Water near || amenity || drinking_water || near || N |- | Water || amenity || drinking_water || - || N |- | Water in || amenity || drinking_water || In || N |- | Water near || amenity || drinking_water || near || N |- | Embassy || amenity || embassy || - || N |- | Embassys || amenity || "embassy" || - || Y |- | Embassies || amenity || embassy || - || Y |- |Coworkings near |amenity |coworking_space |near |Y |} [[Category:Word list]]
 </text>
 <sha1>cst5x7tt58izti1pxzgljf27tx8qjcj</sha1>
 </revision>
diff --git a/vagrant/Install-on-Centos-8.sh b/vagrant/Install-on-Centos-8.sh
deleted file mode 100755 (executable)
index 4877e0a..0000000
+++ /dev/null
@@ -1,217 +0,0 @@
-#!/bin/bash -ex
-#
-# *Note:* these installation instructions are also available in executable
-#         form for use with vagrant under `vagrant/Install-on-Centos-8.sh`.
-#
-# Installing the Required Software
-# ================================
-#
-# These instructions expect that you have a freshly installed CentOS version 8.
-# Make sure all packages are up-to-date by running:
-#
-    sudo dnf update -y
-
-# The standard CentOS repositories don't contain all the required packages,
-# you need to enable the EPEL repository as well. For example for SELinux
-# related redhat-hardened-cc1 package. To enable it on CentOS run:
-
-    sudo dnf install -y epel-release redhat-rpm-config
-
-# EPEL contains Postgres 9.6 and 10, but not PostGIS. Postgres 9.4+/10/11/12
-# and PostGIS 2.4/2.5/3.0 are availble from postgresql.org. Enable these
-# repositories and make sure, the binaries can be found:
-
-    sudo dnf -qy module disable postgresql
-    sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-8-x86_64/pgdg-redhat-repo-latest.noarch.rpm
-    export PATH=/usr/pgsql-12/bin:$PATH
-
-# Now you can install all packages needed for Nominatim:
-
-#DOCS:    :::sh
-    sudo dnf --enablerepo=powertools install -y postgresql12-server \
-                        postgresql12-contrib postgresql12-devel postgis30_12 \
-                        wget git cmake make gcc gcc-c++ libtool policycoreutils-python-utils \
-                        llvm-toolset ccache clang-tools-extra \
-                        php-pgsql php php-intl php-json libpq-devel \
-                        bzip2-devel proj-devel boost-devel \
-                        python3-pip python3-setuptools python3-devel \
-                        python3-psycopg2 \
-                        expat-devel zlib-devel libicu-devel
-
-    pip3 install --user python-dotenv psutil Jinja2 PyICU datrie pyyaml
-
-
-#
-# System Configuration
-# ====================
-#
-# The following steps are meant to configure a fresh CentOS installation
-# for use with Nominatim. You may skip some of the steps if you have your
-# OS already configured.
-#
-# Creating Dedicated User Accounts
-# --------------------------------
-#
-# Nominatim will run as a global service on your machine. It is therefore
-# best to install it under its own separate user account. In the following
-# we assume this user is called nominatim and the installation will be in
-# /srv/nominatim. To create the user and directory run:
-#
-#     sudo useradd -d /srv/nominatim -s /bin/bash -m nominatim
-#
-# You may find a more suitable location if you wish.
-#
-# To be able to copy and paste instructions from this manual, export
-# user name and home directory now like this:
-#
-if [ "x$USERNAME" == "x" ]; then       #DOCS:
-    export USERNAME=vagrant            #DOCS:    export USERNAME=nominatim
-    export USERHOME=/srv/nominatim
-    sudo mkdir -p /srv/nominatim       #DOCS:
-    sudo chown vagrant /srv/nominatim  #DOCS:
-fi                                     #DOCS:
-#
-# **Never, ever run the installation as a root user.** You have been warned.
-#
-# Make sure that system servers can read from the home directory:
-
-    chmod a+x $USERHOME
-
-# Setting up PostgreSQL
-# ---------------------
-#
-# CentOS does not automatically create a database cluster. Therefore, start
-# with initializing the database:
-
-if [ "x$NOSYSTEMD" == "xyes" ]; then                               #DOCS:
-    sudo -u postgres /usr/pgsql-12/bin/pg_ctl initdb -D /var/lib/pgsql/12/data     #DOCS:
-    sudo mkdir /var/log/postgresql                                 #DOCS:
-    sudo chown postgres. /var/log/postgresql                       #DOCS:
-else                                                               #DOCS:
-    sudo /usr/pgsql-12/bin/postgresql-12-setup initdb
-fi                                                                 #DOCS:
-#
-# Next tune the postgresql configuration, which is located in
-# `/var/lib/pgsql/12/data/postgresql.conf`. See section *Postgres Tuning* in
-# [the installation page](../admin/Installation.md#postgresql-tuning)
-# for the parameters to change.
-#
-# Now start the postgresql service after updating this config file:
-
-if [ "x$NOSYSTEMD" == "xyes" ]; then  #DOCS:
-    sudo -u postgres /usr/pgsql-12/bin/pg_ctl -D /var/lib/pgsql/12/data -l /var/log/postgresql/postgresql-12.log start  #DOCS:
-else                                  #DOCS:
-    sudo systemctl enable postgresql-12
-    sudo systemctl restart postgresql-12
-fi                                    #DOCS:
-
-#
-# Finally, we need to add two postgres users: one for the user that does
-# the import and another for the webserver which should access the database
-# only for reading:
-#
-
-    sudo -u postgres createuser -s $USERNAME
-    sudo -u postgres createuser apache
-
-#
-# Installing Nominatim
-# ====================
-#
-# Building and Configuration
-# --------------------------
-#
-# Get the source code from Github and change into the source directory
-#
-if [ "x$1" == "xyes" ]; then  #DOCS:    :::sh
-    cd $USERHOME
-    git clone --recursive git://github.com/openstreetmap/Nominatim.git
-    cd Nominatim
-else                               #DOCS:
-    cd $USERHOME/Nominatim         #DOCS:
-fi                                 #DOCS:
-
-# When installing the latest source from github, you also need to
-# download the country grid:
-
-if [ ! -f data/country_osm_grid.sql.gz ]; then       #DOCS:    :::sh
-    wget --no-verbose -O data/country_osm_grid.sql.gz https://www.nominatim.org/data/country_grid.sql.gz
-fi                                 #DOCS:
-
-# The code must be built in a separate directory. Create this directory,
-# then configure and build Nominatim in there:
-
-#DOCS:    :::sh
-    mkdir $USERHOME/build
-    cd $USERHOME/build
-    cmake $USERHOME/Nominatim
-    make
-    sudo make install
-
-#
-# Setting up the Apache Webserver
-# -------------------------------
-#
-# The webserver should serve the php scripts from the website directory of your
-# [project directory](../admin/Import.md#creating-the-project-directory).
-# This directory needs to exist when the webserver is configured.
-# Therefore set up a project directory and create the website directory:
-#
-    mkdir $USERHOME/nominatim-project
-    mkdir $USERHOME/nominatim-project/website
-#
-# You need to create an alias to the website directory in your apache
-# configuration. Add a separate nominatim configuration to your webserver:
-
-#DOCS:```sh
-sudo tee /etc/httpd/conf.d/nominatim.conf << EOFAPACHECONF
-<Directory "$USERHOME/nominatim-project/website">
-  Options FollowSymLinks MultiViews
-  AddType text/html   .php
-  DirectoryIndex search.php
-  Require all granted
-</Directory>
-
-Alias /nominatim $USERHOME/nominatim-project/website
-EOFAPACHECONF
-#DOCS:```
-
-sudo sed -i 's:#.*::' /etc/httpd/conf.d/nominatim.conf #DOCS:
-
-#
-# Then reload apache:
-#
-
-if [ "x$NOSYSTEMD" == "xyes" ]; then  #DOCS:
-    sudo httpd                        #DOCS:
-else                                  #DOCS:
-    sudo systemctl enable httpd
-    sudo systemctl restart httpd
-fi                                    #DOCS:
-
-#
-# Adding SELinux Security Settings
-# --------------------------------
-#
-# It is a good idea to leave SELinux enabled and enforcing, particularly
-# with a web server accessible from the Internet. At a minimum the
-# following SELinux labeling should be done for Nominatim:
-
-if [ "x$HAVE_SELINUX" != "xno" ]; then  #DOCS:
-    sudo semanage fcontext -a -t httpd_sys_content_t "/usr/local/nominatim/lib/lib-php(/.*)?"
-    sudo semanage fcontext -a -t httpd_sys_content_t "$USERHOME/nominatim-project/website(/.*)?"
-    sudo semanage fcontext -a -t lib_t "$USERHOME/nominatim-project/module/nominatim.so"
-    sudo restorecon -R -v /usr/local/lib/nominatim
-    sudo restorecon -R -v $USERHOME/nominatim-project
-fi                                 #DOCS:
-
-# You need to create a minimal configuration file that tells nominatim
-# the name of your webserver user:
-
-#DOCS:```sh
-echo NOMINATIM_DATABASE_WEBUSER="apache" | tee $USERHOME/nominatim-project/.env
-#DOCS:```
-
-
-# Nominatim is now ready to use. Continue with
-# [importing a database from OSM data](../admin/Import.md).
index a1a1fe304d6a8b3f1890479e02644e92fa13cc05..e36086e19159128eb59c418c4b9559e6a9182c92 100755 (executable)
@@ -24,11 +24,11 @@ export DEBIAN_FRONTEND=noninteractive #DOCS:
     sudo apt install -y php-cgi
     sudo apt install -y build-essential cmake g++ libboost-dev libboost-system-dev \
                         libboost-filesystem-dev libexpat1-dev zlib1g-dev\
-                        libbz2-dev libpq-dev libproj-dev \
-                        postgresql-server-dev-10 postgresql-10-postgis-2.4 \
+                        libbz2-dev libpq-dev \
+                        postgresql-10-postgis-2.4 \
                         postgresql-contrib-10 postgresql-10-postgis-scripts \
-                        php php-pgsql php-intl libicu-dev python3-pip \
-                        python3-psutil python3-jinja2 python3-icu git
+                        php-cli php-pgsql php-intl libicu-dev python3-pip \
+                        python3-psutil python3-jinja2 python3-yaml python3-icu git
 
 # Some of the Python packages that come with Ubuntu 18.04 are too old, so
 # install the latest version from pip:
@@ -105,7 +105,7 @@ fi                                    #DOCS:
 #
 if [ "x$1" == "xyes" ]; then  #DOCS:    :::sh
     cd $USERHOME
-    git clone --recursive git://github.com/openstreetmap/Nominatim.git
+    git clone --recursive https://github.com/openstreetmap/Nominatim.git
     cd Nominatim
 else                               #DOCS:
     cd $USERHOME/Nominatim         #DOCS:
index 1fbabf24227bac156b3f3d69c67395a7731add89..d364cccd7a9ab064a876c246348ee94cf4dbfd8b 100755 (executable)
@@ -23,12 +23,12 @@ export DEBIAN_FRONTEND=noninteractive #DOCS:
     sudo apt install -y php-cgi
     sudo apt install -y build-essential cmake g++ libboost-dev libboost-system-dev \
                         libboost-filesystem-dev libexpat1-dev zlib1g-dev \
-                        libbz2-dev libpq-dev libproj-dev \
-                        postgresql-server-dev-12 postgresql-12-postgis-3 \
+                        libbz2-dev libpq-dev \
+                        postgresql-12-postgis-3 \
                         postgresql-contrib-12 postgresql-12-postgis-3-scripts \
-                        php php-pgsql php-intl libicu-dev python3-dotenv \
+                        php-cli php-pgsql php-intl libicu-dev python3-dotenv \
                         python3-psycopg2 python3-psutil python3-jinja2 \
-                        python3-icu python3-datrie git
+                        python3-icu python3-datrie python3-yaml git
 
 #
 # System Configuration
@@ -99,7 +99,7 @@ fi                                    #DOCS:
 #
 if [ "x$1" == "xyes" ]; then  #DOCS:    :::sh
     cd $USERHOME
-    git clone --recursive git://github.com/openstreetmap/Nominatim.git
+    git clone --recursive https://github.com/openstreetmap/Nominatim.git
     cd Nominatim
 else                               #DOCS:
     cd $USERHOME/Nominatim         #DOCS:
@@ -258,7 +258,7 @@ EOF_NGINX_CONF
 #
 
 if [ "x$NOSYSTEMD" == "xyes" ]; then  #DOCS:
-    sudo /usr/sbin/php-fpm7.3 --nodaemonize --fpm-config /etc/php/7.3/fpm/php-fpm.conf & #DOCS:
+    sudo /usr/sbin/php-fpm7.4 --nodaemonize --fpm-config /etc/php/7.4/fpm/php-fpm.conf & #DOCS:
     sudo /usr/sbin/nginx &            #DOCS:
 else                                  #DOCS:
     sudo systemctl restart php7.4-fpm nginx
diff --git a/vagrant/Install-on-Ubuntu-22.sh b/vagrant/Install-on-Ubuntu-22.sh
new file mode 100755 (executable)
index 0000000..419a731
--- /dev/null
@@ -0,0 +1,271 @@
+#!/bin/bash -e
+#
+# hacks for broken vagrant box      #DOCS:
+sudo rm -f /var/lib/dpkg/lock       #DOCS:
+export APT_LISTCHANGES_FRONTEND=none #DOCS:
+export DEBIAN_FRONTEND=noninteractive #DOCS:
+
+# *Note:* these installation instructions are also available in executable
+#         form for use with vagrant under vagrant/Install-on-Ubuntu-22.sh.
+#
+# Installing the Required Software
+# ================================
+#
+# These instructions expect that you have a freshly installed Ubuntu 22.04.
+#
+# Make sure all packages are up-to-date by running:
+#
+
+    sudo apt update -qq
+
+# Now you can install all packages needed for Nominatim:
+
+    sudo apt install -y php-cgi
+    sudo apt install -y build-essential cmake g++ libboost-dev libboost-system-dev \
+                        libboost-filesystem-dev libexpat1-dev zlib1g-dev \
+                        libbz2-dev libpq-dev \
+                        postgresql-server-dev-14 postgresql-14-postgis-3 \
+                        postgresql-contrib-14 postgresql-14-postgis-3-scripts \
+                        php-cli php-pgsql php-intl libicu-dev python3-dotenv \
+                        python3-psycopg2 python3-psutil python3-jinja2 \
+                        python3-icu python3-datrie git
+
+#
+# System Configuration
+# ====================
+#
+# The following steps are meant to configure a fresh Ubuntu installation
+# for use with Nominatim. You may skip some of the steps if you have your
+# OS already configured.
+#
+# Creating Dedicated User Accounts
+# --------------------------------
+#
+# Nominatim will run as a global service on your machine. It is therefore
+# best to install it under its own separate user account. In the following
+# we assume this user is called nominatim and the installation will be in
+# /srv/nominatim. To create the user and directory run:
+#
+#     sudo useradd -d /srv/nominatim -s /bin/bash -m nominatim
+#
+# You may find a more suitable location if you wish.
+#
+# To be able to copy and paste instructions from this manual, export
+# user name and home directory now like this:
+#
+if [ "x$USERNAME" == "x" ]; then #DOCS:
+    export USERNAME=vagrant        #DOCS:    export USERNAME=nominatim
+    export USERHOME=/home/vagrant  #DOCS:    export USERHOME=/srv/nominatim
+fi                                 #DOCS:
+#
+# **Never, ever run the installation as a root user.** You have been warned.
+#
+# Make sure that system servers can read from the home directory:
+
+    chmod a+x $USERHOME
+
+# Setting up PostgreSQL
+# ---------------------
+#
+# Tune the postgresql configuration, which is located in 
+# `/etc/postgresql/14/main/postgresql.conf`. See section *Postgres Tuning* in
+# [the installation page](../admin/Installation.md#postgresql-tuning)
+# for the parameters to change.
+#
+# Restart the postgresql service after updating this config file.
+
+if [ "x$NOSYSTEMD" == "xyes" ]; then  #DOCS:
+    sudo pg_ctlcluster 14 main start  #DOCS:
+else                                  #DOCS:
+    sudo systemctl restart postgresql
+fi                                    #DOCS:
+#
+# Finally, we need to add two postgres users: one for the user that does
+# the import and another for the webserver which should access the database
+# for reading only:
+#
+
+    sudo -u postgres createuser -s $USERNAME
+    sudo -u postgres createuser www-data
+
+#
+# Installing Nominatim
+# ====================
+#
+# Building and Configuration
+# --------------------------
+#
+# Get the source code from Github and change into the source directory
+#
+if [ "x$1" == "xyes" ]; then  #DOCS:    :::sh
+    cd $USERHOME
+    git clone --recursive https://github.com/openstreetmap/Nominatim.git
+    cd Nominatim
+else                               #DOCS:
+    cd $USERHOME/Nominatim         #DOCS:
+fi                                 #DOCS:
+
+# When installing the latest source from github, you also need to
+# download the country grid:
+
+if [ ! -f data/country_osm_grid.sql.gz ]; then       #DOCS:    :::sh
+    wget -O data/country_osm_grid.sql.gz https://www.nominatim.org/data/country_grid.sql.gz
+fi                                 #DOCS:
+
+# The code must be built in a separate directory. Create this directory,
+# then configure and build Nominatim in there:
+
+    mkdir $USERHOME/build
+    cd $USERHOME/build
+    cmake $USERHOME/Nominatim
+    make
+    sudo make install
+
+# Nominatim is now ready to use. You can continue with
+# [importing a database from OSM data](../admin/Import.md). If you want to set up
+# a webserver first, continue reading.
+#
+# Setting up a webserver
+# ======================
+#
+# The webserver should serve the php scripts from the website directory of your
+# [project directory](../admin/Import.md#creating-the-project-directory).
+# This directory needs to exist when being configured.
+# Therefore set up a project directory and create a website directory:
+
+    mkdir $USERHOME/nominatim-project
+    mkdir $USERHOME/nominatim-project/website
+
+# The import process will populate the directory later.
+
+#
+# Option 1: Using Apache
+# ----------------------
+#
+if [ "x$2" == "xinstall-apache" ]; then #DOCS:
+#
+# Apache has a PHP module that can be used to serve Nominatim. To install them
+# run:
+
+    sudo apt install -y apache2 libapache2-mod-php
+
+# You need to create an alias to the website directory in your apache
+# configuration. Add a separate nominatim configuration to your webserver:
+
+#DOCS:```sh
+sudo tee /etc/apache2/conf-available/nominatim.conf << EOFAPACHECONF
+<Directory "$USERHOME/nominatim-project/website">
+  Options FollowSymLinks MultiViews
+  AddType text/html   .php
+  DirectoryIndex search.php
+  Require all granted
+</Directory>
+
+Alias /nominatim $USERHOME/nominatim-project/website
+EOFAPACHECONF
+#DOCS:```
+
+#
+# Then enable the configuration and restart apache
+#
+
+    sudo a2enconf nominatim
+if [ "x$NOSYSTEMD" == "xyes" ]; then  #DOCS:
+    sudo apache2ctl start             #DOCS:
+else                                  #DOCS:
+    sudo systemctl restart apache2
+fi                                    #DOCS:
+
+# The Nominatim API is now available at `http://localhost/nominatim/`.
+
+fi   #DOCS:
+
+#
+# Option 2: Using nginx
+# ---------------------
+#
+if [ "x$2" == "xinstall-nginx" ]; then #DOCS:
+
+# Nginx has no native support for php scripts. You need to set up php-fpm for
+# this purpose. First install nginx and php-fpm:
+
+    sudo apt install -y nginx php-fpm
+
+# You need to configure php-fpm to listen on a Unix socket.
+
+#DOCS:```sh
+sudo tee /etc/php/8.1/fpm/pool.d/www.conf << EOF_PHP_FPM_CONF
+[www]
+; Replace the tcp listener and add the unix socket
+listen = /var/run/php8.1-fpm.sock
+
+; Ensure that the daemon runs as the correct user
+listen.owner = www-data
+listen.group = www-data
+listen.mode = 0666
+
+; Unix user of FPM processes
+user = www-data
+group = www-data
+
+; Choose process manager type (static, dynamic, ondemand)
+pm = ondemand
+pm.max_children = 5
+EOF_PHP_FPM_CONF
+#DOCS:```
+
+# Then create a Nginx configuration to forward http requests to that socket.
+
+#DOCS:```sh
+sudo tee /etc/nginx/sites-available/default << EOF_NGINX_CONF
+server {
+    listen 80 default_server;
+    listen [::]:80 default_server;
+
+    root $USERHOME/nominatim-project/website;
+    index search.php index.html;
+    location / {
+        try_files \$uri \$uri/ @php;
+    }
+
+    location @php {
+        fastcgi_param SCRIPT_FILENAME "\$document_root\$uri.php";
+        fastcgi_param PATH_TRANSLATED "\$document_root\$uri.php";
+        fastcgi_param QUERY_STRING    \$args;
+        fastcgi_pass unix:/var/run/php8.1-fpm.sock;
+        fastcgi_index index.php;
+        include fastcgi_params;
+    }
+
+    location ~ [^/]\.php(/|$) {
+        fastcgi_split_path_info ^(.+?\.php)(/.*)$;
+        if (!-f \$document_root\$fastcgi_script_name) {
+            return 404;
+        }
+        fastcgi_pass unix:/var/run/php7.4-fpm.sock;
+        fastcgi_index search.php;
+        include fastcgi.conf;
+    }
+}
+EOF_NGINX_CONF
+#DOCS:```
+
+# If you have some errors, make sure that php8.1-fpm.sock is well under
+# /var/run/ and not under /var/run/php. Otherwise change the Nginx configuration
+# to /var/run/php/php8.1-fpm.sock.
+#
+# Enable the configuration and restart Nginx
+#
+
+if [ "x$NOSYSTEMD" == "xyes" ]; then  #DOCS:
+    sudo /usr/sbin/php-fpm8.1 --nodaemonize --fpm-config /etc/php/8.1/fpm/php-fpm.conf & #DOCS:
+    sudo /usr/sbin/nginx &            #DOCS:
+else                                  #DOCS:
+    sudo systemctl restart php8.1-fpm nginx
+fi                                    #DOCS:
+
+# The Nominatim API is now available at `http://localhost/`.
+
+
+
+fi   #DOCS: