]> git.openstreetmap.org Git - nominatim.git/commitdiff
Merge remote-tracking branch 'upstream/master' into cmake-port
authorSarah Hoffmann <lonvia@denofr.de>
Fri, 30 Sep 2016 19:51:00 +0000 (21:51 +0200)
committerSarah Hoffmann <lonvia@denofr.de>
Fri, 30 Sep 2016 19:51:00 +0000 (21:51 +0200)
71 files changed:
CONTRIBUTING.md
COPYING
Vagrantfile
data/country_name.sql
data/us_postcode.sql
docs/Import_and_update.md
docs/Installation.md
lib/Geocode.php
lib/ParameterParser.php [new file with mode: 0644]
lib/PlaceLookup.php
lib/ReverseGeocode.php
lib/cmd.php
lib/db.php
lib/init-cmd.php
lib/init-website.php
lib/init.php
lib/lib.php
lib/log.php
lib/output.php
lib/template/address-html.php
lib/template/address-json.php
lib/template/address-jsonv2.php
lib/template/address-xml.php
lib/template/details-error-html.php
lib/template/details-html.php
lib/template/includes/html-footer.php
lib/template/includes/html-header.php
lib/template/includes/html-top-navigation.php
lib/template/includes/report-errors.php
lib/template/search-batch-json.php
lib/template/search-html.php
lib/template/search-json.php
lib/template/search-jsonv2.php
lib/template/search-xml.php
lib/website.php [deleted file]
phpcs.xml [new file with mode: 0644]
settings/defaults.php
settings/phrase_settings.php
settings/settings.php
tests-php/Nominatim/NominatimTest.php
tests-php/bootstrap.php
tests/features/api/regression.feature
tests/features/api/search.feature
tests/features/api/search_params.feature
utils/blocks.php
utils/country_languages.php
utils/importWikipedia.php
utils/import_wikipedia.sh
utils/imports.php
utils/query.php
utils/server_compare.php
utils/setup.php
utils/specialphrases.php
utils/update.php
utils/warm.php
vagrant/install-on-centos-7.sh
vagrant/install-on-travis-ci.sh
vagrant/install-on-ubuntu-16.sh
website/css/search.css
website/deletable.php
website/details.php
website/hierarchy.php
website/js/nominatim-ui.js
website/js/theme/default/style.css
website/lookup.php
website/polygons.php
website/reverse.php
website/search.php
website/status.php
wikidata/parse.php
wikidata/pull_wikipedia_logs.php

index 9d52ee663d1695ece083ed905806f21911e1ce26..68355663373496b681669903ed40459b8f941872 100644 (file)
@@ -18,7 +18,7 @@ are in process of consolodating the style. The following rules apply:
  * Python code uses the official Python style
  * indention
    * SQL use 2 spaces
-   * all other use files TABs
+   * all other file types use 4 spaces
    * [BSD style](https://en.wikipedia.org/wiki/Indent_style#Allman_style) for braces
  * spaces
    * spaces before and after equal signs and operators
@@ -27,7 +27,6 @@ are in process of consolodating the style. The following rules apply:
    * leave out space between a function name and bracket
      but add one between control statement(if, while, etc.) and bracket
 
-
 This coding style must be applied to any new or changed code. You are also
 welcome to fix the coding style of existing code but please submit separate
 PRs for this.
diff --git a/COPYING b/COPYING
index d511905c1647a1e311e8b20d5930a37a9c2531cd..d159169d1050894d3ea3b98e1c965c4058208fe1 100644 (file)
--- a/COPYING
+++ b/COPYING
@@ -1,12 +1,12 @@
-                   GNU GENERAL PUBLIC LICENSE
-                      Version 2, June 1991
+                    GNU GENERAL PUBLIC LICENSE
+                       Version 2, June 1991
 
  Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  Everyone is permitted to copy and distribute verbatim copies
  of this license document, but changing it is not allowed.
 
-                           Preamble
+                            Preamble
 
   The licenses for most software are designed to take away your
 freedom to share and change it.  By contrast, the GNU General Public
@@ -56,7 +56,7 @@ patent must be licensed for everyone's free use or not licensed at all.
   The precise terms and conditions for copying, distribution and
 modification follow.
 
-                   GNU GENERAL PUBLIC LICENSE
+                    GNU GENERAL PUBLIC LICENSE
    TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
 
   0. This License applies to any program or other work which contains
@@ -255,7 +255,7 @@ make exceptions for this.  Our decision will be guided by the two goals
 of preserving the free status of all derivatives of our free software and
 of promoting the sharing and reuse of software generally.
 
-                           NO WARRANTY
+                            NO WARRANTY
 
   11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
 FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
@@ -277,9 +277,9 @@ YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
 PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
 POSSIBILITY OF SUCH DAMAGES.
 
-                    END OF TERMS AND CONDITIONS
+                     END OF TERMS AND CONDITIONS
 
-           How to Apply These Terms to Your New Programs
+            How to Apply These Terms to Your New Programs
 
   If you develop a new program, and you want it to be of the greatest
 possible use to the public, the best way to achieve this is to make it
index 96d03a2e0ea5021cf18a69e3112077bddc19edf6..15d66e9ed72bfbb158edbbb90c8636ad29afbb8d 100644 (file)
@@ -14,7 +14,7 @@ Vagrant.configure("2") do |config|
       checkout = "no"
   end
 
-  config.vm.define "ubuntu" do |sub|
+  config.vm.define "ubuntu", primary: true do |sub|
       sub.vm.box = "bento/ubuntu-16.04"
       sub.vm.provision :shell do |s|
         s.path = "vagrant/install-on-ubuntu-16.sh"
index 352337a7ba9121753477a59928c58b7ef91ab83c..13efe7c18271c895021c786cb40d498f28909885 100644 (file)
@@ -3,6 +3,7 @@
 --
 
 SET statement_timeout = 0;
+SET lock_timeout = 0;
 SET client_encoding = 'UTF8';
 SET standard_conforming_strings = on;
 SET check_function_bodies = false;
@@ -14,10 +15,6 @@ SET default_tablespace = '';
 
 SET default_with_oids = false;
 
---
--- Name: country_name; Type: TABLE; Schema: public; Owner: brian; Tablespace: 
---
-
 CREATE TABLE country_name (
     country_code character varying(2),
     name hstore,
@@ -25,10 +22,6 @@ CREATE TABLE country_name (
     partition integer
 );
 
---
--- Data for Name: country_name; Type: TABLE DATA; Schema: public; Owner: brian
---
-
 COPY country_name (country_code, name, country_default_language_code, partition) FROM stdin;
 gb     "name"=>"United Kingdom", "name:af"=>"Verenigde Koninkryk", "name:ar"=>"المملكة المتحدة", "name:be"=>"Вялікабрытанія", "name:br"=>"Rouantelezh Unanet", "name:ca"=>"Regne Unit", "name:cy"=>"Y Deyrnas Unedig", "name:da"=>"Storbritannien", "name:de"=>"Vereinigtes Königreich", "name:el"=>"Ηνωμένο Βασίλειο", "name:eo"=>"Unuiĝinta Reĝlando", "name:es"=>"Gran Bretaña", "name:et"=>"Suurbritannia", "name:fa"=>"بریتانیا", "name:fi"=>"Yhdistynyt kuningaskunta", "name:fr"=>"Royaume-Uni", "name:fy"=>"Grut-Brittanje", "name:ga"=>"An Ríocht Aontaithe", "name:gd"=>"An Rìoghachd Aonaichte", "name:gv"=>"Reeriaght Unnaneysit", "name:he"=>"בריטניה", "name:hr"=>"Velika Britanija", "name:hu"=>"Nagy-Britannia", "name:hy"=>"Միացյալ Թագավորություն", "name:id"=>"Britania Raya", "name:is"=>"Bretland", "name:it"=>"Gran Bretagna", "name:ja"=>"イギリス", "name:la"=>"Britanniarum Regnum", "name:lb"=>"Groussbritannien an Nordirland", "name:li"=>"Vereineg Keuninkriek", "name:lt"=>"Jungtinė Karalystė", "name:mn"=>"Нэгдсэн Вант Улс", "name:nl"=>"Verenigd Koninkrijk", "name:no"=>"Storbritania", "name:pl"=>"Wielka Brytania", "name:pt"=>"Reino Unido", "name:ru"=>"Соединенное Королевство", "name:sk"=>"Spojené kráľovstvo", "name:sl"=>"Velika Britanija", "name:sv"=>"Storbritannien", "name:th"=>"สหราชอาณาจักร", "name:tr"=>"Birleşik Krallık", "name:uk"=>"Великобританія", "name:vi"=>"Liên hiệp Vương quốc Anh và Bắc Ireland", "name:zh"=>"英国", "alt_name"=>"United Kingdom; UK; Britain; Great Britain", "name:nds"=>"Vereenigd Königriek", "name:zh_py"=>"Yingguo", "name:zh_pyt"=>"Yīngguó", "official_name"=>"United Kingdom of Great Britain and Northern Ireland", "official_name:be"=>"Злучанае Каралеўства Вялікабрытаніі і Паўночнай Ірландыі", "official_name:br"=>"Rouantelezh Unanet Breizh-Veur ha Norzhiwerzhon", "official_name:el"=>"Ηνωμένο Βασίλειο της Μεγάλης Βρετανίας και της Βορείου Ιρλανδίας", "official_name:es"=>"Reino Unido de Gran Bretaña", "official_name:et"=>"Suurbritannia ja Põhja-Iiri Ühendkuningriik", "official_name:fr"=>"Royaume-Uni de Grande-Bretagne et d'Irlande du Nord", "official_name:id"=>"Perserikatan Kerajaan Britania Raya dan Irlandia Utara", "official_name:ja"=>"グレートブリテン及び北アイルランド連合王国", "official_name:lb"=>"Vereenegt Kinnekräich vu Groussbritannien an Nordirland", "official_name:pl"=>"Zjednoczone Królestwo Wielkiej Brytanii", "official_name:pt"=>"Reino Unido da Grã-Bretanha e Irlanda do Norte", "official_name:ru"=>"Соединенное Королевство Великобритании и Северной Ирландии", "official_name:sk"=>"Spojené kráľovstvo Veľkej Británie a Severného Írska", "official_name:sl"=>"Združeno kraljestvo Velike Britanije in Severne Irske", "official_name:sv"=>"Förenade konungariket Storbritannien och Nordirland"        en      1
 us     "name"=>"United States of America", "name:af"=>"Verenigde State van Amerika", "name:ar"=>"الولايات المتحدة الأمريكية", "name:be"=>"Злучаныя Штаты Амерыкі", "name:br"=>"Stadoù Unanet Amerika", "name:ca"=>"Estats Units d'Amèrica", "name:cy"=>"Unol Daleithiau America", "name:da"=>"USA", "name:de"=>"Vereinigte Staaten von Amerika", "name:el"=>"Ηνωμένες Πολιτείες της Αμερικής", "name:en"=>"United States of America", "name:eo"=>"Usono", "name:es"=>"Estados Unidos", "name:et"=>"Ameerika Ühendriigid", "name:fa"=>"ایالات متحده آمریکا", "name:fi"=>"Yhdysvallat", "name:fr"=>"États-Unis", "name:fy"=>"de Feriene Steaten fan Amearika", "name:ga"=>"Stáit Aontaithe Mheiriceá", "name:gd"=>"Na Stàitean Aonaichte", "name:he"=>"ארצות הברית של אמריקה", "name:hr"=>"Sjedinjene Američke Države", "name:hu"=>"Amerikai Egyesült Államok", "name:hy"=>"Ամերիկայի Միացյալ Նահանգներ", "name:id"=>"Amerika Serikat", "name:is"=>"Bandaríkin", "name:it"=>"Stati Uniti d'America", "name:ja"=>"アメリカ合衆国", "name:la"=>"Civitates Foederatae Americae", "name:lb"=>"Vereenegt Staate vun Amerika", "name:li"=>"Vereinegde State van Amerika", "name:lt"=>"Jungtinės Amerikos Valstijos", "name:mn"=>"Америкийн Нэгдсэн Улс", "name:nb"=>"USA", "name:nl"=>"Verenigde Staten van Amerika", "name:nn"=>"USA", "name:no"=>"USA", "name:pl"=>"Stany Zjednoczone Ameryki", "name:pt"=>"Estados Unidos", "name:ru"=>"Соединённые Штаты Америки", "name:sl"=>"Združene države Amerike", "name:sv"=>"USA", "name:th"=>"สหรัฐอเมริกา", "name:tr"=>"Amerika Birleşik Devletleri", "name:uk"=>"Сполучені Штати Америки", "name:vi"=>"Hoa Kỳ", "name:zh"=>"美国", "alt_name"=>"USA;US;The States", "name:zh_py"=>"Meiguo", "name:zh_pyt"=>"Měiguó", "official_name:fr"=>"États-Unis d'Amérique", "official_name:pt"=>"Estados Unidos da América", "official_name:sv"=>"Amerikas förenta stater", "official_name:vi"=>"Hợp chúng quốc Hoa Kỳ"        en      2
@@ -37,204 +30,162 @@ fr        "name"=>"France", "name:af"=>"Frankryk", "name:ar"=>"فرنسا", "name:az"=>
 ch     "name"=>"Switzerland", "name:af"=>"Switserland", "name:am"=>"ስዊዘርላንድ", "name:an"=>"Suiza", "name:ar"=>"سويسرا", "name:az"=>"İsveçrə", "name:be"=>"Швейцарыя", "name:bg"=>"Швейцария", "name:bo"=>"སུད་སི།", "name:br"=>"Suis", "name:bs"=>"Švicarska", "name:ca"=>"Suïssa", "name:cs"=>"Švýcarsko", "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: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:mk"=>"Швајцарија", "name:ml"=>"സ്വിറ്റ്സര്‍ലാന്റ്", "name:mn"=>"Швейцари", "name:mr"=>"स्वित्झर्लंड", "name:ms"=>"Switzerland", "name:na"=>"Switzerland", "name:ne"=>"स्विजरल्याण्ड", "name:nl"=>"Zwitserland", "name:nn"=>"Sveits", "name:no"=>"Sveits", "name:oc"=>"Soïssa", "name:os"=>"Швейцари", "name:pl"=>"Szwajcaria", "name:pt"=>"Suíça", "name:qu"=>"Suwisa", "name:rm"=>"Svizra", "name:ro"=>"Elveţia", "name:ru"=>"Швейцария", "name:sa"=>"स्विटजरलैंड", "name:se"=>"Šveica", "name:sk"=>"Švajčiarsko", "name:sl"=>"Švica", "name:so"=>"Iswiizerlaan", "name:sq"=>"Zvicra", "name:sr"=>"Швајцарска", "name:sv"=>"Schweiz", "name:sw"=>"Uswisi", "name:ta"=>"சுவிட்சர்லாந்து", "name:te"=>"స్విట్జర్లాండ్", "name:tg"=>"Швейтсария", "name:th"=>"ประเทศสวิตเซอร์แลนด์", "name:tl"=>"Suwisa", "name:tr"=>"İsviçre", "name:ug"=>"Shwétsariye", "name:uk"=>"Швейцарія", "name:ur"=>"سویٹزر لینڈ", "name:vi"=>"Thụy Sĩ", "name:vo"=>"Jveizän", "name:wo"=>"Suwis", "name:yi"=>"שווייץ", "name:zh"=>"瑞士", "name:als"=>"Schweiz", "name:ang"=>"Sƿissland", "name:arc"=>"ܣܘܝܣܪܐ", "name:arz"=>"سويسرا", "name:ast"=>"Suiza", "name:bar"=>"Schweiz", "name:bcl"=>"Suisa", "name:bpy"=>"সুইজারল্যান্ড", "name:ceb"=>"Swisa", "name:csb"=>"Szwajcarskô", "name:diq"=>"İswiçre", "name:dsb"=>"Šwicarska", "name:eml"=>"Svézzra", "name:frp"=>"Suisse", "name:fur"=>"Svuizare", "name:haw"=>"Kuikilani", "name:hif"=>"Switzerland", "name:hsb"=>"Šwicarska", "name:ilo"=>"Switzerland", "name:jbo"=>"elvetias", "name:ksh"=>"Shwäijz", "name:lad"=>"Suisa", "name:lij"=>"Svissëa", "name:lmo"=>"Svìzzera", "name:mdf"=>"Швейцария", "name:mhr"=>"Швейцарий", "name:nah"=>"Suiza", "name:nap"=>"Sguizzera", "name:nds"=>"Swiez", "name:nov"=>"Suisia", "name:nrm"=>"Suisse", "name:pag"=>"Switzerland", "name:pam"=>"Suiza", "name:pdc"=>"Schweiz", "name:pih"=>"Switsaland", "name:pms"=>"Svìssera", "name:pnt"=>"Ελβετία", "name:sah"=>"Швейцария", "name:scn"=>"Svìzzira", "name:sco"=>"Swisserland", "name:stq"=>"Swaits", "name:szl"=>"Szwajcaryjo", "name:tet"=>"Suisa", "name:udm"=>"Швейцария", "name:vec"=>"Svìzera", "name:war"=>"Swiza", "name:wuu"=>"瑞士", "name:xal"=>"Свисн Һазр", "name:zea"=>"Zwitserland", "name:zh_py"=>"Ruishi", "name:nds-nl"=>"Zwitserlaand", "name:simple"=>"Switzerland", "name:zh-yue"=>"瑞士", "name:zh_pyt"=>"Ruìshì", "name:bat-smg"=>"Šveicarėjė", "name:fiu-vro"=>"Sveits", "name:be-x-old"=>"Швейцарыя", "name:zh-min-nan"=>"Sūi-se", "official_name:de"=>"Schweizerische Eidgenossenschaft", "official_name:el"=>"Ελβετική Συνομοσπονδία", "official_name:en"=>"Swiss Confederation", "official_name:fr"=>"Confédération suisse", "official_name:id"=>"Konfederasi Swiss", "official_name:it"=>"Confederazione Svizzera", "official_name:ja"=>"スイス連邦", "official_name:la"=>"Confoederatio Helvetica", "official_name:lb"=>"Schwäizeresch Eidgenossenschaft", "official_name:rm"=>"Confederaziun svizra", "official_name:sk"=>"Švajčiarska konfederácia", "official_name:sv"=>"Schweiziska edsförbundet", "official_name:vi"=>"Liên bang Thụy Sĩ", "name:zh-classical"=>"瑞士"   \N      5
 ba     "name"=>"Bosna i Hercegovina", "name:af"=>"Bosnië-Herzegowina", "name:an"=>"Bosnia e Erzegobina", "name:ar"=>"البوسنة والهرسك", "name:az"=>"Bosniya və Herseqovina", "name:be"=>"Боснія і Герцагавіна", "name:bg"=>"Босна и Херцеговина", "name:bn"=>"বসনিয়া ও হার্জেগোভিনা", "name:br"=>"Bosnia-ha-Herzegovina", "name:bs"=>"Bosna i Hercegovina", "name:ca"=>"Bòsnia i Hercegovina", "name:cs"=>"Bosna a Hercegovina", "name:cu"=>"Босна́", "name:cv"=>"Босни тата Герцеговина", "name:cy"=>"Bosna a Hercegovina", "name:da"=>"Bosnien-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-Herzegovina", "name:fa"=>"بوسنی و هرزگووین", "name:fi"=>"Bosnia ja Hertsegovina", "name:fr"=>"Bosnie-Herzégovine", "name:fy"=>"Bosnje", "name:ga"=>"An Bhoisnia-Heirseagaivéin", "name:gd"=>"Bosna agus Heartsagobhana", "name:gl"=>"Bosnia e Hercegovina", "name:gn"=>"Vonia ha Hesegovina", "name:gv"=>"Bosnia as 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:is"=>"Bosnía og Hersegóvína", "name:it"=>"Bosnia-Erzegovina", "name:ja"=>"ボスニア・ヘルツェゴビナ", "name:jv"=>"Bosnia-Herzegovina", "name:ka"=>"ბოსნია და ჰერცეგოვინა", "name:kg"=>"Bosna", "name:kk"=>"Босния және Герцеговина", "name:kn"=>"ಬೊಸ್ನಿಯ ಮತ್ತು ಹೆರ್ಜೆಗೊವಿನ", "name:ko"=>"보스니아 헤르체고비나", "name:ks"=>"बास्निया", "name:ku"=>"Bosniya û Herzegovîna", "name:kv"=>"Босния да Герцеговина", "name:kw"=>"Bosni–Hercegovina", "name:la"=>"Bosnia et Herzegovina", "name:lb"=>"Bosnien-Herzegowina", "name:li"=>"Bosnië en Hercegovina", "name:ln"=>"Bosnia na Erzegovina", "name:lt"=>"Bosnija ir Hercogovina", "name:lv"=>"Bosnija un Hercegovina", "name:mk"=>"Босна и Херцеговина", "name:ml"=>"ബോസ്നിയ ഹെര്‍സെഗോവിന", "name:mn"=>"Босни-Герцеговин", "name:mr"=>"बॉस्निया आणि हर्झगोव्हिना", "name:ms"=>"Bosnia dan Herzegovina", "name:mt"=>"Bożnija u Ħerżegovina", "name:na"=>"Bosnia me Herzegowina", "name:ne"=>"बोस्निया र हर्जगोविना", "name:nl"=>"Bosnië en Herzegovina", "name:nn"=>"Bosnia-Hercegovina", "name:no"=>"Bosnia-Hercegovina", "name:oc"=>"Bòsnia e Ercegovina", "name:os"=>"Босни æмæ Герцеговинæ", "name:pl"=>"Bośnia i Hercegowina", "name:ps"=>"بوسنيا او هېرزګوينا", "name:pt"=>"Bósnia e Herzegovina", "name:qu"=>"Busna-Hirsiquwina", "name:rm"=>"Bosnia-Erzegovina", "name:ro"=>"Bosnia şi Herţegovina", "name:ru"=>"Босния и Герцеговина", "name:sa"=>"बास्निया", "name:se"=>"Bosnia ja Hercegovina", "name:sh"=>"Bosna i Hercegovina", "name:sk"=>"Bosna a Hercegovina", "name:sl"=>"Bosna in Hercegovina", "name:sq"=>"Bosnja dhe Hercegovina", "name:sr"=>"Босна и Херцеговина", "name:sv"=>"Bosnien och Hercegovina", "name:sw"=>"Bosnia na Herzegovina", "name:ta"=>"பொசுனியா எர்செகோவினா", "name:te"=>"బోస్నియా మరియు హెర్జెగొవీనా", "name:tg"=>"Босния ва Ҳерсеговина", "name:th"=>"ประเทศบอสเนียและเฮอร์เซโกวีนา", "name:tl"=>"Bosnia at Herzegovina", "name:tr"=>"Bosna Hersek", "name:ug"=>"بوسنىيە ۋە ھېرسېگوۋىنا", "name:uk"=>"Боснія і Герцеговина", "name:ur"=>"بوسنیا و ہرزیگووینا", "name:uz"=>"Bosniya va Gerzegovina", "name:vi"=>"Bosna và Hercegovina", "name:vo"=>"Bosnän e Härzegovän", "name:wo"=>"Bosni", "name:zh"=>"波斯尼亚和黑塞哥维纳", "name:als"=>"Bosnie-Herzegowina", "name:ang"=>"Bosnia and Herzegovina", "name:arc"=>"ܒܘܣܢܐ ܘܗܪܣܟ", "name:arz"=>"البوسنه و الهرسك", "name:ast"=>"Bosnia-Herzegovina", "name:bcl"=>"Bosnya asin Hersegobina", "name:bpy"=>"বসনিয়া বারো হার্জেগোভিনা", "name:ceb"=>"Bosnia ug Herzegovina", "name:chr"=>"ᏉᏍᏂᏯ", "name:crh"=>"Bosna ve Hersek", "name:csb"=>"Bòsnijô ë Hercegòwina", "name:diq"=>"Bosna-Hersek", "name:dsb"=>"Bosniska-Hercegowinska", "name:frp"=>"Bosnie-Hèrzègovena", "name:haw"=>"Bosenia me Hesegowina", "name:hif"=>"Bosnia and Herzegovina", "name:hsb"=>"Bosniska a Hercegowina", "name:lij"=>"Bòsnia-Erçegòvina", "name:lmo"=>"Bosnia e Erzegovina", "name:nah"=>"Bosna īhuān Hertzegovina", "name:nap"=>"Bosnia-Erzegovina", "name:nds"=>"Bosnien-Herzegowina", "name:nov"=>"Bosnia e Hertsegovina", "name:pam"=>"Bosnia and Herzegovina", "name:pap"=>"Bosnia Herzogovina", "name:pih"=>"Bosnya a' Hersegowinya", "name:pms"=>"Bòsnia e Erzegòvina", "name:pnb"=>"بوسنیا تے ہرزیگوونا", "name:pnt"=>"Βοσνία και Ερζεγοβίνη", "name:sah"=>"Босния уонна Херцеговина", "name:scn"=>"Bosnia-Erzegovina", "name:sco"=>"Bosnie an Herzegovinae", "name:srn"=>"Bosnikondre", "name:stq"=>"Bosnien un Herzegowina", "name:szl"=>"Bośńa a Hercegowina", "name:udm"=>"Босния но Герцеговина", "name:vec"=>"Bosnia e Erzegòvina", "name:war"=>"Bosnya ngan Hersegovina", "name:wuu"=>"波斯尼亚", "name:zh_py"=>"Bosiniya he Heisaigeweina", "name:simple"=>"Bosnia and Herzegovina", "name:zh-yue"=>"波斯尼亞", "name:zh_pyt"=>"Bōsīníyà hé Hēisāigēwéinà", "name:bat-smg"=>"Bosnėjė ėr Hercuogovėna", "name:fiu-vro"=>"Bosnia ja Hertsegoviina", "name:roa-rup"=>"Bosna shi Hertsegovina", "name:be-x-old"=>"Босьнія і Герцагавіна", "name:zh-min-nan"=>"Bosna kap Hercegovina", "official_name:id"=>"Republik Bosnia dan Herzegovina", "official_name:lv"=>"Bosnijas un Hercegovinas Republika", "official_name:pt"=>"República da Bósnia e Herzegovina"        \N      6
 fi     "name"=>"Suomi", "name:af"=>"Finland", "name:am"=>"ፊንላንድ", "name:an"=>"Finlandia", "name:ar"=>"فنلندا", "name:az"=>"Finlandiya", "name:be"=>"Фінляндыя", "name:bg"=>"Финландия", "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: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:io"=>"Finlando", "name:is"=>"Finnland", "name:it"=>"Finlandia", "name:ja"=>"フィンランド", "name:ka"=>"ფინეთი", "name:kk"=>"Финландия", "name:kl"=>"Finlandi", "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:mk"=>"Финска", "name:mn"=>"Финлянд", "name:ms"=>"Finland", "name:mt"=>"Finlandja", "name:na"=>"Finland", "name:ne"=>"फिनल्याण्ड", "name:nl"=>"Finland", "name:nn"=>"Finland", "name:no"=>"Finland", "name:oc"=>"Finlàndia", "name:os"=>"Финлянди", "name:pl"=>"Finlandia", "name:pt"=>"Finlândia", "name:qu"=>"Phinsuyu", "name:rm"=>"Finlanda", "name:ro"=>"Finlanda", "name:ru"=>"Финляндия", "name:sa"=>"फिन्लैंड", "name:sc"=>"Finlandia", "name:se"=>"Suopma", "name:sh"=>"Finska", "name:sk"=>"Fínsko", "name:sl"=>"Finska", "name:sm"=>"Finalagi", "name:so"=>"Finland", "name:sq"=>"Finlanda", "name:sr"=>"Финска", "name:sv"=>"Finland", "name:sw"=>"Ufini", "name:ta"=>"பின்லாந்து", "name:te"=>"ఫిన్లెండ్", "name:tg"=>"Финланд", "name:th"=>"ประเทศฟินแลนด์", "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:zh"=>"芬兰", "name:als"=>"Finnland", "name:ang"=>"Finnland", "name:arc"=>"ܦܢܠܢܕܐ", "name:ast"=>"Finlandia", "name:bar"=>"Finnlånd", "name:bcl"=>"Finlandya", "name:bpy"=>"ফিনল্যান্ড", "name:ceb"=>"Finlandia", "name:crh"=>"Finlandiya", "name:csb"=>"Fińskô", "name:diq"=>"Finlanda", "name:dsb"=>"Finska", "name:frp"=>"Finlande", "name:fur"=>"Finlande", "name:gan"=>"芬蘭", "name:hak"=>"Fûn-làn", "name:haw"=>"Pinilana", "name:hif"=>"Finland", "name:hsb"=>"Finska", "name:ilo"=>"Finlandia", "name:jbo"=>"finland", "name:ksh"=>"Finnlandt", "name:lij"=>"Finlandia", "name:lmo"=>"Finlandia", "name:mdf"=>"Суоми мастор", "name:mhr"=>"Суоми Эл", "name:myv"=>"Суоми Мастор", "name:nah"=>"Fintlālpan", "name:nds"=>"Finnland", "name:new"=>"फिनल्यान्ड", "name:nov"=>"Finlande", "name:nrm"=>"Fînlande", "name:pam"=>"Finland", "name:pih"=>"Finland", "name:pms"=>"Finlandia", "name:pnt"=>"Φινλανδία", "name:rmy"=>"Finland", "name:sah"=>"Финляндия", "name:scn"=>"Finlandia", "name:sco"=>"Finland", "name:stq"=>"Finlound", "name:szl"=>"Finlandyjo", "name:tet"=>"Finlándia", "name:tpi"=>"Pinlan", "name:udm"=>"Финляндия", "name:vec"=>"Finlandia", "name:vls"=>"Finland", "name:war"=>"Finlandya", "name:zea"=>"Finland", "name:zh_py"=>"Fenlan", "name:nds-nl"=>"Finlaand", "name:zh_pyt"=>"Fēnlán", "name:bat-smg"=>"Soumėjė", "name:fiu-vro"=>"Soomõ", "name:roa-rup"=>"Finlanda", "official_name"=>"Suomen tasavalta", "name:zh-min-nan"=>"Suomi", "official_name:be"=>"Фінляндская Рэспубліка", "official_name:da"=>"Repbulikken Finland", "official_name:de"=>"Republik Finnland", "official_name:el"=>"Δημοκρατία της Φινλανδίας", "official_name:en"=>"Republic of Finland", "official_name:es"=>"República de Finlandia", "official_name:et"=>"Soome Vabariik", "official_name:fi"=>"Suomen tasavalta", "official_name:fr"=>"République de Finlande", "official_name:id"=>"Republik Finlandia", "official_name:is"=>"Lýðveldið Finnland", "official_name:it"=>"Repubblica di Finlandia", "official_name:ja"=>"フィンランド共和国", "official_name:lt"=>"Suomijos Respublika", "official_name:nn"=>"Republikken Finland", "official_name:no"=>"Republikken Finland", "official_name:pt"=>"República da Finlândia", "official_name:ru"=>"Финляндская Республика", "official_name:sk"=>"Fínska republika", "official_name:sv"=>"Republiken Finland", "official_name:vi"=>"Cộng hòa Phần Lan"    \N      20
-ge     "name"=>"Georgia / საქართველო", "name:ab"=>"Қырҭтәыла Аҳәынҭқарра", "name:af"=>"Georgië", "name:an"=>"Cheorchia", "name:ar"=>"جورجيا", "name:av"=>"Гуржи", "name:az"=>"Gürcüstan", "name:be"=>"Грузія", "name:bg"=>"Грузия", "name:bn"=>"জর্জিয়া", "name:br"=>"Jorjia", "name:bs"=>"Gruzija", "name:ca"=>"Geòrgia", "name:cs"=>"Gruzie", "name:cu"=>"Гєѡргі́ꙗ", "name:cv"=>"Грузи", "name:cy"=>"Georgia", "name:da"=>"Georgien", "name:de"=>"Georgien", "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", "name:fr"=>"Géorgie", "name:fy"=>"Geörgje", "name:ga"=>"An tSeoirsia", "name:gd"=>"Gruisia", "name:gl"=>"Xeorxia", "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"=>"Georgia", "name:is"=>"Georgía", "name:it"=>"Georgia", "name:ja"=>"グルジア", "name:jv"=>"Georgia", "name:ka"=>"საქართველო", "name:kk"=>"Гүржістан", "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:mk"=>"Грузија", "name:ml"=>"ജോര്‍ജ്ജിയ", "name:mn"=>"Гүрж", "name:mr"=>"जॉर्जिया", "name:ms"=>"Georgia", "name:mt"=>"Ġeorġja", "name:na"=>"Georgia", "name:nl"=>"Georgië", "name:nn"=>"Georgia", "name:no"=>"Georgia", "name:oc"=>"Georgia", "name:os"=>"Гуырдзыстон", "name:pl"=>"Gruzja", "name:ps"=>"جيورجيا", "name:pt"=>"Geórgia", "name:qu"=>"Kartulsuyu", "name:ro"=>"Georgia", "name:ru"=>"Грузия", "name:se"=>"Georgia", "name:sh"=>"Gruzija", "name:sk"=>"Gruzínsko", "name:sl"=>"Gruzija", "name:sq"=>"Gjeorgjia", "name:sr"=>"Грузија", "name:sv"=>"Georgien", "name:sw"=>"Georgia", "name:ta"=>"சியார்சியா", "name:te"=>"జార్జియా", "name:tg"=>"Гурҷистон", "name:th"=>"ประเทศจอร์เจีย", "name:tk"=>"Gruziýa", "name:tl"=>"Georgia", "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:yo"=>"Georgia", "name:zh"=>"乔治亚", "name:als"=>"Georgie", "name:arc"=>"ܓܘܪܓܝܐ", "name:arz"=>"جورجيا", "name:ast"=>"Xorxa", "name:ceb"=>"Georgia", "name:crh"=>"Gürcistan", "name:csb"=>"Grëzóńskô", "name:diq"=>"Gurcıstan", "name:dsb"=>"Georgiska", "name:frp"=>"Jôrg·ie", "name:haw"=>"Keokia", "name:hif"=>"Georgia", "name:hsb"=>"Georgiska", "name:ilo"=>"Georgia", "name:ksh"=>"Gejorgije", "name:lij"=>"Geòrgia", "name:lmo"=>"Georgia", "name:mzn"=>"گورجئون", "name:nds"=>"Georgien", "name:new"=>"ज्योर्जिया", "name:nov"=>"Georgia", "name:pam"=>"Georgia", "name:pih"=>"Jorja", "name:pms"=>"Geòrgia", "name:pnt"=>"Γρουζία", "name:sah"=>"Грузия", "name:scn"=>"Giorgia", "name:sco"=>"Georgie", "name:szl"=>"Gruzyjo", "name:udm"=>"Грузия", "name:war"=>"Georgia", "name:wuu"=>"格鲁吉亚", "name:xal"=>"Гүрҗмүдн Орн Нутг", "name:zea"=>"Georhië", "name:zh_py"=>"Qiaozhiya", "name:simple"=>"Georgia", "name:zh-yue"=>"格魯吉亞", "name:zh_pyt"=>"Qiáozhìyà", "name:bat-smg"=>"Grozėjė", "name:fiu-vro"=>"Gruusia", "name:be-x-old"=>"Грузія", "name:zh-min-nan"=>"Sakartvelo", "official_name:pt"=>"República da Geórgia"   \N      21
-gr     "name"=>"Ελλάδα", "name:af"=>"Griekeland", "name:am"=>"ግሪክ", "name:an"=>"Grezia", "name:ar"=>"اليونان", "name:az"=>"Yunanıstan", "name:be"=>"Грэцыя", "name:bg"=>"Гърция", "name:bn"=>"গ্রীস", "name:bo"=>"ཧི་ལ།", "name:br"=>"Gres", "name:bs"=>"Grčka", "name:ca"=>"Grècia", "name:ce"=>"Джелтимохк", "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: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:kk"=>"Грекия", "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:mk"=>"Грција", "name:ml"=>"ഗ്രീസ്", "name:mn"=>"Грек", "name:mr"=>"ग्रीस", "name:ms"=>"Greece", "name:mt"=>"Greċja", "name:na"=>"Greece", "name:ne"=>"ग्रीस", "name:nl"=>"Griekenland", "name:nn"=>"Hellas", "name:no"=>"Hellas", "name:oc"=>"Grècia", "name:os"=>"Грекъ", "name:pl"=>"Grecja", "name:ps"=>"يونان", "name:pt"=>"Grécia", "name:qu"=>"Grisya", "name:rm"=>"Grezia", "name:ro"=>"Grecia", "name:ru"=>"Греция", "name:rw"=>"Ubugereki", "name:sa"=>"ग्रीस", "name:se"=>"Greika", "name:sh"=>"Grčka", "name:sk"=>"Grécko", "name:sl"=>"Grčija", "name:so"=>"Giriig", "name:sq"=>"Greqia", "name:sr"=>"Грчка", "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"=>"IGrisi", "name:als"=>"Griecheland", "name:ang"=>"Crecaland", "name:arc"=>"ܝܘܢ", "name:arz"=>"اليونان", "name:ast"=>"Grecia", "name:bar"=>"Griachaland", "name:bcl"=>"Gresya", "name:bpy"=>"গ্রীস", "name:ceb"=>"Gresya", "name:crh"=>"Yunanistan", "name:csb"=>"Greckô", "name:diq"=>"Yunanıstan", "name:dsb"=>"Grichiska", "name:ext"=>"Grécia", "name:frp"=>"Grèce", "name:fur"=>"Grecie", "name:gan"=>"希臘", "name:hak"=>"Hî-lia̍p", "name:haw"=>"Helene", "name:hif"=>"Greece", "name:hsb"=>"Grjekska", "name:ilo"=>"Grecia", "name:jbo"=>"xesygu'e", "name:lad"=>"Gresia", "name:lij"=>"Greçia", "name:lmo"=>"Grecia", "name:mdf"=>"Грекмастор", "name:mhr"=>"Греций", "name:nah"=>"Grecia", "name:nap"=>"Gracia", "name:nds"=>"Grekenland", "name:nov"=>"Grekia", "name:nrm"=>"Grêce", "name:pam"=>"Greece", "name:pih"=>"Griese", "name:pms"=>"Grecia", "name:pnt"=>"Ελλάδα", "name:sah"=>"Греция", "name:scn"=>"Grecia", "name:sco"=>"Greece", "name:stq"=>"Griechenlound", "name:szl"=>"Grecyjo", "name:tet"=>"Grésia", "name:tpi"=>"Gris", "name:udm"=>"Греция", "name:vec"=>"Gresia", "name:war"=>"Gresya", "name:wuu"=>"希腊", "name:xal"=>"Эллинмүдн Орн Нутг", "name:zh_py"=>"Xila", "name:nds-nl"=>"Griekenlaand", "name:simple"=>"Greece", "name:zh-yue"=>"希臘", "name:zh_pyt"=>"Xīlà", "name:bat-smg"=>"Graikėjė", "name:fiu-vro"=>"Kreeka", "name:roa-rup"=>"Gãrtsia", "name:be-x-old"=>"Грэцыя", "official_name"=>"Ελληνική Δημοκρατία", "name:zh-min-nan"=>"Hi-lia̍p", "official_name:am"=>"የግሪክ ዲሞክራሲ", "official_name:br"=>"Republik hellenek", "official_name:et"=>"Kreeka Vabariik", "official_name:id"=>"Republik Hellenik", "official_name:it"=>"Repubblica Ellenica", "official_name:ja"=>"ギリシャ共和国", "official_name:lb"=>"Hellenesch Republik", "official_name:lt"=>"Graikijos Respublika", "official_name:pt"=>"República Helênica", "official_name:sk"=>"Grécka republika", "official_name:sv"=>"Republiken Grekland", "official_name:vi"=>"Cộng hòa Hy Lạp", "name:zh-classical"=>"希臘共和國" \N      22
-ma     "name"=>"Maroc", "name:af"=>"Marokko", "name:am"=>"ሞሮኮ", "name:an"=>"Marruecos", "name:ar"=>"المغرب", "name:az"=>"Mərakeş", "name:be"=>"Марока", "name:bg"=>"Мароко", "name:bm"=>"Maroko", "name:bn"=>"মরোক্কো", "name:bo"=>"མའེ་ལོ་ཀོ", "name:br"=>"Maroko", "name:bs"=>"Maroko", "name:ca"=>"Marroc", "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:ia"=>"Morocco", "name:id"=>"Maroko", "name:ie"=>"Morocco", "name:io"=>"Maroko", "name:is"=>"Marrokkó", "name:it"=>"Marocco", "name:ja"=>"モロッコ", "name:jv"=>"Maroko", "name:ka"=>"მაროკო", "name:kg"=>"Magribia", "name:kk"=>"Мағрибия", "name:kn"=>"ಮೊರಾಕೊ", "name:ko"=>"모로코", "name:ks"=>"मोराको", "name:ku"=>"Maroko", "name:kw"=>"Marokk", "name:la"=>"Marocum", "name:lb"=>"Marokko", "name:li"=>"Marokko", "name:ln"=>"Marɔkɛ", "name:lt"=>"Marokas", "name:lv"=>"Maroka", "name:mk"=>"Мароко", "name:ml"=>"മൊറോക്കൊ", "name:mn"=>"Марокко", "name:mr"=>"मोरोक्को", "name:ms"=>"Maghribi", "name:mt"=>"Marokk", "name:nl"=>"Marokko", "name:nn"=>"Marokko", "name:no"=>"Marokko", "name:oc"=>"Marròc", "name:os"=>"Марокко", "name:pl"=>"Maroko", "name:ps"=>"ماراکو", "name:pt"=>"Marrocos", "name:qu"=>"Maruku", "name:ro"=>"Maroc", "name:ru"=>"Марокко", "name:sa"=>"मोराको", "name:sc"=>"Marocu", "name:se"=>"Marokko", "name:sh"=>"Maroko", "name:sk"=>"Maroko", "name:sl"=>"Maroko", "name:so"=>"Maroc", "name:sq"=>"Maroku", "name:sr"=>"Мароко", "name:sv"=>"Marocko", "name:sw"=>"Moroko", "name:ta"=>"மொரோக்கோ", "name:te"=>"మొరాకో", "name:tg"=>"Марокаш", "name:th"=>"ประเทศโมร็อกโก", "name:ti"=>"ሞሮኮ", "name:tl"=>"Morocco", "name:tr"=>"Fas", "name:ts"=>"Morocco", "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:ace"=>"Maroko", "name:ang"=>"Morocco", "name:arc"=>"ܡܓܪܒ", "name:arz"=>"المغرب", "name:ast"=>"Marruecos", "name:bcl"=>"Moroko", "name:bpy"=>"মরক্কো", "name:ceb"=>"Morocco", "name:crh"=>"Mağrip", "name:diq"=>"Fas", "name:ext"=>"Marruecus", "name:frp"=>"Maroc", "name:haw"=>"Moloko", "name:hif"=>"Morocco", "name:hsb"=>"Marokko", "name:ilo"=>"Morocco", "name:jbo"=>"morgu'e", "name:kab"=>"Merruk", "name:lad"=>"Marroko", "name:lij"=>"Maròcco", "name:lmo"=>"Maroch", "name:nah"=>"Marruecos", "name:nds"=>"Marokko", "name:nov"=>"Moroko", "name:pam"=>"Morocco", "name:pms"=>"Maròch", "name:pnb"=>"مراکش", "name:sah"=>"Марокко", "name:scn"=>"Maroccu", "name:stq"=>"Marokko", "name:szl"=>"Maroko", "name:vec"=>"Maroco", "name:war"=>"Morocco", "name:zea"=>"Marokko", "name:zh_py"=>"Moluoge", "name:simple"=>"Morocco", "name:zh-yue"=>"摩洛哥", "name:zh_pyt"=>"Móluògē", "name:bat-smg"=>"Maruoks", "name:be-x-old"=>"Марока", "official_name"=>"المملكة المغربية", "name:zh-min-nan"=>"Morocco", "official_name:be"=>"Каралеўства Марока", "official_name:br"=>"Rouantelezh Maroko", "official_name:el"=>"Βασίλειο του Μαρόκου", "official_name:en"=>"Kingdom of Morocco", "official_name:et"=>"Maroko Kuningriik", "official_name:fr"=>"Royaume du Maroc", "official_name:id"=>"Kerajaan Maroko", "official_name:lb"=>"Kinnekräich Marokko", "official_name:lt"=>"Maroko Karalystė", "official_name:lv"=>"Marokas Karaliste", "official_name:sv"=>"Konungariket Marocko", "official_name:vi"=>"Vương quốc Maroc"    \N      23
-sr     "name"=>"Suriname", "name:ar"=>"سورينام", "name:be"=>"Сурынам", "name:br"=>"Surinam", "name:ca"=>"Surinam", "name:da"=>"Surinam", "name:el"=>"Σουρινάμ", "name:en"=>"Suriname", "name:eo"=>"Surinamo", "name:es"=>"Surinam", "name:fa"=>"سورینام", "name:fi"=>"Suriname", "name:fr"=>"Suriname", "name:ga"=>"Suranam", "name:gd"=>"Suranam", "name:he"=>"סורינאם", "name:hr"=>"Surinam", "name:hu"=>"Suriname", "name:hy"=>"Սուրինամ", "name:is"=>"Súrínam", "name:ja"=>"スリナム", "name:la"=>"Surinamia", "name:lt"=>"Surinamas", "name:mn"=>"Суринам", "name:pl"=>"Surinam", "name:ru"=>"Суринам", "name:sl"=>"Surinam", "name:sv"=>"Surinam", "name:th"=>"ประเทศซูรินาเม", "name:tr"=>"Surinam", "name:uk"=>"Суринам", "name:zh"=>"苏里南", "official_name"=>"Republiek van Suriname", "official_name:be"=>"Рэспубліка Сурынам", "official_name:el"=>"Δημοκρατία του Σουρινάμ", "official_name:en"=>"Republic of Suriname", "official_name:es"=>"República de Surinam", "official_name:id"=>"Republik Suriname", "official_name:lb"=>"Republik Suriname", "official_name:lt"=>"Surinamo Respublika", "official_name:pl"=>"Republika Surinam", "official_name:sv"=>"Republiken Surinam" \N      24
-ar     "name"=>"Argentina", "name:af"=>"Argentinië", "name:ar"=>"الأرجنتين", "name:be"=>"Аргенціна", "name:br"=>"Arc’hantina", "name:cy"=>"Yr Ariannin", "name:de"=>"Argentinien", "name:el"=>"Αργεντινή", "name:en"=>"Argentina", "name:eo"=>"Argentino", "name:fa"=>"آرژانتین", "name:fi"=>"Argentiina", "name:fr"=>"Argentine", "name:fy"=>"Argentynje", "name:ga"=>"An Airgintín", "name:gd"=>"An Argantain", "name:he"=>"ארגנטינה", "name:hu"=>"Argentína", "name:hy"=>"Արգենտինա", "name:is"=>"Argentína", "name:it"=>"Argentina", "name:ja"=>"アルゼンチン", "name:lb"=>"Argentinien", "name:li"=>"Argentinië", "name:lv"=>"Argentīna", "name:mn"=>"Аргентин", "name:nl"=>"Argentinië", "name:pl"=>"Argentyna", "name:pt"=>"Argentina", "name:ru"=>"Аргентина", "name:sl"=>"Argentina", "name:sv"=>"Argentina", "name:th"=>"ประเทศอาร์เจนตินา", "name:tr"=>"Arjantin", "name:uk"=>" Аргентина", "name:zh"=>"阿根廷", "name:haw"=>"‘Alekina", "official_name"=>"República Argentina", "official_name:el"=>"Δημοκρατία της Αργεντινής", "official_name:en"=>"Argentine Republic", "official_name:fi"=>"Argentiinan tasavalta", "official_name:fr"=>"République argentine", "official_name:id"=>"Republik Argentina", "official_name:lb"=>"Republik Argentinien", "official_name:lt"=>"Argentinos Respublika", "official_name:lv"=>"Argentīnas Republika", "official_name:pl"=>"Republika Argentyńska", "official_name:pt"=>"República Argentina", "official_name:sv"=>"Republiken Argentina", "official_name:vi"=>"Cộng hòa Argentina" \N      39
 by     "name"=>"Беларусь", "name:af"=>"Wit-Rusland", "name:am"=>"ቤላሩስ", "name:an"=>"Belarrusia", "name:ar"=>"بيلاروس", "name:az"=>"Belorusiya", "name:be"=>"Беларусь", "name:bg"=>"Беларус", "name:bn"=>"বেলারুশ", "name:br"=>"Belarus", "name:bs"=>"Bjelorusija", "name:ca"=>"Bielorússia", "name:ce"=>"Белороссе", "name:cs"=>"Bělorusko", "name:cu"=>"Бѣла́ Роу́сь", "name:cv"=>"Белоруси", "name:cy"=>"Belarws", "name:da"=>"Hviderusland", "name:de"=>"Weißrussland", "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: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: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"=>"Belarus", "name:ka"=>"ბელარუსი", "name:kg"=>"Belarusia", "name:kk"=>"Беларус", "name:kn"=>"ಬೆಲಾರುಸ್", "name:ko"=>"벨라루스", "name:ku"=>"Bêlarû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:mk"=>"Белорусија", "name:ml"=>"ബെലാറസ്", "name:mn"=>"Беларусь", "name:mr"=>"बेलारूस", "name:ms"=>"Belarus", "name:mt"=>"Belarus", "name:na"=>"Belarus", "name:ne"=>"बेलारुस", "name:nl"=>"Wit-Rusland", "name:nn"=>"Kviterussland", "name:no"=>"Hviterussland", "name:oc"=>"Bielorussia", "name:os"=>"Белорусси", "name:pl"=>"Białoruś", "name:ps"=>"بېلاروسيه", "name:pt"=>"Bielorrússia", "name:qu"=>"Bilarus", "name:rm"=>"Bielorussia", "name:ro"=>"Belarus", "name:ru"=>"Беларусь", "name:sa"=>"बेलारूस", "name:se"=>"Vilges-Ruošša", "name:sh"=>"Belorusija", "name:sk"=>"Bielorusko", "name:sl"=>"Belorusija", "name:sq"=>"Bjellorusia", "name:sr"=>"Белорусија", "name:sv"=>"Vitryssland", "name:sw"=>"Belarus", "name:ta"=>"பெலருஸ்", "name:te"=>"బెలారస్", "name:tg"=>"Беларус", "name:th"=>"ประเทศเบลารุส", "name:tk"=>"Belarus", "name:tl"=>"Belarus", "name:tr"=>"Beyaz Rusya", "name:tt"=>"Беларусия", "name:ug"=>"بېلورۇسسىيە", "name:uk"=>"Білорусь", "name:ur"=>"بیلارس", "name:uz"=>"Belarus", "name:vi"=>"Belarus", "name:vo"=>"Belarusän", "name:wo"=>"Belaarus", "name:yi"=>"בעלארוס", "name:zh"=>"白俄罗斯", "name:als"=>"Wiissrussland", "name:ang"=>"Belarus", "name:arc"=>"ܒܠܪܘܣ", "name:ast"=>"Bielorrusia", "name:bcl"=>"Belarus", "name:bpy"=>"বেলারুস", "name:bxr"=>"Белорос", "name:ceb"=>"Belarus", "name:chr"=>"ᏇᎳᎷᏒ", "name:crh"=>"Belarus", "name:csb"=>"Biôłorëskô", "name:diq"=>"Belarus", "name:dsb"=>"Běłoruska", "name:frp"=>"Bièlorussie", "name:hak"=>"Pha̍k-ngò-lò-sṳ̂", "name:haw"=>"Belarusa", "name:hif"=>"Belarus", "name:hsb"=>"Běłoruska", "name:ilo"=>"Belarus", "name:jbo"=>"belrus", "name:lij"=>"Bieloruscia", "name:nah"=>"Belarus", "name:nds"=>"Wittrussland", "name:new"=>"बेलारुस", "name:nov"=>"Belarus", "name:pam"=>"Belarus", "name:pih"=>"Belerus", "name:pms"=>"Bielorussia", "name:pnb"=>"بیلارس", "name:rmy"=>"Belarus", "name:sah"=>"Беларусь", "name:scn"=>"Bielorussia", "name:sco"=>"Belaroushie", "name:szl"=>"Bjołoruś", "name:tpi"=>"Belaras", "name:udm"=>"Белоруссия", "name:vec"=>"Biełorusia", "name:war"=>"Bielorrusya", "name:wuu"=>"白俄罗斯", "name:xal"=>"Цаганoрсн Орн Нутг", "name:de_CH"=>"Weissrussland", "name:zh_py"=>"Baieluosi", "name:nds-nl"=>"Wit-Ruslaand", "name:simple"=>"Belarus", "name:zh-yue"=>"白俄羅斯", "name:zh_pyt"=>"Báiéluósī", "name:bat-smg"=>"Baltarosėjė", "name:fiu-vro"=>"Valgõvinne", "name:roa-rup"=>"Arusia albã", "name:be-x-old"=>"Беларусь", "official_name"=>"Рэспубліка Беларусь", "name:zh-min-nan"=>"Belarus", "official_name:be"=>"Рэспубліка Беларусь", "official_name:br"=>"Republik Belarus", "official_name:el"=>"Δημοκρατία της Λευκορωσίας", "official_name:en"=>"Republic of Belarus", "official_name:es"=>"República de Belarús", "official_name:et"=>"Valgevene Vabariik", "official_name:id"=>"Republik Belarus", "official_name:lv"=>"Baltkrievijas Republika", "official_name:pl"=>"Republika Białoruska", "official_name:pt"=>"República da Bielorrússia", "official_name:ru"=>"Республика Беларусь", "official_name:sk"=>"Bieloruská republika", "official_name:sv"=>"Republiken Vitryssland", "official_name:vi"=>"Cộng hòa Belarus"     \N      40
 ck     "name"=>"Cook Islands", "name:af"=>"Cookeilande", "name:ar"=>"جزر كوك", "name:be"=>"Астравы Кука", "name:br"=>"Inizi Cook", "name:ca"=>"Illes Cook", "name:cy"=>"Ynysoedd Cook", "name:da"=>"Cook-øerne", "name:de"=>"Cookinseln", "name:el"=>"Νήσοι Κουκ", "name:en"=>"Cook Islands", "name:eo"=>"Kukinsuloj", "name:es"=>"Islas Cook", "name:et"=>"Cooki saared", "name:eu"=>"Cook Uharteak", "name:fa"=>"جزایر کوک", "name:fi"=>"Cookinsaaret", "name:fr"=>"Îles Cook", "name:fy"=>"de Cookeilannen", "name:ga"=>"Oileáin Cook", "name:he"=>"איי קוק", "name:hr"=>"Cookovi otoci", "name:hu"=>"Cook-szigetek", "name:id"=>"Kepulauan Cook", "name:is"=>"Cooks-eyjar", "name:it"=>"Isole Cook", "name:la"=>"Insulae Cook", "name:lb"=>"Cookinseln", "name:lt"=>"Kuko salos", "name:lv"=>"Kuka salas", "name:mn"=>"Күүкийн Арлууд", "name:nl"=>"Cookeilanden", "name:pl"=>"Wyspy Cooka", "name:ru"=>"Острова Кука", "name:sl"=>"Cookovo otočje", "name:sv"=>"Cooköarna", "name:th"=>"หมู่เกาะคุก", "name:tr"=>"Cook Adaları", "name:uk"=>"Острови Кука", "name:vi"=>"Quần đảo Cook", "name:zh"=>"库克群岛", "name:rar"=>"Kūki 'Āirani"       \N      41
-gs     "name"=>"South Georgia and South Sandwich Islands", "name:af"=>"Suid-Georgië en die Suidelike Sandwich-eilande", "name:ar"=>"جزر جورجيا الجنوبية وساندويتش الجنوبية", "name:be"=>"Паўднёвая Георгія і Паўднёвыя Сэндвічавы астравы", "name:bg"=>"Южна Джорджия и Южни Сандвичеви острови", "name:br"=>"Jorjia 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"=>"Sydgeorgien og Sydsandwichøerne", "name:de"=>"Südgeorgien und die Südlichen Sandwichinseln", "name:el"=>"Νότιος Γεωργία και Νότιοι Σάντουιτς Νήσοι", "name:en"=>"South Georgia and 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:fr"=>"Géorgie du Sud-et-les Îles Sandwich du Sud", "name:fy"=>"Súd-Geörgje 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: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 meridionali", "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:mr"=>"साउथ जॉर्जिया व साउथ सँडविच द्वीपसमूह", "name:ms"=>"Georgia Selatan dan Kepulauan Sandwich Selatan", "name:nl"=>"Zuid-Georgië 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 Sandwich do Sul", "name:ro"=>"Georgia de Sud şi Insulele Sandwich de Sud", "name:ru"=>"Южная Джорджия и Южные Сандвичевы острова", "name:se"=>"Lulli Georgia ja Lulli Sandwich-sullot", "name:sl"=>"Južna Georgia 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"=>"南喬治亞島與南桑威奇群島", "name:dsb"=>"Pódpołdnjowa Georgiska a kupy Pódpołdnjowy Sandwich", "name:lij"=>"Geòrgia do Sud e isoe Sandwich meridionæ", "name:nov"=>"Sud Georgia e li Sud Sandwich Isles", "name:sah"=>"Соҕуруу Георгия уонна Соҕуруу Сэндуич арыылара", "name:simple"=>"South Georgia and the South Sandwich Islands", "name:be-x-old"=>"Паўднёвая Георгія і Паўднёвыя Сэндвічавыя выспы"    \N      44
-kp     "name"=>"북조선", "name:af"=>"Noord-Korea", "name:an"=>"Corea d'o Norte", "name:ar"=>"كوريا الشمالية", "name:az"=>"Şimali Koreya", "name:be"=>"Паўночная Карэя", "name:bg"=>"Северна Корея", "name:bn"=>"উত্তর কোরিয়া", "name:bo"=>"བྱང་ཀོ་རི་ཡ།", "name:br"=>"Korea an Norzh", "name:bs"=>"Sjeverna Koreja", "name:ca"=>"Corea del Nord", "name:cs"=>"Severní Korea", "name:cy"=>"Gogledd Corea", "name:da"=>"Nordkorea", "name:de"=>"Nordkorea", "name:dv"=>"އުތުރު ކޮރެއާ", "name:dz"=>"བྱང་ཀོ་རི་ཡ་", "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-Korea", "name:ga"=>"An Chóiré Thuaidh", "name:gd"=>"Coirea a Tuath", "name:gl"=>"Corea do Norte", "name:gv"=>"Yn Chorea Twoaie", "name:he"=>"קוריאה הצפונית", "name:hi"=>"उत्तर कोरिया", "name:hr"=>"Sjeverna Koreja", "name:ht"=>"Kore dinò", "name:hu"=>"Észak-Korea", "name:hy"=>"Հյուսիսային Կորեա", "name:ia"=>"Corea del Nord", "name:id"=>"Korea Utara", "name:ie"=>"Nord-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:kk"=>"Солтүстік Корея", "name:kn"=>"ಉತ್ತರ ಕೊರಿಯಾ", "name:ku"=>"Korêya Bakur", "name:kv"=>"Корея Войтыр Демократия Республика", "name:kw"=>"Korea Gledh", "name:la"=>"Corea Septentrionalis", "name:lb"=>"Nordkorea", "name:li"=>"Noord-Korea", "name:lt"=>"Šiaurės Korėja", "name:lv"=>"Ziemeļkoreja", "name:mg"=>"Korea Avaratra", "name:mk"=>"Северна Кореја", "name:ml"=>"ഉത്തര കൊറിയ", "name:mn"=>"Хойд Солонгос", "name:mr"=>"उत्तर कोरिया", "name:ms"=>"Korea Utara", "name:na"=>"Republik Engame Korea", "name:nl"=>"Noord-Korea", "name:nn"=>"Nord-Korea", "name:no"=>"Nord-Korea", "name:oc"=>"Corèa del Nòrd", "name:os"=>"Цæгат Корей", "name:pl"=>"Korea Północna", "name:ps"=>"د کوريا ولسواک خلق جمهوريت", "name:pt"=>"Coreia do Norte", "name:qu"=>"Chinchay Kuriya", "name:ro"=>"Coreea de Nord", "name:ru"=>"Северная Корея", "name:se"=>"Davvi-Korea", "name:sh"=>"Sjeverna Koreja", "name:sk"=>"Severná Kórea", "name:sl"=>"Severna Koreja", "name:sq"=>"Koreja e Veriut", "name:sr"=>"Северна Кореја", "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:ug"=>"شىمالىي چاۋشيەن", "name:uk"=>"Північна Корея", "name:ur"=>"شمالی کوریا", "name:uz"=>"Shimoliy Korea", "name:vi"=>"Triều Tiên", "name:vo"=>"Nolüda-Koreyän", "name:wo"=>"Kore gu Bëj-gànnaar", "name:yi"=>"צפון קארעע", "name:zh"=>"朝鲜", "name:als"=>"Nordkorea", "name:ast"=>"Corea del Norte", "name:bcl"=>"North Korea", "name:bpy"=>"ঔয়াং কোরিয়া", "name:ceb"=>"Amihanang Korea", "name:crh"=>"Şimaliy Koreya", "name:csb"=>"Nordowô Kòreja", "name:diq"=>"Korya Zımey", "name:dsb"=>"Pódpołnocna Koreja", "name:frp"=>"Corê du Nord", "name:hak"=>"Tsêu-siên Mìn-tsú Tsú-ngi Ngìn-mìn Khiung-fò-koet", "name:haw"=>"Kōlea ʻĀkau", "name:hsb"=>"Sewjerna Koreja", "name:jbo"=>"berti zei .xanguk", "name:lad"=>"Korea del Nord", "name:lmo"=>"Corea del Nòrd", "name:nah"=>"Corea Mictlāmpa", "name:nds"=>"Noordkorea", "name:nov"=>"Nord Korea", "name:pam"=>"Pangulung Korea", "name:pms"=>"Coréa dël Nòrd", "name:pnb"=>"اتلا کوریا", "name:sah"=>"Хоту Кэриэйэ", "name:scn"=>"Corea dû Nord", "name:szl"=>"Půłnocno Koryjo", "name:tpi"=>"Not Koria", "name:udm"=>"Корея Калык-Демократи Республика", "name:war"=>"Amihanan nga Korea", "name:wuu"=>"朝鲜", "name:zh_py"=>"Chaoxian", "name:simple"=>"North Korea", "name:zh_pyt"=>"Cháoxiǎn", "name:bat-smg"=>"Šiaurės Kuoriejė", "name:cbk-zam"=>"Corea del Norte", "name:fiu-vro"=>"Põh'a-Korea", "name:be-x-old"=>"Паўночная Карэя", "official_name"=>"조선민주주의인민공화국", "name:zh-min-nan"=>"Tiâu-sián", "official_name:br"=>"Republik Poblel ha Demokratel Korea", "official_name:ca"=>"República Popular Democràtica de Corea", "official_name:en"=>"Democratic People's Republic of Korea (DPRK)", "official_name:es"=>"República Popular Democrática de Corea (RPDC)", "official_name:et"=>"Korea Rahvademokraatlik Vabariik", "official_name:hu"=>"Koreai Népi Demokratikus Köztársaság", "official_name:id"=>"Republik Demokratik Rakyat Korea", "official_name:it"=>"Repubblica Democratica Popolare di Corea", "official_name:ja"=>"朝鮮民主主義人民共和国", "official_name:ko"=>"조선민주주의인민공화국", "official_name:la"=>"Respublica Popularis Democratica Coreana", "official_name:lb"=>"Demokratesch Volleksrepublik Korea", "official_name:lv"=>"Korejas Tautas Demokrātiskā Republika", "official_name:mk"=>"Демократска Народна Република Кореја", "official_name:os"=>"Корейы Адæмон Демократон Республикæ", "official_name:pl"=>"Koreańska Republika Ludowo-Demokratyczna", "official_name:pt"=>"República Democrática Popular da Coreia", "official_name:ru"=>"Народно-Демократическая Республика Корея", "official_name:sh"=>"Demokratska Narodna Republika Koreja", "official_name:sk"=>"Kórejská ľudovodemokratická republika", "official_name:sv"=>"Demokratiska folkrepubliken Korea", "official_name:uz"=>"Koreya Xalq Demokratik Respublikasi", "official_name:vi"=>"Cộng hòa Dân chủ Nhân dân Triều Tiên", "official_name:csb"=>"Kòrejańskô Lëdowò-Demokratnô Repùblika"  \N      48
 kr     "name"=>"대한민국", "name:af"=>"Suid-Korea", "name:am"=>"ደቡብ ኮርያ", "name:an"=>"Corea d'o Sur", "name:ar"=>"كوريا الجنوبية", "name:az"=>"Cənubi Koreya", "name:be"=>"Паўднёвая Карэя", "name:bg"=>"Южна Корея", "name:bn"=>"দক্ষিণ কোরিয়া", "name:bo"=>"ལྷོ་ཀོ་རི་ཡ།", "name:br"=>"Korea ar Su", "name:bs"=>"Južna Koreja", "name:ca"=>"Corea del Sud", "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: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: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:kk"=>"Оңтүстік Корея", "name:kn"=>"ದಕ್ಷಿಣ ಕೊರಿಯಾ", "name:ko"=>"대한민국", "name:ks"=>"दक्षिण कोरिया", "name:ku"=>"Komara Korêyê", "name:kv"=>"Корея Республика", "name:kw"=>"Korea Dhyhow", "name:la"=>"Corea Meridionalis", "name:lb"=>"Südkorea", "name:li"=>"Zuud-Korea", "name:lt"=>"Pietų Korėja", "name:lv"=>"Dienvidkoreja", "name:mg"=>"Korea Atsimo", "name:mk"=>"Република Кореја", "name:ml"=>"ദക്ഷിണ കൊറിയ", "name:mn"=>"Өмнөд Солонгос", "name:mr"=>"दक्षिण कोरिया", "name:ms"=>"Korea Selatan", "name:mt"=>"Korea t'Isfel", "name:my"=>"တောင်ကိုရီးယားနိုင်ငံ", "name:ne"=>"दक्षिण कोरिया", "name:nl"=>"Zuid-Korea", "name:nn"=>"Sør-Korea", "name:no"=>"Sør-Korea", "name:oc"=>"Corèa del Sud", "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:sa"=>"दक्षिण कोरिया", "name:se"=>"Mátta-Korea", "name:sh"=>"Južna Koreja", "name:sk"=>"Južná Kórea", "name:sl"=>"Južna Koreja", "name:sm"=>"Kolea i Saute", "name:sq"=>"Koreja e Jugut", "name:sr"=>"Јужна Кореја", "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: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:zh"=>"韩国", "name:ace"=>"Korèa Seulatan", "name:als"=>"Südkorea", "name:arz"=>"كوريا الجنوبيه", "name:ast"=>"Corea del Sur", "name:bar"=>"Südkorea", "name:bcl"=>"Sur nin Korea", "name:bpy"=>"খা কোরিয়া", "name:cdo"=>"Hàng-guók", "name:ceb"=>"Habagatang Korea", "name:chr"=>"ᎤᎦᎾᏭ ᎢᏗᎵ ᎪᎴᎠ", "name:crh"=>"Cenübiy Koreya", "name:csb"=>"Repùblika Kòreji", "name:diq"=>"Korya Veroci", "name:dsb"=>"Pódpołdnjowa Koreja", "name:frp"=>"Corê du Sud", "name:gan"=>"韓國", "name:hak"=>"Thai-hòn mìn-koet", "name:haw"=>"Kōlea Hema", "name:hif"=>"South Korea", "name:hsb"=>"Južna Koreja", "name:ilo"=>"Abagatan a Korea", "name:jbo"=>"snanu zei .xanguk", "name:lij"=>"Corea do Sud", "name:lmo"=>"Curea del Süd", "name:nah"=>"Corea Huitztlāmpa", "name:nap"=>"Corea d''o Sud", "name:nds"=>"Süüdkorea", "name:nov"=>"Sud Korea", "name:nrm"=>"Corée du Sud", "name:pam"=>"Mauling Korea", "name:pms"=>"Coréa dël Sud", "name:pnb"=>"دکھنی کوریا", "name:sah"=>"Соҕуруу Кэриэйэ", "name:scn"=>"Corea dû Sud", "name:szl"=>"Połedńowo Koryjo", "name:tet"=>"Koreia Súl", "name:tpi"=>"Saut Koria", "name:udm"=>"Республика Корея", "name:vec"=>"Corea del Sud", "name:war"=>"Salatan nga Korea", "name:wuu"=>"大韩民国", "name:zh_py"=>"Hanguo", "name:simple"=>"South Korea", "name:zh-yue"=>"大韓民國", "name:zh_pyt"=>"Hánguó", "name:bat-smg"=>"Pėitū Kuoriejė", "name:fiu-vro"=>"Lõunõ-Korea", "name:be-x-old"=>"Рэспубліка Карэя", "official_name"=>"대한민국", "name:zh-min-nan"=>"Hân-kok", "official_name:af"=>"Republiek van Korea", "official_name:br"=>"Republik Korea", "official_name:ca"=>"República de Corea", "official_name:el"=>"Δημοκρατία της Κορέας", "official_name:en"=>"Republic of Korea", "official_name:et"=>"Korea Vabariik", "official_name:fr"=>"République de Corée", "official_name:id"=>"Republik Korea", "official_name:it"=>"Repubblica di Corea", "official_name:ja"=>"大韓民国", "official_name:la"=>"Respublica Coreana", "official_name:lb"=>"Republik Korea", "official_name:lv"=>"Korejas Republika", "official_name:mn"=>"Бүгд Найрамдах Солонгос Улс", "official_name:os"=>"Республикæ Корей", "official_name:pl"=>"Republika Korei", "official_name:pt"=>"República da Coreia", "official_name:ru"=>"Республика Корея", "official_name:sk"=>"Kórejská republika", "official_name:sv"=>"Republiken Korea", "official_name:uz"=>"Koreya Respublikasi", "official_name:cdo"=>"Dâi-hàng Mìng-guók", "official_name:bat-smg"=>"Kuorėjės Respoblėka"   \N      49
-je     "name"=>"Jersey", "name:ar"=>"جيرسي", "name:be"=>"Джэрсі", "name:br"=>"Jerzenez", "name:el"=>"Τζέρσεϊ", "name:eo"=>"Jersey", "name:fi"=>"Jersey", "name:fr"=>"Jersey", "name:ga"=>"Geirsí", "name:he"=>"ג'רזי", "name:hu"=>"Jersey", "name:is"=>"Jersey", "name:la"=>"Andium", "name:lt"=>"Džersis", "name:lv"=>"Džērsija", "name:mn"=>"Жерси", "name:pl"=>"Jersey", "name:ru"=>"Джерси", "name:sk"=>"Jersey", "name:sv"=>"Jersey", "name:th"=>"เจอร์ซีย์", "name:uk"=>"Джерсі", "name:zh"=>"泽西岛", "name:zh_py"=>"Zexi Dao", "name:zh_pyt"=>"Zéxī Dǎo"    \N      123
-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"=>"尼泊尔", "name:haw"=>"Nepala", "name:zh_py"=>"Niboer", "name:zh_pyt"=>"Níbóěr", "official_name"=>"Sanghiya Loktantrik Ganatantratmak Nepāl", "official_name:br"=>"Republik Demokratel Kevreadel Nepal", "official_name:fr"=>"République démocratique fédérale du Népal", "official_name:it"=>"Repubblica Federale Democratica del Nepal", "official_name:lt"=>"Nepalo Federacinė Demokratinė Respublika", "official_name:lv"=>"Nepālas Karaliste", "official_name:ne"=>"संघीय लोकतान्त्रिक गणतन्त्रात्मक नेपाल", "official_name:pl"=>"Federalna Demokratyczna Republika Nepalu", "official_name:sv"=>"Demokratiska förbundsrepubliken Nepal", "official_name:vi"=>"Cộng hòa dân chủ liên bang Nepal"    \N      50
-tm     "name"=>"Türkmenistan", "name:af"=>"Turkmenistan", "name:ar"=>"تركمانستان", "name:az"=>"Türkmənistan", "name:be"=>"Туркменістан", "name:br"=>"Turkmenistan", "name:da"=>"Turkmenistan", "name:de"=>"Turkmenistan", "name:el"=>"Τουρκμενιστάν", "name:en"=>"Turkmenistan", "name:eo"=>"Turkmenio", "name:es"=>"Turkmenistán", "name:et"=>"Türkmenistan", "name:fa"=>"ترکمنستان", "name:fi"=>"Turkmenistan", "name:fr"=>"Turkménistan", "name:ga"=>"An Tuircméanastáin", "name:gd"=>"Turcmanastàn", "name:he"=>"טורקמניסטן", "name:hr"=>"Turkmenistan", "name:hu"=>"Türkmenisztán", "name:id"=>"Turkmenistan", "name:is"=>"Túrkmenistan", "name:it"=>"Turkmenistan", "name:ja"=>"トルクメニスタン", "name:la"=>"Turcomannia", "name:lt"=>"Turkmenistanas", "name:lv"=>"Turkmenistāna", "name:mn"=>"Туркменистан", "name:nl"=>"Turkmenistan", "name:pl"=>"Turkmenistan", "name:pt"=>"Turcomenistão", "name:ru"=>"Туркмения", "name:sl"=>"Turkmenistan", "name:sv"=>"Turkmenistan", "name:th"=>"ประเทศเติร์กเมนิสถาน", "name:tk"=>"Türkmenistan", "name:tr"=>"Türkmenistan", "name:uk"=>"Туркменістан", "name:vi"=>"Turkmenistan", "name:zh"=>"土库曼斯坦", "alt_name"=>"Turkmenia", "name:haw"=>"Tukemenikana", "name:zh_py"=>"Tukumansitan", "name:zh_pyt"=>"Tǔkùmànsītǎn", "official_name:lb"=>"Presidialrepublik Turkmenistan", "official_name:pt"=>"República do Turcomenistão", "official_name:vi"=>"Cộng hòa Turkmenistan"     \N      54
-ye     "name"=>"اليَمَن al-Yaman", "name:af"=>"Jemen", "name:ar"=>"اليمن", "name:be"=>"Йемен", "name:br"=>"Yemen", "name:ca"=>"Iemen", "name:cy"=>"Yemen", "name:da"=>"Yemen", "name:de"=>"Jemen", "name:el"=>"Υεμένη", "name:en"=>"Yemen", "name:eo"=>"Jemeno", "name:es"=>"Yemen", "name:et"=>"Jeemen", "name:fa"=>"يمن", "name:fi"=>"Jemen", "name:fr"=>"Yémen", "name:fy"=>"Jemen", "name:ga"=>"Éimin", "name:gd"=>"Iemen", "name:he"=>"תימן", "name:hr"=>"Jemen", "name:hu"=>"Jemen", "name:id"=>"Yaman", "name:is"=>"Jemen", "name:it"=>"Yemen", "name:ja"=>"イエメン", "name:la"=>"Iemenia", "name:lb"=>"Jemen", "name:li"=>"Jeme", "name:lt"=>"Jemenas", "name:mn"=>"Йемен", "name:nl"=>"Jemen", "name:pl"=>"Jemen", "name:pt"=>"Iêmen", "name:ru"=>"Йемен", "name:sl"=>"Jemen", "name:sv"=>"Jemen", "name:th"=>"ประเทศเยเมน", "name:tr"=>"Yemen", "name:uk"=>"Ємен", "name:vi"=>"Yemen", "name:zh"=>"也门", "name:haw"=>"Iemene", "name:zh_py"=>"Yemen", "name:zh_pyt"=>"Yěmén", "official_name:br"=>"Republik Yemen", "official_name:el"=>"Δημοκρατία της Υεμένης", "official_name:en"=>"Republic of Yemen", "official_name:et"=>"Jeemeni Vabariik", "official_name:fi"=>"Jemenin tasavalta", "official_name:id"=>"Republik Yaman", "official_name:it"=>"Repubblica Unita dello Yemen", "official_name:ja"=>"イエメン共和国", "official_name:lt"=>"Jemeno Respublika", "official_name:pl"=>"Republika Jemeńska", "official_name:pt"=>"República do Iêmen", "official_name:sv"=>"Republiken Jemen", "official_name:vi"=>"Cộng hòa Yemen"        \N      55
-gt     "name"=>"Guatemala", "name:ar"=>"غواتيمالا", "name:be"=>"Гватэмала", "name:br"=>"Guatemala", "name:da"=>"Guatemala", "name:el"=>"Γουατεμάλα", "name:en"=>"Guatemala", "name:eo"=>"Gvatemalo", "name:fa"=>"گواتمالا", "name:fi"=>"Guatemala", "name:fr"=>"Guatemala", "name:fy"=>"Gûatemala", "name:ga"=>"Guatamala", "name:gd"=>"Guatamala", "name:he"=>"גואטמלה", "name:hr"=>"Gvatemala", "name:hu"=>"Guatemala", "name:is"=>"Gvatemala", "name:it"=>"Guatemala", "name:ja"=>"グアテマラ", "name:la"=>"Guatimalia", "name:lt"=>"Gvatemala", "name:lv"=>"Gvatemala", "name:mn"=>"Гватемал", "name:pl"=>"Gwatemala", "name:ru"=>"Гватемала", "name:sl"=>"Gvatemala", "name:sv"=>"Guatemala", "name:th"=>"ประเทศกัวเตมาลา", "name:uk"=>"Гватемала", "name:zh"=>"危地马拉", "official_name"=>"República de Guatemala", "official_name:be"=>"Рэспубліка Гватэмала", "official_name:el"=>"Δημοκρατία της Γουατεμάλας", "official_name:gd"=>"Poblachd Ghuatamala", "official_name:id"=>"Republik Guatemala", "official_name:it"=>"Repubblica del Guatemala", "official_name:lt"=>"Gvatemalos Respublika", "official_name:lv"=>"Gvatemalas Republika", "official_name:sv"=>"Republiken Guatemala", "official_name:vi"=>"Cộng hoà Guatemala"        \N      57
+ge     "name"=>"Georgia / საქართველო", "name:ab"=>"Қырҭтәыла Аҳәынҭқарра", "name:af"=>"Georgië", "name:an"=>"Cheorchia", "name:ar"=>"جورجيا", "name:av"=>"Гуржи", "name:az"=>"Gürcüstan", "name:be"=>"Грузія", "name:bg"=>"Грузия", "name:bn"=>"জর্জিয়া", "name:br"=>"Jorjia", "name:bs"=>"Gruzija", "name:ca"=>"Geòrgia", "name:cs"=>"Gruzie", "name:cu"=>"Гєѡргі́ꙗ", "name:cv"=>"Грузи", "name:cy"=>"Georgia", "name:da"=>"Georgien", "name:de"=>"Georgien", "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", "name:fr"=>"Géorgie", "name:fy"=>"Geörgje", "name:ga"=>"An tSeoirsia", "name:gd"=>"Gruisia", "name:gl"=>"Xeorxia", "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"=>"Georgia", "name:is"=>"Georgía", "name:it"=>"Georgia", "name:ja"=>"グルジア", "name:jv"=>"Georgia", "name:ka"=>"საქართველო", "name:kk"=>"Гүржістан", "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:mk"=>"Грузија", "name:ml"=>"ജോര്‍ജ്ജിയ", "name:mn"=>"Гүрж", "name:mr"=>"जॉर्जिया", "name:ms"=>"Georgia", "name:mt"=>"Ġeorġja", "name:na"=>"Georgia", "name:nl"=>"Georgië", "name:nn"=>"Georgia", "name:no"=>"Georgia", "name:oc"=>"Georgia", "name:os"=>"Гуырдзыстон", "name:pl"=>"Gruzja", "name:ps"=>"جيورجيا", "name:pt"=>"Geórgia", "name:qu"=>"Kartulsuyu", "name:ro"=>"Georgia", "name:ru"=>"Грузия", "name:se"=>"Georgia", "name:sh"=>"Gruzija", "name:sk"=>"Gruzínsko", "name:sl"=>"Gruzija", "name:sq"=>"Gjeorgjia", "name:sr"=>"Грузија", "name:sv"=>"Georgien", "name:sw"=>"Georgia", "name:ta"=>"சியார்சியா", "name:te"=>"జార్జియా", "name:tg"=>"Гурҷистон", "name:th"=>"ประเทศจอร์เจีย", "name:tk"=>"Gruziýa", "name:tl"=>"Georgia", "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:yo"=>"Georgia", "name:zh"=>"乔治亚", "name:als"=>"Georgie", "name:arc"=>"ܓܘܪܓܝܐ", "name:arz"=>"جورجيا", "name:ast"=>"Xorxa", "name:ceb"=>"Georgia", "name:crh"=>"Gürcistan", "name:csb"=>"Grëzóńskô", "name:diq"=>"Gurcıstan", "name:dsb"=>"Georgiska", "name:frp"=>"Jôrg·ie", "name:haw"=>"Keokia", "name:hif"=>"Georgia", "name:hsb"=>"Georgiska", "name:ilo"=>"Georgia", "name:ksh"=>"Gejorgije", "name:lij"=>"Geòrgia", "name:lmo"=>"Georgia", "name:mzn"=>"گورجئون", "name:nds"=>"Georgien", "name:new"=>"ज्योर्जिया", "name:nov"=>"Georgia", "name:pam"=>"Georgia", "name:pih"=>"Jorja", "name:pms"=>"Geòrgia", "name:pnt"=>"Γρουζία", "name:sah"=>"Грузия", "name:scn"=>"Giorgia", "name:sco"=>"Georgie", "name:szl"=>"Gruzyjo", "name:udm"=>"Грузия", "name:war"=>"Georgia", "name:wuu"=>"格鲁吉亚", "name:xal"=>"Гүрҗмүдн Орн Нутг", "name:zea"=>"Georhië", "name:zh_py"=>"Qiaozhiya", "name:simple"=>"Georgia", "name:zh-yue"=>"格魯吉亞", "name:zh_pyt"=>"Qiáozhìyà", "name:bat-smg"=>"Grozėjė", "name:fiu-vro"=>"Gruusia", "name:be-x-old"=>"Грузія", "name:zh-min-nan"=>"Sakartvelo", "official_name:pt"=>"República da Geórgia"   ka      21
+gr     "name"=>"Ελλάδα", "name:af"=>"Griekeland", "name:am"=>"ግሪክ", "name:an"=>"Grezia", "name:ar"=>"اليونان", "name:az"=>"Yunanıstan", "name:be"=>"Грэцыя", "name:bg"=>"Гърция", "name:bn"=>"গ্রীস", "name:bo"=>"ཧི་ལ།", "name:br"=>"Gres", "name:bs"=>"Grčka", "name:ca"=>"Grècia", "name:ce"=>"Джелтимохк", "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: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:kk"=>"Грекия", "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:mk"=>"Грција", "name:ml"=>"ഗ്രീസ്", "name:mn"=>"Грек", "name:mr"=>"ग्रीस", "name:ms"=>"Greece", "name:mt"=>"Greċja", "name:na"=>"Greece", "name:ne"=>"ग्रीस", "name:nl"=>"Griekenland", "name:nn"=>"Hellas", "name:no"=>"Hellas", "name:oc"=>"Grècia", "name:os"=>"Грекъ", "name:pl"=>"Grecja", "name:ps"=>"يونان", "name:pt"=>"Grécia", "name:qu"=>"Grisya", "name:rm"=>"Grezia", "name:ro"=>"Grecia", "name:ru"=>"Греция", "name:rw"=>"Ubugereki", "name:sa"=>"ग्रीस", "name:se"=>"Greika", "name:sh"=>"Grčka", "name:sk"=>"Grécko", "name:sl"=>"Grčija", "name:so"=>"Giriig", "name:sq"=>"Greqia", "name:sr"=>"Грчка", "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"=>"IGrisi", "name:als"=>"Griecheland", "name:ang"=>"Crecaland", "name:arc"=>"ܝܘܢ", "name:arz"=>"اليونان", "name:ast"=>"Grecia", "name:bar"=>"Griachaland", "name:bcl"=>"Gresya", "name:bpy"=>"গ্রীস", "name:ceb"=>"Gresya", "name:crh"=>"Yunanistan", "name:csb"=>"Greckô", "name:diq"=>"Yunanıstan", "name:dsb"=>"Grichiska", "name:ext"=>"Grécia", "name:frp"=>"Grèce", "name:fur"=>"Grecie", "name:gan"=>"希臘", "name:hak"=>"Hî-lia̍p", "name:haw"=>"Helene", "name:hif"=>"Greece", "name:hsb"=>"Grjekska", "name:ilo"=>"Grecia", "name:jbo"=>"xesygu'e", "name:lad"=>"Gresia", "name:lij"=>"Greçia", "name:lmo"=>"Grecia", "name:mdf"=>"Грекмастор", "name:mhr"=>"Греций", "name:nah"=>"Grecia", "name:nap"=>"Gracia", "name:nds"=>"Grekenland", "name:nov"=>"Grekia", "name:nrm"=>"Grêce", "name:pam"=>"Greece", "name:pih"=>"Griese", "name:pms"=>"Grecia", "name:pnt"=>"Ελλάδα", "name:sah"=>"Греция", "name:scn"=>"Grecia", "name:sco"=>"Greece", "name:stq"=>"Griechenlound", "name:szl"=>"Grecyjo", "name:tet"=>"Grésia", "name:tpi"=>"Gris", "name:udm"=>"Греция", "name:vec"=>"Gresia", "name:war"=>"Gresya", "name:wuu"=>"希腊", "name:xal"=>"Эллинмүдн Орн Нутг", "name:zh_py"=>"Xila", "name:nds-nl"=>"Griekenlaand", "name:simple"=>"Greece", "name:zh-yue"=>"希臘", "name:zh_pyt"=>"Xīlà", "name:bat-smg"=>"Graikėjė", "name:fiu-vro"=>"Kreeka", "name:roa-rup"=>"Gãrtsia", "name:be-x-old"=>"Грэцыя", "official_name"=>"Ελληνική Δημοκρατία", "name:zh-min-nan"=>"Hi-lia̍p", "official_name:am"=>"የግሪክ ዲሞክራሲ", "official_name:br"=>"Republik hellenek", "official_name:et"=>"Kreeka Vabariik", "official_name:id"=>"Republik Hellenik", "official_name:it"=>"Repubblica Ellenica", "official_name:ja"=>"ギリシャ共和国", "official_name:lb"=>"Hellenesch Republik", "official_name:lt"=>"Graikijos Respublika", "official_name:pt"=>"República Helênica", "official_name:sk"=>"Grécka republika", "official_name:sv"=>"Republiken Grekland", "official_name:vi"=>"Cộng hòa Hy Lạp", "name:zh-classical"=>"希臘共和國" el      22
+gs     "name"=>"South Georgia and South Sandwich Islands", "name:af"=>"Suid-Georgië en die Suidelike Sandwich-eilande", "name:ar"=>"جزر جورجيا الجنوبية وساندويتش الجنوبية", "name:be"=>"Паўднёвая Георгія і Паўднёвыя Сэндвічавы астравы", "name:bg"=>"Южна Джорджия и Южни Сандвичеви острови", "name:br"=>"Jorjia 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"=>"Sydgeorgien og Sydsandwichøerne", "name:de"=>"Südgeorgien und die Südlichen Sandwichinseln", "name:el"=>"Νότιος Γεωργία και Νότιοι Σάντουιτς Νήσοι", "name:en"=>"South Georgia and 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:fr"=>"Géorgie du Sud-et-les Îles Sandwich du Sud", "name:fy"=>"Súd-Geörgje 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: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 meridionali", "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:mr"=>"साउथ जॉर्जिया व साउथ सँडविच द्वीपसमूह", "name:ms"=>"Georgia Selatan dan Kepulauan Sandwich Selatan", "name:nl"=>"Zuid-Georgië 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 Sandwich do Sul", "name:ro"=>"Georgia de Sud şi Insulele Sandwich de Sud", "name:ru"=>"Южная Джорджия и Южные Сандвичевы острова", "name:se"=>"Lulli Georgia ja Lulli Sandwich-sullot", "name:sl"=>"Južna Georgia 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"=>"南喬治亞島與南桑威奇群島", "name:dsb"=>"Pódpołdnjowa Georgiska a kupy Pódpołdnjowy Sandwich", "name:lij"=>"Geòrgia do Sud e isoe Sandwich meridionæ", "name:nov"=>"Sud Georgia e li Sud Sandwich Isles", "name:sah"=>"Соҕуруу Георгия уонна Соҕуруу Сэндуич арыылара", "name:simple"=>"South Georgia and the South Sandwich Islands", "name:be-x-old"=>"Паўднёвая Георгія і Паўднёвыя Сэндвічавыя выспы"    en      44
+je     "name"=>"Jersey", "name:ar"=>"جيرسي", "name:be"=>"Джэрсі", "name:br"=>"Jerzenez", "name:el"=>"Τζέρσεϊ", "name:eo"=>"Jersey", "name:fi"=>"Jersey", "name:fr"=>"Jersey", "name:ga"=>"Geirsí", "name:he"=>"ג'רזי", "name:hu"=>"Jersey", "name:is"=>"Jersey", "name:la"=>"Andium", "name:lt"=>"Džersis", "name:lv"=>"Džērsija", "name:mn"=>"Жерси", "name:pl"=>"Jersey", "name:ru"=>"Джерси", "name:sk"=>"Jersey", "name:sv"=>"Jersey", "name:th"=>"เจอร์ซีย์", "name:uk"=>"Джерсі", "name:zh"=>"泽西岛", "name:zh_py"=>"Zexi Dao", "name:zh_pyt"=>"Zéxī Dǎo"    en      123
+kp     "name"=>"북조선", "name:af"=>"Noord-Korea", "name:an"=>"Corea d'o Norte", "name:ar"=>"كوريا الشمالية", "name:az"=>"Şimali Koreya", "name:be"=>"Паўночная Карэя", "name:bg"=>"Северна Корея", "name:bn"=>"উত্তর কোরিয়া", "name:bo"=>"བྱང་ཀོ་རི་ཡ།", "name:br"=>"Korea an Norzh", "name:bs"=>"Sjeverna Koreja", "name:ca"=>"Corea del Nord", "name:cs"=>"Severní Korea", "name:cy"=>"Gogledd Corea", "name:da"=>"Nordkorea", "name:de"=>"Nordkorea", "name:dv"=>"އުތުރު ކޮރެއާ", "name:dz"=>"བྱང་ཀོ་རི་ཡ་", "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-Korea", "name:ga"=>"An Chóiré Thuaidh", "name:gd"=>"Coirea a Tuath", "name:gl"=>"Corea do Norte", "name:gv"=>"Yn Chorea Twoaie", "name:he"=>"קוריאה הצפונית", "name:hi"=>"उत्तर कोरिया", "name:hr"=>"Sjeverna Koreja", "name:ht"=>"Kore dinò", "name:hu"=>"Észak-Korea", "name:hy"=>"Հյուսիսային Կորեա", "name:ia"=>"Corea del Nord", "name:id"=>"Korea Utara", "name:ie"=>"Nord-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:kk"=>"Солтүстік Корея", "name:kn"=>"ಉತ್ತರ ಕೊರಿಯಾ", "name:ku"=>"Korêya Bakur", "name:kv"=>"Корея Войтыр Демократия Республика", "name:kw"=>"Korea Gledh", "name:la"=>"Corea Septentrionalis", "name:lb"=>"Nordkorea", "name:li"=>"Noord-Korea", "name:lt"=>"Šiaurės Korėja", "name:lv"=>"Ziemeļkoreja", "name:mg"=>"Korea Avaratra", "name:mk"=>"Северна Кореја", "name:ml"=>"ഉത്തര കൊറിയ", "name:mn"=>"Хойд Солонгос", "name:mr"=>"उत्तर कोरिया", "name:ms"=>"Korea Utara", "name:na"=>"Republik Engame Korea", "name:nl"=>"Noord-Korea", "name:nn"=>"Nord-Korea", "name:no"=>"Nord-Korea", "name:oc"=>"Corèa del Nòrd", "name:os"=>"Цæгат Корей", "name:pl"=>"Korea Północna", "name:ps"=>"د کوريا ولسواک خلق جمهوريت", "name:pt"=>"Coreia do Norte", "name:qu"=>"Chinchay Kuriya", "name:ro"=>"Coreea de Nord", "name:ru"=>"Северная Корея", "name:se"=>"Davvi-Korea", "name:sh"=>"Sjeverna Koreja", "name:sk"=>"Severná Kórea", "name:sl"=>"Severna Koreja", "name:sq"=>"Koreja e Veriut", "name:sr"=>"Северна Кореја", "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:ug"=>"شىمالىي چاۋشيەن", "name:uk"=>"Північна Корея", "name:ur"=>"شمالی کوریا", "name:uz"=>"Shimoliy Korea", "name:vi"=>"Triều Tiên", "name:vo"=>"Nolüda-Koreyän", "name:wo"=>"Kore gu Bëj-gànnaar", "name:yi"=>"צפון קארעע", "name:zh"=>"朝鲜", "name:als"=>"Nordkorea", "name:ast"=>"Corea del Norte", "name:bcl"=>"North Korea", "name:bpy"=>"ঔয়াং কোরিয়া", "name:ceb"=>"Amihanang Korea", "name:crh"=>"Şimaliy Koreya", "name:csb"=>"Nordowô Kòreja", "name:diq"=>"Korya Zımey", "name:dsb"=>"Pódpołnocna Koreja", "name:frp"=>"Corê du Nord", "name:hak"=>"Tsêu-siên Mìn-tsú Tsú-ngi Ngìn-mìn Khiung-fò-koet", "name:haw"=>"Kōlea ʻĀkau", "name:hsb"=>"Sewjerna Koreja", "name:jbo"=>"berti zei .xanguk", "name:lad"=>"Korea del Nord", "name:lmo"=>"Corea del Nòrd", "name:nah"=>"Corea Mictlāmpa", "name:nds"=>"Noordkorea", "name:nov"=>"Nord Korea", "name:pam"=>"Pangulung Korea", "name:pms"=>"Coréa dël Nòrd", "name:pnb"=>"اتلا کوریا", "name:sah"=>"Хоту Кэриэйэ", "name:scn"=>"Corea dû Nord", "name:szl"=>"Půłnocno Koryjo", "name:tpi"=>"Not Koria", "name:udm"=>"Корея Калык-Демократи Республика", "name:war"=>"Amihanan nga Korea", "name:wuu"=>"朝鲜", "name:zh_py"=>"Chaoxian", "name:simple"=>"North Korea", "name:zh_pyt"=>"Cháoxiǎn", "name:bat-smg"=>"Šiaurės Kuoriejė", "name:cbk-zam"=>"Corea del Norte", "name:fiu-vro"=>"Põh'a-Korea", "name:be-x-old"=>"Паўночная Карэя", "official_name"=>"조선민주주의인민공화국", "name:zh-min-nan"=>"Tiâu-sián", "official_name:br"=>"Republik Poblel ha Demokratel Korea", "official_name:ca"=>"República Popular Democràtica de Corea", "official_name:en"=>"Democratic People's Republic of Korea (DPRK)", "official_name:es"=>"República Popular Democrática de Corea (RPDC)", "official_name:et"=>"Korea Rahvademokraatlik Vabariik", "official_name:hu"=>"Koreai Népi Demokratikus Köztársaság", "official_name:id"=>"Republik Demokratik Rakyat Korea", "official_name:it"=>"Repubblica Democratica Popolare di Corea", "official_name:ja"=>"朝鮮民主主義人民共和国", "official_name:ko"=>"조선민주주의인민공화국", "official_name:la"=>"Respublica Popularis Democratica Coreana", "official_name:lb"=>"Demokratesch Volleksrepublik Korea", "official_name:lv"=>"Korejas Tautas Demokrātiskā Republika", "official_name:mk"=>"Демократска Народна Република Кореја", "official_name:os"=>"Корейы Адæмон Демократон Республикæ", "official_name:pl"=>"Koreańska Republika Ludowo-Demokratyczna", "official_name:pt"=>"República Democrática Popular da Coreia", "official_name:ru"=>"Народно-Демократическая Республика Корея", "official_name:sh"=>"Demokratska Narodna Republika Koreja", "official_name:sk"=>"Kórejská ľudovodemokratická republika", "official_name:sv"=>"Demokratiska folkrepubliken Korea", "official_name:uz"=>"Koreya Xalq Demokratik Respublikasi", "official_name:vi"=>"Cộng hòa Dân chủ Nhân dân Triều Tiên", "official_name:csb"=>"Kòrejańskô Lëdowò-Demokratnô Repùblika"  ko      48
+ma     "name"=>"Maroc", "name:af"=>"Marokko", "name:am"=>"ሞሮኮ", "name:an"=>"Marruecos", "name:ar"=>"المغرب", "name:az"=>"Mərakeş", "name:be"=>"Марока", "name:bg"=>"Мароко", "name:bm"=>"Maroko", "name:bn"=>"মরোক্কো", "name:bo"=>"མའེ་ལོ་ཀོ", "name:br"=>"Maroko", "name:bs"=>"Maroko", "name:ca"=>"Marroc", "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:ia"=>"Morocco", "name:id"=>"Maroko", "name:ie"=>"Morocco", "name:io"=>"Maroko", "name:is"=>"Marrokkó", "name:it"=>"Marocco", "name:ja"=>"モロッコ", "name:jv"=>"Maroko", "name:ka"=>"მაროკო", "name:kg"=>"Magribia", "name:kk"=>"Мағрибия", "name:kn"=>"ಮೊರಾಕೊ", "name:ko"=>"모로코", "name:ks"=>"मोराको", "name:ku"=>"Maroko", "name:kw"=>"Marokk", "name:la"=>"Marocum", "name:lb"=>"Marokko", "name:li"=>"Marokko", "name:ln"=>"Marɔkɛ", "name:lt"=>"Marokas", "name:lv"=>"Maroka", "name:mk"=>"Мароко", "name:ml"=>"മൊറോക്കൊ", "name:mn"=>"Марокко", "name:mr"=>"मोरोक्को", "name:ms"=>"Maghribi", "name:mt"=>"Marokk", "name:nl"=>"Marokko", "name:nn"=>"Marokko", "name:no"=>"Marokko", "name:oc"=>"Marròc", "name:os"=>"Марокко", "name:pl"=>"Maroko", "name:ps"=>"ماراکو", "name:pt"=>"Marrocos", "name:qu"=>"Maruku", "name:ro"=>"Maroc", "name:ru"=>"Марокко", "name:sa"=>"मोराको", "name:sc"=>"Marocu", "name:se"=>"Marokko", "name:sh"=>"Maroko", "name:sk"=>"Maroko", "name:sl"=>"Maroko", "name:so"=>"Maroc", "name:sq"=>"Maroku", "name:sr"=>"Мароко", "name:sv"=>"Marocko", "name:sw"=>"Moroko", "name:ta"=>"மொரோக்கோ", "name:te"=>"మొరాకో", "name:tg"=>"Марокаш", "name:th"=>"ประเทศโมร็อกโก", "name:ti"=>"ሞሮኮ", "name:tl"=>"Morocco", "name:tr"=>"Fas", "name:ts"=>"Morocco", "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:ace"=>"Maroko", "name:ang"=>"Morocco", "name:arc"=>"ܡܓܪܒ", "name:arz"=>"المغرب", "name:ast"=>"Marruecos", "name:bcl"=>"Moroko", "name:bpy"=>"মরক্কো", "name:ceb"=>"Morocco", "name:crh"=>"Mağrip", "name:diq"=>"Fas", "name:ext"=>"Marruecus", "name:frp"=>"Maroc", "name:haw"=>"Moloko", "name:hif"=>"Morocco", "name:hsb"=>"Marokko", "name:ilo"=>"Morocco", "name:jbo"=>"morgu'e", "name:kab"=>"Merruk", "name:lad"=>"Marroko", "name:lij"=>"Maròcco", "name:lmo"=>"Maroch", "name:nah"=>"Marruecos", "name:nds"=>"Marokko", "name:nov"=>"Moroko", "name:pam"=>"Morocco", "name:pms"=>"Maròch", "name:pnb"=>"مراکش", "name:sah"=>"Марокко", "name:scn"=>"Maroccu", "name:stq"=>"Marokko", "name:szl"=>"Maroko", "name:vec"=>"Maroco", "name:war"=>"Morocco", "name:zea"=>"Marokko", "name:zh_py"=>"Moluoge", "name:simple"=>"Morocco", "name:zh-yue"=>"摩洛哥", "name:zh_pyt"=>"Móluògē", "name:bat-smg"=>"Maruoks", "name:be-x-old"=>"Марока", "official_name"=>"المملكة المغربية", "name:zh-min-nan"=>"Morocco", "official_name:be"=>"Каралеўства Марока", "official_name:br"=>"Rouantelezh Maroko", "official_name:el"=>"Βασίλειο του Μαρόκου", "official_name:en"=>"Kingdom of Morocco", "official_name:et"=>"Maroko Kuningriik", "official_name:fr"=>"Royaume du Maroc", "official_name:id"=>"Kerajaan Maroko", "official_name:lb"=>"Kinnekräich Marokko", "official_name:lt"=>"Maroko Karalystė", "official_name:lv"=>"Marokas Karaliste", "official_name:sv"=>"Konungariket Marocko", "official_name:vi"=>"Vương quốc Maroc"    ar      23
 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"=>"荷属安的列斯", "name:bpy"=>"নেদারল্যান্ড এন্টিল্লেস", "name:dsb"=>"Nižozemske Antile", "name:frp"=>"Antiles nêrlandêses", "name:lij"=>"Antille Olandeixi", "name:lmo"=>"Antil Ulandes", "name:nov"=>"Nederlandani Antiles", "name:pap"=>"Antias Hulandes", "name:pms"=>"Antile Olandèise", "name:sah"=>"Недерланд Антиллара", "name:vec"=>"Antiłe Ołandexi", "name:wuu"=>"荷属安地列斯", "name:simple"=>"Netherlands Antilles", "name:be-x-old"=>"Нідэрляндзкія Антылы", "name:zh-min-nan"=>"Kē-tē-kok Antilles", "official_name:lv"=>"Nīderlandes Antiļas"     \N      58
-bh     "name"=>"البحرين", "name:af"=>"Bahrein", "name:ar"=>"البحرين", "name:be"=>"Бахрэйн", "name:br"=>"Bahrein", "name:ca"=>"Bahrain", "name:cy"=>"Bahrain", "name:da"=>"Bahrain", "name:de"=>"Bahrain", "name:el"=>"Μπαχρέιν", "name:en"=>"Bahrain", "name:eo"=>"Barejno", "name:es"=>"Bahréin", "name:et"=>"Bahrein", "name:fa"=>"بحرين", "name:fi"=>"Bahrain", "name:fr"=>"Bahreïn", "name:fy"=>"De Barein", "name:ga"=>"Bairéin", "name:gd"=>"Bachrain", "name:he"=>"בחריין", "name:hr"=>"Bahrein", "name:hu"=>"Bahrein", "name:id"=>"Bahrain", "name:is"=>"Barein", "name:it"=>"Bahrain", "name:ja"=>"バーレーン", "name:la"=>"Baharina", "name:lb"=>"Bahrain", "name:li"=>"Bahrein", "name:lt"=>"Bahreinas", "name:lv"=>"Bahreina", "name:mn"=>"Бахрейн", "name:nl"=>"Bahrein", "name:pl"=>"Bahrajn", "name:pt"=>"Bahrein", "name:ru"=>"Бахрейн", "name:sl"=>"Bahrajn", "name:sv"=>"Bahrain", "name:th"=>"ประเทศบาห์เรน", "name:tr"=>"Bahreyn", "name:uk"=>"Бахрейн", "name:vi"=>"Bahrain", "name:zh"=>"巴林", "name:haw"=>"Baharaina", "name:zh_py"=>"Balin", "name:zh_pyt"=>"Bālín", "official_name"=>"‎مملكة البحرين  (Mamlakat al-Baḥrayn)", "official_name:br"=>"Rouantelezh Bahrein", "official_name:el"=>"Βασίλειο του Μπαχρέιν", "official_name:en"=>"Kingdom of Bahrain", "official_name:et"=>"Bahreini Kuningriik", "official_name:id"=>"Kerajaan Bahrain", "official_name:it"=>"Regno del Bahrain", "official_name:ja"=>"バーレーン王国", "official_name:lt"=>"Bahreino Karalystė", "official_name:lv"=>"Bahreinas Karaliste", "official_name:pl"=>"Królestwo Bahrajnu", "official_name:pt"=>"Reino do Bahrein", "official_name:sv"=>"Konungariket Bahrain", "official_name:vi"=>"Vương quốc Bahrain"     \N      62
-nl     "name"=>"Nederland", "name:af"=>"Nederland", "name:an"=>"Países Baxos", "name:ar"=>"هولندا", "name:az"=>"Niderland", "name:be"=>"Нідэрланды", "name:bg"=>"Холандия", "name:bn"=>"নেদারল্যান্ড্‌স", "name:br"=>"Izelvroioù", "name:bs"=>"Holandija", "name:ca"=>"Països Baixos", "name:ce"=>"Нидерланд", "name:cs"=>"Nizozemsko", "name:cv"=>"Нидерланды", "name:cy"=>"Yr Iseldiroedd", "name:da"=>"Holland", "name:de"=>"Niederlande", "name:el"=>"Ολλανδία", "name:en"=>"The Netherlands", "name:eo"=>"Nederlando", "name:es"=>"Países Bajos", "name:et"=>"Holland", "name:eu"=>"Herbehereak", "name:fa"=>"هلند", "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"=>"Holanda", "name:gv"=>"Yn Ollan", "name:he"=>"הולנד", "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:ko"=>"네덜란드", "name:ks"=>"नेदरलैंड्स", "name:ku"=>"Holanda", "name:la"=>"Nederlandia", "name:lb"=>"Holland", "name:ln"=>"Holanda", "name:lt"=>"Nyderlandai", "name:lv"=>"Nīderlande", "name:mk"=>"Холандија", "name:mn"=>"Нидерланд", "name:mr"=>"नेदरलँड्स", "name:ms"=>"Belanda", "name:na"=>"Eben Eyong", "name:nl"=>"Nederland", "name:nn"=>"Nederland", "name:no"=>"Nederland", "name:oc"=>"Païses Basses", "name:os"=>"Нидерландтæ", "name:pl"=>"Holandia", "name:ps"=>"نېدرلانډ/هالېن", "name:pt"=>"Países Baixos", "name:qu"=>"Urasuyu", "name:ro"=>"Olanda", "name:ru"=>"Нидерланды", "name:rw"=>"U Buholandi", "name:se"=>"Vuolleeatnamat", "name:sh"=>"Nizozemska", "name:sk"=>"Holandsko", "name:sl"=>"Nizozemska", "name:so"=>"Nederland", "name:sq"=>"Holanda", "name:sr"=>"Холандија", "name:st"=>"Hôlanê", "name:su"=>"Walanda", "name:sv"=>"Nederländerna", "name:sw"=>"Uholanzi", "name:ta"=>"நெதர்லாந்து", "name:tg"=>"Нидерланд", "name:th"=>"ประเทศเนเธอร์แลนด์", "name:tl"=>"Netherlands", "name:to"=>"Holani", "name:tr"=>"Hollanda", "name:uk"=>"Нідерланди", "name:uz"=>"Niderlandlar", "name:vi"=>"Hà Lan", "name:vo"=>"Nedän", "name:wa"=>"Bas Payis", "name:wo"=>"Olaand", "name:zh"=>"荷兰", "name:haw"=>"Hōlani", "name:tet"=>"Olanda", "name:vec"=>"Paéxi Basi", "name:vls"=>"Olland", "name:war"=>"Paises Bajos", "name:de_CH"=>"Holland", "name:zh_py"=>"Helan", "name:zh_pyt"=>"Hélán", "official_name"=>"Koninkrijk der Nederlanden", "official_name:be"=>"Каралеўства Нідэрланды", "official_name:fr"=>"Royaume des Pays-Bas", "official_name:lb"=>"Kinneksräich Holland", "official_name:sv"=>"Konungariket Nederländerna", "official_name:vi"=>"Vương quốc Hà Lan"       \N      63
-cr     "name"=>"Costa Rica", "name:ar"=>"كوستاريكا", "name:be"=>"Коста Рыка", "name:br"=>"Costa Rica", "name:da"=>"Costa Rica", "name:el"=>"Κόστα Ρίκα", "name:en"=>"Costa Rica", "name:eo"=>"Kostariko", "name:fa"=>"کاستاریکا", "name:fi"=>"Costa Rica", "name:fr"=>"Costa Rica", "name:fy"=>"Kosta Rika", "name:ga"=>"Cósta Ríce", "name:he"=>"קוסטה ריקה", "name:hr"=>"Kostarika", "name:hu"=>"Costa Rica", "name:id"=>"Kosta Rika", "name:is"=>"Kosta Ríka", "name:it"=>"Costa Rica", "name:ja"=>"コスタリカ", "name:la"=>"Ora Opulenta", "name:lt"=>"Kosta Rika", "name:lv"=>"Kostarika", "name:mn"=>"Коста-Рика", "name:pl"=>"Kostaryka", "name:ru"=>"Коста-Рика", "name:sl"=>"Kostarika", "name:sv"=>"Costa Rica", "name:th"=>"ประเทศคอสตาริกา", "name:tr"=>"Kosta Rika", "name:uk"=>"Коста-Ріка", "name:zh"=>"哥斯大黎加", "official_name"=>"República de Costa Rica", "official_name:be"=>"Рэспубліка Коста-Рыка", "official_name:el"=>"Δημοκρατία της Κόστα Ρίκα", "official_name:en"=>"Republic of Costa Rica", "official_name:gd"=>"Poblachd Chosta Rica", "official_name:it"=>"Repubblica di Costa Rica", "official_name:lt"=>"Kosta Rikos Respublika", "official_name:lv"=>"Kostarikas Republika", "official_name:pl"=>"Republika Kostaryki", "official_name:sv"=>"Republiken Costa Rica", "official_name:vi"=>"Cộng hoà Costa Rica"    \N      64
+gt     "name"=>"Guatemala", "name:ar"=>"غواتيمالا", "name:be"=>"Гватэмала", "name:br"=>"Guatemala", "name:da"=>"Guatemala", "name:el"=>"Γουατεμάλα", "name:en"=>"Guatemala", "name:eo"=>"Gvatemalo", "name:fa"=>"گواتمالا", "name:fi"=>"Guatemala", "name:fr"=>"Guatemala", "name:fy"=>"Gûatemala", "name:ga"=>"Guatamala", "name:gd"=>"Guatamala", "name:he"=>"גואטמלה", "name:hr"=>"Gvatemala", "name:hu"=>"Guatemala", "name:is"=>"Gvatemala", "name:it"=>"Guatemala", "name:ja"=>"グアテマラ", "name:la"=>"Guatimalia", "name:lt"=>"Gvatemala", "name:lv"=>"Gvatemala", "name:mn"=>"Гватемал", "name:pl"=>"Gwatemala", "name:ru"=>"Гватемала", "name:sl"=>"Gvatemala", "name:sv"=>"Guatemala", "name:th"=>"ประเทศกัวเตมาลา", "name:uk"=>"Гватемала", "name:zh"=>"危地马拉", "official_name"=>"República de Guatemala", "official_name:be"=>"Рэспубліка Гватэмала", "official_name:el"=>"Δημοκρατία της Γουατεμάλας", "official_name:gd"=>"Poblachd Ghuatamala", "official_name:id"=>"Republik Guatemala", "official_name:it"=>"Repubblica del Guatemala", "official_name:lt"=>"Gvatemalos Respublika", "official_name:lv"=>"Gvatemalas Republika", "official_name:sv"=>"Republiken Guatemala", "official_name:vi"=>"Cộng hoà Guatemala"        es      57
+nl     "name"=>"Nederland", "name:af"=>"Nederland", "name:an"=>"Países Baxos", "name:ar"=>"هولندا", "name:az"=>"Niderland", "name:be"=>"Нідэрланды", "name:bg"=>"Холандия", "name:bn"=>"নেদারল্যান্ড্‌স", "name:br"=>"Izelvroioù", "name:bs"=>"Holandija", "name:ca"=>"Països Baixos", "name:ce"=>"Нидерланд", "name:cs"=>"Nizozemsko", "name:cv"=>"Нидерланды", "name:cy"=>"Yr Iseldiroedd", "name:da"=>"Holland", "name:de"=>"Niederlande", "name:el"=>"Ολλανδία", "name:en"=>"The Netherlands", "name:eo"=>"Nederlando", "name:es"=>"Países Bajos", "name:et"=>"Holland", "name:eu"=>"Herbehereak", "name:fa"=>"هلند", "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"=>"Holanda", "name:gv"=>"Yn Ollan", "name:he"=>"הולנד", "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:ko"=>"네덜란드", "name:ks"=>"नेदरलैंड्स", "name:ku"=>"Holanda", "name:la"=>"Nederlandia", "name:lb"=>"Holland", "name:ln"=>"Holanda", "name:lt"=>"Nyderlandai", "name:lv"=>"Nīderlande", "name:mk"=>"Холандија", "name:mn"=>"Нидерланд", "name:mr"=>"नेदरलँड्स", "name:ms"=>"Belanda", "name:na"=>"Eben Eyong", "name:nl"=>"Nederland", "name:nn"=>"Nederland", "name:no"=>"Nederland", "name:oc"=>"Païses Basses", "name:os"=>"Нидерландтæ", "name:pl"=>"Holandia", "name:ps"=>"نېدرلانډ/هالېن", "name:pt"=>"Países Baixos", "name:qu"=>"Urasuyu", "name:ro"=>"Olanda", "name:ru"=>"Нидерланды", "name:rw"=>"U Buholandi", "name:se"=>"Vuolleeatnamat", "name:sh"=>"Nizozemska", "name:sk"=>"Holandsko", "name:sl"=>"Nizozemska", "name:so"=>"Nederland", "name:sq"=>"Holanda", "name:sr"=>"Холандија", "name:st"=>"Hôlanê", "name:su"=>"Walanda", "name:sv"=>"Nederländerna", "name:sw"=>"Uholanzi", "name:ta"=>"நெதர்லாந்து", "name:tg"=>"Нидерланд", "name:th"=>"ประเทศเนเธอร์แลนด์", "name:tl"=>"Netherlands", "name:to"=>"Holani", "name:tr"=>"Hollanda", "name:uk"=>"Нідерланди", "name:uz"=>"Niderlandlar", "name:vi"=>"Hà Lan", "name:vo"=>"Nedän", "name:wa"=>"Bas Payis", "name:wo"=>"Olaand", "name:zh"=>"荷兰", "name:haw"=>"Hōlani", "name:tet"=>"Olanda", "name:vec"=>"Paéxi Basi", "name:vls"=>"Olland", "name:war"=>"Paises Bajos", "name:de_CH"=>"Holland", "name:zh_py"=>"Helan", "name:zh_pyt"=>"Hélán", "official_name"=>"Koninkrijk der Nederlanden", "official_name:be"=>"Каралеўства Нідэрланды", "official_name:fr"=>"Royaume des Pays-Bas", "official_name:lb"=>"Kinneksräich Holland", "official_name:sv"=>"Konungariket Nederländerna", "official_name:vi"=>"Vương quốc Hà Lan"       nl      63
+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"=>"尼泊尔", "name:haw"=>"Nepala", "name:zh_py"=>"Niboer", "name:zh_pyt"=>"Níbóěr", "official_name"=>"Sanghiya Loktantrik Ganatantratmak Nepāl", "official_name:br"=>"Republik Demokratel Kevreadel Nepal", "official_name:fr"=>"République démocratique fédérale du Népal", "official_name:it"=>"Repubblica Federale Democratica del Nepal", "official_name:lt"=>"Nepalo Federacinė Demokratinė Respublika", "official_name:lv"=>"Nepālas Karaliste", "official_name:ne"=>"संघीय लोकतान्त्रिक गणतन्त्रात्मक नेपाल", "official_name:pl"=>"Federalna Demokratyczna Republika Nepalu", "official_name:sv"=>"Demokratiska förbundsrepubliken Nepal", "official_name:vi"=>"Cộng hòa dân chủ liên bang Nepal"    ne      50
+tm     "name"=>"Türkmenistan", "name:af"=>"Turkmenistan", "name:ar"=>"تركمانستان", "name:az"=>"Türkmənistan", "name:be"=>"Туркменістан", "name:br"=>"Turkmenistan", "name:da"=>"Turkmenistan", "name:de"=>"Turkmenistan", "name:el"=>"Τουρκμενιστάν", "name:en"=>"Turkmenistan", "name:eo"=>"Turkmenio", "name:es"=>"Turkmenistán", "name:et"=>"Türkmenistan", "name:fa"=>"ترکمنستان", "name:fi"=>"Turkmenistan", "name:fr"=>"Turkménistan", "name:ga"=>"An Tuircméanastáin", "name:gd"=>"Turcmanastàn", "name:he"=>"טורקמניסטן", "name:hr"=>"Turkmenistan", "name:hu"=>"Türkmenisztán", "name:id"=>"Turkmenistan", "name:is"=>"Túrkmenistan", "name:it"=>"Turkmenistan", "name:ja"=>"トルクメニスタン", "name:la"=>"Turcomannia", "name:lt"=>"Turkmenistanas", "name:lv"=>"Turkmenistāna", "name:mn"=>"Туркменистан", "name:nl"=>"Turkmenistan", "name:pl"=>"Turkmenistan", "name:pt"=>"Turcomenistão", "name:ru"=>"Туркмения", "name:sl"=>"Turkmenistan", "name:sv"=>"Turkmenistan", "name:th"=>"ประเทศเติร์กเมนิสถาน", "name:tk"=>"Türkmenistan", "name:tr"=>"Türkmenistan", "name:uk"=>"Туркменістан", "name:vi"=>"Turkmenistan", "name:zh"=>"土库曼斯坦", "alt_name"=>"Turkmenia", "name:haw"=>"Tukemenikana", "name:zh_py"=>"Tukumansitan", "name:zh_pyt"=>"Tǔkùmànsītǎn", "official_name:lb"=>"Presidialrepublik Turkmenistan", "official_name:pt"=>"República do Turcomenistão", "official_name:vi"=>"Cộng hòa Turkmenistan"     tk      54
+ye     "name"=>"اليَمَن al-Yaman", "name:af"=>"Jemen", "name:ar"=>"اليمن", "name:be"=>"Йемен", "name:br"=>"Yemen", "name:ca"=>"Iemen", "name:cy"=>"Yemen", "name:da"=>"Yemen", "name:de"=>"Jemen", "name:el"=>"Υεμένη", "name:en"=>"Yemen", "name:eo"=>"Jemeno", "name:es"=>"Yemen", "name:et"=>"Jeemen", "name:fa"=>"يمن", "name:fi"=>"Jemen", "name:fr"=>"Yémen", "name:fy"=>"Jemen", "name:ga"=>"Éimin", "name:gd"=>"Iemen", "name:he"=>"תימן", "name:hr"=>"Jemen", "name:hu"=>"Jemen", "name:id"=>"Yaman", "name:is"=>"Jemen", "name:it"=>"Yemen", "name:ja"=>"イエメン", "name:la"=>"Iemenia", "name:lb"=>"Jemen", "name:li"=>"Jeme", "name:lt"=>"Jemenas", "name:mn"=>"Йемен", "name:nl"=>"Jemen", "name:pl"=>"Jemen", "name:pt"=>"Iêmen", "name:ru"=>"Йемен", "name:sl"=>"Jemen", "name:sv"=>"Jemen", "name:th"=>"ประเทศเยเมน", "name:tr"=>"Yemen", "name:uk"=>"Ємен", "name:vi"=>"Yemen", "name:zh"=>"也门", "name:haw"=>"Iemene", "name:zh_py"=>"Yemen", "name:zh_pyt"=>"Yěmén", "official_name:br"=>"Republik Yemen", "official_name:el"=>"Δημοκρατία της Υεμένης", "official_name:en"=>"Republic of Yemen", "official_name:et"=>"Jeemeni Vabariik", "official_name:fi"=>"Jemenin tasavalta", "official_name:id"=>"Republik Yaman", "official_name:it"=>"Repubblica Unita dello Yemen", "official_name:ja"=>"イエメン共和国", "official_name:lt"=>"Jemeno Respublika", "official_name:pl"=>"Republika Jemeńska", "official_name:pt"=>"República do Iêmen", "official_name:sv"=>"Republiken Jemen", "official_name:vi"=>"Cộng hòa Yemen"        ar      55
 td     "name"=>"Tchad / تشاد", "name:af"=>"Tsjaad", "name:ar"=>"تشاد", "name:be"=>"Чад", "name:br"=>"Tchad", "name:ca"=>"Txad", "name:cy"=>"Tchad", "name:da"=>"Tchad", "name:de"=>"Tschad", "name:el"=>"Τσαντ", "name:en"=>"Chad", "name:eo"=>"Ĉado", "name:es"=>"Chad", "name:et"=>"Tšaad", "name:fa"=>"چاد", "name:fi"=>"Tšad", "name:fr"=>"Tchad", "name:fy"=>"Tsjaad", "name:ga"=>"Sead", "name:gd"=>"An t-Siad", "name:he"=>"צ'אד", "name:hr"=>"Čad", "name:hu"=>"Csád", "name:id"=>"Chad", "name:is"=>"Tsjad", "name:it"=>"Ciad", "name:la"=>"Tzadia", "name:lb"=>"Tschad", "name:li"=>"Tsjaad", "name:lt"=>"Čadas", "name:mn"=>"Чад", "name:nl"=>"Tsjaad", "name:pl"=>"Czad", "name:pt"=>"Chade", "name:ru"=>"Чад", "name:sl"=>"Čad", "name:sv"=>"Tchad", "name:th"=>"ประเทศชาด", "name:tr"=>"Çad", "name:uk"=>"Чад", "name:vi"=>"Tchad", "name:zh"=>"乍得", "name:zh_py"=>"Zhade", "name:zh_pyt"=>"Zhàdé", "official_name"=>"République du Tchad;جمهورية تشاد ‎", "official_name:br"=>"Republik Tchad", "official_name:el"=>"Δημοκρατία του Τσαντ", "official_name:en"=>"Republic of Chad", "official_name:et"=>"Tšaadi Vabariik", "official_name:id"=>"Republik Chad", "official_name:pt"=>"República do Chade", "official_name:sv"=>"Republiken Tchad", "official_name:vi"=>"Cộng hoà Tchad"      \N      68
 nr     "name"=>"Nauru", "name:ar"=>"ناورو", "name:be"=>"Наўру", "name:br"=>"Nauru", "name:da"=>"Nauru", "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:hu"=>"Nauru", "name:is"=>"Nárú", "name:li"=>"Naoeroe", "name:lv"=>"Nauru", "name:mn"=>"Науру", "name:pl"=>"Nauru", "name:ru"=>"Науру", "name:sv"=>"Nauru", "name:th"=>"ประเทศนาอูรู", "name:uk"=>"Науру", "name:zh"=>"瑙魯", "official_name"=>"Republic of Nauru;Republik Naoero", "official_name:el"=>"Δημοκρατία του Ναουρού", "official_name:es"=>"República de Nauru", "official_name:gd"=>"Poblachd Nauru", "official_name:id"=>"Republik Nauru", "official_name:lb"=>"Republik Nauru", "official_name:lt"=>"Nauru Respublika", "official_name:lv"=>"Nauru Republika", "official_name:pl"=>"Republika Nauru", "official_name:sv"=>"Republiken Nauru", "official_name:vi"=>"Cộng hòa Nauru"  \N      70
 lu     "name"=>"Luxembourg", "name:af"=>"Luxemburg", "name:ar"=>"لكسمبرغ", "name:be"=>"Люксембург", "name:br"=>"Luksembourg", "name:ca"=>"Luxemburg", "name:cy"=>"Lwcsembwrg", "name:de"=>"Luxemburg", "name:el"=>"Λουξεμβούργο", "name:en"=>"Luxembourg", "name:eo"=>"Luksemburgo", "name:es"=>"Luxemburgo", "name:fa"=>"لوکزامبورگ", "name:fi"=>"Luxemburg", "name:fr"=>"Luxembourg", "name:fy"=>"Lúksemboarch", "name:ga"=>"Lucsamburg", "name:gd"=>"Lucsamburg", "name:he"=>"לוקסמבורג", "name:hr"=>"Luksemburg", "name:hu"=>"Luxemburg", "name:hy"=>"Լյուքսեմբուրգ", "name:id"=>"Luksemburg", "name:is"=>"Lúxemborg", "name:it"=>"Lussemburgo", "name:ja"=>"ルクセンブルク", "name:la"=>"Luxemburgum", "name:lb"=>"Lëtzebuerg", "name:lt"=>"Liuksemburgas", "name:lv"=>"Luksemburga", "name:mn"=>"Люксембург", "name:nl"=>"Luxemburg", "name:pl"=>"Luksemburg", "name:ru"=>"Люксембург", "name:sk"=>"Luxembursko", "name:sl"=>"Luksemburg", "name:sv"=>"Luxemburg", "name:th"=>"ประเทศลักเซมเบิร์ก", "name:tr"=>"Lüksemburg", "name:uk"=>"Люксембург", "name:zh"=>"卢森堡", "name:haw"=>"Lukemapuka", "name:zh_py"=>"Lusenbao", "name:zh_pyt"=>"Lúsenbao", "official_name"=>"Groussherzogtum Lëtzebuerg", "official_name:br"=>"Dugelezh Veur Luksembourg", "official_name:el"=>"Μέγα Δουκάτο του Λουξεμβούργου", "official_name:es"=>"Gran Ducado de Luxemburgo", "official_name:fr"=>"Grand-Duché de Luxembourg", "official_name:id"=>"Keharyapatihan Luksemburg", "official_name:it"=>"Granducato di Lussemburgo", "official_name:ja"=>"ルクセンブルク大公国", "official_name:lb"=>"Groussherzogtum Lëtzebuerg", "official_name:lt"=>"Liuksemburgo Didžioji Hercogystė", "official_name:lv"=>"Luksemburgas Lielhercogiste", "official_name:pl"=>"Wielkie Księstwo Luksemburga", "official_name:sk"=>"Luxemburské veľkovojvodstvo", "official_name:sl"=>"Véliko vójvodstvo Lúksemburg", "official_name:sv"=>"Storhertigdömet Luxemburg", "official_name:vi"=>"Đại công quốc Luxembourg"     \N      74
-ec     "name"=>"Ecuador", "name:ar"=>"إكوادور", "name:be"=>"Эквадор", "name:br"=>"Ecuador", "name:ca"=>"Equador", "name:da"=>"Ecuador", "name:de"=>"Ekuador", "name:el"=>"Ισημερινός", "name:en"=>"Ecuador", "name:eo"=>"Ekvadoro", "name:eu"=>"Ekuador", "name:fa"=>"اکوادور", "name:fi"=>"Ecuador", "name:fr"=>"Équateur", "name:fy"=>"Ekwador", "name:ga"=>"Eacuadór", "name:gd"=>"Eacuador", "name:he"=>"אקואדור", "name:hr"=>"Ekvador", "name:hu"=>"Ecuador", "name:id"=>"Ekuador", "name:is"=>"Ekvador", "name:ja"=>"エクアドル", "name:la"=>"Aequatoria", "name:lt"=>"Ekvadoras", "name:lv"=>"Ekvadora", "name:mn"=>"Эквадор", "name:pl"=>"Ekwador", "name:pt"=>"Equador", "name:ru"=>"Эквадор", "name:sk"=>"Ekvádor", "name:sl"=>"Ekvador", "name:sv"=>"Ecuador", "name:th"=>"ประเทศเอกวาดอร์", "name:tr"=>"Ekvador", "name:uk"=>"Еквадор", "name:zh"=>"厄瓜多尔", "official_name"=>"República del Ecuador", "official_name:el"=>"Δημοκρατία του Ισημερινού", "official_name:en"=>"Republic of Ecuador", "official_name:fr"=>"République de l'Équateur", "official_name:gd"=>"Poblachd Eacuador", "official_name:id"=>"Republik Ekuador", "official_name:lt"=>"Ekvadoro Respublika", "official_name:lv"=>"Ekvadoras Republika", "official_name:pl"=>"Republika Ekwadoru", "official_name:pt"=>"República do Equador", "official_name:sk"=>"Ekvádorská republika", "official_name:sv"=>"Republiken Ecuador", "official_name:vi"=>"Cộng hoà Ecuador"        \N      78
-fk     "name"=>"Falkland Islands", "name:af"=>"Falklandeilande", "name:ar"=>"جزر الفولكلاند", "name:be"=>"Фалклендскія астравы", "name:br"=>"Inizi Maloù", "name:ca"=>"Illes Malvines", "name:cy"=>"Ynysoedd y Falklands", "name:da"=>"Falklandsøerne", "name:de"=>"Falklandinseln", "name:en"=>"Falkland Islands", "name:eo"=>"Falklandoj", "name:es"=>"Islas Malvinas", "name:et"=>"Falklandi saared", "name:fa"=>"جزایر فالکلند", "name:fi"=>"Falklandinsaaret", "name:fr"=>"Îles Malouines", "name:fy"=>"Falklâneilannen", "name:ga"=>"Oileáin Fháclainne", "name:gd"=>"Na h-Eileanan Fàclainn", "name:he"=>"איי פוקלנד", "name:hr"=>"Falklandski Otoci", "name:hu"=>"Falkland-szigetek", "name:id"=>"Kepulauan Falkland", "name:is"=>"Falklandseyjar", "name:la"=>"Insulae Malvinae", "name:lt"=>"Malvinų salos", "name:lv"=>"Folklenda salas", "name:mn"=>"Фолклендийн Арлууд", "name:nl"=>"Falklandeilanden", "name:pl"=>"Falklandy", "name:ru"=>"Фолклендские Oстрова", "name:sl"=>"Falklandi", "name:sv"=>"Falklandsöarna", "name:th"=>"หมู่เกาะฟอล์กแลนด์", "name:tr"=>"Falkland Adaları", "name:uk"=>"Фолклендські острови", "name:vi"=>"Quần đảo Falkland", "name:zh"=>"福克兰群岛", "official_name:lv"=>"Folklenda (Malvinu) salas"    \N      91
+ec     "name"=>"Ecuador", "name:ar"=>"إكوادور", "name:be"=>"Эквадор", "name:br"=>"Ecuador", "name:ca"=>"Equador", "name:da"=>"Ecuador", "name:de"=>"Ekuador", "name:el"=>"Ισημερινός", "name:en"=>"Ecuador", "name:eo"=>"Ekvadoro", "name:eu"=>"Ekuador", "name:fa"=>"اکوادور", "name:fi"=>"Ecuador", "name:fr"=>"Équateur", "name:fy"=>"Ekwador", "name:ga"=>"Eacuadór", "name:gd"=>"Eacuador", "name:he"=>"אקואדור", "name:hr"=>"Ekvador", "name:hu"=>"Ecuador", "name:id"=>"Ekuador", "name:is"=>"Ekvador", "name:ja"=>"エクアドル", "name:la"=>"Aequatoria", "name:lt"=>"Ekvadoras", "name:lv"=>"Ekvadora", "name:mn"=>"Эквадор", "name:pl"=>"Ekwador", "name:pt"=>"Equador", "name:ru"=>"Эквадор", "name:sk"=>"Ekvádor", "name:sl"=>"Ekvador", "name:sv"=>"Ecuador", "name:th"=>"ประเทศเอกวาดอร์", "name:tr"=>"Ekvador", "name:uk"=>"Еквадор", "name:zh"=>"厄瓜多尔", "official_name"=>"República del Ecuador", "official_name:el"=>"Δημοκρατία του Ισημερινού", "official_name:en"=>"Republic of Ecuador", "official_name:fr"=>"République de l'Équateur", "official_name:gd"=>"Poblachd Eacuador", "official_name:id"=>"Republik Ekuador", "official_name:lt"=>"Ekvadoro Respublika", "official_name:lv"=>"Ekvadoras Republika", "official_name:pl"=>"Republika Ekwadoru", "official_name:pt"=>"República do Equador", "official_name:sk"=>"Ekvádorská republika", "official_name:sv"=>"Republiken Ecuador", "official_name:vi"=>"Cộng hoà Ecuador"        es      78
 kg     "name"=>"Kyrgyzstan", "name:af"=>"Kirgisië", "name:ar"=>"قيرغيزستان", "name:az"=>"Qırğızıstan", "name:be"=>"Кыргызстан", "name:br"=>"Kirgizstan", "name:ca"=>"Kirguizistan", "name:da"=>"Kirgisistan", "name:de"=>"Kirgisistan", "name:el"=>"Κιργιζία", "name:en"=>"Kyrgyzstan", "name:eo"=>"Kirgizio", "name:es"=>"Kirguistán", "name:et"=>"Kõrgõzstan", "name:fa"=>"قرقیزستان", "name:fi"=>"Kirgisia", "name:fr"=>"Kirghizistan", "name:fy"=>"Kirgyzje", "name:ga"=>"An Chirgeastáin", "name:gd"=>"Cirgiostàn", "name:he"=>"קירגיסטן", "name:hr"=>"Kirgistan", "name:hu"=>"Kirgizisztán", "name:id"=>"Kirgizstan", "name:is"=>"Kirgistan", "name:it"=>"Kirghizistan", "name:ky"=>"Кыргызстан", "name:la"=>"Chirgisia", "name:lb"=>"Kirgisistan", "name:li"=>"Kirgizië", "name:lt"=>"Kirgizija", "name:lv"=>"Kirgizstāna", "name:mn"=>"Кыргызстан", "name:nl"=>"Kirgizië", "name:pl"=>"Kirgistan", "name:ru"=>"Киргизия", "name:sl"=>"Kirgizistan", "name:sv"=>"Kirgizistan", "name:th"=>"ประเทศคีร์กีซสถาน", "name:tr"=>"Kırgızistan", "name:uk"=>"Киргизстан", "name:zh"=>"吉尔吉斯斯坦", "name:haw"=>"Kaikikana", "name:zh_py"=>"Jierjisisitan", "name:zh_pyt"=>"Jíěrjísīsītǎn", "official_name:el"=>"Δημοκρατία της Κιργιζίας", "official_name:et"=>"Kirgiisi Vabariik", "official_name:it"=>"Repubblica del Kirghizistan", "official_name:lb"=>"Kirgisesch Republik", "official_name:lt"=>"Kirgizijos Respublika", "official_name:lv"=>"Kirgizstānas Republika", "official_name:pl"=>"Republika Kirgistanu", "official_name:sv"=>"Republiken Kirgizistan" \N      93
 kz     "name"=>"Kazakhstan", "name:af"=>"Kasakstan", "name:ar"=>"كازاخستان", "name:az"=>"Qazaxıstan", "name:be"=>"Казахстан", "name:br"=>"Kazakstan", "name:cy"=>"Kazakstan", "name:da"=>"Kasakhstan", "name:de"=>"Kasachstan", "name:en"=>"Kazakhstan", "name:eo"=>"Kazaĥio", "name:es"=>"Kazajistán", "name:et"=>"Kasahstan", "name:fa"=>"قزاقستان", "name:fi"=>"Kazakstan", "name:fr"=>"Kazakhstan", "name:fy"=>"Kazachstan", "name:ga"=>"An Chasacstáin", "name:gd"=>"Casachstan", "name:he"=>"קזחסטן", "name:hr"=>"Kazahstan", "name:hu"=>"Kazahsztán", "name:is"=>"Kasakstan", "name:it"=>"Kazakistan", "name:ja"=>"カザフスタン", "name:kk"=>"Қазақстан (Qazaqstan)", "name:la"=>"Casachia", "name:lb"=>"Kasachstan", "name:li"=>"Kazachstan", "name:lt"=>"Kazachstanas", "name:lv"=>"Kazahstāna", "name:mn"=>"Казахстан", "name:nl"=>"Kazachstan", "name:pl"=>"Kazachstan", "name:ru"=>"Казахстан", "name:sl"=>"Kazahstan", "name:sv"=>"Kazakstan", "name:th"=>"ประเทศคาซัคสถาน", "name:tr"=>"Kazakistan", "name:uk"=>"Казахстан", "name:zh"=>"哈萨克斯坦", "name:haw"=>"Kasakana", "name:zh_py"=>"Hasakesitan", "name:zh_pyt"=>"Hāsàkèsītǎn", "official_name"=>"Republic of Kazakhstan", "official_name:be"=>"Рэспубліка Казахстан", "official_name:et"=>"Kasahstani Vabariik", "official_name:id"=>"Republik Kazakhstan", "official_name:lt"=>"Kazachstano Respublika", "official_name:lv"=>"Kazahstānas Republika", "official_name:pl"=>"Republika Kazachstanu", "official_name:sv"=>"Republiken Kazakstan", "official_name:vi"=>"Cộng hoà Kazakhstan"       \N      94
 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"=>"诺福克岛", "name:pih"=>"Norfuk Ailen", "official_name"=>"Territory of Norfolk Island", "official_name:lv"=>"Norfolkas salas teritorija", "official_name:pl"=>"Terytorium Wyspy Norfolk"        \N      100
-sv     "name:ar"=>"السلفادور", "name:be"=>"Эль-Сальвадор", "name:br"=>"Salvador", "name:da"=>"El Salvador", "name:el"=>"Ελ Σαλβαδόρ", "name:en"=>"El Salvador", "name:eo"=>"Salvadoro", "name:fa"=>"السالوادور", "name:fi"=>"El Salvador", "name:fr"=>"Salvador", "name:ga"=>"An tSalvadóir", "name:gd"=>"El Salbhador", "name:he"=>"אל סלבדור", "name:hr"=>"Salvador", "name:hu"=>"El Salvador", "name:is"=>"El Salvador", "name:it"=>"El Salvador", "name:ja"=>"エルサルバドル", "name:la"=>"Salvatoria", "name:lt"=>"El Salvadoras", "name:lv"=>"Salvadora", "name:mn"=>"Эль Сальвадор", "name:pl"=>"Salwador", "name:ru"=>"Эль-Сальвадор", "name:sl"=>"Salvador", "name:sv"=>"El Salvador", "name:th"=>"ประเทศเอลซัลวาดอร์", "name:uk"=>"Сальвадор", "name:zh"=>"萨尔瓦多", "official_name"=>"República de El Salvador", "official_name:be"=>"Рэспубліка Эль-Сальвадор", "official_name:el"=>"Δημοκρατία του Ελ Σαλβαδόρ", "official_name:id"=>"Republik El Salvador", "official_name:ja"=>"エルサルバドル共和国", "official_name:lv"=>"Salvadoras Republika", "official_name:pl"=>"Republika Salwadoru", "official_name:sv"=>"Republiken El Salvador", "official_name:vi"=>"Cộng hòa El Salvador"    \N      103
-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"=>"Otoci 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"=>"Terkso ir Kaikoso salos", "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"=>"Turks e Caicos", "name:ro"=>"Insulele Turks şi Caicos", "name:ru"=>"Острова Тёркс и Кайкос", "name:sh"=>"Turks i Caicos Otoci", "name:sk"=>"Turks a 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"=>"特克斯和凱科斯群島", "name:ast"=>"Islles Turques y Caicos", "name:bpy"=>"তার্কস বারো কাইকোস দ্বীপমালা", "name:dsb"=>"Turks a Caicos", "name:frp"=>"Iles Turques et Cayiques", "name:lij"=>"Turks e Caicos", "name:lmo"=>"Turks e Caicos", "name:nov"=>"Turks e Kaikos Isles", "name:pms"=>"Turks e Caicos", "name:simple"=>"Turks and Caicos Islands", "name:be-x-old"=>"Тэркс і Кэйкас", "name:zh-min-nan"=>"Turks kap Caicos Kûn-tó", "official_name:et"=>"Turksi ja Caicose saarte asumaa"  \N      106
 gl     "name"=>"Kalaallit Nunaat", "name:af"=>"Groenland", "name:am"=>"ግሪንላንድ", "name:an"=>"Gronlandia", "name:ar"=>"غرينلاند", "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"=>"Grenlandia", "name:gv"=>"Greenlynn", "name:he"=>"גרינלנד", "name:hr"=>"Grenland", "name:hu"=>"Grönland", "name:ia"=>"Groenlandia", "name:id"=>"Greenland", "name:io"=>"Grenlando", "name:is"=>"Grænland", "name:it"=>"Groenlandia", "name:iu"=>"ᐊᑯᑭᑦᑐᑦ/akukittut", "name:ja"=>"グリーンランド", "name:jv"=>"Greenland", "name:ka"=>"გრენლანდია", "name:kk"=>"Гренландия", "name:kl"=>"Kalaallit Nunaat", "name:kn"=>"ಗ್ರೀನ್‍ಲ್ಯಾಂಡ್", "name:ko"=>"그린란드", "name:ku"=>"Gronland", "name:kv"=>"Гренландия", "name:kw"=>"Greunland", "name:la"=>"Groenlandia", "name:lb"=>"Grönland", "name:li"=>"Greunland", "name:lt"=>"Grenlandija", "name:lv"=>"Grenlande", "name:mk"=>"Гренланд", "name:ml"=>"ഗ്രീന്‍ലാന്‍ഡ്", "name:mn"=>"Гренланд", "name:mr"=>"ग्रीनलँड", "name:ms"=>"Greenland", "name:nl"=>"Groenland", "name:nn"=>"Grønland", "name:no"=>"Grønland", "name:oc"=>"Groenlàndia", "name:os"=>"Гренланди", "name:pa"=>"ਗਰੀਨਲੈਂਡ", "name:pl"=>"Grenlandia", "name:pt"=>"Gronelândia", "name:qu"=>"Kalalit Nunat", "name:ro"=>"Groenlanda", "name:ru"=>"Гренландия", "name:sh"=>"Grenland", "name:sk"=>"Grónsko", "name:sl"=>"Grenlandija", "name:sq"=>"Grenlanda", "name:sr"=>"Гренланд", "name:sv"=>"Grönland", "name:sw"=>"Greenland", "name:ta"=>"கிறீன்லாந்து", "name:te"=>"గ్రీన్‌లాండ్", "name:tg"=>"Гренландия", "name:th"=>"กรีนแลนด์", "name:tl"=>"Lupanlunti", "name:tr"=>"Grönland", "name:ug"=>"Grénlandiye", "name:uk"=>"Ґренландія", "name:vi"=>"Greenland", "name:wo"=>"Groenlaand", "name:zh"=>"格陵兰岛", "name:ang"=>"Grēneland", "name:ast"=>"Groenlandia", "name:bar"=>"Grönland", "name:bpy"=>"গ্রীনল্যান্ড", "name:dsb"=>"Grónlandska", "name:frp"=>"Grônlande", "name:hif"=>"Greenland", "name:lij"=>"Gròenlandia", "name:nah"=>"Groentlālpan", "name:nds"=>"Gröönland", "name:nov"=>"Verdi-lande", "name:pms"=>"Groenlandia", "name:scn"=>"Groenlannia", "name:szl"=>"Grynlandyjo", "name:tpi"=>"Greenland", "name:vec"=>"Groenłandia", "name:wuu"=>"格陵兰", "name:zh_py"=>"Gelinglan Dao", "name:nds-nl"=>"Gruunlaand", "name:simple"=>"Greenland", "name:zh-yue"=>"格陵蘭", "name:zh_pyt"=>"Gélínglán Dǎo", "name:bat-smg"=>"Grenlandėjė", "name:be-x-old"=>"Грэнляндыя", "name:zh-min-nan"=>"Chheⁿ-tē", "name:zh-classical"=>"格陵蘭"  \N      111
-cz     "name"=>"Česká republika", "name:af"=>"Tsjeggië", "name:ar"=>"الجمهورية التشيكية", "name:be"=>"Чэхія", "name:br"=>"Republik Tchek", "name:ca"=>"República Txeca", "name:cs"=>"Česká republika", "name:cy"=>"Gweriniaeth Tsiec", "name:da"=>"Tjekkiet", "name:de"=>"Tschechien", "name:el"=>"Τσεχία", "name:en"=>"Czech Republic", "name:eo"=>"Ĉeĥio", "name:es"=>"República Checa", "name:et"=>"Tšehhi", "name:eu"=>"Txekiar Errepublika", "name:fa"=>"جمهوری چک", "name:fi"=>"Tšekki", "name:fr"=>"République tchèque", "name:fy"=>"Tsjechje", "name:ga"=>"Poblacht na Seice", "name:gd"=>"An t-Seic", "name:he"=>"צכיה", "name:hr"=>"Češka", "name:hu"=>"Csehország", "name:id"=>"Republik Ceko", "name:is"=>"Tékkland", "name:it"=>"Cechia", "name:ja"=>"チェコ", "name:la"=>"Bohemia", "name:lb"=>"Tschechien", "name:li"=>"Tsjechië", "name:lt"=>"Čekija", "name:lv"=>"Čehija", "name:mn"=>"Бүгд Найрамдах Чех Улс", "name:nl"=>"Tsjechië", "name:pl"=>"Czechy", "name:pt"=>"República Checa", "name:ru"=>"Чехия", "name:sk"=>"Česko", "name:sl"=>"Češka", "name:sv"=>"Tjeckien", "name:th"=>"สาธารณรัฐเช็ก", "name:tr"=>"Çek Cumhuriyeti", "name:uk"=>"Чеська Республіка", "name:vi"=>"Cộng hòa Séc", "name:zh"=>"捷克", "name:haw"=>"Lepupalika ‘o Tieka", "name:zh_py"=>"Jieke", "name:zh_pyt"=>"Jiékè", "official_name:el"=>"Τσεχική Δημοκρατία", "official_name:it"=>"Repubblica Ceca", "official_name:ja"=>"チェコ共和国", "official_name:la"=>"Res publica Bohemica", "official_name:lb"=>"Tschechesch Republik", "official_name:lt"=>"Čekijos Respublika", "official_name:lv"=>"Čehijas Republika", "official_name:pl"=>"Republika Czeska", "official_name:pt"=>"República Checa", "official_name:ru"=>"Чешская Республика", "official_name:sk"=>"Česká republika", "official_name:sv"=>"Republiken Tjeckien"        \N      124
-kw     "name"=>"Kuwait / الكويت", "name:af"=>"Koeweit", "name:an"=>"Kuwait", "name:ar"=>"الكويت", "name:az"=>"Küveyt", "name:be"=>"Кувейт", "name:bg"=>"Кувейт", "name:bn"=>"কুয়েত", "name:br"=>"Koweit", "name:bs"=>"Kuvajt", "name:ca"=>"Kuwait", "name:cs"=>"Kuvajt", "name:cv"=>"Кувейт", "name:de"=>"Kuwait", "name:dv"=>"ކުވެއިތު", "name:dz"=>"ཀུ་ཝེཊ་", "name:el"=>"Κουβέιτ", "name:en"=>"Kuwait", "name:eo"=>"Kuvajto", "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:gv"=>"Yn Choowait", "name:he"=>"כווית", "name:hi"=>"कुवैत", "name:hr"=>"Kuvajt", "name:ht"=>"Kowet", "name:hu"=>"Kuvait", "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:km"=>"គុយវ៉ែត", "name:kn"=>"ಕುವೈತ್", "name:ko"=>"쿠웨이트", "name:ku"=>"Kuweyt", "name:kv"=>"Кувейт", "name:kw"=>"Kuwait", "name:la"=>"Cuvaitum", "name:li"=>"Koeweit", "name:lt"=>"Kuveitas", "name:lv"=>"Kuveita", "name:mk"=>"Кувајт", "name:ml"=>"കുവൈറ്റ്‌", "name:mn"=>"Кувейт", "name:mr"=>"कुवैत", "name:ms"=>"Kuwait", "name:nl"=>"Koeweit", "name:nn"=>"Kuwait", "name:no"=>"Kuwait", "name:oc"=>"Kowait", "name:os"=>"Кувейт", "name:pl"=>"Kuwejt", "name:pt"=>"Kuwait", "name:qu"=>"Kuwait", "name:ro"=>"Kuweit", "name:ru"=>"Кувейт", "name:sa"=>"कुवैत", "name:se"=>"Kuwait", "name:sh"=>"Kuvajt", "name:sk"=>"Kuvajt", "name:sl"=>"Kuvajt", "name:sq"=>"Kuvajti", "name:sr"=>"Кувајт", "name:sv"=>"Kuwait", "name:sw"=>"Kuwait", "name:ta"=>"குவைத்", "name:te"=>"కువైట్", "name:tg"=>"Кувайт", "name:th"=>"ประเทศคูเวต", "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:zh"=>"科威特", "name:ace"=>"Kuwait", "name:als"=>"Kuwait", "name:ang"=>"Cuwait", "name:arc"=>"ܟܘܝܬ", "name:arz"=>"الكويت", "name:ast"=>"Kuwait", "name:bcl"=>"Kuwait", "name:bpy"=>"কুয়েত", "name:ceb"=>"Kuwait", "name:crh"=>"Küveyt", "name:dsb"=>"Kuwait", "name:frp"=>"Koveyit", "name:hak"=>"Khô-vî-thi̍t", "name:haw"=>"Kuete", "name:hif"=>"Kuwait", "name:hsb"=>"Kuwait", "name:ilo"=>"Kuwait", "name:lij"=>"Kuwait", "name:lmo"=>"Kuwait", "name:nah"=>"Cuhuait", "name:nds"=>"Kuwait", "name:nov"=>"Kuwayt", "name:pam"=>"Kuwait", "name:pms"=>"Kuwait", "name:sah"=>"Кувейт", "name:scn"=>"Kuwait", "name:szl"=>"Kuwejt", "name:udm"=>"Кувейт", "name:war"=>"Kuwait", "name:wuu"=>"科威特", "name:zh_py"=>"Keweite", "name:simple"=>"Kuwait", "name:zh_pyt"=>"Kēwēitè", "name:bat-smg"=>"Kovėits", "name:fiu-vro"=>"Kuveit", "name:be-x-old"=>"Кувэйт", "official_name"=>"State of Kuwait", "name:zh-min-nan"=>"Kuwait", "official_name:br"=>"Stad Koweit", "official_name:el"=>"Κράτος του Κουβέιτ", "official_name:en"=>"State of Kuwait", "official_name:et"=>"Kuveidi Riik", "official_name:it"=>"Stato del Kuwait", "official_name:lt"=>"Kuveito Valstybė", "official_name:lv"=>"Kuveitas Valsts", "official_name:pl"=>"Państwo Kuwejt", "official_name:sv"=>"Staten Kuwait", "name:zh-classical"=>"科威特"   \N      127
+sv     "name:ar"=>"السلفادور", "name:be"=>"Эль-Сальвадор", "name:br"=>"Salvador", "name:da"=>"El Salvador", "name:el"=>"Ελ Σαλβαδόρ", "name:en"=>"El Salvador", "name:eo"=>"Salvadoro", "name:fa"=>"السالوادور", "name:fi"=>"El Salvador", "name:fr"=>"Salvador", "name:ga"=>"An tSalvadóir", "name:gd"=>"El Salbhador", "name:he"=>"אל סלבדור", "name:hr"=>"Salvador", "name:hu"=>"El Salvador", "name:is"=>"El Salvador", "name:it"=>"El Salvador", "name:ja"=>"エルサルバドル", "name:la"=>"Salvatoria", "name:lt"=>"El Salvadoras", "name:lv"=>"Salvadora", "name:mn"=>"Эль Сальвадор", "name:pl"=>"Salwador", "name:ru"=>"Эль-Сальвадор", "name:sl"=>"Salvador", "name:sv"=>"El Salvador", "name:th"=>"ประเทศเอลซัลวาดอร์", "name:uk"=>"Сальвадор", "name:zh"=>"萨尔瓦多", "official_name"=>"República de El Salvador", "official_name:be"=>"Рэспубліка Эль-Сальвадор", "official_name:el"=>"Δημοκρατία του Ελ Σαλβαδόρ", "official_name:id"=>"Republik El Salvador", "official_name:ja"=>"エルサルバドル共和国", "official_name:lv"=>"Salvadoras Republika", "official_name:pl"=>"Republika Salwadoru", "official_name:sv"=>"Republiken El Salvador", "official_name:vi"=>"Cộng hòa El Salvador"    es      103
+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"=>"Otoci 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"=>"Terkso ir Kaikoso salos", "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"=>"Turks e Caicos", "name:ro"=>"Insulele Turks şi Caicos", "name:ru"=>"Острова Тёркс и Кайкос", "name:sh"=>"Turks i Caicos Otoci", "name:sk"=>"Turks a 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"=>"特克斯和凱科斯群島", "name:ast"=>"Islles Turques y Caicos", "name:bpy"=>"তার্কস বারো কাইকোস দ্বীপমালা", "name:dsb"=>"Turks a Caicos", "name:frp"=>"Iles Turques et Cayiques", "name:lij"=>"Turks e Caicos", "name:lmo"=>"Turks e Caicos", "name:nov"=>"Turks e Kaikos Isles", "name:pms"=>"Turks e Caicos", "name:simple"=>"Turks and Caicos Islands", "name:be-x-old"=>"Тэркс і Кэйкас", "name:zh-min-nan"=>"Turks kap Caicos Kûn-tó", "official_name:et"=>"Turksi ja Caicose saarte asumaa"  en      106
 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"=>"印度", "name:haw"=>"‘Īnia", "name:zh_py"=>"Yindu", "name:zh_pyt"=>"Yìndù", "official_name"=>"भारत गणराज्य", "official_name:el"=>"Δημοκρατία της Ινδίας", "official_name:en"=>"Republic of India", "official_name:fr"=>"République de l'Inde", "official_name:hi"=>"भारत गणराज्य", "official_name:id"=>"Republik India", "official_name:it"=>"Repubblica dell'India", "official_name:lb"=>"Republik Indien", "official_name:lt"=>"Indijos Respublika", "official_name:lv"=>"Indijas Republika", "official_name:pl"=>"Republika Indii", "official_name:sv"=>"Republiken Indien"       \N      128
 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"=>"法属南部领地", "name:lij"=>"Tæritöi Françèisi Meridionâ e dell'Antartigo", "name:be-x-old"=>"Францускія Паўднёвыя Тэрыторыі"     fr      132
-co     "name"=>"Colombia", "name:ar"=>"كولومبيا", "name:be"=>"Калумбія", "name:br"=>"Kolombia", "name:ca"=>"Colòmbia", "name:da"=>"Colombia", "name:de"=>"Kolumbien", "name:el"=>"Κολομβία", "name:en"=>"Colombia", "name:eo"=>"Kolombio", "name:eu"=>"Kolonbia", "name:fa"=>"کلمبیا", "name:fi"=>"Kolumbia", "name:fr"=>"Colombie", "name:fy"=>"Kolombia", "name:ga"=>"An Cholóim", "name:he"=>"קולומביה", "name:hr"=>"Kolumbija", "name:id"=>"Kolombia", "name:is"=>"Kólumbía", "name:it"=>"Colombia", "name:ja"=>"コロンビア", "name:la"=>"Columbia", "name:lb"=>"Kolumbien", "name:lt"=>"Kolumbija", "name:lv"=>"Kolumbija", "name:mn"=>"Колумб", "name:pl"=>"Kolumbia", "name:pt"=>"Colômbia", "name:ru"=>"Колумбия", "name:sl"=>"Kolumbija", "name:sv"=>"Colombia", "name:th"=>"ประเทศโคลอมเบีย", "name:tr"=>"Kolombiya", "name:uk"=>"Колумбія", "name:zh"=>"哥伦比亚", "official_name"=>"República de Colombia", "official_name:be"=>"Рэспубліка Калумбія", "official_name:el"=>"Δημοκρατία της Κολομβίας", "official_name:en"=>"Republic of Colombia", "official_name:fr"=>"République de Colombie", "official_name:id"=>"Republik Kolombia", "official_name:lt"=>"Kolumbijos Respublika", "official_name:pl"=>"Republika Kolumbii", "official_name:sv"=>"Republiken Colombia", "official_name:vi"=>"Cộng hoà Colombia"   \N      133
 er     "name"=>"Eritrea", "name:af"=>"Eritrea", "name:ar"=>"إريتريا", "name:be"=>"Эрытрэя", "name:br"=>"Eritrea", "name:el"=>"Ερυθραία", "name:en"=>"Eritrea", "name:eo"=>"Eritreo", "name:es"=>"Eritrea", "name:fa"=>"اریتره", "name:fi"=>"Eritrea", "name:fr"=>"Érythrée", "name:ga"=>"An Eiritré", "name:gd"=>"Ertra", "name:he"=>"אריתריאה", "name:hr"=>"Eritreja", "name:hu"=>"Eritrea", "name:is"=>"Erítrea", "name:it"=>"Eritrea", "name:ja"=>"エリトリア", "name:la"=>"Erythraea", "name:lt"=>"Eritrėja", "name:lv"=>"Eritreja", "name:mn"=>"Энэтхэг", "name:pl"=>"Erytrea", "name:pt"=>"Eritreia;Eritréia", "name:ru"=>"Эритрея", "name:sl"=>"Eritreja", "name:sv"=>"Eritrea", "name:th"=>"ประเทศเอริเทรีย", "name:tr"=>"Eritre", "name:uk"=>"Еритрея", "name:zh"=>"厄立特里亚", "name:pt@BR"=>"Eritréia", "name:pt@PT"=>"Eritreia", "name:zh_py"=>"Eliteliya", "name:zh_pyt"=>"Èlìtèlǐyà", "official_name:el"=>"Κράτος της Ερυθραίας", "official_name:en"=>"State of Eritrea", "official_name:lv"=>"Eritrejas Valsts", "official_name:pt"=>"Estado da Eritreia;Estado da Eritréia", "official_name:vi"=>"Quốc gia Eritrea", "official_name:pt@BR"=>"Estado da Eritréia", "official_name:pt@PT"=>"Estado da Eritreia"      \N      142
-ro     "name"=>"România", "name:af"=>"Roemenië", "name:ar"=>"رومانيا", "name:be"=>"Румынія", "name:br"=>"Roumania", "name:ca"=>"Romania", "name:cy"=>"Rwmania", "name:da"=>"Rumænien", "name:de"=>"Rumänien", "name:el"=>"Ρουμανία", "name:en"=>"Romania", "name:eo"=>"Rumanio", "name:es"=>"Rumania", "name:et"=>"Rumeenia", "name:fa"=>"رومانی", "name:fi"=>"Romania", "name:fr"=>"Roumanie", "name:fy"=>"Roemeenje", "name:ga"=>"An Rómáin", "name:gd"=>"Ròmainia", "name:he"=>"רומניה", "name:hr"=>"Rumunjska", "name:hu"=>"Románia", "name:id"=>"Rumania", "name:is"=>"Rúmenía", "name:it"=>"Romania", "name:ja"=>"ルーマニア", "name:la"=>"Romania", "name:lb"=>"Rumänien", "name:li"=>"Roemenië", "name:lt"=>"Rumunija", "name:lv"=>"Rumānija", "name:mn"=>"Румын", "name:nl"=>"Roemenië", "name:pl"=>"Rumunia", "name:ro"=>"România", "name:ru"=>"Румыния", "name:sk"=>"Rumunsko", "name:sl"=>"Romunija", "name:sv"=>"Rumänien", "name:th"=>"ประเทศโรมาเนีย", "name:tr"=>"Romanya", "name:uk"=>"Румунія", "name:vi"=>"Romania", "name:zh"=>"罗马尼亚", "name:haw"=>"Romānia", "name:zh_py"=>"Luomaniya", "name:zh_pyt"=>"Luómăníyà"     \N      170
+kw     "name"=>"Kuwait / الكويت", "name:af"=>"Koeweit", "name:an"=>"Kuwait", "name:ar"=>"الكويت", "name:az"=>"Küveyt", "name:be"=>"Кувейт", "name:bg"=>"Кувейт", "name:bn"=>"কুয়েত", "name:br"=>"Koweit", "name:bs"=>"Kuvajt", "name:ca"=>"Kuwait", "name:cs"=>"Kuvajt", "name:cv"=>"Кувейт", "name:de"=>"Kuwait", "name:dv"=>"ކުވެއިތު", "name:dz"=>"ཀུ་ཝེཊ་", "name:el"=>"Κουβέιτ", "name:en"=>"Kuwait", "name:eo"=>"Kuvajto", "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:gv"=>"Yn Choowait", "name:he"=>"כווית", "name:hi"=>"कुवैत", "name:hr"=>"Kuvajt", "name:ht"=>"Kowet", "name:hu"=>"Kuvait", "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:km"=>"គុយវ៉ែត", "name:kn"=>"ಕುವೈತ್", "name:ko"=>"쿠웨이트", "name:ku"=>"Kuweyt", "name:kv"=>"Кувейт", "name:kw"=>"Kuwait", "name:la"=>"Cuvaitum", "name:li"=>"Koeweit", "name:lt"=>"Kuveitas", "name:lv"=>"Kuveita", "name:mk"=>"Кувајт", "name:ml"=>"കുവൈറ്റ്‌", "name:mn"=>"Кувейт", "name:mr"=>"कुवैत", "name:ms"=>"Kuwait", "name:nl"=>"Koeweit", "name:nn"=>"Kuwait", "name:no"=>"Kuwait", "name:oc"=>"Kowait", "name:os"=>"Кувейт", "name:pl"=>"Kuwejt", "name:pt"=>"Kuwait", "name:qu"=>"Kuwait", "name:ro"=>"Kuweit", "name:ru"=>"Кувейт", "name:sa"=>"कुवैत", "name:se"=>"Kuwait", "name:sh"=>"Kuvajt", "name:sk"=>"Kuvajt", "name:sl"=>"Kuvajt", "name:sq"=>"Kuvajti", "name:sr"=>"Кувајт", "name:sv"=>"Kuwait", "name:sw"=>"Kuwait", "name:ta"=>"குவைத்", "name:te"=>"కువైట్", "name:tg"=>"Кувайт", "name:th"=>"ประเทศคูเวต", "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:zh"=>"科威特", "name:ace"=>"Kuwait", "name:als"=>"Kuwait", "name:ang"=>"Cuwait", "name:arc"=>"ܟܘܝܬ", "name:arz"=>"الكويت", "name:ast"=>"Kuwait", "name:bcl"=>"Kuwait", "name:bpy"=>"কুয়েত", "name:ceb"=>"Kuwait", "name:crh"=>"Küveyt", "name:dsb"=>"Kuwait", "name:frp"=>"Koveyit", "name:hak"=>"Khô-vî-thi̍t", "name:haw"=>"Kuete", "name:hif"=>"Kuwait", "name:hsb"=>"Kuwait", "name:ilo"=>"Kuwait", "name:lij"=>"Kuwait", "name:lmo"=>"Kuwait", "name:nah"=>"Cuhuait", "name:nds"=>"Kuwait", "name:nov"=>"Kuwayt", "name:pam"=>"Kuwait", "name:pms"=>"Kuwait", "name:sah"=>"Кувейт", "name:scn"=>"Kuwait", "name:szl"=>"Kuwejt", "name:udm"=>"Кувейт", "name:war"=>"Kuwait", "name:wuu"=>"科威特", "name:zh_py"=>"Keweite", "name:simple"=>"Kuwait", "name:zh_pyt"=>"Kēwēitè", "name:bat-smg"=>"Kovėits", "name:fiu-vro"=>"Kuveit", "name:be-x-old"=>"Кувэйт", "official_name"=>"State of Kuwait", "name:zh-min-nan"=>"Kuwait", "official_name:br"=>"Stad Koweit", "official_name:el"=>"Κράτος του Κουβέιτ", "official_name:en"=>"State of Kuwait", "official_name:et"=>"Kuveidi Riik", "official_name:it"=>"Stato del Kuwait", "official_name:lt"=>"Kuveito Valstybė", "official_name:lv"=>"Kuveitas Valsts", "official_name:pl"=>"Państwo Kuwejt", "official_name:sv"=>"Staten Kuwait", "name:zh-classical"=>"科威特"   ar      127
+ro     "name"=>"România", "name:af"=>"Roemenië", "name:ar"=>"رومانيا", "name:be"=>"Румынія", "name:br"=>"Roumania", "name:ca"=>"Romania", "name:cy"=>"Rwmania", "name:da"=>"Rumænien", "name:de"=>"Rumänien", "name:el"=>"Ρουμανία", "name:en"=>"Romania", "name:eo"=>"Rumanio", "name:es"=>"Rumania", "name:et"=>"Rumeenia", "name:fa"=>"رومانی", "name:fi"=>"Romania", "name:fr"=>"Roumanie", "name:fy"=>"Roemeenje", "name:ga"=>"An Rómáin", "name:gd"=>"Ròmainia", "name:he"=>"רומניה", "name:hr"=>"Rumunjska", "name:hu"=>"Románia", "name:id"=>"Rumania", "name:is"=>"Rúmenía", "name:it"=>"Romania", "name:ja"=>"ルーマニア", "name:la"=>"Romania", "name:lb"=>"Rumänien", "name:li"=>"Roemenië", "name:lt"=>"Rumunija", "name:lv"=>"Rumānija", "name:mn"=>"Румын", "name:nl"=>"Roemenië", "name:pl"=>"Rumunia", "name:ro"=>"România", "name:ru"=>"Румыния", "name:sk"=>"Rumunsko", "name:sl"=>"Romunija", "name:sv"=>"Rumänien", "name:th"=>"ประเทศโรมาเนีย", "name:tr"=>"Romanya", "name:uk"=>"Румунія", "name:vi"=>"Romania", "name:zh"=>"罗马尼亚", "name:haw"=>"Romānia", "name:zh_py"=>"Luomaniya", "name:zh_pyt"=>"Luómăníyà"     ro      170
 md     "name"=>"Moldova", "name:af"=>"Moldowa", "name:ar"=>"جمهورية مولدوفا", "name:be"=>"Малдова", "name:br"=>"Moldavia", "name:ca"=>"Moldàvia", "name:cy"=>"Moldofa", "name:da"=>"Moldova", "name:de"=>"Moldawien", "name:en"=>"Moldova", "name:eo"=>"Moldavio", "name:es"=>"Moldavia", "name:fa"=>"مولداوی", "name:fi"=>"Moldova", "name:fr"=>"Moldavie", "name:fy"=>"Moldaavje", "name:ga"=>"An Mholdóiv", "name:gd"=>"Moldàibhia", "name:he"=>"מולדובה", "name:hr"=>"Moldavija", "name:hu"=>"Moldova", "name:id"=>"Moldova", "name:is"=>"Moldóva", "name:it"=>"Moldavia", "name:ja"=>"モルドバ", "name:la"=>"Respublica Moldavica", "name:lb"=>"Moldawien", "name:lt"=>"Moldovos Respublika", "name:lv"=>"Moldova", "name:mn"=>"Молдав", "name:nl"=>"Moldavië", "name:pl"=>"Mołdawia", "name:ru"=>"Молдова", "name:sk"=>"Moldavsko", "name:sl"=>"Moldavija", "name:sv"=>"Moldavien", "name:th"=>"ประเทศมอลโดวา", "name:tr"=>"Moldova", "name:uk"=>"Молдова", "name:vi"=>"Moldova", "name:zh"=>"摩尔多瓦", "name:haw"=>"Molodowa", "name:zh_py"=>"Moerduowa", "name:zh_pyt"=>"Móěrduōwǎ", "official_name"=>"Republica Moldova", "official_name:be"=>"Рэспубліка Малдова", "official_name:en"=>"The Republic of Moldova", "official_name:es"=>"República de Moldavia", "official_name:id"=>"Republik Moldova", "official_name:ja"=>"モルドバ共和国", "official_name:lb"=>"Republik Moldawien", "official_name:lv"=>"Moldovas Republika", "official_name:pl"=>"Republika Mołdawii", "official_name:ru"=>"Республика Молдова", "official_name:sk"=>"Moldavská republika", "official_name:sv"=>"Republiken Moldavien", "official_name:vi"=>"Cộng hòa Moldova"        \N      147
 tv     "name"=>"Tuvalu", "name:ar"=>"توفالو", "name:be"=>"Тувалу", "name:br"=>"Tuvalu", "name:cy"=>"Twfalw", "name:da"=>"Tuvalu", "name:el"=>"Τουβαλού", "name:en"=>"Tuvalu", "name:eo"=>"Tuvalo", "name:fa"=>"تووالو", "name:fi"=>"Tuvalu", "name:fr"=>"Tuvalu", "name:fy"=>"Tûvalû", "name:ga"=>"Tuvalu", "name:gd"=>"Tubhalu", "name:he"=>"טובלו", "name:hu"=>"Tuvalu", "name:is"=>"Túvalú", "name:ja"=>"ツバル", "name:mn"=>"Тувалу", "name:pl"=>"Tuvalu", "name:ru"=>"Тувалу", "name:sv"=>"Tuvalu", "name:th"=>"ประเทศตูวาลู", "name:uk"=>"Тувалу", "name:zh"=>"吐瓦鲁", "old_name"=>"Ellice Islands"  en      156
 uz     "name"=>"Uzbekistan", "name:af"=>"Oesbekistan", "name:ar"=>"أوزبكستان", "name:az"=>"Özbəkistan", "name:be"=>"Узбекістан", "name:br"=>"Ouzbekistan", "name:da"=>"Usbekistan", "name:de"=>"Usbekistan", "name:el"=>"Ουζμπεκιστάν", "name:en"=>"Uzbekistan", "name:eo"=>"Uzbekio", "name:es"=>"Uzbekistán", "name:et"=>"Usbekistan", "name:fa"=>"ازبکستان", "name:fi"=>"Uzbekistan", "name:fr"=>"Ouzbékistan", "name:fy"=>"Oezbekistan", "name:ga"=>"An Úisbéiceastáin", "name:gd"=>"Usbagastàn", "name:he"=>"אוזבקיסטן", "name:hu"=>"Üzbegisztán", "name:is"=>"Úsbekistan", "name:it"=>"Uzbekistan", "name:ja"=>"ウズベキスタン", "name:la"=>"Uzbecia", "name:lb"=>"Usbekistan", "name:lt"=>"Uzbekija", "name:lv"=>"Uzbekistāna", "name:mn"=>"Узбекистан", "name:nl"=>"Oezbekistan", "name:pl"=>"Uzbekistan", "name:pt"=>"Uzbequistão", "name:ru"=>"Узбекистан", "name:sv"=>"Uzbekistan", "name:th"=>"ประเทศอุซเบกิสถาน", "name:tr"=>"Özbekistan", "name:uk"=>"Узбекистан", "name:uz"=>"Ўзбекистон Республикаси (O‘zbekiston Respublikasi)", "name:zh"=>"乌兹别克斯坦", "name:haw"=>"ʻUsepekikana", "name:zh_py"=>"Wuzibiekesitan", "name:zh_pyt"=>"Wūzībiékèsītǎn", "official_name:br"=>"Republik Ouzbekistan", "official_name:el"=>"Δημοκρατία του Ουζμπεκιστάν", "official_name:et"=>"Usbekistani Vabariik", "official_name:gd"=>"Poblachd Usbagastàn", "official_name:id"=>"Republik Usbekistan", "official_name:it"=>"Repubblica dell'Uzbekistan", "official_name:lb"=>"Republik Usbekistan", "official_name:lt"=>"Uzbekistano Respublika", "official_name:pl"=>"Republika Uzbekistanu", "official_name:pt"=>"República do Uzbequistão", "official_name:sv"=>"Republiken Uzbekistan"   \N      157
-dk     "name"=>"Danmark", "name:af"=>"Denemarke", "name:ar"=>"الدانمرك", "name:be"=>"Данія", "name:bg"=>"Дания", "name:br"=>"Danmark", "name:ca"=>"Dinamarca", "name:cy"=>"Denmarc", "name:da"=>"Danmark", "name:de"=>"Dänemark", "name:el"=>"Δανία", "name:en"=>"Denmark", "name:eo"=>"Danio", "name:es"=>"Dinamarca", "name:et"=>"Taani", "name:eu"=>"Danimarka", "name:fa"=>"دانمارک", "name:fi"=>"Tanska", "name:fr"=>"Danemark", "name:fy"=>"Denemark", "name:ga"=>"An Danmhairg", "name:gd"=>"An Danmhairg", "name:he"=>"דנמרק", "name:hr"=>"Danska", "name:hu"=>"Dánia", "name:id"=>"Denmark", "name:is"=>"Danmörk", "name:it"=>"Danimarca", "name:ja"=>"デンマーク", "name:la"=>"Dania", "name:lb"=>"Dänemark", "name:li"=>"Daenemark", "name:lt"=>"Danija", "name:lv"=>"Dānija", "name:mn"=>"Дани", "name:nl"=>"Denemarken", "name:pl"=>"Dania", "name:pt"=>"Dinamarca", "name:ru"=>"Дания", "name:sk"=>"Dánsko", "name:sl"=>"Danska", "name:sv"=>"Danmark", "name:th"=>"ประเทศเดนมาร์ก", "name:tr"=>"Danimarka", "name:uk"=>"Данія", "name:vi"=>"Đan Mạch", "name:zh"=>"丹麦", "name:nds"=>"Däänmark", "name:zh_py"=>"Danmai", "name:zh_pyt"=>"Dānmài", "official_name"=>"Kingdom of Denmark", "official_name:be"=>"Каралеўства Данія", "official_name:da"=>"Kongeriget Danmark", "official_name:el"=>"Βασίλειο της Δανίας", "official_name:fr"=>"Royaume du Danemark", "official_name:gd"=>"Rìoghachd na Danmhairg", "official_name:id"=>"Kerajaan Denmark", "official_name:ja"=>"デンマーク王国", "official_name:lb"=>"Kinneksräich Dänemark", "official_name:lt"=>"Danijos Karalystė", "official_name:pt"=>"Reino da Dinamarca", "official_name:sk"=>"Dánske kráľovstvo", "official_name:sv"=>"Konungariket Danmark", "official_name:vi"=>"Vương quốc Đan Mạch"    \N      160
-ly     "name"=>"Libya / ليبيا", "name:af"=>"Libië", "name:am"=>"ሊቢያ", "name:an"=>"Libia", "name:ar"=>"ليبيا", "name:az"=>"Liviya", "name:be"=>"Лівія", "name:bg"=>"Либия", "name:bm"=>"Libya", "name:bn"=>"লিবিয়া", "name:bo"=>"ལིའི་པི་ཡ", "name:br"=>"Libia", "name:bs"=>"Libija", "name:ca"=>"Líbia", "name:cs"=>"Libye", "name:cv"=>"Ливи", "name:cy"=>"Libya", "name:da"=>"Libyen", "name:de"=>"Libyen", "name:el"=>"Λιβύη", "name:en"=>"Libya", "name:eo"=>"Libio", "name:es"=>"Libia", "name:et"=>"Liibüa", "name:eu"=>"Libia", "name:fa"=>"لیبی", "name:fi"=>"Libya", "name:fr"=>"Libye", "name:fy"=>"Libanon", "name:ga"=>"An Libia", "name:gd"=>"Libia", "name:gl"=>"Libia", "name:gv"=>"Yn Leeb", "name:ha"=>"Libya", "name:he"=>"לוב", "name:hi"=>"लीबिया", "name:hr"=>"Libija", "name:ht"=>"Libi", "name:hu"=>"Líbia", "name:hy"=>"Լիբիա", "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:kn"=>"ಲಿಬ್ಯಾ", "name:ko"=>"리비아", "name:ku"=>"Lîbya", "name:kw"=>"Libi", "name:la"=>"Libya", "name:lb"=>"Libyen", "name:li"=>"Libië", "name:ln"=>"Libîya", "name:lt"=>"Libija", "name:lv"=>"Lībija", "name:mk"=>"Либија", "name:ml"=>"ലിബിയ", "name:mn"=>"Ливи", "name:mr"=>"लिबिया", "name:ms"=>"Libya", "name:nl"=>"Libië", "name:nn"=>"Libya", "name:no"=>"Libya", "name:oc"=>"Libia", "name:os"=>"Ливи", "name:pl"=>"Libia", "name:ps"=>"ليبيا", "name:pt"=>"Líbia", "name:qu"=>"Libya", "name:ro"=>"Libia", "name:ru"=>"Ливия", "name:sa"=>"लिबिया", "name:sc"=>"Lìbia", "name:se"=>"Libya", "name:sh"=>"Libija", "name:si"=>"ලිබියා", "name:sk"=>"Líbya", "name:sl"=>"Libija", "name:sm"=>"Libya", "name:so"=>"Libya", "name:sq"=>"Libia", "name:sr"=>"Либија", "name:sv"=>"Libyen", "name:sw"=>"Libya", "name:ta"=>"லிபியா", "name:te"=>"లిబియా", "name:tg"=>"Либия", "name:th"=>"ประเทศลิเบีย", "name:ti"=>"ሊቢያ", "name:tl"=>"Libya", "name:tr"=>"Libya", "name:ts"=>"Libya", "name:ug"=>"لىۋىيە", "name:uk"=>"Лівія", "name:ur"=>"لیبیا", "name:uz"=>"Liviya", "name:vi"=>"Libya", "name:vo"=>"Lübän", "name:wo"=>"Libi", "name:yi"=>"ליביע", "name:yo"=>"Libya", "name:zh"=>"利比亚", "name:ace"=>"Libya", "name:als"=>"Libye", "name:ang"=>"Libia", "name:arc"=>"ܠܘܒܐ", "name:arz"=>"ليبيا", "name:ast"=>"Libia", "name:bcl"=>"Libya", "name:bpy"=>"লিবিয়া", "name:ceb"=>"Libya", "name:crh"=>"Libiya", "name:diq"=>"Libya", "name:dsb"=>"Libyska", "name:frp"=>"Libie", "name:haw"=>"Libia", "name:hif"=>"Libya", "name:hsb"=>"Libyska", "name:ilo"=>"Libya", "name:jbo"=>"libgu'e", "name:kab"=>"Libya", "name:lij"=>"Libia", "name:nah"=>"Libia", "name:nap"=>"Libbia", "name:nds"=>"Libyen", "name:nov"=>"Libia", "name:pam"=>"Libya", "name:pap"=>"Libia", "name:pms"=>"Libia", "name:pnb"=>"لبیا", "name:sah"=>"Лиибийэ", "name:scn"=>"Libbia", "name:stq"=>"Lybien", "name:szl"=>"Libijo", "name:vec"=>"Łibia", "name:war"=>"Libya", "name:zh_py"=>"Libiya", "name:simple"=>"Libya", "name:zh-yue"=>"利比亞", "name:zh_pyt"=>"Lìbǐyà", "name:bat-smg"=>"Lėbėjė", "name:roa-rup"=>"Libia", "name:be-x-old"=>"Лібія", "official_name"=>"الجماهيرية العربية الليبية الشعبية الإشتراكية العظمى", "name:zh-min-nan"=>"Libya", "official_name:en"=>"Great Socialist People's Libyan Arab Jamahiriya", "official_name:et"=>"Suur Liibüa Araabia Sotsialistlik Rahvadžamahirija", "official_name:lb"=>"Sozialistisch Libysch-Arabisch Volleks-Dschamahirija", "official_name:lt"=>"Libijos Arabų Socialistinė Liaudies Džamahirija", "official_name:lv"=>"Lībijas Sociālistiskā Arābu Tautas Džamāhīrija", "official_name:ru"=>"Ливийская Арабская Джамахирия", "official_name:sv"=>"Libyska arabiska Jamahiriya", "official_name:vi"=>"Đại Dân quốc Ả Rập Libya Nhân dân Xã hội Chủ nghĩa", "name:zh-classical"=>"利比亞" \N      163
-qa     "name"=>"قطر Qatar", "name:af"=>"Katar", "name:ar"=>"قطر", "name:be"=>"Катар", "name:br"=>"Katar", "name:ca"=>"Qatar", "name:cy"=>"Qatar", "name:da"=>"Qatar", "name:de"=>"Katar", "name:el"=>"Κατάρ", "name:en"=>"Qatar", "name:eo"=>"Kataro", "name:es"=>"Qatar", "name:et"=>"Katar", "name:fa"=>"قطر", "name:fi"=>"Qatar", "name:fr"=>"Qatar", "name:fy"=>"Katar", "name:ga"=>"Catar", "name:gd"=>"Catar", "name:he"=>"קטר", "name:hr"=>"Katar", "name:hu"=>"Katar", "name:id"=>"Qatar", "name:is"=>"Katar", "name:it"=>"Qatar", "name:ja"=>"カタール", "name:la"=>"Quataria", "name:lb"=>"Katar", "name:li"=>"Katar", "name:lt"=>"Kataras", "name:lv"=>"Katara", "name:mn"=>"Катар", "name:nl"=>"Qatar", "name:pl"=>"Katar", "name:pt"=>"Qatar", "name:ru"=>"Катар", "name:sl"=>"Katar", "name:sv"=>"Qatar", "name:th"=>"ประเทศกาตาร์", "name:tr"=>"Katar", "name:uk"=>"Катар", "name:vi"=>"Qatar", "name:zh"=>"卡塔尔", "name:haw"=>"Katala", "name:zh_py"=>"Kataer", "name:zh_pyt"=>"Kǎtǎěr", "official_name"=>"دولة قطر", "official_name:el"=>"Κράτος του Κατάρ", "official_name:id"=>"Negara Qatar", "official_name:ja"=>"カタール国", "official_name:lt"=>"Kataro Valstybė", "official_name:lv"=>"Kataras Valsts", "official_name:pt"=>"Estado do Qatar", "official_name:sv"=>"Staten Qatar" \N      169
-sk     "name"=>"Slovensko", "name:af"=>"Slowakye", "name:ar"=>"جمهورية سلوفاكيا", "name:be"=>"Славакія", "name:br"=>"Slovakia", "name:ca"=>"Eslovàquia", "name:cy"=>"Slofacia", "name:da"=>"Slovakiet", "name:de"=>"Slowakei", "name:el"=>"Σλοβακία", "name:en"=>"Slovakia", "name:eo"=>"Slovakio", "name:es"=>"Eslovaquia", "name:et"=>"Slovakkia", "name:fa"=>"اسلواکی", "name:fi"=>"Slovakia", "name:fr"=>"Slovaquie", "name:fy"=>"Slowakije", "name:ga"=>"An tSlóvaic", "name:gd"=>"An t-Slòbhac", "name:he"=>"סלובקיה", "name:hr"=>"Slovačka", "name:hu"=>"Szlovákia", "name:id"=>"Slowakia", "name:is"=>"Slóvakía", "name:it"=>"Slovacchia", "name:la"=>"Slovacia", "name:lb"=>"Slowakei", "name:li"=>"Slowakieë", "name:lt"=>"Slovakija", "name:mn"=>"Словак", "name:nl"=>"Slowakije", "name:pl"=>"Słowacja", "name:pt"=>"Eslováquia", "name:ru"=>"Словакия", "name:sk"=>"Slovenská republika", "name:sl"=>"Slovaška", "name:sv"=>"Slovakien", "name:th"=>"ประเทศสโลวาเกีย", "name:tr"=>"Slovakya", "name:uk"=>"Словаччина", "name:vi"=>"Slovakia", "name:zh"=>"斯洛伐克", "name:haw"=>"Solowakia", "name:zh_py"=>"Siluofake", "name:zh_pyt"=>"Sīluòfákè", "official_name:el"=>"Δημοκρατία της Σλοβακίας", "official_name:et"=>"Slovaki Vabariik", "official_name:fr"=>"République slovaque", "official_name:id"=>"Republik Slowakia", "official_name:lt"=>"Slovakijos Respublika", "official_name:pt"=>"República Eslovaca", "official_name:sv"=>"Republiken Slovakien", "official_name:vi"=>"Cộng hòa Slovakia"     \N      172
-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"=>"圣诞岛", "name:bpy"=>"ক্রিসমাস দ্বীপমালা", "name:lij"=>"Isoa Christmas", "official_name"=>"Territory of Christmas Island", "name:zh-min-nan"=>"Christmas-tó", "official_name:es"=>"Territorio de la Isla de Navidad", "official_name:lv"=>"Ziemsvētku salas teritorija", "official_name:pl"=>"Terytorium Wyspy Bożego Narodzenia"  \N      177
+ly     "name"=>"Libya / ليبيا", "name:af"=>"Libië", "name:am"=>"ሊቢያ", "name:an"=>"Libia", "name:ar"=>"ليبيا", "name:az"=>"Liviya", "name:be"=>"Лівія", "name:bg"=>"Либия", "name:bm"=>"Libya", "name:bn"=>"লিবিয়া", "name:bo"=>"ལིའི་པི་ཡ", "name:br"=>"Libia", "name:bs"=>"Libija", "name:ca"=>"Líbia", "name:cs"=>"Libye", "name:cv"=>"Ливи", "name:cy"=>"Libya", "name:da"=>"Libyen", "name:de"=>"Libyen", "name:el"=>"Λιβύη", "name:en"=>"Libya", "name:eo"=>"Libio", "name:es"=>"Libia", "name:et"=>"Liibüa", "name:eu"=>"Libia", "name:fa"=>"لیبی", "name:fi"=>"Libya", "name:fr"=>"Libye", "name:fy"=>"Libanon", "name:ga"=>"An Libia", "name:gd"=>"Libia", "name:gl"=>"Libia", "name:gv"=>"Yn Leeb", "name:ha"=>"Libya", "name:he"=>"לוב", "name:hi"=>"लीबिया", "name:hr"=>"Libija", "name:ht"=>"Libi", "name:hu"=>"Líbia", "name:hy"=>"Լիբիա", "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:kn"=>"ಲಿಬ್ಯಾ", "name:ko"=>"리비아", "name:ku"=>"Lîbya", "name:kw"=>"Libi", "name:la"=>"Libya", "name:lb"=>"Libyen", "name:li"=>"Libië", "name:ln"=>"Libîya", "name:lt"=>"Libija", "name:lv"=>"Lībija", "name:mk"=>"Либија", "name:ml"=>"ലിബിയ", "name:mn"=>"Ливи", "name:mr"=>"लिबिया", "name:ms"=>"Libya", "name:nl"=>"Libië", "name:nn"=>"Libya", "name:no"=>"Libya", "name:oc"=>"Libia", "name:os"=>"Ливи", "name:pl"=>"Libia", "name:ps"=>"ليبيا", "name:pt"=>"Líbia", "name:qu"=>"Libya", "name:ro"=>"Libia", "name:ru"=>"Ливия", "name:sa"=>"लिबिया", "name:sc"=>"Lìbia", "name:se"=>"Libya", "name:sh"=>"Libija", "name:si"=>"ලිබියා", "name:sk"=>"Líbya", "name:sl"=>"Libija", "name:sm"=>"Libya", "name:so"=>"Libya", "name:sq"=>"Libia", "name:sr"=>"Либија", "name:sv"=>"Libyen", "name:sw"=>"Libya", "name:ta"=>"லிபியா", "name:te"=>"లిబియా", "name:tg"=>"Либия", "name:th"=>"ประเทศลิเบีย", "name:ti"=>"ሊቢያ", "name:tl"=>"Libya", "name:tr"=>"Libya", "name:ts"=>"Libya", "name:ug"=>"لىۋىيە", "name:uk"=>"Лівія", "name:ur"=>"لیبیا", "name:uz"=>"Liviya", "name:vi"=>"Libya", "name:vo"=>"Lübän", "name:wo"=>"Libi", "name:yi"=>"ליביע", "name:yo"=>"Libya", "name:zh"=>"利比亚", "name:ace"=>"Libya", "name:als"=>"Libye", "name:ang"=>"Libia", "name:arc"=>"ܠܘܒܐ", "name:arz"=>"ليبيا", "name:ast"=>"Libia", "name:bcl"=>"Libya", "name:bpy"=>"লিবিয়া", "name:ceb"=>"Libya", "name:crh"=>"Libiya", "name:diq"=>"Libya", "name:dsb"=>"Libyska", "name:frp"=>"Libie", "name:haw"=>"Libia", "name:hif"=>"Libya", "name:hsb"=>"Libyska", "name:ilo"=>"Libya", "name:jbo"=>"libgu'e", "name:kab"=>"Libya", "name:lij"=>"Libia", "name:nah"=>"Libia", "name:nap"=>"Libbia", "name:nds"=>"Libyen", "name:nov"=>"Libia", "name:pam"=>"Libya", "name:pap"=>"Libia", "name:pms"=>"Libia", "name:pnb"=>"لبیا", "name:sah"=>"Лиибийэ", "name:scn"=>"Libbia", "name:stq"=>"Lybien", "name:szl"=>"Libijo", "name:vec"=>"Łibia", "name:war"=>"Libya", "name:zh_py"=>"Libiya", "name:simple"=>"Libya", "name:zh-yue"=>"利比亞", "name:zh_pyt"=>"Lìbǐyà", "name:bat-smg"=>"Lėbėjė", "name:roa-rup"=>"Libia", "name:be-x-old"=>"Лібія", "official_name"=>"الجماهيرية العربية الليبية الشعبية الإشتراكية العظمى", "name:zh-min-nan"=>"Libya", "official_name:en"=>"Great Socialist People's Libyan Arab Jamahiriya", "official_name:et"=>"Suur Liibüa Araabia Sotsialistlik Rahvadžamahirija", "official_name:lb"=>"Sozialistisch Libysch-Arabisch Volleks-Dschamahirija", "official_name:lt"=>"Libijos Arabų Socialistinė Liaudies Džamahirija", "official_name:lv"=>"Lībijas Sociālistiskā Arābu Tautas Džamāhīrija", "official_name:ru"=>"Ливийская Арабская Джамахирия", "official_name:sv"=>"Libyska arabiska Jamahiriya", "official_name:vi"=>"Đại Dân quốc Ả Rập Libya Nhân dân Xã hội Chủ nghĩa", "name:zh-classical"=>"利比亞" ar      163
+qa     "name"=>"قطر Qatar", "name:af"=>"Katar", "name:ar"=>"قطر", "name:be"=>"Катар", "name:br"=>"Katar", "name:ca"=>"Qatar", "name:cy"=>"Qatar", "name:da"=>"Qatar", "name:de"=>"Katar", "name:el"=>"Κατάρ", "name:en"=>"Qatar", "name:eo"=>"Kataro", "name:es"=>"Qatar", "name:et"=>"Katar", "name:fa"=>"قطر", "name:fi"=>"Qatar", "name:fr"=>"Qatar", "name:fy"=>"Katar", "name:ga"=>"Catar", "name:gd"=>"Catar", "name:he"=>"קטר", "name:hr"=>"Katar", "name:hu"=>"Katar", "name:id"=>"Qatar", "name:is"=>"Katar", "name:it"=>"Qatar", "name:ja"=>"カタール", "name:la"=>"Quataria", "name:lb"=>"Katar", "name:li"=>"Katar", "name:lt"=>"Kataras", "name:lv"=>"Katara", "name:mn"=>"Катар", "name:nl"=>"Qatar", "name:pl"=>"Katar", "name:pt"=>"Qatar", "name:ru"=>"Катар", "name:sl"=>"Katar", "name:sv"=>"Qatar", "name:th"=>"ประเทศกาตาร์", "name:tr"=>"Katar", "name:uk"=>"Катар", "name:vi"=>"Qatar", "name:zh"=>"卡塔尔", "name:haw"=>"Katala", "name:zh_py"=>"Kataer", "name:zh_pyt"=>"Kǎtǎěr", "official_name"=>"دولة قطر", "official_name:el"=>"Κράτος του Κατάρ", "official_name:id"=>"Negara Qatar", "official_name:ja"=>"カタール国", "official_name:lt"=>"Kataro Valstybė", "official_name:lv"=>"Kataras Valsts", "official_name:pt"=>"Estado do Qatar", "official_name:sv"=>"Staten Qatar" ar      169
 nu     "name"=>"Niue", "name:ar"=>"نيوي", "name:be"=>"Ніўэ", "name:br"=>"Niue", "name:da"=>"Niue", "name:el"=>"Νιούε", "name:en"=>"Niue", "name:eo"=>"Niuo", "name:fa"=>"نیووی", "name:fi"=>"Niue", "name:fr"=>"Niue", "name:fy"=>"Niûé", "name:ga"=>"Niue", "name:he"=>"ניואה", "name:hu"=>"Niue", "name:is"=>"Niue", "name:lt"=>"Niujė", "name:lv"=>"Niue", "name:mn"=>"Ниуэ", "name:pl"=>"Niue", "name:ru"=>"Ниуэ", "name:sv"=>"Niue", "name:th"=>"นีอูเอ", "name:uk"=>"Ніуе", "name:zh"=>"紐埃", "alt_name"=>"Rock of Polynesia", "name:niu"=>"Niuē-fekai", "official_name:lt"=>"Niujės Respublika", "official_name:sv"=>"Republiken Niue"   \N      178
 tk     "name"=>"Tokelau", "name:ar"=>"توكلو", "name:be"=>"Такелаў", "name:br"=>"Tokelau", "name:da"=>"Tokelau", "name:el"=>"Τοκελάου", "name:en"=>"Tokelau", "name:eo"=>"Tokelao", "name:fa"=>"توکلائو", "name:fi"=>"Tokelau", "name:fr"=>"Tokelau", "name:fy"=>"Tokelaû", "name:ga"=>"Oileáin Tócalá", "name:he"=>"טוקלאו", "name:hu"=>"Tokelau-szigetek", "name:is"=>"Tókelá", "name:mn"=>"Токелау", "name:pl"=>"Tokelau", "name:ru"=>"Токелау", "name:sv"=>"Tokelauöarna", "name:th"=>"โตเกเลา", "name:uk"=>"Токелау", "name:zh"=>"托克劳"    \N      179
 me     "name"=>"Crna Gora", "name:af"=>"Montenegro", "name:am"=>"ሞንቴኔግሮ", "name:an"=>"Montenegro", "name:ar"=>"الجبل الأسود", "name:az"=>"Çernoqoriya", "name:be"=>"Чарнагорыя", "name:bg"=>"Черна гора", "name:bn"=>"মন্টিনিগ্রো", "name:br"=>"Montenegro", "name:bs"=>"Crna Gora", "name:by"=>"Чарнагорыя", "name:ca"=>"Montenegro", "name:ce"=>"Черногори", "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: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: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:mk"=>"Црна Гора", "name:ml"=>"മോണ്ടെനെഗ്രൊ", "name:mn"=>"Монтенегро", "name:mr"=>"माँटेनिग्रो", "name:ms"=>"Montenegro", "name:nl"=>"Montenegro", "name:nn"=>"Montenegro", "name:no"=>"Montenegro", "name:oc"=>"Montenegro", "name:os"=>"Черногори", "name:pl"=>"Czarnogóra", "name:ps"=>"مانټېنېګرو", "name:pt"=>"Montenegro", "name:qu"=>"Yanaurqu", "name:ro"=>"Muntenegru", "name:ru"=>"Черногория", "name:se"=>"Montenegro", "name:sh"=>"Crna Gora", "name:sk"=>"Čierna Hora", "name:sl"=>"Črna Gora", "name:sq"=>"Mali i Zi", "name:sr"=>"Црна Гора", "name:sv"=>"Montenegro", "name:sw"=>"Montenegro", "name:ta"=>"மொண்டெனேகுரோ", "name:tg"=>"Монтенегро", "name:th"=>"ประเทศมอนเตเนโกร", "name:tl"=>"Montenegro", "name:tr"=>"Karadağ", "name:ug"=>"Chérnogoriye", "name:uk"=>"Чорногорія", "name:ur"=>"مونٹینیگرو", "name:uz"=>"Chernogoriya", "name:vi"=>"Montenegro", "name:vo"=>"Montenegrän", "name:wo"=>"Montenegro", "name:zh"=>"黑山", "name:als"=>"Montenegro", "name:ang"=>"Sweartbeorg", "name:arc"=>"ܛܘܪܐ ܐܘܟܡܐ", "name:arz"=>"مونتينيجرو", "name:ast"=>"Montenegru", "name:bar"=>"Montenegro", "name:bcl"=>"Montenegro", "name:bpy"=>"মন্টিনিগ্রো", "name:ceb"=>"Montenegro", "name:crh"=>"Montenegro", "name:diq"=>"Montenegro", "name:dsb"=>"Carnogórska", "name:frp"=>"Montènègro", "name:haw"=>"Montenegero", "name:hsb"=>"Čorna Hora", "name:ilo"=>"Montenegro", "name:lij"=>"Monteneigro", "name:lmo"=>"Muntnegher", "name:mhr"=>"Шемкурык Эл", "name:nah"=>"Tlīltepēc", "name:nap"=>"Montenegro", "name:nds"=>"Montenegro", "name:nov"=>"Montenegro", "name:nrm"=>"Crna Gora", "name:pap"=>"Montenegro", "name:pih"=>"Montiniegrow", "name:pms"=>"Montnèigr", "name:pnb"=>"مونٹی نیگرو", "name:pnt"=>"Μαυροβούνιον", "name:sah"=>"Монтенегро", "name:scn"=>"Montenegru", "name:sco"=>"Montenegro", "name:szl"=>"Czorno Gůra", "name:vec"=>"Montenégro", "name:war"=>"Montenegro", "name:wuu"=>"黑山共和国", "name:nds-nl"=>"Montenegro", "name:simple"=>"Montenegro", "name:zh-yue"=>"黑山", "name:bat-smg"=>"Joudkalnėjė", "name:fiu-vro"=>"Montõnegro", "name:be-x-old"=>"Чарнагорыя", "name:zh-min-nan"=>"O͘-soaⁿ Kiōng-hô-kok", "official_name:lv"=>"Melnkalnes Republika", "official_name:sk"=>"Čiernohorská republika"  \N      180
 aq     "name"=>"Antarctica"    \N      181
 as     "name"=>"American Samoa"        \N      182
 aw     "name"=>"Aruba" \N      183
-ax     "name"=>"Aland Islands" \N      184
-bv     "name"=>"Bouvet Island" \N      185
 eh     "name"=>"Western Sahara"        \N      186
 gu     "name"=>"Guam"  \N      187
 hk     "name"=>"Hong Kong"     \N      188
-hm     "name"=>"Heard Island and MaxDonald Islands"    \N      189
 im     "name"=>"Isle of Man"   en      190
 mo     "name"=>"Macao" \N      191
-mp     "name"=>"Northern Mariana Islands"      \N      192
 pr     "name"=>"Puerto Rico"   \N      193
 ps     "name"=>"Palestinian Territory" \N      194
 pw     "name"=>"Palau" \N      195
-sh     "name"=>"Saint Helena"  \N      196
-sj     "name"=>"Svalbard and Jan Mayen"        \N      197
-um     "name"=>"United States Minor Outlying Islands"  \N      198
-vi     "name"=>"United States Virgin Islands"  \N      199
-yt     "name"=>"Mayotte"       \N      200
 sb     "name"=>"Solomon Islands"       en      201
 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"=>"法属波利尼西亚", "name:bpy"=>"ফ্যাঞ্চ পলিনেসিয়া", "name:frp"=>"Polinèsie francêsa", "name:lij"=>"Polinesia Françeise", "name:pam"=>"French Polynesia", "name:simple"=>"French Polynesia", "name:bat-smg"=>"Prancūzėjės Polinezėjė", "name:be-x-old"=>"Француская Палінэзія", "name:zh-min-nan"=>"Hoat-kok Polynésie", "official_name:lv"=>"Francijas Polinēzijas teritorija"        fr      202
 mf     "name"=>"Saint Martin"  fr      203
 bl     "name"=>"Saint Barthélemy"     fr      204
 gh     "name"=>"Ghana", "name:ar"=>"غانا", "name:be"=>"Гана", "name:br"=>"Ghana", "name:da"=>"Ghana", "name:el"=>"Γκάνα", "name:en"=>"Ghana", "name:eo"=>"Ganao", "name:es"=>"Ghana", "name:fa"=>"غنا", "name:fi"=>"Ghana", "name:fr"=>"Ghana", "name:fy"=>"Gana", "name:ga"=>"Gána", "name:gd"=>"Gàna", "name:he"=>"גאנה", "name:hr"=>"Gana", "name:hu"=>"Ghána", "name:is"=>"Gana", "name:it"=>"Ghana", "name:ja"=>"ガーナ", "name:la"=>"Gana", "name:li"=>"Gana", "name:lt"=>"Gana", "name:lv"=>"Gana", "name:mn"=>"Гана", "name:pl"=>"Ghana", "name:pt"=>"Gana", "name:ru"=>"Гана", "name:sl"=>"Gana", "name:sv"=>"Ghana", "name:th"=>"ประเทศกานา", "name:tr"=>"Gana", "name:uk"=>"Ґана", "name:zh"=>"加纳", "name:haw"=>"Gāna", "name:zh_py"=>"Jiana", "name:zh_pyt"=>"Jiānà", "official_name"=>"Republic of Ghana", "official_name:be"=>"Рэспубліка Гана", "official_name:el"=>"Δημοκρατία της Γκάνας", "official_name:gd"=>"Poblachd Ghàna", "official_name:id"=>"Republik Ghana", "official_name:lt"=>"Ganos Respublika", "official_name:lv"=>"Ganas Republika", "official_name:pt"=>"República do Gana", "official_name:sv"=>"Republiken Ghana", "official_name:vi"=>"Cộng hòa Ghana"    en      211
-my     "name"=>"Malaysia", "name:af"=>"Maleisië", "name:ar"=>"ماليزي", "name:az"=>"Malayziya", "name:be"=>"Малайзія", "name:br"=>"Malaysia", "name:ca"=>"Malàisia", "name:el"=>"Μαλαισία", "name:en"=>"Malaysia", "name:eo"=>"Malajzio", "name:es"=>"Malasia", "name:et"=>"Malaisia", "name:fa"=>"مالزی", "name:fi"=>"Malesia", "name:fr"=>"Malaisie", "name:fy"=>"Maleizje", "name:ga"=>"An Mhalaeisia", "name:gd"=>"Malaidhsia", "name:he"=>"מלזיה", "name:hr"=>"Malezija", "name:hu"=>"Malajzia", "name:is"=>"Malasía", "name:it"=>"Malesia", "name:ja"=>"マレーシア", "name:la"=>"Malaesia", "name:lt"=>"Malaizija", "name:lv"=>"Malaizija", "name:mn"=>"Малайз", "name:nl"=>"Maleisië", "name:pl"=>"Malezja", "name:ru"=>"Малайзия", "name:sl"=>"Malezija", "name:sv"=>"Malaysia", "name:th"=>"ประเทศมาเลเซีย", "name:tr"=>"Malezya", "name:uk"=>"Малайзія", "name:zh"=>"马来西亚", "name:haw"=>"Malaisia", "name:zh_py"=>"Malaixiya", "name:zh_pyt"=>"Mǎláixīyà", "official_name:lv"=>"Malaizijas Federācija", "official_name:pl"=>"Federacja Malezji"       \N      7
+ax     "name"=>"Aland Islands" sv      184
+bv     "name"=>"Bouvet Island" no      185
+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"=>"圣诞岛", "name:bpy"=>"ক্রিসমাস দ্বীপমালা", "name:lij"=>"Isoa Christmas", "official_name"=>"Territory of Christmas Island", "name:zh-min-nan"=>"Christmas-tó", "official_name:es"=>"Territorio de la Isla de Navidad", "official_name:lv"=>"Ziemsvētku salas teritorija", "official_name:pl"=>"Terytorium Wyspy Bożego Narodzenia"  en      177
+hm     "name"=>"Heard Island and MaxDonald Islands"    en      189
+mp     "name"=>"Northern Mariana Islands"      ch      192
+sh     "name"=>"Saint Helena"  en      196
+sj     "name"=>"Svalbard and Jan Mayen"        no      197
+sk     "name"=>"Slovensko", "name:af"=>"Slowakye", "name:ar"=>"جمهورية سلوفاكيا", "name:be"=>"Славакія", "name:br"=>"Slovakia", "name:ca"=>"Eslovàquia", "name:cy"=>"Slofacia", "name:da"=>"Slovakiet", "name:de"=>"Slowakei", "name:el"=>"Σλοβακία", "name:en"=>"Slovakia", "name:eo"=>"Slovakio", "name:es"=>"Eslovaquia", "name:et"=>"Slovakkia", "name:fa"=>"اسلواکی", "name:fi"=>"Slovakia", "name:fr"=>"Slovaquie", "name:fy"=>"Slowakije", "name:ga"=>"An tSlóvaic", "name:gd"=>"An t-Slòbhac", "name:he"=>"סלובקיה", "name:hr"=>"Slovačka", "name:hu"=>"Szlovákia", "name:id"=>"Slowakia", "name:is"=>"Slóvakía", "name:it"=>"Slovacchia", "name:la"=>"Slovacia", "name:lb"=>"Slowakei", "name:li"=>"Slowakieë", "name:lt"=>"Slovakija", "name:mn"=>"Словак", "name:nl"=>"Slowakije", "name:pl"=>"Słowacja", "name:pt"=>"Eslováquia", "name:ru"=>"Словакия", "name:sk"=>"Slovenská republika", "name:sl"=>"Slovaška", "name:sv"=>"Slovakien", "name:th"=>"ประเทศสโลวาเกีย", "name:tr"=>"Slovakya", "name:uk"=>"Словаччина", "name:vi"=>"Slovakia", "name:zh"=>"斯洛伐克", "name:haw"=>"Solowakia", "name:zh_py"=>"Siluofake", "name:zh_pyt"=>"Sīluòfákè", "official_name:el"=>"Δημοκρατία της Σλοβακίας", "official_name:et"=>"Slovaki Vabariik", "official_name:fr"=>"République slovaque", "official_name:id"=>"Republik Slowakia", "official_name:lt"=>"Slovakijos Respublika", "official_name:pt"=>"República Eslovaca", "official_name:sv"=>"Republiken Slovakien", "official_name:vi"=>"Cộng hòa Slovakia"     sk      172
+um     "name"=>"United States Minor Outlying Islands"  en      198
+vi     "name"=>"United States Virgin Islands"  en      199
+yt     "name"=>"Mayotte"       fr      200
 it     "name"=>"Italia", "name:af"=>"Italië", "name:ar"=>"إيطاليا", "name:be"=>"Італія", "name:br"=>"Italia", "name:ca"=>"Itàlia", "name:cy"=>"Yr Eidal", "name:da"=>"Italien", "name:de"=>"Italien", "name:el"=>"Ιταλία", "name:en"=>"Italy", "name:eo"=>"Italio", "name:et"=>"Itaalia", "name:fa"=>"ایتالیا", "name:fi"=>"Italia", "name:fr"=>"Italie", "name:fy"=>"Itaalje", "name:ga"=>"An Iodáil", "name:gd"=>"An Eadailt", "name:he"=>"איטליה", "name:hr"=>"Italija", "name:hu"=>"Olaszország", "name:hy"=>"Իտալիա", "name:is"=>"Ítalía", "name:it"=>"Italia", "name:ja"=>"イタリア", "name:lb"=>"Italien", "name:li"=>"Italië", "name:lt"=>"Italija", "name:lv"=>"Itālija", "name:mn"=>"Итали", "name:nl"=>"Italië", "name:pl"=>"Włochy", "name:ru"=>"Италия", "name:sk"=>"Taliansko", "name:sl"=>"Italija", "name:sv"=>"Italien", "name:th"=>"ประเทศอิตาลี", "name:tr"=>"İtalya", "name:uk"=>"Італія", "name:vi"=>"Ý", "name:zh"=>"意大利", "name:fur"=>"Italie", "name:haw"=>"ʻĪkālia", "name:zh_py"=>"Yidali", "name:zh_pyt"=>"Yìdàlì", "official_name"=>"Repubblica Italiana", "official_name:be"=>"Італьянская Рэспубліка", "official_name:el"=>"Ιταλική Δημοκρατία", "official_name:et"=>"Itaalia Vabariik", "official_name:fr"=>"République italienne", "official_name:id"=>"Republik Italia", "official_name:it"=>"Repubblica Italiana", "official_name:lb"=>"Italienisch Republik", "official_name:lt"=>"Italijos Respublika", "official_name:sk"=>"Talianska republika", "official_name:sv"=>"Republiken Italien", "official_name:vi"=>"Cộng hoà Ý"        \N      28
-gw     "name"=>"Guiné-Bissau", "name:af"=>"Guinee-Bissau", "name:ar"=>"غينيا-بيساو", "name:be"=>"Гвінея-Бісаў", "name:br"=>"Ginea-Bissau", "name:ca"=>"Guinea Bissau", "name:cy"=>"Guiné-Bissau", "name:da"=>"Guinea-Bissau", "name:de"=>"Guinea-Bissau", "name:el"=>"Γουινέα-Μπισσάου", "name:en"=>"Guinea-Bissau", "name:eo"=>"Gvineo Bisaŭa", "name:es"=>"Guinea-Bissau", "name:et"=>"Guinea-Bissau", "name:fa"=>"گینه بیسائو", "name:fi"=>"Guinea-Bissau", "name:fr"=>"Guinée-Bissau", "name:fy"=>"Guinee-Bissau", "name:ga"=>"Guine-Bhissau", "name:gd"=>"Gini-Bissau", "name:he"=>"גינאה ביסאו", "name:hr"=>"Gvineja Bisau", "name:hu"=>"Bissau-Guinea", "name:id"=>"Guinea-Bissau", "name:is"=>"Gínea-Bissá", "name:it"=>"Guinea-Bissau", "name:la"=>"Guinea Bissaviensis", "name:lb"=>"Guinea-Bissau", "name:li"=>"Guinee-Bissau", "name:lt"=>"Bisau Gvinėja", "name:lv"=>"Gvineja-Bisava", "name:mn"=>"Гвиней-Бисау", "name:nl"=>"Guinee-Bissau", "name:pl"=>"Gwinea Bissau", "name:ru"=>"Гвинея-Бисау", "name:sl"=>"Gvineja Bissau", "name:sv"=>"Guinea-Bissau", "name:th"=>"ประเทศกินี-บิสเซา", "name:tr"=>"Gine Bissau", "name:uk"=>"Гвінея-Бісау", "name:zh"=>"几内亚比绍", "name:zh_py"=>"Jineiya Bishao", "name:zh_pyt"=>"Jīnèiyà Bǐshào", "official_name"=>"República da Guiné-Bissau", "official_name:be"=>"Рэспубліка Гвінэя-Бісаў", "official_name:el"=>"Δημοκρατία της Γουινέας-Μπισσάου", "official_name:et"=>"Guinea-Bissau Vabariik", "official_name:gd"=>"Poblachd Ghini-Bissau", "official_name:id"=>"Republik Guinea-Bissau", "official_name:lt"=>"Bisau Gvinėjos Respublika", "official_name:lv"=>"Gvinejas-Bisavas Republika", "official_name:sv"=>"Republiken Guinea-Bissau", "official_name:vi"=>"Cộng hòa Guiné-Bissau"      \N      8
-al     "name"=>"Shqipëria", "name:af"=>"Albanië", "name:am"=>"አልባኒያ", "name:an"=>"Albania", "name:ar"=>"ألبانيا", "name:az"=>"Albaniya", "name:be"=>"Албанія", "name:bg"=>"Албания", "name:bn"=>"আলবেনিয়া", "name:bo"=>"ཨར་པ་ཉི་ཡ།", "name:br"=>"Albania", "name:bs"=>"Albanija", "name:ca"=>"Albània", "name:ce"=>"Албани", "name:co"=>"Albania", "name:cs"=>"Albánie", "name:cv"=>"Албани", "name:cy"=>"Albania", "name:da"=>"Albanien", "name:de"=>"Albanien", "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: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:gv"=>"Yn Albaan", "name:he"=>"אלבניה", "name:hi"=>"अल्बानिया", "name:hr"=>"Albanija", "name:ht"=>"Albani", "name:hu"=>"Albánia", "name:hy"=>"Ալբանիա", "name:id"=>"Albania", "name:ie"=>"Albania", "name:io"=>"Albania", "name:is"=>"Albanía", "name:it"=>"Albania", "name:ja"=>"アルバニア", "name:jv"=>"Albania", "name:ka"=>"ალბანეთი", "name:kg"=>"Albania", "name:kk"=>"Албания", "name:km"=>"អាល់បានី", "name:kn"=>"ಅಲ್ಬೇನಿಯ", "name:ko"=>"알바니아", "name:ku"=>"Albanya", "name:kv"=>"Албания", "name:ky"=>"Албания", "name:la"=>"Albania", "name:lb"=>"Albanien", "name:li"=>"Albanië", "name:ln"=>"Albania", "name:lt"=>"Albanija", "name:lv"=>"Albānija", "name:mg"=>"Albania", "name:mk"=>"Албанија", "name:ml"=>"അല്‍ബേനിയ", "name:mn"=>"Албани", "name:mr"=>"आल्बेनिया", "name:ms"=>"Albania", "name:mt"=>"Albanija", "name:na"=>"Albania", "name:ne"=>"अल्बानिया", "name:nl"=>"Albanië", "name:nn"=>"Albania", "name:no"=>"Albania", "name:oc"=>"Albania", "name:os"=>"Албани", "name:pl"=>"Albania", "name:ps"=>"البانيا", "name:pt"=>"Albânia", "name:qu"=>"Albanya", "name:rm"=>"Albania", "name:ro"=>"Albania", "name:ru"=>"Албания", "name:sa"=>"अल्बानिया", "name:sc"=>"Albania", "name:se"=>"Albánia", "name:sh"=>"Albanija", "name:sk"=>"Albánsko", "name:sl"=>"Albanija", "name:sq"=>"Shqipëria", "name:sr"=>"Албанија", "name:ss"=>"I-Alibheniya", "name:su"=>"Albania", "name:sv"=>"Albanien", "name:sw"=>"Albania", "name:ta"=>"அல்பேனியா", "name:te"=>"అల్బేనియా", "name:tg"=>"Албания", "name:th"=>"ประเทศแอลเบเนีย", "name:tl"=>"Albanya", "name:tr"=>"Arnavutluk", "name:tt"=>"Албания", "name:ug"=>"ئالبانىيە", "name:uk"=>"Албанія", "name:ur"=>"البانیا", "name:uz"=>"Albaniya", "name:vi"=>"Albania", "name:vo"=>"Lalbanän", "name:wo"=>"Albaani", "name:yi"=>"אלבאניע", "name:yo"=>"Albania", "name:zh"=>"阿尔巴尼亚", "name:ace"=>"Albania", "name:als"=>"Albanie", "name:ang"=>"Albania", "name:arc"=>"ܐܠܒܢܝܐ", "name:arz"=>"ألبانيا", "name:ast"=>"Albania", "name:bar"=>"Albanien", "name:bcl"=>"Albanya", "name:bpy"=>"আলবেনিয়া", "name:ceb"=>"Albanya", "name:chr"=>"ᎠᎸᏇᏂᏯ", "name:crh"=>"Arnavutlıq", "name:csb"=>"Albańskô", "name:diq"=>"Arnawutiye", "name:dsb"=>"Albańska", "name:eml"=>"Albanî", "name:ext"=>"Albánia", "name:frp"=>"Albanie", "name:fur"=>"Albanie", "name:haw"=>"‘Alepania", "name:hif"=>"Albania", "name:hsb"=>"Albanska", "name:ilo"=>"Albania", "name:lad"=>"אלבאניה", "name:lij"=>"Albania", "name:lmo"=>"Albania", "name:mzn"=>"آلباني", "name:nah"=>"Albania", "name:nds"=>"Albanien", "name:nov"=>"Albania", "name:pam"=>"Albania", "name:pdc"=>"Albaani", "name:pih"=>"Elbanya", "name:pms"=>"Albanìa", "name:pnb"=>"البانیا", "name:pnt"=>"Αλβανία", "name:rmy"=>"Shkiperiya", "name:sah"=>"Албания", "name:scn"=>"Albanìa", "name:sco"=>"Albanie", "name:srn"=>"Albanikondre", "name:stq"=>"Albanien", "name:szl"=>"Albańijo", "name:tet"=>"Albánia", "name:tpi"=>"Albenia", "name:udm"=>"Албания", "name:vec"=>"Albania", "name:war"=>"Albanya", "name:wuu"=>"阿尔巴尼亚", "name:xal"=>"Арнаутн Орн Нутг", "name:zea"=>"Albanië", "name:zh_py"=>"Aerbaniya", "name:simple"=>"Albania", "name:zh-yue"=>"阿爾巴尼亞", "name:zh_pyt"=>"Āěrbāníyà", "name:bat-smg"=>"Albanėjė", "name:fiu-vro"=>"Albaania", "name:roa-rup"=>"Arbinishia", "name:be-x-old"=>"Альбанія", "official_name"=>"Republika e Shqipërisë", "name:zh-min-nan"=>"Shqipëria", "official_name:be"=>"Рэспубліка Албанія", "official_name:el"=>"Δημοκρατία της Αλβανίας", "official_name:en"=>"Republic of Albania", "official_name:es"=>"República de Albania", "official_name:et"=>"Albaania Vabariik", "official_name:fr"=>"République d'Albanie", "official_name:ja"=>"アルバニア共和国", "official_name:lb"=>"Republik Albanien", "official_name:pl"=>"Republika Albanii", "official_name:pt"=>"República da Albânia", "official_name:sk"=>"Albánska republika", "official_name:sv"=>"Republiken Albanien", "official_name:vi"=>"Cộng hoà Albania"  \N      9
-fo     "name"=>"Føroyar/Færøerne", "name:af"=>"Faroëreilande", "name:am"=>"ፋሮ ደሴቶች", "name:ar"=>"جزر فارو", "name:az"=>"Farer adaları", "name:be"=>"Фарэрскія астравы", "name:bg"=>"Фарьорски острови", "name:br"=>"Inizi 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:el"=>"Νήσοι Φερόες", "name:en"=>"Faroe Islands", "name:eo"=>"Ferooj", "name:es"=>"Islas Feroe", "name:et"=>"Fääri saared", "name:eu"=>"Faroe Uharteak", "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:gv"=>"Ellanyn ny Geyrragh", "name:he"=>"איי פארו", "name:hi"=>"फ़रो द्वीप", "name:hr"=>"Føroyar", "name:hu"=>"Feröer", "name:id"=>"Kepulauan Faroe", "name:io"=>"Faero", "name:is"=>"Færeyjar", "name:it"=>"Isole Fær Øer", "name:ja"=>"フェロー諸島", "name:jv"=>"Kapuloan Faroe", "name:ka"=>"ფარერის კუნძულები", "name:kk"=>"Фарер аралдары", "name:kl"=>"Savalimmiut", "name:ko"=>"페로 제도", "name:ku"=>"Giravên Faroe", "name:kw"=>"Ynysow Faroe", "name:la"=>"Insulae Faeroae", "name:li"=>"Faeröer", "name:lt"=>"Farerai", "name:lv"=>"Farēru (Fēru) salas", "name:mk"=>"Фарски Острови", "name:mn"=>"Фарерын Арлууд", "name:mr"=>"फेरो द्वीपसमूह", "name:ms"=>"Kepulauan Faroe", "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:ro"=>"Insulele Feroe", "name:ru"=>"Фарерские острова", "name:se"=>"Fearsullot", "name:sh"=>"Farski Otoci", "name:sk"=>"Faerské ostrovy", "name:sl"=>"Ferski otoki", "name:sq"=>"Ishujt Faroe", "name:sr"=>"Фарска острва", "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:uk"=>"Фарерські острови", "name:vi"=>"Quần đảo Faroe", "name:wo"=>"Duni Faarow", "name:zh"=>"法罗群岛", "alt_name"=>"Faeroe Islands;Faroes;Faeroes", "name:als"=>"Färöer", "name:ang"=>"Faroisca Īega", "name:ast"=>"Islles Feroe", "name:bar"=>"Färöer", "name:bpy"=>"ফারো দ্বীপমালা", "name:ext"=>"Islas Feroes", "name:frp"=>"Iles Fèroè", "name:gle"=>"Na Scigirí", "name:hsb"=>"Färöje", "name:lij"=>"Isoe Farœ", "name:lmo"=>"Faroe", "name:pam"=>"Faroe Islands", "name:pih"=>"Faaro Ailen", "name:pms"=>"Faròe", "name:rmy"=>"Dvipa Faroe", "name:scn"=>"Ìsuli Fær Øer", "name:sco"=>"Faroe Islands", "name:vec"=>"Ixołe Fær Øer", "name:war"=>"Feroe nga Islas", "name:wuu"=>"法罗群岛", "name:zh_py"=>"Faluoqundao", "name:nds-nl"=>"Faeröer", "name:simple"=>"Faroe Islands", "name:zh_pyt"=>"Fǎluóqúndǎo", "name:be-x-old"=>"Фарэрскія выспы", "name:zh-min-nan"=>"Mî-iûⁿ Kûn-tó", "official_name:lv"=>"Fēru salas"        \N      10
-jp     "name"=>"日本 (Japan)", "name:af"=>"Japan", "name:am"=>"ጃፓን", "name:an"=>"Chapón", "name:ar"=>"اليابان", "name:as"=>"জাপান", "name:az"=>"Yaponiya", "name:ba"=>"Япония", "name:be"=>"Японія", "name:bg"=>"Япония", "name:bn"=>"জাপান", "name:bo"=>"རི་པིན།", "name:br"=>"Japan", "name:bs"=>"Japan", "name:ca"=>"Japó", "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"=>"Iapan", "name:gl"=>"Xapón - 日本", "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"=>"ᓃᑉᐊᓐ/niipan", "name:ja"=>"日本", "name:jv"=>"Jepang", "name:ka"=>"იაპონია", "name:kk"=>"Жапония", "name:km"=>"ជប៉ុន", "name:kn"=>"ಜಪಾನ್", "name:ko"=>"일본", "name:ks"=>"जापान", "name:ku"=>"Japan", "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"=>"Nipono", "name:mk"=>"Јапонија", "name:ml"=>"ജപ്പാന്‍", "name:mn"=>"Япон", "name:mr"=>"जपान", "name:ms"=>"Jepun", "name:my"=>"ဂျပန်နိုင်ငံ", "name:na"=>"Djapan", "name:ne"=>"जापान", "name:nl"=>"Japan", "name:nn"=>"Japan", "name:no"=>"Japan", "name:nv"=>"Bina'adaałtzózí", "name:oc"=>"Japon", "name:or"=>"ଜାପାନ", "name:os"=>"Япон", "name:pl"=>"Japonia", "name:ps"=>"جاپان", "name:pt"=>"Japão", "name:qu"=>"Nihun", "name:ro"=>"Japonia", "name:ru"=>"Япония", "name:sa"=>"जापान", "name:sc"=>"Giappone", "name:sd"=>"جاپان", "name:se"=>"Japána", "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: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", "name:als"=>"Japan", "name:ang"=>"Iapan", "name:arc"=>"ܝܦܢ", "name:arz"=>"اليابان", "name:ast"=>"Xapón", "name:bar"=>"Japan", "name:bcl"=>"Hapon", "name:bpy"=>"জাপান", "name:bug"=>"ᨍᨛᨄ", "name:bxr"=>"Жибэн", "name:cdo"=>"Nĭk-buōng", "name:ceb"=>"Hapon", "name:chr"=>"ᏣᏆᏂ", "name:crh"=>"Yaponiya", "name:csb"=>"Japòńskô", "name:diq"=>"Japonya", "name:dsb"=>"Japańska", "name:frp"=>"J·apon", "name:gan"=>"日本", "name:hak"=>"Ngi̍t-pún", "name:haw"=>"Iāpana", "name:hif"=>"Japan", "name:hsb"=>"Japanska", "name:ilo"=>"Japon", "name:jbo"=>"pongu'e", "name:lij"=>"Giappon", "name:lmo"=>"Giapun", "name:mdf"=>"Япунмастор", "name:mhr"=>"Японий", "name:mwl"=>"Japon", "name:nah"=>"Xapon", "name:nap"=>"Giappone", "name:nds"=>"Japan", "name:new"=>"जापान", "name:nov"=>"Japan", "name:nrm"=>"Japon", "name:pam"=>"Hapon", "name:pap"=>"Hapon", "name:pms"=>"Giapon", "name:pnb"=>"جاپان", "name:sah"=>"Дьоппуон", "name:scn"=>"Giappuni", "name:sco"=>"Japan", "name:szl"=>"Japůńijo", "name:tpi"=>"Siapan", "name:udm"=>"Япония", "name:vec"=>"Giapòn", "name:war"=>"Hapon", "name:wuu"=>"日本", "name:xal"=>"Японь", "name:ja_rm"=>"Nippon", "name:zh_py"=>"Riben", "name:nds-nl"=>"Japan", "name:simple"=>"Japan", "name:zh-yue"=>"日本", "name:zh_pyt"=>"Rìběn", "name:bat-smg"=>"Japuonėjė", "name:cbk-zam"=>"Japón", "name:be-x-old"=>"Японія", "name:zh-min-nan"=>"Ji̍t-pún", "official_name:ca"=>"Estat del Japó", "official_name:pt"=>"Império do Japão", "name:zh-classical"=>"日本"  \N      11
 gq     "name:af"=>"Ekwatoriaal-Guinee", "name:am"=>"ኢኳቶሪያል ጊኔ", "name:an"=>"Guinea Ecuatorial", "name:ar"=>"غينيا الاستوائية", "name:az"=>"Ekvatorial Qvineya", "name:be"=>"Экватарыяльная Гвінея", "name:bg"=>"Екваториална Гвинея", "name:bm"=>"Cemajan Gine", "name:br"=>"Ginea ar C’heheder", "name:bs"=>"Ekvatorijalna Gvineja", "name:ca"=>"Guinea Equatorial", "name:co"=>"Guinea Equatoriale", "name:cs"=>"Rovníková Guinea", "name:cv"=>"Экваториаллă Гвиней", "name:cy"=>"Guinea Gyhydeddol", "name:da"=>"Ækvatorialguinea", "name:de"=>"Äquatorialguinea", "name:dv"=>"އިކުއެޓޯރިއަލް ގިނީ", "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: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:gv"=>"Guinea Chryss ny Cruinney", "name:he"=>"גינאה המשוונית", "name:hi"=>"ईक्वीटोरियल गिनी", "name:hr"=>"Ekvatorska Gvineja", "name:ht"=>"Gine ekwateryal", "name:hu"=>"Egyenlítői-Guinea", "name:ia"=>"Guinea Equatorial", "name:id"=>"Guinea Khatulistiwa", "name:ie"=>"Equatorial Guinéa", "name:io"=>"Equatorala Guinea", "name:is"=>"Miðbaugs-Gínea", "name:it"=>"Guinea Equatoriale", "name:ja"=>"赤道ギニア", "name:jv"=>"Guinea Khatulistiwa", "name:ka"=>"ეკვატორული გვინეა", "name:kk"=>"Екуатор Гиния", "name:kn"=>"ವಿಷುವದ್ರೇಖೆಯ ಗಿನಿ", "name:ko"=>"적도 기니", "name:ku"=>"Gînêya Rojbendî", "name:kw"=>"Gyni Ekwadoriel", "name:la"=>"Guinea Aequatorensis", "name:lb"=>"Equatorialguinea", "name:li"=>"Equatoriaal Guinee", "name:ln"=>"Gine-Ekwatorial", "name:lt"=>"Pusiaujo Gvinėja", "name:lv"=>"Ekvatoriālā Gvineja", "name:mk"=>"Екваторијална Гвинеја", "name:ml"=>"ഇക്വറ്റോറിയല്‍ ഗിനി", "name:mn"=>"Экваторын Гвиней", "name:mr"=>"इक्वेटोरीयल गिनी", "name:ms"=>"Guinea Khatulistiwa", "name:nb"=>"Ekvatorial-Guinea", "name:nl"=>"Equatoriaal-Guinea", "name:nn"=>"Ekvatorial-Guinea", "name:no"=>"Ekvatorial-Guinea", "name:oc"=>"Guinèa Eqüatoriala", "name:os"=>"Экваториалон Гвиней", "name:pl"=>"Gwinea Równikowa", "name:ps"=>"اېکواټوريال ګوينا", "name:pt"=>"Guiné Equatorial", "name:qu"=>"Chawpipacha Khiniya", "name:ro"=>"Guineea Ecuatorială", "name:ru"=>"Экваториальная Гвинея", "name:sc"=>"Guinea Ecuadoriale", "name:se"=>"Beaivvedási Guinea", "name:sh"=>"Ekvatorijalna Gvineja", "name:sk"=>"Rovníková Guinea", "name:sl"=>"Ekvatorialna Gvineja", "name:sq"=>"Guineja Ekuatoriale", "name:sr"=>"Екваторијална Гвинеја", "name:sv"=>"Ekvatorialguinea", "name:sw"=>"Guinea ya Ikweta", "name:ta"=>"எக்குவடோரியல் கினி", "name:tg"=>"Гвинеяи Истивоӣ", "name:th"=>"ประเทศอิเควทอเรียลกินี", "name:tl"=>"Equatorial Guinea", "name:tr"=>"Ekvator Ginesi", "name:ts"=>"Equatorial Guinea", "name:ug"=>"Ékwator Gwinéyisi", "name:uk"=>"Екваторіальна Гвінея", "name:ur"=>"استوائی گنی", "name:uz"=>"Ekvatorli Gvineya", "name:vi"=>"Guinea Xích Đạo", "name:vo"=>"Kveatora-Gineyän", "name:wo"=>"Gineg yamoo", "name:zh"=>"赤道几内亚", "name:als"=>"Äquatorialguinea", "name:arz"=>"جينيا الاستوائيه", "name:ast"=>"Guinea Ecuatorial", "name:bcl"=>"Guineyang Ekwatoryal", "name:bpy"=>"একুয়াটরিয়াল গায়ানা", "name:ceb"=>"Guinea Ecuatorial", "name:crh"=>"Ekvatorial Gvineya", "name:diq"=>"Gineya Ekwatori", "name:frp"=>"Guinê èquatoriâla", "name:hif"=>"Equatorial Guinea", "name:lij"=>"Guinea Equatoriâ", "name:lmo"=>"Guinea Equaturiala", "name:nah"=>"Guinea Tlahcotlālticpac", "name:nds"=>"Äquatoriaal-Guinea", "name:nov"=>"Equatoral Gini", "name:pam"=>"Equatorial Guinea", "name:pms"=>"Guinea Equatorial", "name:pnb"=>"استوائی گنی", "name:sah"=>"Экуатор Гуинеята", "name:scn"=>"Guinia Ecuaturiali", "name:stq"=>"Äquatorioal Guinea", "name:vec"=>"Guinea Equatorial", "name:zea"=>"Equatoriaol Hunea", "name:zh_py"=>"Chidao Jineiya", "name:simple"=>"Equatorial Guinea", "name:zh_pyt"=>"Chìdào Jīnèiyà", "name:bat-smg"=>"Ekvatuorė Gvinėjė", "name:fiu-vro"=>"Ekvatoriaal-Ginea", "name:be-x-old"=>"Экватарыяльная Ґвінэя", "official_name"=>"República de Guinea Ecuatorial;République de Guinée équatoriale;República da Guiné Equatorial", "name:zh-min-nan"=>"Chhiah-tō Guinea", "official_name:el"=>"Δημοκρατία της Ισημερινής Γουινέας", "official_name:et"=>"Ekvatoriaal-Guinea Vabariik", "official_name:id"=>"Republik Guinea Khatulistiwa", "official_name:lt"=>"Pusiaujo Gvinėjos Respublika", "official_name:lv"=>"Ekvatoriālās Gvinejas Republika", "official_name:pt"=>"República da Guiné Equatorial", "official_name:sv"=>"Republiken Ekvatorialguinea", "official_name:vi"=>"Cộng hòa Guinea Xích Đạo"     \N      12
-io     "name"=>"British Indian Ocean Territory", "name:af"=>"Britse Indiese Oseaan Gebied", "name:an"=>"Territorio Britanico de l'Ozián Indico", "name:ar"=>"إقليم المحيط الهندي البريطاني", "name:be"=>"Брытанскія Індыйска-акіянскія тэрыторыі", "name:bg"=>"Британска индоокеанска територия", "name:br"=>"Tiriadoù Breizhveuriat Mor Indez", "name:bs"=>"Britanski teritorij Indijskog okeana", "name:ca"=>"Territori Britànic de l'Oceà Índic", "name:cs"=>"Britské indickooceánské území", "name:da"=>"Britiske Indiske Ocean", "name:de"=>"Britisches Territorium im Indischen Ozean", "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:fi"=>"Brittiläinen Intian valtameren alue", "name:fr"=>"Territoire britannique de l'océan Indien", "name:fy"=>"Britske Yndyske-Oseaanterritoarium", "name:ga"=>"Críoch Aigéan Indiach na Breataine", "name:gl"=>"Territorio Británico do Océano Índico", "name:he"=>"הטריטוריה הבריטית באוקיינוס ההודי", "name:hi"=>"ब्रिटिश हिंद महासागर क्षेत्र", "name:hr"=>"Britanski indijskooceanski teritoriji", "name:hu"=>"Brit Indiai-óceáni Terület", "name:id"=>"Teritorial Britania di Samudra Hindia", "name:is"=>"Breska Indlandshafseyjar", "name:it"=>"Territorio britannico dell'oceano Indiano", "name:ja"=>"イギリス領インド洋地域", "name:ka"=>"ბრიტანეთის ინდოეთის ოკეანის ტერიტორია", "name:ko"=>"영국령 인도양 지역", "name:lt"=>"Indijos vandenyno Britų sritis", "name:lv"=>"Indijas okeāna Britu teritorija", "name:mr"=>"ब्रिटीश हिंदी महासागर क्षेत्र", "name:ms"=>"Wilayah Lautan Hindi British", "name:nl"=>"Brits Territorium in de Indische Oceaan", "name:no"=>"Det britiske territoriet i Indiahavet", "name:pl"=>"Brytyjskie Terytorium Oceanu Indyjskiego", "name:pt"=>"Território Britânico do Oceano Índico", "name:ro"=>"Teritoriul Britanic din Oceanul Indian", "name:ru"=>"Британская территория в Индийском океане", "name:sh"=>"Britanski teritorij Indijskog oceana", "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:tr"=>"Britanya Hint Okyanusu Toprakları", "name:uk"=>"Британська територія в Індійському океані", "name:vi"=>"Lãnh thổ Ấn Độ Dương thuộc Anh", "name:zh"=>"英属印度洋领地", "loc_name"=>"Chagos Islands", "name:zh_py"=>"Yingshu Yinduyang Lingdu", "name:zh_pyt"=>"Yīngshǔ Yìndùyáng Lǐngdì", "name:be-x-old"=>"Брытанская тэрыторыя ў Індыйскім акіяне"      \N      13
 pk     "name"=>"پاکستان", "name:af"=>"Pakistan", "name:an"=>"Pakistán", "name:ar"=>"باكستان", "name:as"=>"পাকিস্তান", "name:az"=>"Pakistan", "name:ba"=>"Пакистан", "name:be"=>"Пакістан", "name:bg"=>"Пакистан", "name:bn"=>"পাকিস্তান", "name:bo"=>"པ་ཀི་སི་ཏན།", "name:br"=>"Pakistan", "name:bs"=>"Pakistan", "name:ca"=>"Pakistan", "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: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:id"=>"Pakistan", "name:ie"=>"Pakistan", "name:io"=>"Pakistan", "name:is"=>"Pakistan", "name:it"=>"Pakistan", "name:iu"=>"ᐸᑭᔅᑕᓐ/pakistan", "name:ja"=>"パキスタン", "name:jv"=>"Pakistan", "name:ka"=>"პაკისტანი", "name:kk"=>"Пәкістан", "name:kl"=>"Pakistan", "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:mk"=>"Пакистан", "name:ml"=>"പാകിസ്താന്‍", "name:mn"=>"Пакистан", "name:mr"=>"पाकिस्तान", "name:ms"=>"Pakistan", "name:mt"=>"Pakistan", "name:nb"=>"Pakistan", "name:nl"=>"Pakistan", "name:nn"=>"Pakistan", "name:no"=>"Pakistan", "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:sa"=>"पाकिस्तान", "name:sd"=>"پاکستان", "name:se"=>"Pakistan", "name:sh"=>"Pakistan", "name:sk"=>"Pakistan", "name:sl"=>"Pakistan", "name:sq"=>"Pakistani", "name:sr"=>"Пакистан", "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: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"=>"Pakistan", "name:zh"=>"巴基斯坦", "name:ace"=>"Pakistan", "name:als"=>"Pakistan", "name:arc"=>"ܦܩܝܣܛܢ", "name:arz"=>"باكيستان", "name:ast"=>"Paquistán", "name:bcl"=>"Pakistan", "name:bpy"=>"পাকিস্তান", "name:ceb"=>"Pakistan", "name:crh"=>"Pakistan", "name:csb"=>"Pakistan", "name:diq"=>"Pakıstan", "name:dsb"=>"Pakistan", "name:frp"=>"Paquistan", "name:gan"=>"巴基斯坦", "name:hak"=>"Pâ-kî-sṳ̂-thán", "name:haw"=>"Pakitana", "name:hif"=>"Pakistan", "name:hsb"=>"Pakistan", "name:ilo"=>"Pakistan", "name:jbo"=>"kisygu'e", "name:kab"=>"Pakistan", "name:lij"=>"Pakistan", "name:lmo"=>"Pakistan", "name:mdf"=>"Пакистан", "name:mhr"=>"Пакистан", "name:nah"=>"Paquistan", "name:nds"=>"Pakistan", "name:nov"=>"Pakistan", "name:pam"=>"Pakistan", "name:pap"=>"Pakistan", "name:pms"=>"Pakistan", "name:pnb"=>"پاکستان", "name:rmy"=>"Pakistan", "name:sah"=>"Пакистан", "name:scn"=>"Pakistan", "name:sco"=>"Pakistan", "name:szl"=>"Pakistan", "name:udm"=>"Пакистан", "name:vec"=>"Pakistan", "name:war"=>"Pakistan", "name:wuu"=>"巴基斯坦", "name:zh_py"=>"Bajisitan", "name:simple"=>"Pakistan", "name:zh-yue"=>"巴基斯坦", "name:zh_pyt"=>"Bājīsītǎn", "name:bat-smg"=>"Pakėstans", "name:cbk-zam"=>"Pakistan", "name:be-x-old"=>"Пакістан", "official_name"=>"Islamic Republic of Pakistan", "name:zh-min-nan"=>"Pakistan", "official_name:af"=>"Islamistiese Republiek van Pakistan", "official_name:br"=>"Republik islamek Pakistan", "official_name:el"=>"Ισλαμική Δημοκρατία του Πακιστάν", "official_name:fr"=>"République islamique du Pakistan", "official_name:id"=>"Republik Islam Pakistan", "official_name:it"=>"Repubblica Islamica del Pakistan", "official_name:lb"=>"Islamische Republik Pakistan", "official_name:lt"=>"Pakistano Islamo Respublika", "official_name:lv"=>"Pakistānas Islāma Republika", "official_name:pl"=>"Islamska Republika Pakistanu", "official_name:sv"=>"Islamiska republiken Pakistan", "official_name:ur"=>"اسلامی جمہوریۂ پاکستان", "official_name:vi"=>"Cộng hoà Hồi giáo Pakistan", "name:zh-classical"=>"巴基斯坦"   \N      14
 be     "name"=>"België - Belgique - Belgien", "name:af"=>"België", "name:am"=>"ቤልጅግ", "name:an"=>"Belchica", "name:ar"=>"بلجيكا", "name:az"=>"Belçika", "name:be"=>"Бельгія", "name:bg"=>"Белгия", "name:bn"=>"বেলজিয়াম", "name:bo"=>"པེར་ཅིན།", "name:br"=>"Belgia", "name:bs"=>"Belgija", "name:ca"=>"Bèlgica", "name:ce"=>"Бельге", "name:co"=>"Belgica", "name:cs"=>"Belgie", "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:fi"=>"Belgia", "name:fo"=>"Belgia", "name:fr"=>"Belgique", "name:fy"=>"Belgje", "name:ga"=>"An Bheilg", "name:gd"=>"A' Bheilg", "name:gl"=>"Bélxica", "name:gv"=>"Yn Velg", "name:he"=>"בלגיה", "name:hr"=>"Belgija", "name:ht"=>"Bèljik", "name:hu"=>"Belgium", "name:hy"=>"Բելգիա", "name:ia"=>"Belgica", "name:id"=>"Belgia", "name:ie"=>"Belgia", "name:io"=>"Belgia", "name:is"=>"Belgía", "name:it"=>"Belgio", "name:ja"=>"ベルギー", "name:jv"=>"Bèlgia", "name:ka"=>"ბელგია", "name:kk"=>"Белгия", "name:kl"=>"Belgia", "name:ko"=>"벨기에", "name:ku"=>"Belgiya", "name:kv"=>"Бельгия", "name:kw"=>"Pow Belg", "name:ky"=>"Бельгия", "name:la"=>"Belgia", "name:lb"=>"Belsch", "name:li"=>"Belsj", "name:ln"=>"Bɛ́ljika", "name:lt"=>"Belgija", "name:lv"=>"Beļģija", "name:mg"=>"Belzika", "name:mk"=>"Белгија", "name:ml"=>"ബെല്‍ജിയം", "name:mn"=>"Бельги", "name:mr"=>"बेल्जियम", "name:ms"=>"Belgium", "name:mt"=>"Belġju", "name:na"=>"Belgium", "name:nb"=>"Belgia", "name:ne"=>"बेल्जियम", "name:nl"=>"België", "name:nn"=>"Belgia", "name:no"=>"Belgia", "name:oc"=>"Belgica", "name:os"=>"Бельги", "name:pl"=>"Belgia", "name:pt"=>"Bélgica", "name:qu"=>"Bilhika", "name:rm"=>"Belgia", "name:ro"=>"Belgia", "name:ru"=>"Бельгия", "name:rw"=>"U Bubiligi", "name:sa"=>"बेल्जियम", "name:se"=>"Belgia", "name:sh"=>"Belgija", "name:sk"=>"Belgicko", "name:sl"=>"Belgija", "name:sq"=>"Belgjika", "name:sr"=>"Белгија", "name:su"=>"Bélgia", "name:sv"=>"Belgien", "name:sw"=>"Ubelgiji", "name:ta"=>"பெல்ஜியம்", "name:te"=>"బెల్జియం", "name:tg"=>"Белгия", "name:th"=>"ประเทศเบลเยียม", "name:tl"=>"Belhika", "name:tr"=>"Belçika", "name:tt"=>"Бельгия", "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"=>"Belgium", "name:zh"=>"比利时", "name:als"=>"Belgie", "name:ang"=>"Belgice", "name:arc"=>"ܒܠܓܝܟܐ", "name:arz"=>"بلجيكا", "name:ast"=>"Bélxica", "name:bar"=>"Belgien", "name:bcl"=>"Belhika", "name:bpy"=>"বেলজিয়াম", "name:ceb"=>"Belhika", "name:ckb"=>"به‌لجیكا", "name:crh"=>"Belçika", "name:csb"=>"Belgijskô", "name:diq"=>"Belçıka", "name:dsb"=>"Belgiska", "name:frp"=>"Bèlg·ique", "name:fur"=>"Belgjo", "name:hak"=>"Pí-li-sṳ", "name:haw"=>"Pelekiuma", "name:hif"=>"Belgium", "name:hsb"=>"Belgiska", "name:ilo"=>"Belgium", "name:jbo"=>"beldjym", "name:kab"=>"Biljik", "name:ksh"=>"Belljie", "name:lad"=>"Beljika", "name:lij"=>"Belgiò", "name:mdf"=>"Бельгия", "name:nah"=>"Belgica", "name:nap"=>"Belge", "name:nds"=>"Belgien", "name:nov"=>"Belgia", "name:nrm"=>"Belgique", "name:pam"=>"Belgium", "name:pap"=>"Bélgika", "name:pdc"=>"Belgien", "name:pih"=>"Beljum", "name:pms"=>"Belgi", "name:pnb"=>"بیلجیم", "name:pnt"=>"Βέλγιον", "name:rmy"=>"Beljiya", "name:sah"=>"Бельгия", "name:scn"=>"Belgiu", "name:sco"=>"Belgium", "name:srn"=>"Belgikondre", "name:stq"=>"Belgien", "name:szl"=>"Belgijo", "name:tet"=>"Béljika", "name:tpi"=>"Beljiam", "name:udm"=>"Бельгия", "name:vec"=>"Belgio", "name:vls"=>"België", "name:war"=>"Belhika", "name:wuu"=>"比利时", "name:zea"=>"Belhië", "name:zh_py"=>"Bilishi", "name:nds-nl"=>"België", "name:simple"=>"Belgium", "name:zh-yue"=>"比利時", "name:zh_pyt"=>"Bǐlìshí", "name:bat-smg"=>"Belgėjė", "name:fiu-vro"=>"Belgiä", "name:roa-rup"=>"Belghia", "name:be-x-old"=>"Бэльґія", "official_name"=>"Koninkrijk België;Royaume de Belgique;Königreich Belgien", "name:zh-min-nan"=>"Belgien", "official_name:be"=>"Каралеўства Бельгія", "official_name:da"=>"Koninkrijk België", "official_name:de"=>"Königreich Belgien", "official_name:el"=>"Βασίλειο του Βελγίου", "official_name:en"=>"Kingdom of Belgium", "official_name:es"=>"Reino de Bélgica", "official_name:fr"=>"Royaume de Belgique", "official_name:id"=>"Kerajaan Belgia", "official_name:ja"=>"ベルギー王国", "official_name:lt"=>"Belgijos Karalystė", "official_name:lv"=>"Beļģijas Karaliste", "official_name:nl"=>"Koninkrijk België", "official_name:pl"=>"Królestwo Belgii", "official_name:pt"=>"Reino da Bélgica", "official_name:sk"=>"Belgické kráľovstvo", "official_name:sv"=>"Konungariket Belgien", "official_name:vi"=>"Vương quốc Bỉ"     \N      15
-eg     "name"=>"Egypt / مصر", "name:af"=>"Egipte", "name:am"=>"ግብፅ", "name:an"=>"Echipto", "name:ar"=>"مصر", "name:az"=>"Misir", "name:ba"=>"Мысыр", "name:be"=>"Егіпет", "name:bg"=>"Египет", "name:bm"=>"Misra", "name:bn"=>"মিশর", "name:bo"=>"ཨའི་ཅི", "name:br"=>"Egipt", "name:bs"=>"Egipat", "name:ca"=>"Egipte", "name:ce"=>"Миср", "name:cs"=>"Egypt", "name:cu"=>"Єгѷптъ", "name:cy"=>"Yr Aifft", "name:da"=>"Egypten", "name:de"=>"Ägypten", "name:dv"=>"މިޞްރު", "name:el"=>"Αίγυπτος", "name:en"=>"Egypt", "name:eo"=>"Egiptujo", "name:es"=>"Egipto", "name:et"=>"Egiptus", "name:eu"=>"Egipto", "name:fa"=>"مصر", "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:gv"=>"Yn Egypt", "name:he"=>"מצריים", "name:hi"=>"मिस्र", "name:hr"=>"Egipat", "name:ht"=>"Ejip", "name:hu"=>"Egyiptom", "name:hy"=>"Եգիպտոս", "name:ia"=>"Egypto", "name:id"=>"Mesir", "name:ie"=>"Egypt", "name:io"=>"Egiptia", "name:is"=>"Egyptaland", "name:it"=>"Egitto", "name:ja"=>"エジプト", "name:jv"=>"Mesir", "name:ka"=>"ეგვიპტე", "name:kg"=>"Misiri", "name:kk"=>"Мысыр", "name:kn"=>"ಈಜಿಪ್ಟ್", "name:ko"=>"이집트", "name:ks"=>"مِسر", "name:ku"=>"Misir", "name:kv"=>"Египет", "name:kw"=>"Ejyp", "name:la"=>"Aegyptus", "name:lb"=>"Egypten", "name:li"=>"Egypte", "name:ln"=>"Ejipte", "name:lt"=>"Egiptas", "name:lv"=>"Ēģipte", "name:mg"=>"Ejipta", "name:mk"=>"Египет", "name:ml"=>"ഈജിപ്റ്റ്‌", "name:mn"=>"Египет", "name:mr"=>"इजिप्त", "name:ms"=>"Mesir", "name:na"=>"Egypt", "name:ne"=>"इजिप्ट", "name:nl"=>"Egypte", "name:nn"=>"Egypt", "name:no"=>"Egypt", "name:oc"=>"Egipte", "name:os"=>"Мысыр", "name:pa"=>"Egypt", "name:pl"=>"Egipt", "name:ps"=>"مصر", "name:pt"=>"Egito", "name:qu"=>"Ihiptu", "name:ro"=>"Egipt", "name:ru"=>"Египет", "name:sa"=>"ईजिप्ट", "name:se"=>"Egypta", "name:sh"=>"Egipat", "name:sk"=>"Egypt", "name:sl"=>"Egipt", "name:sm"=>"Aikupito", "name:sq"=>"Egjipti", "name:sr"=>"Египат", "name:ss"=>"IGibhithe", "name:sv"=>"Egypten", "name:sw"=>"Misri", "name:ta"=>"எகிப்து", "name:te"=>"ఈజిప్టు", "name:tg"=>"Миср", "name:th"=>"ประเทศอียิปต์", "name:tl"=>"Ehipto", "name:tr"=>"Mısır", "name:ts"=>"Egypt", "name:tt"=>"Мисыр", "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"=>"Egypt", "name:zh"=>"埃及", "name:ace"=>"Mesir", "name:als"=>"Ägypte", "name:ang"=>"Ǣgypt", "name:arc"=>"ܡܨܪܝܢ", "name:arz"=>"مصر", "name:ast"=>"Exipto", "name:bar"=>"Ägyptn", "name:bcl"=>"Ehipto", "name:bpy"=>"মিশর", "name:ceb"=>"Ehipto", "name:crh"=>"Mısır", "name:diq"=>"Mısır", "name:dsb"=>"Egyptojska", "name:frp"=>"Èg·ipte", "name:fur"=>"Egjit", "name:gan"=>"埃及", "name:hak"=>"Âi-khi̍p", "name:haw"=>"‘Aikupika", "name:hif"=>"Egypt", "name:hsb"=>"Egyptowska", "name:ilo"=>"Ehipto", "name:jbo"=>"misrygu'e", "name:kab"=>"Maṣer", "name:lij"=>"Egitto", "name:lmo"=>"Egit", "name:mdf"=>"Египет", "name:mzn"=>"مەسر", "name:nah"=>"Egipto", "name:nap"=>"Naggitto", "name:nds"=>"Ägypten", "name:new"=>"मिस्र", "name:nov"=>"Egiptia", "name:nrm"=>"Êgypte", "name:pam"=>"Ejiptu", "name:pms"=>"Egit", "name:pnb"=>"مصر", "name:pnt"=>"Αίγυπτος", "name:sah"=>"Эгипет", "name:scn"=>"Eggittu", "name:sco"=>"Egyp", "name:stq"=>"Ägypten", "name:szl"=>"Egipt", "name:tet"=>"Ejitu", "name:tpi"=>"Ijip", "name:vec"=>"Egito", "name:vls"=>"Egypte", "name:war"=>"Ehipto", "name:wuu"=>"埃及", "name:zh_py"=>"Aiji", "name:nds-nl"=>"Egypte", "name:simple"=>"Egypt", "name:zh-yue"=>"埃及", "name:zh_pyt"=>"Āijí", "name:bat-smg"=>"Egėpts", "name:be-x-old"=>"Эгіпет", "official_name"=>"جمهورية مصر العربية", "name:zh-min-nan"=>"Ai-ki̍p", "official_name:af"=>"Arabiese Republiek van Egipte", "official_name:br"=>"Republik arab Egipt", "official_name:ca"=>"República Àrab d'Egipte", "official_name:el"=>"Αραβική Δημοκρατία της Αιγύπτου", "official_name:en"=>"Arab Republic of Egypt", "official_name:et"=>"Egiptuse Araabia Vabariik", "official_name:id"=>"Republik Arab Mesir", "official_name:lb"=>"Arabesch Republik vun Egypten", "official_name:lt"=>"Egipto Arabų Respublika", "official_name:lv"=>"Ēģiptes Arābu Republika", "official_name:pt"=>"República Árabe do Egito", "official_name:sv"=>"Arabrepubliken Egypten", "official_name:vi"=>"Cộng hòa Ả Rập Ai Cập", "name:zh-classical"=>"埃及"      \N      16
-jo     "name"=>"Jordan / الأُرْدُن", "name:af"=>"Jordanië", "name:an"=>"Chordania", "name:ar"=>"الأردن", "name:az"=>"İordaniya", "name:be"=>"Іарданія", "name:bg"=>"Йордания", "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: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:fr"=>"Jordanie", "name:fy"=>"Jordaanje", "name:ga"=>"An Iordáin", "name:gd"=>"Iòrdan", "name:gl"=>"Xordania", "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:ko"=>"요르단", "name:ks"=>"जार्डन", "name:ku"=>"Urdun", "name:kv"=>"Иордания", "name:kw"=>"Jordan", "name:la"=>"Iordania", "name:lb"=>"Jordanien", "name:li"=>"Jordanië", "name:lt"=>"Jordanija", "name:lv"=>"Jordānija", "name:mk"=>"Јордан", "name:ml"=>"ജോര്‍ദാന്‍", "name:mn"=>"Йордан", "name:mr"=>"जॉर्डन", "name:ms"=>"Jordan", "name:na"=>"Jordan", "name:nl"=>"Jordanië", "name:nn"=>"Jordan", "name:no"=>"Jordan", "name:oc"=>"Jordania", "name:os"=>"Иордани", "name:pl"=>"Jordania", "name:ps"=>"اردن", "name:pt"=>"Jordânia", "name:qu"=>"Hurdanya", "name:ro"=>"Iordania", "name:ru"=>"Иордания", "name:sa"=>"जार्डन", "name:se"=>"Jordánia", "name:sh"=>"Jordan", "name:sk"=>"Jordánsko", "name:sl"=>"Jordanija", "name:sq"=>"Jordania", "name:sr"=>"Јордан", "name:sv"=>"Jordanien", "name:sw"=>"Yordani", "name:ta"=>"ஜோர்தான்", "name:te"=>"జోర్డాన్", "name:th"=>"ประเทศจอร์แดน", "name:tl"=>"Jordan", "name:tr"=>"Ürdün", "name:ug"=>"ئىئوردانىيە", "name:uk"=>"Йорданія", "name:ur"=>"اردن", "name:uz"=>"Iordan", "name:vi"=>"Jordan", "name:vo"=>"Yordän", "name:wo"=>"Jordaani", "name:yi"=>"יארדאניע", "name:zh"=>"约旦", "name:ace"=>"Yordania", "name:als"=>"Jordanien", "name:ang"=>"Jordan", "name:arc"=>"ܝܘܪܕܢܢ", "name:arz"=>"الاردن", "name:ast"=>"Xordania", "name:bcl"=>"Yordanya", "name:bpy"=>"জর্ডান", "name:ceb"=>"Jordan", "name:crh"=>"Urdun", "name:diq"=>"Urdun", "name:dsb"=>"Jordanska", "name:frp"=>"J·ordanie", "name:hak"=>"Yok-tan", "name:haw"=>"Ioredāne", "name:hif"=>"Jordan", "name:hsb"=>"Jordaniska", "name:ilo"=>"Jordan", "name:jbo"=>"jorgu'e", "name:kab"=>"Urdun", "name:lij"=>"Giordannia", "name:lmo"=>"Giurdania", "name:mzn"=>"اوردون", "name:nah"=>"Iordania", "name:nds"=>"Jordanien", "name:nov"=>"Jordan", "name:pam"=>"Jordan", "name:pms"=>"Giordania", "name:pnb"=>"اردن", "name:sah"=>"Иордания", "name:scn"=>"Giurdania", "name:szl"=>"Jordańijo", "name:udm"=>"Иордания", "name:war"=>"Hordanya", "name:wuu"=>"约旦", "name:zh_py"=>"Yuedan", "name:simple"=>"Jordan", "name:zh_pyt"=>"Yuēdàn", "name:bat-smg"=>"Juordanėjė", "name:fiu-vro"=>"Jordaania", "name:be-x-old"=>"Ярданія", "official_name"=>"المملكة الأردنية الهاشمية", "name:zh-min-nan"=>"Iok-tàn", "official_name:br"=>"Rouantelezh hachemit Jordania", "official_name:el"=>"Χασεμιτικό Βασίλειο της Ιορδανίας", "official_name:en"=>"Hashemite Kingdom of Jordan", "official_name:et"=>"Jordaania Hašimiidi Kuningriik", "official_name:gd"=>"Rioghachd Hashemach na Iòrdain", "official_name:id"=>"Kerajaan Hasyimiyah Yordania", "official_name:it"=>"Regno Hascemita di Giordania", "official_name:lb"=>"Haschimitescht Kinnekräich Jordanien", "official_name:lt"=>"Jordanijos Hašimitų Karalystė", "official_name:lv"=>"Jordānijas Hāšimītu Karaliste", "official_name:pl"=>"Jordańskie Królestwo Haszymidzkie", "official_name:sv"=>"Hashemitiska konungariket Jordanien"   \N      17
-tn     "name"=>"تونس", "name:af"=>"Tunisië", "name:am"=>"ቱኒዚያ", "name:an"=>"Tunizia", "name:ar"=>"تونس", "name:az"=>"Tunis", "name:be"=>"Туніс", "name:bg"=>"Тунис", "name:bm"=>"Tunizi", "name:bn"=>"তিউনিসিয়া", "name:br"=>"Tunizia", "name:bs"=>"Tunis", "name:ca"=>"Tunísia", "name:cs"=>"Tunisko", "name:cv"=>"Тунис", "name:cy"=>"Tunisia", "name:da"=>"Tunesien", "name:de"=>"Tunesien", "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:gv"=>"Yn Tooneesh", "name:he"=>"טוניס", "name:hi"=>"टुनिशिया", "name:hr"=>"Tunis", "name:ht"=>"Tinizi", "name:hu"=>"Tunézia", "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:la"=>"Tunesia", "name:lb"=>"Tunesien", "name:li"=>"Tunesië", "name:ln"=>"Tunisia", "name:lt"=>"Tunisas", "name:lv"=>"Tunisija", "name:mg"=>"Tonizia", "name:mk"=>"Тунис", "name:ml"=>"ടുണീഷ്യ", "name:mn"=>"Тунис", "name:mr"=>"ट्युनिसिया", "name:ms"=>"Tunisia", "name:mt"=>"Tuneżija", "name:nl"=>"Tunesië", "name:nn"=>"Tunisia", "name:no"=>"Tunisia", "name:oc"=>"Tunisia", "name:pl"=>"Tunezja", "name:pt"=>"Tunísia", "name:qu"=>"Tunisya", "name:rm"=>"Tunesia", "name:ro"=>"Tunisia", "name:ru"=>"Тунис", "name:sa"=>"टुनिशिया", "name:sc"=>"Tunisia", "name:se"=>"Tunisia", "name:sh"=>"Tunis", "name:sk"=>"Tunisko", "name:sl"=>"Tunizija", "name:so"=>"Tunisie", "name:sq"=>"Tunizia", "name:sr"=>"Тунис", "name:sv"=>"Tunisien", "name:sw"=>"Tunisia", "name:ta"=>"துனீசியா", "name:te"=>"ట్యునీషియా", "name:tg"=>"Тунис", "name:th"=>"ประเทศตูนิเซีย", "name:ti"=>"ቱኒዢያ", "name:tl"=>"Tunisia", "name:tr"=>"Tunus", "name:ts"=>"Tunisia", "name:ug"=>"تۇنىس", "name:uk"=>"Туніс", "name:ur"=>"تیونس", "name:uz"=>"Tunis", "name:vi"=>"Tunisia", "name:vo"=>"Tunisän", "name:wa"=>"Tunizeye", "name:wo"=>"Tiniisi", "name:yo"=>"Tunisia", "name:zh"=>"突尼西亚", "name:ace"=>"Tunisia", "name:als"=>"Tunesien", "name:ang"=>"Tunisia", "name:arc"=>"ܬܘܢܣ", "name:arz"=>"تونس", "name:ast"=>"Túnez", "name:bcl"=>"Tunisya", "name:bpy"=>"তিউনিসিয়া", "name:ceb"=>"Tunisia", "name:crh"=>"Tunis", "name:diq"=>"Tunıs", "name:frp"=>"Tunisie", "name:haw"=>"Tunisia", "name:hif"=>"Tunisia", "name:hsb"=>"Tuneziska", "name:ilo"=>"Tunisia", "name:kab"=>"Tunes", "name:lad"=>"Tunesia", "name:lij"=>"Tunixia", "name:lmo"=>"Tünisia", "name:mzn"=>"تونس", "name:nah"=>"Tunez", "name:nds"=>"Tunesien", "name:nov"=>"Tunisia", "name:pam"=>"Tunisia", "name:pap"=>"Tunesia", "name:pms"=>"Tunisìa", "name:pnb"=>"ٹیونس", "name:sah"=>"Тунис", "name:scn"=>"Tunisìa", "name:szl"=>"Tůnezyjo", "name:vec"=>"Tunixia", "name:war"=>"Tunisia", "name:wuu"=>"突尼斯", "name:zh_py"=>"Tunixiya", "name:simple"=>"Tunisia", "name:zh_pyt"=>"Tūníxīyà", "name:be-x-old"=>"Туніс", "official_name"=>"الجمهورية التونسية", "name:zh-min-nan"=>"Tunisia", "official_name:br"=>"Republik Tunizian", "official_name:el"=>"Δημοκρατία της Τυνησίας", "official_name:en"=>"Tunisian Republic", "official_name:et"=>"Tuneesia Vabariik", "official_name:id"=>"Republik Tunisia", "official_name:ja"=>"チュニジア共和国", "official_name:lb"=>"Tunesesch Republik", "official_name:lt"=>"Tuniso Respublika", "official_name:pt"=>"República da Tunísia", "official_name:sv"=>"Republiken Tunisien", "official_name:vi"=>"Cộng hòa Tunisia" \N      18
-dz     "name"=>"الجزائر", "name:af"=>"Algerië", "name:am"=>"አልጄሪያ", "name:an"=>"Alcheria", "name:ar"=>"الجزائر", "name:az"=>"Əlcəzair", "name:be"=>"Алжыр", "name:bg"=>"Алжир", "name:bm"=>"Aljeri", "name:bn"=>"আলজেরিয়া", "name:bo"=>"ཨར་གེ་རི་ཡ", "name:br"=>"Aljeria", "name:bs"=>"Alžir", "name:ca"=>"Algeria", "name:cs"=>"Alžírsko", "name:cv"=>"Алжир", "name:cy"=>"Algeria", "name:da"=>"Algeriet", "name:de"=>"Algerien", "name:dv"=>"ޖަޒާއިރު", "name:dz"=>"ཨལ་ཇི་རི་ཡ།", "name:el"=>"Αλγερία", "name:en"=>"Algeria", "name:eo"=>"Alĝerio", "name:es"=>"Argelia", "name:et"=>"Alžiir", "name:eu"=>"Aljeria", "name:fa"=>"الجزایر", "name:fi"=>"Algeria", "name:fr"=>"Algérie", "name:fy"=>"Algerije", "name:ga"=>"An Ailgéir", "name:gd"=>"Aildiria", "name:gl"=>"Alxeria", "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:io"=>"Aljeria", "name:is"=>"Alsír", "name:it"=>"Algeria", "name:ja"=>"アルジェリア", "name:jv"=>"Aljazair", "name:ka"=>"ალჟირი", "name:kg"=>"Djazairia", "name:kn"=>"ಅಲ್ಜೀರಿಯ", "name:ko"=>"알제리", "name:ku"=>"Alcerya", "name:kw"=>"Aljeri", "name:ky"=>"Алжир", "name:la"=>"Algerium", "name:lb"=>"Algerien", "name:li"=>"Algerieë", "name:ln"=>"Aljeria", "name:lt"=>"Alžyras", "name:lv"=>"Alžīrija", "name:mg"=>"Aljeria", "name:mk"=>"Алжир", "name:ml"=>"അള്‍ജീറിയ", "name:mn"=>"Алжир", "name:mr"=>"अल्जीरिया", "name:ms"=>"Algeria", "name:mt"=>"Alġerija", "name:na"=>"Algeria", "name:nl"=>"Algerije", "name:nn"=>"Algerie", "name:no"=>"Algerie", "name:oc"=>"Argeria", "name:os"=>"Алжир", "name:pl"=>"Algieria", "name:ps"=>"الجېريا", "name:pt"=>"Argélia", "name:qu"=>"Alhirya", "name:rm"=>"Algeria", "name:ro"=>"Algeria", "name:ru"=>"Алжир", "name:sa"=>"अल्जीरिया", "name:sc"=>"Algerìa", "name:se"=>"Algeria", "name:sh"=>"Alžir", "name:sk"=>"Alžírsko", "name:sl"=>"Alžirija", "name:sm"=>"Algeria", "name:so"=>"Aljeeriya", "name:sq"=>"Algjeria", "name:sr"=>"Алжир", "name:sv"=>"Algeriet", "name:sw"=>"Algeria", "name:ta"=>"அல்சீரியா", "name:te"=>"అల్జీరియా", "name:tg"=>"Алҷазоир", "name:th"=>"ประเทศแอลจีเรีย", "name:tl"=>"Alherya", "name:tr"=>"Cezayir", "name:ts"=>"Algeria", "name:ug"=>"ئالجىرىيە", "name:uk"=>"Алжир", "name:ur"=>"الجزائر", "name:uz"=>"Jazoir", "name:vi"=>"Algiers", "name:vo"=>"Laljerän", "name:wa"=>"Aldjereye", "name:wo"=>"Alseeri", "name:yi"=>"אלזשעריע", "name:yo"=>"Algeria", "name:zh"=>"阿尔及利亚", "name:als"=>"Algerie", "name:ang"=>"Algeria", "name:arc"=>"ܓܙܐܝܪ", "name:arz"=>"الجزاير", "name:ast"=>"Arxelia", "name:bcl"=>"Algerya", "name:ber"=>"ⴷⵥⴰⵢⴻⵔ (Dzayer)", "name:bpy"=>"আলজেরিয়া", "name:ceb"=>"Algeria", "name:crh"=>"Cezair", "name:diq"=>"Cezayir", "name:dsb"=>"Algeriska", "name:ext"=>"Argélia", "name:frp"=>"Alg·èrie", "name:haw"=>"‘Alekelia", "name:hif"=>"Algeria", "name:hsb"=>"Algeriska", "name:jbo"=>"jexygu'e", "name:kab"=>"Dzayer", "name:ksh"=>"Alljeerije", "name:lad"=>"Arjelia", "name:lij"=>"Algeïa", "name:lmo"=>"Algeria", "name:mzn"=>"الجزایر", "name:nah"=>"Argelia", "name:nds"=>"Algerien", "name:nov"=>"Algeria", "name:pam"=>"Algeria", "name:pap"=>"Algeria", "name:pdc"=>"Altschieri", "name:pih"=>"Algeria", "name:pms"=>"Algerìa", "name:pnb"=>"الجزائر", "name:sah"=>"Алжир", "name:scn"=>"Algirìa", "name:stq"=>"Algerien", "name:szl"=>"Algeryjo", "name:vec"=>"Algeria", "name:war"=>"Alherya", "name:wuu"=>"阿尔及利亚", "name:zea"=>"Alherije", "name:zh_py"=>"Aerjiliya", "name:simple"=>"Algeria", "name:zh-yue"=>"阿爾及利亞", "name:zh_pyt"=>"Āěrjílìyà", "name:bat-smg"=>"Alžīrs", "name:fiu-vro"=>"Alžeeriä", "official_name"=>"アルジェリア民主人民共和国", "name:zh-min-nan"=>"Algeria", "official_name:en"=>"People's Democratic Republic of Algeria", "official_name:fr"=>"République algérienne démocratique et populaire", "official_name:lb"=>"Demokratesch Volleksrepublik Algerien", "official_name:pt"=>"República Popular Democrática da Argélia", "official_name:sl"=>"Ljudska demokratična republika Alžirija", "official_name:sv"=>"Demokratiska folkrepubliken Algeriet"      \N      19
-tw     "name"=>"Taiwan", "name:ar"=>"تايوان", "name:be"=>"Тайвань", "name:br"=>"Taiwan", "name:da"=>"Taiwan", "name:en"=>"Taiwan", "name:eo"=>"Tajvano", "name:fa"=>"تایوان", "name:fi"=>"Taiwan", "name:fr"=>"Taïwan", "name:ga"=>"An Téaváin", "name:gd"=>"Tai-Bhàn", "name:he"=>"טייואן", "name:hr"=>"Tajvan", "name:hu"=>"Tajvan", "name:is"=>"Lýðveldið Kína", "name:it"=>"Taiwan", "name:ja"=>"台湾", "name:la"=>"Taivania", "name:lt"=>"Taivanas", "name:mn"=>"Тайвань", "name:pl"=>"Tajwan", "name:pt"=>"Taiwan; Formosa", "name:ru"=>"Тайвань", "name:sl"=>"Tajvan", "name:sv"=>"Taiwan", "name:th"=>"ไต้หวัน", "name:tr"=>"Tayvan", "name:uk"=>"Тайвань", "name:vi"=>"Đài Loan", "name:zh"=>"台湾", "name:zh_py"=>"Taiwan", "name:zh_pyt"=>"Táiwān", "name:zh-Hans"=>"台湾", "name:zh-Hant"=>"台灣", "official_name:et"=>"Hiina Vabariik", "official_name:gd"=>"Poblachd na Sìne", "official_name:id"=>"Republik Cina", "official_name:it"=>"Repubblica di Cina", "official_name:la"=>"Res publica Sinarum", "official_name:lb"=>"Republik China", "official_name:lt"=>"Taivanas (Kinijos provincija)", "official_name:pl"=>"Republika Chińska", "official_name:pt"=>"República da China", "official_name:vi"=>"Trung Hoa Dân Quốc"    \N      25
 ph     "name"=>"Philippines", "name:af"=>"Filippyne", "name:ar"=>"الفلبين", "name:be"=>"Філіпіны", "name:br"=>"Filipinez", "name:ca"=>"Filipines", "name:cy"=>"Pilipinas", "name:da"=>"Filippinerne", "name:de"=>"Philippinen", "name:el"=>"Φιλιππίνες", "name:eo"=>"Filipinoj", "name:es"=>"Filipinas", "name:fa"=>"فیلیپین", "name:fi"=>"Filippiinit", "name:fr"=>"Philippines", "name:fy"=>"de Filipinen", "name:ga"=>"Na hOileáin Fhilipíneacha", "name:gd"=>"Na h-Eileanan Filipineach", "name:he"=>"פיליפינים", "name:hr"=>"Filipini", "name:hu"=>"Fülöp-szigetek", "name:id"=>"Filipina", "name:is"=>"Filippseyjar", "name:it"=>"Filippine", "name:ja"=>"フィリピン", "name:la"=>"Philippinae", "name:lb"=>"Philippinen", "name:li"=>"De Filipiene", "name:lt"=>"Filipinai", "name:lv"=>"Filipīnas", "name:mn"=>"Филиппин", "name:nl"=>"Filipijnen", "name:pl"=>"Filipiny", "name:ru"=>"Филиппины", "name:sl"=>"Filipini", "name:sv"=>"Filippinerna", "name:th"=>"ประเทศฟิลิปปินส์", "name:tl"=>"Pilipinas", "name:tr"=>"Filipinler", "name:uk"=>"Філіппіни", "name:zh"=>"菲律宾", "name:haw"=>"ʻĀina Pilipino", "name:zh_py"=>"Feilübin", "name:zh_pyt"=>"Fēilǜbīn", "official_name"=>"Republic of the Philippines", "official_name:br"=>"Republik Filipinez", "official_name:el"=>"Δημοκρατία των Φιλιππίνων", "official_name:en"=>"Republic of the Philippines", "official_name:id"=>"Republik Filipina", "official_name:it"=>"Repubblica delle Filippine", "official_name:lb"=>"Republik vu de Philippinen", "official_name:lt"=>"Filipinų Respublika", "official_name:pl"=>"Republika Filipin", "official_name:sv"=>"Republiken Filippinerna", "official_name:tl"=>"Republika ng Pilipinas", "official_name:vi"=>"Cộng hoà Philippines"   \N      26
+al     "name"=>"Shqipëria", "name:af"=>"Albanië", "name:am"=>"አልባኒያ", "name:an"=>"Albania", "name:ar"=>"ألبانيا", "name:az"=>"Albaniya", "name:be"=>"Албанія", "name:bg"=>"Албания", "name:bn"=>"আলবেনিয়া", "name:bo"=>"ཨར་པ་ཉི་ཡ།", "name:br"=>"Albania", "name:bs"=>"Albanija", "name:ca"=>"Albània", "name:ce"=>"Албани", "name:co"=>"Albania", "name:cs"=>"Albánie", "name:cv"=>"Албани", "name:cy"=>"Albania", "name:da"=>"Albanien", "name:de"=>"Albanien", "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: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:gv"=>"Yn Albaan", "name:he"=>"אלבניה", "name:hi"=>"अल्बानिया", "name:hr"=>"Albanija", "name:ht"=>"Albani", "name:hu"=>"Albánia", "name:hy"=>"Ալբանիա", "name:id"=>"Albania", "name:ie"=>"Albania", "name:io"=>"Albania", "name:is"=>"Albanía", "name:it"=>"Albania", "name:ja"=>"アルバニア", "name:jv"=>"Albania", "name:ka"=>"ალბანეთი", "name:kg"=>"Albania", "name:kk"=>"Албания", "name:km"=>"អាល់បានី", "name:kn"=>"ಅಲ್ಬೇನಿಯ", "name:ko"=>"알바니아", "name:ku"=>"Albanya", "name:kv"=>"Албания", "name:ky"=>"Албания", "name:la"=>"Albania", "name:lb"=>"Albanien", "name:li"=>"Albanië", "name:ln"=>"Albania", "name:lt"=>"Albanija", "name:lv"=>"Albānija", "name:mg"=>"Albania", "name:mk"=>"Албанија", "name:ml"=>"അല്‍ബേനിയ", "name:mn"=>"Албани", "name:mr"=>"आल्बेनिया", "name:ms"=>"Albania", "name:mt"=>"Albanija", "name:na"=>"Albania", "name:ne"=>"अल्बानिया", "name:nl"=>"Albanië", "name:nn"=>"Albania", "name:no"=>"Albania", "name:oc"=>"Albania", "name:os"=>"Албани", "name:pl"=>"Albania", "name:ps"=>"البانيا", "name:pt"=>"Albânia", "name:qu"=>"Albanya", "name:rm"=>"Albania", "name:ro"=>"Albania", "name:ru"=>"Албания", "name:sa"=>"अल्बानिया", "name:sc"=>"Albania", "name:se"=>"Albánia", "name:sh"=>"Albanija", "name:sk"=>"Albánsko", "name:sl"=>"Albanija", "name:sq"=>"Shqipëria", "name:sr"=>"Албанија", "name:ss"=>"I-Alibheniya", "name:su"=>"Albania", "name:sv"=>"Albanien", "name:sw"=>"Albania", "name:ta"=>"அல்பேனியா", "name:te"=>"అల్బేనియా", "name:tg"=>"Албания", "name:th"=>"ประเทศแอลเบเนีย", "name:tl"=>"Albanya", "name:tr"=>"Arnavutluk", "name:tt"=>"Албания", "name:ug"=>"ئالبانىيە", "name:uk"=>"Албанія", "name:ur"=>"البانیا", "name:uz"=>"Albaniya", "name:vi"=>"Albania", "name:vo"=>"Lalbanän", "name:wo"=>"Albaani", "name:yi"=>"אלבאניע", "name:yo"=>"Albania", "name:zh"=>"阿尔巴尼亚", "name:ace"=>"Albania", "name:als"=>"Albanie", "name:ang"=>"Albania", "name:arc"=>"ܐܠܒܢܝܐ", "name:arz"=>"ألبانيا", "name:ast"=>"Albania", "name:bar"=>"Albanien", "name:bcl"=>"Albanya", "name:bpy"=>"আলবেনিয়া", "name:ceb"=>"Albanya", "name:chr"=>"ᎠᎸᏇᏂᏯ", "name:crh"=>"Arnavutlıq", "name:csb"=>"Albańskô", "name:diq"=>"Arnawutiye", "name:dsb"=>"Albańska", "name:eml"=>"Albanî", "name:ext"=>"Albánia", "name:frp"=>"Albanie", "name:fur"=>"Albanie", "name:haw"=>"‘Alepania", "name:hif"=>"Albania", "name:hsb"=>"Albanska", "name:ilo"=>"Albania", "name:lad"=>"אלבאניה", "name:lij"=>"Albania", "name:lmo"=>"Albania", "name:mzn"=>"آلباني", "name:nah"=>"Albania", "name:nds"=>"Albanien", "name:nov"=>"Albania", "name:pam"=>"Albania", "name:pdc"=>"Albaani", "name:pih"=>"Elbanya", "name:pms"=>"Albanìa", "name:pnb"=>"البانیا", "name:pnt"=>"Αλβανία", "name:rmy"=>"Shkiperiya", "name:sah"=>"Албания", "name:scn"=>"Albanìa", "name:sco"=>"Albanie", "name:srn"=>"Albanikondre", "name:stq"=>"Albanien", "name:szl"=>"Albańijo", "name:tet"=>"Albánia", "name:tpi"=>"Albenia", "name:udm"=>"Албания", "name:vec"=>"Albania", "name:war"=>"Albanya", "name:wuu"=>"阿尔巴尼亚", "name:xal"=>"Арнаутн Орн Нутг", "name:zea"=>"Albanië", "name:zh_py"=>"Aerbaniya", "name:simple"=>"Albania", "name:zh-yue"=>"阿爾巴尼亞", "name:zh_pyt"=>"Āěrbāníyà", "name:bat-smg"=>"Albanėjė", "name:fiu-vro"=>"Albaania", "name:roa-rup"=>"Arbinishia", "name:be-x-old"=>"Альбанія", "official_name"=>"Republika e Shqipërisë", "name:zh-min-nan"=>"Shqipëria", "official_name:be"=>"Рэспубліка Албанія", "official_name:el"=>"Δημοκρατία της Αλβανίας", "official_name:en"=>"Republic of Albania", "official_name:es"=>"República de Albania", "official_name:et"=>"Albaania Vabariik", "official_name:fr"=>"République d'Albanie", "official_name:ja"=>"アルバニア共和国", "official_name:lb"=>"Republik Albanien", "official_name:pl"=>"Republika Albanii", "official_name:pt"=>"República da Albânia", "official_name:sk"=>"Albánska republika", "official_name:sv"=>"Republiken Albanien", "official_name:vi"=>"Cộng hoà Albania"  sq      9
+dz     "name"=>"الجزائر", "name:af"=>"Algerië", "name:am"=>"አልጄሪያ", "name:an"=>"Alcheria", "name:ar"=>"الجزائر", "name:az"=>"Əlcəzair", "name:be"=>"Алжыр", "name:bg"=>"Алжир", "name:bm"=>"Aljeri", "name:bn"=>"আলজেরিয়া", "name:bo"=>"ཨར་གེ་རི་ཡ", "name:br"=>"Aljeria", "name:bs"=>"Alžir", "name:ca"=>"Algeria", "name:cs"=>"Alžírsko", "name:cv"=>"Алжир", "name:cy"=>"Algeria", "name:da"=>"Algeriet", "name:de"=>"Algerien", "name:dv"=>"ޖަޒާއިރު", "name:dz"=>"ཨལ་ཇི་རི་ཡ།", "name:el"=>"Αλγερία", "name:en"=>"Algeria", "name:eo"=>"Alĝerio", "name:es"=>"Argelia", "name:et"=>"Alžiir", "name:eu"=>"Aljeria", "name:fa"=>"الجزایر", "name:fi"=>"Algeria", "name:fr"=>"Algérie", "name:fy"=>"Algerije", "name:ga"=>"An Ailgéir", "name:gd"=>"Aildiria", "name:gl"=>"Alxeria", "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:io"=>"Aljeria", "name:is"=>"Alsír", "name:it"=>"Algeria", "name:ja"=>"アルジェリア", "name:jv"=>"Aljazair", "name:ka"=>"ალჟირი", "name:kg"=>"Djazairia", "name:kn"=>"ಅಲ್ಜೀರಿಯ", "name:ko"=>"알제리", "name:ku"=>"Alcerya", "name:kw"=>"Aljeri", "name:ky"=>"Алжир", "name:la"=>"Algerium", "name:lb"=>"Algerien", "name:li"=>"Algerieë", "name:ln"=>"Aljeria", "name:lt"=>"Alžyras", "name:lv"=>"Alžīrija", "name:mg"=>"Aljeria", "name:mk"=>"Алжир", "name:ml"=>"അള്‍ജീറിയ", "name:mn"=>"Алжир", "name:mr"=>"अल्जीरिया", "name:ms"=>"Algeria", "name:mt"=>"Alġerija", "name:na"=>"Algeria", "name:nl"=>"Algerije", "name:nn"=>"Algerie", "name:no"=>"Algerie", "name:oc"=>"Argeria", "name:os"=>"Алжир", "name:pl"=>"Algieria", "name:ps"=>"الجېريا", "name:pt"=>"Argélia", "name:qu"=>"Alhirya", "name:rm"=>"Algeria", "name:ro"=>"Algeria", "name:ru"=>"Алжир", "name:sa"=>"अल्जीरिया", "name:sc"=>"Algerìa", "name:se"=>"Algeria", "name:sh"=>"Alžir", "name:sk"=>"Alžírsko", "name:sl"=>"Alžirija", "name:sm"=>"Algeria", "name:so"=>"Aljeeriya", "name:sq"=>"Algjeria", "name:sr"=>"Алжир", "name:sv"=>"Algeriet", "name:sw"=>"Algeria", "name:ta"=>"அல்சீரியா", "name:te"=>"అల్జీరియా", "name:tg"=>"Алҷазоир", "name:th"=>"ประเทศแอลจีเรีย", "name:tl"=>"Alherya", "name:tr"=>"Cezayir", "name:ts"=>"Algeria", "name:ug"=>"ئالجىرىيە", "name:uk"=>"Алжир", "name:ur"=>"الجزائر", "name:uz"=>"Jazoir", "name:vi"=>"Algiers", "name:vo"=>"Laljerän", "name:wa"=>"Aldjereye", "name:wo"=>"Alseeri", "name:yi"=>"אלזשעריע", "name:yo"=>"Algeria", "name:zh"=>"阿尔及利亚", "name:als"=>"Algerie", "name:ang"=>"Algeria", "name:arc"=>"ܓܙܐܝܪ", "name:arz"=>"الجزاير", "name:ast"=>"Arxelia", "name:bcl"=>"Algerya", "name:ber"=>"ⴷⵥⴰⵢⴻⵔ (Dzayer)", "name:bpy"=>"আলজেরিয়া", "name:ceb"=>"Algeria", "name:crh"=>"Cezair", "name:diq"=>"Cezayir", "name:dsb"=>"Algeriska", "name:ext"=>"Argélia", "name:frp"=>"Alg·èrie", "name:haw"=>"‘Alekelia", "name:hif"=>"Algeria", "name:hsb"=>"Algeriska", "name:jbo"=>"jexygu'e", "name:kab"=>"Dzayer", "name:ksh"=>"Alljeerije", "name:lad"=>"Arjelia", "name:lij"=>"Algeïa", "name:lmo"=>"Algeria", "name:mzn"=>"الجزایر", "name:nah"=>"Argelia", "name:nds"=>"Algerien", "name:nov"=>"Algeria", "name:pam"=>"Algeria", "name:pap"=>"Algeria", "name:pdc"=>"Altschieri", "name:pih"=>"Algeria", "name:pms"=>"Algerìa", "name:pnb"=>"الجزائر", "name:sah"=>"Алжир", "name:scn"=>"Algirìa", "name:stq"=>"Algerien", "name:szl"=>"Algeryjo", "name:vec"=>"Algeria", "name:war"=>"Alherya", "name:wuu"=>"阿尔及利亚", "name:zea"=>"Alherije", "name:zh_py"=>"Aerjiliya", "name:simple"=>"Algeria", "name:zh-yue"=>"阿爾及利亞", "name:zh_pyt"=>"Āěrjílìyà", "name:bat-smg"=>"Alžīrs", "name:fiu-vro"=>"Alžeeriä", "official_name"=>"アルジェリア民主人民共和国", "name:zh-min-nan"=>"Algeria", "official_name:en"=>"People's Democratic Republic of Algeria", "official_name:fr"=>"République algérienne démocratique et populaire", "official_name:lb"=>"Demokratesch Volleksrepublik Algerien", "official_name:pt"=>"República Popular Democrática da Argélia", "official_name:sl"=>"Ljudska demokratična republika Alžirija", "official_name:sv"=>"Demokratiska folkrepubliken Algeriet"      ar      19
+eg     "name"=>"Egypt / مصر", "name:af"=>"Egipte", "name:am"=>"ግብፅ", "name:an"=>"Echipto", "name:ar"=>"مصر", "name:az"=>"Misir", "name:ba"=>"Мысыр", "name:be"=>"Егіпет", "name:bg"=>"Египет", "name:bm"=>"Misra", "name:bn"=>"মিশর", "name:bo"=>"ཨའི་ཅི", "name:br"=>"Egipt", "name:bs"=>"Egipat", "name:ca"=>"Egipte", "name:ce"=>"Миср", "name:cs"=>"Egypt", "name:cu"=>"Єгѷптъ", "name:cy"=>"Yr Aifft", "name:da"=>"Egypten", "name:de"=>"Ägypten", "name:dv"=>"މިޞްރު", "name:el"=>"Αίγυπτος", "name:en"=>"Egypt", "name:eo"=>"Egiptujo", "name:es"=>"Egipto", "name:et"=>"Egiptus", "name:eu"=>"Egipto", "name:fa"=>"مصر", "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:gv"=>"Yn Egypt", "name:he"=>"מצריים", "name:hi"=>"मिस्र", "name:hr"=>"Egipat", "name:ht"=>"Ejip", "name:hu"=>"Egyiptom", "name:hy"=>"Եգիպտոս", "name:ia"=>"Egypto", "name:id"=>"Mesir", "name:ie"=>"Egypt", "name:io"=>"Egiptia", "name:is"=>"Egyptaland", "name:it"=>"Egitto", "name:ja"=>"エジプト", "name:jv"=>"Mesir", "name:ka"=>"ეგვიპტე", "name:kg"=>"Misiri", "name:kk"=>"Мысыр", "name:kn"=>"ಈಜಿಪ್ಟ್", "name:ko"=>"이집트", "name:ks"=>"مِسر", "name:ku"=>"Misir", "name:kv"=>"Египет", "name:kw"=>"Ejyp", "name:la"=>"Aegyptus", "name:lb"=>"Egypten", "name:li"=>"Egypte", "name:ln"=>"Ejipte", "name:lt"=>"Egiptas", "name:lv"=>"Ēģipte", "name:mg"=>"Ejipta", "name:mk"=>"Египет", "name:ml"=>"ഈജിപ്റ്റ്‌", "name:mn"=>"Египет", "name:mr"=>"इजिप्त", "name:ms"=>"Mesir", "name:na"=>"Egypt", "name:ne"=>"इजिप्ट", "name:nl"=>"Egypte", "name:nn"=>"Egypt", "name:no"=>"Egypt", "name:oc"=>"Egipte", "name:os"=>"Мысыр", "name:pa"=>"Egypt", "name:pl"=>"Egipt", "name:ps"=>"مصر", "name:pt"=>"Egito", "name:qu"=>"Ihiptu", "name:ro"=>"Egipt", "name:ru"=>"Египет", "name:sa"=>"ईजिप्ट", "name:se"=>"Egypta", "name:sh"=>"Egipat", "name:sk"=>"Egypt", "name:sl"=>"Egipt", "name:sm"=>"Aikupito", "name:sq"=>"Egjipti", "name:sr"=>"Египат", "name:ss"=>"IGibhithe", "name:sv"=>"Egypten", "name:sw"=>"Misri", "name:ta"=>"எகிப்து", "name:te"=>"ఈజిప్టు", "name:tg"=>"Миср", "name:th"=>"ประเทศอียิปต์", "name:tl"=>"Ehipto", "name:tr"=>"Mısır", "name:ts"=>"Egypt", "name:tt"=>"Мисыр", "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"=>"Egypt", "name:zh"=>"埃及", "name:ace"=>"Mesir", "name:als"=>"Ägypte", "name:ang"=>"Ǣgypt", "name:arc"=>"ܡܨܪܝܢ", "name:arz"=>"مصر", "name:ast"=>"Exipto", "name:bar"=>"Ägyptn", "name:bcl"=>"Ehipto", "name:bpy"=>"মিশর", "name:ceb"=>"Ehipto", "name:crh"=>"Mısır", "name:diq"=>"Mısır", "name:dsb"=>"Egyptojska", "name:frp"=>"Èg·ipte", "name:fur"=>"Egjit", "name:gan"=>"埃及", "name:hak"=>"Âi-khi̍p", "name:haw"=>"‘Aikupika", "name:hif"=>"Egypt", "name:hsb"=>"Egyptowska", "name:ilo"=>"Ehipto", "name:jbo"=>"misrygu'e", "name:kab"=>"Maṣer", "name:lij"=>"Egitto", "name:lmo"=>"Egit", "name:mdf"=>"Египет", "name:mzn"=>"مەسر", "name:nah"=>"Egipto", "name:nap"=>"Naggitto", "name:nds"=>"Ägypten", "name:new"=>"मिस्र", "name:nov"=>"Egiptia", "name:nrm"=>"Êgypte", "name:pam"=>"Ejiptu", "name:pms"=>"Egit", "name:pnb"=>"مصر", "name:pnt"=>"Αίγυπτος", "name:sah"=>"Эгипет", "name:scn"=>"Eggittu", "name:sco"=>"Egyp", "name:stq"=>"Ägypten", "name:szl"=>"Egipt", "name:tet"=>"Ejitu", "name:tpi"=>"Ijip", "name:vec"=>"Egito", "name:vls"=>"Egypte", "name:war"=>"Ehipto", "name:wuu"=>"埃及", "name:zh_py"=>"Aiji", "name:nds-nl"=>"Egypte", "name:simple"=>"Egypt", "name:zh-yue"=>"埃及", "name:zh_pyt"=>"Āijí", "name:bat-smg"=>"Egėpts", "name:be-x-old"=>"Эгіпет", "official_name"=>"جمهورية مصر العربية", "name:zh-min-nan"=>"Ai-ki̍p", "official_name:af"=>"Arabiese Republiek van Egipte", "official_name:br"=>"Republik arab Egipt", "official_name:ca"=>"República Àrab d'Egipte", "official_name:el"=>"Αραβική Δημοκρατία της Αιγύπτου", "official_name:en"=>"Arab Republic of Egypt", "official_name:et"=>"Egiptuse Araabia Vabariik", "official_name:id"=>"Republik Arab Mesir", "official_name:lb"=>"Arabesch Republik vun Egypten", "official_name:lt"=>"Egipto Arabų Respublika", "official_name:lv"=>"Ēģiptes Arābu Republika", "official_name:pt"=>"República Árabe do Egito", "official_name:sv"=>"Arabrepubliken Egypten", "official_name:vi"=>"Cộng hòa Ả Rập Ai Cập", "name:zh-classical"=>"埃及"      ar      16
+fo     "name"=>"Føroyar/Færøerne", "name:af"=>"Faroëreilande", "name:am"=>"ፋሮ ደሴቶች", "name:ar"=>"جزر فارو", "name:az"=>"Farer adaları", "name:be"=>"Фарэрскія астравы", "name:bg"=>"Фарьорски острови", "name:br"=>"Inizi 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:el"=>"Νήσοι Φερόες", "name:en"=>"Faroe Islands", "name:eo"=>"Ferooj", "name:es"=>"Islas Feroe", "name:et"=>"Fääri saared", "name:eu"=>"Faroe Uharteak", "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:gv"=>"Ellanyn ny Geyrragh", "name:he"=>"איי פארו", "name:hi"=>"फ़रो द्वीप", "name:hr"=>"Føroyar", "name:hu"=>"Feröer", "name:id"=>"Kepulauan Faroe", "name:io"=>"Faero", "name:is"=>"Færeyjar", "name:it"=>"Isole Fær Øer", "name:ja"=>"フェロー諸島", "name:jv"=>"Kapuloan Faroe", "name:ka"=>"ფარერის კუნძულები", "name:kk"=>"Фарер аралдары", "name:kl"=>"Savalimmiut", "name:ko"=>"페로 제도", "name:ku"=>"Giravên Faroe", "name:kw"=>"Ynysow Faroe", "name:la"=>"Insulae Faeroae", "name:li"=>"Faeröer", "name:lt"=>"Farerai", "name:lv"=>"Farēru (Fēru) salas", "name:mk"=>"Фарски Острови", "name:mn"=>"Фарерын Арлууд", "name:mr"=>"फेरो द्वीपसमूह", "name:ms"=>"Kepulauan Faroe", "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:ro"=>"Insulele Feroe", "name:ru"=>"Фарерские острова", "name:se"=>"Fearsullot", "name:sh"=>"Farski Otoci", "name:sk"=>"Faerské ostrovy", "name:sl"=>"Ferski otoki", "name:sq"=>"Ishujt Faroe", "name:sr"=>"Фарска острва", "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:uk"=>"Фарерські острови", "name:vi"=>"Quần đảo Faroe", "name:wo"=>"Duni Faarow", "name:zh"=>"法罗群岛", "alt_name"=>"Faeroe Islands;Faroes;Faeroes", "name:als"=>"Färöer", "name:ang"=>"Faroisca Īega", "name:ast"=>"Islles Feroe", "name:bar"=>"Färöer", "name:bpy"=>"ফারো দ্বীপমালা", "name:ext"=>"Islas Feroes", "name:frp"=>"Iles Fèroè", "name:gle"=>"Na Scigirí", "name:hsb"=>"Färöje", "name:lij"=>"Isoe Farœ", "name:lmo"=>"Faroe", "name:pam"=>"Faroe Islands", "name:pih"=>"Faaro Ailen", "name:pms"=>"Faròe", "name:rmy"=>"Dvipa Faroe", "name:scn"=>"Ìsuli Fær Øer", "name:sco"=>"Faroe Islands", "name:vec"=>"Ixołe Fær Øer", "name:war"=>"Feroe nga Islas", "name:wuu"=>"法罗群岛", "name:zh_py"=>"Faluoqundao", "name:nds-nl"=>"Faeröer", "name:simple"=>"Faroe Islands", "name:zh_pyt"=>"Fǎluóqúndǎo", "name:be-x-old"=>"Фарэрскія выспы", "name:zh-min-nan"=>"Mî-iûⁿ Kûn-tó", "official_name:lv"=>"Fēru salas"        fo      10
+io     "name"=>"British Indian Ocean Territory", "name:af"=>"Britse Indiese Oseaan Gebied", "name:an"=>"Territorio Britanico de l'Ozián Indico", "name:ar"=>"إقليم المحيط الهندي البريطاني", "name:be"=>"Брытанскія Індыйска-акіянскія тэрыторыі", "name:bg"=>"Британска индоокеанска територия", "name:br"=>"Tiriadoù Breizhveuriat Mor Indez", "name:bs"=>"Britanski teritorij Indijskog okeana", "name:ca"=>"Territori Britànic de l'Oceà Índic", "name:cs"=>"Britské indickooceánské území", "name:da"=>"Britiske Indiske Ocean", "name:de"=>"Britisches Territorium im Indischen Ozean", "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:fi"=>"Brittiläinen Intian valtameren alue", "name:fr"=>"Territoire britannique de l'océan Indien", "name:fy"=>"Britske Yndyske-Oseaanterritoarium", "name:ga"=>"Críoch Aigéan Indiach na Breataine", "name:gl"=>"Territorio Británico do Océano Índico", "name:he"=>"הטריטוריה הבריטית באוקיינוס ההודי", "name:hi"=>"ब्रिटिश हिंद महासागर क्षेत्र", "name:hr"=>"Britanski indijskooceanski teritoriji", "name:hu"=>"Brit Indiai-óceáni Terület", "name:id"=>"Teritorial Britania di Samudra Hindia", "name:is"=>"Breska Indlandshafseyjar", "name:it"=>"Territorio britannico dell'oceano Indiano", "name:ja"=>"イギリス領インド洋地域", "name:ka"=>"ბრიტანეთის ინდოეთის ოკეანის ტერიტორია", "name:ko"=>"영국령 인도양 지역", "name:lt"=>"Indijos vandenyno Britų sritis", "name:lv"=>"Indijas okeāna Britu teritorija", "name:mr"=>"ब्रिटीश हिंदी महासागर क्षेत्र", "name:ms"=>"Wilayah Lautan Hindi British", "name:nl"=>"Brits Territorium in de Indische Oceaan", "name:no"=>"Det britiske territoriet i Indiahavet", "name:pl"=>"Brytyjskie Terytorium Oceanu Indyjskiego", "name:pt"=>"Território Britânico do Oceano Índico", "name:ro"=>"Teritoriul Britanic din Oceanul Indian", "name:ru"=>"Британская территория в Индийском океане", "name:sh"=>"Britanski teritorij Indijskog oceana", "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:tr"=>"Britanya Hint Okyanusu Toprakları", "name:uk"=>"Британська територія в Індійському океані", "name:vi"=>"Lãnh thổ Ấn Độ Dương thuộc Anh", "name:zh"=>"英属印度洋领地", "loc_name"=>"Chagos Islands", "name:zh_py"=>"Yingshu Yinduyang Lingdu", "name:zh_pyt"=>"Yīngshǔ Yìndùyáng Lǐngdì", "name:be-x-old"=>"Брытанская тэрыторыя ў Індыйскім акіяне"      en      13
+jo     "name"=>"Jordan / الأُرْدُن", "name:af"=>"Jordanië", "name:an"=>"Chordania", "name:ar"=>"الأردن", "name:az"=>"İordaniya", "name:be"=>"Іарданія", "name:bg"=>"Йордания", "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: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:fr"=>"Jordanie", "name:fy"=>"Jordaanje", "name:ga"=>"An Iordáin", "name:gd"=>"Iòrdan", "name:gl"=>"Xordania", "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:ko"=>"요르단", "name:ks"=>"जार्डन", "name:ku"=>"Urdun", "name:kv"=>"Иордания", "name:kw"=>"Jordan", "name:la"=>"Iordania", "name:lb"=>"Jordanien", "name:li"=>"Jordanië", "name:lt"=>"Jordanija", "name:lv"=>"Jordānija", "name:mk"=>"Јордан", "name:ml"=>"ജോര്‍ദാന്‍", "name:mn"=>"Йордан", "name:mr"=>"जॉर्डन", "name:ms"=>"Jordan", "name:na"=>"Jordan", "name:nl"=>"Jordanië", "name:nn"=>"Jordan", "name:no"=>"Jordan", "name:oc"=>"Jordania", "name:os"=>"Иордани", "name:pl"=>"Jordania", "name:ps"=>"اردن", "name:pt"=>"Jordânia", "name:qu"=>"Hurdanya", "name:ro"=>"Iordania", "name:ru"=>"Иордания", "name:sa"=>"जार्डन", "name:se"=>"Jordánia", "name:sh"=>"Jordan", "name:sk"=>"Jordánsko", "name:sl"=>"Jordanija", "name:sq"=>"Jordania", "name:sr"=>"Јордан", "name:sv"=>"Jordanien", "name:sw"=>"Yordani", "name:ta"=>"ஜோர்தான்", "name:te"=>"జోర్డాన్", "name:th"=>"ประเทศจอร์แดน", "name:tl"=>"Jordan", "name:tr"=>"Ürdün", "name:ug"=>"ئىئوردانىيە", "name:uk"=>"Йорданія", "name:ur"=>"اردن", "name:uz"=>"Iordan", "name:vi"=>"Jordan", "name:vo"=>"Yordän", "name:wo"=>"Jordaani", "name:yi"=>"יארדאניע", "name:zh"=>"约旦", "name:ace"=>"Yordania", "name:als"=>"Jordanien", "name:ang"=>"Jordan", "name:arc"=>"ܝܘܪܕܢܢ", "name:arz"=>"الاردن", "name:ast"=>"Xordania", "name:bcl"=>"Yordanya", "name:bpy"=>"জর্ডান", "name:ceb"=>"Jordan", "name:crh"=>"Urdun", "name:diq"=>"Urdun", "name:dsb"=>"Jordanska", "name:frp"=>"J·ordanie", "name:hak"=>"Yok-tan", "name:haw"=>"Ioredāne", "name:hif"=>"Jordan", "name:hsb"=>"Jordaniska", "name:ilo"=>"Jordan", "name:jbo"=>"jorgu'e", "name:kab"=>"Urdun", "name:lij"=>"Giordannia", "name:lmo"=>"Giurdania", "name:mzn"=>"اوردون", "name:nah"=>"Iordania", "name:nds"=>"Jordanien", "name:nov"=>"Jordan", "name:pam"=>"Jordan", "name:pms"=>"Giordania", "name:pnb"=>"اردن", "name:sah"=>"Иордания", "name:scn"=>"Giurdania", "name:szl"=>"Jordańijo", "name:udm"=>"Иордания", "name:war"=>"Hordanya", "name:wuu"=>"约旦", "name:zh_py"=>"Yuedan", "name:simple"=>"Jordan", "name:zh_pyt"=>"Yuēdàn", "name:bat-smg"=>"Juordanėjė", "name:fiu-vro"=>"Jordaania", "name:be-x-old"=>"Ярданія", "official_name"=>"المملكة الأردنية الهاشمية", "name:zh-min-nan"=>"Iok-tàn", "official_name:br"=>"Rouantelezh hachemit Jordania", "official_name:el"=>"Χασεμιτικό Βασίλειο της Ιορδανίας", "official_name:en"=>"Hashemite Kingdom of Jordan", "official_name:et"=>"Jordaania Hašimiidi Kuningriik", "official_name:gd"=>"Rioghachd Hashemach na Iòrdain", "official_name:id"=>"Kerajaan Hasyimiyah Yordania", "official_name:it"=>"Regno Hascemita di Giordania", "official_name:lb"=>"Haschimitescht Kinnekräich Jordanien", "official_name:lt"=>"Jordanijos Hašimitų Karalystė", "official_name:lv"=>"Jordānijas Hāšimītu Karaliste", "official_name:pl"=>"Jordańskie Królestwo Haszymidzkie", "official_name:sv"=>"Hashemitiska konungariket Jordanien"   ar      17
+jp     "name"=>"日本 (Japan)", "name:af"=>"Japan", "name:am"=>"ጃፓን", "name:an"=>"Chapón", "name:ar"=>"اليابان", "name:as"=>"জাপান", "name:az"=>"Yaponiya", "name:ba"=>"Япония", "name:be"=>"Японія", "name:bg"=>"Япония", "name:bn"=>"জাপান", "name:bo"=>"རི་པིན།", "name:br"=>"Japan", "name:bs"=>"Japan", "name:ca"=>"Japó", "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"=>"Iapan", "name:gl"=>"Xapón - 日本", "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"=>"ᓃᑉᐊᓐ/niipan", "name:ja"=>"日本", "name:jv"=>"Jepang", "name:ka"=>"იაპონია", "name:kk"=>"Жапония", "name:km"=>"ជប៉ុន", "name:kn"=>"ಜಪಾನ್", "name:ko"=>"일본", "name:ks"=>"जापान", "name:ku"=>"Japan", "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"=>"Nipono", "name:mk"=>"Јапонија", "name:ml"=>"ജപ്പാന്‍", "name:mn"=>"Япон", "name:mr"=>"जपान", "name:ms"=>"Jepun", "name:my"=>"ဂျပန်နိုင်ငံ", "name:na"=>"Djapan", "name:ne"=>"जापान", "name:nl"=>"Japan", "name:nn"=>"Japan", "name:no"=>"Japan", "name:nv"=>"Bina'adaałtzózí", "name:oc"=>"Japon", "name:or"=>"ଜାପାନ", "name:os"=>"Япон", "name:pl"=>"Japonia", "name:ps"=>"جاپان", "name:pt"=>"Japão", "name:qu"=>"Nihun", "name:ro"=>"Japonia", "name:ru"=>"Япония", "name:sa"=>"जापान", "name:sc"=>"Giappone", "name:sd"=>"جاپان", "name:se"=>"Japána", "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: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", "name:als"=>"Japan", "name:ang"=>"Iapan", "name:arc"=>"ܝܦܢ", "name:arz"=>"اليابان", "name:ast"=>"Xapón", "name:bar"=>"Japan", "name:bcl"=>"Hapon", "name:bpy"=>"জাপান", "name:bug"=>"ᨍᨛᨄ", "name:bxr"=>"Жибэн", "name:cdo"=>"Nĭk-buōng", "name:ceb"=>"Hapon", "name:chr"=>"ᏣᏆᏂ", "name:crh"=>"Yaponiya", "name:csb"=>"Japòńskô", "name:diq"=>"Japonya", "name:dsb"=>"Japańska", "name:frp"=>"J·apon", "name:gan"=>"日本", "name:hak"=>"Ngi̍t-pún", "name:haw"=>"Iāpana", "name:hif"=>"Japan", "name:hsb"=>"Japanska", "name:ilo"=>"Japon", "name:jbo"=>"pongu'e", "name:lij"=>"Giappon", "name:lmo"=>"Giapun", "name:mdf"=>"Япунмастор", "name:mhr"=>"Японий", "name:mwl"=>"Japon", "name:nah"=>"Xapon", "name:nap"=>"Giappone", "name:nds"=>"Japan", "name:new"=>"जापान", "name:nov"=>"Japan", "name:nrm"=>"Japon", "name:pam"=>"Hapon", "name:pap"=>"Hapon", "name:pms"=>"Giapon", "name:pnb"=>"جاپان", "name:sah"=>"Дьоппуон", "name:scn"=>"Giappuni", "name:sco"=>"Japan", "name:szl"=>"Japůńijo", "name:tpi"=>"Siapan", "name:udm"=>"Япония", "name:vec"=>"Giapòn", "name:war"=>"Hapon", "name:wuu"=>"日本", "name:xal"=>"Японь", "name:ja_rm"=>"Nippon", "name:zh_py"=>"Riben", "name:nds-nl"=>"Japan", "name:simple"=>"Japan", "name:zh-yue"=>"日本", "name:zh_pyt"=>"Rìběn", "name:bat-smg"=>"Japuonėjė", "name:cbk-zam"=>"Japón", "name:be-x-old"=>"Японія", "name:zh-min-nan"=>"Ji̍t-pún", "official_name:ca"=>"Estat del Japó", "official_name:pt"=>"Império do Japão", "name:zh-classical"=>"日本"  ja      11
+tn     "name"=>"تونس", "name:af"=>"Tunisië", "name:am"=>"ቱኒዚያ", "name:an"=>"Tunizia", "name:ar"=>"تونس", "name:az"=>"Tunis", "name:be"=>"Туніс", "name:bg"=>"Тунис", "name:bm"=>"Tunizi", "name:bn"=>"তিউনিসিয়া", "name:br"=>"Tunizia", "name:bs"=>"Tunis", "name:ca"=>"Tunísia", "name:cs"=>"Tunisko", "name:cv"=>"Тунис", "name:cy"=>"Tunisia", "name:da"=>"Tunesien", "name:de"=>"Tunesien", "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:gv"=>"Yn Tooneesh", "name:he"=>"טוניס", "name:hi"=>"टुनिशिया", "name:hr"=>"Tunis", "name:ht"=>"Tinizi", "name:hu"=>"Tunézia", "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:la"=>"Tunesia", "name:lb"=>"Tunesien", "name:li"=>"Tunesië", "name:ln"=>"Tunisia", "name:lt"=>"Tunisas", "name:lv"=>"Tunisija", "name:mg"=>"Tonizia", "name:mk"=>"Тунис", "name:ml"=>"ടുണീഷ്യ", "name:mn"=>"Тунис", "name:mr"=>"ट्युनिसिया", "name:ms"=>"Tunisia", "name:mt"=>"Tuneżija", "name:nl"=>"Tunesië", "name:nn"=>"Tunisia", "name:no"=>"Tunisia", "name:oc"=>"Tunisia", "name:pl"=>"Tunezja", "name:pt"=>"Tunísia", "name:qu"=>"Tunisya", "name:rm"=>"Tunesia", "name:ro"=>"Tunisia", "name:ru"=>"Тунис", "name:sa"=>"टुनिशिया", "name:sc"=>"Tunisia", "name:se"=>"Tunisia", "name:sh"=>"Tunis", "name:sk"=>"Tunisko", "name:sl"=>"Tunizija", "name:so"=>"Tunisie", "name:sq"=>"Tunizia", "name:sr"=>"Тунис", "name:sv"=>"Tunisien", "name:sw"=>"Tunisia", "name:ta"=>"துனீசியா", "name:te"=>"ట్యునీషియా", "name:tg"=>"Тунис", "name:th"=>"ประเทศตูนิเซีย", "name:ti"=>"ቱኒዢያ", "name:tl"=>"Tunisia", "name:tr"=>"Tunus", "name:ts"=>"Tunisia", "name:ug"=>"تۇنىس", "name:uk"=>"Туніс", "name:ur"=>"تیونس", "name:uz"=>"Tunis", "name:vi"=>"Tunisia", "name:vo"=>"Tunisän", "name:wa"=>"Tunizeye", "name:wo"=>"Tiniisi", "name:yo"=>"Tunisia", "name:zh"=>"突尼西亚", "name:ace"=>"Tunisia", "name:als"=>"Tunesien", "name:ang"=>"Tunisia", "name:arc"=>"ܬܘܢܣ", "name:arz"=>"تونس", "name:ast"=>"Túnez", "name:bcl"=>"Tunisya", "name:bpy"=>"তিউনিসিয়া", "name:ceb"=>"Tunisia", "name:crh"=>"Tunis", "name:diq"=>"Tunıs", "name:frp"=>"Tunisie", "name:haw"=>"Tunisia", "name:hif"=>"Tunisia", "name:hsb"=>"Tuneziska", "name:ilo"=>"Tunisia", "name:kab"=>"Tunes", "name:lad"=>"Tunesia", "name:lij"=>"Tunixia", "name:lmo"=>"Tünisia", "name:mzn"=>"تونس", "name:nah"=>"Tunez", "name:nds"=>"Tunesien", "name:nov"=>"Tunisia", "name:pam"=>"Tunisia", "name:pap"=>"Tunesia", "name:pms"=>"Tunisìa", "name:pnb"=>"ٹیونس", "name:sah"=>"Тунис", "name:scn"=>"Tunisìa", "name:szl"=>"Tůnezyjo", "name:vec"=>"Tunixia", "name:war"=>"Tunisia", "name:wuu"=>"突尼斯", "name:zh_py"=>"Tunixiya", "name:simple"=>"Tunisia", "name:zh_pyt"=>"Tūníxīyà", "name:be-x-old"=>"Туніс", "official_name"=>"الجمهورية التونسية", "name:zh-min-nan"=>"Tunisia", "official_name:br"=>"Republik Tunizian", "official_name:el"=>"Δημοκρατία της Τυνησίας", "official_name:en"=>"Tunisian Republic", "official_name:et"=>"Tuneesia Vabariik", "official_name:id"=>"Republik Tunisia", "official_name:ja"=>"チュニジア共和国", "official_name:lb"=>"Tunesesch Republik", "official_name:lt"=>"Tuniso Respublika", "official_name:pt"=>"República da Tunísia", "official_name:sv"=>"Republiken Tunisien", "official_name:vi"=>"Cộng hòa Tunisia" ar      18
+tw     "name"=>"Taiwan", "name:ar"=>"تايوان", "name:be"=>"Тайвань", "name:br"=>"Taiwan", "name:da"=>"Taiwan", "name:en"=>"Taiwan", "name:eo"=>"Tajvano", "name:fa"=>"تایوان", "name:fi"=>"Taiwan", "name:fr"=>"Taïwan", "name:ga"=>"An Téaváin", "name:gd"=>"Tai-Bhàn", "name:he"=>"טייואן", "name:hr"=>"Tajvan", "name:hu"=>"Tajvan", "name:is"=>"Lýðveldið Kína", "name:it"=>"Taiwan", "name:ja"=>"台湾", "name:la"=>"Taivania", "name:lt"=>"Taivanas", "name:mn"=>"Тайвань", "name:pl"=>"Tajwan", "name:pt"=>"Taiwan; Formosa", "name:ru"=>"Тайвань", "name:sl"=>"Tajvan", "name:sv"=>"Taiwan", "name:th"=>"ไต้หวัน", "name:tr"=>"Tayvan", "name:uk"=>"Тайвань", "name:vi"=>"Đài Loan", "name:zh"=>"台湾", "name:zh_py"=>"Taiwan", "name:zh_pyt"=>"Táiwān", "name:zh-Hans"=>"台湾", "name:zh-Hant"=>"台灣", "official_name:et"=>"Hiina Vabariik", "official_name:gd"=>"Poblachd na Sìne", "official_name:id"=>"Republik Cina", "official_name:it"=>"Repubblica di Cina", "official_name:la"=>"Res publica Sinarum", "official_name:lb"=>"Republik China", "official_name:lt"=>"Taivanas (Kinijos provincija)", "official_name:pl"=>"Republika Chińska", "official_name:pt"=>"República da China", "official_name:vi"=>"Trung Hoa Dân Quốc"    zh      25
 nz     "name"=>"New Zealand", "name:af"=>"Nieu-Seeland", "name:ar"=>"نيوزيلندا", "name:be"=>"Новая Зеландыя", "name:br"=>"Zeland Nevez", "name:ca"=>"Nova Zelanda", "name:cy"=>"Seland Newydd", "name:de"=>"Neuseeland", "name:el"=>"Νέα Ζηλανδία", "name:en"=>"New Zealand", "name:eo"=>"Nov-Zelando", "name:es"=>"Nueva Zelanda", "name:et"=>"Uus-Meremaa", "name:fa"=>"نیوزیلند", "name:fi"=>"Uusi-Seelanti", "name:fr"=>"Nouvelle-Zélande", "name:fy"=>"Nij-Seelân", "name:ga"=>"An Nua-Shéalainn", "name:gd"=>"Sealainn Nuadh", "name:he"=>"ניו זילנד", "name:hr"=>"Novi Zeland", "name:hu"=>"Új-Zéland", "name:hy"=>"Նոր Զելանդիա", "name:id"=>"Selandia Baru", "name:is"=>"Nýja-Sjáland", "name:it"=>"Nuova Zelanda", "name:ja"=>"ニュージーランド", "name:la"=>"Nova Zelandia", "name:lb"=>"Neiséiland", "name:li"=>"Nui-Zieland", "name:lt"=>"Naujoji Zelandija", "name:lv"=>"Jaunzēlande", "name:mi"=>"Aotearoa", "name:mn"=>"Шинэ Зеланд", "name:nl"=>"Nieuw-Zeeland", "name:pl"=>"Nowa Zelandia", "name:ru"=>"Новая Зеландия", "name:sl"=>"Nova Zelandija", "name:sv"=>"Nya Zeeland", "name:th"=>"ประเทศนิวซีแลนด์", "name:tr"=>"Yeni Zelanda", "name:uk"=>"Нова Зеландія", "name:vi"=>"Tân Tây Lan", "name:zh"=>"新西兰"     \N      27
 ht     "name"=>"Haiti", "name:af"=>"Haïti", "name:ar"=>"هايتي", "name:be"=>"Гаіці", "name:br"=>"Haiti", "name:ca"=>"Haití", "name:da"=>"Haiti", "name:el"=>"Αϊτή", "name:eo"=>"Haitio", "name:es"=>"Haití", "name:fa"=>"هائیتی", "name:fi"=>"Haiti", "name:fr"=>"Haïti", "name:fy"=>"Haïty", "name:ga"=>"Háití", "name:he"=>"האיטי", "name:hu"=>"Haiti", "name:is"=>"Haítí", "name:it"=>"Haiti", "name:ja"=>"ハイチ", "name:la"=>"Haitia", "name:li"=>"Haïti", "name:lt"=>"Haitis", "name:lv"=>"Haiti", "name:mn"=>"Гайти", "name:nl"=>"Haïti", "name:pl"=>"Haiti", "name:ru"=>"Гаити", "name:sv"=>"Haiti", "name:th"=>"ประเทศเฮติ", "name:uk"=>"Гаїті", "name:zh"=>"海地", "official_name"=>"Repiblik Ayiti", "official_name:be"=>"Рэспубліка Гаіці", "official_name:br"=>"Republik Haiti", "official_name:el"=>"Δημοκρατία της Αϊτής", "official_name:en"=>"Republic of Haiti", "official_name:fr"=>"République d'Haïti", "official_name:id"=>"Republik Haiti", "official_name:it"=>"Repubblica di Haiti", "official_name:ja"=>"ハイチ共和国", "official_name:lt"=>"Haičio Respublika", "official_name:lv"=>"Haiti Republika", "official_name:pl"=>"Republika Haiti", "official_name:sv"=>"Republiken Haiti"   \N      29
 af     "name"=>"Afghanistan", "name:ar"=>"أفغانستان", "name:az"=>"Əfqanıstan", "name:be"=>"Аўганістан", "name:bg"=>"Афганистан", "name:br"=>"Afghanistan", "name:ca"=>"Afganistan", "name:cs"=>"Afghánistán", "name:da"=>"Afghanistan", "name:el"=>"Αφγανιστάν", "name:en"=>"Afghanistan", "name:eo"=>"Afganio", "name:es"=>"Afganistán", "name:et"=>"Afganistan", "name:fa"=>"افغانستان", "name:fi"=>"Afganistan", "name:fr"=>"Afghanistan", "name:fy"=>"Afganistan", "name:ga"=>"An Afganastáin", "name:gd"=>"Afganastan", "name:he"=>"אפגניסטן", "name:hr"=>"Afganistan", "name:hu"=>"Afganisztán", "name:hy"=>"Աֆղանստան", "name:id"=>"Afganistan", "name:is"=>"Afganistan", "name:it"=>"Afghanistan", "name:ja"=>"アフガニスタン", "name:ka"=>"ავღანეთი", "name:ko"=>"아프가니스탄", "name:la"=>"Afgania", "name:li"=>"Afganistan", "name:lt"=>"Afganistanas", "name:lv"=>"Afganistāna", "name:mn"=>"Афганистан", "name:pl"=>"Afganistan", "name:pt"=>"Afeganistão", "name:ru"=>"Афганистан", "name:sl"=>"Afganistan", "name:sv"=>"Afghanistan", "name:th"=>"ประเทศอัฟกานิสถาน", "name:tr"=>"Afganistan", "name:uk"=>"Афганістан", "name:zh"=>"阿富汗", "name:haw"=>"‘Apekanikana", "name:zh_py"=>"Afuhan", "name:zh_pyt"=>"Āfùhàn", "name:cs_ascii"=>"Afganistan", "official_name:el"=>"Ισλαμική Δημοκρατία του Αφγανιστάν", "official_name:et"=>"Afganistani Islamivabariik", "official_name:fi"=>"Afganistanin islamilainen tasavalta", "official_name:fr"=>"République islamique d'Afghanistan", "official_name:id"=>"Republik Islam Afganistan", "official_name:it"=>"Repubblica Islamica dell'Afghanistan", "official_name:ja"=>"アフガニスタン・イスラム共和国", "official_name:lt"=>"Afganistano Islamo Respublika", "official_name:pl"=>"Islamska Republika Afganistanu", "official_name:pt"=>"República Islâmica do Afeganistão", "official_name:sv"=>"Islamska republiken Afghanistan", "official_name:vi"=>"Cộng hòa Hồi giáo Afghanistan"     \N      30
 es     "name"=>"España", "name:af"=>"Spanje", "name:ar"=>"إسبانيا", "name:be"=>"Іспанія", "name:br"=>"Spagn", "name:ca"=>"Espanya", "name:cy"=>"Sbaen", "name:da"=>"Spanien", "name:de"=>"Spanien", "name:el"=>"Ισπανία", "name:en"=>"Spain", "name:eo"=>"Hispanio", "name:es"=>"España", "name:et"=>"Hispaania", "name:eu"=>"Espainia", "name:fa"=>"اسپانیا", "name:fi"=>"Espanja", "name:fr"=>"Espagne", "name:fy"=>"Spanje", "name:ga"=>"An Spáinn", "name:gd"=>"An Spàinn", "name:he"=>"ספרד", "name:hr"=>"Španjolska", "name:hu"=>"Spanyolország", "name:hy"=>"Իսպանիա", "name:id"=>"Spanyol", "name:is"=>"Spánn", "name:it"=>"Spagna", "name:ja"=>"スペイン", "name:la"=>"Hispania", "name:lb"=>"Spuenien", "name:lt"=>"Ispanija", "name:lv"=>"Spānija", "name:mn"=>"Испани", "name:nb"=>"Spania", "name:nl"=>"Spanje", "name:nn"=>"Spania", "name:no"=>"Spania", "name:pl"=>"Hiszpania", "name:pt"=>"Espanha", "name:ru"=>"Испания", "name:sk"=>"Španielsko", "name:sl"=>"Španija", "name:sv"=>"Spanien", "name:th"=>"ประเทศสเปน", "name:tl"=>"Espanya", "name:tr"=>"İspanya", "name:uk"=>"Іспанія", "name:vi"=>"Tây Ban Nha", "name:zh"=>"西班牙", "name:haw"=>"Sepania", "name:zh_py"=>"Xibanya", "name:zh_pyt"=>"Xībānyá", "official_name"=>"Reino de España", "official_name:be"=>"Каралеўства Іспанія", "official_name:el"=>"Βασίλειο της Ισπανίας", "official_name:en"=>"Kingdom of Spain", "official_name:fr"=>"Royaume d’Espagne", "official_name:gd"=>"Rìoghachd na Spàinne", "official_name:id"=>"Kerajaan Spanyol", "official_name:lb"=>"Kinneksräich Spuenien", "official_name:lt"=>"Ispanijos Karalystė", "official_name:pl"=>"Królestwo Hiszpanii", "official_name:pt"=>"Reino de Espanha", "official_name:sk"=>"Španielske kráľovstvo", "official_name:sv"=>"Konungariket Spanien", "official_name:vi"=>"Vương quốc Tây Ban Nha"       \N      31
 th     "name"=>"ประเทศไทย", "name:af"=>"Thailand", "name:an"=>"Tailandia", "name:ar"=>"تايلاند", "name:as"=>"থাইলেণ্ড", "name:az"=>"Tayland Krallığı", "name:be"=>"Тайланд", "name:bg"=>"Тайланд", "name:bn"=>"থাইল্যান্ড", "name:bo"=>"ཐའེ་གོ", "name:br"=>"Thailand", "name:bs"=>"Tajland", "name:ca"=>"Tailàndia", "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"=>"Tailandia", "name:fa"=>"تایلند", "name:fi"=>"Thaimaa", "name:fr"=>"Thaïlande", "name:fy"=>"Tailân", "name:ga"=>"An Téalainn", "name:gd"=>"Tài-lann", "name:gl"=>"Tailandia", "name:gu"=>"થાઇલેન્ડ", "name:gv"=>"Yn Çheer Thai", "name:he"=>"תאילנד", "name:hi"=>"थाईलैंड", "name:hr"=>"Tajland", "name:ht"=>"Tayilann", "name:hu"=>"Thaiföld", "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:kk"=>"Таиланд", "name:km"=>"ថៃ", "name:kn"=>"ಥೈಲ್ಯಾಂಡ್", "name:ko"=>"타이", "name:ks"=>"थाइलैंड", "name:ku"=>"Tayland", "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"=>"Thaïlande", "name:mk"=>"Тајланд", "name:ml"=>"തായ്‌ലാന്റ്", "name:mn"=>"Тайланд", "name:mr"=>"थायलंड", "name:ms"=>"Thailand", "name:my"=>"ထိုင်းနိုင်ငံ", "name:ne"=>"थाइलेडं", "name:nl"=>"Thailand", "name:nn"=>"Thailand", "name:no"=>"Thailand", "name:oc"=>"Tailàndia", "name:os"=>"Таиланд", "name:pl"=>"Tajlandia", "name:ps"=>"تايلېنډ", "name:pt"=>"Tailândia", "name:qu"=>"Thaysuyu", "name:ro"=>"Thailanda", "name:ru"=>"Таиланд", "name:sa"=>"थाइलैंड", "name:se"=>"Thaieana", "name:sh"=>"Tajland", "name:sk"=>"Thajsko", "name:sl"=>"Tajska", "name:sq"=>"Tailanda", "name:sr"=>"Тајланд", "name:su"=>"Thailand", "name:sv"=>"Thailand", "name:sw"=>"Uthai", "name:ta"=>"தாய்லாந்து", "name:te"=>"థాయిలాండ్", "name:tg"=>"Таиланд", "name:th"=>"ประเทศไทย", "name:tk"=>"Taýland", "name:tl"=>"Taylandiya", "name:tr"=>"Tayland", "name:ug"=>"تايلاند", "name:uk"=>"Таїланд", "name:ur"=>"تھائی لینڈ", "name:vi"=>"Thái Lan", "name:vo"=>"Tayän", "name:wo"=>"Taaylaand", "name:wu"=>"泰国", "name:yo"=>"Thailandi", "name:za"=>"Daigoz", "name:zh"=>"泰国", "name:ace"=>"Muangthai", "name:als"=>"Thailand", "name:arz"=>"تايلاندا", "name:ast"=>"Tailandia", "name:bcl"=>"Tailandya", "name:bpy"=>"টাইলান্ডিয়া", "name:ceb"=>"Thailand", "name:crh"=>"Tayland", "name:diq"=>"Tayland", "name:frp"=>"Tayilande", "name:gan"=>"泰國", "name:hak"=>"Thai-koet", "name:haw"=>"Tailani", "name:hif"=>"Thailand", "name:hsb"=>"Thailand", "name:ilo"=>"Thailand", "name:lij"=>"Thailandia", "name:lmo"=>"Thailandia", "name:mhr"=>"Таиланд", "name:nah"=>"Taitlālpan", "name:nds"=>"Thailand", "name:nov"=>"Tailande", "name:pam"=>"Thailand", "name:pap"=>"Thailand", "name:pih"=>"Thailand", "name:pms"=>"Thailandia", "name:pnb"=>"تھائی لینڈ", "name:sah"=>"Тайлаан", "name:scn"=>"Thailandia", "name:stq"=>"Thailound", "name:szl"=>"Tajlandyjo", "name:udm"=>"Таиланд", "name:vec"=>"Thailandia", "name:war"=>"Thailand", "name:zea"=>"Thailand", "name:nds-nl"=>"Thailaand", "name:zh-yue"=>"泰國", "name:bat-smg"=>"Tailands", "name:fiu-vro"=>"Tai", "name:map-bms"=>"Thailand", "name:be-x-old"=>"Тайлянд", "name:zh-min-nan"=>"Thài-kok", "official_name:af"=>"Koninkryk van Thailand", "official_name:el"=>"Βασίλειο της Ταϊλάνδης", "official_name:et"=>"Tai Kuningriik", "official_name:id"=>"Kerajaan Thailand", "official_name:it"=>"Regno di Thailandia", "official_name:lb"=>"Kinnekräich Thailand", "official_name:lt"=>"Tailando Karalystė", "official_name:pl"=>"Królestwo Tajlandii", "official_name:pt"=>"Reino da Tailândia", "official_name:sv"=>"Konungariket Thailand", "official_name:th"=>"ราชอาณาจักรไทย", "name:zh-classical"=>"泰國"   \N      32
-am     "name"=>"Armenia", "name:af"=>"Armenië", "name:ar"=>"أرمينيا", "name:az"=>"Ermənistan", "name:be"=>"Арменія", "name:br"=>"Armenia", "name:ca"=>"Armènia", "name:da"=>"Armenien", "name:de"=>"Armenien", "name:el"=>"Αρμενία", "name:en"=>"Armenia", "name:eo"=>"Armenio", "name:fa"=>"ارمنستان", "name:fi"=>"Armenia", "name:fr"=>"Arménie", "name:fy"=>"Armeenje", "name:ga"=>"An Airméin", "name:gd"=>"Airmeinia", "name:he"=>"ארמניה", "name:hu"=>"Örményország", "name:hy"=>"Հայաստան", "name:is"=>"Armenía", "name:it"=>"Armenia", "name:ja"=>"アルメニア", "name:lb"=>"Armenien", "name:li"=>"Armenië", "name:lt"=>"Armėnija", "name:lv"=>"Armēnija", "name:mn"=>"Армен", "name:nl"=>"Armenië", "name:pl"=>"Armenia", "name:pt"=>"Armênia", "name:ru"=>"Армения", "name:sl"=>"Armenija", "name:sv"=>"Armenien", "name:th"=>"ประเทศอาร์เมเนีย", "name:tr"=>"Ermenistan", "name:uk"=>"Вірменія", "name:zh"=>"亚美尼亚", "name:haw"=>"‘Āmēnia", "name:zh_py"=>"Yameiniya", "name:zh_pyt"=>"Yàměiníyà", "official_name"=>"Republic of Armenia", "official_name:el"=>"Δημοκρατία της Αρμενίας", "official_name:fi"=>"Armenian tasavalta", "official_name:fr"=>"République d'Arménie", "official_name:id"=>"Republik Armenia", "official_name:it"=>"Repubblica di Armenia", "official_name:lt"=>"Armėnijos Respublika", "official_name:lv"=>"Armēnijas Republika", "official_name:pl"=>"Republika Armenii", "official_name:sv"=>"Republiken Armenien", "official_name:vi"=>"Cộng hoà Armenia" \N      33
-cu     "name"=>"Cuba", "name:af"=>"Kuba", "name:ar"=>"كوبا", "name:be"=>"Куба", "name:br"=>"Kuba", "name:de"=>"Kuba", "name:el"=>"Κούβα", "name:en"=>"Cuba", "name:eo"=>"Kubo", "name:et"=>"Kuuba", "name:eu"=>"Kuba", "name:fa"=>"کوبا", "name:fi"=>"Kuuba", "name:fr"=>"Cuba", "name:fy"=>"Kuba", "name:ga"=>"Cúba", "name:gd"=>"Cùba", "name:he"=>"קובה", "name:hr"=>"Kuba", "name:hu"=>"Kuba", "name:hy"=>"Կուբա", "name:id"=>"Kuba", "name:is"=>"Kúba", "name:it"=>"Cuba", "name:ja"=>"キューバ", "name:lb"=>"Kuba", "name:lt"=>"Kuba", "name:lv"=>"Kuba", "name:mn"=>"Куба", "name:pl"=>"Kuba", "name:ru"=>"Куба", "name:sl"=>"Kuba", "name:sv"=>"Kuba", "name:th"=>"ประเทศคิวบา", "name:tr"=>"Küba", "name:uk"=>"Куба", "name:zh"=>"古巴", "official_name"=>"República de Cuba", "official_name:be"=>"Рэспубліка Куба", "official_name:el"=>"Δημοκρατία της Κούβας", "official_name:en"=>"Republic of Cuba", "official_name:et"=>"Kuuba Vabariik", "official_name:gd"=>"Poblachd Chùba", "official_name:id"=>"Republik Kuba", "official_name:it"=>"Repubblica di Cuba", "official_name:lb"=>"Republik Kuba", "official_name:lt"=>"Kubos Respublika", "official_name:lv"=>"Kubas Republika", "official_name:pl"=>"Republika Kuby", "official_name:sv"=>"Republiken Kuba", "official_name:vi"=>"Cộng hòa Cuba"        \N      42
-pt     "name"=>"Portugal", "name:ar"=>"البرتغال", "name:be"=>"Партугалія", "name:br"=>"Portugal", "name:cy"=>"Portiwgal", "name:el"=>"Πορτογαλία", "name:en"=>"Portugal", "name:eo"=>"Portugalio", "name:fa"=>"پرتغال", "name:fi"=>"Portugali", "name:fr"=>"Portugal", "name:fy"=>"Portegal", "name:ga"=>"An Phortaingéil", "name:gd"=>"A' Phortagail", "name:he"=>"פורטוגל", "name:hu"=>"Portugália", "name:hy"=>"Պորտուգալիա", "name:is"=>"Portúgal", "name:it"=>"Portogallo", "name:ja"=>"ポルトガル", "name:la"=>"Lusitania", "name:lt"=>"Portugalija", "name:lv"=>"Portugāle", "name:mn"=>"Португал", "name:pl"=>"Portugalia", "name:ru"=>"Португалия", "name:sk"=>"Portugalsko", "name:sl"=>"Portugalska", "name:sv"=>"Portugal", "name:th"=>"ประเทศโปรตุเกส", "name:tr"=>"Portekiz", "name:uk"=>"Португалія", "name:vi"=>"Bồ Đào Nha", "name:zh"=>"葡萄牙", "name:haw"=>"Potugala", "name:zh_py"=>"Putaoya", "name:zh_pyt"=>"Pútáoyá", "official_name"=>"República Portuguesa", "official_name:be"=>"Рэспубліка Партугалія", "official_name:br"=>"Republik Portugal", "official_name:el"=>"Πορτογαλική Δημοκρατία", "official_name:en"=>"Portuguese Republic", "official_name:es"=>"República Portuguesa", "official_name:fr"=>"République portugaise", "official_name:id"=>"Republik Portugal", "official_name:lb"=>"Portugiesesch Republik", "official_name:lt"=>"Portugalijos Respublika", "official_name:pl"=>"Republika Portugalska", "official_name:pt"=>"República Portuguesa", "official_name:sk"=>"Portugalská republika", "official_name:sv"=>"Republiken Portugal", "official_name:vi"=>"Cộng hòa Bồ Đào Nha", "official_name:mwl"=>"República Pertuesa"        \N      34
-ad     "name"=>"Andorra", "name:ar"=>"أندورا", "name:be"=>"Андора", "name:bg"=>"Андора", "name:br"=>"Andorra", "name:ca"=>"Andorra", "name:el"=>"Ανδόρρα", "name:eo"=>"Andoro", "name:fa"=>"آندورا", "name:fi"=>"Andorra", "name:fr"=>"Andorre", "name:ga"=>"Andóra", "name:he"=>"אנדורה", "name:hr"=>"Andora", "name:hu"=>"Andorra", "name:hy"=>"Անդորրա", "name:is"=>"Andorra", "name:it"=>"Andorra", "name:ja"=>"アンドラ", "name:ka"=>"ანდორა", "name:ko"=>"안도라", "name:lt"=>"Andora", "name:lv"=>"Andora", "name:mn"=>"Андорра", "name:oc"=>"Andòrra", "name:pl"=>"Andora", "name:pt"=>"Andorra", "name:ru"=>"Андорра", "name:sk"=>"Andorra", "name:sl"=>"Andora", "name:sv"=>"Andorra", "name:th"=>"ประเทศอันดอร์รา", "name:uk"=>"Андора", "name:zh"=>"安道尔", "name:haw"=>"‘Anakola", "name:sco"=>"Andorrae", "name:zh_py"=>"Andaoer", "name:zh_pyt"=>"Āndàoěr", "official_name:el"=>"Πριγκηπάτο της Ανδόρρας", "official_name:fi"=>"Andorran ruhtinaskunta", "official_name:fr"=>"Principauté d'Andorre", "official_name:id"=>"Kepangeranan Andorra", "official_name:ja"=>"アンドラ公国", "official_name:la"=>"Principatus Andorrae", "official_name:lt"=>"Andoros Kunigaikštystė", "official_name:lv"=>"Andoras Firstiste", "official_name:pt"=>"Principado de Andorra", "official_name:sk"=>"Andorrské kniežatstvo", "official_name:sv"=>"Furstendömet Andorra", "official_name:vi"=>"Công quốc Andorra"  \N      35
-si     "name"=>"Slovenija", "name:af"=>"Slowenië", "name:ar"=>"سلوفينيا", "name:be"=>"Славенія", "name:br"=>"Slovenia", "name:ca"=>"Eslovènia", "name:cs"=>"Slovinsko", "name:cy"=>"Slofenia", "name:da"=>"Slovenien", "name:de"=>"Slowenien", "name:ee"=>"Sloveenia", "name:el"=>"Σλοβενία", "name:en"=>"Slovenia", "name:eo"=>"Slovenio", "name:es"=>"Eslovenia", "name:et"=>"Sloveenia", "name:fa"=>"اسلوونی", "name:fi"=>"Slovenia", "name:fr"=>"Slovénie", "name:fy"=>"Sloveenje", "name:ga"=>"An tSlóivéin", "name:gd"=>"Sloibhìnia", "name:he"=>"סלובניה", "name:hu"=>"Szlovénia", "name:id"=>"Slovenia", "name:is"=>"Slóvenía", "name:it"=>"Slovenia", "name:la"=>"Slovenia", "name:lb"=>"Slowenien", "name:li"=>"Slovenië", "name:lt"=>"Slovėnija", "name:mn"=>"Словени", "name:ne"=>"स्लोभेनिया", "name:nl"=>"Slovenië", "name:pl"=>"Słowenia", "name:ps"=>"سلووېنيا", "name:pt"=>"Eslovênia", "name:ru"=>"Словения", "name:sk"=>"Slovinsko", "name:sl"=>"Slovenija", "name:sv"=>"Slovenien", "name:th"=>"ประเทศสโลวีเนีย", "name:tr"=>"Slovenya", "name:uk"=>"Словенія", "name:vi"=>"Slovenia", "name:zh"=>"斯洛文尼亚", "name:haw"=>"Solowenia", "name:zh_py"=>"Siluowenniya", "name:zh_pyt"=>"Sīluòwénníyà", "official_name:el"=>"Σλοβενική Δημοκρατία", "official_name:et"=>"Sloveenia Vabariik", "official_name:id"=>"Republik Slovenia", "official_name:lb"=>"Republik Slowenien", "official_name:lt"=>"Slovėnijos Respublika", "official_name:pt"=>"República da Eslovênia", "official_name:sk"=>"Slovinská republika", "official_name:sv"=>"Republiken Slovenien", "official_name:vi"=>"Cộng hòa Slovenia"  \N      36
-hn     "name"=>"Honduras", "name:ar"=>"هندوراس", "name:be"=>"Гандурас", "name:br"=>"Honduras", "name:ca"=>"Hondures", "name:da"=>"Honduras", "name:el"=>"Ονδούρα", "name:en"=>"Honduras", "name:eo"=>"Honduro", "name:fa"=>"هندوراس", "name:fi"=>"Honduras", "name:fr"=>"Honduras", "name:fy"=>"Hondueras", "name:ga"=>"Hondúras", "name:gd"=>"Hondùras", "name:he"=>"הונדורס", "name:hu"=>"Honduras", "name:is"=>"Hondúras", "name:it"=>"Honduras", "name:ja"=>"ホンジュラス", "name:la"=>"Honduria", "name:lt"=>"Hondūras", "name:lv"=>"Hondurasa", "name:mn"=>"Гондурас", "name:pl"=>"Honduras", "name:ru"=>"Гондурас", "name:sv"=>"Honduras", "name:th"=>"ประเทศฮอนดูรัส", "name:uk"=>"Гондурас", "name:zh"=>"洪都拉斯", "official_name"=>"República de Honduras", "official_name:be"=>"Рэспубліка Гандурас", "official_name:el"=>"Δημοκρατία της Ονδούρας", "official_name:id"=>"Republik Honduras", "official_name:lt"=>"Hondūro Respublika", "official_name:lv"=>"Hondurasas Republika", "official_name:pl"=>"Republika Hondurasu", "official_name:sv"=>"Republiken Honduras", "official_name:vi"=>"Cộng hoà Honduras"        \N      56
-do     "name"=>"República Dominicana", "name:af"=>"Dominikaanse Republiek", "name:ar"=>"الجمهورية الدومينيكية", "name:br"=>"Republik Dominikan", "name:cy"=>"Gweriniaeth Dominica", "name:da"=>"Dominikanske Republik", "name:de"=>"Dominikanische Republik", "name:do"=>"República Dominicána", "name:el"=>"Δομινικανή Δημοκρατία", "name:en"=>"Dominican Republic", "name:eo"=>"Domingo", "name:et"=>"Dominikaani Vabariik", "name:fa"=>"جمهوری دومینیکن", "name:fi"=>"Dominikaaninen tasavalta", "name:fr"=>"République Dominicaine", "name:fy"=>"de Dominikaanske Republyk", "name:ga"=>"An Phoblacht Dhoiminiceach", "name:gd"=>"Poblachd Dhoiminicia", "name:he"=>"דומיניק", "name:hr"=>"Dominikanska Republika", "name:hu"=>"Dominikai Köztársaság", "name:id"=>"Republik Dominika", "name:is"=>"Dóminíska lýðveldið", "name:it"=>"Repubblica Dominicana", "name:la"=>"Respublica Dominicana", "name:lb"=>"Dominikanesch Republik", "name:li"=>"Dominicaanse Rippebliek", "name:lt"=>"Dominikos Respublika", "name:lv"=>"Dominikānas Republika", "name:mn"=>"Доминиканы Бүгд Найрамдах Улс", "name:nl"=>"Dominicaanse Republiek", "name:pl"=>"Dominikana", "name:ru"=>"Доминиканская Республика", "name:sl"=>"Dominikanska republika", "name:sv"=>"Dominikanska republiken", "name:th"=>"สาธารณรัฐโดมินิกัน", "name:tr"=>"Dominik Cumhuriyeti", "name:uk"=>"Домініканська Республіка", "name:vi"=>"Cộng hòa Dominicana", "name:zh"=>"多明尼加共和國", "official_name:pl"=>"Republika Dominikańska"     \N      37
-ky     "name"=>"Cayman Islands", "name:af"=>"Kaaimanseilande", "name:ar"=>"جزر الكايمان", "name:be"=>"Кайманавы астравы", "name:br"=>"Inizi Cayman", "name:ca"=>"Illes Caiman", "name:cy"=>"Ynysoedd Cayman", "name:da"=>"Caymanøerne", "name:de"=>"Kaimaninseln", "name:en"=>"Cayman Islands", "name:eo"=>"Kajmaninsuloj", "name:es"=>"Islas Caimán", "name:et"=>"Kaimanisaared", "name:fa"=>"جزایر کایمان", "name:fi"=>"Caymansaaret", "name:fr"=>"Îles Caïmans", "name:fy"=>"de Kaaimaneilannen", "name:ga"=>"Oileáin Cayman", "name:he"=>"איי קיימן", "name:hr"=>"Kajmanski otoci", "name:hu"=>"Kajmán-szigetek", "name:id"=>"Kepulauan Cayman", "name:is"=>"Caymaneyjar", "name:it"=>"Isole Cayman", "name:lb"=>"Kaimaninselen", "name:lt"=>"Kaimanų salos", "name:lv"=>"Kaimanu salas", "name:mn"=>"Кайманы Арлууд", "name:nl"=>"Kaaimaneilanden", "name:pl"=>"Kajmany", "name:pt"=>"Ilhas Cayman", "name:ru"=>"Каймановы острова", "name:sl"=>"Kajmanski otoki", "name:sv"=>"Caymanöarna", "name:th"=>"หมู่เกาะเคย์แมน", "name:tr"=>"Kayman Adaları", "name:uk"=>"Кайманові острови", "name:vi"=>"Quần đảo Cayman", "name:zh"=>"开曼群岛"    \N      38
+cu     "name"=>"Cuba", "name:af"=>"Kuba", "name:ar"=>"كوبا", "name:be"=>"Куба", "name:br"=>"Kuba", "name:de"=>"Kuba", "name:el"=>"Κούβα", "name:en"=>"Cuba", "name:eo"=>"Kubo", "name:et"=>"Kuuba", "name:eu"=>"Kuba", "name:fa"=>"کوبا", "name:fi"=>"Kuuba", "name:fr"=>"Cuba", "name:fy"=>"Kuba", "name:ga"=>"Cúba", "name:gd"=>"Cùba", "name:he"=>"קובה", "name:hr"=>"Kuba", "name:hu"=>"Kuba", "name:hy"=>"Կուբա", "name:id"=>"Kuba", "name:is"=>"Kúba", "name:it"=>"Cuba", "name:ja"=>"キューバ", "name:lb"=>"Kuba", "name:lt"=>"Kuba", "name:lv"=>"Kuba", "name:mn"=>"Куба", "name:pl"=>"Kuba", "name:ru"=>"Куба", "name:sl"=>"Kuba", "name:sv"=>"Kuba", "name:th"=>"ประเทศคิวบา", "name:tr"=>"Küba", "name:uk"=>"Куба", "name:zh"=>"古巴", "official_name"=>"República de Cuba", "official_name:be"=>"Рэспубліка Куба", "official_name:el"=>"Δημοκρατία της Κούβας", "official_name:en"=>"Republic of Cuba", "official_name:et"=>"Kuuba Vabariik", "official_name:gd"=>"Poblachd Chùba", "official_name:id"=>"Republik Kuba", "official_name:it"=>"Repubblica di Cuba", "official_name:lb"=>"Republik Kuba", "official_name:lt"=>"Kubos Respublika", "official_name:lv"=>"Kubas Republika", "official_name:pl"=>"Republika Kuby", "official_name:sv"=>"Republiken Kuba", "official_name:vi"=>"Cộng hòa Cuba"        es      42
+hn     "name"=>"Honduras", "name:ar"=>"هندوراس", "name:be"=>"Гандурас", "name:br"=>"Honduras", "name:ca"=>"Hondures", "name:da"=>"Honduras", "name:el"=>"Ονδούρα", "name:en"=>"Honduras", "name:eo"=>"Honduro", "name:fa"=>"هندوراس", "name:fi"=>"Honduras", "name:fr"=>"Honduras", "name:fy"=>"Hondueras", "name:ga"=>"Hondúras", "name:gd"=>"Hondùras", "name:he"=>"הונדורס", "name:hu"=>"Honduras", "name:is"=>"Hondúras", "name:it"=>"Honduras", "name:ja"=>"ホンジュラス", "name:la"=>"Honduria", "name:lt"=>"Hondūras", "name:lv"=>"Hondurasa", "name:mn"=>"Гондурас", "name:pl"=>"Honduras", "name:ru"=>"Гондурас", "name:sv"=>"Honduras", "name:th"=>"ประเทศฮอนดูรัส", "name:uk"=>"Гондурас", "name:zh"=>"洪都拉斯", "official_name"=>"República de Honduras", "official_name:be"=>"Рэспубліка Гандурас", "official_name:el"=>"Δημοκρατία της Ονδούρας", "official_name:id"=>"Republik Honduras", "official_name:lt"=>"Hondūro Respublika", "official_name:lv"=>"Hondurasas Republika", "official_name:pl"=>"Republika Hondurasu", "official_name:sv"=>"Republiken Honduras", "official_name:vi"=>"Cộng hoà Honduras"        es      56
+pt     "name"=>"Portugal", "name:ar"=>"البرتغال", "name:be"=>"Партугалія", "name:br"=>"Portugal", "name:cy"=>"Portiwgal", "name:el"=>"Πορτογαλία", "name:en"=>"Portugal", "name:eo"=>"Portugalio", "name:fa"=>"پرتغال", "name:fi"=>"Portugali", "name:fr"=>"Portugal", "name:fy"=>"Portegal", "name:ga"=>"An Phortaingéil", "name:gd"=>"A' Phortagail", "name:he"=>"פורטוגל", "name:hu"=>"Portugália", "name:hy"=>"Պորտուգալիա", "name:is"=>"Portúgal", "name:it"=>"Portogallo", "name:ja"=>"ポルトガル", "name:la"=>"Lusitania", "name:lt"=>"Portugalija", "name:lv"=>"Portugāle", "name:mn"=>"Португал", "name:pl"=>"Portugalia", "name:ru"=>"Португалия", "name:sk"=>"Portugalsko", "name:sl"=>"Portugalska", "name:sv"=>"Portugal", "name:th"=>"ประเทศโปรตุเกส", "name:tr"=>"Portekiz", "name:uk"=>"Португалія", "name:vi"=>"Bồ Đào Nha", "name:zh"=>"葡萄牙", "name:haw"=>"Potugala", "name:zh_py"=>"Putaoya", "name:zh_pyt"=>"Pútáoyá", "official_name"=>"República Portuguesa", "official_name:be"=>"Рэспубліка Партугалія", "official_name:br"=>"Republik Portugal", "official_name:el"=>"Πορτογαλική Δημοκρατία", "official_name:en"=>"Portuguese Republic", "official_name:es"=>"República Portuguesa", "official_name:fr"=>"République portugaise", "official_name:id"=>"Republik Portugal", "official_name:lb"=>"Portugiesesch Republik", "official_name:lt"=>"Portugalijos Respublika", "official_name:pl"=>"Republika Portugalska", "official_name:pt"=>"República Portuguesa", "official_name:sk"=>"Portugalská republika", "official_name:sv"=>"Republiken Portugal", "official_name:vi"=>"Cộng hòa Bồ Đào Nha", "official_name:mwl"=>"República Pertuesa"        pt      34
+si     "name"=>"Slovenija", "name:af"=>"Slowenië", "name:ar"=>"سلوفينيا", "name:be"=>"Славенія", "name:br"=>"Slovenia", "name:ca"=>"Eslovènia", "name:cs"=>"Slovinsko", "name:cy"=>"Slofenia", "name:da"=>"Slovenien", "name:de"=>"Slowenien", "name:ee"=>"Sloveenia", "name:el"=>"Σλοβενία", "name:en"=>"Slovenia", "name:eo"=>"Slovenio", "name:es"=>"Eslovenia", "name:et"=>"Sloveenia", "name:fa"=>"اسلوونی", "name:fi"=>"Slovenia", "name:fr"=>"Slovénie", "name:fy"=>"Sloveenje", "name:ga"=>"An tSlóivéin", "name:gd"=>"Sloibhìnia", "name:he"=>"סלובניה", "name:hu"=>"Szlovénia", "name:id"=>"Slovenia", "name:is"=>"Slóvenía", "name:it"=>"Slovenia", "name:la"=>"Slovenia", "name:lb"=>"Slowenien", "name:li"=>"Slovenië", "name:lt"=>"Slovėnija", "name:mn"=>"Словени", "name:ne"=>"स्लोभेनिया", "name:nl"=>"Slovenië", "name:pl"=>"Słowenia", "name:ps"=>"سلووېنيا", "name:pt"=>"Eslovênia", "name:ru"=>"Словения", "name:sk"=>"Slovinsko", "name:sl"=>"Slovenija", "name:sv"=>"Slovenien", "name:th"=>"ประเทศสโลวีเนีย", "name:tr"=>"Slovenya", "name:uk"=>"Словенія", "name:vi"=>"Slovenia", "name:zh"=>"斯洛文尼亚", "name:haw"=>"Solowenia", "name:zh_py"=>"Siluowenniya", "name:zh_pyt"=>"Sīluòwénníyà", "official_name:el"=>"Σλοβενική Δημοκρατία", "official_name:et"=>"Sloveenia Vabariik", "official_name:id"=>"Republik Slovenia", "official_name:lb"=>"Republik Slowenien", "official_name:lt"=>"Slovėnijos Respublika", "official_name:pt"=>"República da Eslovênia", "official_name:sk"=>"Slovinská republika", "official_name:sv"=>"Republiken Slovenien", "official_name:vi"=>"Cộng hòa Slovenia"  sl      36
 dj     "name"=>"جيبوتي;Djibouti", "name:af"=>"Djiboeti", "name:ar"=>"جيبوتي", "name:be"=>"Джыбуці", "name:br"=>"Djibouti", "name:ca"=>"Djibouti", "name:da"=>"Djibouti", "name:de"=>"Dschibuti", "name:el"=>"Τζιμπουτί", "name:en"=>"Djibouti", "name:eo"=>"Ĝibutio", "name:es"=>"Yibuti", "name:et"=>"Djibouti", "name:fa"=>"جیبوتی", "name:fi"=>"Djibouti", "name:fr"=>"Djibouti", "name:fy"=>"Dzjibûty", "name:ga"=>"Diobúití", "name:gd"=>"Diobutaidh", "name:he"=>"ג'יבוטי", "name:hr"=>"Džibuti", "name:hu"=>"Dzsibuti", "name:id"=>"Djibouti", "name:is"=>"Djíbútí", "name:it"=>"Gibuti", "name:ja"=>"ジブチ", "name:la"=>"Dzibutum", "name:lb"=>"Dschibuti", "name:li"=>"Djiboeti", "name:lt"=>"Džibutis", "name:lv"=>"Džibutija", "name:mn"=>"Джибути", "name:nl"=>"Djibouti", "name:pl"=>"Dżibuti", "name:pt"=>"Djibuti", "name:ru"=>"Джибути", "name:sl"=>"Džibuti", "name:sv"=>"Djibouti", "name:th"=>"ประเทศจิบูตี", "name:tr"=>"Cibuti", "name:uk"=>"Джибуті", "name:vi"=>"Djibouti", "name:zh"=>"吉布提", "name:haw"=>"Dibuti", "name:zh_py"=>"Jibuti", "name:zh_pyt"=>"Jíbùtí", "official_name"=>"جمهورية جيبوتي;République de Djibouti", "official_name:af"=>"Republiek van Djiboeti", "official_name:br"=>"Republik Djibouti", "official_name:el"=>"Δημοκρατία του Τζιμπουτί", "official_name:en"=>"Republic of Djibouti", "official_name:et"=>"Djibouti Vabariik", "official_name:lv"=>"Džibutijas Republika", "official_name:pt"=>"República do Djibuti", "official_name:sv"=>"Republiken Djibouti", "official_name:vi"=>"Cộng hòa Djibouti"    \N      43
-hu     "name"=>"Magyarország", "name:af"=>"Hongarye", "name:ar"=>"هنغاريا", "name:be"=>"Венгрыя", "name:br"=>"Hungaria", "name:ca"=>"Hongria", "name:cy"=>"Hwngari", "name:da"=>"Ungarn", "name:de"=>"Ungarn", "name:el"=>"Ουγγαρία", "name:en"=>"Hungary", "name:eo"=>"Hungario", "name:es"=>"Hungría", "name:et"=>"Ungari", "name:fa"=>"مجارستان", "name:fi"=>"Unkari", "name:fr"=>"Hongrie", "name:fy"=>"Hongarije", "name:ga"=>"An Ungáir", "name:gd"=>"An Ungair", "name:he"=>"הונגריה", "name:hr"=>"Madžarska", "name:hu"=>"Magyarország", "name:hy"=>"Հունգարիա", "name:id"=>"Hongaria", "name:is"=>"Ungverjaland", "name:it"=>"Ungheria", "name:ja"=>"ハンガリー", "name:la"=>"Hungaria", "name:lb"=>"Ungarn", "name:lt"=>"Vengrija", "name:lv"=>"Ungārija", "name:mn"=>"Унгар", "name:nl"=>"Hongarije", "name:pl"=>"Węgry", "name:ro"=>"Ungaria", "name:ru"=>"Венгрия", "name:sk"=>"Maďarsko", "name:sl"=>"Madžarska", "name:sv"=>"Ungern", "name:th"=>"ประเทศฮังการี", "name:tr"=>"Macaristan", "name:uk"=>"Угорщина", "name:vi"=>"Hungary", "name:zh"=>"匈牙利", "name:haw"=>"Hunakalia", "name:zh_py"=>"Xiongyali", "name:zh_pyt"=>"Xiōngyálì", "official_name"=>"Magyar Köztársaság", "official_name:el"=>"Δημοκρατία της Ουγγαρίας", "official_name:en"=>"Republic of Hungary", "official_name:es"=>"República de Hungría", "official_name:et"=>"Ungari Vabariik", "official_name:fr"=>"République de Hongrie", "official_name:id"=>"Republik Hongaria", "official_name:it"=>"Repubblica d'Ungheria", "official_name:ja"=>"ハンガリー共和国", "official_name:lb"=>"Republik Ungarn", "official_name:lt"=>"Vengrijos Respublika", "official_name:lv"=>"Ungārijas Republika", "official_name:pl"=>"Republika Węgier", "official_name:ru"=>"Венге́рская Респу́блика", "official_name:sk"=>"Maďarská republika", "official_name:sv"=>"Republiken Ungern"       \N      45
-gg     "name"=>"Guernsey", "name:ar"=>"غويرنسي", "name:be"=>"Гернсі", "name:br"=>"Gwernenez", "name:cy"=>"Ynys y Garn", "name:el"=>"Γκέρνσεϊ", "name:en"=>"Guernsey", "name:eo"=>"Guernsey", "name:fi"=>"Guernsey", "name:fr"=>"Guernesey", "name:ga"=>"Geansaí", "name:he"=>"גרנזי", "name:hu"=>"Guernsey", "name:is"=>"Guernsey", "name:la"=>"Lisia", "name:lt"=>"Gernsis", "name:lv"=>"Gērnsija", "name:mn"=>"Гернси", "name:pl"=>"Guernsey", "name:ru"=>"Гернси", "name:sk"=>"Guernsey", "name:sv"=>"Guernsey", "name:th"=>"เกิร์นซีย์", "name:uk"=>"Гернсі", "name:zh"=>"格恩西岛", "name:zh_py"=>"Geenxi Dao", "name:zh_pyt"=>"Géēnxī Dǎo", "official_name:vi"=>"Địa hạt Guernsey"        \N      77
+gg     "name"=>"Guernsey", "name:ar"=>"غويرنسي", "name:be"=>"Гернсі", "name:br"=>"Gwernenez", "name:cy"=>"Ynys y Garn", "name:el"=>"Γκέρνσεϊ", "name:en"=>"Guernsey", "name:eo"=>"Guernsey", "name:fi"=>"Guernsey", "name:fr"=>"Guernesey", "name:ga"=>"Geansaí", "name:he"=>"גרנזי", "name:hu"=>"Guernsey", "name:is"=>"Guernsey", "name:la"=>"Lisia", "name:lt"=>"Gernsis", "name:lv"=>"Gērnsija", "name:mn"=>"Гернси", "name:pl"=>"Guernsey", "name:ru"=>"Гернси", "name:sk"=>"Guernsey", "name:sv"=>"Guernsey", "name:th"=>"เกิร์นซีย์", "name:uk"=>"Гернсі", "name:zh"=>"格恩西岛", "name:zh_py"=>"Geenxi Dao", "name:zh_pyt"=>"Géēnxī Dǎo", "official_name:vi"=>"Địa hạt Guernsey"        en      77
+ky     "name"=>"Cayman Islands", "name:af"=>"Kaaimanseilande", "name:ar"=>"جزر الكايمان", "name:be"=>"Кайманавы астравы", "name:br"=>"Inizi Cayman", "name:ca"=>"Illes Caiman", "name:cy"=>"Ynysoedd Cayman", "name:da"=>"Caymanøerne", "name:de"=>"Kaimaninseln", "name:en"=>"Cayman Islands", "name:eo"=>"Kajmaninsuloj", "name:es"=>"Islas Caimán", "name:et"=>"Kaimanisaared", "name:fa"=>"جزایر کایمان", "name:fi"=>"Caymansaaret", "name:fr"=>"Îles Caïmans", "name:fy"=>"de Kaaimaneilannen", "name:ga"=>"Oileáin Cayman", "name:he"=>"איי קיימן", "name:hr"=>"Kajmanski otoci", "name:hu"=>"Kajmán-szigetek", "name:id"=>"Kepulauan Cayman", "name:is"=>"Caymaneyjar", "name:it"=>"Isole Cayman", "name:lb"=>"Kaimaninselen", "name:lt"=>"Kaimanų salos", "name:lv"=>"Kaimanu salas", "name:mn"=>"Кайманы Арлууд", "name:nl"=>"Kaaimaneilanden", "name:pl"=>"Kajmany", "name:pt"=>"Ilhas Cayman", "name:ru"=>"Каймановы острова", "name:sl"=>"Kajmanski otoki", "name:sv"=>"Caymanöarna", "name:th"=>"หมู่เกาะเคย์แมน", "name:tr"=>"Kayman Adaları", "name:uk"=>"Кайманові острови", "name:vi"=>"Quần đảo Cayman", "name:zh"=>"开曼群岛"    en      38
 ie     "name"=>"Ireland", "name:af"=>"Ierland", "name:ar"=>"أيرلندا", "name:be"=>"Ірландыя", "name:br"=>"Iwerzhon", "name:ca"=>"Irlanda", "name:cy"=>"Iwerddon", "name:da"=>"Irland", "name:de"=>"Irland", "name:el"=>"Ιρλανδία", "name:en"=>"Ireland", "name:eo"=>"Irlando", "name:es"=>"Irlanda", "name:et"=>"Iirimaa", "name:fa"=>"ایرلند", "name:fi"=>"Irlanti", "name:fr"=>"Irlande", "name:fy"=>"Ierlân", "name:ga"=>"Éire", "name:gd"=>"Poblachd na h-Èireann", "name:gv"=>"Nerin", "name:he"=>"אירלנד", "name:hr"=>"Irska", "name:hu"=>"Írország", "name:id"=>"Irlandia", "name:is"=>"Írland", "name:it"=>"Irlanda", "name:ja"=>"アイルランド", "name:la"=>"Hibernia", "name:lb"=>"Irland", "name:li"=>"Ierland", "name:lt"=>"Airija", "name:lv"=>"Īrija", "name:mn"=>"Ирланд", "name:nl"=>"Ierland", "name:pl"=>"Irlandia", "name:ru"=>"Ирландия", "name:sk"=>"Írsko", "name:sl"=>"Irska", "name:sv"=>"Irland", "name:th"=>"สาธารณรัฐไอร์แลนด์", "name:tr"=>"İrlanda", "name:uk"=>"Ірландія", "name:zh"=>"爱尔兰", "name:haw"=>"‘Ilelani", "name:zh_py"=>"Aierlan", "name:zh_pyt"=>"Àiěrlán", "official_name"=>"Republic of Ireland", "official_name:af"=>"Republiek van Ierland", "official_name:be"=>"Рэспубліка Ірландыя", "official_name:el"=>"Δημοκρατία της Ιρλανδίας", "official_name:es"=>"República de Irlanda", "official_name:id"=>"Republik Irlandia", "official_name:it"=>"Repubblica d'Irlanda", "official_name:ja"=>"アイルランド共和国", "official_name:la"=>"Hibernia (res publica)", "official_name:pl"=>"Republika Irlandii", "official_name:vi"=>"Cộng hòa Ireland"      \N      46
 km     "name"=>"Comores;ﺍﻟﻘﻤﺮي;Komori", "name:af"=>"Komore", "name:ar"=>"جزر القمر", "name:br"=>"Komorez", "name:ca"=>"Comores", "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:id"=>"Komoro", "name:is"=>"Kómoreyjar", "name:it"=>"Comore", "name:ja"=>"コモロ", "name:la"=>"Insulae Comorianae", "name:lb"=>"Komoren", "name:lt"=>"Komorai", "name:lv"=>"Komoru salas", "name:mn"=>"Коморын арлууд", "name:nl"=>"Comoren", "name:pl"=>"Komory", "name:pt"=>"Comores", "name:ru"=>"Коморы", "name:sl"=>"Komori", "name:sv"=>"Komorerna", "name:th"=>"ประเทศคอโมโรส", "name:tr"=>"Komorlar", "name:uk"=>"Коморські Острови", "name:vi"=>"Comoros", "name:zh"=>"科摩洛", "name:haw"=>"Komorosa", "name:zh_py"=>"Kemoluo", "name:zh_pyt"=>"Kēmóluò", "official_name"=>"Union des Comores;الاتحاد ﺍﻟﻘﻤﺮي;Udzima wa Komori", "official_name:ar"=>"الاتّحاد القمريّ", "official_name:el"=>"Ένωση των Κομορών", "official_name:en"=>"Union of the Comoros", "official_name:es"=>"Unión de las Comoras", "official_name:id"=>"Perserikatan Komoro", "official_name:lt"=>"Komorų Sąjunga", "official_name:lv"=>"Komoru Islāma Federatīvā Republika", "official_name:pl"=>"Związek Komorów", "official_name:pt"=>"União das Comores", "official_name:sv"=>"Unionen Komorerna", "official_name:vi"=>"Liên bang Comoros"    \N      47
-pe     "name"=>"Peru", "name:ar"=>"بيرو", "name:be"=>"Перу", "name:br"=>"Perou", "name:ca"=>"Perú", "name:cy"=>"Periw", "name:da"=>"Peru", "name:el"=>"Περού", "name:en"=>"Peru", "name:eo"=>"Peruo", "name:es"=>"Perú", "name:et"=>"Peruu", "name:fa"=>"پرو", "name:fi"=>"Peru", "name:fr"=>"Pérou", "name:fy"=>"Perû", "name:ga"=>"Peiriú", "name:gd"=>"Pearu", "name:he"=>"פרו", "name:hu"=>"Peru", "name:is"=>"Perú", "name:it"=>"Perù", "name:ja"=>"ペルー", "name:la"=>"Peruvia", "name:lv"=>"Peru", "name:mn"=>"Перу", "name:pl"=>"Peru", "name:ru"=>"Перу", "name:sk"=>"Peru", "name:sv"=>"Peru", "name:th"=>"ประเทศเปรู", "name:uk"=>"Перу", "name:zh"=>"秘鲁", "official_name"=>"República del Perú", "official_name:el"=>"Δημοκρατία του Περού", "official_name:et"=>"Peruu Vabariik", "official_name:fr"=>"République du Pérou", "official_name:id"=>"Republik Peru", "official_name:lb"=>"Republik Peru", "official_name:lt"=>"Peru Respublika", "official_name:lv"=>"Peru Republika", "official_name:sk"=>"Peruánska republika", "official_name:sv"=>"Republiken Peru", "official_name:vi"=>"Cộng hòa Peru"     \N      51
-sa     "name"=>"Saudi Arabia / السعودية", "name:af"=>"Saoedi-Arabië", "name:ar"=>"المملكة العربية السعودية", "name:be"=>"Саудаўская Аравія", "name:br"=>"Arabia Saoudat", "name:ca"=>"Aràbia Saudita", "name:da"=>"Saudi-Arabien", "name:de"=>"Saudi-Arabien", "name:el"=>"Σαουδική Αραβία", "name:en"=>"Saudi Arabia", "name:eo"=>"Saŭda Arabio", "name:es"=>"Arabia Saudita", "name:et"=>"Saudi Araabia", "name:fa"=>"عربستان سعودی", "name:fi"=>"Saudi-Arabia", "name:fr"=>"Arabie saoudite", "name:fy"=>"Saûdi-Araabje", "name:ga"=>"An Araib Shádach", "name:gd"=>"Saud-Aràibia", "name:he"=>"ערב הסעודית", "name:hr"=>"Saudijska Arabija", "name:hu"=>"Szaúd-Arábia", "name:id"=>"Arab Saudi", "name:is"=>"Sádí-Arabía", "name:it"=>"Arabia Saudita", "name:ja"=>"サウジアラビア", "name:la"=>"Arabia Saudiana", "name:lb"=>"Saudi-Arabien", "name:li"=>"Saoedi-Arabië", "name:lt"=>"Saudo Arabija", "name:mn"=>"Саудын Араб", "name:nl"=>"Saoedi-Arabië", "name:pl"=>"Arabia Saudyjska", "name:pt"=>"Arábia Saudita", "name:ru"=>"Саудовская Аравия", "name:sl"=>"Saudova Arabija", "name:sv"=>"Saudiarabien", "name:th"=>"ประเทศซาอุดีอาระเบีย", "name:tr"=>"Suudi Arabistan", "name:uk"=>"Саудівська Аравія", "name:vi"=>"Ả Rập Saudi", "name:zh"=>"沙特阿拉伯", "name:haw"=>"Saudi ʻAlapia", "name:zh_py"=>"Shate Alabo", "name:zh_pyt"=>"Shātè Ālābó", "official_name:af"=>"Koninkryk van Saoedi-Arabië", "official_name:br"=>"Rouantelezh Arabia Saoudat", "official_name:el"=>"Βασίλειο της Σαουδικής Αραβίας", "official_name:en"=>"Kingdom of Saudi Arabia", "official_name:et"=>"Saudi Araabia Kuningriik", "official_name:fr"=>"Royaume d'Arabie saoudite", "official_name:id"=>"Kerajaan Arab Saudi", "official_name:it"=>"Regno arabo saudita", "official_name:lb"=>"Kinnekräich Saudi-Arabien", "official_name:lt"=>"Saudo Arabijos Karalystė", "official_name:pl"=>"Królestwo Arabii Saudyjskiej", "official_name:pt"=>"Reino da Arábia Saudita", "official_name:sv"=>"Konungariket Saudiarabien", "official_name:vi"=>"Vương quốc Ả Rập Saudi"   \N      52
-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: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 Prinsyp", "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: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:sl"=>"Sao Tome in Principe", "name:sv"=>"São Tomé och Príncipe", "name:th"=>"ประเทศเซาตูเมและปรินซิปี", "name:tr"=>"São Tomé ve Príncipe", "name:uk"=>"Сан-Томе і Принсіпі", "name:vi"=>"São Tomé và Príncipe", "name:zh"=>"圣多美和普林西比", "name:zh_py"=>"Shengduomei he Pulinxibi", "name:zh_pyt"=>"Shèngduōměi hé Pǔlínxībǐ", "official_name:fr"=>"République démocratique de Sao Tomé-et-Principe", "official_name:id"=>"Republik Demokratik Sao Tome dan Principe", "official_name:lb"=>"Demokratesch Republik São Tomé a Príncipe", "official_name:pt"=>"República Democrática de São Tomé e Príncipe", "official_name:sv"=>"Demokratiska republiken São Tomé och Príncipe", "official_name:vi"=>"Cộng hòa Dân chủ São Tomé và Príncipe"   \N      53
-rs     "name"=>"Србија (Serbia)", "name:af"=>"Serwië", "name:ar"=>"صربيا", "name:be"=>"Сербія", "name:br"=>"Serbia", "name:ca"=>"Sèrbia", "name:cy"=>"Serbia", "name:da"=>"Serbien", "name:de"=>"Serbien", "name:el"=>"Σερβία", "name:en"=>"Serbia", "name:eo"=>"Serbio", "name:es"=>"Serbia", "name:et"=>"Serbia", "name:fa"=>"صربستان", "name:fi"=>"Serbia", "name:fr"=>"Serbie", "name:fy"=>"Servje", "name:ga"=>"An tSeirbia", "name:gd"=>"An t-Sèarb", "name:he"=>"סרביה", "name:hr"=>"Srbija", "name:hu"=>"Szerbia", "name:id"=>"Serbia", "name:is"=>"Serbía", "name:it"=>"Serbia", "name:ja"=>"セルビア", "name:la"=>"Serbia", "name:lb"=>"Serbien", "name:li"=>"Servië", "name:lt"=>"Serbija", "name:mn"=>"Серби", "name:nb"=>"Serbia", "name:nl"=>"Servië", "name:nn"=>"Serbia", "name:no"=>"Serbia", "name:pl"=>"Serbia", "name:pt"=>"Sérvia", "name:ru"=>"Сербия", "name:sk"=>"Srbsko", "name:sl"=>"Srbija", "name:sr"=>"Србија", "name:sv"=>"Serbien", "name:th"=>"ประเทศเซอร์เบีย", "name:tr"=>"Sırbistan", "name:uk"=>"Сербія", "name:vi"=>"Serbia", "name:zh"=>"塞尔维亚", "name:haw"=>"Seripia", "name:zh_py"=>"Saierweiya", "name:zh_pyt"=>"Sāiěrwéiyà", "official_name:br"=>"Republik Serbia", "official_name:el"=>"Δημοκρατία της Σερβίας", "official_name:et"=>"Serbia Vabariik", "official_name:fr"=>"République de Serbie", "official_name:id"=>"Republik Serbia", "official_name:ja"=>"セルビア共和国", "official_name:lt"=>"Serbijos Respublika", "official_name:pt"=>"República da Sérvia", "official_name:sk"=>"Srbská republika", "official_name:sv"=>"Republiken Serbien"       \N      59
+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: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 Prinsyp", "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: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:sl"=>"Sao Tome in Principe", "name:sv"=>"São Tomé och Príncipe", "name:th"=>"ประเทศเซาตูเมและปรินซิปี", "name:tr"=>"São Tomé ve Príncipe", "name:uk"=>"Сан-Томе і Принсіпі", "name:vi"=>"São Tomé và Príncipe", "name:zh"=>"圣多美和普林西比", "name:zh_py"=>"Shengduomei he Pulinxibi", "name:zh_pyt"=>"Shèngduōměi hé Pǔlínxībǐ", "official_name:fr"=>"République démocratique de Sao Tomé-et-Principe", "official_name:id"=>"Republik Demokratik Sao Tome dan Principe", "official_name:lb"=>"Demokratesch Republik São Tomé a Príncipe", "official_name:pt"=>"República Democrática de São Tomé e Príncipe", "official_name:sv"=>"Demokratiska republiken São Tomé och Príncipe", "official_name:vi"=>"Cộng hòa Dân chủ São Tomé và Príncipe"   pt      53
 no     "name"=>"Norge", "name:af"=>"Noorweë", "name:ar"=>"النرويج", "name:be"=>"Нарвегія", "name:br"=>"Norvegia", "name:ca"=>"Noruega", "name:cy"=>"Norwy", "name:de"=>"Norwegen", "name:el"=>"Νορβηγία", "name:en"=>"Norway", "name:eo"=>"Norvegio", "name:es"=>"Noruega", "name:et"=>"Norra", "name:fa"=>"نروژ", "name:fi"=>"Norja", "name:fr"=>"Norvège", "name:fy"=>"Noarwegen", "name:ga"=>"An Iorua", "name:gd"=>"Nirribhidh", "name:he"=>"נורווגיה", "name:hr"=>"Norveška", "name:hu"=>"Norvégia", "name:hy"=>"Նորվեգիա", "name:id"=>"Norwegia", "name:is"=>"Noregur", "name:it"=>"Norvegia", "name:ja"=>"ノルウェー", "name:la"=>"Norvegia", "name:lb"=>"Norwegen", "name:li"=>"Noorwege", "name:lt"=>"Norvegija", "name:lv"=>"Norvēģija", "name:mn"=>"Норвеги", "name:nl"=>"Noorwegen", "name:no"=>"Norge", "name:pl"=>"Norwegia", "name:ru"=>"Норвегия", "name:sk"=>"Nórsko", "name:sl"=>"Norveška", "name:sv"=>"Norge", "name:th"=>"ประเทศนอร์เวย์", "name:tr"=>"Norveç", "name:uk"=>"Норвегія", "name:vi"=>"Na Uy", "name:zh"=>"挪威", "name:haw"=>"Nolewai", "name:zh_py"=>"Nuowei", "name:zh_pyt"=>"Nuówēi", "official_name"=>"Kongeriket Norge", "official_name:be"=>"Каралеўства Нарвегія", "official_name:el"=>"Βασίλειο της Νορβηγίας", "official_name:en"=>"Kingdom of Norway", "official_name:id"=>"Kerajaan Norwegia", "official_name:it"=>"Regno di Norvegia", "official_name:ja"=>"ノルウェー王国", "official_name:lb"=>"Kinneksräich Norwegen", "official_name:lt"=>"Norvegijos Karalystė", "official_name:sk"=>"Nórske kráľovstvo", "official_name:sv"=>"Konungariket Norge", "official_name:vi"=>"Vương quốc Na Uy"   \N      60
-bi     "name"=>"Burundi", "name:af"=>"Burundi", "name:ar"=>"بوروندي", "name:be"=>"Бурундзі", "name:br"=>"Burundi", "name:cy"=>"Bwrwndi", "name:da"=>"Burundi", "name:el"=>"Μπουρούντι", "name:en"=>"Burundi", "name:eo"=>"Burundo", "name:es"=>"Burundi", "name:fa"=>"بوروندی", "name:fi"=>"Burundi", "name:fr"=>"Burundi", "name:fy"=>"Bûrûndy", "name:ga"=>"An Bhurúin", "name:gd"=>"Burundaidh", "name:he"=>"בורונדי", "name:hu"=>"Burundi", "name:is"=>"Búrúndí", "name:it"=>"Burundi", "name:ja"=>"ブルンジ", "name:la"=>"Burundia", "name:li"=>"Boeroendi", "name:lt"=>"Burundis", "name:lv"=>"Burundija", "name:mn"=>"Бурунди", "name:pl"=>"Burundi", "name:ru"=>"Бурунди", "name:sv"=>"Burundi", "name:th"=>"ประเทศบุรุนดี", "name:uk"=>"Бурунді", "name:zh"=>"布隆迪", "name:haw"=>"Buruni", "name:zh_py"=>"Bulongdi", "name:zh_pyt"=>"Bùlóngdí", "official_name"=>"Republika y'u Burundi;Republique du Burundi", "official_name:el"=>"Δημοκρατία του Μπουρούντι", "official_name:fi"=>"Burundin tasavalta", "official_name:lb"=>"Republik Burundi", "official_name:lt"=>"Burundžio Respublika", "official_name:lv"=>"Burundijas Republika", "official_name:sv"=>"Republiken Burundi", "official_name:vi"=>"Cộng hòa Burundi"        \N      61
-il     "name"=>"ישראל", "name:af"=>"Israel", "name:ar"=>"إسرائيل", "name:be"=>"Ізраіль", "name:br"=>"Israel", "name:ca"=>"Israel", "name:cy"=>"Israel", "name:da"=>"Israel", "name:de"=>"Israel", "name:el"=>"Ισραήλ", "name:en"=>"Israel", "name:eo"=>"Israelo", "name:es"=>"Israel", "name:et"=>"Iisrael", "name:fa"=>"اسرائیل", "name:fi"=>"Israel", "name:fr"=>"Israël", "name:fy"=>"Israel", "name:ga"=>"Iosrael", "name:gd"=>"Iosrael", "name:he"=>"ישראל", "name:hr"=>"Izrael", "name:hu"=>"Izrael", "name:hy"=>"Իսրայել", "name:id"=>"Israel", "name:is"=>"Ísrael", "name:it"=>"Israele", "name:ja"=>"イスラエル", "name:la"=>"Israel", "name:lb"=>"Israel", "name:li"=>"Israël", "name:lt"=>"Izraelis", "name:lv"=>"Izraēla", "name:mn"=>"Израйль", "name:nl"=>"Israël", "name:pl"=>"Izrael", "name:pt"=>"Israel", "name:ru"=>"Израиль", "name:sl"=>"Izrael", "name:sv"=>"Israel", "name:th"=>"ประเทศอิสราเอล", "name:tr"=>"İsrail", "name:uk"=>"Ізра́їль", "name:vi"=>"Israel", "name:zh"=>"以色列", "name:haw"=>"ʻIseraʻela", "name:zh_py"=>"Yiselie", "name:zh_pyt"=>"Yǐsèliè", "official_name"=>"מדינת ישראל", "official_name:el"=>"Κράτος του Ισραήλ", "official_name:en"=>"State of Israel", "official_name:es"=>"Estado de Israel", "official_name:et"=>"Iisraeli Riik", "official_name:gd"=>"Stàit Iosrael", "official_name:ja"=>"イスラエル国", "official_name:lb"=>"Staat Israel", "official_name:lv"=>"Izraēlas Valsts", "official_name:pl"=>"Państwo Izraela", "official_name:pt"=>"Estado de Israel", "official_name:ru"=>"Государство Израиль", "official_name:sv"=>"Staten Israel"        \N      65
-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:cy"=>"Saint Kitts a Nevis", "name:da"=>"Saint Kitts og Nevis", "name:de"=>"St. Kitts und Nevis", "name:eo"=>"Sankta-Kito 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 Christopher és Nevis", "name:id"=>"Saint Kitts dan 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"=>"Sen Kristoferis ir Nevis", "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:sl"=>"Saint Kitts in Nevis", "name:sv"=>"Saint Kitts och Nevis", "name:th"=>"ประเทศเซนต์คิตส์และเนวิส", "name:tr"=>"Saint Kitts ve Nevis", "name:uk"=>"Сент-Кіттс і Невіс", "name:vi"=>"Saint Kitts và Nevis", "name:zh"=>"圣基茨和尼维斯", "alt_name"=>"Federation of Saint Christopher and Nevis", "official_name"=>"Federation of Saint Kitts and Nevis", "official_name:es"=>"Federación de San Cristóbal y Nieves", "official_name:fr"=>"Fédération de Saint-Christophe-et-Niévès", "official_name:id"=>"Federasi Saint Kitts dan Nevis", "official_name:it"=>"Federazione di Saint Kitts e Nevis", "official_name:pl"=>"Federacja Saint Kitts i Nevis", "official_name:pt"=>"Federação de São Cristóvão e Nevis", "official_name:vi"=>"Liên bang Saint Kitts và Nevis"      \N      84
+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:cy"=>"Saint Kitts a Nevis", "name:da"=>"Saint Kitts og Nevis", "name:de"=>"St. Kitts und Nevis", "name:eo"=>"Sankta-Kito 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 Christopher és Nevis", "name:id"=>"Saint Kitts dan 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"=>"Sen Kristoferis ir Nevis", "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:sl"=>"Saint Kitts in Nevis", "name:sv"=>"Saint Kitts och Nevis", "name:th"=>"ประเทศเซนต์คิตส์และเนวิส", "name:tr"=>"Saint Kitts ve Nevis", "name:uk"=>"Сент-Кіттс і Невіс", "name:vi"=>"Saint Kitts và Nevis", "name:zh"=>"圣基茨和尼维斯", "alt_name"=>"Federation of Saint Christopher and Nevis", "official_name"=>"Federation of Saint Kitts and Nevis", "official_name:es"=>"Federación de San Cristóbal y Nieves", "official_name:fr"=>"Fédération de Saint-Christophe-et-Niévès", "official_name:id"=>"Federasi Saint Kitts dan Nevis", "official_name:it"=>"Federazione di Saint Kitts e Nevis", "official_name:pl"=>"Federacja Saint Kitts i Nevis", "official_name:pt"=>"Federação de São Cristóvão e Nevis", "official_name:vi"=>"Liên bang Saint Kitts và Nevis"      en      84
+rs     "name"=>"Србија (Serbia)", "name:af"=>"Serwië", "name:ar"=>"صربيا", "name:be"=>"Сербія", "name:br"=>"Serbia", "name:ca"=>"Sèrbia", "name:cy"=>"Serbia", "name:da"=>"Serbien", "name:de"=>"Serbien", "name:el"=>"Σερβία", "name:en"=>"Serbia", "name:eo"=>"Serbio", "name:es"=>"Serbia", "name:et"=>"Serbia", "name:fa"=>"صربستان", "name:fi"=>"Serbia", "name:fr"=>"Serbie", "name:fy"=>"Servje", "name:ga"=>"An tSeirbia", "name:gd"=>"An t-Sèarb", "name:he"=>"סרביה", "name:hr"=>"Srbija", "name:hu"=>"Szerbia", "name:id"=>"Serbia", "name:is"=>"Serbía", "name:it"=>"Serbia", "name:ja"=>"セルビア", "name:la"=>"Serbia", "name:lb"=>"Serbien", "name:li"=>"Servië", "name:lt"=>"Serbija", "name:mn"=>"Серби", "name:nb"=>"Serbia", "name:nl"=>"Servië", "name:nn"=>"Serbia", "name:no"=>"Serbia", "name:pl"=>"Serbia", "name:pt"=>"Sérvia", "name:ru"=>"Сербия", "name:sk"=>"Srbsko", "name:sl"=>"Srbija", "name:sr"=>"Србија", "name:sv"=>"Serbien", "name:th"=>"ประเทศเซอร์เบีย", "name:tr"=>"Sırbistan", "name:uk"=>"Сербія", "name:vi"=>"Serbia", "name:zh"=>"塞尔维亚", "name:haw"=>"Seripia", "name:zh_py"=>"Saierweiya", "name:zh_pyt"=>"Sāiěrwéiyà", "official_name:br"=>"Republik Serbia", "official_name:el"=>"Δημοκρατία της Σερβίας", "official_name:et"=>"Serbia Vabariik", "official_name:fr"=>"République de Serbie", "official_name:id"=>"Republik Serbia", "official_name:ja"=>"セルビア共和国", "official_name:lt"=>"Serbijos Respublika", "official_name:pt"=>"República da Sérvia", "official_name:sk"=>"Srbská republika", "official_name:sv"=>"Republiken Serbien"       sr      59
 lb     "name"=>"لبنان  Lebanon", "name:af"=>"Libanon", "name:ar"=>"لبنان", "name:be"=>"Ліван", "name:br"=>"Liban", "name:ca"=>"Líban", "name:cy"=>"Libanus", "name:da"=>"Libanon", "name:de"=>"Libanon", "name:el"=>"Λίβανος", "name:en"=>"Lebanon", "name:eo"=>"Libano", "name:es"=>"Líbano", "name:et"=>"Liibanon", "name:fa"=>"لبنان", "name:fi"=>"Libanon", "name:fr"=>"Liban", "name:fy"=>"Libanon", "name:ga"=>"An Liobáin", "name:gd"=>"Leabanon", "name:he"=>"לבנון", "name:hr"=>"Libanon", "name:hu"=>"Libanon", "name:id"=>"Lebanon", "name:is"=>"Líbanon", "name:it"=>"Libano", "name:ja"=>"レバノン", "name:la"=>"Libanus", "name:lb"=>"Libanon", "name:li"=>"Libanon", "name:lt"=>"Libanas", "name:lv"=>"Libāna", "name:mn"=>"Ливан", "name:nb"=>"Libanon", "name:nl"=>"Libanon", "name:nn"=>"Libanon", "name:no"=>"Libanon", "name:pl"=>"Liban", "name:pt"=>"Líbano", "name:ru"=>"Ливан", "name:sl"=>"Libanon", "name:sv"=>"Libanon", "name:th"=>"ประเทศเลบานอน", "name:tr"=>"Lübnan", "name:uk"=>"Ліван", "name:vi"=>"Liban", "name:zh"=>"黎巴嫩", "name:haw"=>"Lepanona", "name:zh_py"=>"Libanen", "name:zh_pyt"=>"Líbānèn", "official_name"=>"Republic of Lebanon", "official_name:br"=>"Republik Liban", "official_name:en"=>"Republic of Lebanon", "official_name:et"=>"Liibanoni Vabariik", "official_name:id"=>"Republik Lebanon", "official_name:it"=>"Repubblica Libanese", "official_name:ja"=>"レバノン共和国", "official_name:lb"=>"Republik Libanon", "official_name:lv"=>"Libānas Republika", "official_name:pl"=>"Republika Libańska", "official_name:pt"=>"República do Líbano", "official_name:sv"=>"Republiken Libanon", "official_name:vi"=>"Cộng hòa Liban"  \N      66
-bt     "name"=>"Bhutan", "name:af"=>"Bhoetan", "name:ar"=>"بوتان", "name:be"=>"Бутан", "name:br"=>"Bhoutan", "name:dz"=>"འབྲུག་ཡུལ་", "name:el"=>"Μπουτάν", "name:en"=>"Bhutan", "name:eo"=>"Butano", "name:es"=>"Bután", "name:fa"=>"بوتان", "name:fi"=>"Bhutan", "name:fr"=>"Bhoutan", "name:fy"=>"Bûtan", "name:ga"=>"An Bhútain", "name:gd"=>"Butàn", "name:he"=>"בהוטן", "name:hr"=>"Butan", "name:hu"=>"Bhután", "name:is"=>"Bútan", "name:it"=>"Bhutan", "name:ja"=>"ブータン", "name:la"=>"Butania", "name:li"=>"Bhoetaan", "name:lt"=>"Butanas", "name:lv"=>"Butāna", "name:mn"=>"Бутан", "name:pl"=>"Bhutan", "name:pt"=>"Butão", "name:ru"=>"Бутан", "name:sl"=>"Butan", "name:sv"=>"Bhutan", "name:th"=>"ประเทศภูฏาน", "name:uk"=>"Бутан", "name:zh"=>"不丹", "name:haw"=>"Butana", "name:zh_py"=>"Budan", "name:zh_pyt"=>"Bùdān", "official_name:el"=>"Βασίλειο του Μπουτάν", "official_name:en"=>"Kingdom of Bhutan", "official_name:fi"=>"Bhutanin kuningaskunta", "official_name:it"=>"Regno del Bhutan", "official_name:lt"=>"Butano Karalystė", "official_name:lv"=>"Butānas Karaliste", "official_name:pt"=>"Reino do Butão", "official_name:sv"=>"Konungariket Bhutan", "official_name:vi"=>"Vương quốc Bhutan"       \N      87
-lt     "name"=>"Lietuva", "name:af"=>"Litaue", "name:ar"=>"ليتوانيا", "name:be"=>"Літва", "name:br"=>"Lituania", "name:ca"=>"Lituània", "name:cy"=>"Lithwania", "name:da"=>"Litauen", "name:de"=>"Litauen", "name:el"=>"Λιθουανία", "name:en"=>"Lithuania", "name:eo"=>"Litovio", "name:es"=>"Lituania", "name:et"=>"Leedu", "name:fa"=>"لیتوانی", "name:fi"=>"Liettua", "name:fr"=>"Lituanie", "name:fy"=>"Litouwen", "name:ga"=>"An Liotuáin", "name:gd"=>"Liotuàinia", "name:he"=>"לטביה", "name:hr"=>"Litva", "name:hu"=>"Litvánia", "name:id"=>"Lituania", "name:is"=>"Litháen", "name:it"=>"Lituania", "name:ja"=>"リトアニア", "name:la"=>"Lituania", "name:lb"=>"Litauen", "name:li"=>"Litauwe", "name:lv"=>"Lietuva", "name:mn"=>"Литва", "name:nl"=>"Litouwen", "name:pl"=>"Litwa", "name:ru"=>"Литва", "name:sk"=>"Litva", "name:sl"=>"Litva", "name:sv"=>"Litauen", "name:th"=>"ประเทศลิทัวเนีย", "name:tr"=>"Litvanya", "name:uk"=>"Литва", "name:vi"=>"Litva", "name:zh"=>"立陶宛", "name:haw"=>"Lituania", "name:zh_py"=>"Litaowan", "name:zh_pyt"=>"Lìtáowǎn", "official_name"=>"Republic of Lithuania", "official_name:be"=>"Літоўская Рэспубліка", "official_name:el"=>"Δημοκρατία της Λιθουανίας", "official_name:en"=>"Republic of Lithuania", "official_name:es"=>"República de Lituania", "official_name:et"=>"Leedu Vabariik", "official_name:fr"=>"République de Lituanie", "official_name:id"=>"Republik Lituania", "official_name:it"=>"Repubblica di Lituania", "official_name:lt"=>"Lietuvos Respublika", "official_name:lv"=>"Lietuvas Republika", "official_name:pl"=>"Republika Litewska", "official_name:sk"=>"Litovská republika", "official_name:sv"=>"Republiken Litauen", "official_name:vi"=>"Cộng hòa Litva"      \N      67
-mk     "name"=>"Македонија", "name:af"=>"Masedonië", "name:ar"=>"مقدونيا", "name:be"=>"Македонія", "name:br"=>"Makedonia", "name:ca"=>"Macedònia", "name:cy"=>"Gweriniaeth Macedonia", "name:da"=>"Makedonien", "name:de"=>"Mazedonien", "name:en"=>"Macedonia", "name:eo"=>"Makedonio", "name:es"=>"Macedonia", "name:et"=>"Makedoonia", "name:fa"=>"مقدونیه", "name:fi"=>"Makedonia", "name:fr"=>"Macédoine", "name:fy"=>"Massedoanje", "name:ga"=>"An Mhacadóin", "name:gd"=>"Masadoinia", "name:he"=>"מקדוניה", "name:hr"=>"Makedonija", "name:hu"=>"Macedónia", "name:id"=>"Republik Makedonia", "name:is"=>"Makedónía", "name:it"=>"Macedonia", "name:ja"=>"マケドニア", "name:la"=>"Respublica Macedonica", "name:lb"=>"Makedonien", "name:li"=>"Macedonië", "name:lt"=>"Makedonija", "name:lv"=>"Maķedonija", "name:mn"=>"Македон", "name:nl"=>"Macedonië", "name:pl"=>"Macedonia", "name:pt"=>"Macedônia", "name:ru"=>"Македония", "name:sk"=>"Macedónsko", "name:sl"=>"Makedonija", "name:sv"=>"Makedonien", "name:th"=>"ประเทศมาซิโดเนีย", "name:tr"=>"Makedonya", "name:uk"=>"Македонія", "name:vi"=>"Macedonia", "name:zh"=>"马其顿", "name:haw"=>"Repupalika ‘o Makekonia", "name:zh_py"=>"Maqidun", "name:zh_pyt"=>"Mǎqídùn", "official_name"=>"Република Македонија", "official_name:af"=>"Republiek van Masedonië", "official_name:be"=>"Рэспубліка Македонія ", "official_name:br"=>"Republik Makedonia", "official_name:ca"=>"Exrepública Iugoslava de Macedònia", "official_name:en"=>"Republic of Macedonia", "official_name:es"=>"República de Macedonia", "official_name:et"=>"Makedoonia Vabariik", "official_name:fr"=>"République de Macédoine", "official_name:it"=>"Repubblica di Macedonia", "official_name:ja"=>"マケドニア旧ユーゴスラビア共和国", "official_name:lv"=>"Maķedonijas Republika", "official_name:pl"=>"Republika Macedonii", "official_name:pt"=>"República da Macedônia", "official_name:sk"=>"Macedónska republika", "official_name:sl"=>"Republika Makedonija", "official_name:sv"=>"Republiken Makedonien", "official_name:vi"=>"Cộng hòa Macedonia"     \N      69
-ao     "name"=>"Angola", "name:ar"=>"أنغولا", "name:az"=>"Anqola", "name:be"=>"Ангола", "name:br"=>"Angola", "name:ca"=>"Angola", "name:co"=>"Angola", "name:el"=>"Αγκόλα", "name:en"=>"Angola", "name:eo"=>"Angolo", "name:es"=>"Angola", "name:fa"=>"آنگولا", "name:fi"=>"Angola", "name:fr"=>"Angola", "name:fy"=>"Angoala", "name:ga"=>"Angóla", "name:he"=>"אנגולה", "name:hu"=>"Angola", "name:is"=>"Angóla", "name:it"=>"Angola", "name:ja"=>"アンゴラ", "name:la"=>"Angolia", "name:lv"=>"Angola", "name:mn"=>"Ангол", "name:pl"=>"Angola", "name:pt"=>"Angola", "name:ru"=>"Ангола", "name:sv"=>"Angola", "name:th"=>"ประเทศแองโกลา", "name:uk"=>"Ангола", "name:zh"=>"安哥拉", "name:zh_py"=>"Angela", "name:zh_pyt"=>"Āngēlā", "official_name"=>"República de Angola", "official_name:el"=>"Δημοκρατία της Αγκόλας", "official_name:en"=>"Republic of Angola", "official_name:fi"=>"Angolan tasavalta", "official_name:fr"=>"République d'Angola", "official_name:gd"=>"Poblachd Angola", "official_name:id"=>"Republik Angola", "official_name:lb"=>"Republik Angola", "official_name:lt"=>"Angolos Respublika", "official_name:lv"=>"Angolas Republika", "official_name:pt"=>"República de Angola", "official_name:sv"=>"Republiken Angola"   \N      85
+bt     "name"=>"Bhutan", "name:af"=>"Bhoetan", "name:ar"=>"بوتان", "name:be"=>"Бутан", "name:br"=>"Bhoutan", "name:dz"=>"འབྲུག་ཡུལ་", "name:el"=>"Μπουτάν", "name:en"=>"Bhutan", "name:eo"=>"Butano", "name:es"=>"Bután", "name:fa"=>"بوتان", "name:fi"=>"Bhutan", "name:fr"=>"Bhoutan", "name:fy"=>"Bûtan", "name:ga"=>"An Bhútain", "name:gd"=>"Butàn", "name:he"=>"בהוטן", "name:hr"=>"Butan", "name:hu"=>"Bhután", "name:is"=>"Bútan", "name:it"=>"Bhutan", "name:ja"=>"ブータン", "name:la"=>"Butania", "name:li"=>"Bhoetaan", "name:lt"=>"Butanas", "name:lv"=>"Butāna", "name:mn"=>"Бутан", "name:pl"=>"Bhutan", "name:pt"=>"Butão", "name:ru"=>"Бутан", "name:sl"=>"Butan", "name:sv"=>"Bhutan", "name:th"=>"ประเทศภูฏาน", "name:uk"=>"Бутан", "name:zh"=>"不丹", "name:haw"=>"Butana", "name:zh_py"=>"Budan", "name:zh_pyt"=>"Bùdān", "official_name:el"=>"Βασίλειο του Μπουτάν", "official_name:en"=>"Kingdom of Bhutan", "official_name:fi"=>"Bhutanin kuningaskunta", "official_name:it"=>"Regno del Bhutan", "official_name:lt"=>"Butano Karalystė", "official_name:lv"=>"Butānas Karaliste", "official_name:pt"=>"Reino do Butão", "official_name:sv"=>"Konungariket Bhutan", "official_name:vi"=>"Vương quốc Bhutan"       dz      87
+mk     "name"=>"Македонија", "name:af"=>"Masedonië", "name:ar"=>"مقدونيا", "name:be"=>"Македонія", "name:br"=>"Makedonia", "name:ca"=>"Macedònia", "name:cy"=>"Gweriniaeth Macedonia", "name:da"=>"Makedonien", "name:de"=>"Mazedonien", "name:en"=>"Macedonia", "name:eo"=>"Makedonio", "name:es"=>"Macedonia", "name:et"=>"Makedoonia", "name:fa"=>"مقدونیه", "name:fi"=>"Makedonia", "name:fr"=>"Macédoine", "name:fy"=>"Massedoanje", "name:ga"=>"An Mhacadóin", "name:gd"=>"Masadoinia", "name:he"=>"מקדוניה", "name:hr"=>"Makedonija", "name:hu"=>"Macedónia", "name:id"=>"Republik Makedonia", "name:is"=>"Makedónía", "name:it"=>"Macedonia", "name:ja"=>"マケドニア", "name:la"=>"Respublica Macedonica", "name:lb"=>"Makedonien", "name:li"=>"Macedonië", "name:lt"=>"Makedonija", "name:lv"=>"Maķedonija", "name:mn"=>"Македон", "name:nl"=>"Macedonië", "name:pl"=>"Macedonia", "name:pt"=>"Macedônia", "name:ru"=>"Македония", "name:sk"=>"Macedónsko", "name:sl"=>"Makedonija", "name:sv"=>"Makedonien", "name:th"=>"ประเทศมาซิโดเนีย", "name:tr"=>"Makedonya", "name:uk"=>"Македонія", "name:vi"=>"Macedonia", "name:zh"=>"马其顿", "name:haw"=>"Repupalika ‘o Makekonia", "name:zh_py"=>"Maqidun", "name:zh_pyt"=>"Mǎqídùn", "official_name"=>"Република Македонија", "official_name:af"=>"Republiek van Masedonië", "official_name:be"=>"Рэспубліка Македонія ", "official_name:br"=>"Republik Makedonia", "official_name:ca"=>"Exrepública Iugoslava de Macedònia", "official_name:en"=>"Republic of Macedonia", "official_name:es"=>"República de Macedonia", "official_name:et"=>"Makedoonia Vabariik", "official_name:fr"=>"République de Macédoine", "official_name:it"=>"Repubblica di Macedonia", "official_name:ja"=>"マケドニア旧ユーゴスラビア共和国", "official_name:lv"=>"Maķedonijas Republika", "official_name:pl"=>"Republika Macedonii", "official_name:pt"=>"República da Macedônia", "official_name:sk"=>"Macedónska republika", "official_name:sl"=>"Republika Makedonija", "official_name:sv"=>"Republiken Makedonien", "official_name:vi"=>"Cộng hòa Macedonia"     mk      69
 pg     "name"=>"Papua New Guinea", "name:af"=>"Papoea-Nieu-Guinee", "name:ar"=>"بابوا نيوغينيا", "name:be"=>"Папуа-Новая Гвінея ", "name:br"=>"Papoua Ginea Nevez", "name:ca"=>"Papua Nova Guinea", "name:cy"=>"Papua Guinea Newydd", "name:da"=>"Papua Ny Guinea", "name:de"=>"Papua-Neuguinea", "name:en"=>"Papua New Guinea", "name:eo"=>"Papuo-Nov-Gvineo", "name:es"=>"Papúa Nueva Guinea", "name:et"=>"Paapua Uus-Guinea", "name:fa"=>"پاپوآ گینه نو", "name:fi"=>"Papua-Uusi-Guinea", "name:fr"=>"Papouasie-Nouvelle-Guinée", "name:fy"=>"Papoea Nij-Guinea", "name:ga"=>"Nua-Ghuine Phapua", "name:gd"=>"Papua Gini-Nuadh", "name:he"=>"פפואה גינאה החדשה", "name:hr"=>"Papua Nova Gvineja", "name:hu"=>"Pápua Új-Guinea", "name:id"=>"Papua Nugini", "name:is"=>"Papúa Nýja-Gínea", "name:it"=>"Papua Nuova Guinea", "name:la"=>"Papua Nova Guinea", "name:lb"=>"Papua-Neiguinea", "name:li"=>"Papoea-Nui-Guinea", "name:lt"=>"Papua ir Naujoji Gvinėja", "name:lv"=>"Papua-Jaungvineja", "name:mn"=>"Папуа-Шинэ Гвиней", "name:nl"=>"Papoea-Nieuw-Guinea", "name:pl"=>"Papua-Nowa Gwinea", "name:ru"=>"Папуа-Новая Гвинея", "name:sl"=>"Papua Nova Gvineja", "name:sv"=>"Papua Nya Guinea", "name:th"=>"ประเทศปาปัวนิวกินี", "name:tr"=>"Papua -Yeni Gine", "name:uk"=>"Папуа-Нова Гвінея", "name:zh"=>"巴布亚新几内亚", "official_name"=>"Independent State of Papua New Guinea;Independen Stet bilong Papua Niugini", "official_name:es"=>"Estado Independiente de Papúa Nueva Guínea", "official_name:et"=>"Paapua Uus-Guinea Iseseisvusriik", "official_name:lv"=>"Papua-Jaungvinejas Neatkarīgā Valsts", "official_name:pl"=>"Niezależne Państwo Papui-Nowej Gwinei", "official_name:vi"=>"Quốc gia Độc lập Papua New Guinea"      \N      71
 sd     "name"=>"السودان ‎al-Sūdān", "name:af"=>"Soedan", "name:ar"=>"السودان", "name:be"=>"Судан", "name:br"=>"Soudan", "name:ca"=>"Sudan ", "name:cy"=>"Sudan", "name:da"=>"Sudan", "name:de"=>"Sudan", "name:el"=>"Σουδάν", "name:en"=>"Sudan", "name:eo"=>"Sudano", "name:es"=>"Sudán", "name:et"=>"Sudaan", "name:fa"=>"سودان", "name:fi"=>"Sudan", "name:fr"=>"Soudan", "name:fy"=>"Sûdan", "name:ga"=>"An tSúdáin", "name:gd"=>"Sudan", "name:he"=>"סודן", "name:hr"=>"Sudan", "name:hu"=>"Szudán", "name:id"=>"Sudan", "name:is"=>"Súdan", "name:it"=>"Sudan", "name:ja"=>"スーダン", "name:la"=>"Sudania", "name:lb"=>"Sudan", "name:li"=>"Soedaan", "name:lt"=>"Sudanas", "name:lv"=>"Sudāna", "name:mn"=>"Судан", "name:nl"=>"Soedan", "name:pl"=>"Sudan", "name:pt"=>"Sudão", "name:ru"=>"Судан", "name:sl"=>"Sudan", "name:sv"=>"Sudan", "name:th"=>"ประเทศซูดาน", "name:tr"=>"Sudan", "name:uk"=>"Судан", "name:vi"=>"Sudan", "name:zh"=>"苏丹", "name:haw"=>"Sudana", "name:zh_py"=>"Sudan", "name:zh_pyt"=>"Sūdān", "official_name"=>"جمهورية السودان", "official_name:br"=>"Republik Soudan", "official_name:el"=>"Δημοκρατία του Σουδάν", "official_name:en"=>"Republic of Sudan", "official_name:et"=>"Sudaani Vabariik", "official_name:fr"=>"République du Soudan", "official_name:id"=>"Republik Sudan", "official_name:ja"=>"スーダン共和国", "official_name:lb"=>"Republik Sudan", "official_name:pt"=>"República do Sudão", "official_name:sv"=>"Republiken Sudan", "official_name:vi"=>"Cộng hòa Sudan"      \N      72
-ms     "name"=>"Montserrat", "name:ar"=>"مونتسرات", "name:be"=>"Мансерат", "name:br"=>"Montserrat", "name:da"=>"Montserrat", "name:en"=>"Montserrat", "name:eo"=>"Moncerato", "name:es"=>"Montserrat", "name:fa"=>"مونتسرات", "name:fi"=>"Montserrat", "name:fr"=>"Montserrat", "name:ga"=>"Montsarat", "name:he"=>"מונטסראט", "name:hu"=>"Montserrat", "name:is"=>"Montserrat", "name:it"=>"Montserrat", "name:lt"=>"Montseratas", "name:lv"=>"Montserrata", "name:mn"=>"Монтсеррат", "name:pl"=>"Montserrat", "name:ru"=>"Монтсеррат", "name:sv"=>"Montserrat", "name:th"=>"มอนต์เซอร์รัต", "name:uk"=>"Монтсеррат", "name:zh"=>"蒙特塞拉特"    \N      73
-vn     "name"=>"Việt Nam", "name:af"=>"Viëtnam", "name:ar"=>"فييت نام", "name:be"=>"В'етнам", "name:br"=>"Viêt Nam", "name:ca"=>"Vietnam", "name:cy"=>"Fiet Nam", "name:da"=>"Vietnam", "name:de"=>"Vietnam", "name:el"=>"Βιετνάμ", "name:en"=>"Vietnam", "name:eo"=>"Vjetnamio", "name:es"=>"Vietnam", "name:et"=>"Vietnam", "name:fa"=>"ویتنام", "name:fi"=>"Vietnam", "name:fr"=>"Viêt Nam", "name:fy"=>"Fietnam", "name:ga"=>"Vítneam", "name:gd"=>"Bhiet-Nam", "name:he"=>"ויאטנם", "name:hr"=>"Vietnam", "name:hu"=>"Vietnam", "name:hy"=>"Վիետնամ", "name:id"=>"Vietnam", "name:is"=>"Víetnam", "name:it"=>"Vietnam", "name:ja"=>"ベトナム", "name:la"=>"Vietnamia", "name:lb"=>"Vietnam", "name:li"=>"Viëtnam", "name:lt"=>"Vietnamas", "name:lv"=>"Vjetnama", "name:mn"=>"Вьетнам", "name:nl"=>"Vietnam", "name:pl"=>"Wietnam", "name:pt"=>"Vietnã", "name:ru"=>"Вьетнам", "name:sl"=>"Vietnam", "name:sv"=>"Vietnam", "name:th"=>"ประเทศเวียดนาม", "name:tr"=>"Vietnam", "name:uk"=>"В'єтнам", "name:vi"=>"Việt Nam", "name:zh"=>"越南", "name:haw"=>"Wiekanama", "name:zh_py"=>"Yuenan", "name:zh_pyt"=>"Yuènán", "official_name"=>"Cộng Hòa Xã Hội Chủ Nghĩa Việt Nam", "official_name:be"=>"В'етнам ", "official_name:ca"=>"República Socialista del Vietnam", "official_name:el"=>"Σοσιαλιστική Δημοκρατία του Βιετνάμ", "official_name:et"=>"Vietnami Sotsialistlik Vabariik", "official_name:id"=>"Republik Sosialis Vietnam", "official_name:it"=>"Repubblica Socialista del Vietnam", "official_name:ja"=>"ベトナム社会主義共和国", "official_name:lb"=>"Sozialistesch Republik Vietnam", "official_name:pl"=>"Socjalistyczna Republika Wietnamu", "official_name:pt"=>"República Socialista do Vietnã", "official_name:sv"=>"Socialistiska republiken Vietnam"     \N      75
 za     "name"=>"South Africa", "name:af"=>"Suid-Afrika", "name:ar"=>"جنوب أفريقيا", "name:be"=>"Паўднёва-Афрыканская Рэспубліка", "name:br"=>"Suafrika", "name:ca"=>"Sud-àfrica", "name:cy"=>"De Affrica", "name:da"=>"Sydafrika", "name:de"=>"Südafrika", "name:el"=>"Νότια Αφρική", "name:en"=>"South Africa", "name:eo"=>"Sudafriko", "name:es"=>"Sudáfrica", "name:et"=>"Lõuna-Aafrika Vabariik", "name:fa"=>"آفریقای جنوبی", "name:fi"=>"Etelä-Afrikka", "name:fr"=>"Afrique du Sud", "name:fy"=>"Súd-Afrika", "name:ga"=>"An Afraic Theas", "name:gd"=>"Afraga a Deas", "name:he"=>"דרום אפריקה", "name:hr"=>"Južnoafrička Republika", "name:hu"=>"Dél-Afrikai Köztársaság", "name:id"=>"Afrika Selatan", "name:is"=>"Suður-Afríka", "name:it"=>"Sudafrica", "name:ja"=>"南アフリカ", "name:la"=>"Africa Australis", "name:lb"=>"Südafrika", "name:li"=>"Zuud-Afrika", "name:lt"=>"Pietų Afrikos Respublika", "name:mn"=>"Өмнөд Африк", "name:nl"=>"Zuid-Afrika", "name:pl"=>"Republika Południowej Afryki", "name:pt"=>"África do Sul", "name:ru"=>"Южная Африка", "name:sl"=>"Južna Afrika", "name:ss"=>"INingizimu Afrika", "name:st"=>"Afrika Borwa", "name:sv"=>"Sydafrika", "name:th"=>"ประเทศแอฟริกาใต้", "name:tn"=>"Aferika Borwa", "name:tr"=>"Güney Afrika", "name:ts"=>"Afrika-Dzonga", "name:uk"=>"Південно-Африканська Республіка", "name:ve"=>"Afurika Tshipembe", "name:vi"=>"Nam Phi", "name:xh"=>"uMzantsi Afrika", "name:zh"=>"南非", "name:zu"=>"Ningizimu Afrika", "name:haw"=>"ʻApelika Hema", "name:zh_py"=>"Nan Fei", "name:zh_pyt"=>"Nán Fēi", "official_name"=>"Republic of South Africa", "official_name:br"=>"Republik Suafrika", "official_name:en"=>"Republic of South Africa", "official_name:fr"=>"République d'Afrique du Sud", "official_name:gd"=>"Poblachd Afraga a Deas", "official_name:id"=>"Republik Afrika Selatan", "official_name:ja"=>"南アフリカ共和国", "official_name:lb"=>"Republik Südafrika", "official_name:pt"=>"República da África do Sul", "official_name:ru"=>"Южно-Африканская Республика", "official_name:sl"=>"Republika Južna Afrika", "official_name:sv"=>"Republiken Sydafrika", "official_name:ts"=>"Riphabliki ra Afrika Dzonga", "official_name:ve"=>"Riphabuḽiki ya Afurika Tshipembe", "official_name:vi"=>"Cộng hòa Nam Phi"     \N      76
 sc     "name"=>"Seychelles", "name:af"=>"Seychelle", "name:ar"=>"سيشيل", "name:be"=>"Сейшэлы", "name:br"=>"Sechelez", "name:da"=>"Seychellerne", "name:de"=>"Seychellen", "name:el"=>"Σεϋχέλλες", "name:en"=>"Seychelles", "name:eo"=>"Sejŝeloj", "name:es"=>"Seychelles", "name:et"=>"Seišellid", "name:fa"=>"سیشل", "name:fi"=>"Seychellit", "name:fr"=>"Seychelles", "name:fy"=>"de Seysjellen", "name:ga"=>"Na Séiséil", "name:gd"=>"Na h-Eileanan Sheiseall", "name:he"=>"סיישל", "name:hr"=>"Sejšeli", "name:hu"=>"Seychelle-szigetek", "name:is"=>"Seychelles-eyjar", "name:la"=>"Insulae Seisellenses", "name:lb"=>"Seychellen", "name:li"=>"Seisjelle", "name:lt"=>"Seišeliai", "name:mn"=>"Сейшелийн арлууд", "name:nl"=>"Seychellen", "name:pl"=>"Seszele", "name:ru"=>"Сейшелы", "name:sl"=>"Sejšeli", "name:sv"=>"Seychellerna", "name:th"=>"ประเทศเซเชลส์", "name:tr"=>"Seyşeller", "name:uk"=>"Сейшельські Острови", "name:zh"=>"塞舌尔群岛", "name:haw"=>"Sekele", "name:zh_py"=>"Saisheerqundao", "name:zh_pyt"=>"Sàishéěr Qúndǎo", "official_name"=>"Repiblik Sesel", "official_name:el"=>"Δημοκρατία των Σεϋχελλών", "official_name:en"=>"Republic of Seychelles", "official_name:es"=>"República de las Seychelles", "official_name:et"=>"Seišelli Vabariik", "official_name:fr"=>"République des Seychelles", "official_name:gd"=>"Poblachd na h-Eileanan Sheiseall", "official_name:id"=>"Republik Seychelles", "official_name:lt"=>"Seišelių Respublika", "official_name:pl"=>"Republika Seszeli", "official_name:sv"=>"Republiken Seychellerna", "official_name:vi"=>"Cộng hòa Seychelles"     \N      79
-ir     "name"=>"ایران", "name:af"=>"Iran", "name:ar"=>"إيران", "name:az"=>"İran", "name:be"=>"Іран", "name:br"=>"Iran", "name:ca"=>"Iran", "name:cy"=>"Iran", "name:da"=>"Iran", "name:de"=>"Iran", "name:el"=>"Ιράν", "name:en"=>"Iran", "name:eo"=>"Irano", "name:es"=>"Irán", "name:et"=>"Iraan", "name:fa"=>"ایران", "name:fi"=>"Iran", "name:fr"=>"Iran", "name:fy"=>"Iran", "name:ga"=>"An Iaráin", "name:gd"=>"Ioràn", "name:he"=>"אירן", "name:hr"=>"Iran", "name:hu"=>"Irán", "name:hy"=>"Իրան", "name:id"=>"Iran", "name:is"=>"Íran", "name:it"=>"Iran", "name:ja"=>"イラン", "name:la"=>"Irania", "name:lb"=>"Iran", "name:li"=>"Iraan", "name:lt"=>"Iranas", "name:lv"=>"Irāna", "name:mn"=>"Иран", "name:nl"=>"Iran", "name:pl"=>"Iran", "name:pt"=>"Irã", "name:ru"=>"Иран", "name:sl"=>"Iran", "name:sv"=>"Iran", "name:th"=>"ประเทศอิหร่าน", "name:tr"=>"İran", "name:uk"=>"Іран", "name:vi"=>"Iran", "name:zh"=>"伊朗", "name:haw"=>"‘Ilana", "name:zh_py"=>"Yilang", "name:zh_pyt"=>"Yīlǎng", "official_name"=>"جمهوری اسلامی ایران", "official_name:br"=>"Republik Islamek Iran", "official_name:ca"=>"República Islàmica de l'Iran", "official_name:el"=>"Ισλαμική Δημοκρατία του Ιράν", "official_name:en"=>"Islamic Republic of Iran", "official_name:et"=>"Iraani Islamivabariik", "official_name:id"=>"Republik Islam Iran", "official_name:it"=>"Repubblica Islamica dell'Iran", "official_name:ja"=>"イラン・イスラム共和国", "official_name:lb"=>"Islamesch Republik Iran", "official_name:pl"=>"Islamska Republika Iranu", "official_name:pt"=>"República Islâmica do Irã", "official_name:sl"=>"Islamska republika Iran", "official_name:sv"=>"Islamiska republiken Iran", "official_name:vi"=>"Cộng hòa Hồi giáo Iran"    \N      80
-tr     "name"=>"Türkiye", "name:af"=>"Turkye", "name:ar"=>"تركيا", "name:az"=>"Türkiyə", "name:be"=>"Турцыя", "name:br"=>"Turkia", "name:ca"=>"Turquia", "name:cy"=>"Twrci", "name:da"=>"Tyrkiet", "name:de"=>"Türkei", "name:el"=>"Τουρκία", "name:en"=>"Turkey", "name:eo"=>"Turkio", "name:es"=>"Turquía", "name:et"=>"Türgi", "name:fa"=>"ترکیه", "name:fi"=>"Turkki", "name:fr"=>"Turquie", "name:fy"=>"Turkije", "name:ga"=>"An Tuirc", "name:gd"=>"An Tuirc", "name:he"=>"טורקיה", "name:hr"=>"Turska", "name:hu"=>"Törökország", "name:hy"=>"Թուրքիա", "name:id"=>"Turki", "name:is"=>"Tyrkland", "name:it"=>"Turchia", "name:ja"=>"トルコ", "name:la"=>"Turcia", "name:lb"=>"Tierkei", "name:li"=>"Törkieë", "name:lt"=>"Turkija", "name:lv"=>"Turcija", "name:nl"=>"Turkije", "name:no"=>"Tyrkia", "name:pl"=>"Turcja", "name:pt"=>"Turquia", "name:ru"=>"Турция", "name:sk"=>"Turecko", "name:sl"=>"Turčija", "name:sv"=>"Turkiet", "name:th"=>"ประเทศตุรกี", "name:tr"=>"Türkiye", "name:uk"=>"Турція", "name:vi"=>"Thổ Nhĩ Kỳ", "name:zh"=>"土耳其", "name:haw"=>"Tureke", "name:zh_py"=>"Tuerqi", "name:zh_pyt"=>"Tǔěrqí", "official_name"=>"Türkiye Cumhuriyeti", "official_name:br"=>"Republik Turkia", "official_name:es"=>"República de Turquía", "official_name:et"=>"Türgi Vabariik", "official_name:id"=>"Republik Turki", "official_name:it"=>"Repubblica di Turchia", "official_name:lb"=>"Republik Tierkei", "official_name:lv"=>"Turcijas Republika", "official_name:pl"=>"Republika Turcji", "official_name:pt"=>"República da Turquia", "official_name:sk"=>"Turecká republika", "official_name:sv"=>"Republiken Turkiet", "official_name:vi"=>"Cộng hoà Thổ Nhĩ Kỳ" \N      81
 sz     "name"=>"Swaziland", "name:ar"=>"سوازيلند", "name:be"=>"Свазіленд", "name:br"=>"Swaziland", "name:ca"=>"Swazilàndia", "name:cy"=>"Gwlad Swazi", "name:de"=>"Swasiland", "name:el"=>"Σουαζιλάνδη", "name:eo"=>"Svazilando", "name:es"=>"Suazilandia", "name:et"=>"Svaasimaa", "name:fa"=>"سوازیلند", "name:fi"=>"Swazimaa", "name:fr"=>"Swaziland", "name:fy"=>"Swazilân", "name:ga"=>"An tSuasalainn", "name:gd"=>"Suasalainn", "name:he"=>"סווזילנד", "name:hr"=>"Svazi", "name:hu"=>"Szváziföld", "name:is"=>"Svasíland", "name:it"=>"Swaziland", "name:ja"=>"スワジランド", "name:la"=>"Suazia", "name:lb"=>"Swasiland", "name:lt"=>"Svazilendas", "name:mn"=>"Свазиланд", "name:pl"=>"Suazi", "name:pt"=>"Suazilândia", "name:ru"=>"Свазиленд", "name:sl"=>"Svazi", "name:sv"=>"Swaziland", "name:th"=>"ประเทศสวาซิแลนด์", "name:tr"=>"Svaziland", "name:uk"=>"Свазіленд", "name:zh"=>"斯威士兰", "name:haw"=>"Suazilana", "name:zh_py"=>"Siweishilan", "name:zh_pyt"=>"Sīwēishìlán", "official_name"=>"Kingdom of Swaziland;Umbuso weSwatini", "official_name:ca"=>"Regne de Swazilàndia", "official_name:el"=>"Βασίλειο της Σουαζιλάνδης", "official_name:et"=>"Svaasimaa Kuningriik", "official_name:gd"=>"Dùthaich nan Suasaidh", "official_name:id"=>"Kerajaan Swaziland", "official_name:ja"=>"スワジランド王国", "official_name:lb"=>"Kinneksräich Swasiland", "official_name:pt"=>"Reino da Suazilândia", "official_name:sl"=>"Kraljevina Svazi", "official_name:sv"=>"Konungariket Swaziland", "official_name:vi"=>"Vương quốc Swaziland"        \N      82
-ae     "name"=>"United Arab Emirates", "name:af"=>"Verenigde Arabiese Emirate", "name:ar"=>"الإمارات العربية المتحدة", "name:br"=>"Emirelezhioù Arab Unanet", "name:ca"=>"Emirats Àrabs Units", "name:cy"=>"Yr Emiradau Arabaidd Unedig", "name:da"=>"Forenede Arabiske Emirater", "name:de"=>"Vereinigte Arabische Emirate", "name:el"=>"Ηνωμένα Αραβικά Εμιράτα", "name:en"=>"United Arab Emirates", "name:eo"=>"Unuiĝintaj Arabaj Emirlandoj", "name:es"=>"Emiratos Árabes Unidos", "name:et"=>"Araabia Ühendemiraadid", "name:fa"=>"امارات متحده عربی", "name:fi"=>"Yhdistyneet arabiemiirikunnat", "name:fr"=>"Emirats Arabes Unis", "name:fy"=>"de Feriene Arabyske Emiraten", "name:ga"=>"Aontas na nÉimíríochtaí Arabacha", "name:gd"=>"Na h-Iomaratan Arabach Aonaichte", "name:he"=>"איחוד האמירויות הערביות", "name:hr"=>"Ujedinjeni Arapski Emirati", "name:hu"=>"Egyesült Arab Emírségek", "name:id"=>"Uni Emirat Arab", "name:is"=>"Sameinuðu arabísku furstadæmin", "name:it"=>"Emirati Arabi Uniti", "name:ja"=>"アラブ首長国連邦", "name:la"=>"Phylarchiarum Arabicarum Confoederatio", "name:lb"=>"Vereenegt Arabesch Emirater", "name:li"=>"Vereinegde Arabische Emirate", "name:lt"=>"Jungtiniai Arabų Emyratai", "name:mn"=>"Арабын Нэгдсэн Эмирт Улс", "name:nl"=>"Verenigde Arabische Emiraten", "name:pl"=>"Zjednoczone Emiraty Arabskie", "name:pt"=>"Emirados Árabes Unidos", "name:ru"=>"Объединённые Арабские Эмираты", "name:sl"=>"Združeni arabski emirati", "name:sv"=>"Förenade Arabemiraten", "name:th"=>"สหรัฐอาหรับเอมิเรตส์", "name:tr"=>"Birleşik Arap Emirlikleri", "name:uk"=>"Об'єднані Арабські Емірати", "name:vi"=>"Các Tiểu vương quốc Ả Rập Thống nhất", "name:zh"=>"阿拉伯联合酋长国", "name:zh_py"=>"Alabo Lianhe Qiuchangguo", "name:zh_pyt"=>"Ālābó Liánhé Qiúchángguó"      \N      83
-bn     "name"=>"Brunei Darussalam", "name:af"=>"Broenei", "name:ar"=>"بروني دار السلام", "name:be"=>"Бруней", "name:br"=>"Brunei", "name:cy"=>"Brunei", "name:da"=>"Brunei", "name:el"=>"Μπρουνέι", "name:en"=>"Brunei Darussalam", "name:eo"=>"Brunejo", "name:es"=>"Brunéi", "name:et"=>"Brunei", "name:eu"=>"Brunei", "name:fa"=>"برونئی", "name:fi"=>"Brunei", "name:fr"=>"Brunei", "name:fy"=>"Brûnei", "name:ga"=>"Brúiné", "name:gd"=>"Brùnaidh", "name:he"=>"ברוניי", "name:hr"=>"Burneji", "name:hu"=>"Brunei", "name:id"=>"Brunei", "name:is"=>"Brúnei", "name:it"=>"Brunei", "name:la"=>"Bruneium", "name:lb"=>"Brunei", "name:li"=>"Broenai", "name:lt"=>"Brunėjaus Darusalamas", "name:lv"=>"Bruneja", "name:mn"=>"Бруней", "name:nl"=>"Brunei", "name:pl"=>"Brunei", "name:pt"=>"Brunei", "name:ru"=>"Бруней-Даруссалам", "name:sl"=>"Brunej", "name:sv"=>"Brunei", "name:th"=>"ประเทศบรูไนดารุสซาลาม", "name:tr"=>"Bruney", "name:uk"=>"Бруней", "name:vi"=>"Brunei", "name:zh"=>"文莱", "name:haw"=>"Brunei", "name:zh_py"=>"Wenlai", "name:zh_pyt"=>"Wénlái", "official_name:fi"=>"Brunei Darussalamin valtio", "official_name:lv"=>"Brunejas Darusalamas Valsts", "official_name:pl"=>"Państwo Brunei Darussalam", "official_name:pt"=>"Estado do Brunei Darussalam", "official_name:sv"=>"Brunei Darussalam", "official_name:vi"=>"Vương quốc Hồi giáo Brunei"     \N      86
-cl     "name"=>"Chile", "name:af"=>"Chili", "name:ar"=>"شيلي", "name:be"=>"Чылі", "name:br"=>"Chile", "name:ca"=>"Xile", "name:el"=>"Χιλή", "name:en"=>"Chile", "name:eo"=>"Ĉilio", "name:et"=>"Tšiili", "name:eu"=>"Txile", "name:fa"=>"شیلی", "name:fi"=>"Chile", "name:fr"=>"Chili", "name:fy"=>"Sily", "name:ga"=>"An tSile", "name:gd"=>"An t-Sile", "name:he"=>"צילה", "name:hr"=>"Čile", "name:hu"=>"Chile", "name:id"=>"Chili", "name:is"=>"Chile", "name:it"=>"Cile", "name:ja"=>"チリ", "name:la"=>"Chilia", "name:li"=>"Chili", "name:lt"=>"Čilė", "name:lv"=>"Čīle", "name:mn"=>"Чили", "name:nl"=>"Chili", "name:pl"=>"Chile", "name:pt"=>"Chile", "name:ru"=>"Чили", "name:sl"=>"Čile", "name:sv"=>"Chile", "name:th"=>"ประเทศชิลี", "name:tr"=>"Şili", "name:uk"=>"Чілі", "name:zh"=>"智利", "official_name"=>"República de Chile", "official_name:el"=>"Δημοκρατία της Χιλής", "official_name:en"=>"Republic of Chile", "official_name:gd"=>"Poblachd na Sile", "official_name:it"=>"Repubblica del Cile", "official_name:ja"=>"チリ共和国", "official_name:lb"=>"Republik Chile", "official_name:lt"=>"Čilės Respublika", "official_name:lv"=>"Čīles Republika", "official_name:pl"=>"Republika Chile", "official_name:pt"=>"República do Chile", "official_name:sv"=>"Republiken Chile", "official_name:vi"=>"Cộng hoà Chile"       \N      88
-cv     "name"=>"Cabo Verde", "name:af"=>"Kaap Verde", "name:ar"=>"الرأس الأخضر", "name:be"=>"Каба-Вердэ", "name:br"=>"Kab Glas", "name:ca"=>"Cap Verd", "name:cy"=>"Cabo Verde", "name:da"=>"Kap Verde", "name:de"=>"Kap Verde", "name:el"=>"Πράσινο Ακρωτήριο", "name:en"=>"Cape Verde", "name:eo"=>"Kabo-Verdo", "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-Fok", "name:id"=>"Tanjung Verde", "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:mn"=>"Кабо-Верде", "name:nl"=>"Kaapverdië", "name:pl"=>"Wyspy Zielonego Przylądka", "name:ru"=>"Кабо-Верде", "name:sl"=>"Zelenortski otoki", "name:sv"=>"Kap Verde", "name:th"=>"ประเทศเคปเวิร์ด", "name:tr"=>"Yeşil Burun Adaları", "name:uk"=>"Кабо-Верде", "name:zh"=>"佛得角", "official_name"=>"República de Cabo Verde", "official_name:be"=>"Рэспубліка Каба-Вердэ", "official_name:de"=>"Republik Kap Verde", "official_name:el"=>"Δημοκρατία του Πράσινου Ακρωτηρίου", "official_name:en"=>"Republic of Cape Verde", "official_name:es"=>"República de Cabo Verde", "official_name:he"=>"רפובליקת כֵּף וֶרְדֶּה", "official_name:lt"=>"Žaliojo Kyšulio Respublika", "official_name:lv"=>"Kaboverdes Republika", "official_name:pl"=>"Republika Zielonego Przylądka", "official_name:sl"=>"Republika Zelenortski otoki", "official_name:sv"=>"Republiken Kap Verde", "official_name:vi"=>"Cộng hòa Cabo Verde"   \N      89
+ae     "name"=>"United Arab Emirates", "name:af"=>"Verenigde Arabiese Emirate", "name:ar"=>"الإمارات العربية المتحدة", "name:br"=>"Emirelezhioù Arab Unanet", "name:ca"=>"Emirats Àrabs Units", "name:cy"=>"Yr Emiradau Arabaidd Unedig", "name:da"=>"Forenede Arabiske Emirater", "name:de"=>"Vereinigte Arabische Emirate", "name:el"=>"Ηνωμένα Αραβικά Εμιράτα", "name:en"=>"United Arab Emirates", "name:eo"=>"Unuiĝintaj Arabaj Emirlandoj", "name:es"=>"Emiratos Árabes Unidos", "name:et"=>"Araabia Ühendemiraadid", "name:fa"=>"امارات متحده عربی", "name:fi"=>"Yhdistyneet arabiemiirikunnat", "name:fr"=>"Emirats Arabes Unis", "name:fy"=>"de Feriene Arabyske Emiraten", "name:ga"=>"Aontas na nÉimíríochtaí Arabacha", "name:gd"=>"Na h-Iomaratan Arabach Aonaichte", "name:he"=>"איחוד האמירויות הערביות", "name:hr"=>"Ujedinjeni Arapski Emirati", "name:hu"=>"Egyesült Arab Emírségek", "name:id"=>"Uni Emirat Arab", "name:is"=>"Sameinuðu arabísku furstadæmin", "name:it"=>"Emirati Arabi Uniti", "name:ja"=>"アラブ首長国連邦", "name:la"=>"Phylarchiarum Arabicarum Confoederatio", "name:lb"=>"Vereenegt Arabesch Emirater", "name:li"=>"Vereinegde Arabische Emirate", "name:lt"=>"Jungtiniai Arabų Emyratai", "name:mn"=>"Арабын Нэгдсэн Эмирт Улс", "name:nl"=>"Verenigde Arabische Emiraten", "name:pl"=>"Zjednoczone Emiraty Arabskie", "name:pt"=>"Emirados Árabes Unidos", "name:ru"=>"Объединённые Арабские Эмираты", "name:sl"=>"Združeni arabski emirati", "name:sv"=>"Förenade Arabemiraten", "name:th"=>"สหรัฐอาหรับเอมิเรตส์", "name:tr"=>"Birleşik Arap Emirlikleri", "name:uk"=>"Об'єднані Арабські Емірати", "name:vi"=>"Các Tiểu vương quốc Ả Rập Thống nhất", "name:zh"=>"阿拉伯联合酋长国", "name:zh_py"=>"Alabo Lianhe Qiuchangguo", "name:zh_pyt"=>"Ālābó Liánhé Qiúchángguó"      ar      83
+tr     "name"=>"Türkiye", "name:af"=>"Turkye", "name:ar"=>"تركيا", "name:az"=>"Türkiyə", "name:be"=>"Турцыя", "name:br"=>"Turkia", "name:ca"=>"Turquia", "name:cy"=>"Twrci", "name:da"=>"Tyrkiet", "name:de"=>"Türkei", "name:el"=>"Τουρκία", "name:en"=>"Turkey", "name:eo"=>"Turkio", "name:es"=>"Turquía", "name:et"=>"Türgi", "name:fa"=>"ترکیه", "name:fi"=>"Turkki", "name:fr"=>"Turquie", "name:fy"=>"Turkije", "name:ga"=>"An Tuirc", "name:gd"=>"An Tuirc", "name:he"=>"טורקיה", "name:hr"=>"Turska", "name:hu"=>"Törökország", "name:hy"=>"Թուրքիա", "name:id"=>"Turki", "name:is"=>"Tyrkland", "name:it"=>"Turchia", "name:ja"=>"トルコ", "name:la"=>"Turcia", "name:lb"=>"Tierkei", "name:li"=>"Törkieë", "name:lt"=>"Turkija", "name:lv"=>"Turcija", "name:nl"=>"Turkije", "name:no"=>"Tyrkia", "name:pl"=>"Turcja", "name:pt"=>"Turquia", "name:ru"=>"Турция", "name:sk"=>"Turecko", "name:sl"=>"Turčija", "name:sv"=>"Turkiet", "name:th"=>"ประเทศตุรกี", "name:tr"=>"Türkiye", "name:uk"=>"Турція", "name:vi"=>"Thổ Nhĩ Kỳ", "name:zh"=>"土耳其", "name:haw"=>"Tureke", "name:zh_py"=>"Tuerqi", "name:zh_pyt"=>"Tǔěrqí", "official_name"=>"Türkiye Cumhuriyeti", "official_name:br"=>"Republik Turkia", "official_name:es"=>"República de Turquía", "official_name:et"=>"Türgi Vabariik", "official_name:id"=>"Republik Turki", "official_name:it"=>"Repubblica di Turchia", "official_name:lb"=>"Republik Tierkei", "official_name:lv"=>"Turcijas Republika", "official_name:pl"=>"Republika Turcji", "official_name:pt"=>"República da Turquia", "official_name:sk"=>"Turecká republika", "official_name:sv"=>"Republiken Turkiet", "official_name:vi"=>"Cộng hoà Thổ Nhĩ Kỳ" tr      81
 et     "name"=>"Ethiopia", "name:af"=>"Ethiopië", "name:am"=>"ኢትዮጵያ", "name:ar"=>"إثيوبيا", "name:be"=>"Эфіопія", "name:br"=>"Etiopia", "name:ca"=>"Etiòpia", "name:da"=>"Etiopien", "name:de"=>"Äthiopien", "name:el"=>"Αιθιοπία", "name:en"=>"Ethiopia", "name:eo"=>"Etiopio", "name:es"=>"Etiopía", "name:et"=>"Etioopia", "name:eu"=>"Etiopia", "name:fa"=>"اتیوپی", "name:fi"=>"Etiopia", "name:fr"=>"Éthiopie", "name:fy"=>"Etioopje", "name:ga"=>"An Aetóip", "name:gd"=>"An Aetiòp", "name:he"=>"אתיופיה", "name:hr"=>"Etiopija", "name:hu"=>"Etiópia", "name:is"=>"Eþíópía", "name:it"=>"Etiopia", "name:ja"=>"エチオピア", "name:la"=>"Aethiopia", "name:lb"=>"Ethiopien", "name:li"=>"Ethiopië", "name:lt"=>"Etiopija", "name:lv"=>"Etiopija", "name:mn"=>"Этиоп", "name:nl"=>"Ethiopië", "name:pl"=>"Etiopia", "name:pt"=>"Etiópia", "name:ru"=>"Эфиопия", "name:sl"=>"Etiopija", "name:sv"=>"Etiopien", "name:th"=>"ประเทศเอธิโอเปีย", "name:tr"=>"Etiyopya", "name:uk"=>"Ефіопія", "name:zh"=>"埃塞俄比亚", "old_name"=>"Abyssinia", "name:zh_py"=>"Aisaiebiya", "name:zh_pyt"=>"Āisàiébǐyà", "official_name"=>"Federal Democratic Republic of Ethiopia", "official_name:af"=>"Federale Demokratiese Republiek Ethiopië", "official_name:be"=>"Федэратыўная Дэмакратычная Рэспубліка Эфіопія", "official_name:el"=>"Ομοσπονδιακή Δημοκρατία της Αιθιοπίας", "official_name:en"=>"Federal Democratic Republic of Ethiopia", "official_name:id"=>"Republik Demokratik Federal Ethiopia", "official_name:lb"=>"Bundesrepublik Ethiopien", "official_name:lt"=>"Etiopijos Federacinė Demokratinė Respublika", "official_name:lv"=>"Etiopijas Federatīvā Demokrātiskā Republika", "official_name:pt"=>"República Democrática Federal da Etiópia", "official_name:sv"=>"Demokratiska förbundsrepubliken Etiopien", "official_name:vi"=>"Cộng hòa Dân chủ Liên bang Ethiopia"       \N      90
-mz     "name"=>"Mozambique", "name:af"=>"Mosambiek", "name:ar"=>"موزمبيق", "name:be"=>"Мазамбік", "name:br"=>"Mozambik", "name:cy"=>"Mosambic", "name:de"=>"Mosambik", "name:el"=>"Μοζαμβίκη", "name:en"=>"Mozambique", "name:eo"=>"Mozambiko", "name:es"=>"Mozambique", "name:et"=>"Mosambiik", "name:fa"=>"موزامبیک", "name:fi"=>"Mosambik", "name:fr"=>"Mozambique", "name:fy"=>"Mozambyk", "name:ga"=>"Mósaimbíc", "name:gd"=>"Mòsaimbic", "name:he"=>"מוזמביק", "name:hr"=>"Mozambik", "name:hu"=>"Mozambik", "name:id"=>"Mozambik", "name:is"=>"Mósambík", "name:it"=>"Mozambico", "name:la"=>"Mozambicum", "name:lb"=>"Mosambik", "name:li"=>"Mozambiek", "name:lt"=>"Mozambikas", "name:lv"=>"Mozambika", "name:mn"=>"Мозамбик", "name:pl"=>"Mozambik", "name:pt"=>"Moçambique", "name:ru"=>"Мозамбик", "name:sl"=>"Mozambik", "name:sv"=>"Moçambique", "name:th"=>"ประเทศโมซัมบิก", "name:tr"=>"Mozambik", "name:uk"=>"Мозамбік", "name:zh"=>"莫桑比克", "name:haw"=>"Mozamabika", "name:zh_py"=>"Mosangbike", "name:zh_pyt"=>"Mòsāngbǐkè", "official_name"=>"República de Moçambique;République du Mozambique", "official_name:el"=>"Δημοκρατία της Μοζαμβίκης", "official_name:gd"=>"Poblachd Mhòsaimbic", "official_name:id"=>"Republik Mozambik", "official_name:lt"=>"Mozambiko Respublika", "official_name:lv"=>"Mozambikas Republika", "official_name:sv"=>"Republiken Moçambique", "official_name:vi"=>"Cộng hòa Mozambique" \N      98
-hr     "name"=>"Hrvatska", "name:af"=>"Kroasië", "name:ar"=>"كرواتيا", "name:be"=>"Харватыя", "name:br"=>"Kroatia", "name:ca"=>"Croàcia", "name:cy"=>"Croatia", "name:da"=>"Kroatien", "name:de"=>"Kroatien", "name:el"=>"Κροατία", "name:en"=>"Croatia", "name:eo"=>"Kroatio", "name:es"=>"Croacia", "name:et"=>"Horvaatia", "name:fa"=>"کرواسی", "name:fi"=>"Kroatia", "name:fr"=>"Croatie", "name:fy"=>"Kroaasje", "name:ga"=>"An Chróit", "name:gd"=>"Croàisia", "name:he"=>"קרואטיה", "name:hu"=>"Horvátország", "name:hy"=>"Խորվաթիա", "name:id"=>"Kroasia", "name:is"=>"Króatía", "name:it"=>"Croazia", "name:ja"=>"クロアチア", "name:la"=>"Croatia", "name:lb"=>"Kroatien", "name:li"=>"Kroatië", "name:lt"=>"Kroatija", "name:lv"=>"Horvātija", "name:mn"=>"Хорват", "name:nl"=>"Kroatië", "name:pl"=>"Chorwacja", "name:pt"=>"Croácia", "name:ru"=>"Хорватия", "name:sk"=>"Chorvátsko", "name:sl"=>"Hrvaška", "name:sv"=>"Kroatien", "name:th"=>"ประเทศโครเอเชีย", "name:tr"=>"Hırvatistan", "name:uk"=>"Хорватія", "name:vi"=>"Croatia", "name:zh"=>"克罗地亚", "name:haw"=>"Koloatia", "name:zh_py"=>"Keluodiya", "name:zh_pyt"=>"Kèluódìyà", "official_name"=>"Republika Hrvatska", "official_name:be"=>"Рэспубліка Харватыя", "official_name:en"=>"Republic of Croatia", "official_name:es"=>"República de Croacia", "official_name:et"=>"Horvaatia Vabariik", "official_name:id"=>"Republik Kroasia", "official_name:lt"=>"Kroatijos Respublika", "official_name:lv"=>"Horvātijas Republika", "official_name:pl"=>"Republika Chorwacji", "official_name:pt"=>"República da Croácia", "official_name:sk"=>"Chorvátska republika", "official_name:sv"=>"Republiken Kroatien", "official_name:vi"=>"Cộng hòa Croatia"        \N      92
+cl     "name"=>"Chile", "name:af"=>"Chili", "name:ar"=>"شيلي", "name:be"=>"Чылі", "name:br"=>"Chile", "name:ca"=>"Xile", "name:el"=>"Χιλή", "name:en"=>"Chile", "name:eo"=>"Ĉilio", "name:et"=>"Tšiili", "name:eu"=>"Txile", "name:fa"=>"شیلی", "name:fi"=>"Chile", "name:fr"=>"Chili", "name:fy"=>"Sily", "name:ga"=>"An tSile", "name:gd"=>"An t-Sile", "name:he"=>"צילה", "name:hr"=>"Čile", "name:hu"=>"Chile", "name:id"=>"Chili", "name:is"=>"Chile", "name:it"=>"Cile", "name:ja"=>"チリ", "name:la"=>"Chilia", "name:li"=>"Chili", "name:lt"=>"Čilė", "name:lv"=>"Čīle", "name:mn"=>"Чили", "name:nl"=>"Chili", "name:pl"=>"Chile", "name:pt"=>"Chile", "name:ru"=>"Чили", "name:sl"=>"Čile", "name:sv"=>"Chile", "name:th"=>"ประเทศชิลี", "name:tr"=>"Şili", "name:uk"=>"Чілі", "name:zh"=>"智利", "official_name"=>"República de Chile", "official_name:el"=>"Δημοκρατία της Χιλής", "official_name:en"=>"Republic of Chile", "official_name:gd"=>"Poblachd na Sile", "official_name:it"=>"Repubblica del Cile", "official_name:ja"=>"チリ共和国", "official_name:lb"=>"Republik Chile", "official_name:lt"=>"Čilės Respublika", "official_name:lv"=>"Čīles Republika", "official_name:pl"=>"Republika Chile", "official_name:pt"=>"República do Chile", "official_name:sv"=>"Republiken Chile", "official_name:vi"=>"Cộng hoà Chile"       es      88
+mz     "name"=>"Mozambique", "name:af"=>"Mosambiek", "name:ar"=>"موزمبيق", "name:be"=>"Мазамбік", "name:br"=>"Mozambik", "name:cy"=>"Mosambic", "name:de"=>"Mosambik", "name:el"=>"Μοζαμβίκη", "name:en"=>"Mozambique", "name:eo"=>"Mozambiko", "name:es"=>"Mozambique", "name:et"=>"Mosambiik", "name:fa"=>"موزامبیک", "name:fi"=>"Mosambik", "name:fr"=>"Mozambique", "name:fy"=>"Mozambyk", "name:ga"=>"Mósaimbíc", "name:gd"=>"Mòsaimbic", "name:he"=>"מוזמביק", "name:hr"=>"Mozambik", "name:hu"=>"Mozambik", "name:id"=>"Mozambik", "name:is"=>"Mósambík", "name:it"=>"Mozambico", "name:la"=>"Mozambicum", "name:lb"=>"Mosambik", "name:li"=>"Mozambiek", "name:lt"=>"Mozambikas", "name:lv"=>"Mozambika", "name:mn"=>"Мозамбик", "name:pl"=>"Mozambik", "name:pt"=>"Moçambique", "name:ru"=>"Мозамбик", "name:sl"=>"Mozambik", "name:sv"=>"Moçambique", "name:th"=>"ประเทศโมซัมบิก", "name:tr"=>"Mozambik", "name:uk"=>"Мозамбік", "name:zh"=>"莫桑比克", "name:haw"=>"Mozamabika", "name:zh_py"=>"Mosangbike", "name:zh_pyt"=>"Mòsāngbǐkè", "official_name"=>"República de Moçambique;République du Mozambique", "official_name:el"=>"Δημοκρατία της Μοζαμβίκης", "official_name:gd"=>"Poblachd Mhòsaimbic", "official_name:id"=>"Republik Mozambik", "official_name:lt"=>"Mozambiko Respublika", "official_name:lv"=>"Mozambikas Republika", "official_name:sv"=>"Republiken Moçambique", "official_name:vi"=>"Cộng hòa Mozambique" pt      98
 py     "name"=>"Paraguay", "name:ar"=>"باراغواي", "name:be"=>"Парагвай", "name:br"=>"Paraguay", "name:ca"=>"Paraguai", "name:da"=>"Paraguay", "name:el"=>"Παραγουάη", "name:en"=>"Paraguay", "name:eo"=>"Paragvajo", "name:fa"=>"پاراگوئه", "name:fi"=>"Paraguay", "name:fr"=>"Paraguay", "name:ga"=>"Paragua", "name:gd"=>"Paraguaidh", "name:he"=>"פראגואי", "name:hr"=>"Paragvaj", "name:hu"=>"Paraguay", "name:is"=>"Paragvæ", "name:ja"=>"パラグアイ", "name:la"=>"Paraguaia", "name:lt"=>"Paragvajus", "name:lv"=>"Paragvaja", "name:mn"=>"Парагвай", "name:pl"=>"Paragwaj", "name:ru"=>"Парагвай", "name:sl"=>"Paragvaj", "name:sv"=>"Paraguay", "name:th"=>"ประเทศปารากวัย", "name:uk"=>"Парагвай", "name:zh"=>"巴拉圭", "official_name"=>"República del Paraguay", "official_name:el"=>"Δημοκρατία της Παραγουάης", "official_name:gd"=>"Poblachd Pharaguaidh", "official_name:id"=>"Republik Paraguay", "official_name:lt"=>"Paragvajaus Respublika", "official_name:lv"=>"Paragvajas Republika", "official_name:pl"=>"Republika Paragwaju", "official_name:sv"=>"Republiken Paraguay"  \N      101
 lk     "name"=>"Sri Lanka", "name:ar"=>"سري لنكا", "name:be"=>"Шры-Ланка", "name:br"=>"Sri Lanka", "name:da"=>"Sri Lanka", "name:el"=>"Σρι Λάνκα", "name:en"=>"Sri Lanka", "name:eo"=>"Sri-Lanko", "name:fa"=>"سری‌لانکا", "name:fi"=>"Sri Lanka", "name:fr"=>"Sri Lanka", "name:fy"=>"Sry Lanka", "name:ga"=>"Srí Lanca", "name:gd"=>"Sri Lanca", "name:he"=>"סרי לנקה", "name:hu"=>"Srí Lanka", "name:is"=>"Srí Lanka", "name:it"=>"Sri Lanka", "name:ja"=>"スリランカ", "name:la"=>"Taprobane", "name:lt"=>"Šri Lanka", "name:lv"=>"Šrilanka", "name:mn"=>"Шри-Ланка", "name:pl"=>"Sri Lanka", "name:pt"=>"Sri Lanka", "name:ru"=>"Шри-Ланка", "name:sl"=>"Šrilanka", "name:sv"=>"Sri Lanka", "name:th"=>"ประเทศศรีลังกา", "name:tr"=>"Sri Lanka", "name:uk"=>"Шрі-Ланка", "name:zh"=>"斯里兰卡", "name:haw"=>"Sililanaka", "name:zh_py"=>"Sililanka", "name:zh_pyt"=>"Sīlǐlánkǎ", "official_name:br"=>"Republik Demokratel ha Sokialour Sri Lanka", "official_name:el"=>"Λαϊκή Σοσιαλιστική Δημοκρατία της Σρι Λάνκα", "official_name:gd"=>"Poblachd shòisealach dheomacrasach Sri Lanca", "official_name:id"=>"Republik Sosialis Demokratik Sri Lanka", "official_name:it"=>"Repubblica Democratica Socialista dello Sri Lanka", "official_name:lb"=>"Demokratesch Sozialistesch Republik Sri Lanka", "official_name:lv"=>"Šrilankas Demokrātiskā Sociālistiskā Republika", "official_name:pl"=>"Demokratyczno-Socjalistyczna Republika Sri Lanki", "official_name:pt"=>"República DemocráticaSocial do Sri Lanka", "official_name:sv"=>"Demokratiska socialistiska republiken Sri Lanka", "official_name:vi"=>"Cộng hòa Dân chủ Xã hội chủ nghĩa Sri Lanka"     \N      95
-mv     "name"=>"Maldives", "name:af"=>"Maldive", "name:ar"=>"ملديف", "name:be"=>"Мальдзівы", "name:br"=>"Maldivez", "name:da"=>"Maldiverne", "name:de"=>"Malediven", "name:el"=>"Μαλδίβες", "name:en"=>"Maldives", "name:eo"=>"Maldivoj", "name:es"=>"Maldivas", "name:et"=>"Maldiivid", "name:fa"=>"مالدیو", "name:fi"=>"Malediivit", "name:fr"=>"Maldives", "name:fy"=>"de Maldiven", "name:ga"=>"Oileáin Mhaildíve", "name:gd"=>"Na h-Eileanan Mhaladaibh", "name:he"=>"האיים המלדיביים", "name:hr"=>"Maldivi", "name:hu"=>"Maldív-szigetek", "name:id"=>"Maladewa", "name:is"=>"Maldíveyjar", "name:it"=>"Maldive", "name:la"=>"Insulae Maldivae", "name:lb"=>"Malediven", "name:lt"=>"Maldyvai", "name:lv"=>"Maldīvija", "name:mn"=>"Мальдив", "name:nl"=>"Malediven", "name:pl"=>"Malediwy", "name:ru"=>"Мальдивы", "name:sl"=>"Maldivi", "name:sv"=>"Maldiverna", "name:th"=>"ประเทศมัลดีฟส์", "name:tr"=>"Maldivler", "name:uk"=>"Мальдіви", "name:zh"=>"马尔代夫", "name:haw"=>"Maladiwa", "name:zh_py"=>"Maerdaifu", "name:zh_pyt"=>"Mǎěrdàifū", "official_name:et"=>"Maldiivi Vabariik", "official_name:id"=>"Republik Maladewa", "official_name:it"=>"Repubblica delle Maledive", "official_name:lb"=>"Republik Malediven", "official_name:lt"=>"Maldyvų Respublika", "official_name:lv"=>"Maldīvijas Republika", "official_name:pl"=>"Republika Malediwów", "official_name:sv"=>"Republiken Maldiverna"      \N      96
 mw     "name"=>"Malawi", "name:ar"=>"ملاوي", "name:be"=>"Малаві", "name:br"=>"Malawi", "name:el"=>"Μαλάουι", "name:en"=>"Malawi", "name:eo"=>"Malavio", "name:es"=>"Malaui", "name:fa"=>"مالاوی", "name:fi"=>"Malawi", "name:fr"=>"Malawi", "name:fy"=>"Malawy", "name:ga"=>"An Mhaláiv", "name:gd"=>"Malabhaidh", "name:he"=>"מלאווי", "name:hr"=>"Malavi", "name:hu"=>"Malawi", "name:is"=>"Malaví", "name:it"=>"Malawi", "name:ja"=>"マラウイ", "name:la"=>"Malavium", "name:lt"=>"Malavis", "name:lv"=>"Malāvija", "name:mn"=>"Малави", "name:pl"=>"Malawi", "name:ru"=>"Малави", "name:sl"=>"Malavi", "name:sv"=>"Malawi", "name:th"=>"ประเทศมาลาวี", "name:tr"=>"Malavi", "name:uk"=>"Малаві", "name:zh"=>"马拉维", "name:haw"=>"Malaui", "name:zh_py"=>"Malawei", "name:zh_pyt"=>"Mǎlāwéi", "official_name"=>"Republic of Malaŵi;Dziko la Malaŵi", "official_name:id"=>"Republik Malawi", "official_name:lb"=>"Republik Malawi", "official_name:lt"=>"Malavio Respublika", "official_name:lv"=>"Malāvijas Republika", "official_name:sv"=>"Republiken Malawi", "official_name:vi"=>"Cộng hòa Malawi" \N      97
+mv     "name"=>"Maldives", "name:af"=>"Maldive", "name:ar"=>"ملديف", "name:be"=>"Мальдзівы", "name:br"=>"Maldivez", "name:da"=>"Maldiverne", "name:de"=>"Malediven", "name:el"=>"Μαλδίβες", "name:en"=>"Maldives", "name:eo"=>"Maldivoj", "name:es"=>"Maldivas", "name:et"=>"Maldiivid", "name:fa"=>"مالدیو", "name:fi"=>"Malediivit", "name:fr"=>"Maldives", "name:fy"=>"de Maldiven", "name:ga"=>"Oileáin Mhaildíve", "name:gd"=>"Na h-Eileanan Mhaladaibh", "name:he"=>"האיים המלדיביים", "name:hr"=>"Maldivi", "name:hu"=>"Maldív-szigetek", "name:id"=>"Maladewa", "name:is"=>"Maldíveyjar", "name:it"=>"Maldive", "name:la"=>"Insulae Maldivae", "name:lb"=>"Malediven", "name:lt"=>"Maldyvai", "name:lv"=>"Maldīvija", "name:mn"=>"Мальдив", "name:nl"=>"Malediven", "name:pl"=>"Malediwy", "name:ru"=>"Мальдивы", "name:sl"=>"Maldivi", "name:sv"=>"Maldiverna", "name:th"=>"ประเทศมัลดีฟส์", "name:tr"=>"Maldivler", "name:uk"=>"Мальдіви", "name:zh"=>"马尔代夫", "name:haw"=>"Maladiwa", "name:zh_py"=>"Maerdaifu", "name:zh_pyt"=>"Mǎěrdàifū", "official_name:et"=>"Maldiivi Vabariik", "official_name:id"=>"Republik Maladewa", "official_name:it"=>"Repubblica delle Maledive", "official_name:lb"=>"Republik Malediven", "official_name:lt"=>"Maldyvų Respublika", "official_name:lv"=>"Maldīvijas Republika", "official_name:pl"=>"Republika Malediwów", "official_name:sv"=>"Republiken Maldiverna"      dv      96
 na     "name"=>"Namibia", "name:af"=>"Namibië", "name:ar"=>"ناميبيا", "name:be"=>"Намібія", "name:br"=>"Namibia", "name:ca"=>"Namíbia", "name:el"=>"Ναμίμπια", "name:en"=>"Namibia", "name:eo"=>"Namibio", "name:es"=>"Namibia", "name:et"=>"Namiibia", "name:fa"=>"نامیبیا", "name:fi"=>"Namibia", "name:fr"=>"Namibie", "name:fy"=>"Namybje", "name:ga"=>"An Namaib", "name:gd"=>"Naimibia", "name:he"=>"נמיביה", "name:hu"=>"Namíbia", "name:is"=>"Namibía", "name:it"=>"Namibia", "name:lb"=>"Namibien", "name:li"=>"Namibië", "name:lt"=>"Namibija", "name:lv"=>"Namībija", "name:mn"=>"Намиби", "name:nl"=>"Namibië", "name:pl"=>"Namibia", "name:ru"=>"Намибия", "name:sl"=>"Namibija", "name:sv"=>"Namibia", "name:th"=>"ประเทศนามิเบีย", "name:tr"=>"Namibya", "name:uk"=>"Намібія", "name:zh"=>"纳米比亚", "name:zh_py"=>"Namibiya", "name:zh_pyt"=>"Nàmǐbǐyà", "official_name"=>"Republic of Namibia;Republiek van Namibia;Republik Namibia", "official_name:el"=>"Δημοκρατία της Ναμίμπιας", "official_name:gd"=>"Poblachd Namibia", "official_name:id"=>"Republik Namibia", "official_name:lb"=>"Republik Namibien", "official_name:lt"=>"Namibijos Respublika", "official_name:lv"=>"Namībijas Republika", "official_name:sl"=>"Republika Namibija", "official_name:sv"=>"Republiken Namibia", "official_name:vi"=>"Cộng hòa Namibia"        \N      99
 rw     "name"=>"Rwanda", "name:ar"=>"رواندا", "name:be"=>"Руанда", "name:br"=>"Rwanda", "name:de"=>"Ruanda", "name:el"=>"Ρουάντα", "name:en"=>"Rwanda", "name:eo"=>"Ruando", "name:es"=>"Ruanda", "name:fa"=>"رواندا", "name:fi"=>"Ruanda", "name:fr"=>"Rwanda", "name:fy"=>"Rûanda", "name:ga"=>"Ruanda", "name:gd"=>"Ruanda", "name:he"=>"רואנדה", "name:hr"=>"Ruanda", "name:hu"=>"Ruanda", "name:is"=>"Rúanda", "name:it"=>"Ruanda", "name:ja"=>"ルワンダ", "name:la"=>"Ruanda", "name:lb"=>"Ruanda", "name:li"=>"Roeanda", "name:lt"=>"Ruanda", "name:lv"=>"Ruanda", "name:mn"=>"Руанда", "name:pl"=>"Rwanda", "name:ru"=>"Руанда", "name:sl"=>"Ruanda", "name:sv"=>"Rwanda", "name:th"=>"ประเทศรวันดา", "name:tr"=>"Ruanda", "name:uk"=>"Руанда", "name:zh"=>"卢旺达", "name:haw"=>"Ruanada", "name:zh_py"=>"Luwangda", "name:zh_pyt"=>"Lúwàngdá", "official_name"=>"Republic of Rwanda;Repubulika y'u Rwanda;République du Rwanda", "official_name:el"=>"Δημοκρατία της Ρουάντα", "official_name:gd"=>"Poblachd Ruanda", "official_name:id"=>"Republik Rwanda", "official_name:lb"=>"Republik Ruanda", "official_name:lt"=>"Ruandos Respublika", "official_name:lv"=>"Ruandas Republika", "official_name:sv"=>"Republiken Rwanda", "official_name:vi"=>"Cộng hòa Rwanda"   \N      102
-sy     "name"=>"Sūriyya سوريا", "name:af"=>"Sirië", "name:ar"=>"سوريا", "name:be"=>"Сірыя", "name:br"=>"Siria", "name:ca"=>"Síria", "name:da"=>"Syrien", "name:de"=>"Syrien", "name:el"=>"Συρία", "name:en"=>"Syria", "name:eo"=>"Sirio", "name:es"=>"Siria", "name:fa"=>"سوریه", "name:fi"=>"Syyria", "name:fr"=>"Syrie", "name:fy"=>"Syrje", "name:ga"=>"An tSiria", "name:gd"=>"Siria", "name:he"=>"סוריה", "name:hr"=>"Sirija", "name:hu"=>"Szíria", "name:id"=>"Suriah", "name:is"=>"Sýrland", "name:it"=>"Siria", "name:ja"=>"シリア", "name:la"=>"Syria", "name:lb"=>"Syrien", "name:li"=>"Syrië", "name:lt"=>"Sirija", "name:lv"=>"Sīrija", "name:mn"=>"Сири", "name:nl"=>"Syrië", "name:pl"=>"Syria", "name:pt"=>"Síria", "name:ru"=>"Сирия", "name:sl"=>"Sirija", "name:sv"=>"Syrien", "name:th"=>"ประเทศซีเรีย", "name:tr"=>"Suriye", "name:uk"=>"Сирія", "name:vi"=>"Syria", "name:zh"=>"叙利亚", "name:haw"=>"Suria", "name:zh_py"=>"Xuliya", "name:zh_pyt"=>"Xùlìyà", "official_name:br"=>"Republik Arab Siria", "official_name:ca"=>"República Àrab Siriana", "official_name:el"=>"Αραβική Δημοκρατία της Συρίας", "official_name:gd"=>"Poblachd Arabach Shirianach", "official_name:id"=>"Republik Arab Suriah", "official_name:it"=>"Repubblica Araba di Siria", "official_name:lb"=>"Arabesch Republik Syrien", "official_name:lt"=>"Sirijos Arabų Respublika", "official_name:pl"=>"Syryjska Republika Arabska", "official_name:pt"=>"República Árabe da Síria", "official_name:ru"=>"Сирийская Арабская Республика", "official_name:sv"=>"Arabrepubliken Syrien"  \N      104
 mh     "name"=>"Marshall Islands", "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ŝala Insularo", "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:id"=>"Kepulauan 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:mn"=>"Маршаллын арлууд", "name:nl"=>"Marshalleilanden", "name:pl"=>"Wyspy Marshalla", "name:pt"=>"Ilhas Marshall", "name:ru"=>"Маршалловы Острова", "name:sl"=>"Marshallovi otoki", "name:sv"=>"Marshallöarna", "name:th"=>"สาธารณรัฐหมู่เกาะมาร์แชลล์", "name:tr"=>"Marshall Adaları", "name:uk"=>"Маршаллові Острови", "name:vi"=>"Quần đảo Marshall", "name:zh"=>"马绍尔群岛", "official_name"=>"Aolepān Aorōkin M̧ajeļ;Republic of the Marshall Islands", "official_name:be"=>"Маршалавы астравы", "official_name:es"=>"República de las Islas Marshall", "official_name:id"=>"Republik Kepulauan Marshall", "official_name:lb"=>"Republik Marshallinselen", "official_name:lt"=>"Maršalo Salų Respublika", "official_name:lv"=>"Māršala Salu Republika", "official_name:pl"=>"Republika Wysp Marshalla", "official_name:pt"=>"República das Ilhas Marshall", "official_name:sl"=>"Republika Marshallovi otoki", "official_name:sv"=>"Republiken Marshallöarna", "official_name:vi"=>"Cộng hoà Quần đảo Marshal"     \N      105
-va     "name"=>"Città del Vaticano", "name:af"=>"Vatikaanstad", "name:ar"=>"الفاتيكان", "name:be"=>"Ватыкан", "name:br"=>"Vatikan", "name:ca"=>"Ciutat del Vaticà", "name:cy"=>"Dinas y Fatican", "name:da"=>"Vatikanstaten", "name:de"=>"Vatikanstadt", "name:el"=>"Βατικανό", "name:en"=>"Vatican City", "name:eo"=>"Vatikanurbo", "name:es"=>"Ciudad del Vaticano", "name:et"=>"Vatikan", "name:eu"=>"Vatikano Hiria", "name:fa"=>"واتیکان", "name:fi"=>"Vatikaanivaltio", "name:fr"=>"Vatican", "name:fy"=>"Fatikaanstêd", "name:ga"=>"Cathair na Vatacáine", "name:gd"=>"Cathair na Bhatacain", "name:he"=>"ותיקן", "name:hr"=>"Vatikan", "name:hu"=>"Vatikán", "name:id"=>"Vatikan", "name:is"=>"Vatíkanið", "name:it"=>"Città del Vaticano", "name:la"=>"Civitas Vaticana", "name:lb"=>"Vatikanstad", "name:li"=>"Vaticaanstad", "name:lt"=>"Vatikano Miesto Valstybė", "name:lv"=>"Vatikāns (Svētais Krēsls)", "name:mn"=>"Ватикан Хот Улс", "name:nl"=>"Vaticaanstad", "name:pl"=>"Watykan", "name:pt"=>"Cidade do Vaticano", "name:ru"=>"Ватикан", "name:sk"=>"Vatikán", "name:sl"=>"Vatikan", "name:sv"=>"Vatikanstaten", "name:th"=>"นครรัฐวาติกัน", "name:tr"=>"Vatikan", "name:uk"=>"Ватикан", "name:vi"=>"Thành Vatican", "name:zh"=>"梵蒂冈", "name:haw"=>"Ka Watikano", "name:zh_py"=>"Fandigang", "name:zh_pyt"=>"Fàndìgāng", "official_name"=>"Stato della Città del Vaticano", "official_name:el"=>"Κράτος της πόλης του Βατικανού", "official_name:fr"=>"État de la Cité du Vatican", "official_name:la"=>"Status Civitatis Vaticanae", "official_name:lb"=>"Stat Vatikanstad", "official_name:pl"=>"Państwo Watykańskie", "official_name:sk"=>"Vatikánsky mestský štát", "official_name:vi"=>"Thành Quốc Vatican"     \N      107
-ve     "name"=>"Venezuela", "name:ar"=>"فنزويلا", "name:be"=>"Венесуэла", "name:br"=>"Venezuela", "name:ca"=>"Veneçuela", "name:da"=>"Venezuela", "name:el"=>"Βενεζουέλα", "name:en"=>"Venezuela", "name:eo"=>"Venezuelo", "name:fa"=>"ونزوئلا", "name:fi"=>"Venezuela", "name:fr"=>"Venezuela", "name:fy"=>"Fenezuëla", "name:ga"=>"Veiniséala", "name:gd"=>"A' Bheiniseala", "name:he"=>"ונצואלה", "name:hu"=>"Venezuela", "name:is"=>"Venusúela", "name:ja"=>"ベネズエラ", "name:la"=>"Venetiola", "name:lt"=>"Venesuela", "name:lv"=>"Venecuēla", "name:mn"=>"Венесуэл", "name:pl"=>"Wenezuela", "name:pt"=>"Venezuela", "name:ru"=>"Венесуэла", "name:sv"=>"Venezuela", "name:th"=>"ประเทศเวเนซุเอลา", "name:uk"=>"Венесуела", "name:zh"=>"委内瑞拉", "official_name"=>"República Bolivariana de Venezuela", "official_name:be"=>"Баліварыянская Рэспубліка Венесуэла", "official_name:en"=>"Bolivarian Republic of Venezuela", "official_name:id"=>"Republik Bolivar Venezuela", "official_name:lt"=>"Venesuelos Bolivaro Respublika", "official_name:pl"=>"Boliwariańska Republika Wenezueli", "official_name:pt"=>"República Bolivariana da Venezuela", "official_name:sv"=>"Bolivarianska republiken Venezuela", "official_name:vi"=>"Cộng hòa Bolivar Venezuela"      \N      108
-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:da"=>"Britiske Jomfruøer", "name:de"=>"Britische Jungferninseln", "name:en"=>"British Virgin Islands", "name:eo"=>"Britaj Virgulininsuloj", "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"=>"Mergelės salos (Britų)", "name:lv"=>"Britu Virdžīnu salas", "name:mn"=>"Виржиний Арлууд, Британийн", "name:nl"=>"Britse Maagdeneilanden", "name:pl"=>"Brytyjskie Wyspy Dziewicze", "name:ru"=>"Британские Виргинские острова", "name:sl"=>"Britanski Deviški otoki", "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"=>"英属维尔京群岛"      \N      109
-id     "name"=>"Indonesia", "name:af"=>"Indonesië", "name:ar"=>"إندونيسيا", "name:az"=>"İndoneziya", "name:be"=>"Інданэзія", "name:br"=>"Indonezia", "name:ca"=>"Indonèsia", "name:da"=>"Indonesien", "name:de"=>"Indonesien", "name:el"=>"Ινδονησία", "name:en"=>"Indonesia", "name:eo"=>"Indonezio", "name:et"=>"Indoneesia", "name:fa"=>"اندونزی", "name:fi"=>"Indonesia", "name:fr"=>"Indonésie", "name:fy"=>"Yndoneezje", "name:ga"=>"An Indinéis", "name:gd"=>"An Innd-Innse", "name:he"=>"אינדונזיה", "name:hr"=>"Indonezija", "name:hu"=>"Indonézia", "name:is"=>"Indonesía", "name:it"=>"Indonesia", "name:ja"=>"インドネシア", "name:lb"=>"Indonesien", "name:li"=>"Indonesië", "name:lt"=>"Indonezija", "name:lv"=>"Indonēzija", "name:mn"=>"Индонез", "name:nl"=>"Indonesië", "name:pl"=>"Indonezja", "name:ru"=>"Индонезия", "name:sl"=>"Indonezija", "name:sv"=>"Indonesien", "name:th"=>"ประเทศอินโดนีเซีย", "name:tl"=>"Indonesya", "name:tr"=>"Endonezya", "name:uk"=>"Індонезія", "name:zh"=>"印度尼西亚", "name:haw"=>"‘Inidonesia", "official_name"=>"Republik Indonesia", "official_name:el"=>"Δημοκρατία της Ινδονησίας", "official_name:en"=>"Republic of Indonesia", "official_name:et"=>"Indoneesia Vabariik", "official_name:fr"=>"République d'Indonésie", "official_name:lt"=>"Indonezijos Respublika", "official_name:lv"=>"Indonēzijas Republika", "official_name:pl"=>"Republika Indonezji", "official_name:sv"=>"Republiken Indonesien", "official_name:tl"=>"Republika ng Indonesya", "official_name:vi"=>"Cộng hòa Indonesia"      \N      110
-se     "name"=>"Sverige", "name:af"=>"Swede", "name:ar"=>"السويد", "name:be"=>"Швецыя", "name:br"=>"Sveden", "name:ca"=>"Suècia", "name:cy"=>"Sweden", "name:de"=>"Schweden", "name:el"=>"Σουηδία", "name:en"=>"Sweden", "name:eo"=>"Svedio", "name:es"=>"Suecia", "name:et"=>"Rootsi", "name:fa"=>"سوئد", "name:fi"=>"Ruotsi", "name:fr"=>"Suède", "name:fy"=>"Sweden", "name:ga"=>"An tSualainn", "name:gd"=>"An t-Suain", "name:he"=>"שוודיה", "name:hr"=>"Švedska", "name:hu"=>"Svédország", "name:hy"=>"Շվեդիա", "name:id"=>"Swedia", "name:is"=>"Svíþjóð", "name:it"=>"Svezia", "name:ja"=>"スウェーデン", "name:la"=>"Suecia", "name:lb"=>"Schweden", "name:li"=>"Zwaede", "name:lt"=>"Švedija", "name:lv"=>"Zviedrija", "name:mn"=>"Швед", "name:nl"=>"Zweden", "name:pl"=>"Szwecja", "name:pt"=>"Suécia", "name:ru"=>"Швеция", "name:sk"=>"Švédsko", "name:sl"=>"Švedska", "name:sv"=>"Sverige", "name:th"=>"ประเทศสวีเดน", "name:tr"=>"İsveç", "name:uk"=>"Швеція", "name:vi"=>"Thụy Điển", "name:zh"=>"瑞典", "name:haw"=>"Kuekene", "name:zh_py"=>"Ruidian", "name:zh_pyt"=>"Ruìdiǎn", "official_name"=>"Konungariket Sverige", "official_name:af"=>"Koninkryk Swede", "official_name:be"=>"Каралеўства Швецыя", "official_name:el"=>"Βασίλειο της Σουηδίας", "official_name:et"=>"Rootsi Kuningriik", "official_name:fr"=>"Royaume de Suède", "official_name:id"=>"Kerajaan Swedia", "official_name:ja"=>"スウェーデン王国", "official_name:lb"=>"Kinneksräich Schweden", "official_name:lt"=>"Švedijos Karalystė", "official_name:pt"=>"Reino da Suécia", "official_name:sk"=>"Švédske kráľovstvo", "official_name:sv"=>"Konungariket Sverige", "official_name:vi"=>"Vương quốc Thụy Điển"       \N      112
+va     "name"=>"Città del Vaticano", "name:af"=>"Vatikaanstad", "name:ar"=>"الفاتيكان", "name:be"=>"Ватыкан", "name:br"=>"Vatikan", "name:ca"=>"Ciutat del Vaticà", "name:cy"=>"Dinas y Fatican", "name:da"=>"Vatikanstaten", "name:de"=>"Vatikanstadt", "name:el"=>"Βατικανό", "name:en"=>"Vatican City", "name:eo"=>"Vatikanurbo", "name:es"=>"Ciudad del Vaticano", "name:et"=>"Vatikan", "name:eu"=>"Vatikano Hiria", "name:fa"=>"واتیکان", "name:fi"=>"Vatikaanivaltio", "name:fr"=>"Vatican", "name:fy"=>"Fatikaanstêd", "name:ga"=>"Cathair na Vatacáine", "name:gd"=>"Cathair na Bhatacain", "name:he"=>"ותיקן", "name:hr"=>"Vatikan", "name:hu"=>"Vatikán", "name:id"=>"Vatikan", "name:is"=>"Vatíkanið", "name:it"=>"Città del Vaticano", "name:la"=>"Civitas Vaticana", "name:lb"=>"Vatikanstad", "name:li"=>"Vaticaanstad", "name:lt"=>"Vatikano Miesto Valstybė", "name:lv"=>"Vatikāns (Svētais Krēsls)", "name:mn"=>"Ватикан Хот Улс", "name:nl"=>"Vaticaanstad", "name:pl"=>"Watykan", "name:pt"=>"Cidade do Vaticano", "name:ru"=>"Ватикан", "name:sk"=>"Vatikán", "name:sl"=>"Vatikan", "name:sv"=>"Vatikanstaten", "name:th"=>"นครรัฐวาติกัน", "name:tr"=>"Vatikan", "name:uk"=>"Ватикан", "name:vi"=>"Thành Vatican", "name:zh"=>"梵蒂冈", "name:haw"=>"Ka Watikano", "name:zh_py"=>"Fandigang", "name:zh_pyt"=>"Fàndìgāng", "official_name"=>"Stato della Città del Vaticano", "official_name:el"=>"Κράτος της πόλης του Βατικανού", "official_name:fr"=>"État de la Cité du Vatican", "official_name:la"=>"Status Civitatis Vaticanae", "official_name:lb"=>"Stat Vatikanstad", "official_name:pl"=>"Państwo Watykańskie", "official_name:sk"=>"Vatikánsky mestský štát", "official_name:vi"=>"Thành Quốc Vatican"     it      107
 pn     "name"=>"Pitcairn", "name:ar"=>"بتكايرن", "name:be"=>"Піткерн", "name:br"=>"Inizi Pitcairn", "name:ca"=>"Illes Pitcairn", "name:cy"=>"Ynysoedd Pitcairn", "name:da"=>"Pitcairn", "name:el"=>"Νήσοι Πίτκαιρν", "name:en"=>"Pitcairn", "name:eo"=>"Pitkarna Insulo", "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:hu"=>"Pitcairn-szigetek", "name:id"=>"Kepulauan Pitcairn", "name:is"=>"Pitcairn", "name:it"=>"Isole Pitcairn", "name:la"=>"Pitcairn Insulae", "name:lt"=>"Pitkernas", "name:lv"=>"Pitkērna", "name:mn"=>"Питкэрн Арлууд", "name:pl"=>"Wyspy Pitcairn", "name:ru"=>"Питкерн", "name:sv"=>"Pitcairnöarna", "name:th"=>"หมู่เกาะพิตแคร์น", "name:tr"=>"Pitcairn Adaları", "name:uk"=>"Піткерн", "name:vi"=>"Quần đảo Pitcairn", "name:zh"=>"皮特凯恩群岛", "official_name"=>"Pitcairn, Henderson, Ducie, and Oeno Islands;Pitkern Ailen", "official_name:lv"=>"Pitkērnas salas"     \N      113
-az     "name"=>"Azerbaijan", "name:af"=>"Azerbeidjan", "name:ar"=>"أذربيجان", "name:az"=>"Azərbaycan", "name:be"=>"Азербайджан", "name:br"=>"Azerbaidjan", "name:ca"=>"Azerbaidjan", "name:da"=>"Aserbajdsjan", "name:de"=>"Aserbaidschan", "name:el"=>"Αζερμπαϊτζάν", "name:en"=>"Azerbaijan", "name:eo"=>"Azerbajĝano", "name:es"=>"Azerbaiyán", "name:et"=>"Aserbaidžaan", "name:fa"=>"آذربایجان", "name:fi"=>"Azerbaidžan", "name:fr"=>"Azerbaïdjan", "name:fy"=>"Azerbeidzjan", "name:ga"=>"An Asarbaiseáin", "name:gd"=>"Asarbaidean", "name:he"=>"אזרבייג'ן", "name:hr"=>"Azerbejdžan", "name:hu"=>"Azerbajdzsán", "name:hy"=>"Ադրբեջան", "name:is"=>"Aserbaídsjan", "name:it"=>"Azerbaigian", "name:ja"=>"アゼルバイジャン", "name:la"=>"Adrabigania", "name:lb"=>"Aserbaidschan", "name:li"=>"Azerbaidzjan", "name:lt"=>"Azerbaidžanas", "name:lv"=>"Azerbaidžāna", "name:mn"=>"Азербайжан", "name:nb"=>"Aserbajdsjan", "name:nl"=>"Azerbeidzjan", "name:nn"=>"Aserbajdsjan", "name:no"=>"Aserbajdsjan", "name:pl"=>"Azerbejdżan", "name:pt"=>"Azerbaijão", "name:ru"=>"Азербайджан", "name:sl"=>"Azerbajdžan", "name:sv"=>"Azerbajdzjan", "name:th"=>"ประเทศอาเซอร์ไบจาน", "name:tr"=>"Azerbaycan", "name:uk"=>"Азербаджайн", "name:zh"=>"阿塞拜疆", "name:haw"=>"‘Akepaikana", "name:zh_py"=>"Asaibaijiang", "name:zh_pyt"=>"Āsàibàijiāng", "official_name"=>"Republic of Azerbaijan", "official_name:az"=>"Azərbaycan Respublikası", "official_name:el"=>"Δημοκρατία του Αζερμπαϊτζάν", "official_name:fa"=>"جمهوری آذربایجان", "official_name:fi"=>"Azerbaidžanin tasavalta", "official_name:id"=>"Republik Azerbaijan", "official_name:it"=>"Repubblica dell'Azerbaigian", "official_name:lt"=>"Azerbaidžano Respublika", "official_name:lv"=>"Azerbaidžānas Republika", "official_name:pl"=>"Republika Azerbejdżanu", "official_name:pt"=>"República do Azerbaijão", "official_name:sv"=>"Republiken Azerbajdzjan", "official_name:vi"=>"Cộng hoà Azerbaijan" \N      119
+se     "name"=>"Sverige", "name:af"=>"Swede", "name:ar"=>"السويد", "name:be"=>"Швецыя", "name:br"=>"Sveden", "name:ca"=>"Suècia", "name:cy"=>"Sweden", "name:de"=>"Schweden", "name:el"=>"Σουηδία", "name:en"=>"Sweden", "name:eo"=>"Svedio", "name:es"=>"Suecia", "name:et"=>"Rootsi", "name:fa"=>"سوئد", "name:fi"=>"Ruotsi", "name:fr"=>"Suède", "name:fy"=>"Sweden", "name:ga"=>"An tSualainn", "name:gd"=>"An t-Suain", "name:he"=>"שוודיה", "name:hr"=>"Švedska", "name:hu"=>"Svédország", "name:hy"=>"Շվեդիա", "name:id"=>"Swedia", "name:is"=>"Svíþjóð", "name:it"=>"Svezia", "name:ja"=>"スウェーデン", "name:la"=>"Suecia", "name:lb"=>"Schweden", "name:li"=>"Zwaede", "name:lt"=>"Švedija", "name:lv"=>"Zviedrija", "name:mn"=>"Швед", "name:nl"=>"Zweden", "name:pl"=>"Szwecja", "name:pt"=>"Suécia", "name:ru"=>"Швеция", "name:sk"=>"Švédsko", "name:sl"=>"Švedska", "name:sv"=>"Sverige", "name:th"=>"ประเทศสวีเดน", "name:tr"=>"İsveç", "name:uk"=>"Швеція", "name:vi"=>"Thụy Điển", "name:zh"=>"瑞典", "name:haw"=>"Kuekene", "name:zh_py"=>"Ruidian", "name:zh_pyt"=>"Ruìdiǎn", "official_name"=>"Konungariket Sverige", "official_name:af"=>"Koninkryk Swede", "official_name:be"=>"Каралеўства Швецыя", "official_name:el"=>"Βασίλειο της Σουηδίας", "official_name:et"=>"Rootsi Kuningriik", "official_name:fr"=>"Royaume de Suède", "official_name:id"=>"Kerajaan Swedia", "official_name:ja"=>"スウェーデン王国", "official_name:lb"=>"Kinneksräich Schweden", "official_name:lt"=>"Švedijos Karalystė", "official_name:pt"=>"Reino da Suécia", "official_name:sk"=>"Švédske kráľovstvo", "official_name:sv"=>"Konungariket Sverige", "official_name:vi"=>"Vương quốc Thụy Điển"       sv      112
+ve     "name"=>"Venezuela", "name:ar"=>"فنزويلا", "name:be"=>"Венесуэла", "name:br"=>"Venezuela", "name:ca"=>"Veneçuela", "name:da"=>"Venezuela", "name:el"=>"Βενεζουέλα", "name:en"=>"Venezuela", "name:eo"=>"Venezuelo", "name:fa"=>"ونزوئلا", "name:fi"=>"Venezuela", "name:fr"=>"Venezuela", "name:fy"=>"Fenezuëla", "name:ga"=>"Veiniséala", "name:gd"=>"A' Bheiniseala", "name:he"=>"ונצואלה", "name:hu"=>"Venezuela", "name:is"=>"Venusúela", "name:ja"=>"ベネズエラ", "name:la"=>"Venetiola", "name:lt"=>"Venesuela", "name:lv"=>"Venecuēla", "name:mn"=>"Венесуэл", "name:pl"=>"Wenezuela", "name:pt"=>"Venezuela", "name:ru"=>"Венесуэла", "name:sv"=>"Venezuela", "name:th"=>"ประเทศเวเนซุเอลา", "name:uk"=>"Венесуела", "name:zh"=>"委内瑞拉", "official_name"=>"República Bolivariana de Venezuela", "official_name:be"=>"Баліварыянская Рэспубліка Венесуэла", "official_name:en"=>"Bolivarian Republic of Venezuela", "official_name:id"=>"Republik Bolivar Venezuela", "official_name:lt"=>"Venesuelos Bolivaro Respublika", "official_name:pl"=>"Boliwariańska Republika Wenezueli", "official_name:pt"=>"República Bolivariana da Venezuela", "official_name:sv"=>"Bolivarianska republiken Venezuela", "official_name:vi"=>"Cộng hòa Bolivar Venezuela"      es      108
+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:da"=>"Britiske Jomfruøer", "name:de"=>"Britische Jungferninseln", "name:en"=>"British Virgin Islands", "name:eo"=>"Britaj Virgulininsuloj", "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"=>"Mergelės salos (Britų)", "name:lv"=>"Britu Virdžīnu salas", "name:mn"=>"Виржиний Арлууд, Британийн", "name:nl"=>"Britse Maagdeneilanden", "name:pl"=>"Brytyjskie Wyspy Dziewicze", "name:ru"=>"Британские Виргинские острова", "name:sl"=>"Britanski Deviški otoki", "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"=>"英属维尔京群岛"      en      109
 cy     "name"=>"Κύπρος", "name:af"=>"Siprus", "name:ar"=>"قبرص", "name:be"=>"Кіпр", "name:br"=>"Kiprenez", "name:ca"=>"Xipre", "name:cy"=>"Cyprus", "name:da"=>"Cypern", "name:de"=>"Zypern", "name:el"=>"Κύπρος", "name:en"=>"Cyprus", "name:eo"=>"Kipro", "name:es"=>"Chipre", "name:et"=>"Küpros", "name:fa"=>"قبرس", "name:fi"=>"Kypros", "name:fr"=>"Chypre", "name:fy"=>"Syprus", "name:ga"=>"An Chipir", "name:gd"=>"Cìopras", "name:he"=>"קפריסין", "name:hr"=>"Cipar", "name:hu"=>"Ciprus", "name:id"=>"Siprus", "name:is"=>"Kýpur", "name:it"=>"Cipro", "name:ja"=>"キプロス", "name:la"=>"Cyprus", "name:lb"=>"Zypern", "name:li"=>"Cyprus", "name:lt"=>"Kipras", "name:lv"=>"Kipra", "name:mn"=>"Кипр", "name:nl"=>"Cyprus", "name:pl"=>"Cypr", "name:pt"=>"Chipre", "name:ru"=>"Кипр", "name:sl"=>"Ciper", "name:sv"=>"Cypern", "name:th"=>"ประเทศไซปรัส", "name:tr"=>"Kıbrıs", "name:uk"=>"Кіпр", "name:vi"=>"Síp", "name:zh"=>"塞浦路斯", "name:haw"=>"Kupelo", "name:zh_py"=>"Saipulusi", "name:zh_pyt"=>"Sàipǔlùsī", "official_name"=>"Κυπριακή Δημοκρατία", "official_name:br"=>"Republik Kiprenez", "official_name:el"=>"Κυπριακή Δημοκρατία", "official_name:es"=>"República de Chipre", "official_name:et"=>"Küprose Vabariik", "official_name:id"=>"Republik Siprus", "official_name:ja"=>"キプロス共和国", "official_name:lb"=>"Republik Zypern", "official_name:lt"=>"Kipro Respublika", "official_name:lv"=>"Kipras Republika", "official_name:pl"=>"Republika Cypryjska", "official_name:pt"=>"República de Chipre", "official_name:sv"=>"Republiken Cypern", "official_name:tr"=>"Kıbrıs Cumhuriyeti", "official_name:vi"=>"Cộng hòa Síp"  \N      114
 sg     "name"=>"Singapore", "name:af"=>"Singapoer", "name:ar"=>"سنغافورة", "name:be"=>"Сінгапур", "name:br"=>"Singapour", "name:ca"=>"Singapur", "name:de"=>"Singapur", "name:el"=>"Σιγκαπούρη", "name:eo"=>"Singapuro", "name:es"=>"Singapur", "name:et"=>"Singapur", "name:fa"=>"سنگاپور", "name:fi"=>"Singapore", "name:fr"=>"Singapour", "name:ga"=>"Singeapór", "name:gd"=>"Siongapòr", "name:he"=>"סינגפור", "name:hr"=>"Singapur", "name:hu"=>"Szingapúr", "name:id"=>"Singapura", "name:is"=>"Singapúr", "name:it"=>"Singapore", "name:la"=>"Singapura", "name:lb"=>"Singapur", "name:lt"=>"Singapūras", "name:mn"=>"Сингапур", "name:ms"=>"Singapura", "name:pl"=>"Singapur", "name:ru"=>"Сингапур", "name:sl"=>"Singapur", "name:sv"=>"Singapore", "name:th"=>"ประเทศสิงคโปร์", "name:tl"=>"Singgapur", "name:tr"=>"Singapur", "name:uk"=>"Сінгапур", "name:zh"=>"新加坡", "name:haw"=>"Sinapoa", "name:zh_py"=>"Xinjiapo", "name:zh_pyt"=>"Xīnjiāpō", "official_name"=>"Republic of Singapore", "official_name:br"=>"Republik Singapour", "official_name:el"=>"Δημοκρατία της Σιγκαπούρης", "official_name:et"=>"Singapuri Vabariik", "official_name:id"=>"Republik Singapura", "official_name:it"=>"Repubblica di Singapore", "official_name:lb"=>"Republik Singapur", "official_name:lt"=>"Singapūro Respublika", "official_name:pl"=>"Republika Singapuru", "official_name:sv"=>"Republiken Singapore", "official_name:tl"=>"Republika ng Singgapur", "official_name:vi"=>"Cộng hòa Singapore"        \N      115
 vu     "name"=>"Vanuatu", "name:ar"=>"فانواتو", "name:be"=>"Вануату", "name:br"=>"Vanuatu", "name:da"=>"Vanuatu", "name:el"=>"Βανουάτου", "name:eo"=>"Vanuatuo", "name:fa"=>"وانواتو", "name:fi"=>"Vanuatu", "name:fr"=>"Vanuatu", "name:fy"=>"Fanuatû", "name:ga"=>"Vanuatú", "name:gd"=>"Bhanuatu", "name:he"=>"ונואטו", "name:hu"=>"Vanuatu", "name:is"=>"Vanúatú", "name:ja"=>"バヌアツ", "name:mn"=>"Вануату", "name:pl"=>"Vanuatu", "name:pt"=>"Vanuatu", "name:ru"=>"Вануату", "name:sv"=>"Vanuatu", "name:th"=>"ประเทศวานูอาตู", "name:uk"=>"Вануату", "name:zh"=>"瓦努阿图", "official_name"=>"Ripablik blong Vanuatu", "official_name:el"=>"Δημοκρατία του Βανουάτου", "official_name:en"=>"Republic of Vanuatu", "official_name:es"=>"República de Vanuatu", "official_name:fr"=>"République de Vanuatu", "official_name:id"=>"Republik Vanuatu", "official_name:ja"=>"バヌアツ共和国", "official_name:lb"=>"Republik Vanuatu", "official_name:lt"=>"Vanuatu Respublika", "official_name:pl"=>"Republika Vanuatu", "official_name:pt"=>"República do Vanuatu", "official_name:sv"=>"Republiken Vanuatu", "official_name:vi"=>"Cộng hòa Vanuatu" \N      116
-cn     "name"=>"China 中国", "name:af"=>"Sjina", "name:ar"=>"الصين", "name:be"=>"Кітай", "name:br"=>"Sina", "name:ca"=>"Xina", "name:cy"=>"Tsieina", "name:da"=>"Kina", "name:de"=>"China", "name:el"=>"Κίνα", "name:en"=>"China", "name:eo"=>"Ĉinio", "name:es"=>"China", "name:et"=>"Hiina", "name:eu"=>"Txina", "name:fa"=>"چین", "name:fi"=>"Kiina", "name:fr"=>"Chine", "name:fy"=>"Sina", "name:ga"=>"An tSín", "name:gd"=>"Sìona", "name:he"=>"סין", "name:hr"=>"Kina", "name:hu"=>"Kína", "name:hy"=>"Չինաստան", "name:id"=>"Cina", "name:is"=>"Alþýðulýðveldið Kína", "name:it"=>"Cina", "name:ja"=>"中国", "name:la"=>"Sinae", "name:lb"=>"Volleksrepublik China", "name:li"=>"Sjina", "name:lt"=>"Kinija", "name:lv"=>"Ķīna", "name:mn"=>"Хятад", "name:nb"=>"Kina", "name:nl"=>"China", "name:nn"=>"Kina", "name:no"=>"Kina", "name:pl"=>"Chiny", "name:pt"=>"China", "name:ru"=>"Китай", "name:sl"=>"Kitajska", "name:sv"=>"Kina", "name:th"=>"ประเทศจีน", "name:tl"=>"Tsina", "name:tr"=>"Çin Halk Cumhuriyeti", "name:uk"=>"Китай", "name:vi"=>"Trung Hoa", "name:zh"=>"中国", "name:haw"=>"Kina", "name:zh_py"=>"Zhongguo", "name:zh_pyt"=>"Zhōngguó", "official_name"=>"中华人民共和国", "official_name:af"=>"Volksrepubliek van Sjina", "official_name:br"=>"Republik Pobl Sina", "official_name:el"=>"Λαϊκή Δημοκρατία της Κίνας", "official_name:en"=>"People's Republic of China", "official_name:eu"=>"Txinako Herri Errepublika", "official_name:gd"=>"Sluagh-Phoblachd na Sìne", "official_name:hy"=>"Չինաստանի Ժողովրդական Հանրապետություն", "official_name:id"=>"Republik Rakyat Cina", "official_name:it"=>"Repubblica Popolare Cinese", "official_name:ja"=>"中華人民共和国", "official_name:la"=>"Res Publica Popularis Sinarum", "official_name:lb"=>"Volleksrepublik China", "official_name:lt"=>"Kinijos Liaudies Respublika", "official_name:lv"=>"Ķīnas Tautas Republika", "official_name:pl"=>"Chińska Republika Ludowa", "official_name:pt"=>"República Popular da China", "official_name:sl"=>"Ljudska republika Kitajska", "official_name:sv"=>"Folkrepubliken Kina", "official_name:vi"=>"Cộng hòa Nhân dân Trung Hoa", "official_name:zh_py"=>"Zhonghua Renmin Gongheguo", "official_name:zh_pyt"=>"Zhōnghuá Rénmín Gònghéguó"     \N      117
-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"=>"科科斯(基林)群島", "official_name"=>"Territory of the Cocos (Keeling) Islands", "official_name:es"=>"Territorio de las Islas Cocos (Keeling)", "official_name:lv"=>"Kokosu (Kīlinga) salu teritorija", "official_name:pl"=>"Terytorium Wysp Kokosowych (Keelinga)"   \N      118
 bo     "name"=>"Bolivia", "name:ar"=>"بوليفيا", "name:be"=>"Балівія", "name:br"=>"Bolivia", "name:ca"=>"Bolívia", "name:cy"=>"Bolifia", "name:da"=>"Bolivia", "name:de"=>"Bolivien", "name:el"=>"Βολιβία", "name:en"=>"Bolivia", "name:eo"=>"Bolivio", "name:et"=>"Boliivia", "name:fa"=>"بولیوی", "name:fi"=>"Bolivia", "name:fr"=>"Bolivie", "name:ga"=>"An Bholaiv", "name:gd"=>"Boilibhia", "name:he"=>"בוליוויה", "name:hu"=>"Bolívia", "name:is"=>"Bólivía", "name:it"=>"Bolivia", "name:lb"=>"Bolivien", "name:lt"=>"Bolivija", "name:lv"=>"Bolīvija", "name:mn"=>"Болив", "name:pl"=>"Boliwia", "name:pt"=>"Bolívia", "name:ru"=>"Боливия", "name:sl"=>"Bolivija", "name:sv"=>"Bolivia", "name:th"=>"ประเทศโบลิเวีย", "name:tr"=>"Bolivya", "name:uk"=>"Болівія", "name:zh"=>"玻利维亚", "official_name"=>"Estado Plurinacional de Bolivia", "official_name:ay"=>"Wuliwya Suyu", "official_name:be"=>"Рэспубліка Балівія", "official_name:el"=>"Πολυεθνοτικό Κράτος της Βολιβίας", "official_name:en"=>"Plurinational State of Bolivia", "official_name:fi"=>"Bolivian monikansallinen valtio", "official_name:fr"=>"État plurinational de Bolivie", "official_name:gn"=>"Tetã Volívia", "official_name:id"=>"Republik Bolivia", "official_name:lt"=>"Bolivijos Respublika", "official_name:lv"=>"Bolīvijas Republika", "official_name:pl"=>"Wielonarodowe Państwo Boliwii", "official_name:pt"=>"Estado Plurinacional da Bolívia", "official_name:qu"=>"Bulibiya Mama llaqta", "official_name:sv"=>"Republiken Bolivia", "official_name:vi"=>"Cộng hoà Bolivia"    \N      120
-br     "name"=>"Brasil", "name:af"=>"Brasilië", "name:ar"=>"البرازيل", "name:be"=>"Бразілія", "name:br"=>"Brazil", "name:da"=>"Brasilien", "name:de"=>"Brasilien", "name:el"=>"Βραζιλία", "name:en"=>"Brazil", "name:eo"=>"Brzilo", "name:et"=>"Brasiilia", "name:fa"=>"برزیل", "name:fi"=>"Brasilia", "name:fr"=>"Brésil", "name:fy"=>"Brazylje", "name:ga"=>"An Bhrasaíl", "name:gd"=>"Braisil", "name:he"=>"ברזיל", "name:hr"=>"Brazil", "name:hu"=>"Brazília", "name:hy"=>"Բրազիլիա", "name:is"=>"Brasilía", "name:it"=>"Brasile", "name:ja"=>"ブラジル", "name:la"=>"Brasilia", "name:lb"=>"Brasilien", "name:li"=>"'t Braziel", "name:lt"=>"Brazilija", "name:lv"=>"Brazīlija", "name:mn"=>"Бразил", "name:nl"=>"Brazilië", "name:pl"=>"Brazylia", "name:ru"=>"Бразилия", "name:sl"=>"Brazilija", "name:sv"=>"Brasilien", "name:th"=>"ประเทศบราซิล", "name:tr"=>"Brezilya", "name:uk"=>"Бразилія", "name:zh"=>"巴西", "official_name"=>"República Federativa do Brasil", "official_name:el"=>"Ομοσπονδιακή Δημοκρατία της Βραζιλίας", "official_name:en"=>"Federative Republic of Brazil", "official_name:es"=>"República Federativa del Brasil", "official_name:fi"=>"Brasilian liittotasavalta", "official_name:fr"=>"République fédérative du Brésil", "official_name:id"=>"Republik Federal Brasil", "official_name:ja"=>"ブラジル連邦共和国", "official_name:lt"=>"Brazilijos Federacinė Respublika", "official_name:lv"=>"Brazīlijas Federatīvā Republika", "official_name:pl"=>"Federacyjna Republika Brazylii", "official_name:sv"=>"Förbundsrepubliken Brasilien", "official_name:vi"=>"Cộng hòa Liên bang Brasil"       \N      121
 bw     "name"=>"Botswana", "name:ar"=>"بوتسوانا", "name:be"=>"Батсвана", "name:br"=>"Botswana", "name:de"=>"Botsuana", "name:el"=>"Μποτσουάνα", "name:en"=>"Botswana", "name:eo"=>"Bocvano", "name:es"=>"Botsuana", "name:fa"=>"بوتسوانا", "name:fi"=>"Botswana", "name:fr"=>"Botswana", "name:ga"=>"An Bhotsuáin", "name:gd"=>"Botsuana", "name:he"=>"בוטסוונה", "name:hr"=>"Bocvana", "name:hu"=>"Botswana", "name:is"=>"Botsvana", "name:it"=>"Botswana", "name:ja"=>"ボツワナ", "name:la"=>"Botsuana", "name:lt"=>"Botsvana", "name:lv"=>"Botsvāna", "name:mn"=>"Ботсван", "name:pl"=>"Botswana", "name:pt"=>"Botswana", "name:ru"=>"Ботсвана", "name:sl"=>"Bocvana", "name:sv"=>"Botswana", "name:th"=>"ประเทศบอตสวานา", "name:tn"=>"Lefatshe la Botswana", "name:tr"=>"Botsvana", "name:uk"=>"Ботсвана", "name:zh"=>"博茨瓦纳", "name:haw"=>"Botuana", "name:zh_py"=>"Bociwana", "name:zh_pyt"=>"Bócíwǎnà", "official_name"=>"Republic of Botswana;Lefatse la Botswana", "official_name:el"=>"Δημοκρατία της Μποτσουάνας", "official_name:fi"=>"Botswanan tasavalta", "official_name:id"=>"Republik Botswana", "official_name:ja"=>"ボツワナ共和国", "official_name:lb"=>"Republik vu Botswana", "official_name:lt"=>"Botsvanos Respublika", "official_name:lv"=>"Botsvānas Republika", "official_name:pt"=>"República do Botswana", "official_name:sv"=>"Republiken Botswana", "official_name:vi"=>"Cộng hoà Botswana"   \N      122
-la     "name"=>"Laos", "name:af"=>"Laos", "name:ar"=>"لاوس", "name:be"=>"Лаос", "name:br"=>"Laos", "name:da"=>"Laos", "name:el"=>"Λάος", "name:en"=>"Laos", "name:eo"=>"Laoso", "name:fa"=>"لائوس", "name:fi"=>"Laos", "name:fr"=>"Laos", "name:ga"=>"Laos", "name:gd"=>"Làthos", "name:he"=>"לאוס", "name:hu"=>"Laosz", "name:is"=>"Lagos", "name:it"=>"Laos", "name:ja"=>"ラオス", "name:la"=>"Laotia", "name:lt"=>"Laosas", "name:lv"=>"Laosa", "name:mn"=>"Лаос", "name:pl"=>"Laos", "name:ru"=>"Лаос", "name:sv"=>"Laos", "name:th"=>"ประเทศลาว", "name:uk"=>"Лаос", "name:vi"=>"Lào", "name:zh"=>"老挝", "name:haw"=>"Laosa", "name:zh_py"=>"Laowo", "name:zh_pyt"=>"Lǎowō", "official_name:br"=>"Republik Demokratel ar Bobl Lao", "official_name:el"=>"Λαϊκή Δημοκρατία του Λάος", "official_name:id"=>"Republik Demokratik Rakyat Laos", "official_name:it"=>"Repubblica Popolare Democratica del Laos", "official_name:lb"=>"Demokratesch Volleksrepublik Laos", "official_name:lt"=>"Laoso Liaudies Demokratinė Respublika", "official_name:lv"=>"Laosas Tautas Demokrātiskā Republika", "official_name:pl"=>"Laotańska Republika Ludowo-Demokratyczna", "official_name:ru"=>"Лаосская Народно-Демократическая Республика", "official_name:sv"=>"Demokratiska folkrepubliken Laos", "official_name:vi"=>"Cộng hòa Dân chủ Nhân dân Lào"      \N      145
-ee     "name"=>"Eesti", "name:af"=>"Estland", "name:ar"=>"إستونيا", "name:be"=>"Эстонія", "name:br"=>"Estonia", "name:ca"=>"Estònia", "name:cy"=>"Estonia", "name:da"=>"Estland", "name:de"=>"Estland", "name:el"=>"Εσθονία", "name:en"=>"Estonia", "name:eo"=>"Estonio", "name:es"=>"Estonia", "name:eu"=>"Estonia", "name:fa"=>"استونی", "name:fi"=>"Viro", "name:fr"=>"Estonie", "name:fy"=>"Estlân", "name:ga"=>"An Eastóin", "name:gd"=>"Eastòinia", "name:he"=>"אסטוניה", "name:hr"=>"Estonija", "name:hu"=>"Észtország", "name:id"=>"Estonia", "name:is"=>"Eistland", "name:it"=>"Estonia", "name:ja"=>"エストニア", "name:la"=>"Estonia", "name:lb"=>"Estland", "name:li"=>"Esland", "name:lt"=>"Estija", "name:lv"=>"Igaunija", "name:mn"=>"Эстон", "name:nl"=>"Estland", "name:pl"=>"Estonia", "name:ru"=>"Эстония", "name:sk"=>"Estónsko", "name:sl"=>"Estonija", "name:sv"=>"Estland", "name:th"=>"ประเทศเอสโตเนีย", "name:tr"=>"Estonya", "name:uk"=>"Естонія", "name:vi"=>"Estonia", "name:zh"=>"爱沙尼亚", "name:haw"=>"‘Esetonia", "name:zh_py"=>"Aishaniya", "name:zh_pyt"=>"Àishāníyà", "official_name"=>"Eesti Vabariik", "official_name:be"=>"Рэспубліка Эстонія", "official_name:el"=>"Δημοκρατία της Εσθονίας", "official_name:en"=>"Republic of Estonia", "official_name:es"=>"República de Estonia", "official_name:fr"=>"République d'Estonie", "official_name:gd"=>"Poblachd Eastòinia", "official_name:id"=>"Republik Estonia", "official_name:lb"=>"Republik Estland", "official_name:lt"=>"Estijos Respublika", "official_name:lv"=>"Igaunijas Republika", "official_name:pl"=>"Republika Estońska", "official_name:ru"=>"Эсто́нская Респу́блика", "official_name:sk"=>"Estónska republika", "official_name:sv"=>"Republiken Estland", "official_name:vi"=>"Cộng hòa Estonia" \N      125
+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"=>"科科斯(基林)群島", "official_name"=>"Territory of the Cocos (Keeling) Islands", "official_name:es"=>"Territorio de las Islas Cocos (Keeling)", "official_name:lv"=>"Kokosu (Kīlinga) salu teritorija", "official_name:pl"=>"Terytorium Wysp Kokosowych (Keelinga)"   en      118
+la     "name"=>"Laos", "name:af"=>"Laos", "name:ar"=>"لاوس", "name:be"=>"Лаос", "name:br"=>"Laos", "name:da"=>"Laos", "name:el"=>"Λάος", "name:en"=>"Laos", "name:eo"=>"Laoso", "name:fa"=>"لائوس", "name:fi"=>"Laos", "name:fr"=>"Laos", "name:ga"=>"Laos", "name:gd"=>"Làthos", "name:he"=>"לאוס", "name:hu"=>"Laosz", "name:is"=>"Lagos", "name:it"=>"Laos", "name:ja"=>"ラオス", "name:la"=>"Laotia", "name:lt"=>"Laosas", "name:lv"=>"Laosa", "name:mn"=>"Лаос", "name:pl"=>"Laos", "name:ru"=>"Лаос", "name:sv"=>"Laos", "name:th"=>"ประเทศลาว", "name:uk"=>"Лаос", "name:vi"=>"Lào", "name:zh"=>"老挝", "name:haw"=>"Laosa", "name:zh_py"=>"Laowo", "name:zh_pyt"=>"Lǎowō", "official_name:br"=>"Republik Demokratel ar Bobl Lao", "official_name:el"=>"Λαϊκή Δημοκρατία του Λάος", "official_name:id"=>"Republik Demokratik Rakyat Laos", "official_name:it"=>"Repubblica Popolare Democratica del Laos", "official_name:lb"=>"Demokratesch Volleksrepublik Laos", "official_name:lt"=>"Laoso Liaudies Demokratinė Respublika", "official_name:lv"=>"Laosas Tautas Demokrātiskā Republika", "official_name:pl"=>"Laotańska Republika Ludowo-Demokratyczna", "official_name:ru"=>"Лаосская Народно-Демократическая Республика", "official_name:sv"=>"Demokratiska folkrepubliken Laos", "official_name:vi"=>"Cộng hòa Dân chủ Nhân dân Lào"      lo      145
 ke     "name"=>"Kenya", "name:af"=>"Kenia", "name:ar"=>"كينيا", "name:be"=>"Кенія", "name:br"=>"Kenya", "name:de"=>"Kenia", "name:el"=>"Κένυα", "name:en"=>"Kenya", "name:eo"=>"Kenjo", "name:es"=>"Kenia", "name:fa"=>"کنیا", "name:fi"=>"Kenia", "name:fr"=>"Kenya", "name:ga"=>"An Chéinia", "name:gd"=>"A' Cheinia", "name:he"=>"קניה", "name:hr"=>"Kenija", "name:hu"=>"Kenya", "name:is"=>"Kenýa", "name:it"=>"Kenya", "name:ja"=>"ケニア", "name:la"=>"Kenia", "name:li"=>"Kenia", "name:lt"=>"Kenija", "name:lv"=>"Kenija", "name:mn"=>"Кени", "name:nl"=>"Kenia", "name:pl"=>"Kenia", "name:ru"=>"Кения", "name:sl"=>"Kenija", "name:sv"=>"Kenya", "name:th"=>"ประเทศเคนยา", "name:uk"=>"Кенія", "name:zh"=>"肯尼亚", "name:haw"=>"Kenia", "name:zh_py"=>"Kenniya", "name:zh_pyt"=>"Kěnníyà", "official_name"=>"Republic of Kenya;Jamhuri ya Kenya", "official_name:el"=>"Δημοκρατία της Κένυας", "official_name:id"=>"Republik Kenya", "official_name:ja"=>"ケニア共和国", "official_name:lb"=>"Republik Kenia", "official_name:lt"=>"Kenijos Respublika", "official_name:lv"=>"Kenijas Republika", "official_name:sv"=>"Republiken Kenya", "official_name:vi"=>"Cộng hòa Kenya"   \N      126
 tj     "name"=>"Tajikistan", "name:af"=>"Tadjikistan", "name:ar"=>"طاجيكستان", "name:az"=>"Tacikistan", "name:be"=>"Таджыкістан", "name:br"=>"Tadjikistan", "name:ca"=>"Tadjikistan", "name:da"=>"Tadsjikistan", "name:de"=>"Tadschikistan", "name:el"=>"Τατζικιστάν", "name:en"=>"Tajikistan", "name:eo"=>"Taĝikio", "name:es"=>"Tayikistán", "name:et"=>"Tadžikistan", "name:fa"=>"تاجیکستان", "name:fi"=>"Tadžikistan", "name:fr"=>"Tadjikistan", "name:fy"=>"Tadzjikistan", "name:ga"=>"An Táidsíceastáin", "name:gd"=>"Taidigeastàn", "name:he"=>"טג'יקיסטן", "name:hr"=>"Tadžikistan", "name:hu"=>"Tádzsikisztán", "name:is"=>"Tadsjikistan", "name:it"=>"Tagikistan", "name:la"=>"Tadzikistania", "name:lb"=>"Tadschikistan", "name:li"=>"Tadzjikistan", "name:lt"=>"Tadžikistanas", "name:lv"=>"Tadžikistāna", "name:mn"=>"Тажикистан", "name:nl"=>"Tadzjikistan", "name:pl"=>"Tadżykistan", "name:pt"=>"Tadjiquistão", "name:ru"=>"Таджикистан", "name:sl"=>"Tadžikistan", "name:sv"=>"Tadzjikistan", "name:tg"=>"Тоҷикистон", "name:th"=>"ประเทศทาจิกิสถาน", "name:tr"=>"Tacikistan", "name:uk"=>"Таджикистан", "name:zh"=>"塔吉克斯坦", "name:zh_py"=>"Tajikesitan", "name:zh_pyt"=>"Tǎjíkèsītǎn", "official_name:el"=>"Δημοκρατία του Τατζικιστάν", "official_name:et"=>"Tadžikistani Vabariik", "official_name:gd"=>"Poblachd Thaidigeastàn", "official_name:id"=>"Republik Tajikistan", "official_name:it"=>"Repubblica del Tagikistan", "official_name:lt"=>"Tadžikistano Respublika", "official_name:pl"=>"Republika Tadżykistanu", "official_name:pt"=>"República do Tadjiquistão", "official_name:sv"=>"Republiken Tadzjikistan", "official_name:vi"=>"Cộng hòa Tajikistan"    \N      129
 tz     "name"=>"Tanzania", "name:af"=>"Tanzanië", "name:ar"=>"تنـزاني", "name:be"=>"Танзанія", "name:br"=>"Tanzania", "name:ca"=>"Tanzània", "name:de"=>"Tansania", "name:el"=>"Τανζανία", "name:en"=>"Tanzania", "name:eo"=>"Tanzanio", "name:es"=>"Tanzania", "name:et"=>"Tansaania", "name:fa"=>"تانزانیا", "name:fi"=>"Tansania", "name:fr"=>"Tanzanie", "name:ga"=>"An Tansáin", "name:gd"=>"Tansainìa", "name:he"=>"טנזניה", "name:hr"=>"Tanzanija", "name:hu"=>"Tanzánia", "name:is"=>"Tansanía", "name:it"=>"Tanzania", "name:ja"=>"タンザニア", "name:lb"=>"Tansania", "name:lt"=>"Tanzanija", "name:lv"=>"Tanzānija", "name:mn"=>"Танзани", "name:pl"=>"Tanzania", "name:pt"=>"Tanzânia", "name:ru"=>"Танзания", "name:sl"=>"Tanzanija", "name:sv"=>"Tanzania", "name:th"=>"ประเทศแทนซาเนีย", "name:tr"=>"Tanzanya", "name:uk"=>"Танзанія", "name:zh"=>"坦桑尼亚", "name:haw"=>"Tanazania", "name:zh_py"=>"Tansangniya", "name:zh_pyt"=>"Tǎnsāngníyà", "official_name"=>"United Republic of Tanzania;Jamhuri Ya Muungano Wa Tanzania", "official_name:et"=>"Tansaania Ühendvabariik", "official_name:id"=>"Persatuan Republik Tanzania", "official_name:lb"=>"Vereenegt Republik Tansania", "official_name:lt"=>"Tanzanijos Jungtinė Respublika", "official_name:pt"=>"República Unida da Tanzânia", "official_name:sv"=>"Förenade republiken Tanzania", "official_name:vi"=>"Cộng hòa Thống nhất Tanzania"       \N      130
 ws     "name"=>"Samoa", "name:ar"=>"ساموا", "name:be"=>"Самоа", "name:br"=>"Samoa", "name:da"=>"Samoa", "name:el"=>"Σαμόα", "name:en"=>"Samoa", "name:eo"=>"Samoo", "name:fa"=>"ساموآ", "name:fi"=>"Samoa", "name:fr"=>"Samoa", "name:ga"=>"Samó", "name:he"=>"סמואה", "name:hu"=>"Szamoa", "name:is"=>"Samóa", "name:mn"=>"Самоа", "name:pl"=>"Samoa", "name:ru"=>"Самоа", "name:sv"=>"Samoa", "name:th"=>"ประเทศซามัว", "name:uk"=>"Самоа", "name:zh"=>"萨摩亚", "official_name"=>"Malo Sa'oloto Tuto'atasi o Samoa", "official_name:en"=>"Independent State of Samoa", "official_name:es"=>"Estado Independiente de Samoa", "official_name:lb"=>"Unabhängiger Stat Samoa", "official_name:lt"=>"Samoa Nepriklausomoji Valstybė", "official_name:pl"=>"Niezależne Państwo Samoa", "official_name:ru"=>"Независимое Государство Самоа", "official_name:sv"=>"Självständiga staten Samoa", "official_name:vi"=>"Nhà nước Độc lập Samoa"   \N      131
-is     "name"=>"Ísland", "name:af"=>"Ysland", "name:ar"=>"آيسلندا", "name:be"=>"Ісландыя", "name:br"=>"Island", "name:ca"=>"Islàndia", "name:cy"=>"Gwlad yr Iâ", "name:da"=>"Island", "name:de"=>"Island", "name:el"=>"Ισλανδία", "name:en"=>"Iceland", "name:eo"=>"Islando", "name:es"=>"Islandia", "name:et"=>"Island", "name:fa"=>"ایسلند", "name:fi"=>"Islanti", "name:fr"=>"Islande", "name:fy"=>"Yslân", "name:ga"=>"An Íoslainn", "name:gd"=>"Innis Tìle", "name:he"=>"איסלנד", "name:hu"=>"Izland", "name:id"=>"Islandia", "name:is"=>"Ísland", "name:it"=>"Islanda", "name:ja"=>"アイスランド", "name:la"=>"Islandia", "name:lb"=>"Island", "name:li"=>"Iesland", "name:lt"=>"Islandija", "name:lv"=>"Īslande", "name:mn"=>"Исланд", "name:nb"=>"Island", "name:nl"=>"IJsland", "name:nn"=>"Island", "name:no"=>"Island", "name:pl"=>"Islandia", "name:ru"=>"Исландия", "name:sl"=>"Islandija", "name:sv"=>"Island", "name:th"=>"ประเทศไอซ์แลนด์", "name:tr"=>"İzlanda", "name:uk"=>"Ісландія", "name:vi"=>"Iceland", "name:zh"=>"冰岛", "name:haw"=>"‘Āina Hau", "name:zh_py"=>"Bingdao", "name:zh_pyt"=>"Bīngdǎo", "official_name"=>"Lýðveldið Ísland", "official_name:be"=>"Ісландыя", "official_name:el"=>"Δημοκρατία της Ισλανδίας", "official_name:en"=>"Republic of Iceland", "official_name:es"=>"República de Islandia", "official_name:id"=>"Republik Islandia", "official_name:it"=>"Repubblica d'Islanda", "official_name:ja"=>"アイスランド共和国", "official_name:lb"=>"Republik Island", "official_name:lt"=>"Islandijos Respublika", "official_name:lv"=>"Īslandes Republika", "official_name:pl"=>"Republika Islandii", "official_name:sv"=>"Republiken Island", "official_name:vi"=>"Cộng hòa Iceland" \N      134
-ru     "name"=>"Россия", "name:af"=>"Rusland", "name:ar"=>"روسيا الاتحادية", "name:az"=>"Rusiya Federasiyası", "name:be"=>"Расія", "name:br"=>"Rusia", "name:by"=>"Расія", "name:ca"=>"Rússia", "name:cy"=>"Ffederasiwn Rwsia", "name:da"=>"Rusland", "name:de"=>"Russland", "name:el"=>"Ρωσία", "name:en"=>"Russia", "name:eo"=>"Rusio", "name:es"=>"Rusia", "name:et"=>"Venemaa", "name:fa"=>"روسیه", "name:fi"=>"Venäjä", "name:fr"=>"Russie", "name:fy"=>"Ruslân", "name:ga"=>"An Rúis", "name:gd"=>"An Ruis", "name:he"=>"רוסיה", "name:hr"=>"Rusija", "name:hu"=>"Oroszország", "name:hy"=>"Ռուսաստան", "name:id"=>"Rusia", "name:is"=>"Rússland", "name:ja"=>"ロシア", "name:la"=>"Russia", "name:lb"=>"Russland", "name:li"=>"Rösland", "name:lt"=>"Rusija", "name:lv"=>"Krievija", "name:mn"=>"Орос", "name:nl"=>"Rusland", "name:pl"=>"Rosja", "name:pt"=>"Rússia", "name:ro"=>"Rusia", "name:ru"=>"Россия", "name:sl"=>"Rusija", "name:sv"=>"Ryssland", "name:th"=>"ประเทศรัสเซีย", "name:tr"=>"Rusya", "name:ua"=>"Росія", "name:uk"=>"Росія", "name:vi"=>"Nga", "name:zh"=>"俄罗斯", "alt_name"=>"Russia;Россия", "name:haw"=>"Rūsia", "name:zh_py"=>"Eluosi", "name:zh_pyt"=>"Éluósī", "official_name"=>"Российская Федерация", "official_name:af"=>"Russiese Federasie", "official_name:be"=>"Расійская Федэрацыя", "official_name:br"=>"Kevread Rusia", "official_name:ca"=>"Federació Russa", "official_name:el"=>"Ρωσική Ομοσπονδία", "official_name:en"=>"Russian Federation", "official_name:es"=>"Federación Rusa", "official_name:et"=>"Venemaa Föderatsioon", "official_name:id"=>"Federasi Rusia", "official_name:lb"=>"Russesch Federatioun", "official_name:lt"=>"Rusijos Federacija", "official_name:pl"=>"Federacja Rosyjska", "official_name:pt"=>"Federação Russa", "official_name:sl"=>"Ruska federacija", "official_name:sv"=>"Ryska federationen", "official_name:vi"=>"Liên Bang Nga"       \N      135
 ls     "name"=>"Lesotho", "name:ar"=>"ليسوتو", "name:be"=>"Лесота", "name:br"=>"Lesotho", "name:el"=>"Λεσότο", "name:eo"=>"Lesoto", "name:es"=>"Lesoto", "name:fa"=>"لسوتو", "name:fi"=>"Lesotho", "name:fr"=>"Lesotho", "name:fy"=>"Lesoto", "name:ga"=>"Leosóta", "name:gd"=>"Leasoto", "name:he"=>"לסוטו", "name:hr"=>"Lesoto", "name:hu"=>"Lesotho", "name:is"=>"Lesótó", "name:it"=>"Lesotho", "name:ja"=>"レソト", "name:la"=>"Lesothum", "name:lt"=>"Lesotas", "name:lv"=>"Lesoto", "name:mn"=>"Лесото", "name:pl"=>"Lesotho", "name:ru"=>"Лесото", "name:sl"=>"Lesoto", "name:sv"=>"Lesotho", "name:th"=>"ประเทศเลโซโท", "name:tr"=>"Lesoto", "name:uk"=>"Лесото", "name:zh"=>"莱索托", "name:haw"=>"Lesoto", "name:zh_py"=>"Laisuotuo", "name:zh_pyt"=>"Láisuǒtuō", "official_name"=>"Kingdom of Lesotho;Muso oa Lesotho", "official_name:id"=>"Kerajaan Lesotho", "official_name:lb"=>"Kinnekräich Lesotho", "official_name:lt"=>"Lesoto Karalystė", "official_name:lv"=>"Lesoto Karaliste", "official_name:sl"=>"Kraljevina Lesoto", "official_name:sv"=>"Konungariket Lesotho", "official_name:vi"=>"Vương quốc Lesotho"   \N      136
-om     "name"=>"سلطنة عُمان Oman", "name:af"=>"Oman", "name:ar"=>"عمان", "name:be"=>"Аман", "name:br"=>"Oman", "name:ca"=>"Oman", "name:cy"=>"Oman", "name:da"=>"Oman", "name:de"=>"Oman", "name:el"=>"Ομάν", "name:en"=>"Oman", "name:eo"=>"Omano", "name:es"=>"Omán", "name:et"=>"Omaan", "name:fa"=>"عمان", "name:fi"=>"Oman", "name:fr"=>"Oman", "name:fy"=>"Oman", "name:ga"=>"Óman", "name:gd"=>"Omàn", "name:he"=>"עומן", "name:hr"=>"Oman", "name:hu"=>"Omán", "name:id"=>"Oman", "name:is"=>"Óman", "name:it"=>"Oman", "name:ja"=>"オマーン", "name:la"=>"Omania", "name:lb"=>"Oman", "name:li"=>"Omaan", "name:lt"=>"Omanas", "name:mn"=>"Оман", "name:nl"=>"Oman", "name:pl"=>"Oman", "name:pt"=>"Omã", "name:ru"=>"Оман", "name:sl"=>"Oman", "name:sv"=>"Oman", "name:th"=>"ประเทศโอมาน", "name:tr"=>"Umman", "name:uk"=>"Оман", "name:vi"=>"Oman", "name:zh"=>"阿曼", "name:haw"=>"ʻOmana", "name:zh_py"=>"Aman", "name:zh_pyt"=>"Āmàn", "official_name"=>"سلطنة عُمان", "official_name:br"=>"Sultanad Oman", "official_name:ca"=>"Sultanat d'Oman ", "official_name:el"=>"Σουλτανάτο του Ομάν", "official_name:en"=>"Sultanate of Oman", "official_name:et"=>"Omaani Sultaniriik", "official_name:fr"=>"Sultanat d'Oman", "official_name:id"=>"Kesultanan Oman", "official_name:it"=>"Sultanato dell'Oman", "official_name:ja"=>"オマーン国", "official_name:lb"=>"Saltanat Uman", "official_name:lt"=>"Omano Sultonatas", "official_name:pl"=>"Sułtanat Omanu", "official_name:pt"=>"Sultanato do Omã", "official_name:sv"=>"Sultanatet Oman"  \N      137
-gi     "name"=>"Gibraltar", "name:ar"=>"جبل طارق", "name:be"=>"Гібралтар", "name:br"=>"Gibraltar", "name:el"=>"Γιβραλτάρ", "name:eo"=>"Ĝibraltaro", "name:fa"=>"جبل‌الطارق", "name:fi"=>"Gibraltar", "name:fr"=>"Gibraltar", "name:ga"=>"Giobráltar", "name:gd"=>"Giobraltair", "name:he"=>"גיברלטר", "name:hu"=>"Gibraltár", "name:is"=>"Gíbraltar", "name:it"=>"Gibilterra", "name:la"=>"Calpe", "name:lt"=>"Gibraltaras", "name:lv"=>"Gibraltārs", "name:mn"=>"Гибралтар", "name:pl"=>"Gibraltar", "name:ru"=>"Гибралтар", "name:sk"=>"Gibraltár", "name:sv"=>"Gibraltar", "name:th"=>"ยิบรอลตาร์", "name:tr"=>"Cebelitarık", "name:uk"=>"Гібралтар", "name:zh"=>"直布罗陀", "old_name"=>"Mons Calpe", "name:zh_py"=>"Zhibuluotuo", "name:zh_pyt"=>"Zhíbùluótuó"   \N      138
-lc     "name"=>"Saint Lucia", "name:af"=>"Sint Lucia", "name:ar"=>"سانت لوسيا", "name:be"=>"Святая Лусія", "name:br"=>"Saint Lucia", "name:da"=>"Saint Lucia", "name:de"=>"St. Lucia", "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:pl"=>"Saint Lucia", "name:pt"=>"Santa Lúcia", "name:ru"=>"Сент-Люсия", "name:sv"=>"Saint Lucia", "name:th"=>"ประเทศเซนต์ลูเซีย", "name:uk"=>"Сент-Люсія", "name:zh"=>"圣卢西亚岛" \N      146
-au     "name"=>"Australia", "name:af"=>"Australië", "name:ar"=>"أستراليا", "name:az"=>"Avstraliya", "name:be"=>"Аўстралія", "name:br"=>"Aostralia", "name:ca"=>"Austràlia", "name:cy"=>"Awstralia", "name:da"=>"Australien", "name:de"=>"Australien", "name:el"=>"Αυστραλία", "name:en"=>"Australia", "name:eo"=>"Aŭstralio", "name:et"=>"Austraalia", "name:fa"=>"استرالیا", "name:fi"=>"Australia", "name:fr"=>"Australie", "name:fy"=>"Austraalje", "name:ga"=>"An Astráil", "name:gd"=>"Astràilia", "name:he"=>"אוסטרליה", "name:hu"=>"Ausztrália", "name:hy"=>"Ավստրալիա", "name:is"=>"Ástralía", "name:it"=>"Australia", "name:ja"=>"オーストラリア", "name:lb"=>"Australien", "name:li"=>"Australië", "name:lt"=>"Australija", "name:lv"=>"Austrālija", "name:mn"=>"Австрали", "name:nl"=>"Australië", "name:pl"=>"Australia", "name:pt"=>"Austrália", "name:ru"=>"Австралия", "name:sl"=>"Avstralija", "name:sv"=>"Australien", "name:th"=>"ประเทศออสเตรเลีย", "name:tr"=>"Avustralya", "name:uk"=>"Австралія", "name:vi"=>"Úc", "name:zh"=>"澳大利亚", "official_name"=>"Commonwealth of Australia", "official_name:be"=>"Аўстралійскі саюз", "official_name:el"=>"Κοινοπολιτεία της Αυστραλίας", "official_name:es"=>"Mancomunidad de Australia", "official_name:fi"=>"Australian liittovaltio", "official_name:fr"=>"Commonwealth d’Australie", "official_name:id"=>"Negara Persemakmuran Australia", "official_name:lv"=>"Austrālijas Savienība", "official_name:pl"=>"Związek Australijski", "official_name:pt"=>"Comunidade da Austrália", "official_name:sv"=>"Australiska statsförbundet", "official_name:vi"=>"Liên bang Úc"  \N      139
-bg     "name"=>"България", "name:af"=>"Bulgarye", "name:ar"=>"بلغاريا", "name:be"=>"Балгарыя", "name:bg"=>"България", "name:br"=>"Bulgaria", "name:ca"=>"Bulgària", "name:cy"=>"Bwlgaria", "name:da"=>"Bulgarien", "name:de"=>"Bulgarien", "name:el"=>"Βουλγαρία", "name:en"=>"Bulgaria", "name:eo"=>"Bulgario", "name:es"=>"Bulgaria", "name:et"=>"Bulgaaria", "name:fa"=>"بلغارستان", "name:fi"=>"Bulgaria", "name:fr"=>"Bulgarie", "name:fy"=>"Bulgarije", "name:ga"=>"An Bhulgáir", "name:gd"=>"Bulgàiria", "name:he"=>"בולגריה", "name:hr"=>"Bugarska", "name:hu"=>"Bulgária", "name:id"=>"Bulgaria", "name:is"=>"Búlgaría", "name:it"=>"Bulgaria", "name:ja"=>"ブルガリア", "name:la"=>"Bulgaria", "name:lb"=>"Bulgarien", "name:li"=>"Bölgarieë", "name:lt"=>"Bulgarija", "name:lv"=>"Bulgārija", "name:mn"=>"Болгар", "name:nl"=>"Bulgarije", "name:pl"=>"Bułgaria", "name:pt"=>"Bulgária", "name:ru"=>"Болгария", "name:sk"=>"Bulharsko", "name:sl"=>"Bolgarija", "name:sv"=>"Bulgarien", "name:th"=>"ประเทศบัลแกเรีย", "name:tr"=>"Bulgaristan", "name:uk"=>"Болгарія", "name:vi"=>"Bulgaria", "name:zh"=>"保加利亚", "name:haw"=>"Pulukalia", "name:zh_py"=>"Baojialiya", "name:zh_pyt"=>"Bǎojiālìyà", "official_name"=>"Република България", "official_name:br"=>"Republik Bulgaria", "official_name:el"=>"Δημοκρατία της Βουλγαρίας", "official_name:en"=>"Republic of Bulgaria", "official_name:es"=>"República de Bulgaria", "official_name:et"=>"Bulgaaria Vabariik", "official_name:it"=>"Repubblica di Bulgaria", "official_name:ja"=>"ブルガリア共和国", "official_name:lb"=>"Republik Bulgarien", "official_name:lt"=>"Bulgarijos Respublika", "official_name:lv"=>"Bulgārijas Republika", "official_name:pl"=>"Republika Bułgarii", "official_name:pt"=>"República da Bulgária", "official_name:sk"=>"Bulharská republika", "official_name:sv"=>"Republiken Bulgarien", "official_name:vi"=>"Cộng hòa Bulgaria"      \N      140
+lc     "name"=>"Saint Lucia", "name:af"=>"Sint Lucia", "name:ar"=>"سانت لوسيا", "name:be"=>"Святая Лусія", "name:br"=>"Saint Lucia", "name:da"=>"Saint Lucia", "name:de"=>"St. Lucia", "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:pl"=>"Saint Lucia", "name:pt"=>"Santa Lúcia", "name:ru"=>"Сент-Люсия", "name:sv"=>"Saint Lucia", "name:th"=>"ประเทศเซนต์ลูเซีย", "name:uk"=>"Сент-Люсія", "name:zh"=>"圣卢西亚岛" lc      146
+om     "name"=>"سلطنة عُمان Oman", "name:af"=>"Oman", "name:ar"=>"عمان", "name:be"=>"Аман", "name:br"=>"Oman", "name:ca"=>"Oman", "name:cy"=>"Oman", "name:da"=>"Oman", "name:de"=>"Oman", "name:el"=>"Ομάν", "name:en"=>"Oman", "name:eo"=>"Omano", "name:es"=>"Omán", "name:et"=>"Omaan", "name:fa"=>"عمان", "name:fi"=>"Oman", "name:fr"=>"Oman", "name:fy"=>"Oman", "name:ga"=>"Óman", "name:gd"=>"Omàn", "name:he"=>"עומן", "name:hr"=>"Oman", "name:hu"=>"Omán", "name:id"=>"Oman", "name:is"=>"Óman", "name:it"=>"Oman", "name:ja"=>"オマーン", "name:la"=>"Omania", "name:lb"=>"Oman", "name:li"=>"Omaan", "name:lt"=>"Omanas", "name:mn"=>"Оман", "name:nl"=>"Oman", "name:pl"=>"Oman", "name:pt"=>"Omã", "name:ru"=>"Оман", "name:sl"=>"Oman", "name:sv"=>"Oman", "name:th"=>"ประเทศโอมาน", "name:tr"=>"Umman", "name:uk"=>"Оман", "name:vi"=>"Oman", "name:zh"=>"阿曼", "name:haw"=>"ʻOmana", "name:zh_py"=>"Aman", "name:zh_pyt"=>"Āmàn", "official_name"=>"سلطنة عُمان", "official_name:br"=>"Sultanad Oman", "official_name:ca"=>"Sultanat d'Oman ", "official_name:el"=>"Σουλτανάτο του Ομάν", "official_name:en"=>"Sultanate of Oman", "official_name:et"=>"Omaani Sultaniriik", "official_name:fr"=>"Sultanat d'Oman", "official_name:id"=>"Kesultanan Oman", "official_name:it"=>"Sultanato dell'Oman", "official_name:ja"=>"オマーン国", "official_name:lb"=>"Saltanat Uman", "official_name:lt"=>"Omano Sultonatas", "official_name:pl"=>"Sułtanat Omanu", "official_name:pt"=>"Sultanato do Omã", "official_name:sv"=>"Sultanatet Oman"  ar      137
+ru     "name"=>"Россия", "name:af"=>"Rusland", "name:ar"=>"روسيا الاتحادية", "name:az"=>"Rusiya Federasiyası", "name:be"=>"Расія", "name:br"=>"Rusia", "name:by"=>"Расія", "name:ca"=>"Rússia", "name:cy"=>"Ffederasiwn Rwsia", "name:da"=>"Rusland", "name:de"=>"Russland", "name:el"=>"Ρωσία", "name:en"=>"Russia", "name:eo"=>"Rusio", "name:es"=>"Rusia", "name:et"=>"Venemaa", "name:fa"=>"روسیه", "name:fi"=>"Venäjä", "name:fr"=>"Russie", "name:fy"=>"Ruslân", "name:ga"=>"An Rúis", "name:gd"=>"An Ruis", "name:he"=>"רוסיה", "name:hr"=>"Rusija", "name:hu"=>"Oroszország", "name:hy"=>"Ռուսաստան", "name:id"=>"Rusia", "name:is"=>"Rússland", "name:ja"=>"ロシア", "name:la"=>"Russia", "name:lb"=>"Russland", "name:li"=>"Rösland", "name:lt"=>"Rusija", "name:lv"=>"Krievija", "name:mn"=>"Орос", "name:nl"=>"Rusland", "name:pl"=>"Rosja", "name:pt"=>"Rússia", "name:ro"=>"Rusia", "name:ru"=>"Россия", "name:sl"=>"Rusija", "name:sv"=>"Ryssland", "name:th"=>"ประเทศรัสเซีย", "name:tr"=>"Rusya", "name:ua"=>"Росія", "name:uk"=>"Росія", "name:vi"=>"Nga", "name:zh"=>"俄罗斯", "alt_name"=>"Russia;Россия", "name:haw"=>"Rūsia", "name:zh_py"=>"Eluosi", "name:zh_pyt"=>"Éluósī", "official_name"=>"Российская Федерация", "official_name:af"=>"Russiese Federasie", "official_name:be"=>"Расійская Федэрацыя", "official_name:br"=>"Kevread Rusia", "official_name:ca"=>"Federació Russa", "official_name:el"=>"Ρωσική Ομοσπονδία", "official_name:en"=>"Russian Federation", "official_name:es"=>"Federación Rusa", "official_name:et"=>"Venemaa Föderatsioon", "official_name:id"=>"Federasi Rusia", "official_name:lb"=>"Russesch Federatioun", "official_name:lt"=>"Rusijos Federacija", "official_name:pl"=>"Federacja Rosyjska", "official_name:pt"=>"Federação Russa", "official_name:sl"=>"Ruska federacija", "official_name:sv"=>"Ryska federationen", "official_name:vi"=>"Liên Bang Nga"       ru      135
 cm     "name"=>"Cameroon;Cameroun", "name:af"=>"Kameroen", "name:ar"=>"الكاميرون", "name:be"=>"Камерун", "name:br"=>"Kameroun", "name:ca"=>"Camerun", "name:cy"=>"Camerŵn", "name:da"=>"Cameroun", "name:de"=>"Kamerun", "name:el"=>"Καμερούν", "name:en"=>"Cameroon", "name:eo"=>"Kameruno", "name:es"=>"Camerún", "name:et"=>"Kamerun", "name:eu"=>"Kamerun", "name:fa"=>"کامرون", "name:fi"=>"Kamerun", "name:fr"=>"Cameroun", "name:fy"=>"Kameroen", "name:ga"=>"Camarún", "name:gd"=>"Camarun", "name:he"=>"קמרון", "name:hr"=>"Kamerun", "name:hu"=>"Kamerun", "name:id"=>"Kamerun", "name:is"=>"Kamerún", "name:it"=>"Camerun", "name:ja"=>"カメルーン", "name:la"=>"Cameronia", "name:lb"=>"Kamerun", "name:li"=>"Kameroen", "name:lt"=>"Kamerūnas", "name:lv"=>"Kamerūna", "name:mn"=>"Камерун", "name:nl"=>"Kameroen", "name:pl"=>"Kamerun", "name:pt"=>"Camarões", "name:ru"=>"Камерун", "name:sl"=>"Kamerun", "name:sv"=>"Kamerun", "name:th"=>"ประเทศแคเมอรูน", "name:tr"=>"Kamerun", "name:uk"=>"Камерун", "name:vi"=>"Cameroon", "name:zh"=>"喀麦隆", "name:zh_py"=>"Kamailong", "name:zh_pyt"=>"Kāmàilóng", "official_name"=>"Republic of Cameroon;République du Cameroun", "official_name:el"=>"Δημοκρατία του Καμερούν", "official_name:gd"=>"Poblachd Chamarun", "official_name:id"=>"Republik Kamerun", "official_name:ja"=>"カメルーン共和国", "official_name:lt"=>"Kamerūno Respublika", "official_name:lv"=>"Kamerūnas Republika", "official_name:pt"=>"República dos Camarões", "official_name:sv"=>"Republiken Kamerun", "official_name:vi"=>"Cộng hòa Cameroon"   \N      141
-gd     "name"=>"Grenada", "name:ar"=>"غرينادا", "name:be"=>"Грэнада", "name:br"=>"Grenada", "name:da"=>"Grenada", "name:el"=>"Γρενάδα", "name:en"=>"Grenada", "name:eo"=>"Grenado", "name:es"=>"Granada", "name:fa"=>"گرنادا", "name:fi"=>"Grenada", "name:fr"=>"Grenade", "name:ga"=>"Greanáda", "name:gd"=>"Greanada", "name:he"=>"גרנדה", "name:hu"=>"Grenada", "name:is"=>"Grenada", "name:it"=>"Grenada", "name:ja"=>"グレナダ", "name:la"=>"Granata", "name:lb"=>"Granada", "name:lv"=>"Grenāda", "name:mn"=>"Гренада", "name:pl"=>"Granada", "name:ru"=>"Гренада", "name:sv"=>"Grenada", "name:th"=>"ประเทศเกรเนดา", "name:uk"=>"Гренада", "name:zh"=>"格林纳达"       \N      143
 iq     "name"=>"Iraq", "name:af"=>"Irak", "name:ar"=>"العراق", "name:be"=>"Ірак", "name:br"=>"Irak", "name:cy"=>"Irac", "name:da"=>"Irak", "name:de"=>"Irak", "name:el"=>"Ιράκ", "name:en"=>"Iraq", "name:eo"=>"Irako", "name:et"=>"Iraak", "name:fa"=>"عراق", "name:fi"=>"Irak", "name:fr"=>"Irak", "name:fy"=>"Irak", "name:ga"=>"An Iaráic", "name:gd"=>"Ioràc", "name:he"=>"עירק", "name:hr"=>"Irak", "name:hu"=>"Irak", "name:hy"=>"Իրաք", "name:id"=>"Irak", "name:is"=>"Írak", "name:it"=>"Iraq", "name:ja"=>"イラク", "name:la"=>"Iraquia", "name:lb"=>"Irak", "name:li"=>"Irak", "name:lt"=>"Irakas", "name:lv"=>"Irāka", "name:mn"=>"Ирак", "name:nb"=>"Irak", "name:nl"=>"Irak", "name:nn"=>"Irak", "name:no"=>"Irak", "name:pl"=>"Irak", "name:ru"=>"Ирак", "name:sl"=>"Irak", "name:sv"=>"Irak", "name:th"=>"ประเทศอิรัก", "name:tr"=>"Irak", "name:uk"=>"Ірак", "name:zh"=>"伊拉克", "name:haw"=>"‘Ilaka", "name:zh_py"=>"Yilake", "name:zh_pyt"=>"Yīlākè", "official_name"=>"جمهورية العراق", "official_name:el"=>"Δημοκρατία του Ιράκ", "official_name:en"=>"Republic of Iraq", "official_name:et"=>"Iraagi Vabariik", "official_name:gd"=>"Poblachd Ioràic", "official_name:id"=>"Republik Irak", "official_name:lb"=>"Republik Irak", "official_name:lt"=>"Irako Respublika", "official_name:lv"=>"Irākas Republika", "official_name:pl"=>"Republika Federalna Iraku", "official_name:sv"=>"Republiken Irak", "official_name:vi"=>"Cộng hoà Iraq"      \N      144
-mm     "name"=>"Myanmar", "name:af"=>"Mianmar", "name:ar"=>"ميانمار", "name:be"=>"М'янма", "name:br"=>"Birmania", "name:ca"=>"Burma", "name:da"=>"Myanmar", "name:el"=>"Μιανμάρ", "name:en"=>"Myanmar", "name:eo"=>"Birmo", "name:et"=>"Birma", "name:fa"=>"میانمار", "name:fi"=>"Myanmar", "name:fr"=>"Birmanie", "name:fy"=>"Birma", "name:ga"=>"Maenmar", "name:gd"=>"Mianmar", "name:he"=>"מיאנמר", "name:hr"=>"Mijanmar (Burma)", "name:hu"=>"Mianmar", "name:is"=>"Mjanmar", "name:it"=>"Birmania", "name:la"=>"Birmania", "name:li"=>"Burma", "name:lt"=>"Mianmaras", "name:lv"=>"Mjanma", "name:mn"=>"Мьянмар", "name:pl"=>"Birma", "name:ru"=>"Мьянма", "name:sl"=>"Mjanmar", "name:sv"=>"Burma", "name:th"=>"ประเทศพม่า", "name:uk"=>"М'янма", "name:vi"=>"Myanma", "name:zh"=>"缅甸", "name:haw"=>"Puruma", "name:zh_py"=>"Miandian", "name:zh_pyt"=>"Miǎndiàn", "official_name:id"=>"Persatuan Myanmar", "official_name:it"=>"Myanmar", "official_name:lt"=>"Mianmaro Sąjunga", "official_name:lv"=>"Mjanmas Savienība", "official_name:pl"=>"Związek Myanmar", "official_name:sv"=>"Unionen Myanmar", "official_name:vi"=>"Liên bang Myanma"        \N      148
-mr     "name"=>"موريتانيا", "name:af"=>"Mauritanië", "name:ar"=>"موريتانيا", "name:be"=>"Маўрытанія", "name:br"=>"Maouritania", "name:ca"=>"Mauritània", "name:cy"=>"Mauritania", "name:da"=>"Mauretanien", "name:de"=>"Mauretanien", "name:el"=>"Μαυριτανία", "name:en"=>"Mauritania", "name:eo"=>"Maŭritanio", "name:es"=>"Mauritania", "name:et"=>"Mauritaania", "name:fa"=>"موریتانی", "name:fi"=>"Mauritania", "name:fr"=>"Mauritanie", "name:fy"=>"Mauritaanje", "name:ga"=>"An Mháratáin", "name:gd"=>"Moratainia", "name:he"=>"מאוריטניה", "name:hr"=>"Mauritanija", "name:hu"=>"Mauritánia", "name:id"=>"Mauritania", "name:is"=>"Máritanía", "name:it"=>"Mauritania", "name:ja"=>"モーリタニア", "name:la"=>"Mauritania", "name:lb"=>"Mauretanien", "name:li"=>"Mauretanië", "name:lt"=>"Mauritanija", "name:lv"=>"Mauritānija", "name:mn"=>"Мавритани", "name:nl"=>"Mauritanië", "name:pl"=>"Mauretania", "name:pt"=>"Mauritânia", "name:ru"=>"Мавритания", "name:sl"=>"Mavretanija", "name:sv"=>"Mauretanien", "name:th"=>"ประเทศมอริเตเนีย", "name:tr"=>"Moritanya", "name:uk"=>"Мавританія", "name:vi"=>"Mauritanie", "name:zh"=>"毛里塔尼亚", "name:haw"=>"Mauritania", "name:zh_py"=>"Maolitaniya", "name:zh_pyt"=>"Máolǐtǎníyà", "official_name"=>"الجمهورية الإسلامية الموريتانية", "official_name:be"=>"Маўрытанская Ісламская Рэспубліка", "official_name:br"=>"Republik islamek Maouritania", "official_name:ca"=>"República Islàmica de Mauritània", "official_name:el"=>"Ισλαμική Δημοκρατία της Μαυριτανίας", "official_name:en"=>"Islamic Republic of Mauritania", "official_name:et"=>"Mauritaania Islamivabariik", "official_name:id"=>"Republik Islam Mauritania", "official_name:ja"=>"モーリタニア・イスラム共和国", "official_name:lb"=>"Islamesch Republik Mauretanien", "official_name:lt"=>"Mauritanijos Islamo Respublika", "official_name:lv"=>"Mauritānijas Islāma Republika", "official_name:pt"=>"República Islâmica da Mauritânia", "official_name:sv"=>"Islamiska republiken Mauretanien", "official_name:vi"=>"Cộng hòa Hồi giáo Mauritanie" \N      149
+bg     "name"=>"България", "name:af"=>"Bulgarye", "name:ar"=>"بلغاريا", "name:be"=>"Балгарыя", "name:bg"=>"България", "name:br"=>"Bulgaria", "name:ca"=>"Bulgària", "name:cy"=>"Bwlgaria", "name:da"=>"Bulgarien", "name:de"=>"Bulgarien", "name:el"=>"Βουλγαρία", "name:en"=>"Bulgaria", "name:eo"=>"Bulgario", "name:es"=>"Bulgaria", "name:et"=>"Bulgaaria", "name:fa"=>"بلغارستان", "name:fi"=>"Bulgaria", "name:fr"=>"Bulgarie", "name:fy"=>"Bulgarije", "name:ga"=>"An Bhulgáir", "name:gd"=>"Bulgàiria", "name:he"=>"בולגריה", "name:hr"=>"Bugarska", "name:hu"=>"Bulgária", "name:id"=>"Bulgaria", "name:is"=>"Búlgaría", "name:it"=>"Bulgaria", "name:ja"=>"ブルガリア", "name:la"=>"Bulgaria", "name:lb"=>"Bulgarien", "name:li"=>"Bölgarieë", "name:lt"=>"Bulgarija", "name:lv"=>"Bulgārija", "name:mn"=>"Болгар", "name:nl"=>"Bulgarije", "name:pl"=>"Bułgaria", "name:pt"=>"Bulgária", "name:ru"=>"Болгария", "name:sk"=>"Bulharsko", "name:sl"=>"Bolgarija", "name:sv"=>"Bulgarien", "name:th"=>"ประเทศบัลแกเรีย", "name:tr"=>"Bulgaristan", "name:uk"=>"Болгарія", "name:vi"=>"Bulgaria", "name:zh"=>"保加利亚", "name:haw"=>"Pulukalia", "name:zh_py"=>"Baojialiya", "name:zh_pyt"=>"Bǎojiālìyà", "official_name"=>"Република България", "official_name:br"=>"Republik Bulgaria", "official_name:el"=>"Δημοκρατία της Βουλγαρίας", "official_name:en"=>"Republic of Bulgaria", "official_name:es"=>"República de Bulgaria", "official_name:et"=>"Bulgaaria Vabariik", "official_name:it"=>"Repubblica di Bulgaria", "official_name:ja"=>"ブルガリア共和国", "official_name:lb"=>"Republik Bulgarien", "official_name:lt"=>"Bulgarijos Respublika", "official_name:lv"=>"Bulgārijas Republika", "official_name:pl"=>"Republika Bułgarii", "official_name:pt"=>"República da Bulgária", "official_name:sk"=>"Bulharská republika", "official_name:sv"=>"Republiken Bulgarien", "official_name:vi"=>"Cộng hòa Bulgaria"      bg      140
+gd     "name"=>"Grenada", "name:ar"=>"غرينادا", "name:be"=>"Грэнада", "name:br"=>"Grenada", "name:da"=>"Grenada", "name:el"=>"Γρενάδα", "name:en"=>"Grenada", "name:eo"=>"Grenado", "name:es"=>"Granada", "name:fa"=>"گرنادا", "name:fi"=>"Grenada", "name:fr"=>"Grenade", "name:ga"=>"Greanáda", "name:gd"=>"Greanada", "name:he"=>"גרנדה", "name:hu"=>"Grenada", "name:is"=>"Grenada", "name:it"=>"Grenada", "name:ja"=>"グレナダ", "name:la"=>"Granata", "name:lb"=>"Granada", "name:lv"=>"Grenāda", "name:mn"=>"Гренада", "name:pl"=>"Granada", "name:ru"=>"Гренада", "name:sv"=>"Grenada", "name:th"=>"ประเทศเกรเนดา", "name:uk"=>"Гренада", "name:zh"=>"格林纳达"       en      143
 mu     "name"=>"Mauritius", "name:af"=>"Mauritius", "name:ar"=>"موريشيوس", "name:be"=>"Маўрыкій", "name:br"=>"Moris", "name:ca"=>"Maurici", "name:da"=>"Mauritius", "name:el"=>"Μαυρίκιος", "name:en"=>"Mauritius", "name:eo"=>"Maŭricio", "name:es"=>"Mauricio", "name:fa"=>"موریس", "name:fi"=>"Mauritius", "name:fr"=>"Maurice", "name:fy"=>"Mauritsius", "name:ga"=>"Oileán Mhuirís", "name:gd"=>"Na h-Eileanan Mhoiriseas", "name:he"=>"מאוריציוס", "name:hr"=>"Mauricius", "name:hu"=>"Mauritius", "name:is"=>"Máritíus", "name:lt"=>"Mauricijus", "name:lv"=>"Maurīcija", "name:mn"=>"Маврикий", "name:pl"=>"Mauritius", "name:ru"=>"Маврикий", "name:sv"=>"Mauritius", "name:th"=>"ประเทศมอริเชียส", "name:uk"=>"Маврикій", "name:zh"=>"毛里求斯", "name:haw"=>"Mauritiusa", "name:zh_py"=>"Maoliquisi", "name:zh_pyt"=>"Máolǐqiúsī", "official_name"=>"Republic of Mauritius", "official_name:el"=>"Δημοκρατία του Μαυρίκιου", "official_name:es"=>"República de Mauricio", "official_name:fr"=>"République de Maurice", "official_name:id"=>"Republik Mauritius", "official_name:lb"=>"Republik Mauritius", "official_name:lt"=>"Mauricijaus Respublika", "official_name:lv"=>"Maurīcijas Republika", "official_name:pl"=>"Republika Mauritiusa;Republika Mauritiusu", "official_name:sv"=>"Republiken Mauritius", "official_name:vi"=>"Cộng hòa Mauritius"   \N      150
-ni     "name"=>"Nicaragua", "name:ar"=>"نيكاراغوا", "name:be"=>"Нікарагуа", "name:br"=>"Nicaragua", "name:da"=>"Nicaragua", "name:el"=>"Νικαράγουα", "name:en"=>"Nicaragua", "name:eo"=>"Nikaragvo", "name:fa"=>"نیکاراگوآ", "name:fi"=>"Nicaragua", "name:fr"=>"Nicaragua", "name:fy"=>"Nikaragua", "name:ga"=>"Nicearagua", "name:gd"=>"Niocaragua", "name:he"=>"ניקרגואה", "name:hr"=>"Nikaragva", "name:hu"=>"Nicaragua", "name:id"=>"Nikaragua", "name:is"=>"Níkaragva", "name:it"=>"Nicaragua", "name:ja"=>"ニカラグア", "name:lt"=>"Nikaragva", "name:lv"=>"Nikaragva", "name:mn"=>"Никарагуа", "name:pl"=>"Nikaragua", "name:ru"=>"Никарагуа", "name:sl"=>"Nikaragva", "name:sv"=>"Nicaragua", "name:th"=>"ประเทศนิการากัว", "name:tr"=>"Nikaragua", "name:uk"=>"Нікарагуа", "name:zh"=>"尼加拉瓜", "official_name"=>"República de Nicaragua", "official_name:be"=>"Рэспубліка Нікарагуа", "official_name:id"=>"Republik Nikaragua", "official_name:it"=>"Repubblica del Nicaragua", "official_name:ja"=>"ニカラグア共和国", "official_name:lt"=>"Nikaragvos Respublika", "official_name:lv"=>"Nikaragvas Republika", "official_name:pl"=>"Republika Nikaragui", "official_name:sv"=>"Republiken Nicaragua"        \N      151
-pa     "name"=>"Panama", "name:ar"=>"بنما", "name:be"=>"Панама", "name:br"=>"Panama", "name:ca"=>"Panamà", "name:da"=>"Panama", "name:en"=>"Panama", "name:eo"=>"Panamo", "name:es"=>"Panamá", "name:fa"=>"پاناما", "name:fi"=>"Panama", "name:fr"=>"Panama", "name:ga"=>"Panama", "name:he"=>"פנמה", "name:hu"=>"Panama", "name:is"=>"Panama", "name:it"=>"Panamá", "name:ja"=>"パナマ", "name:li"=>"Pánama", "name:lv"=>"Panama", "name:mn"=>"Панама", "name:pl"=>"Panama", "name:ru"=>"Панама", "name:sv"=>"Panama", "name:th"=>"ประเทศปานามา", "name:uk"=>"Панама", "name:zh"=>"巴拿马", "official_name"=>"República de Panamá", "official_name:be"=>"Рэспубліка Панама", "official_name:en"=>"Republic of Panama", "official_name:gd"=>"Poblachd Phanama", "official_name:id"=>"Republik Panama", "official_name:it"=>"Repubblica di Panamá", "official_name:ja"=>"パナマ共和国", "official_name:lt"=>"Panamos Respublika", "official_name:lv"=>"Panamas Republika", "official_name:pl"=>"Republika Panamy", "official_name:sv"=>"Republiken Panama", "official_name:vi"=>"Cộng hoà Panama"   \N      152
-sm     "name"=>"San Marino", "name:ar"=>"سان مارينو", "name:be"=>"Сан-Марына", "name:br"=>"San Marino", "name:da"=>"San Marino", "name:el"=>"Άγιος Μαρίνος", "name:en"=>"San Marino", "name:eo"=>"San-Marino", "name:fa"=>"سان مارینو", "name:fi"=>"San Marino", "name:fr"=>"Saint-Marin", "name:ga"=>"San Mairíne", "name:he"=>"סן מרינו", "name:hu"=>"San Marino", "name:is"=>"San Marínó", "name:la"=>"Sancti Marini", "name:lt"=>"San Marinas", "name:mn"=>"Сан-Марино", "name:pl"=>"San Marino", "name:pt"=>"San Marino", "name:ru"=>"Сан-Марино", "name:sk"=>"San Maríno", "name:sv"=>"San Marino", "name:th"=>"ประเทศซานมารีโน", "name:uk"=>"Сан-Марино", "name:zh"=>"圣马力诺", "name:haw"=>"Sana Marino", "name:zh_py"=>"Shengmalinuo", "name:zh_pyt"=>"Shèngmǎlìnuò", "official_name:id"=>"Republik San Marino", "official_name:lb"=>"Republik San Marino", "official_name:lt"=>"San Marino Respublika", "official_name:pt"=>"Sereníssima República de San Marino", "official_name:sk"=>"Sanmarínska republika", "official_name:sv"=>"Republiken San Marino", "official_name:vi"=>"Cộng hòa Đại bình yên San Marino"   \N      153
+ni     "name"=>"Nicaragua", "name:ar"=>"نيكاراغوا", "name:be"=>"Нікарагуа", "name:br"=>"Nicaragua", "name:da"=>"Nicaragua", "name:el"=>"Νικαράγουα", "name:en"=>"Nicaragua", "name:eo"=>"Nikaragvo", "name:fa"=>"نیکاراگوآ", "name:fi"=>"Nicaragua", "name:fr"=>"Nicaragua", "name:fy"=>"Nikaragua", "name:ga"=>"Nicearagua", "name:gd"=>"Niocaragua", "name:he"=>"ניקרגואה", "name:hr"=>"Nikaragva", "name:hu"=>"Nicaragua", "name:id"=>"Nikaragua", "name:is"=>"Níkaragva", "name:it"=>"Nicaragua", "name:ja"=>"ニカラグア", "name:lt"=>"Nikaragva", "name:lv"=>"Nikaragva", "name:mn"=>"Никарагуа", "name:pl"=>"Nikaragua", "name:ru"=>"Никарагуа", "name:sl"=>"Nikaragva", "name:sv"=>"Nicaragua", "name:th"=>"ประเทศนิการากัว", "name:tr"=>"Nikaragua", "name:uk"=>"Нікарагуа", "name:zh"=>"尼加拉瓜", "official_name"=>"República de Nicaragua", "official_name:be"=>"Рэспубліка Нікарагуа", "official_name:id"=>"Republik Nikaragua", "official_name:it"=>"Repubblica del Nicaragua", "official_name:ja"=>"ニカラグア共和国", "official_name:lt"=>"Nikaragvos Respublika", "official_name:lv"=>"Nikaragvas Republika", "official_name:pl"=>"Republika Nikaragui", "official_name:sv"=>"Republiken Nicaragua"        es      151
+pa     "name"=>"Panama", "name:ar"=>"بنما", "name:be"=>"Панама", "name:br"=>"Panama", "name:ca"=>"Panamà", "name:da"=>"Panama", "name:en"=>"Panama", "name:eo"=>"Panamo", "name:es"=>"Panamá", "name:fa"=>"پاناما", "name:fi"=>"Panama", "name:fr"=>"Panama", "name:ga"=>"Panama", "name:he"=>"פנמה", "name:hu"=>"Panama", "name:is"=>"Panama", "name:it"=>"Panamá", "name:ja"=>"パナマ", "name:li"=>"Pánama", "name:lv"=>"Panama", "name:mn"=>"Панама", "name:pl"=>"Panama", "name:ru"=>"Панама", "name:sv"=>"Panama", "name:th"=>"ประเทศปานามา", "name:uk"=>"Панама", "name:zh"=>"巴拿马", "official_name"=>"República de Panamá", "official_name:be"=>"Рэспубліка Панама", "official_name:en"=>"Republic of Panama", "official_name:gd"=>"Poblachd Phanama", "official_name:id"=>"Republik Panama", "official_name:it"=>"Repubblica di Panamá", "official_name:ja"=>"パナマ共和国", "official_name:lt"=>"Panamos Respublika", "official_name:lv"=>"Panamas Republika", "official_name:pl"=>"Republika Panamy", "official_name:sv"=>"Republiken Panama", "official_name:vi"=>"Cộng hoà Panama"   es      152
+sm     "name"=>"San Marino", "name:ar"=>"سان مارينو", "name:be"=>"Сан-Марына", "name:br"=>"San Marino", "name:da"=>"San Marino", "name:el"=>"Άγιος Μαρίνος", "name:en"=>"San Marino", "name:eo"=>"San-Marino", "name:fa"=>"سان مارینو", "name:fi"=>"San Marino", "name:fr"=>"Saint-Marin", "name:ga"=>"San Mairíne", "name:he"=>"סן מרינו", "name:hu"=>"San Marino", "name:is"=>"San Marínó", "name:la"=>"Sancti Marini", "name:lt"=>"San Marinas", "name:mn"=>"Сан-Марино", "name:pl"=>"San Marino", "name:pt"=>"San Marino", "name:ru"=>"Сан-Марино", "name:sk"=>"San Maríno", "name:sv"=>"San Marino", "name:th"=>"ประเทศซานมารีโน", "name:uk"=>"Сан-Марино", "name:zh"=>"圣马力诺", "name:haw"=>"Sana Marino", "name:zh_py"=>"Shengmalinuo", "name:zh_pyt"=>"Shèngmǎlìnuò", "official_name:id"=>"Republik San Marino", "official_name:lb"=>"Republik San Marino", "official_name:lt"=>"San Marino Respublika", "official_name:pt"=>"Sereníssima República de San Marino", "official_name:sk"=>"Sanmarínska republika", "official_name:sv"=>"Republiken San Marino", "official_name:vi"=>"Cộng hòa Đại bình yên San Marino"   it      153
 so     "name"=>"Somalia / الصومال", "name:af"=>"Somalië", "name:ar"=>"الصومال", "name:be"=>"Самалі", "name:br"=>"Somalia", "name:ca"=>"Somàlia", "name:cy"=>"Somalia", "name:da"=>"Somalia", "name:de"=>"Somalia", "name:el"=>"Σομαλία", "name:en"=>"Somalia", "name:eo"=>"Somalio", "name:es"=>"Somalia", "name:et"=>"Somaalia", "name:fa"=>"سومالی", "name:fi"=>"Somalia", "name:fr"=>"Somalie", "name:fy"=>"Somaalje", "name:ga"=>"An tSomáil", "name:gd"=>"Somàilia", "name:he"=>"סומליה", "name:hr"=>"Somalija", "name:hu"=>"Szomália", "name:id"=>"Somalia", "name:is"=>"Sómalía", "name:it"=>"Somalia", "name:ja"=>"ソマリア", "name:la"=>"Somalia", "name:lb"=>"Somalia", "name:li"=>"Somalië", "name:lt"=>"Somalis", "name:lv"=>"Somālija", "name:mn"=>"Сомали", "name:nl"=>"Somalië", "name:pl"=>"Somalia", "name:pt"=>"Somália", "name:ru"=>"Сомали", "name:sl"=>"Somalija", "name:so"=>"Soomaaliya", "name:sv"=>"Somalia", "name:th"=>"ประเทศโซมาเลีย", "name:tr"=>"Somali", "name:uk"=>"Сомалі", "name:vi"=>"Somalia", "name:zh"=>"索马里", "name:haw"=>"Somalia", "name:zh_py"=>"Suomali", "name:zh_pyt"=>"Suǒmǎlǐ", "official_name"=>"Somali Republic", "official_name:ar"=>"جمهورية الصومال‎", "official_name:br"=>"Republik Somalia", "official_name:el"=>"Δημοκρατία της Σομαλίας", "official_name:en"=>"Somali Republic", "official_name:et"=>"Somaalia Vabariik", "official_name:fr"=>"République de Somalie", "official_name:lb"=>"Republik Somalia", "official_name:lt"=>"Somalio Respublika", "official_name:pt"=>"República Somali", "official_name:so"=>"Jamhuuriyadda Soomaaliya", "official_name:sv"=>"Republiken Somalia", "official_name:vi"=>"Cộng hòa Somalia"      \N      154
 ug     "name"=>"Uganda", "name:ar"=>"أوغندا", "name:be"=>"Уганда", "name:br"=>"Ouganda", "name:el"=>"Ουγκάντα", "name:en"=>"Uganda", "name:eo"=>"Ugando", "name:es"=>"Uganda", "name:fa"=>"اوگاندا", "name:fi"=>"Uganda", "name:fr"=>"Ouganda", "name:ga"=>"Uganda", "name:he"=>"אוגנדה", "name:hu"=>"Uganda", "name:is"=>"Úganda", "name:it"=>"Uganda", "name:ja"=>"ウガンダ", "name:li"=>"Oeganda", "name:lv"=>"Uganda", "name:mn"=>"Уганда", "name:nl"=>"Oeganda", "name:pl"=>"Uganda", "name:ru"=>"Уганда", "name:sv"=>"Uganda", "name:th"=>"ประเทศยูกันดา", "name:uk"=>"Уганда", "name:zh"=>"乌干达", "name:zh_py"=>"Wuganda", "name:zh_pyt"=>"Wūgāndá", "official_name"=>"Republic of Uganda;Jamhuri ya Uganda", "official_name:br"=>"Republik Ouganda", "official_name:gd"=>"Poblachd Uganda", "official_name:id"=>"Republik Uganda", "official_name:lt"=>"Ugandos Respublika", "official_name:sv"=>"Republiken Uganda" \N      155
-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"=>"孟加拉国", "name:haw"=>"Banagaladesa", "name:zh_py"=>"Mengjialaguo", "name:zh_pyt"=>"Mèngjiālāguó", "official_name:el"=>"Λαϊκή Δημοκρατία του Μπανγκλαντές", "official_name:fi"=>"Belgian kuningaskunta", "official_name:id"=>"Republik Rakyat Bangladesh", "official_name:it"=>"Repubblica Popolare del Bangladesh", "official_name:la"=>"Res Publica Popularis Bangladeshae", "official_name:lt"=>"Bangladešo Liaudies Respublika", "official_name:lv"=>"Bangladešas Tautas Republika", "official_name:pl"=>"Ludowa Republika Bangladeszu", "official_name:pt"=>"República Popular do Bangladesh", "official_name:sv"=>"Folkrepubliken Bangladesh", "official_name:vi"=>"Cộng hoà Nhân dân Bangladesh"        \N      158
-kh     "name"=>"Cambodia", "name:af"=>"Kambodja", "name:ar"=>"كمبوديا", "name:be"=>"Камбоджа", "name:br"=>"Kambodja", "name:ca"=>"Cambodja", "name:da"=>"Cambodja", "name:de"=>"Kambodscha", "name:el"=>"Καμπότζη", "name:en"=>"Cambodia", "name:eo"=>"Kamboĝo", "name:et"=>"Kambodža", "name:eu"=>"Kanputxea", "name:fa"=>"کامبوج", "name:fi"=>"Kambodža", "name:fr"=>"Cambodge", "name:fy"=>"Kambodja", "name:ga"=>"An Chambóid", "name:gd"=>"Cambuidea", "name:he"=>"קמבודיה", "name:hr"=>"Kambodža", "name:hu"=>"Kambodzsa", "name:id"=>"Kamboja", "name:is"=>"Kambódía", "name:it"=>"Cambogia", "name:ja"=>"カンボジア", "name:la"=>"Cambosia", "name:lb"=>"Kambodscha", "name:li"=>"Cambodja", "name:lt"=>"Kambodža", "name:lv"=>"Kambodža", "name:mn"=>"Камбож", "name:nl"=>"Cambodja", "name:pl"=>"Kambodża", "name:pt"=>"Camboja", "name:ru"=>"Камбоджа", "name:sl"=>"Kambodža", "name:sv"=>"Kambodja", "name:th"=>"ประเทศ กัมพูชา", "name:tr"=>"Kamboçya", "name:uk"=>"Камбоджа", "name:vi"=>"Campuchia", "name:zh"=>"高棉", "name:haw"=>"Kamabodia", "name:zh_py"=>"Gaomian", "name:zh_pyt"=>"Gāomián", "official_name:af"=>"Koninkryk van Kambodja", "official_name:el"=>"Βασίλειο της Καμπότζης", "official_name:id"=>"Kerajaan Kamboja", "official_name:it"=>"Regno di Cambogia", "official_name:ja"=>"カンボジア王国", "official_name:lt"=>"Kambodžos Karalystė", "official_name:lv"=>"Kambodžas Karaliste", "official_name:pl"=>"Królestwo Kambodży", "official_name:pt"=>"Reino do Camboja", "official_name:sv"=>"Konungariket Kambodja", "official_name:vi"=>"Vương quốc Campuchia"     \N      159
 tl     "name"=>"Timor-Leste; Timor Lorosa'e", "name:af"=>"Oos-Timor", "name:ar"=>"جمهورية تيمور", "name:br"=>"Timor ar Reter", "name:ca"=>"Timor Oriental", "name:cy"=>"Dwyrain Timor", "name:da"=>"Østtimor", "name:de"=>"Osttimor", "name:en"=>"East Timor", "name:eo"=>"Orienta Timoro", "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:nl"=>"Oost-Timor", "name:pl"=>"Timor Wschodni", "name:pt"=>"Timor-Leste", "name:ru"=>"Тимор-Лесте", "name:sl"=>"Vzhodni Timor", "name:sv"=>"Östtimor", "name:th"=>"ประเทศติมอร์ตะวันออก", "name:tl"=>"Silangan Timor", "name:tr"=>"Doğu Timor", "name:uk"=>"Східний Тимор", "name:vi"=>"Đông Timor", "name:zh"=>"东帝汶", "alt_name"=>"East Timor", "name:tet"=>"Timor Lorosa'e", "official_name"=>"Repúblika Demokrátika Timor Lorosa'e; República Democrática de Timor-Leste", "official_name:en"=>"Democratic Republic of Timor-Leste", "official_name:et"=>"Timor-Leste Demokraatlik Vabariik", "official_name:gd"=>"Poblachd deomocrasach Timor-Leste", "official_name:id"=>"Republik Demokratik Timor Leste", "official_name:lb"=>"Demokratesch Republik Timor-Leste", "official_name:lt"=>"Rytų Timoro Demokratinė Respublika", "official_name:pl"=>"Demokratyczna Republika Timoru Wschodniego", "official_name:pt"=>"República Democrática de Timor-Leste", "official_name:ru"=>"Демократическая Республика Тимор-Лесте", "official_name:sv"=>"Demokratiska republiken Östtimor", "official_name:tl"=>"Demokratikong Republika ng Silangan Timor", "official_name:vi"=>"Cộng hòa Dân chủ Đông Timor", "official_name:tet"=>"Repúblika Demokrátika Timor Lorosa'e"        \N      161
-lv     "name"=>"Latvija", "name:af"=>"Letland", "name:ar"=>"لاتفيا", "name:be"=>"Латвія", "name:br"=>"Latvia", "name:ca"=>"Letònia", "name:cy"=>"Latfia", "name:da"=>"Letland", "name:de"=>"Lettland", "name:el"=>"Λεττονία", "name:en"=>"Latvia", "name:eo"=>"Latvio", "name:es"=>"Letonia", "name:et"=>"Läti", "name:fa"=>"لتونی", "name:fi"=>"Latvia", "name:fr"=>"Lettonie", "name:fy"=>"Letlân", "name:ga"=>"An Laitvia", "name:gd"=>"An Laitbhe", "name:he"=>"לטביה", "name:hu"=>"Lettország", "name:id"=>"Latvia", "name:is"=>"Lettland", "name:it"=>"Lettonia", "name:ja"=>"ラトビア", "name:la"=>"Lettonia", "name:lb"=>"Lettland", "name:li"=>"Letland", "name:mn"=>"Латви", "name:nl"=>"Letland", "name:pl"=>"Łotwa", "name:ru"=>"Латвия", "name:sk"=>"Lotyšsko", "name:sv"=>"Lettland", "name:th"=>"ประเทศลัตเวีย", "name:tr"=>"Letonya", "name:uk"=>"Латвія", "name:vi"=>"Latvia", "name:zh"=>"拉脱维亚", "name:zh_py"=>"Latuoweiya", "name:zh_pyt"=>"Lātuōwéiyà", "official_name"=>"Latvijas Republika", "official_name:be"=>"Латвійская Рэспубліка", "official_name:el"=>"Δημοκρατία της Λεττονίας", "official_name:en"=>"Republic of Latvia", "official_name:es"=>"República de Letonia", "official_name:et"=>"Läti Vabariik", "official_name:id"=>"Republik Latvia", "official_name:it"=>"Repubblica di Lettonia", "official_name:lt"=>"Latvijos Respublika", "official_name:pl"=>"Republika Łotwy", "official_name:sk"=>"Lotyšská republika", "official_name:sv"=>"Republiken Lettland", "official_name:vi"=>"Cộng hòa Latvia"  \N      162
+kh     "name"=>"Cambodia", "name:af"=>"Kambodja", "name:ar"=>"كمبوديا", "name:be"=>"Камбоджа", "name:br"=>"Kambodja", "name:ca"=>"Cambodja", "name:da"=>"Cambodja", "name:de"=>"Kambodscha", "name:el"=>"Καμπότζη", "name:en"=>"Cambodia", "name:eo"=>"Kamboĝo", "name:et"=>"Kambodža", "name:eu"=>"Kanputxea", "name:fa"=>"کامبوج", "name:fi"=>"Kambodža", "name:fr"=>"Cambodge", "name:fy"=>"Kambodja", "name:ga"=>"An Chambóid", "name:gd"=>"Cambuidea", "name:he"=>"קמבודיה", "name:hr"=>"Kambodža", "name:hu"=>"Kambodzsa", "name:id"=>"Kamboja", "name:is"=>"Kambódía", "name:it"=>"Cambogia", "name:ja"=>"カンボジア", "name:la"=>"Cambosia", "name:lb"=>"Kambodscha", "name:li"=>"Cambodja", "name:lt"=>"Kambodža", "name:lv"=>"Kambodža", "name:mn"=>"Камбож", "name:nl"=>"Cambodja", "name:pl"=>"Kambodża", "name:pt"=>"Camboja", "name:ru"=>"Камбоджа", "name:sl"=>"Kambodža", "name:sv"=>"Kambodja", "name:th"=>"ประเทศ กัมพูชา", "name:tr"=>"Kamboçya", "name:uk"=>"Камбоджа", "name:vi"=>"Campuchia", "name:zh"=>"高棉", "name:haw"=>"Kamabodia", "name:zh_py"=>"Gaomian", "name:zh_pyt"=>"Gāomián", "official_name:af"=>"Koninkryk van Kambodja", "official_name:el"=>"Βασίλειο της Καμπότζης", "official_name:id"=>"Kerajaan Kamboja", "official_name:it"=>"Regno di Cambogia", "official_name:ja"=>"カンボジア王国", "official_name:lt"=>"Kambodžos Karalystė", "official_name:lv"=>"Kambodžas Karaliste", "official_name:pl"=>"Królestwo Kambodży", "official_name:pt"=>"Reino do Camboja", "official_name:sv"=>"Konungariket Kambodja", "official_name:vi"=>"Vương quốc Campuchia"     km      159
 mg     "name"=>"Madagascar", "name:af"=>"Madagaskar", "name:ar"=>"مدغشقر", "name:be"=>"Мадагаскар", "name:br"=>"Madagaskar", "name:da"=>"Madagaskar", "name:de"=>"Madagaskar", "name:el"=>"Μαδαγασκάρη", "name:en"=>"Madagascar", "name:eo"=>"Madagaskaro", "name:es"=>"Madagascar", "name:et"=>"Madagaskar", "name:fa"=>"ماداگاسکار", "name:fi"=>"Madagaskar", "name:fr"=>"Madagascar", "name:fy"=>"Madagaskar", "name:ga"=>"Madagascar", "name:he"=>"מדגסקר", "name:hr"=>"Madagaskar", "name:hu"=>"Madagaszkár", "name:id"=>"Madagaskar", "name:is"=>"Madagaskar", "name:it"=>"Madagascar", "name:ja"=>"マダガスカル", "name:la"=>"Madagascaria", "name:lb"=>"Madagaskar", "name:li"=>"Madagaskar", "name:lt"=>"Madagaskaras", "name:lv"=>"Madagaskara", "name:mn"=>"Мадагаскар", "name:nl"=>"Madagaskar", "name:pl"=>"Madagaskar", "name:ru"=>"Мадагаскар", "name:sl"=>"Madagaskar", "name:sv"=>"Madagaskar", "name:th"=>"ประเทศมาดากัสการ์", "name:tr"=>"Madagaskar", "name:uk"=>"Мадагаскар", "name:zh"=>"马达加斯加", "name:haw"=>"Madagaseka", "name:zh_py"=>"Madajiasijia", "name:zh_pyt"=>"Mǎdájiāsījiā", "official_name"=>"Repoblikan'i Madagasikara", "official_name:el"=>"Δημοκρατία της Μαδαγασκάρης", "official_name:en"=>"Republic of Madagascar", "official_name:es"=>"República de Madagascar", "official_name:fr"=>"République de Madagascar", "official_name:id"=>"Republik Madagaskar", "official_name:lt"=>"Madagaskaro Respublika", "official_name:lv"=>"Madagaskaras Republika", "official_name:pl"=>"Republika Madagaskaru", "official_name:sv"=>"Republiken Madagaskar", "official_name:vi"=>"Cộng hòa Madagascar"  \N      164
 mt     "name"=>"Malta", "name:ar"=>"مالطا", "name:be"=>"Мальта", "name:br"=>"Malta", "name:ca"=>"República de Malta", "name:el"=>"Μάλτα", "name:en"=>"Malta", "name:eo"=>"Malto", "name:fa"=>"مالت", "name:fi"=>"Malta", "name:fr"=>"Malte", "name:ga"=>"Málta", "name:he"=>"מלטה", "name:hu"=>"Málta", "name:is"=>"Malta", "name:ja"=>"マルタ", "name:la"=>"Melita", "name:lv"=>"Malta", "name:mn"=>"Мальта", "name:pl"=>"Malta", "name:ru"=>"Мальта", "name:sk"=>"Malta", "name:sv"=>"Malta", "name:th"=>"ประเทศมอลตา", "name:uk"=>"Мальта", "name:zh"=>"马尔他", "name:haw"=>"Malata", "name:zh_py"=>"Maerta", "name:zh_pyt"=>"Mǎěrtā", "official_name:el"=>"Δημοκρατία της Μάλτας", "official_name:id"=>"Republik Malta", "official_name:ja"=>"マルタ共和国", "official_name:lb"=>"Republik Malta", "official_name:lt"=>"Maltos Respublika", "official_name:lv"=>"Maltas Republika", "official_name:sk"=>"Maltská republika", "official_name:sv"=>"Republiken Malta", "official_name:vi"=>"Cộng hòa Malta"        \N      165
-mx     "name"=>"México", "name:af"=>"Meksiko", "name:ar"=>"المكسيك", "name:be"=>"Мексіка", "name:br"=>"Mec’hiko", "name:ca"=>"Mèxic", "name:cy"=>"Mexico", "name:da"=>"Mexico", "name:de"=>"Mexiko", "name:el"=>"Μεξικό", "name:en"=>"Mexico", "name:eo"=>"Meksiko", "name:es"=>"México", "name:et"=>"Mehhiko", "name:fa"=>"مکزیک", "name:fi"=>"Meksiko", "name:fr"=>"Mexique", "name:fy"=>"Meksiko", "name:ga"=>"Meicsiceo", "name:gd"=>"Meagsago", "name:he"=>"מקסיקו", "name:hr"=>"Meksiko", "name:hu"=>"Mexikó", "name:id"=>"Meksiko", "name:is"=>"Mexíkó", "name:it"=>"Messico", "name:ja"=>"メキシコ", "name:la"=>"Mexicum", "name:lb"=>"Mexiko", "name:li"=>"Mexico", "name:lt"=>"Meksika", "name:lv"=>"Meksika", "name:mn"=>"Мексик", "name:nl"=>"Mexico", "name:pl"=>"Meksyk", "name:ru"=>"Мексика", "name:sl"=>"Mehika", "name:sv"=>"Mexiko", "name:th"=>"ประเทศเม็กซิโก", "name:tr"=>"Meksika", "name:uk"=>"Мексика", "name:zh"=>"墨西哥", "official_name"=>"Estados Unidos Mexicanos", "official_name:be"=>"Мексіканскія Злучаныя Штаты", "official_name:br"=>"Stadoù Unanet Mec’hiko", "official_name:el"=>"Ηνωμένες Πολιτείες του Μεξικού", "official_name:et"=>"Mehhiko Ühendriigid", "official_name:id"=>"Persatuan Negara-Negara Meksiko", "official_name:it"=>"Stati Uniti Messicani", "official_name:ja"=>"メキシコ合衆国", "official_name:lb"=>"Vereenegt mexikanesch Staaten", "official_name:lt"=>"Meksikos Jungtinės Valstijos", "official_name:lv"=>"Meksikas Savienotās Valstis", "official_name:pl"=>"Meksykańskie Stany Zjednoczone", "official_name:sv"=>"Mexikos förenta stater", "official_name:vi"=>"Liên bang México"       \N      166
-mn     "name"=>"Монгол Улс", "name:af"=>"Mongolië", "name:ar"=>"منغوليا", "name:az"=>"Monqolustan", "name:be"=>"Манголія", "name:br"=>"Mongolia", "name:ca"=>"Mongòlia", "name:cy"=>"Mongolia", "name:da"=>"Mongoliet", "name:de"=>"Mongolei", "name:el"=>"Μογγολία", "name:en"=>"Mongolia", "name:eo"=>"Mongolio", "name:es"=>"Mongolia", "name:et"=>"Mongoolia", "name:fa"=>"مغولستان", "name:fi"=>"Mongolia", "name:fr"=>"Mongolie", "name:fy"=>"Mongoalje", "name:ga"=>"An Mhongóil", "name:gd"=>"Mongòilia", "name:he"=>"מונגוליה", "name:hr"=>"Mongolija", "name:hu"=>"Mongólia", "name:id"=>"Mongolia", "name:is"=>"Mongólía", "name:it"=>"Mongolia", "name:ja"=>"モンゴル", "name:la"=>"Mogolia", "name:lb"=>"Mongolei", "name:li"=>"Mongolië", "name:lt"=>"Mongolija", "name:lv"=>"Mongolija", "name:mn"=>"Монгол Улс", "name:nl"=>"Mongolië", "name:pl"=>"Mongolia", "name:pt"=>"Mongólia", "name:ru"=>"Монголия", "name:sl"=>"Mongolija", "name:sv"=>"Mongoliet", "name:th"=>"ประเทศมองโกเลีย", "name:tr"=>"Moğolistan", "name:uk"=>"Монголія", "name:vi"=>"Mông Cổ", "name:zh"=>"蒙古国", "name:haw"=>"Monokolia", "official_name:pl"=>"Republika Mongolska"   \N      167
-pl     "name"=>"Polska", "name:af"=>"Pole", "name:ar"=>"بولندا", "name:be"=>"Польшча", "name:br"=>"Polonia", "name:ca"=>"Polònia", "name:cy"=>"Gwlad Pwyl", "name:da"=>"Polen", "name:de"=>"Polen", "name:el"=>"Πολωνία", "name:en"=>"Poland", "name:eo"=>"Pollando", "name:es"=>"Polonia", "name:et"=>"Poola", "name:fa"=>"لهستان", "name:fi"=>"Puola", "name:fr"=>"Pologne", "name:fy"=>"Poalen", "name:ga"=>"An Pholainn", "name:gd"=>"A' Phòlainn", "name:he"=>"פולין", "name:hr"=>"Poljska", "name:hu"=>"Lengyelország", "name:hy"=>"Լեհաստան", "name:id"=>"Polandia", "name:is"=>"Pólland", "name:it"=>"Polonia", "name:ja"=>"ポーランド", "name:la"=>"Polonia", "name:lb"=>"Polen", "name:li"=>"Pole", "name:lt"=>"Lenkija", "name:lv"=>"Polija", "name:mn"=>"Польш", "name:nl"=>"Polen", "name:no"=>"Polen", "name:pl"=>"Polska", "name:ru"=>"Польша", "name:sk"=>"Poľsko", "name:sl"=>"Poljska", "name:sv"=>"Polen", "name:th"=>"ประเทศโปแลนด์", "name:tr"=>"Polonya", "name:uk"=>"Польща", "name:vi"=>"Ba Lan", "name:zh"=>"波兰", "name:haw"=>"Pōlani", "name:zh_py"=>"Bolan", "name:zh_pyt"=>"Bōlán", "official_name"=>"Rzeczpospolita Polska", "official_name:be"=>"Рэспубліка Польшча", "official_name:el"=>"Δημοκρατία της Πολωνίας", "official_name:en"=>"Republic of Poland", "official_name:eo"=>"Pola Respubliko", "official_name:es"=>"República Polaca", "official_name:et"=>"Poola Vabariik", "official_name:fr"=>"République de Pologne", "official_name:it"=>"Repubblica di Polonia", "official_name:ja"=>"ポーランド共和国", "official_name:lt"=>"Lenkijos Respublika", "official_name:nl"=>"Republiek Polen", "official_name:ru"=>"Респу́блика По́льша", "official_name:sk"=>"Poľská republika", "official_name:sv"=>"Republiken Polen", "official_name:vi"=>"Cộng hòa Ba Lan"       \N      168
-vc     "name"=>"Saint Vincent and the Grenadines", "name:af"=>"Sint Vincent en die Grenadines", "name:ar"=>"سانت فنسنت وجزر غرينادين", "name:be"=>"Святы Вінцэнт і Грэнадзіны", "name:br"=>"Saint Vincent ha Grenadines", "name:ca"=>"Saint Vincent i les Grenadines", "name:cy"=>"Saint Vincent a'r Grenadines", "name:da"=>"Saint Vincent og Grenadinerne", "name:de"=>"Saint Vincent und die Grenadinen", "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:sv"=>"Saint Vincent och Grenadinerna", "name:th"=>"ประเทศเซนต์วินเซนต์และเกรนาดีนส์", "name:tr"=>"Saint Vincent ve Grenadinler", "name:uk"=>"Сент-Вінсент і Гренадини", "name:vi"=>"Saint Vincent và Grenadines", "name:zh"=>"圣文森特和格林纳丁斯"    \N      171
-ua     "name"=>"Україна", "name:af"=>"Oekraïne", "name:ar"=>"أوكرانيا", "name:be"=>"Украіна", "name:br"=>"Ukraina", "name:ca"=>"Ucraïna", "name:cy"=>"Wcráin", "name:da"=>"Ukraine", "name:de"=>"Ukraine", "name:el"=>"Ουκρανία", "name:en"=>"Ukraine", "name:eo"=>"Ukrainio", "name:es"=>"Ucrania", "name:et"=>"Ukraina", "name:fa"=>"اوکراین", "name:fi"=>"Ukraina", "name:fr"=>"Ukraine", "name:fy"=>"de Oekraïne", "name:ga"=>"An Úcráin", "name:gd"=>"An Ùcrain", "name:he"=>"אוקראינה", "name:hr"=>"Ukrajina", "name:hu"=>"Ukrajna", "name:id"=>"Ukraina", "name:is"=>"Úkraína", "name:it"=>"Ucraina", "name:ja"=>"ウクライナ", "name:la"=>"Ucraina", "name:lb"=>"Ukraine", "name:li"=>"De Oekraïne", "name:lt"=>"Ukraina", "name:lv"=>"Ukraina", "name:mn"=>"Украйн", "name:nl"=>"Oekraïne", "name:pl"=>"Ukraina", "name:pt"=>"Ucrânia", "name:ru"=>"Украина", "name:sk"=>"Ukrajina", "name:sl"=>"Ukrajina", "name:sv"=>"Ukraina", "name:th"=>"ประเทศยูเครน", "name:tr"=>"Ukrayna", "name:uk"=>"Україна", "name:vi"=>"Ukraina", "name:zh"=>"乌克兰", "name:haw"=>"‘Ukelena", "name:zh_py"=>"Wukelan", "name:zh_pyt"=>"Wūkèlán"        \N      173
-uy     "name"=>"Uruguay", "name:ar"=>"أوروغواي", "name:be"=>"Уругвай", "name:br"=>"Uruguay", "name:ca"=>"Uruguai", "name:da"=>"Uruguay", "name:el"=>"Ουρουγουάη", "name:en"=>"Uruguay", "name:eo"=>"Urugvajo", "name:fa"=>"اروگوئه", "name:fi"=>"Uruguay", "name:fr"=>"Uruguay", "name:fy"=>"Urûguay", "name:ga"=>"Uragua", "name:gd"=>"Uruguaidh", "name:he"=>"אורוגואי", "name:hr"=>"Urugvaj", "name:hu"=>"Uruguay", "name:is"=>"Úrúgvæ", "name:ja"=>"ウルグアイ", "name:la"=>"Uruguaia", "name:li"=>"Urugay", "name:lt"=>"Urugvajus", "name:lv"=>"Urugvaja", "name:mn"=>"Уругвай", "name:pl"=>"Urugwaj", "name:pt"=>"Uruguai", "name:ru"=>"Уругвай", "name:sl"=>"Urugvaj", "name:sv"=>"Uruguay", "name:th"=>"ประเทศอุรุกวัย", "name:uk"=>"Уругвай", "name:zh"=>"乌拉圭", "official_name"=>"Oriental Republic of Uruguay", "official_name:br"=>"Republik-Reter Uruguay", "official_name:es"=>"República Oriental del Uruguay", "official_name:fr"=>"République orientale de l'Uruguay", "official_name:id"=>"Republik Timur Uruguay", "official_name:lb"=>"Republik östlich vum Uruguay", "official_name:lt"=>"Urugvajaus Rytų Respublika", "official_name:pl"=>"Wschodnia Republika Urugwaju", "official_name:pt"=>"República Oriental do Uruguai", "official_name:sv"=>"Republiken Uruguay"      \N      174
-ai     "name"=>"Anguilla", "name:ar"=>"أنجويلا", "name:az"=>"Angilya", "name:br"=>"Anguilla", "name:el"=>"Ανγκουίλα", "name:en"=>"Anguilla", "name:eo"=>"Angvilo", "name:es"=>"Anguila", "name:eu"=>"Angila", "name:fa"=>"آنگویلا", "name:fi"=>"Anguilla", "name:fr"=>"Anguilla", "name:ga"=>"Angaíle", "name:he"=>"אנגווילה", "name:hr"=>"Angvila", "name:hu"=>"Anguilla", "name:is"=>"Angvilla", "name:lt"=>"Angilija", "name:lv"=>"Angilja", "name:mn"=>"Ангилья", "name:pl"=>"Anguilla", "name:ru"=>"Ангилья", "name:sl"=>"Angvila", "name:sv"=>"Anguilla", "name:th"=>"แองกวิลลา", "name:uk"=>"Ангілья", "name:zh"=>"安圭拉"    \N      175
-bm     "name"=>"Bermuda", "name:ar"=>"برمودا", "name:be"=>"Бярмуды", "name:br"=>"Bermuda", "name:ca"=>"Bermudes", "name:da"=>"Bermuda", "name:el"=>"Βερμούδες", "name:en"=>"Bermuda", "name:eo"=>"Bermudo", "name:fa"=>"برمودا", "name:fi"=>"Bermuda", "name:fr"=>"Bermudes", "name:ga"=>"Beirmiúda", "name:he"=>"ברמודה", "name:hu"=>"Bermuda", "name:is"=>"Bermúda", "name:lv"=>"Bermudu salas", "name:mn"=>"Бермудын Арал", "name:pl"=>"Bermudy", "name:pt"=>"Bermuda", "name:ru"=>"Бермуды", "name:sl"=>"Bermudi", "name:sv"=>"Bermuda", "name:th"=>"เบอร์มิวดา", "name:uk"=>"Бермудські острови", "name:zh"=>"百慕大"      \N      176
+mn     "name"=>"Монгол Улс", "name:af"=>"Mongolië", "name:ar"=>"منغوليا", "name:az"=>"Monqolustan", "name:be"=>"Манголія", "name:br"=>"Mongolia", "name:ca"=>"Mongòlia", "name:cy"=>"Mongolia", "name:da"=>"Mongoliet", "name:de"=>"Mongolei", "name:el"=>"Μογγολία", "name:en"=>"Mongolia", "name:eo"=>"Mongolio", "name:es"=>"Mongolia", "name:et"=>"Mongoolia", "name:fa"=>"مغولستان", "name:fi"=>"Mongolia", "name:fr"=>"Mongolie", "name:fy"=>"Mongoalje", "name:ga"=>"An Mhongóil", "name:gd"=>"Mongòilia", "name:he"=>"מונגוליה", "name:hr"=>"Mongolija", "name:hu"=>"Mongólia", "name:id"=>"Mongolia", "name:is"=>"Mongólía", "name:it"=>"Mongolia", "name:ja"=>"モンゴル", "name:la"=>"Mogolia", "name:lb"=>"Mongolei", "name:li"=>"Mongolië", "name:lt"=>"Mongolija", "name:lv"=>"Mongolija", "name:mn"=>"Монгол Улс", "name:nl"=>"Mongolië", "name:pl"=>"Mongolia", "name:pt"=>"Mongólia", "name:ru"=>"Монголия", "name:sl"=>"Mongolija", "name:sv"=>"Mongoliet", "name:th"=>"ประเทศมองโกเลีย", "name:tr"=>"Moğolistan", "name:uk"=>"Монголія", "name:vi"=>"Mông Cổ", "name:zh"=>"蒙古国", "name:haw"=>"Monokolia", "official_name:pl"=>"Republika Mongolska"   mn      167
+bm     "name"=>"Bermuda", "name:ar"=>"برمودا", "name:be"=>"Бярмуды", "name:br"=>"Bermuda", "name:ca"=>"Bermudes", "name:da"=>"Bermuda", "name:el"=>"Βερμούδες", "name:en"=>"Bermuda", "name:eo"=>"Bermudo", "name:fa"=>"برمودا", "name:fi"=>"Bermuda", "name:fr"=>"Bermudes", "name:ga"=>"Beirmiúda", "name:he"=>"ברמודה", "name:hu"=>"Bermuda", "name:is"=>"Bermúda", "name:lv"=>"Bermudu salas", "name:mn"=>"Бермудын Арал", "name:pl"=>"Bermudy", "name:pt"=>"Bermuda", "name:ru"=>"Бермуды", "name:sl"=>"Bermudi", "name:sv"=>"Bermuda", "name:th"=>"เบอร์มิวดา", "name:uk"=>"Бермудські острови", "name:zh"=>"百慕大"      en      176
+ua     "name"=>"Україна", "name:af"=>"Oekraïne", "name:ar"=>"أوكرانيا", "name:be"=>"Украіна", "name:br"=>"Ukraina", "name:ca"=>"Ucraïna", "name:cy"=>"Wcráin", "name:da"=>"Ukraine", "name:de"=>"Ukraine", "name:el"=>"Ουκρανία", "name:en"=>"Ukraine", "name:eo"=>"Ukrainio", "name:es"=>"Ucrania", "name:et"=>"Ukraina", "name:fa"=>"اوکراین", "name:fi"=>"Ukraina", "name:fr"=>"Ukraine", "name:fy"=>"de Oekraïne", "name:ga"=>"An Úcráin", "name:gd"=>"An Ùcrain", "name:he"=>"אוקראינה", "name:hr"=>"Ukrajina", "name:hu"=>"Ukrajna", "name:id"=>"Ukraina", "name:is"=>"Úkraína", "name:it"=>"Ucraina", "name:ja"=>"ウクライナ", "name:la"=>"Ucraina", "name:lb"=>"Ukraine", "name:li"=>"De Oekraïne", "name:lt"=>"Ukraina", "name:lv"=>"Ukraina", "name:mn"=>"Украйн", "name:nl"=>"Oekraïne", "name:pl"=>"Ukraina", "name:pt"=>"Ucrânia", "name:ru"=>"Украина", "name:sk"=>"Ukrajina", "name:sl"=>"Ukrajina", "name:sv"=>"Ukraina", "name:th"=>"ประเทศยูเครน", "name:tr"=>"Ukrayna", "name:uk"=>"Україна", "name:vi"=>"Ukraina", "name:zh"=>"乌克兰", "name:haw"=>"‘Ukelena", "name:zh_py"=>"Wukelan", "name:zh_pyt"=>"Wūkèlán"        uk      173
+uy     "name"=>"Uruguay", "name:ar"=>"أوروغواي", "name:be"=>"Уругвай", "name:br"=>"Uruguay", "name:ca"=>"Uruguai", "name:da"=>"Uruguay", "name:el"=>"Ουρουγουάη", "name:en"=>"Uruguay", "name:eo"=>"Urugvajo", "name:fa"=>"اروگوئه", "name:fi"=>"Uruguay", "name:fr"=>"Uruguay", "name:fy"=>"Urûguay", "name:ga"=>"Uragua", "name:gd"=>"Uruguaidh", "name:he"=>"אורוגואי", "name:hr"=>"Urugvaj", "name:hu"=>"Uruguay", "name:is"=>"Úrúgvæ", "name:ja"=>"ウルグアイ", "name:la"=>"Uruguaia", "name:li"=>"Urugay", "name:lt"=>"Urugvajus", "name:lv"=>"Urugvaja", "name:mn"=>"Уругвай", "name:pl"=>"Urugwaj", "name:pt"=>"Uruguai", "name:ru"=>"Уругвай", "name:sl"=>"Urugvaj", "name:sv"=>"Uruguay", "name:th"=>"ประเทศอุรุกวัย", "name:uk"=>"Уругвай", "name:zh"=>"乌拉圭", "official_name"=>"Oriental Republic of Uruguay", "official_name:br"=>"Republik-Reter Uruguay", "official_name:es"=>"República Oriental del Uruguay", "official_name:fr"=>"République orientale de l'Uruguay", "official_name:id"=>"Republik Timur Uruguay", "official_name:lb"=>"Republik östlich vum Uruguay", "official_name:lt"=>"Urugvajaus Rytų Respublika", "official_name:pl"=>"Wschodnia Republika Urugwaju", "official_name:pt"=>"República Oriental do Uruguai", "official_name:sv"=>"Republiken Uruguay"      es      174
+vc     "name"=>"Saint Vincent and the Grenadines", "name:af"=>"Sint Vincent en die Grenadines", "name:ar"=>"سانت فنسنت وجزر غرينادين", "name:be"=>"Святы Вінцэнт і Грэнадзіны", "name:br"=>"Saint Vincent ha Grenadines", "name:ca"=>"Saint Vincent i les Grenadines", "name:cy"=>"Saint Vincent a'r Grenadines", "name:da"=>"Saint Vincent og Grenadinerne", "name:de"=>"Saint Vincent und die Grenadinen", "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:sv"=>"Saint Vincent och Grenadinerna", "name:th"=>"ประเทศเซนต์วินเซนต์และเกรนาดีนส์", "name:tr"=>"Saint Vincent ve Grenadinler", "name:uk"=>"Сент-Вінсент і Гренадини", "name:vi"=>"Saint Vincent và Grenadines", "name:zh"=>"圣文森特和格林纳丁斯"    en      171
 ag     "name"=>"Antigua and Barbuda", "name:af"=>"Antigua en Barbuda", "name:ar"=>"أنتيغوا وبربودا", "name:az"=>"Antiqua və Barbuda", "name:be"=>"Антыгуа і Барбуда", "name:br"=>"Antigua ha Barbuda", "name:ca"=>"Antigua i Barbuda", "name:cy"=>"Antigua a Barbuda", "name:da"=>"Antigua og Barbuda", "name:de"=>"Antigua und 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:fi"=>"Antigua ja Barbuda", "name:fr"=>"Antigua-et-Barbuda", "name:fy"=>"Antigua en Barbûda", "name:ga"=>"Antigua agus Barbúda", "name:gd"=>"Antigua agus Barbuda", "name:he"=>"אנטיגואה וברבודה", "name:hr"=>"Antigva i Barbuda", "name:hu"=>"Antigua és Barbuda", "name:id"=>"Antigua dan Barbuda", "name:is"=>"Antígva og Barbúda", "name:it"=>"Antigua e Barbuda", "name:la"=>"Antiqua et Barbuda", "name:lb"=>"Antigua a Barbuda", "name:li"=>"Antigua en Barbuda", "name:lt"=>"Antigva ir Barbuda", "name:lv"=>"Antigva un Barbuda", "name:mn"=>"Антигуа ба Барбуда", "name:nb"=>"Antigua og Barbuda", "name:nl"=>"Antigua en Barbuda", "name:nn"=>"Antigua og Barbuda", "name:no"=>"Antigua og Barbuda", "name:pl"=>"Antigua i Barbuda", "name:pt"=>"Antígua e Barbuda", "name:ru"=>"Антигуа и Барбуда", "name:sl"=>"Antigva in Barbuda", "name:sv"=>"Antigua och Barbuda", "name:th"=>"ประเทศแอนติกาและบาร์บูดา", "name:tr"=>"Antigua ve Barbuda", "name:uk"=>"Антигуа і Барбуда", "name:vi"=>"Antigua và Barbuda", "name:zh"=>"安提瓜和巴布达"       en      205
 bb     "name"=>"Barbados", "name:ar"=>"بربادوس", "name:be"=>"Барбадас", "name:br"=>"Barbados", "name:da"=>"Barbados", "name:el"=>"Μπαρμπάντος", "name:en"=>"Barbados", "name:eo"=>"Barbado", "name:es"=>"Barbados", "name:fa"=>"باربادوس", "name:fi"=>"Barbados", "name:fr"=>"Barbade", "name:ga"=>"Barbadós", "name:he"=>"ברבדוס", "name:hu"=>"Barbados", "name:is"=>"Barbados", "name:it"=>"Barbados", "name:ja"=>"バルバドス", "name:la"=>"Barbata", "name:lt"=>"Barbadosas", "name:lv"=>"Barbadosa", "name:mn"=>"Барбадос", "name:pl"=>"Barbados", "name:pt"=>"Barbados", "name:ru"=>"Барбадос", "name:sv"=>"Barbados", "name:th"=>"ประเทศบาร์เบโดส", "name:uk"=>"Барбадос", "name:zh"=>"巴巴多斯" en      206
 bs     "name"=>"Bahamas", "name:ar"=>"جزر البهاما", "name:az"=>"Baham adaları", "name:be"=>"Багамы", "name:br"=>"Bahamas", "name:ca"=>"Bahames", "name:cy"=>"Y Bahamas", "name:el"=>"Μπαχάμες", "name:en"=>"Bahamas", "name:eo"=>"Bahamoj", "name:et"=>"Bahama", "name:eu"=>"Bahamak", "name:fa"=>"باهاما", "name:fi"=>"Bahama", "name:fr"=>"Bahamas", "name:fy"=>"de Bahama's", "name:ga"=>"Na Bahámaí", "name:gd"=>"Na h-Eileanan Bhathama", "name:he"=>"בהמה", "name:hr"=>"Bahami", "name:hu"=>"Bahama-szigetek", "name:id"=>"Bahama", "name:is"=>"Bahamaeyjar", "name:it"=>"Bahamas", "name:la"=>"Insulae Bahamenses", "name:li"=>"Bahama-eilen", "name:lt"=>"Bahamos", "name:lv"=>"Bahamu salas", "name:mn"=>"Багамын арлууд", "name:nl"=>"Bahama's", "name:pl"=>"Bahamy", "name:pt"=>"Bahamas", "name:ru"=>"Багамы", "name:sl"=>"Bahami", "name:sv"=>"Bahamas", "name:th"=>"ประเทศบาฮามาส", "name:tr"=>"Bahamalar", "name:uk"=>"Багамські Острови", "name:zh"=>"巴哈马", "official_name"=>"Commonwealth of The Bahamas", "official_name:be"=>"Садружнасць Багамскіх астравоў", "official_name:el"=>"Κοινοπολιτεία των Μπαχαμών", "official_name:fi"=>"Bahaman kansainyhteisö", "official_name:id"=>"Persemakmuran Bahama", "official_name:it"=>"Commonwealth delle Bahamas", "official_name:lt"=>"Bahamų Sandrauga", "official_name:lv"=>"Bahamu Salu Sadraudzība", "official_name:pl"=>"Wspólnota Bahamów", "official_name:pt"=>"Comunidade das Bahamas", "official_name:sv"=>"Samväldet Bahamas"        en      207
@@ -276,28 +227,52 @@ tg        "name"=>"Togo", "name:ar"=>"توغو", "name:be"=>"Тога", "name:br"=>"Tog
 ca     "name"=>"Canada", "name:af"=>"Kanada", "name:ar"=>"كندا", "name:be"=>"Канада", "name:br"=>"Kanada", "name:ca"=>"Canadà", "name:de"=>"Kanada", "name:el"=>"Καναδάς", "name:en"=>"Canada", "name:eo"=>"Kanado", "name:es"=>"Canadá", "name:eu"=>"Kanada", "name:fa"=>"کانادا", "name:fi"=>"Kanada", "name:fr"=>"Canada", "name:fy"=>"Kanada", "name:ga"=>"Ceanada", "name:he"=>"קנדה", "name:hr"=>"Kanada", "name:hu"=>"Kanada", "name:hy"=>"Կանադա", "name:id"=>"Kanada", "name:is"=>"Kanada", "name:it"=>"Canada", "name:ja"=>"カナダ", "name:lb"=>"Kanada", "name:lt"=>"Kanada", "name:lv"=>"Kanāda", "name:mn"=>"Канад", "name:pl"=>"Kanada", "name:pt"=>"Canadá", "name:ru"=>"Канада", "name:sl"=>"Kanada", "name:sv"=>"Kanada", "name:th"=>"ประเทศแคนาดา", "name:tr"=>"Kanada", "name:uk"=>"Канада", "name:zh"=>"加拿大", "name:zh_py"=>"Jianada", "name:zh_pyt"=>"Jiānádà"  \N      244
 at     "name"=>"Österreich", "name:af"=>"Oostenryk", "name:ar"=>"النمسا", "name:be"=>"Аўстрыя", "name:bg"=>"Австрия", "name:br"=>"Aostria", "name:ca"=>"Àustria", "name:cs"=>"Rakousko", "name:cy"=>"Awstria", "name:da"=>"Østrig", "name:el"=>"Αυστρία", "name:en"=>"Austria", "name:eo"=>"Aŭstrio", "name:es"=>"Austria", "name:et"=>"Austria", "name:fa"=>"اتریش", "name:fi"=>"Itävalta", "name:fr"=>"Autriche", "name:fy"=>"Eastenryk", "name:ga"=>"An Ostair", "name:gd"=>"An Ostair", "name:he"=>"אוסטריה", "name:hr"=>"Austrija", "name:hu"=>"Ausztria", "name:hy"=>"Ավստրիա", "name:id"=>"Austria", "name:is"=>"Austurríki", "name:it"=>"Austria", "name:ja"=>"オーストリア", "name:la"=>"Austria", "name:lb"=>"Éisträich", "name:li"=>"Oosteriek", "name:lt"=>"Austrija", "name:lv"=>"Austrija", "name:mn"=>"Австри", "name:nl"=>"Oostenrijk", "name:pl"=>"Austria", "name:ro"=>"Austria", "name:ru"=>"Австрия", "name:sk"=>"Rakúsko", "name:sl"=>"Avstrija", "name:sv"=>"Österrike", "name:th"=>"ประเทศออสเตรีย", "name:tr"=>"Avusturya", "name:uk"=>"Австрія", "name:vi"=>"Áo", "name:zh"=>"奥地利", "name:haw"=>"‘Aukekulia", "name:zh_py"=>"Audili", "name:zh_pyt"=>"Àodìlì", "official_name:el"=>"Δημοκρατία της Αυστρίας", "official_name:fr"=>"République d'Autriche", "official_name:id"=>"Republik Austria", "official_name:it"=>"Repubblica d'Austria", "official_name:ja"=>"オーストリア共和国", "official_name:lb"=>"Republik Éisträich", "official_name:lt"=>"Austrijos Respublika", "official_name:lv"=>"Austrijas Republika", "official_name:sk"=>"Rakúska republika", "official_name:sv"=>"Republiken Österrike", "official_name:vi"=>"Cộng hòa Áo"     de      245
 li     "name"=>"Liechtenstein", "name:ar"=>"ليختنشتاين", "name:be"=>"Ліхтэнштэйн", "name:br"=>"Liechtenstein", "name:el"=>"Λιχτενστάιν", "name:eo"=>"Liĥtenŝtejno", "name:fa"=>"لیختن‌اشتاین", "name:fi"=>"Liechtenstein", "name:fr"=>"Liechtenstein", "name:fy"=>"Lychtenstein", "name:ga"=>"Lichtinstéin", "name:he"=>"ליכטנשטיין", "name:hr"=>"Lihtenštajn", "name:hu"=>"Liechtenstein", "name:is"=>"Liechtenstein", "name:ja"=>"リヒテンシュタイン", "name:la"=>"Lichtenstenum", "name:lt"=>"Lichtenšteinas", "name:lv"=>"Lihtenšteina", "name:mn"=>"Лихтенштейн", "name:pl"=>"Liechtenstein", "name:ru"=>"Лихтенштейн", "name:sk"=>"Lichtenštajnsko", "name:sl"=>"Lihtenštajn", "name:sv"=>"Liechtenstein", "name:th"=>"ประเทศลิกเตนสไตน์", "name:tr"=>"Lihtenştayn", "name:uk"=>"Ліхтенштейн", "name:zh"=>"列支敦士登", "name:haw"=>"Likenekaina", "name:zh_py"=>"Liezhidunshideng", "name:zh_pyt"=>"Lièzhīdūnshìdēng", "official_name"=>"Fürstentum Liechtenstein", "official_name:be"=>"Княства Ліхтэнштэйн", "official_name:br"=>"Priñselezh Liechtenstein", "official_name:de"=>"Fürstentum Liechtenstein", "official_name:el"=>"Πριγκηπάτο του Λιχτενστάιν", "official_name:en"=>"Principality of Liechtenstein", "official_name:es"=>"Principado de Liechtenstein", "official_name:id"=>"Kepangeranan Liechtenstein", "official_name:it"=>"Principato del Liechtenstein", "official_name:ja"=>"リヒテンシュタイン公国", "official_name:lb"=>"Fürstentum Liechtenstein", "official_name:lt"=>"Lichtenšteino Kunigaikštystė", "official_name:lv"=>"Lihtenšteinas Firstiste", "official_name:pl"=>"Księstwo Liechtenstein", "official_name:ru"=>"Кня́жество Лихтенште́йн", "official_name:sk"=>"Lichtenštajnské kniežatstvo", "official_name:sl"=>"Kneževina Líhtenštajn", "official_name:sv"=>"Furstendömet Liechtenstein", "official_name:vi"=>"Công quốc Liechtenstein"        de      246
-ss     "name"=>"South Sudan", "name:ar"=>"جنوب السودان", "name:br"=>"Soudan ar Su", "name:cs"=>"Jižní Súdán", "name:de"=>"Südsudan", "name:en"=>"South Sudan", "name:es"=>"Sudán del Sur", "name:et"=>"Lõuna-Sudaan", "name:fa"=>"سودان جنوبی", "name:fr"=>"Sud-Soudan", "name:hr"=>"Južni Sudan", "name:ku"=>"Sûdana Başûr", "name:ru"=>"Южный Судан", "name:sk"=>"Južný Sudán", "name:sl"=>"Južni Sudan", "name:tl"=>"Timog Sudan", "name:vi"=>"Nam Sudan", "name:zh"=>"南蘇丹", "int_name"=>"South Sudan", "name:ast"=>"Sudán del Sur", "official_name"=>"Republic of South Sudan", "official_name:br"=>"Republik Soudan ar Su", "official_name:cs"=>"Republika Jižní Súdán", "official_name:de"=>"Republik Südsudan", "official_name:en"=>"Republic of South Sudan", "official_name:es"=>"República de Sudán del Sur", "official_name:fr"=>"République du Sud-Soudan", "official_name:hr"=>"Republika Južni Sudan", "official_name:ku"=>"Komara Sûdana Başûr", "official_name:sk"=>"Juhosudánska republika", "official_name:tl"=>"Republika ng Timog Sudan" \N      247
 cw     "name"=>"Curaçao", "name:en"=>"Curaçao", "name:es"=>"Curazao", "name:fr"=>"Curaçao", "name:ru"=>"Кюрасао", "name:sv"=>"Curaçao", "name:pap"=>"Kòrsou"       \N      248
 sx     "name"=>"Sint Maarten"  \N      249
-bq     \N      \N      250
+ad     "name"=>"Andorra", "name:ar"=>"أندورا", "name:be"=>"Андора", "name:bg"=>"Андора", "name:br"=>"Andorra", "name:ca"=>"Andorra", "name:el"=>"Ανδόρρα", "name:eo"=>"Andoro", "name:fa"=>"آندورا", "name:fi"=>"Andorra", "name:fr"=>"Andorre", "name:ga"=>"Andóra", "name:he"=>"אנדורה", "name:hr"=>"Andora", "name:hu"=>"Andorra", "name:hy"=>"Անդորրա", "name:is"=>"Andorra", "name:it"=>"Andorra", "name:ja"=>"アンドラ", "name:ka"=>"ანდორა", "name:ko"=>"안도라", "name:lt"=>"Andora", "name:lv"=>"Andora", "name:mn"=>"Андорра", "name:oc"=>"Andòrra", "name:pl"=>"Andora", "name:pt"=>"Andorra", "name:ru"=>"Андорра", "name:sk"=>"Andorra", "name:sl"=>"Andora", "name:sv"=>"Andorra", "name:th"=>"ประเทศอันดอร์รา", "name:uk"=>"Андора", "name:zh"=>"安道尔", "name:haw"=>"‘Anakola", "name:sco"=>"Andorrae", "name:zh_py"=>"Andaoer", "name:zh_pyt"=>"Āndàoěr", "official_name:el"=>"Πριγκηπάτο της Ανδόρρας", "official_name:fi"=>"Andorran ruhtinaskunta", "official_name:fr"=>"Principauté d'Andorre", "official_name:id"=>"Kepangeranan Andorra", "official_name:ja"=>"アンドラ公国", "official_name:la"=>"Principatus Andorrae", "official_name:lt"=>"Andoros Kunigaikštystė", "official_name:lv"=>"Andoras Firstiste", "official_name:pt"=>"Principado de Andorra", "official_name:sk"=>"Andorrské kniežatstvo", "official_name:sv"=>"Furstendömet Andorra", "official_name:vi"=>"Công quốc Andorra"  ca      35
+ai     "name"=>"Anguilla", "name:ar"=>"أنجويلا", "name:az"=>"Angilya", "name:br"=>"Anguilla", "name:el"=>"Ανγκουίλα", "name:en"=>"Anguilla", "name:eo"=>"Angvilo", "name:es"=>"Anguila", "name:eu"=>"Angila", "name:fa"=>"آنگویلا", "name:fi"=>"Anguilla", "name:fr"=>"Anguilla", "name:ga"=>"Angaíle", "name:he"=>"אנגווילה", "name:hr"=>"Angvila", "name:hu"=>"Anguilla", "name:is"=>"Angvilla", "name:lt"=>"Angilija", "name:lv"=>"Angilja", "name:mn"=>"Ангилья", "name:pl"=>"Anguilla", "name:ru"=>"Ангилья", "name:sl"=>"Angvila", "name:sv"=>"Anguilla", "name:th"=>"แองกวิลลา", "name:uk"=>"Ангілья", "name:zh"=>"安圭拉"    en      175
+am     "name"=>"Armenia", "name:af"=>"Armenië", "name:ar"=>"أرمينيا", "name:az"=>"Ermənistan", "name:be"=>"Арменія", "name:br"=>"Armenia", "name:ca"=>"Armènia", "name:da"=>"Armenien", "name:de"=>"Armenien", "name:el"=>"Αρμενία", "name:en"=>"Armenia", "name:eo"=>"Armenio", "name:fa"=>"ارمنستان", "name:fi"=>"Armenia", "name:fr"=>"Arménie", "name:fy"=>"Armeenje", "name:ga"=>"An Airméin", "name:gd"=>"Airmeinia", "name:he"=>"ארמניה", "name:hu"=>"Örményország", "name:hy"=>"Հայաստան", "name:is"=>"Armenía", "name:it"=>"Armenia", "name:ja"=>"アルメニア", "name:lb"=>"Armenien", "name:li"=>"Armenië", "name:lt"=>"Armėnija", "name:lv"=>"Armēnija", "name:mn"=>"Армен", "name:nl"=>"Armenië", "name:pl"=>"Armenia", "name:pt"=>"Armênia", "name:ru"=>"Армения", "name:sl"=>"Armenija", "name:sv"=>"Armenien", "name:th"=>"ประเทศอาร์เมเนีย", "name:tr"=>"Ermenistan", "name:uk"=>"Вірменія", "name:zh"=>"亚美尼亚", "name:haw"=>"‘Āmēnia", "name:zh_py"=>"Yameiniya", "name:zh_pyt"=>"Yàměiníyà", "official_name"=>"Republic of Armenia", "official_name:el"=>"Δημοκρατία της Αρμενίας", "official_name:fi"=>"Armenian tasavalta", "official_name:fr"=>"République d'Arménie", "official_name:id"=>"Republik Armenia", "official_name:it"=>"Repubblica di Armenia", "official_name:lt"=>"Armėnijos Respublika", "official_name:lv"=>"Armēnijas Republika", "official_name:pl"=>"Republika Armenii", "official_name:sv"=>"Republiken Armenien", "official_name:vi"=>"Cộng hoà Armenia" hy      33
+ao     "name"=>"Angola", "name:ar"=>"أنغولا", "name:az"=>"Anqola", "name:be"=>"Ангола", "name:br"=>"Angola", "name:ca"=>"Angola", "name:co"=>"Angola", "name:el"=>"Αγκόλα", "name:en"=>"Angola", "name:eo"=>"Angolo", "name:es"=>"Angola", "name:fa"=>"آنگولا", "name:fi"=>"Angola", "name:fr"=>"Angola", "name:fy"=>"Angoala", "name:ga"=>"Angóla", "name:he"=>"אנגולה", "name:hu"=>"Angola", "name:is"=>"Angóla", "name:it"=>"Angola", "name:ja"=>"アンゴラ", "name:la"=>"Angolia", "name:lv"=>"Angola", "name:mn"=>"Ангол", "name:pl"=>"Angola", "name:pt"=>"Angola", "name:ru"=>"Ангола", "name:sv"=>"Angola", "name:th"=>"ประเทศแองโกลา", "name:uk"=>"Ангола", "name:zh"=>"安哥拉", "name:zh_py"=>"Angela", "name:zh_pyt"=>"Āngēlā", "official_name"=>"República de Angola", "official_name:el"=>"Δημοκρατία της Αγκόλας", "official_name:en"=>"Republic of Angola", "official_name:fi"=>"Angolan tasavalta", "official_name:fr"=>"République d'Angola", "official_name:gd"=>"Poblachd Angola", "official_name:id"=>"Republik Angola", "official_name:lb"=>"Republik Angola", "official_name:lt"=>"Angolos Respublika", "official_name:lv"=>"Angolas Republika", "official_name:pt"=>"República de Angola", "official_name:sv"=>"Republiken Angola"   pt      85
+bq     \N      nl      250
+ar     "name"=>"Argentina", "name:af"=>"Argentinië", "name:ar"=>"الأرجنتين", "name:be"=>"Аргенціна", "name:br"=>"Arc’hantina", "name:cy"=>"Yr Ariannin", "name:de"=>"Argentinien", "name:el"=>"Αργεντινή", "name:en"=>"Argentina", "name:eo"=>"Argentino", "name:fa"=>"آرژانتین", "name:fi"=>"Argentiina", "name:fr"=>"Argentine", "name:fy"=>"Argentynje", "name:ga"=>"An Airgintín", "name:gd"=>"An Argantain", "name:he"=>"ארגנטינה", "name:hu"=>"Argentína", "name:hy"=>"Արգենտինա", "name:is"=>"Argentína", "name:it"=>"Argentina", "name:ja"=>"アルゼンチン", "name:lb"=>"Argentinien", "name:li"=>"Argentinië", "name:lv"=>"Argentīna", "name:mn"=>"Аргентин", "name:nl"=>"Argentinië", "name:pl"=>"Argentyna", "name:pt"=>"Argentina", "name:ru"=>"Аргентина", "name:sl"=>"Argentina", "name:sv"=>"Argentina", "name:th"=>"ประเทศอาร์เจนตินา", "name:tr"=>"Arjantin", "name:uk"=>" Аргентина", "name:zh"=>"阿根廷", "name:haw"=>"‘Alekina", "official_name"=>"República Argentina", "official_name:el"=>"Δημοκρατία της Αργεντινής", "official_name:en"=>"Argentine Republic", "official_name:fi"=>"Argentiinan tasavalta", "official_name:fr"=>"République argentine", "official_name:id"=>"Republik Argentina", "official_name:lb"=>"Republik Argentinien", "official_name:lt"=>"Argentinos Respublika", "official_name:lv"=>"Argentīnas Republika", "official_name:pl"=>"Republika Argentyńska", "official_name:pt"=>"República Argentina", "official_name:sv"=>"Republiken Argentina", "official_name:vi"=>"Cộng hòa Argentina" es      39
+au     "name"=>"Australia", "name:af"=>"Australië", "name:ar"=>"أستراليا", "name:az"=>"Avstraliya", "name:be"=>"Аўстралія", "name:br"=>"Aostralia", "name:ca"=>"Austràlia", "name:cy"=>"Awstralia", "name:da"=>"Australien", "name:de"=>"Australien", "name:el"=>"Αυστραλία", "name:en"=>"Australia", "name:eo"=>"Aŭstralio", "name:et"=>"Austraalia", "name:fa"=>"استرالیا", "name:fi"=>"Australia", "name:fr"=>"Australie", "name:fy"=>"Austraalje", "name:ga"=>"An Astráil", "name:gd"=>"Astràilia", "name:he"=>"אוסטרליה", "name:hu"=>"Ausztrália", "name:hy"=>"Ավստրալիա", "name:is"=>"Ástralía", "name:it"=>"Australia", "name:ja"=>"オーストラリア", "name:lb"=>"Australien", "name:li"=>"Australië", "name:lt"=>"Australija", "name:lv"=>"Austrālija", "name:mn"=>"Австрали", "name:nl"=>"Australië", "name:pl"=>"Australia", "name:pt"=>"Austrália", "name:ru"=>"Австралия", "name:sl"=>"Avstralija", "name:sv"=>"Australien", "name:th"=>"ประเทศออสเตรเลีย", "name:tr"=>"Avustralya", "name:uk"=>"Австралія", "name:vi"=>"Úc", "name:zh"=>"澳大利亚", "official_name"=>"Commonwealth of Australia", "official_name:be"=>"Аўстралійскі саюз", "official_name:el"=>"Κοινοπολιτεία της Αυστραλίας", "official_name:es"=>"Mancomunidad de Australia", "official_name:fi"=>"Australian liittovaltio", "official_name:fr"=>"Commonwealth d’Australie", "official_name:id"=>"Negara Persemakmuran Australia", "official_name:lv"=>"Austrālijas Savienība", "official_name:pl"=>"Związek Australijski", "official_name:pt"=>"Comunidade da Austrália", "official_name:sv"=>"Australiska statsförbundet", "official_name:vi"=>"Liên bang Úc"  en      139
+az     "name"=>"Azerbaijan", "name:af"=>"Azerbeidjan", "name:ar"=>"أذربيجان", "name:az"=>"Azərbaycan", "name:be"=>"Азербайджан", "name:br"=>"Azerbaidjan", "name:ca"=>"Azerbaidjan", "name:da"=>"Aserbajdsjan", "name:de"=>"Aserbaidschan", "name:el"=>"Αζερμπαϊτζάν", "name:en"=>"Azerbaijan", "name:eo"=>"Azerbajĝano", "name:es"=>"Azerbaiyán", "name:et"=>"Aserbaidžaan", "name:fa"=>"آذربایجان", "name:fi"=>"Azerbaidžan", "name:fr"=>"Azerbaïdjan", "name:fy"=>"Azerbeidzjan", "name:ga"=>"An Asarbaiseáin", "name:gd"=>"Asarbaidean", "name:he"=>"אזרבייג'ן", "name:hr"=>"Azerbejdžan", "name:hu"=>"Azerbajdzsán", "name:hy"=>"Ադրբեջան", "name:is"=>"Aserbaídsjan", "name:it"=>"Azerbaigian", "name:ja"=>"アゼルバイジャン", "name:la"=>"Adrabigania", "name:lb"=>"Aserbaidschan", "name:li"=>"Azerbaidzjan", "name:lt"=>"Azerbaidžanas", "name:lv"=>"Azerbaidžāna", "name:mn"=>"Азербайжан", "name:nb"=>"Aserbajdsjan", "name:nl"=>"Azerbeidzjan", "name:nn"=>"Aserbajdsjan", "name:no"=>"Aserbajdsjan", "name:pl"=>"Azerbejdżan", "name:pt"=>"Azerbaijão", "name:ru"=>"Азербайджан", "name:sl"=>"Azerbajdžan", "name:sv"=>"Azerbajdzjan", "name:th"=>"ประเทศอาเซอร์ไบจาน", "name:tr"=>"Azerbaycan", "name:uk"=>"Азербаджайн", "name:zh"=>"阿塞拜疆", "name:haw"=>"‘Akepaikana", "name:zh_py"=>"Asaibaijiang", "name:zh_pyt"=>"Āsàibàijiāng", "official_name"=>"Republic of Azerbaijan", "official_name:az"=>"Azərbaycan Respublikası", "official_name:el"=>"Δημοκρατία του Αζερμπαϊτζάν", "official_name:fa"=>"جمهوری آذربایجان", "official_name:fi"=>"Azerbaidžanin tasavalta", "official_name:id"=>"Republik Azerbaijan", "official_name:it"=>"Repubblica dell'Azerbaigian", "official_name:lt"=>"Azerbaidžano Respublika", "official_name:lv"=>"Azerbaidžānas Republika", "official_name:pl"=>"Republika Azerbejdżanu", "official_name:pt"=>"República do Azerbaijão", "official_name:sv"=>"Republiken Azerbajdzjan", "official_name:vi"=>"Cộng hoà Azerbaijan" az      119
+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"=>"孟加拉国", "name:haw"=>"Banagaladesa", "name:zh_py"=>"Mengjialaguo", "name:zh_pyt"=>"Mèngjiālāguó", "official_name:el"=>"Λαϊκή Δημοκρατία του Μπανγκλαντές", "official_name:fi"=>"Belgian kuningaskunta", "official_name:id"=>"Republik Rakyat Bangladesh", "official_name:it"=>"Repubblica Popolare del Bangladesh", "official_name:la"=>"Res Publica Popularis Bangladeshae", "official_name:lt"=>"Bangladešo Liaudies Respublika", "official_name:lv"=>"Bangladešas Tautas Republika", "official_name:pl"=>"Ludowa Republika Bangladeszu", "official_name:pt"=>"República Popular do Bangladesh", "official_name:sv"=>"Folkrepubliken Bangladesh", "official_name:vi"=>"Cộng hoà Nhân dân Bangladesh"        bn      158
+my     "name"=>"Malaysia", "name:af"=>"Maleisië", "name:ar"=>"ماليزي", "name:az"=>"Malayziya", "name:be"=>"Малайзія", "name:br"=>"Malaysia", "name:ca"=>"Malàisia", "name:el"=>"Μαλαισία", "name:en"=>"Malaysia", "name:eo"=>"Malajzio", "name:es"=>"Malasia", "name:et"=>"Malaisia", "name:fa"=>"مالزی", "name:fi"=>"Malesia", "name:fr"=>"Malaisie", "name:fy"=>"Maleizje", "name:ga"=>"An Mhalaeisia", "name:gd"=>"Malaidhsia", "name:he"=>"מלזיה", "name:hr"=>"Malezija", "name:hu"=>"Malajzia", "name:is"=>"Malasía", "name:it"=>"Malesia", "name:ja"=>"マレーシア", "name:la"=>"Malaesia", "name:lt"=>"Malaizija", "name:lv"=>"Malaizija", "name:mn"=>"Малайз", "name:nl"=>"Maleisië", "name:pl"=>"Malezja", "name:ru"=>"Малайзия", "name:sl"=>"Malezija", "name:sv"=>"Malaysia", "name:th"=>"ประเทศมาเลเซีย", "name:tr"=>"Malezya", "name:uk"=>"Малайзія", "name:zh"=>"马来西亚", "name:haw"=>"Malaisia", "name:zh_py"=>"Malaixiya", "name:zh_pyt"=>"Mǎláixīyà", "official_name:lv"=>"Malaizijas Federācija", "official_name:pl"=>"Federacja Malezji"       ms      7
+bh     "name"=>"البحرين", "name:af"=>"Bahrein", "name:ar"=>"البحرين", "name:be"=>"Бахрэйн", "name:br"=>"Bahrein", "name:ca"=>"Bahrain", "name:cy"=>"Bahrain", "name:da"=>"Bahrain", "name:de"=>"Bahrain", "name:el"=>"Μπαχρέιν", "name:en"=>"Bahrain", "name:eo"=>"Barejno", "name:es"=>"Bahréin", "name:et"=>"Bahrein", "name:fa"=>"بحرين", "name:fi"=>"Bahrain", "name:fr"=>"Bahreïn", "name:fy"=>"De Barein", "name:ga"=>"Bairéin", "name:gd"=>"Bachrain", "name:he"=>"בחריין", "name:hr"=>"Bahrein", "name:hu"=>"Bahrein", "name:id"=>"Bahrain", "name:is"=>"Barein", "name:it"=>"Bahrain", "name:ja"=>"バーレーン", "name:la"=>"Baharina", "name:lb"=>"Bahrain", "name:li"=>"Bahrein", "name:lt"=>"Bahreinas", "name:lv"=>"Bahreina", "name:mn"=>"Бахрейн", "name:nl"=>"Bahrein", "name:pl"=>"Bahrajn", "name:pt"=>"Bahrein", "name:ru"=>"Бахрейн", "name:sl"=>"Bahrajn", "name:sv"=>"Bahrain", "name:th"=>"ประเทศบาห์เรน", "name:tr"=>"Bahreyn", "name:uk"=>"Бахрейн", "name:vi"=>"Bahrain", "name:zh"=>"巴林", "name:haw"=>"Baharaina", "name:zh_py"=>"Balin", "name:zh_pyt"=>"Bālín", "official_name"=>"‎مملكة البحرين  (Mamlakat al-Baḥrayn)", "official_name:br"=>"Rouantelezh Bahrein", "official_name:el"=>"Βασίλειο του Μπαχρέιν", "official_name:en"=>"Kingdom of Bahrain", "official_name:et"=>"Bahreini Kuningriik", "official_name:id"=>"Kerajaan Bahrain", "official_name:it"=>"Regno del Bahrain", "official_name:ja"=>"バーレーン王国", "official_name:lt"=>"Bahreino Karalystė", "official_name:lv"=>"Bahreinas Karaliste", "official_name:pl"=>"Królestwo Bahrajnu", "official_name:pt"=>"Reino do Bahrein", "official_name:sv"=>"Konungariket Bahrain", "official_name:vi"=>"Vương quốc Bahrain"     ar      62
+bi     "name"=>"Burundi", "name:af"=>"Burundi", "name:ar"=>"بوروندي", "name:be"=>"Бурундзі", "name:br"=>"Burundi", "name:cy"=>"Bwrwndi", "name:da"=>"Burundi", "name:el"=>"Μπουρούντι", "name:en"=>"Burundi", "name:eo"=>"Burundo", "name:es"=>"Burundi", "name:fa"=>"بوروندی", "name:fi"=>"Burundi", "name:fr"=>"Burundi", "name:fy"=>"Bûrûndy", "name:ga"=>"An Bhurúin", "name:gd"=>"Burundaidh", "name:he"=>"בורונדי", "name:hu"=>"Burundi", "name:is"=>"Búrúndí", "name:it"=>"Burundi", "name:ja"=>"ブルンジ", "name:la"=>"Burundia", "name:li"=>"Boeroendi", "name:lt"=>"Burundis", "name:lv"=>"Burundija", "name:mn"=>"Бурунди", "name:pl"=>"Burundi", "name:ru"=>"Бурунди", "name:sv"=>"Burundi", "name:th"=>"ประเทศบุรุนดี", "name:uk"=>"Бурунді", "name:zh"=>"布隆迪", "name:haw"=>"Buruni", "name:zh_py"=>"Bulongdi", "name:zh_pyt"=>"Bùlóngdí", "official_name"=>"Republika y'u Burundi;Republique du Burundi", "official_name:el"=>"Δημοκρατία του Μπουρούντι", "official_name:fi"=>"Burundin tasavalta", "official_name:lb"=>"Republik Burundi", "official_name:lt"=>"Burundžio Respublika", "official_name:lv"=>"Burundijas Republika", "official_name:sv"=>"Republiken Burundi", "official_name:vi"=>"Cộng hòa Burundi"        fr      61
+bn     "name"=>"Brunei Darussalam", "name:af"=>"Broenei", "name:ar"=>"بروني دار السلام", "name:be"=>"Бруней", "name:br"=>"Brunei", "name:cy"=>"Brunei", "name:da"=>"Brunei", "name:el"=>"Μπρουνέι", "name:en"=>"Brunei Darussalam", "name:eo"=>"Brunejo", "name:es"=>"Brunéi", "name:et"=>"Brunei", "name:eu"=>"Brunei", "name:fa"=>"برونئی", "name:fi"=>"Brunei", "name:fr"=>"Brunei", "name:fy"=>"Brûnei", "name:ga"=>"Brúiné", "name:gd"=>"Brùnaidh", "name:he"=>"ברוניי", "name:hr"=>"Burneji", "name:hu"=>"Brunei", "name:id"=>"Brunei", "name:is"=>"Brúnei", "name:it"=>"Brunei", "name:la"=>"Bruneium", "name:lb"=>"Brunei", "name:li"=>"Broenai", "name:lt"=>"Brunėjaus Darusalamas", "name:lv"=>"Bruneja", "name:mn"=>"Бруней", "name:nl"=>"Brunei", "name:pl"=>"Brunei", "name:pt"=>"Brunei", "name:ru"=>"Бруней-Даруссалам", "name:sl"=>"Brunej", "name:sv"=>"Brunei", "name:th"=>"ประเทศบรูไนดารุสซาลาม", "name:tr"=>"Bruney", "name:uk"=>"Бруней", "name:vi"=>"Brunei", "name:zh"=>"文莱", "name:haw"=>"Brunei", "name:zh_py"=>"Wenlai", "name:zh_pyt"=>"Wénlái", "official_name:fi"=>"Brunei Darussalamin valtio", "official_name:lv"=>"Brunejas Darusalamas Valsts", "official_name:pl"=>"Państwo Brunei Darussalam", "official_name:pt"=>"Estado do Brunei Darussalam", "official_name:sv"=>"Brunei Darussalam", "official_name:vi"=>"Vương quốc Hồi giáo Brunei"     ms      86
+br     "name"=>"Brasil", "name:af"=>"Brasilië", "name:ar"=>"البرازيل", "name:be"=>"Бразілія", "name:br"=>"Brazil", "name:da"=>"Brasilien", "name:de"=>"Brasilien", "name:el"=>"Βραζιλία", "name:en"=>"Brazil", "name:eo"=>"Brzilo", "name:et"=>"Brasiilia", "name:fa"=>"برزیل", "name:fi"=>"Brasilia", "name:fr"=>"Brésil", "name:fy"=>"Brazylje", "name:ga"=>"An Bhrasaíl", "name:gd"=>"Braisil", "name:he"=>"ברזיל", "name:hr"=>"Brazil", "name:hu"=>"Brazília", "name:hy"=>"Բրազիլիա", "name:is"=>"Brasilía", "name:it"=>"Brasile", "name:ja"=>"ブラジル", "name:la"=>"Brasilia", "name:lb"=>"Brasilien", "name:li"=>"'t Braziel", "name:lt"=>"Brazilija", "name:lv"=>"Brazīlija", "name:mn"=>"Бразил", "name:nl"=>"Brazilië", "name:pl"=>"Brazylia", "name:ru"=>"Бразилия", "name:sl"=>"Brazilija", "name:sv"=>"Brasilien", "name:th"=>"ประเทศบราซิล", "name:tr"=>"Brezilya", "name:uk"=>"Бразилія", "name:zh"=>"巴西", "official_name"=>"República Federativa do Brasil", "official_name:el"=>"Ομοσπονδιακή Δημοκρατία της Βραζιλίας", "official_name:en"=>"Federative Republic of Brazil", "official_name:es"=>"República Federativa del Brasil", "official_name:fi"=>"Brasilian liittotasavalta", "official_name:fr"=>"République fédérative du Brésil", "official_name:id"=>"Republik Federal Brasil", "official_name:ja"=>"ブラジル連邦共和国", "official_name:lt"=>"Brazilijos Federacinė Respublika", "official_name:lv"=>"Brazīlijas Federatīvā Republika", "official_name:pl"=>"Federacyjna Republika Brazylii", "official_name:sv"=>"Förbundsrepubliken Brasilien", "official_name:vi"=>"Cộng hòa Liên bang Brasil"       pt      121
+fk     "name"=>"Falkland Islands", "name:af"=>"Falklandeilande", "name:ar"=>"جزر الفولكلاند", "name:be"=>"Фалклендскія астравы", "name:br"=>"Inizi Maloù", "name:ca"=>"Illes Malvines", "name:cy"=>"Ynysoedd y Falklands", "name:da"=>"Falklandsøerne", "name:de"=>"Falklandinseln", "name:en"=>"Falkland Islands", "name:eo"=>"Falklandoj", "name:es"=>"Islas Malvinas", "name:et"=>"Falklandi saared", "name:fa"=>"جزایر فالکلند", "name:fi"=>"Falklandinsaaret", "name:fr"=>"Îles Malouines", "name:fy"=>"Falklâneilannen", "name:ga"=>"Oileáin Fháclainne", "name:gd"=>"Na h-Eileanan Fàclainn", "name:he"=>"איי פוקלנד", "name:hr"=>"Falklandski Otoci", "name:hu"=>"Falkland-szigetek", "name:id"=>"Kepulauan Falkland", "name:is"=>"Falklandseyjar", "name:la"=>"Insulae Malvinae", "name:lt"=>"Malvinų salos", "name:lv"=>"Folklenda salas", "name:mn"=>"Фолклендийн Арлууд", "name:nl"=>"Falklandeilanden", "name:pl"=>"Falklandy", "name:ru"=>"Фолклендские Oстрова", "name:sl"=>"Falklandi", "name:sv"=>"Falklandsöarna", "name:th"=>"หมู่เกาะฟอล์กแลนด์", "name:tr"=>"Falkland Adaları", "name:uk"=>"Фолклендські острови", "name:vi"=>"Quần đảo Falkland", "name:zh"=>"福克兰群岛", "official_name:lv"=>"Folklenda (Malvinu) salas"    en      91
+cn     "name"=>"China 中国", "name:af"=>"Sjina", "name:ar"=>"الصين", "name:be"=>"Кітай", "name:br"=>"Sina", "name:ca"=>"Xina", "name:cy"=>"Tsieina", "name:da"=>"Kina", "name:de"=>"China", "name:el"=>"Κίνα", "name:en"=>"China", "name:eo"=>"Ĉinio", "name:es"=>"China", "name:et"=>"Hiina", "name:eu"=>"Txina", "name:fa"=>"چین", "name:fi"=>"Kiina", "name:fr"=>"Chine", "name:fy"=>"Sina", "name:ga"=>"An tSín", "name:gd"=>"Sìona", "name:he"=>"סין", "name:hr"=>"Kina", "name:hu"=>"Kína", "name:hy"=>"Չինաստան", "name:id"=>"Cina", "name:is"=>"Alþýðulýðveldið Kína", "name:it"=>"Cina", "name:ja"=>"中国", "name:la"=>"Sinae", "name:lb"=>"Volleksrepublik China", "name:li"=>"Sjina", "name:lt"=>"Kinija", "name:lv"=>"Ķīna", "name:mn"=>"Хятад", "name:nb"=>"Kina", "name:nl"=>"China", "name:nn"=>"Kina", "name:no"=>"Kina", "name:pl"=>"Chiny", "name:pt"=>"China", "name:ru"=>"Китай", "name:sl"=>"Kitajska", "name:sv"=>"Kina", "name:th"=>"ประเทศจีน", "name:tl"=>"Tsina", "name:tr"=>"Çin Halk Cumhuriyeti", "name:uk"=>"Китай", "name:vi"=>"Trung Hoa", "name:zh"=>"中国", "name:haw"=>"Kina", "name:zh_py"=>"Zhongguo", "name:zh_pyt"=>"Zhōngguó", "official_name"=>"中华人民共和国", "official_name:af"=>"Volksrepubliek van Sjina", "official_name:br"=>"Republik Pobl Sina", "official_name:el"=>"Λαϊκή Δημοκρατία της Κίνας", "official_name:en"=>"People's Republic of China", "official_name:eu"=>"Txinako Herri Errepublika", "official_name:gd"=>"Sluagh-Phoblachd na Sìne", "official_name:hy"=>"Չինաստանի Ժողովրդական Հանրապետություն", "official_name:id"=>"Republik Rakyat Cina", "official_name:it"=>"Repubblica Popolare Cinese", "official_name:ja"=>"中華人民共和国", "official_name:la"=>"Res Publica Popularis Sinarum", "official_name:lb"=>"Volleksrepublik China", "official_name:lt"=>"Kinijos Liaudies Respublika", "official_name:lv"=>"Ķīnas Tautas Republika", "official_name:pl"=>"Chińska Republika Ludowa", "official_name:pt"=>"República Popular da China", "official_name:sl"=>"Ljudska republika Kitajska", "official_name:sv"=>"Folkrepubliken Kina", "official_name:vi"=>"Cộng hòa Nhân dân Trung Hoa", "official_name:zh_py"=>"Zhonghua Renmin Gongheguo", "official_name:zh_pyt"=>"Zhōnghuá Rénmín Gònghéguó"     zh      117
+co     "name"=>"Colombia", "name:ar"=>"كولومبيا", "name:be"=>"Калумбія", "name:br"=>"Kolombia", "name:ca"=>"Colòmbia", "name:da"=>"Colombia", "name:de"=>"Kolumbien", "name:el"=>"Κολομβία", "name:en"=>"Colombia", "name:eo"=>"Kolombio", "name:eu"=>"Kolonbia", "name:fa"=>"کلمبیا", "name:fi"=>"Kolumbia", "name:fr"=>"Colombie", "name:fy"=>"Kolombia", "name:ga"=>"An Cholóim", "name:he"=>"קולומביה", "name:hr"=>"Kolumbija", "name:id"=>"Kolombia", "name:is"=>"Kólumbía", "name:it"=>"Colombia", "name:ja"=>"コロンビア", "name:la"=>"Columbia", "name:lb"=>"Kolumbien", "name:lt"=>"Kolumbija", "name:lv"=>"Kolumbija", "name:mn"=>"Колумб", "name:pl"=>"Kolumbia", "name:pt"=>"Colômbia", "name:ru"=>"Колумбия", "name:sl"=>"Kolumbija", "name:sv"=>"Colombia", "name:th"=>"ประเทศโคลอมเบีย", "name:tr"=>"Kolombiya", "name:uk"=>"Колумбія", "name:zh"=>"哥伦比亚", "official_name"=>"República de Colombia", "official_name:be"=>"Рэспубліка Калумбія", "official_name:el"=>"Δημοκρατία της Κολομβίας", "official_name:en"=>"Republic of Colombia", "official_name:fr"=>"République de Colombie", "official_name:id"=>"Republik Kolombia", "official_name:lt"=>"Kolumbijos Respublika", "official_name:pl"=>"Republika Kolumbii", "official_name:sv"=>"Republiken Colombia", "official_name:vi"=>"Cộng hoà Colombia"   es      133
+cr     "name"=>"Costa Rica", "name:ar"=>"كوستاريكا", "name:be"=>"Коста Рыка", "name:br"=>"Costa Rica", "name:da"=>"Costa Rica", "name:el"=>"Κόστα Ρίκα", "name:en"=>"Costa Rica", "name:eo"=>"Kostariko", "name:fa"=>"کاستاریکا", "name:fi"=>"Costa Rica", "name:fr"=>"Costa Rica", "name:fy"=>"Kosta Rika", "name:ga"=>"Cósta Ríce", "name:he"=>"קוסטה ריקה", "name:hr"=>"Kostarika", "name:hu"=>"Costa Rica", "name:id"=>"Kosta Rika", "name:is"=>"Kosta Ríka", "name:it"=>"Costa Rica", "name:ja"=>"コスタリカ", "name:la"=>"Ora Opulenta", "name:lt"=>"Kosta Rika", "name:lv"=>"Kostarika", "name:mn"=>"Коста-Рика", "name:pl"=>"Kostaryka", "name:ru"=>"Коста-Рика", "name:sl"=>"Kostarika", "name:sv"=>"Costa Rica", "name:th"=>"ประเทศคอสตาริกา", "name:tr"=>"Kosta Rika", "name:uk"=>"Коста-Ріка", "name:zh"=>"哥斯大黎加", "official_name"=>"República de Costa Rica", "official_name:be"=>"Рэспубліка Коста-Рыка", "official_name:el"=>"Δημοκρατία της Κόστα Ρίκα", "official_name:en"=>"Republic of Costa Rica", "official_name:gd"=>"Poblachd Chosta Rica", "official_name:it"=>"Repubblica di Costa Rica", "official_name:lt"=>"Kosta Rikos Respublika", "official_name:lv"=>"Kostarikas Republika", "official_name:pl"=>"Republika Kostaryki", "official_name:sv"=>"Republiken Costa Rica", "official_name:vi"=>"Cộng hoà Costa Rica"    es      64
+cv     "name"=>"Cabo Verde", "name:af"=>"Kaap Verde", "name:ar"=>"الرأس الأخضر", "name:be"=>"Каба-Вердэ", "name:br"=>"Kab Glas", "name:ca"=>"Cap Verd", "name:cy"=>"Cabo Verde", "name:da"=>"Kap Verde", "name:de"=>"Kap Verde", "name:el"=>"Πράσινο Ακρωτήριο", "name:en"=>"Cape Verde", "name:eo"=>"Kabo-Verdo", "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-Fok", "name:id"=>"Tanjung Verde", "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:mn"=>"Кабо-Верде", "name:nl"=>"Kaapverdië", "name:pl"=>"Wyspy Zielonego Przylądka", "name:ru"=>"Кабо-Верде", "name:sl"=>"Zelenortski otoki", "name:sv"=>"Kap Verde", "name:th"=>"ประเทศเคปเวิร์ด", "name:tr"=>"Yeşil Burun Adaları", "name:uk"=>"Кабо-Верде", "name:zh"=>"佛得角", "official_name"=>"República de Cabo Verde", "official_name:be"=>"Рэспубліка Каба-Вердэ", "official_name:de"=>"Republik Kap Verde", "official_name:el"=>"Δημοκρατία του Πράσινου Ακρωτηρίου", "official_name:en"=>"Republic of Cape Verde", "official_name:es"=>"República de Cabo Verde", "official_name:he"=>"רפובליקת כֵּף וֶרְדֶּה", "official_name:lt"=>"Žaliojo Kyšulio Respublika", "official_name:lv"=>"Kaboverdes Republika", "official_name:pl"=>"Republika Zielonego Przylądka", "official_name:sl"=>"Republika Zelenortski otoki", "official_name:sv"=>"Republiken Kap Verde", "official_name:vi"=>"Cộng hòa Cabo Verde"   pt      89
+gi     "name"=>"Gibraltar", "name:ar"=>"جبل طارق", "name:be"=>"Гібралтар", "name:br"=>"Gibraltar", "name:el"=>"Γιβραλτάρ", "name:eo"=>"Ĝibraltaro", "name:fa"=>"جبل‌الطارق", "name:fi"=>"Gibraltar", "name:fr"=>"Gibraltar", "name:ga"=>"Giobráltar", "name:gd"=>"Giobraltair", "name:he"=>"גיברלטר", "name:hu"=>"Gibraltár", "name:is"=>"Gíbraltar", "name:it"=>"Gibilterra", "name:la"=>"Calpe", "name:lt"=>"Gibraltaras", "name:lv"=>"Gibraltārs", "name:mn"=>"Гибралтар", "name:pl"=>"Gibraltar", "name:ru"=>"Гибралтар", "name:sk"=>"Gibraltár", "name:sv"=>"Gibraltar", "name:th"=>"ยิบรอลตาร์", "name:tr"=>"Cebelitarık", "name:uk"=>"Гібралтар", "name:zh"=>"直布罗陀", "old_name"=>"Mons Calpe", "name:zh_py"=>"Zhibuluotuo", "name:zh_pyt"=>"Zhíbùluótuó"   en      138
+cz     "name"=>"Česká republika", "name:af"=>"Tsjeggië", "name:ar"=>"الجمهورية التشيكية", "name:be"=>"Чэхія", "name:br"=>"Republik Tchek", "name:ca"=>"República Txeca", "name:cs"=>"Česká republika", "name:cy"=>"Gweriniaeth Tsiec", "name:da"=>"Tjekkiet", "name:de"=>"Tschechien", "name:el"=>"Τσεχία", "name:en"=>"Czech Republic", "name:eo"=>"Ĉeĥio", "name:es"=>"República Checa", "name:et"=>"Tšehhi", "name:eu"=>"Txekiar Errepublika", "name:fa"=>"جمهوری چک", "name:fi"=>"Tšekki", "name:fr"=>"République tchèque", "name:fy"=>"Tsjechje", "name:ga"=>"Poblacht na Seice", "name:gd"=>"An t-Seic", "name:he"=>"צכיה", "name:hr"=>"Češka", "name:hu"=>"Csehország", "name:id"=>"Republik Ceko", "name:is"=>"Tékkland", "name:it"=>"Cechia", "name:ja"=>"チェコ", "name:la"=>"Bohemia", "name:lb"=>"Tschechien", "name:li"=>"Tsjechië", "name:lt"=>"Čekija", "name:lv"=>"Čehija", "name:mn"=>"Бүгд Найрамдах Чех Улс", "name:nl"=>"Tsjechië", "name:pl"=>"Czechy", "name:pt"=>"República Checa", "name:ru"=>"Чехия", "name:sk"=>"Česko", "name:sl"=>"Češka", "name:sv"=>"Tjeckien", "name:th"=>"สาธารณรัฐเช็ก", "name:tr"=>"Çek Cumhuriyeti", "name:uk"=>"Чеська Республіка", "name:vi"=>"Cộng hòa Séc", "name:zh"=>"捷克", "name:haw"=>"Lepupalika ‘o Tieka", "name:zh_py"=>"Jieke", "name:zh_pyt"=>"Jiékè", "official_name:el"=>"Τσεχική Δημοκρατία", "official_name:it"=>"Repubblica Ceca", "official_name:ja"=>"チェコ共和国", "official_name:la"=>"Res publica Bohemica", "official_name:lb"=>"Tschechesch Republik", "official_name:lt"=>"Čekijos Respublika", "official_name:lv"=>"Čehijas Republika", "official_name:pl"=>"Republika Czeska", "official_name:pt"=>"República Checa", "official_name:ru"=>"Чешская Республика", "official_name:sk"=>"Česká republika", "official_name:sv"=>"Republiken Tjeckien"        cs      124
+dk     "name"=>"Danmark", "name:af"=>"Denemarke", "name:ar"=>"الدانمرك", "name:be"=>"Данія", "name:bg"=>"Дания", "name:br"=>"Danmark", "name:ca"=>"Dinamarca", "name:cy"=>"Denmarc", "name:da"=>"Danmark", "name:de"=>"Dänemark", "name:el"=>"Δανία", "name:en"=>"Denmark", "name:eo"=>"Danio", "name:es"=>"Dinamarca", "name:et"=>"Taani", "name:eu"=>"Danimarka", "name:fa"=>"دانمارک", "name:fi"=>"Tanska", "name:fr"=>"Danemark", "name:fy"=>"Denemark", "name:ga"=>"An Danmhairg", "name:gd"=>"An Danmhairg", "name:he"=>"דנמרק", "name:hr"=>"Danska", "name:hu"=>"Dánia", "name:id"=>"Denmark", "name:is"=>"Danmörk", "name:it"=>"Danimarca", "name:ja"=>"デンマーク", "name:la"=>"Dania", "name:lb"=>"Dänemark", "name:li"=>"Daenemark", "name:lt"=>"Danija", "name:lv"=>"Dānija", "name:mn"=>"Дани", "name:nl"=>"Denemarken", "name:pl"=>"Dania", "name:pt"=>"Dinamarca", "name:ru"=>"Дания", "name:sk"=>"Dánsko", "name:sl"=>"Danska", "name:sv"=>"Danmark", "name:th"=>"ประเทศเดนมาร์ก", "name:tr"=>"Danimarka", "name:uk"=>"Данія", "name:vi"=>"Đan Mạch", "name:zh"=>"丹麦", "name:nds"=>"Däänmark", "name:zh_py"=>"Danmai", "name:zh_pyt"=>"Dānmài", "official_name"=>"Kingdom of Denmark", "official_name:be"=>"Каралеўства Данія", "official_name:da"=>"Kongeriget Danmark", "official_name:el"=>"Βασίλειο της Δανίας", "official_name:fr"=>"Royaume du Danemark", "official_name:gd"=>"Rìoghachd na Danmhairg", "official_name:id"=>"Kerajaan Denmark", "official_name:ja"=>"デンマーク王国", "official_name:lb"=>"Kinneksräich Dänemark", "official_name:lt"=>"Danijos Karalystė", "official_name:pt"=>"Reino da Dinamarca", "official_name:sk"=>"Dánske kráľovstvo", "official_name:sv"=>"Konungariket Danmark", "official_name:vi"=>"Vương quốc Đan Mạch"    da      160
+do     "name"=>"República Dominicana", "name:af"=>"Dominikaanse Republiek", "name:ar"=>"الجمهورية الدومينيكية", "name:br"=>"Republik Dominikan", "name:cy"=>"Gweriniaeth Dominica", "name:da"=>"Dominikanske Republik", "name:de"=>"Dominikanische Republik", "name:do"=>"República Dominicána", "name:el"=>"Δομινικανή Δημοκρατία", "name:en"=>"Dominican Republic", "name:eo"=>"Domingo", "name:et"=>"Dominikaani Vabariik", "name:fa"=>"جمهوری دومینیکن", "name:fi"=>"Dominikaaninen tasavalta", "name:fr"=>"République Dominicaine", "name:fy"=>"de Dominikaanske Republyk", "name:ga"=>"An Phoblacht Dhoiminiceach", "name:gd"=>"Poblachd Dhoiminicia", "name:he"=>"דומיניק", "name:hr"=>"Dominikanska Republika", "name:hu"=>"Dominikai Köztársaság", "name:id"=>"Republik Dominika", "name:is"=>"Dóminíska lýðveldið", "name:it"=>"Repubblica Dominicana", "name:la"=>"Respublica Dominicana", "name:lb"=>"Dominikanesch Republik", "name:li"=>"Dominicaanse Rippebliek", "name:lt"=>"Dominikos Respublika", "name:lv"=>"Dominikānas Republika", "name:mn"=>"Доминиканы Бүгд Найрамдах Улс", "name:nl"=>"Dominicaanse Republiek", "name:pl"=>"Dominikana", "name:ru"=>"Доминиканская Республика", "name:sl"=>"Dominikanska republika", "name:sv"=>"Dominikanska republiken", "name:th"=>"สาธารณรัฐโดมินิกัน", "name:tr"=>"Dominik Cumhuriyeti", "name:uk"=>"Домініканська Республіка", "name:vi"=>"Cộng hòa Dominicana", "name:zh"=>"多明尼加共和國", "official_name:pl"=>"Republika Dominikańska"     es      37
+ee     "name"=>"Eesti", "name:af"=>"Estland", "name:ar"=>"إستونيا", "name:be"=>"Эстонія", "name:br"=>"Estonia", "name:ca"=>"Estònia", "name:cy"=>"Estonia", "name:da"=>"Estland", "name:de"=>"Estland", "name:el"=>"Εσθονία", "name:en"=>"Estonia", "name:eo"=>"Estonio", "name:es"=>"Estonia", "name:eu"=>"Estonia", "name:fa"=>"استونی", "name:fi"=>"Viro", "name:fr"=>"Estonie", "name:fy"=>"Estlân", "name:ga"=>"An Eastóin", "name:gd"=>"Eastòinia", "name:he"=>"אסטוניה", "name:hr"=>"Estonija", "name:hu"=>"Észtország", "name:id"=>"Estonia", "name:is"=>"Eistland", "name:it"=>"Estonia", "name:ja"=>"エストニア", "name:la"=>"Estonia", "name:lb"=>"Estland", "name:li"=>"Esland", "name:lt"=>"Estija", "name:lv"=>"Igaunija", "name:mn"=>"Эстон", "name:nl"=>"Estland", "name:pl"=>"Estonia", "name:ru"=>"Эстония", "name:sk"=>"Estónsko", "name:sl"=>"Estonija", "name:sv"=>"Estland", "name:th"=>"ประเทศเอสโตเนีย", "name:tr"=>"Estonya", "name:uk"=>"Естонія", "name:vi"=>"Estonia", "name:zh"=>"爱沙尼亚", "name:haw"=>"‘Esetonia", "name:zh_py"=>"Aishaniya", "name:zh_pyt"=>"Àishāníyà", "official_name"=>"Eesti Vabariik", "official_name:be"=>"Рэспубліка Эстонія", "official_name:el"=>"Δημοκρατία της Εσθονίας", "official_name:en"=>"Republic of Estonia", "official_name:es"=>"República de Estonia", "official_name:fr"=>"République d'Estonie", "official_name:gd"=>"Poblachd Eastòinia", "official_name:id"=>"Republik Estonia", "official_name:lb"=>"Republik Estland", "official_name:lt"=>"Estijos Respublika", "official_name:lv"=>"Igaunijas Republika", "official_name:pl"=>"Republika Estońska", "official_name:ru"=>"Эсто́нская Респу́блика", "official_name:sk"=>"Estónska republika", "official_name:sv"=>"Republiken Estland", "official_name:vi"=>"Cộng hòa Estonia" et      125
+gw     "name"=>"Guiné-Bissau", "name:af"=>"Guinee-Bissau", "name:ar"=>"غينيا-بيساو", "name:be"=>"Гвінея-Бісаў", "name:br"=>"Ginea-Bissau", "name:ca"=>"Guinea Bissau", "name:cy"=>"Guiné-Bissau", "name:da"=>"Guinea-Bissau", "name:de"=>"Guinea-Bissau", "name:el"=>"Γουινέα-Μπισσάου", "name:en"=>"Guinea-Bissau", "name:eo"=>"Gvineo Bisaŭa", "name:es"=>"Guinea-Bissau", "name:et"=>"Guinea-Bissau", "name:fa"=>"گینه بیسائو", "name:fi"=>"Guinea-Bissau", "name:fr"=>"Guinée-Bissau", "name:fy"=>"Guinee-Bissau", "name:ga"=>"Guine-Bhissau", "name:gd"=>"Gini-Bissau", "name:he"=>"גינאה ביסאו", "name:hr"=>"Gvineja Bisau", "name:hu"=>"Bissau-Guinea", "name:id"=>"Guinea-Bissau", "name:is"=>"Gínea-Bissá", "name:it"=>"Guinea-Bissau", "name:la"=>"Guinea Bissaviensis", "name:lb"=>"Guinea-Bissau", "name:li"=>"Guinee-Bissau", "name:lt"=>"Bisau Gvinėja", "name:lv"=>"Gvineja-Bisava", "name:mn"=>"Гвиней-Бисау", "name:nl"=>"Guinee-Bissau", "name:pl"=>"Gwinea Bissau", "name:ru"=>"Гвинея-Бисау", "name:sl"=>"Gvineja Bissau", "name:sv"=>"Guinea-Bissau", "name:th"=>"ประเทศกินี-บิสเซา", "name:tr"=>"Gine Bissau", "name:uk"=>"Гвінея-Бісау", "name:zh"=>"几内亚比绍", "name:zh_py"=>"Jineiya Bishao", "name:zh_pyt"=>"Jīnèiyà Bǐshào", "official_name"=>"República da Guiné-Bissau", "official_name:be"=>"Рэспубліка Гвінэя-Бісаў", "official_name:el"=>"Δημοκρατία της Γουινέας-Μπισσάου", "official_name:et"=>"Guinea-Bissau Vabariik", "official_name:gd"=>"Poblachd Ghini-Bissau", "official_name:id"=>"Republik Guinea-Bissau", "official_name:lt"=>"Bisau Gvinėjos Respublika", "official_name:lv"=>"Gvinejas-Bisavas Republika", "official_name:sv"=>"Republiken Guinea-Bissau", "official_name:vi"=>"Cộng hòa Guiné-Bissau"      pt      8
+hr     "name"=>"Hrvatska", "name:af"=>"Kroasië", "name:ar"=>"كرواتيا", "name:be"=>"Харватыя", "name:br"=>"Kroatia", "name:ca"=>"Croàcia", "name:cy"=>"Croatia", "name:da"=>"Kroatien", "name:de"=>"Kroatien", "name:el"=>"Κροατία", "name:en"=>"Croatia", "name:eo"=>"Kroatio", "name:es"=>"Croacia", "name:et"=>"Horvaatia", "name:fa"=>"کرواسی", "name:fi"=>"Kroatia", "name:fr"=>"Croatie", "name:fy"=>"Kroaasje", "name:ga"=>"An Chróit", "name:gd"=>"Croàisia", "name:he"=>"קרואטיה", "name:hu"=>"Horvátország", "name:hy"=>"Խորվաթիա", "name:id"=>"Kroasia", "name:is"=>"Króatía", "name:it"=>"Croazia", "name:ja"=>"クロアチア", "name:la"=>"Croatia", "name:lb"=>"Kroatien", "name:li"=>"Kroatië", "name:lt"=>"Kroatija", "name:lv"=>"Horvātija", "name:mn"=>"Хорват", "name:nl"=>"Kroatië", "name:pl"=>"Chorwacja", "name:pt"=>"Croácia", "name:ru"=>"Хорватия", "name:sk"=>"Chorvátsko", "name:sl"=>"Hrvaška", "name:sv"=>"Kroatien", "name:th"=>"ประเทศโครเอเชีย", "name:tr"=>"Hırvatistan", "name:uk"=>"Хорватія", "name:vi"=>"Croatia", "name:zh"=>"克罗地亚", "name:haw"=>"Koloatia", "name:zh_py"=>"Keluodiya", "name:zh_pyt"=>"Kèluódìyà", "official_name"=>"Republika Hrvatska", "official_name:be"=>"Рэспубліка Харватыя", "official_name:en"=>"Republic of Croatia", "official_name:es"=>"República de Croacia", "official_name:et"=>"Horvaatia Vabariik", "official_name:id"=>"Republik Kroasia", "official_name:lt"=>"Kroatijos Respublika", "official_name:lv"=>"Horvātijas Republika", "official_name:pl"=>"Republika Chorwacji", "official_name:pt"=>"República da Croácia", "official_name:sk"=>"Chorvátska republika", "official_name:sv"=>"Republiken Kroatien", "official_name:vi"=>"Cộng hòa Croatia"        hr      92
+hu     "name"=>"Magyarország", "name:af"=>"Hongarye", "name:ar"=>"هنغاريا", "name:be"=>"Венгрыя", "name:br"=>"Hungaria", "name:ca"=>"Hongria", "name:cy"=>"Hwngari", "name:da"=>"Ungarn", "name:de"=>"Ungarn", "name:el"=>"Ουγγαρία", "name:en"=>"Hungary", "name:eo"=>"Hungario", "name:es"=>"Hungría", "name:et"=>"Ungari", "name:fa"=>"مجارستان", "name:fi"=>"Unkari", "name:fr"=>"Hongrie", "name:fy"=>"Hongarije", "name:ga"=>"An Ungáir", "name:gd"=>"An Ungair", "name:he"=>"הונגריה", "name:hr"=>"Madžarska", "name:hu"=>"Magyarország", "name:hy"=>"Հունգարիա", "name:id"=>"Hongaria", "name:is"=>"Ungverjaland", "name:it"=>"Ungheria", "name:ja"=>"ハンガリー", "name:la"=>"Hungaria", "name:lb"=>"Ungarn", "name:lt"=>"Vengrija", "name:lv"=>"Ungārija", "name:mn"=>"Унгар", "name:nl"=>"Hongarije", "name:pl"=>"Węgry", "name:ro"=>"Ungaria", "name:ru"=>"Венгрия", "name:sk"=>"Maďarsko", "name:sl"=>"Madžarska", "name:sv"=>"Ungern", "name:th"=>"ประเทศฮังการี", "name:tr"=>"Macaristan", "name:uk"=>"Угорщина", "name:vi"=>"Hungary", "name:zh"=>"匈牙利", "name:haw"=>"Hunakalia", "name:zh_py"=>"Xiongyali", "name:zh_pyt"=>"Xiōngyálì", "official_name"=>"Magyar Köztársaság", "official_name:el"=>"Δημοκρατία της Ουγγαρίας", "official_name:en"=>"Republic of Hungary", "official_name:es"=>"República de Hungría", "official_name:et"=>"Ungari Vabariik", "official_name:fr"=>"République de Hongrie", "official_name:id"=>"Republik Hongaria", "official_name:it"=>"Repubblica d'Ungheria", "official_name:ja"=>"ハンガリー共和国", "official_name:lb"=>"Republik Ungarn", "official_name:lt"=>"Vengrijos Respublika", "official_name:lv"=>"Ungārijas Republika", "official_name:pl"=>"Republika Węgier", "official_name:ru"=>"Венге́рская Респу́блика", "official_name:sk"=>"Maďarská republika", "official_name:sv"=>"Republiken Ungern"       hu      45
+id     "name"=>"Indonesia", "name:af"=>"Indonesië", "name:ar"=>"إندونيسيا", "name:az"=>"İndoneziya", "name:be"=>"Інданэзія", "name:br"=>"Indonezia", "name:ca"=>"Indonèsia", "name:da"=>"Indonesien", "name:de"=>"Indonesien", "name:el"=>"Ινδονησία", "name:en"=>"Indonesia", "name:eo"=>"Indonezio", "name:et"=>"Indoneesia", "name:fa"=>"اندونزی", "name:fi"=>"Indonesia", "name:fr"=>"Indonésie", "name:fy"=>"Yndoneezje", "name:ga"=>"An Indinéis", "name:gd"=>"An Innd-Innse", "name:he"=>"אינדונזיה", "name:hr"=>"Indonezija", "name:hu"=>"Indonézia", "name:is"=>"Indonesía", "name:it"=>"Indonesia", "name:ja"=>"インドネシア", "name:lb"=>"Indonesien", "name:li"=>"Indonesië", "name:lt"=>"Indonezija", "name:lv"=>"Indonēzija", "name:mn"=>"Индонез", "name:nl"=>"Indonesië", "name:pl"=>"Indonezja", "name:ru"=>"Индонезия", "name:sl"=>"Indonezija", "name:sv"=>"Indonesien", "name:th"=>"ประเทศอินโดนีเซีย", "name:tl"=>"Indonesya", "name:tr"=>"Endonezya", "name:uk"=>"Індонезія", "name:zh"=>"印度尼西亚", "name:haw"=>"‘Inidonesia", "official_name"=>"Republik Indonesia", "official_name:el"=>"Δημοκρατία της Ινδονησίας", "official_name:en"=>"Republic of Indonesia", "official_name:et"=>"Indoneesia Vabariik", "official_name:fr"=>"République d'Indonésie", "official_name:lt"=>"Indonezijos Respublika", "official_name:lv"=>"Indonēzijas Republika", "official_name:pl"=>"Republika Indonezji", "official_name:sv"=>"Republiken Indonesien", "official_name:tl"=>"Republika ng Indonesya", "official_name:vi"=>"Cộng hòa Indonesia"      id      110
+il     "name"=>"ישראל", "name:af"=>"Israel", "name:ar"=>"إسرائيل", "name:be"=>"Ізраіль", "name:br"=>"Israel", "name:ca"=>"Israel", "name:cy"=>"Israel", "name:da"=>"Israel", "name:de"=>"Israel", "name:el"=>"Ισραήλ", "name:en"=>"Israel", "name:eo"=>"Israelo", "name:es"=>"Israel", "name:et"=>"Iisrael", "name:fa"=>"اسرائیل", "name:fi"=>"Israel", "name:fr"=>"Israël", "name:fy"=>"Israel", "name:ga"=>"Iosrael", "name:gd"=>"Iosrael", "name:he"=>"ישראל", "name:hr"=>"Izrael", "name:hu"=>"Izrael", "name:hy"=>"Իսրայել", "name:id"=>"Israel", "name:is"=>"Ísrael", "name:it"=>"Israele", "name:ja"=>"イスラエル", "name:la"=>"Israel", "name:lb"=>"Israel", "name:li"=>"Israël", "name:lt"=>"Izraelis", "name:lv"=>"Izraēla", "name:mn"=>"Израйль", "name:nl"=>"Israël", "name:pl"=>"Izrael", "name:pt"=>"Israel", "name:ru"=>"Израиль", "name:sl"=>"Izrael", "name:sv"=>"Israel", "name:th"=>"ประเทศอิสราเอล", "name:tr"=>"İsrail", "name:uk"=>"Ізра́їль", "name:vi"=>"Israel", "name:zh"=>"以色列", "name:haw"=>"ʻIseraʻela", "name:zh_py"=>"Yiselie", "name:zh_pyt"=>"Yǐsèliè", "official_name"=>"מדינת ישראל", "official_name:el"=>"Κράτος του Ισραήλ", "official_name:en"=>"State of Israel", "official_name:es"=>"Estado de Israel", "official_name:et"=>"Iisraeli Riik", "official_name:gd"=>"Stàit Iosrael", "official_name:ja"=>"イスラエル国", "official_name:lb"=>"Staat Israel", "official_name:lv"=>"Izraēlas Valsts", "official_name:pl"=>"Państwo Izraela", "official_name:pt"=>"Estado de Israel", "official_name:ru"=>"Государство Израиль", "official_name:sv"=>"Staten Israel"        en      65
+ir     "name"=>"ایران", "name:af"=>"Iran", "name:ar"=>"إيران", "name:az"=>"İran", "name:be"=>"Іран", "name:br"=>"Iran", "name:ca"=>"Iran", "name:cy"=>"Iran", "name:da"=>"Iran", "name:de"=>"Iran", "name:el"=>"Ιράν", "name:en"=>"Iran", "name:eo"=>"Irano", "name:es"=>"Irán", "name:et"=>"Iraan", "name:fa"=>"ایران", "name:fi"=>"Iran", "name:fr"=>"Iran", "name:fy"=>"Iran", "name:ga"=>"An Iaráin", "name:gd"=>"Ioràn", "name:he"=>"אירן", "name:hr"=>"Iran", "name:hu"=>"Irán", "name:hy"=>"Իրան", "name:id"=>"Iran", "name:is"=>"Íran", "name:it"=>"Iran", "name:ja"=>"イラン", "name:la"=>"Irania", "name:lb"=>"Iran", "name:li"=>"Iraan", "name:lt"=>"Iranas", "name:lv"=>"Irāna", "name:mn"=>"Иран", "name:nl"=>"Iran", "name:pl"=>"Iran", "name:pt"=>"Irã", "name:ru"=>"Иран", "name:sl"=>"Iran", "name:sv"=>"Iran", "name:th"=>"ประเทศอิหร่าน", "name:tr"=>"İran", "name:uk"=>"Іран", "name:vi"=>"Iran", "name:zh"=>"伊朗", "name:haw"=>"‘Ilana", "name:zh_py"=>"Yilang", "name:zh_pyt"=>"Yīlǎng", "official_name"=>"جمهوری اسلامی ایران", "official_name:br"=>"Republik Islamek Iran", "official_name:ca"=>"República Islàmica de l'Iran", "official_name:el"=>"Ισλαμική Δημοκρατία του Ιράν", "official_name:en"=>"Islamic Republic of Iran", "official_name:et"=>"Iraani Islamivabariik", "official_name:id"=>"Republik Islam Iran", "official_name:it"=>"Repubblica Islamica dell'Iran", "official_name:ja"=>"イラン・イスラム共和国", "official_name:lb"=>"Islamesch Republik Iran", "official_name:pl"=>"Islamska Republika Iranu", "official_name:pt"=>"República Islâmica do Irã", "official_name:sl"=>"Islamska republika Iran", "official_name:sv"=>"Islamiska republiken Iran", "official_name:vi"=>"Cộng hòa Hồi giáo Iran"    fa      80
+is     "name"=>"Ísland", "name:af"=>"Ysland", "name:ar"=>"آيسلندا", "name:be"=>"Ісландыя", "name:br"=>"Island", "name:ca"=>"Islàndia", "name:cy"=>"Gwlad yr Iâ", "name:da"=>"Island", "name:de"=>"Island", "name:el"=>"Ισλανδία", "name:en"=>"Iceland", "name:eo"=>"Islando", "name:es"=>"Islandia", "name:et"=>"Island", "name:fa"=>"ایسلند", "name:fi"=>"Islanti", "name:fr"=>"Islande", "name:fy"=>"Yslân", "name:ga"=>"An Íoslainn", "name:gd"=>"Innis Tìle", "name:he"=>"איסלנד", "name:hu"=>"Izland", "name:id"=>"Islandia", "name:is"=>"Ísland", "name:it"=>"Islanda", "name:ja"=>"アイスランド", "name:la"=>"Islandia", "name:lb"=>"Island", "name:li"=>"Iesland", "name:lt"=>"Islandija", "name:lv"=>"Īslande", "name:mn"=>"Исланд", "name:nb"=>"Island", "name:nl"=>"IJsland", "name:nn"=>"Island", "name:no"=>"Island", "name:pl"=>"Islandia", "name:ru"=>"Исландия", "name:sl"=>"Islandija", "name:sv"=>"Island", "name:th"=>"ประเทศไอซ์แลนด์", "name:tr"=>"İzlanda", "name:uk"=>"Ісландія", "name:vi"=>"Iceland", "name:zh"=>"冰岛", "name:haw"=>"‘Āina Hau", "name:zh_py"=>"Bingdao", "name:zh_pyt"=>"Bīngdǎo", "official_name"=>"Lýðveldið Ísland", "official_name:be"=>"Ісландыя", "official_name:el"=>"Δημοκρατία της Ισλανδίας", "official_name:en"=>"Republic of Iceland", "official_name:es"=>"República de Islandia", "official_name:id"=>"Republik Islandia", "official_name:it"=>"Repubblica d'Islanda", "official_name:ja"=>"アイスランド共和国", "official_name:lb"=>"Republik Island", "official_name:lt"=>"Islandijos Respublika", "official_name:lv"=>"Īslandes Republika", "official_name:pl"=>"Republika Islandii", "official_name:sv"=>"Republiken Island", "official_name:vi"=>"Cộng hòa Iceland" is      134
+lt     "name"=>"Lietuva", "name:af"=>"Litaue", "name:ar"=>"ليتوانيا", "name:be"=>"Літва", "name:br"=>"Lituania", "name:ca"=>"Lituània", "name:cy"=>"Lithwania", "name:da"=>"Litauen", "name:de"=>"Litauen", "name:el"=>"Λιθουανία", "name:en"=>"Lithuania", "name:eo"=>"Litovio", "name:es"=>"Lituania", "name:et"=>"Leedu", "name:fa"=>"لیتوانی", "name:fi"=>"Liettua", "name:fr"=>"Lituanie", "name:fy"=>"Litouwen", "name:ga"=>"An Liotuáin", "name:gd"=>"Liotuàinia", "name:he"=>"לטביה", "name:hr"=>"Litva", "name:hu"=>"Litvánia", "name:id"=>"Lituania", "name:is"=>"Litháen", "name:it"=>"Lituania", "name:ja"=>"リトアニア", "name:la"=>"Lituania", "name:lb"=>"Litauen", "name:li"=>"Litauwe", "name:lv"=>"Lietuva", "name:mn"=>"Литва", "name:nl"=>"Litouwen", "name:pl"=>"Litwa", "name:ru"=>"Литва", "name:sk"=>"Litva", "name:sl"=>"Litva", "name:sv"=>"Litauen", "name:th"=>"ประเทศลิทัวเนีย", "name:tr"=>"Litvanya", "name:uk"=>"Литва", "name:vi"=>"Litva", "name:zh"=>"立陶宛", "name:haw"=>"Lituania", "name:zh_py"=>"Litaowan", "name:zh_pyt"=>"Lìtáowǎn", "official_name"=>"Republic of Lithuania", "official_name:be"=>"Літоўская Рэспубліка", "official_name:el"=>"Δημοκρατία της Λιθουανίας", "official_name:en"=>"Republic of Lithuania", "official_name:es"=>"República de Lituania", "official_name:et"=>"Leedu Vabariik", "official_name:fr"=>"République de Lituanie", "official_name:id"=>"Republik Lituania", "official_name:it"=>"Repubblica di Lituania", "official_name:lt"=>"Lietuvos Respublika", "official_name:lv"=>"Lietuvas Republika", "official_name:pl"=>"Republika Litewska", "official_name:sk"=>"Litovská republika", "official_name:sv"=>"Republiken Litauen", "official_name:vi"=>"Cộng hòa Litva"      lt      67
+lv     "name"=>"Latvija", "name:af"=>"Letland", "name:ar"=>"لاتفيا", "name:be"=>"Латвія", "name:br"=>"Latvia", "name:ca"=>"Letònia", "name:cy"=>"Latfia", "name:da"=>"Letland", "name:de"=>"Lettland", "name:el"=>"Λεττονία", "name:en"=>"Latvia", "name:eo"=>"Latvio", "name:es"=>"Letonia", "name:et"=>"Läti", "name:fa"=>"لتونی", "name:fi"=>"Latvia", "name:fr"=>"Lettonie", "name:fy"=>"Letlân", "name:ga"=>"An Laitvia", "name:gd"=>"An Laitbhe", "name:he"=>"לטביה", "name:hu"=>"Lettország", "name:id"=>"Latvia", "name:is"=>"Lettland", "name:it"=>"Lettonia", "name:ja"=>"ラトビア", "name:la"=>"Lettonia", "name:lb"=>"Lettland", "name:li"=>"Letland", "name:mn"=>"Латви", "name:nl"=>"Letland", "name:pl"=>"Łotwa", "name:ru"=>"Латвия", "name:sk"=>"Lotyšsko", "name:sv"=>"Lettland", "name:th"=>"ประเทศลัตเวีย", "name:tr"=>"Letonya", "name:uk"=>"Латвія", "name:vi"=>"Latvia", "name:zh"=>"拉脱维亚", "name:zh_py"=>"Latuoweiya", "name:zh_pyt"=>"Lātuōwéiyà", "official_name"=>"Latvijas Republika", "official_name:be"=>"Латвійская Рэспубліка", "official_name:el"=>"Δημοκρατία της Λεττονίας", "official_name:en"=>"Republic of Latvia", "official_name:es"=>"República de Letonia", "official_name:et"=>"Läti Vabariik", "official_name:id"=>"Republik Latvia", "official_name:it"=>"Repubblica di Lettonia", "official_name:lt"=>"Latvijos Respublika", "official_name:pl"=>"Republika Łotwy", "official_name:sk"=>"Lotyšská republika", "official_name:sv"=>"Republiken Lettland", "official_name:vi"=>"Cộng hòa Latvia"  lv      162
+mm     "name"=>"Myanmar", "name:af"=>"Mianmar", "name:ar"=>"ميانمار", "name:be"=>"М'янма", "name:br"=>"Birmania", "name:ca"=>"Burma", "name:da"=>"Myanmar", "name:el"=>"Μιανμάρ", "name:en"=>"Myanmar", "name:eo"=>"Birmo", "name:et"=>"Birma", "name:fa"=>"میانمار", "name:fi"=>"Myanmar", "name:fr"=>"Birmanie", "name:fy"=>"Birma", "name:ga"=>"Maenmar", "name:gd"=>"Mianmar", "name:he"=>"מיאנמר", "name:hr"=>"Mijanmar (Burma)", "name:hu"=>"Mianmar", "name:is"=>"Mjanmar", "name:it"=>"Birmania", "name:la"=>"Birmania", "name:li"=>"Burma", "name:lt"=>"Mianmaras", "name:lv"=>"Mjanma", "name:mn"=>"Мьянмар", "name:pl"=>"Birma", "name:ru"=>"Мьянма", "name:sl"=>"Mjanmar", "name:sv"=>"Burma", "name:th"=>"ประเทศพม่า", "name:uk"=>"М'янма", "name:vi"=>"Myanma", "name:zh"=>"缅甸", "name:haw"=>"Puruma", "name:zh_py"=>"Miandian", "name:zh_pyt"=>"Miǎndiàn", "official_name:id"=>"Persatuan Myanmar", "official_name:it"=>"Myanmar", "official_name:lt"=>"Mianmaro Sąjunga", "official_name:lv"=>"Mjanmas Savienība", "official_name:pl"=>"Związek Myanmar", "official_name:sv"=>"Unionen Myanmar", "official_name:vi"=>"Liên bang Myanma"        my      148
+mr     "name"=>"موريتانيا", "name:af"=>"Mauritanië", "name:ar"=>"موريتانيا", "name:be"=>"Маўрытанія", "name:br"=>"Maouritania", "name:ca"=>"Mauritània", "name:cy"=>"Mauritania", "name:da"=>"Mauretanien", "name:de"=>"Mauretanien", "name:el"=>"Μαυριτανία", "name:en"=>"Mauritania", "name:eo"=>"Maŭritanio", "name:es"=>"Mauritania", "name:et"=>"Mauritaania", "name:fa"=>"موریتانی", "name:fi"=>"Mauritania", "name:fr"=>"Mauritanie", "name:fy"=>"Mauritaanje", "name:ga"=>"An Mháratáin", "name:gd"=>"Moratainia", "name:he"=>"מאוריטניה", "name:hr"=>"Mauritanija", "name:hu"=>"Mauritánia", "name:id"=>"Mauritania", "name:is"=>"Máritanía", "name:it"=>"Mauritania", "name:ja"=>"モーリタニア", "name:la"=>"Mauritania", "name:lb"=>"Mauretanien", "name:li"=>"Mauretanië", "name:lt"=>"Mauritanija", "name:lv"=>"Mauritānija", "name:mn"=>"Мавритани", "name:nl"=>"Mauritanië", "name:pl"=>"Mauretania", "name:pt"=>"Mauritânia", "name:ru"=>"Мавритания", "name:sl"=>"Mavretanija", "name:sv"=>"Mauretanien", "name:th"=>"ประเทศมอริเตเนีย", "name:tr"=>"Moritanya", "name:uk"=>"Мавританія", "name:vi"=>"Mauritanie", "name:zh"=>"毛里塔尼亚", "name:haw"=>"Mauritania", "name:zh_py"=>"Maolitaniya", "name:zh_pyt"=>"Máolǐtǎníyà", "official_name"=>"الجمهورية الإسلامية الموريتانية", "official_name:be"=>"Маўрытанская Ісламская Рэспубліка", "official_name:br"=>"Republik islamek Maouritania", "official_name:ca"=>"República Islàmica de Mauritània", "official_name:el"=>"Ισλαμική Δημοκρατία της Μαυριτανίας", "official_name:en"=>"Islamic Republic of Mauritania", "official_name:et"=>"Mauritaania Islamivabariik", "official_name:id"=>"Republik Islam Mauritania", "official_name:ja"=>"モーリタニア・イスラム共和国", "official_name:lb"=>"Islamesch Republik Mauretanien", "official_name:lt"=>"Mauritanijos Islamo Respublika", "official_name:lv"=>"Mauritānijas Islāma Republika", "official_name:pt"=>"República Islâmica da Mauritânia", "official_name:sv"=>"Islamiska republiken Mauretanien", "official_name:vi"=>"Cộng hòa Hồi giáo Mauritanie" fr      149
+ms     "name"=>"Montserrat", "name:ar"=>"مونتسرات", "name:be"=>"Мансерат", "name:br"=>"Montserrat", "name:da"=>"Montserrat", "name:en"=>"Montserrat", "name:eo"=>"Moncerato", "name:es"=>"Montserrat", "name:fa"=>"مونتسرات", "name:fi"=>"Montserrat", "name:fr"=>"Montserrat", "name:ga"=>"Montsarat", "name:he"=>"מונטסראט", "name:hu"=>"Montserrat", "name:is"=>"Montserrat", "name:it"=>"Montserrat", "name:lt"=>"Montseratas", "name:lv"=>"Montserrata", "name:mn"=>"Монтсеррат", "name:pl"=>"Montserrat", "name:ru"=>"Монтсеррат", "name:sv"=>"Montserrat", "name:th"=>"มอนต์เซอร์รัต", "name:uk"=>"Монтсеррат", "name:zh"=>"蒙特塞拉特"    en      73
+mx     "name"=>"México", "name:af"=>"Meksiko", "name:ar"=>"المكسيك", "name:be"=>"Мексіка", "name:br"=>"Mec’hiko", "name:ca"=>"Mèxic", "name:cy"=>"Mexico", "name:da"=>"Mexico", "name:de"=>"Mexiko", "name:el"=>"Μεξικό", "name:en"=>"Mexico", "name:eo"=>"Meksiko", "name:es"=>"México", "name:et"=>"Mehhiko", "name:fa"=>"مکزیک", "name:fi"=>"Meksiko", "name:fr"=>"Mexique", "name:fy"=>"Meksiko", "name:ga"=>"Meicsiceo", "name:gd"=>"Meagsago", "name:he"=>"מקסיקו", "name:hr"=>"Meksiko", "name:hu"=>"Mexikó", "name:id"=>"Meksiko", "name:is"=>"Mexíkó", "name:it"=>"Messico", "name:ja"=>"メキシコ", "name:la"=>"Mexicum", "name:lb"=>"Mexiko", "name:li"=>"Mexico", "name:lt"=>"Meksika", "name:lv"=>"Meksika", "name:mn"=>"Мексик", "name:nl"=>"Mexico", "name:pl"=>"Meksyk", "name:ru"=>"Мексика", "name:sl"=>"Mehika", "name:sv"=>"Mexiko", "name:th"=>"ประเทศเม็กซิโก", "name:tr"=>"Meksika", "name:uk"=>"Мексика", "name:zh"=>"墨西哥", "official_name"=>"Estados Unidos Mexicanos", "official_name:be"=>"Мексіканскія Злучаныя Штаты", "official_name:br"=>"Stadoù Unanet Mec’hiko", "official_name:el"=>"Ηνωμένες Πολιτείες του Μεξικού", "official_name:et"=>"Mehhiko Ühendriigid", "official_name:id"=>"Persatuan Negara-Negara Meksiko", "official_name:it"=>"Stati Uniti Messicani", "official_name:ja"=>"メキシコ合衆国", "official_name:lb"=>"Vereenegt mexikanesch Staaten", "official_name:lt"=>"Meksikos Jungtinės Valstijos", "official_name:lv"=>"Meksikas Savienotās Valstis", "official_name:pl"=>"Meksykańskie Stany Zjednoczone", "official_name:sv"=>"Mexikos förenta stater", "official_name:vi"=>"Liên bang México"       es      166
+pe     "name"=>"Peru", "name:ar"=>"بيرو", "name:be"=>"Перу", "name:br"=>"Perou", "name:ca"=>"Perú", "name:cy"=>"Periw", "name:da"=>"Peru", "name:el"=>"Περού", "name:en"=>"Peru", "name:eo"=>"Peruo", "name:es"=>"Perú", "name:et"=>"Peruu", "name:fa"=>"پرو", "name:fi"=>"Peru", "name:fr"=>"Pérou", "name:fy"=>"Perû", "name:ga"=>"Peiriú", "name:gd"=>"Pearu", "name:he"=>"פרו", "name:hu"=>"Peru", "name:is"=>"Perú", "name:it"=>"Perù", "name:ja"=>"ペルー", "name:la"=>"Peruvia", "name:lv"=>"Peru", "name:mn"=>"Перу", "name:pl"=>"Peru", "name:ru"=>"Перу", "name:sk"=>"Peru", "name:sv"=>"Peru", "name:th"=>"ประเทศเปรู", "name:uk"=>"Перу", "name:zh"=>"秘鲁", "official_name"=>"República del Perú", "official_name:el"=>"Δημοκρατία του Περού", "official_name:et"=>"Peruu Vabariik", "official_name:fr"=>"République du Pérou", "official_name:id"=>"Republik Peru", "official_name:lb"=>"Republik Peru", "official_name:lt"=>"Peru Respublika", "official_name:lv"=>"Peru Republika", "official_name:sk"=>"Peruánska republika", "official_name:sv"=>"Republiken Peru", "official_name:vi"=>"Cộng hòa Peru"     es      51
+pl     "name"=>"Polska", "name:af"=>"Pole", "name:ar"=>"بولندا", "name:be"=>"Польшча", "name:br"=>"Polonia", "name:ca"=>"Polònia", "name:cy"=>"Gwlad Pwyl", "name:da"=>"Polen", "name:de"=>"Polen", "name:el"=>"Πολωνία", "name:en"=>"Poland", "name:eo"=>"Pollando", "name:es"=>"Polonia", "name:et"=>"Poola", "name:fa"=>"لهستان", "name:fi"=>"Puola", "name:fr"=>"Pologne", "name:fy"=>"Poalen", "name:ga"=>"An Pholainn", "name:gd"=>"A' Phòlainn", "name:he"=>"פולין", "name:hr"=>"Poljska", "name:hu"=>"Lengyelország", "name:hy"=>"Լեհաստան", "name:id"=>"Polandia", "name:is"=>"Pólland", "name:it"=>"Polonia", "name:ja"=>"ポーランド", "name:la"=>"Polonia", "name:lb"=>"Polen", "name:li"=>"Pole", "name:lt"=>"Lenkija", "name:lv"=>"Polija", "name:mn"=>"Польш", "name:nl"=>"Polen", "name:no"=>"Polen", "name:pl"=>"Polska", "name:ru"=>"Польша", "name:sk"=>"Poľsko", "name:sl"=>"Poljska", "name:sv"=>"Polen", "name:th"=>"ประเทศโปแลนด์", "name:tr"=>"Polonya", "name:uk"=>"Польща", "name:vi"=>"Ba Lan", "name:zh"=>"波兰", "name:haw"=>"Pōlani", "name:zh_py"=>"Bolan", "name:zh_pyt"=>"Bōlán", "official_name"=>"Rzeczpospolita Polska", "official_name:be"=>"Рэспубліка Польшча", "official_name:el"=>"Δημοκρατία της Πολωνίας", "official_name:en"=>"Republic of Poland", "official_name:eo"=>"Pola Respubliko", "official_name:es"=>"República Polaca", "official_name:et"=>"Poola Vabariik", "official_name:fr"=>"République de Pologne", "official_name:it"=>"Repubblica di Polonia", "official_name:ja"=>"ポーランド共和国", "official_name:lt"=>"Lenkijos Respublika", "official_name:nl"=>"Republiek Polen", "official_name:ru"=>"Респу́блика По́льша", "official_name:sk"=>"Poľská republika", "official_name:sv"=>"Republiken Polen", "official_name:vi"=>"Cộng hòa Ba Lan"       pl      168
+sa     "name"=>"Saudi Arabia / السعودية", "name:af"=>"Saoedi-Arabië", "name:ar"=>"المملكة العربية السعودية", "name:be"=>"Саудаўская Аравія", "name:br"=>"Arabia Saoudat", "name:ca"=>"Aràbia Saudita", "name:da"=>"Saudi-Arabien", "name:de"=>"Saudi-Arabien", "name:el"=>"Σαουδική Αραβία", "name:en"=>"Saudi Arabia", "name:eo"=>"Saŭda Arabio", "name:es"=>"Arabia Saudita", "name:et"=>"Saudi Araabia", "name:fa"=>"عربستان سعودی", "name:fi"=>"Saudi-Arabia", "name:fr"=>"Arabie saoudite", "name:fy"=>"Saûdi-Araabje", "name:ga"=>"An Araib Shádach", "name:gd"=>"Saud-Aràibia", "name:he"=>"ערב הסעודית", "name:hr"=>"Saudijska Arabija", "name:hu"=>"Szaúd-Arábia", "name:id"=>"Arab Saudi", "name:is"=>"Sádí-Arabía", "name:it"=>"Arabia Saudita", "name:ja"=>"サウジアラビア", "name:la"=>"Arabia Saudiana", "name:lb"=>"Saudi-Arabien", "name:li"=>"Saoedi-Arabië", "name:lt"=>"Saudo Arabija", "name:mn"=>"Саудын Араб", "name:nl"=>"Saoedi-Arabië", "name:pl"=>"Arabia Saudyjska", "name:pt"=>"Arábia Saudita", "name:ru"=>"Саудовская Аравия", "name:sl"=>"Saudova Arabija", "name:sv"=>"Saudiarabien", "name:th"=>"ประเทศซาอุดีอาระเบีย", "name:tr"=>"Suudi Arabistan", "name:uk"=>"Саудівська Аравія", "name:vi"=>"Ả Rập Saudi", "name:zh"=>"沙特阿拉伯", "name:haw"=>"Saudi ʻAlapia", "name:zh_py"=>"Shate Alabo", "name:zh_pyt"=>"Shātè Ālābó", "official_name:af"=>"Koninkryk van Saoedi-Arabië", "official_name:br"=>"Rouantelezh Arabia Saoudat", "official_name:el"=>"Βασίλειο της Σαουδικής Αραβίας", "official_name:en"=>"Kingdom of Saudi Arabia", "official_name:et"=>"Saudi Araabia Kuningriik", "official_name:fr"=>"Royaume d'Arabie saoudite", "official_name:id"=>"Kerajaan Arab Saudi", "official_name:it"=>"Regno arabo saudita", "official_name:lb"=>"Kinnekräich Saudi-Arabien", "official_name:lt"=>"Saudo Arabijos Karalystė", "official_name:pl"=>"Królestwo Arabii Saudyjskiej", "official_name:pt"=>"Reino da Arábia Saudita", "official_name:sv"=>"Konungariket Saudiarabien", "official_name:vi"=>"Vương quốc Ả Rập Saudi"   ar      52
+sr     "name"=>"Suriname", "name:ar"=>"سورينام", "name:be"=>"Сурынам", "name:br"=>"Surinam", "name:ca"=>"Surinam", "name:da"=>"Surinam", "name:el"=>"Σουρινάμ", "name:en"=>"Suriname", "name:eo"=>"Surinamo", "name:es"=>"Surinam", "name:fa"=>"سورینام", "name:fi"=>"Suriname", "name:fr"=>"Suriname", "name:ga"=>"Suranam", "name:gd"=>"Suranam", "name:he"=>"סורינאם", "name:hr"=>"Surinam", "name:hu"=>"Suriname", "name:hy"=>"Սուրինամ", "name:is"=>"Súrínam", "name:ja"=>"スリナム", "name:la"=>"Surinamia", "name:lt"=>"Surinamas", "name:mn"=>"Суринам", "name:pl"=>"Surinam", "name:ru"=>"Суринам", "name:sl"=>"Surinam", "name:sv"=>"Surinam", "name:th"=>"ประเทศซูรินาเม", "name:tr"=>"Surinam", "name:uk"=>"Суринам", "name:zh"=>"苏里南", "official_name"=>"Republiek van Suriname", "official_name:be"=>"Рэспубліка Сурынам", "official_name:el"=>"Δημοκρατία του Σουρινάμ", "official_name:en"=>"Republic of Suriname", "official_name:es"=>"República de Surinam", "official_name:id"=>"Republik Suriname", "official_name:lb"=>"Republik Suriname", "official_name:lt"=>"Surinamo Respublika", "official_name:pl"=>"Republika Surinam", "official_name:sv"=>"Republiken Surinam" nl      24
+ss     "name"=>"South Sudan", "name:ar"=>"جنوب السودان", "name:br"=>"Soudan ar Su", "name:cs"=>"Jižní Súdán", "name:de"=>"Südsudan", "name:en"=>"South Sudan", "name:es"=>"Sudán del Sur", "name:et"=>"Lõuna-Sudaan", "name:fa"=>"سودان جنوبی", "name:fr"=>"Sud-Soudan", "name:hr"=>"Južni Sudan", "name:ku"=>"Sûdana Başûr", "name:ru"=>"Южный Судан", "name:sk"=>"Južný Sudán", "name:sl"=>"Južni Sudan", "name:tl"=>"Timog Sudan", "name:vi"=>"Nam Sudan", "name:zh"=>"南蘇丹", "int_name"=>"South Sudan", "name:ast"=>"Sudán del Sur", "official_name"=>"Republic of South Sudan", "official_name:br"=>"Republik Soudan ar Su", "official_name:cs"=>"Republika Jižní Súdán", "official_name:de"=>"Republik Südsudan", "official_name:en"=>"Republic of South Sudan", "official_name:es"=>"República de Sudán del Sur", "official_name:fr"=>"République du Sud-Soudan", "official_name:hr"=>"Republika Južni Sudan", "official_name:ku"=>"Komara Sûdana Başûr", "official_name:sk"=>"Juhosudánska republika", "official_name:tl"=>"Republika ng Timog Sudan" en      247
+sy     "name"=>"Sūriyya سوريا", "name:af"=>"Sirië", "name:ar"=>"سوريا", "name:be"=>"Сірыя", "name:br"=>"Siria", "name:ca"=>"Síria", "name:da"=>"Syrien", "name:de"=>"Syrien", "name:el"=>"Συρία", "name:en"=>"Syria", "name:eo"=>"Sirio", "name:es"=>"Siria", "name:fa"=>"سوریه", "name:fi"=>"Syyria", "name:fr"=>"Syrie", "name:fy"=>"Syrje", "name:ga"=>"An tSiria", "name:gd"=>"Siria", "name:he"=>"סוריה", "name:hr"=>"Sirija", "name:hu"=>"Szíria", "name:id"=>"Suriah", "name:is"=>"Sýrland", "name:it"=>"Siria", "name:ja"=>"シリア", "name:la"=>"Syria", "name:lb"=>"Syrien", "name:li"=>"Syrië", "name:lt"=>"Sirija", "name:lv"=>"Sīrija", "name:mn"=>"Сири", "name:nl"=>"Syrië", "name:pl"=>"Syria", "name:pt"=>"Síria", "name:ru"=>"Сирия", "name:sl"=>"Sirija", "name:sv"=>"Syrien", "name:th"=>"ประเทศซีเรีย", "name:tr"=>"Suriye", "name:uk"=>"Сирія", "name:vi"=>"Syria", "name:zh"=>"叙利亚", "name:haw"=>"Suria", "name:zh_py"=>"Xuliya", "name:zh_pyt"=>"Xùlìyà", "official_name:br"=>"Republik Arab Siria", "official_name:ca"=>"República Àrab Siriana", "official_name:el"=>"Αραβική Δημοκρατία της Συρίας", "official_name:gd"=>"Poblachd Arabach Shirianach", "official_name:id"=>"Republik Arab Suriah", "official_name:it"=>"Repubblica Araba di Siria", "official_name:lb"=>"Arabesch Republik Syrien", "official_name:lt"=>"Sirijos Arabų Respublika", "official_name:pl"=>"Syryjska Republika Arabska", "official_name:pt"=>"República Árabe da Síria", "official_name:ru"=>"Сирийская Арабская Республика", "official_name:sv"=>"Arabrepubliken Syrien"  ar      104
+vn     "name"=>"Việt Nam", "name:af"=>"Viëtnam", "name:ar"=>"فييت نام", "name:be"=>"В'етнам", "name:br"=>"Viêt Nam", "name:ca"=>"Vietnam", "name:cy"=>"Fiet Nam", "name:da"=>"Vietnam", "name:de"=>"Vietnam", "name:el"=>"Βιετνάμ", "name:en"=>"Vietnam", "name:eo"=>"Vjetnamio", "name:es"=>"Vietnam", "name:et"=>"Vietnam", "name:fa"=>"ویتنام", "name:fi"=>"Vietnam", "name:fr"=>"Viêt Nam", "name:fy"=>"Fietnam", "name:ga"=>"Vítneam", "name:gd"=>"Bhiet-Nam", "name:he"=>"ויאטנם", "name:hr"=>"Vietnam", "name:hu"=>"Vietnam", "name:hy"=>"Վիետնամ", "name:id"=>"Vietnam", "name:is"=>"Víetnam", "name:it"=>"Vietnam", "name:ja"=>"ベトナム", "name:la"=>"Vietnamia", "name:lb"=>"Vietnam", "name:li"=>"Viëtnam", "name:lt"=>"Vietnamas", "name:lv"=>"Vjetnama", "name:mn"=>"Вьетнам", "name:nl"=>"Vietnam", "name:pl"=>"Wietnam", "name:pt"=>"Vietnã", "name:ru"=>"Вьетнам", "name:sl"=>"Vietnam", "name:sv"=>"Vietnam", "name:th"=>"ประเทศเวียดนาม", "name:tr"=>"Vietnam", "name:uk"=>"В'єтнам", "name:vi"=>"Việt Nam", "name:zh"=>"越南", "name:haw"=>"Wiekanama", "name:zh_py"=>"Yuenan", "name:zh_pyt"=>"Yuènán", "official_name"=>"Cộng Hòa Xã Hội Chủ Nghĩa Việt Nam", "official_name:be"=>"В'етнам ", "official_name:ca"=>"República Socialista del Vietnam", "official_name:el"=>"Σοσιαλιστική Δημοκρατία του Βιετνάμ", "official_name:et"=>"Vietnami Sotsialistlik Vabariik", "official_name:id"=>"Republik Sosialis Vietnam", "official_name:it"=>"Repubblica Socialista del Vietnam", "official_name:ja"=>"ベトナム社会主義共和国", "official_name:lb"=>"Sozialistesch Republik Vietnam", "official_name:pl"=>"Socjalistyczna Republika Wietnamu", "official_name:pt"=>"República Socialista do Vietnã", "official_name:sv"=>"Socialistiska republiken Vietnam"     vi      75
 \.
 
-
---
--- Name: idx_country_name_country_code; Type: INDEX; Schema: public; Owner: brian; Tablespace: 
---
-
 CREATE INDEX idx_country_name_country_code ON country_name USING btree (country_code);
-
-
---
--- Name: country_name; Type: ACL; Schema: public; Owner: brian
---
-
-REVOKE ALL ON TABLE country_name FROM PUBLIC;
-
-
---
--- PostgreSQL database dump complete
---
-
index d20d20ea8ce2d33029879a4f8f406416674e848a..f341d5a9a171c22125c8d7c284b4fe09706498bc 100644 (file)
@@ -18316,7 +18316,6 @@ COPY us_postcode (postcode, x, y) FROM stdin;
 45682  -82.7132476732882651    38.8141238738390513
 32822  -81.2890641417997699    28.4996104146691565
 10589  -73.6946260932133725    41.3319987693007462
-       -110.390038309796751    39.5043862981486527
 95253  -121.205984758554834    38.1383772536563157
 44168  -83.5412335555174792    42.4016783877205441
 38870  -88.3578842735458778    34.0629206861111911
index a4ad604d3afb8ccaef84af5d2950a4d583c08325..2211d1405053a3f96f777c6ae1ac14f2d4c625a0 100644 (file)
@@ -19,6 +19,8 @@ Add to your settings/local.php:
 
     @define('CONST_Osm2pgsql_Flatnode_File', '/path/to/flatnode.file');
 
+Replace the second part with a suitable path on your system and make sure
+the directory exists. There should be at least 35GB of free space.
 
 Downloading additional data
 ---------------------------
@@ -65,10 +67,8 @@ avoid swapping, never give more than 2/3 of RAM to osm2pgsql.
 Loading additional datasets
 ---------------------------
 
-The following commands will create additional entries for countries and POI searches:
+The following commands will create additional entries for POI searches:
 
-    ./utils/specialphrases.php --countries > specialphrases_countries.sql
-    psql -d nominatim -f specialphrases_countries.sql
     ./utils/specialphrases.php --wiki-import > specialphrases.sql
     psql -d nominatim -f specialphrases.sql
 
index 2e6243963a753049c24d20c6c2ac8824c16a5465..5a3100e5fe9575485c86a978a89c96af452176af 100644 (file)
@@ -103,7 +103,7 @@ directory and create an alias:
 
     <Directory "/srv/nominatim/build/website">
       Options FollowSymLinks MultiViews
-      AddTpe text/html   .php
+      AddType text/html   .php
       Require all granted
     </Directory>
     Alias /nominatim /srv/nominatim/build/website
index bdc8226ec9f79d7ad7bf26a01b646baf7544e682..b6458725bdab22fd3ccd42e0dac28d67533c43f4 100644 (file)
 <?php
-       require_once(CONST_BasePath.'/lib/PlaceLookup.php');
-       require_once(CONST_BasePath.'/lib/ReverseGeocode.php');
-
-       class Geocode
-       {
-               protected $oDB;
-
-               protected $aLangPrefOrder = array();
-
-               protected $bIncludeAddressDetails = false;
-               protected $bIncludeExtraTags = false;
-               protected $bIncludeNameDetails = false;
-
-               protected $bIncludePolygonAsPoints = false;
-               protected $bIncludePolygonAsText = false;
-               protected $bIncludePolygonAsGeoJSON = false;
-               protected $bIncludePolygonAsKML = false;
-               protected $bIncludePolygonAsSVG = false;
-               protected $fPolygonSimplificationThreshold = 0.0;
-
-               protected $aExcludePlaceIDs = array();
-               protected $bDeDupe = true;
-               protected $bReverseInPlan = true;
-
-               protected $iLimit = 20;
-               protected $iFinalLimit = 10;
-               protected $iOffset = 0;
-               protected $bFallback = false;
-
-               protected $aCountryCodes = false;
-               protected $aNearPoint = false;
-
-               protected $bBoundedSearch = false;
-               protected $aViewBox = false;
-               protected $sViewboxSmallSQL = false;
-               protected $sViewboxLargeSQL = false;
-               protected $aRoutePoints = false;
-
-               protected $iMaxRank = 20;
-               protected $iMinAddressRank = 0;
-               protected $iMaxAddressRank = 30;
-               protected $aAddressRankList = array();
-               protected $exactMatchCache = array();
-
-               protected $sAllowedTypesSQLList = false;
-
-               protected $sQuery = false;
-               protected $aStructuredQuery = false;
-
-               function Geocode(&$oDB)
-               {
-                       $this->oDB =& $oDB;
-               }
-
-               function setReverseInPlan($bReverse)
-               {
-                       $this->bReverseInPlan = $bReverse;
-               }
-
-               function setLanguagePreference($aLangPref)
-               {
-                       $this->aLangPrefOrder = $aLangPref;
-               }
-
-               function getIncludeAddressDetails()
-               {
-                       return $this->bIncludeAddressDetails;
-               }
-
-               function getIncludeExtraTags()
-               {
-                       return $this->bIncludeExtraTags;
-               }
-
-               function getIncludeNameDetails()
-               {
-                       return $this->bIncludeNameDetails;
-               }
-
-               function setIncludePolygonAsPoints($b = true)
-               {
-                       $this->bIncludePolygonAsPoints = $b;
-               }
-
-               function setIncludePolygonAsText($b = true)
-               {
-                       $this->bIncludePolygonAsText = $b;
-               }
-
-               function setIncludePolygonAsGeoJSON($b = true)
-               {
-                       $this->bIncludePolygonAsGeoJSON = $b;
-               }
-
-               function setIncludePolygonAsKML($b = true)
-               {
-                       $this->bIncludePolygonAsKML = $b;
-               }
-
-               function setIncludePolygonAsSVG($b = true)
-               {
-                       $this->bIncludePolygonAsSVG = $b;
-               }
-
-               function setPolygonSimplificationThreshold($f)
-               {
-                       $this->fPolygonSimplificationThreshold = $f;
-               }
-
-               function setLimit($iLimit = 10)
-               {
-                       if ($iLimit > 50) $iLimit = 50;
-                       if ($iLimit < 1) $iLimit = 1;
-
-                       $this->iFinalLimit = $iLimit;
-                       $this->iLimit = $this->iFinalLimit + min($this->iFinalLimit, 10);
-               }
-
-               function getExcludedPlaceIDs()
-               {
-                       return $this->aExcludePlaceIDs;
-               }
-
-               function setViewBox($fLeft, $fBottom, $fRight, $fTop)
-               {
-                       $this->aViewBox = array($fLeft, $fBottom, $fRight, $fTop);
-               }
-
-               function getViewBoxString()
-               {
-                       if (!$this->aViewBox) return null;
-                       return $this->aViewBox[0].','.$this->aViewBox[3].','.$this->aViewBox[2].','.$this->aViewBox[1];
-               }
-
-               function setFeatureType($sFeatureType)
-               {
-                       switch($sFeatureType)
-                       {
-                       case 'country':
-                               $this->setRankRange(4, 4);
-                               break;
-                       case 'state':
-                               $this->setRankRange(8, 8);
-                               break;
-                       case 'city':
-                               $this->setRankRange(14, 16);
-                               break;
-                       case 'settlement':
-                               $this->setRankRange(8, 20);
-                               break;
-                       }
-               }
-
-               function setRankRange($iMin, $iMax)
-               {
-                       $this->iMinAddressRank = $iMin;
-                       $this->iMaxAddressRank = $iMax;
-               }
-
-               function setNearPoint($aNearPoint, $fRadiusDeg = 0.1)
-               {
-                       $this->aNearPoint = array((float)$aNearPoint[0], (float)$aNearPoint[1], (float)$fRadiusDeg);
-               }
-
-               function setQuery($sQueryString)
-               {
-                       $this->sQuery = $sQueryString;
-                       $this->aStructuredQuery = false;
-               }
-
-               function getQueryString()
-               {
-                       return $this->sQuery;
-               }
-
-
-               function loadParamArray($aParams)
-               {
-                       if (isset($aParams['addressdetails'])) $this->bIncludeAddressDetails = (bool)$aParams['addressdetails'];
-                       if (isset($aParams['extratags'])) $this->bIncludeExtraTags = (bool)$aParams['extratags'];
-                       if (isset($aParams['namedetails'])) $this->bIncludeNameDetails = (bool)$aParams['namedetails'];
-
-                       if (isset($aParams['bounded'])) $this->bBoundedSearch = (bool)$aParams['bounded'];
-                       if (isset($aParams['dedupe'])) $this->bDeDupe = (bool)$aParams['dedupe'];
-
-                       if (isset($aParams['limit'])) $this->setLimit((int)$aParams['limit']);
-                       if (isset($aParams['offset'])) $this->iOffset = (int)$aParams['offset'];
-
-                       if (isset($aParams['fallback'])) $this->bFallback = (bool)$aParams['fallback'];
-
-                       // List of excluded Place IDs - used for more acurate pageing
-                       if (isset($aParams['exclude_place_ids']) && $aParams['exclude_place_ids'])
-                       {
-                               foreach(explode(',',$aParams['exclude_place_ids']) as $iExcludedPlaceID)
-                               {
-                                       $iExcludedPlaceID = (int)$iExcludedPlaceID;
-                                       if ($iExcludedPlaceID)
-                                               $aExcludePlaceIDs[$iExcludedPlaceID] = $iExcludedPlaceID;
-                               }
-
-                               if (isset($aExcludePlaceIDs))
-                                       $this->aExcludePlaceIDs = $aExcludePlaceIDs;
-                       }
-
-                       // Only certain ranks of feature
-                       if (isset($aParams['featureType'])) $this->setFeatureType($aParams['featureType']);
-                       if (isset($aParams['featuretype'])) $this->setFeatureType($aParams['featuretype']);
-
-                       // Country code list
-                       if (isset($aParams['countrycodes']))
-                       {
-                               $aCountryCodes = array();
-                               foreach(explode(',',$aParams['countrycodes']) as $sCountryCode)
-                               {
-                                       if (preg_match('/^[a-zA-Z][a-zA-Z]$/', $sCountryCode))
-                                       {
-                                               $aCountryCodes[] = strtolower($sCountryCode);
-                                       }
-                               }
-                               $this->aCountryCodes = $aCountryCodes;
-                       }
-
-                       if (isset($aParams['viewboxlbrt']) && $aParams['viewboxlbrt'])
-                       {
-                               $aCoOrdinatesLBRT = explode(',',$aParams['viewboxlbrt']);
-                               $this->setViewBox($aCoOrdinatesLBRT[0], $aCoOrdinatesLBRT[1], $aCoOrdinatesLBRT[2], $aCoOrdinatesLBRT[3]);
-                       }
-                       else if (isset($aParams['viewbox']) && $aParams['viewbox'])
-                       {
-                               $aCoOrdinatesLTRB = explode(',',$aParams['viewbox']);
-                               $this->setViewBox($aCoOrdinatesLTRB[0], $aCoOrdinatesLTRB[3], $aCoOrdinatesLTRB[2], $aCoOrdinatesLTRB[1]);
-                       }
-
-                       if (isset($aParams['route']) && $aParams['route'] && isset($aParams['routewidth']) && $aParams['routewidth'])
-                       {
-                               $aPoints = explode(',',$aParams['route']);
-                               if (sizeof($aPoints) % 2 != 0)
-                               {
-                                       userError("Uneven number of points");
-                                       exit;
-                               }
-                               $fPrevCoord = false;
-                               $aRoute = array();
-                               foreach($aPoints as $i => $fPoint)
-                               {
-                                       if ($i%2)
-                                       {
-                                               $aRoute[] = array((float)$fPoint, $fPrevCoord);
-                                       }
-                                       else
-                                       {
-                                               $fPrevCoord = (float)$fPoint;
-                                       }
-                               }
-                               $this->aRoutePoints = $aRoute;
-                       }
-               }
-
-               function setQueryFromParams($aParams)
-               {
-                       // Search query
-                       $sQuery = (isset($aParams['q'])?trim($aParams['q']):'');
-                       if (!$sQuery)
-                       {
-                               $this->setStructuredQuery(@$aParams['amenity'], @$aParams['street'], @$aParams['city'], @$aParams['county'], @$aParams['state'], @$aParams['country'], @$aParams['postalcode']);
-                               $this->setReverseInPlan(false);
-                       }
-                       else
-                       {
-                               $this->setQuery($sQuery);
-                       }
-               }
-
-               function loadStructuredAddressElement($sValue, $sKey, $iNewMinAddressRank, $iNewMaxAddressRank, $aItemListValues)
-               {
-                       $sValue = trim($sValue);
-                       if (!$sValue) return false;
-                       $this->aStructuredQuery[$sKey] = $sValue;
-                       if ($this->iMinAddressRank == 0 && $this->iMaxAddressRank == 30)
-                       {
-                               $this->iMinAddressRank = $iNewMinAddressRank;
-                               $this->iMaxAddressRank = $iNewMaxAddressRank;
-                       }
-                       if ($aItemListValues) $this->aAddressRankList = array_merge($this->aAddressRankList, $aItemListValues);
-                       return true;
-               }
-
-               function setStructuredQuery($sAmentiy = false, $sStreet = false, $sCity = false, $sCounty = false, $sState = false, $sCountry = false, $sPostalCode = false)
-               {
-                       $this->sQuery = false;
-
-                       // Reset
-                       $this->iMinAddressRank = 0;
-                       $this->iMaxAddressRank = 30;
-                       $this->aAddressRankList = array();
-
-                       $this->aStructuredQuery = array();
-                       $this->sAllowedTypesSQLList = '';
-
-                       $this->loadStructuredAddressElement($sAmentiy, 'amenity', 26, 30, false);
-                       $this->loadStructuredAddressElement($sStreet, 'street', 26, 30, false);
-                       $this->loadStructuredAddressElement($sCity, 'city', 14, 24, false);
-                       $this->loadStructuredAddressElement($sCounty, 'county', 9, 13, false);
-                       $this->loadStructuredAddressElement($sState, 'state', 8, 8, false);
-                       $this->loadStructuredAddressElement($sPostalCode, 'postalcode' , 5, 11, array(5, 11));
-                       $this->loadStructuredAddressElement($sCountry, 'country', 4, 4, false);
-
-                       if (sizeof($this->aStructuredQuery) > 0)
-                       {
-                               $this->sQuery = join(', ', $this->aStructuredQuery);
-                               if ($this->iMaxAddressRank < 30)
-                               {
-                                       $sAllowedTypesSQLList = '(\'place\',\'boundary\')';
-                               }
-                       }
-               }
-
-               function fallbackStructuredQuery()
-               {
-                       if (!$this->aStructuredQuery) return false;
-
-                       $aParams = $this->aStructuredQuery;
-
-                       if (sizeof($aParams) == 1) return false;
-
-                       $aOrderToFallback = array('postalcode', 'street', 'city', 'county', 'state');
-
-                       foreach($aOrderToFallback as $sType)
-                       {
-                               if (isset($aParams[$sType]))
-                               {
-                                       unset($aParams[$sType]);
-                                       $this->setStructuredQuery(@$aParams['amenity'], @$aParams['street'], @$aParams['city'], @$aParams['county'], @$aParams['state'], @$aParams['country'], @$aParams['postalcode']);
-                                       return true;
-                               }
-                       }
-
-                       return false;
-               }
-
-               function getDetails($aPlaceIDs)
-               {
-                       //$aPlaceIDs is an array with key: placeID and value: tiger-housenumber, if found, else -1
-                       if (sizeof($aPlaceIDs) == 0)  return array();
-
-                       $sLanguagePrefArraySQL = "ARRAY[".join(',',array_map("getDBQuoted",$this->aLangPrefOrder))."]";
-
-                       // Get the details for display (is this a redundant extra step?)
-                       $sPlaceIDs = join(',', array_keys($aPlaceIDs));
-
-                       $sImportanceSQL = '';
-                       if ($this->sViewboxSmallSQL) $sImportanceSQL .= " case when ST_Contains($this->sViewboxSmallSQL, ST_Collect(centroid)) THEN 1 ELSE 0.75 END * ";
-                       if ($this->sViewboxLargeSQL) $sImportanceSQL .= " case when ST_Contains($this->sViewboxLargeSQL, ST_Collect(centroid)) THEN 1 ELSE 0.75 END * ";
-
-                       $sSQL = "select osm_type,osm_id,class,type,admin_level,rank_search,rank_address,min(place_id) as place_id, min(parent_place_id) as parent_place_id, calculated_country_code as country_code,";
-                       $sSQL .= "get_address_by_language(place_id, -1, $sLanguagePrefArraySQL) as langaddress,";
-                       $sSQL .= "get_name_by_language(name, $sLanguagePrefArraySQL) as placename,";
-                       $sSQL .= "get_name_by_language(name, ARRAY['ref']) as ref,";
-                       if ($this->bIncludeExtraTags) $sSQL .= "hstore_to_json(extratags)::text as extra,";
-                       if ($this->bIncludeNameDetails) $sSQL .= "hstore_to_json(name)::text as names,";
-                       $sSQL .= "avg(ST_X(centroid)) as lon,avg(ST_Y(centroid)) as lat, ";
-                       $sSQL .= $sImportanceSQL."coalesce(importance,0.75-(rank_search::float/40)) as importance, ";
-                       $sSQL .= "(select max(p.importance*(p.rank_address+2)) from place_addressline s, placex p where s.place_id = min(CASE WHEN placex.rank_search < 28 THEN placex.place_id ELSE placex.parent_place_id END) and p.place_id = s.address_place_id and s.isaddress and p.importance is not null) as addressimportance, ";
-                       $sSQL .= "(extratags->'place') as extra_place ";
-                       $sSQL .= "from placex where place_id in ($sPlaceIDs) ";
-                       $sSQL .= "and (placex.rank_address between $this->iMinAddressRank and $this->iMaxAddressRank ";
-                       if (14 >= $this->iMinAddressRank && 14 <= $this->iMaxAddressRank) $sSQL .= " OR (extratags->'place') = 'city'";
-                       if ($this->aAddressRankList) $sSQL .= " OR placex.rank_address in (".join(',',$this->aAddressRankList).")";
-                       $sSQL .= ") ";
-                       if ($this->sAllowedTypesSQLList) $sSQL .= "and placex.class in $this->sAllowedTypesSQLList ";
-                       $sSQL .= "and linked_place_id is null ";
-                       $sSQL .= "group by osm_type,osm_id,class,type,admin_level,rank_search,rank_address,calculated_country_code,importance";
-                       if (!$this->bDeDupe) $sSQL .= ",place_id";
-                       $sSQL .= ",langaddress ";
-                       $sSQL .= ",placename ";
-                       $sSQL .= ",ref ";
-                       if ($this->bIncludeExtraTags) $sSQL .= ",extratags";
-                       if ($this->bIncludeNameDetails) $sSQL .= ",name";
-                       $sSQL .= ",extratags->'place' ";
-
-                       if (30 >= $this->iMinAddressRank && 30 <= $this->iMaxAddressRank)
-                       {
-                               //only Tiger housenumbers and interpolation lines need to be interpolated, because they are saved as lines 
-                               // with start- and endnumber, the common osm housenumbers are usually saved as points
-                               $sHousenumbers = "";
-                               $i = 0;
-                               $length = count($aPlaceIDs);
-                               foreach($aPlaceIDs as $placeID => $housenumber)
-                               {
-                                       $i++;
-                                       $sHousenumbers .= "(".$placeID.", ".$housenumber.")";
-                                       if($i<$length)
-                                               $sHousenumbers .= ", ";
-                               }
-                               if (CONST_Use_US_Tiger_Data)
-                               {
-                                       //Tiger search only if a housenumber was searched and if it was found (i.e. aPlaceIDs[placeID] = housenumber != -1) (realized through a join)
-                                       $sSQL .= " union";
-                                       $sSQL .= " select 'T' as osm_type, place_id as osm_id, 'place' as class, 'house' as type, null as admin_level, 30 as rank_search, 30 as rank_address, min(place_id) as place_id, min(parent_place_id) as parent_place_id, 'us' as country_code";
-                                       $sSQL .= ", get_address_by_language(place_id, housenumber_for_place, $sLanguagePrefArraySQL) as langaddress ";
-                                       $sSQL .= ", null as placename";
-                                       $sSQL .= ", null as ref";
-                                       if ($this->bIncludeExtraTags) $sSQL .= ", null as extra";
-                                       if ($this->bIncludeNameDetails) $sSQL .= ", null as names";
-                                       $sSQL .= ", avg(st_x(centroid)) as lon, avg(st_y(centroid)) as lat,";
-                                       $sSQL .= $sImportanceSQL."-1.15 as importance ";
-                                       $sSQL .= ", (select max(p.importance*(p.rank_address+2)) from place_addressline s, placex p where s.place_id = min(blub.parent_place_id) and p.place_id = s.address_place_id and s.isaddress and p.importance is not null) as addressimportance ";
-                                       $sSQL .= ", null as extra_place ";
-                                       $sSQL .= " from (select place_id";
-                                       //interpolate the Tiger housenumbers here
-                                       $sSQL .= ", ST_LineInterpolatePoint(linegeo, (housenumber_for_place-startnumber::float)/(endnumber-startnumber)::float) as centroid, parent_place_id, housenumber_for_place";
-                                       $sSQL .= " from (location_property_tiger ";
-                                       $sSQL .= " join (values ".$sHousenumbers.") as housenumbers(place_id, housenumber_for_place) using(place_id)) ";
-                                       $sSQL .= " where housenumber_for_place>=0 and 30 between $this->iMinAddressRank and $this->iMaxAddressRank) as blub"; //postgres wants an alias here
-                                       $sSQL .= " group by place_id, housenumber_for_place"; //is this group by really needed?, place_id + housenumber (in combination) are unique
-                                       if (!$this->bDeDupe) $sSQL .= ", place_id ";
-                               }
-                               // osmline
-                               // interpolation line search only if a housenumber was searched and if it was found (i.e. aPlaceIDs[placeID] = housenumber != -1) (realized through a join)
-                               $sSQL .= " union ";
-                               $sSQL .= "select 'W' as osm_type, place_id as osm_id, 'place' as class, 'house' as type, null as admin_level, 30 as rank_search, 30 as rank_address, min(place_id) as place_id, min(parent_place_id) as parent_place_id, calculated_country_code as country_code, ";
-                               $sSQL .= "get_address_by_language(place_id, housenumber_for_place, $sLanguagePrefArraySQL) as langaddress, ";
-                               $sSQL .= "null as placename, ";
-                               $sSQL .= "null as ref, ";
-                               if ($this->bIncludeExtraTags) $sSQL .= "null as extra, ";
-                               if ($this->bIncludeNameDetails) $sSQL .= "null as names, ";
-                               $sSQL .= " avg(st_x(centroid)) as lon, avg(st_y(centroid)) as lat,";
-                               $sSQL .= $sImportanceSQL."-0.1 as importance, ";  // slightly smaller than the importance for normal houses with rank 30, which is 0
-                               $sSQL .= " (select max(p.importance*(p.rank_address+2)) from place_addressline s, placex p";
-                               $sSQL .= " where s.place_id = min(blub.parent_place_id) and p.place_id = s.address_place_id and s.isaddress and p.importance is not null) as addressimportance,";
-                               $sSQL .= " null as extra_place ";
-                               $sSQL .= " from (select place_id, calculated_country_code ";
-                               //interpolate the housenumbers here
-                               $sSQL .= ", CASE WHEN startnumber != endnumber 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, housenumber_for_place ";
-                               $sSQL .= " from (location_property_osmline ";
-                               $sSQL .= " join (values ".$sHousenumbers.") as housenumbers(place_id, housenumber_for_place) using(place_id)) ";
-                               $sSQL .= " where housenumber_for_place>=0 and 30 between $this->iMinAddressRank and $this->iMaxAddressRank) as blub"; //postgres wants an alias here
-                               $sSQL .= " group by place_id, housenumber_for_place, calculated_country_code "; //is this group by really needed?, place_id + housenumber (in combination) are unique
-                               if (!$this->bDeDupe) $sSQL .= ", place_id ";
-
-                               if (CONST_Use_Aux_Location_data)
-                               {
-                                       $sSQL .= " union ";
-                                       $sSQL .= "select 'L' as osm_type, place_id as osm_id, 'place' as class, 'house' as type, null as admin_level, 0 as rank_search, 0 as rank_address, min(place_id) as place_id, min(parent_place_id) as parent_place_id, 'us' as country_code, ";
-                                       $sSQL .= "get_address_by_language(place_id, -1, $sLanguagePrefArraySQL) as langaddress, ";
-                                       $sSQL .= "null as placename, ";
-                                       $sSQL .= "null as ref, ";
-                                       if ($this->bIncludeExtraTags) $sSQL .= "null as extra, ";
-                                       if ($this->bIncludeNameDetails) $sSQL .= "null as names, ";
-                                       $sSQL .= "avg(ST_X(centroid)) as lon, avg(ST_Y(centroid)) as lat, ";
-                                       $sSQL .= $sImportanceSQL."-1.10 as importance, ";
-                                       $sSQL .= "(select max(p.importance*(p.rank_address+2)) from place_addressline s, placex p where s.place_id = min(location_property_aux.parent_place_id) and p.place_id = s.address_place_id and s.isaddress and p.importance is not null) as addressimportance, ";
-                                       $sSQL .= "null as extra_place ";
-                                       $sSQL .= "from location_property_aux where place_id in ($sPlaceIDs) ";
-                                       $sSQL .= "and 30 between $this->iMinAddressRank and $this->iMaxAddressRank ";
-                                       $sSQL .= "group by place_id";
-                                       if (!$this->bDeDupe) $sSQL .= ", place_id";
-                                       $sSQL .= ", get_address_by_language(place_id, -1, $sLanguagePrefArraySQL) ";
-                               }
-                       }
-
-                       $sSQL .= " order by importance desc";
-                       if (CONST_Debug) { echo "<hr>"; var_dump($sSQL); }
-                       $aSearchResults = chksql($this->oDB->getAll($sSQL),
-                                                "Could not get details for place.");
-
-                       return $aSearchResults;
-               }
-
-               function getGroupedSearches($aSearches, $aPhraseTypes, $aPhrases, $aValidTokens, $aWordFrequencyScores, $bStructuredPhrases)
-               {
-                       /*
-                                Calculate all searches using aValidTokens i.e.
-                                'Wodsworth Road, Sheffield' =>
-
-                                Phrase Wordset
-                                0      0       (wodsworth road)
-                                0      1       (wodsworth)(road)
-                                1      0       (sheffield)
-
-                                Score how good the search is so they can be ordered
-                        */
-                       foreach($aPhrases as $iPhrase => $sPhrase)
-                       {
-                               $aNewPhraseSearches = array();
-                               if ($bStructuredPhrases) $sPhraseType = $aPhraseTypes[$iPhrase];
-                               else $sPhraseType = '';
-
-                               foreach($aPhrases[$iPhrase]['wordsets'] as $iWordSet => $aWordset)
-                               {
-                                       // Too many permutations - too expensive
-                                       if ($iWordSet > 120) break;
-
-                                       $aWordsetSearches = $aSearches;
-
-                                       // Add all words from this wordset
-                                       foreach($aWordset as $iToken => $sToken)
-                                       {
-                                               //echo "<br><b>$sToken</b>";
-                                               $aNewWordsetSearches = array();
-
-                                               foreach($aWordsetSearches as $aCurrentSearch)
-                                               {
-                                                       //echo "<i>";
-                                                       //var_dump($aCurrentSearch);
-                                                       //echo "</i>";
-
-                                                       // If the token is valid
-                                                       if (isset($aValidTokens[' '.$sToken]))
-                                                       {
-                                                               foreach($aValidTokens[' '.$sToken] as $aSearchTerm)
-                                                               {
-                                                                       $aSearch = $aCurrentSearch;
-                                                                       $aSearch['iSearchRank']++;
-                                                                       if (($sPhraseType == '' || $sPhraseType == 'country') && !empty($aSearchTerm['country_code']) && $aSearchTerm['country_code'] != '0')
-                                                                       {
-                                                                               if ($aSearch['sCountryCode'] === false)
-                                                                               {
-                                                                                       $aSearch['sCountryCode'] = strtolower($aSearchTerm['country_code']);
-                                                                                       // Country is almost always at the end of the string - increase score for finding it anywhere else (optimisation)
-                                                                                       if (($iToken+1 != sizeof($aWordset) || $iPhrase+1 != sizeof($aPhrases)))
-                                                                                       {
-                                                                                               $aSearch['iSearchRank'] += 5;
-                                                                                       }
-                                                                                       if ($aSearch['iSearchRank'] < $this->iMaxRank) $aNewWordsetSearches[] = $aSearch;
-                                                                               }
-                                                                       }
-                                                                       elseif (isset($aSearchTerm['lat']) && $aSearchTerm['lat'] !== '' && $aSearchTerm['lat'] !== null)
-                                                                       {
-                                                                               if ($aSearch['fLat'] === '')
-                                                                               {
-                                                                                       $aSearch['fLat'] = $aSearchTerm['lat'];
-                                                                                       $aSearch['fLon'] = $aSearchTerm['lon'];
-                                                                                       $aSearch['fRadius'] = $aSearchTerm['radius'];
-                                                                                       if ($aSearch['iSearchRank'] < $this->iMaxRank) $aNewWordsetSearches[] = $aSearch;
-                                                                               }
-                                                                       }
-                                                                       elseif ($sPhraseType == 'postalcode')
-                                                                       {
-                                                                               // We need to try the case where the postal code is the primary element (i.e. no way to tell if it is (postalcode, city) OR (city, postalcode) so try both
-                                                                               if (isset($aSearchTerm['word_id']) && $aSearchTerm['word_id'])
-                                                                               {
-                                                                                       // If we already have a name try putting the postcode first
-                                                                                       if (sizeof($aSearch['aName']))
-                                                                                       {
-                                                                                               $aNewSearch = $aSearch;
-                                                                                               $aNewSearch['aAddress'] = array_merge($aNewSearch['aAddress'], $aNewSearch['aName']);
-                                                                                               $aNewSearch['aName'] = array();
-                                                                                               $aNewSearch['aName'][$aSearchTerm['word_id']] = $aSearchTerm['word_id'];
-                                                                                               if ($aSearch['iSearchRank'] < $this->iMaxRank) $aNewWordsetSearches[] = $aNewSearch;
-                                                                                       }
-
-                                                                                       if (sizeof($aSearch['aName']))
-                                                                                       {
-                                                                                               if ((!$bStructuredPhrases || $iPhrase > 0) && $sPhraseType != 'country' && (!isset($aValidTokens[$sToken]) || strpos($sToken, ' ') !== false))
-                                                                                               {
-                                                                                                       $aSearch['aAddress'][$aSearchTerm['word_id']] = $aSearchTerm['word_id'];
-                                                                                               }
-                                                                                               else
-                                                                                               {
-                                                                                                       $aCurrentSearch['aFullNameAddress'][$aSearchTerm['word_id']] = $aSearchTerm['word_id'];
-                                                                                                       $aSearch['iSearchRank'] += 1000; // skip;
-                                                                                               }
-                                                                                       }
-                                                                                       else
-                                                                                       {
-                                                                                               $aSearch['aName'][$aSearchTerm['word_id']] = $aSearchTerm['word_id'];
-                                                                                               //$aSearch['iNamePhrase'] = $iPhrase;
-                                                                                       }
-                                                                                       if ($aSearch['iSearchRank'] < $this->iMaxRank) $aNewWordsetSearches[] = $aSearch;
-                                                                               }
-
-                                                                       }
-                                                                       elseif (($sPhraseType == '' || $sPhraseType == 'street') && $aSearchTerm['class'] == 'place' && $aSearchTerm['type'] == 'house')
-                                                                       {
-                                                                               if ($aSearch['sHouseNumber'] === '')
-                                                                               {
-                                                                                       $aSearch['sHouseNumber'] = $sToken;
-                                                                                       // sanity check: if the housenumber is not mainly made
-                                                                                       // up of numbers, add a penalty
-                                                                                       if (preg_match_all("/[^0-9]/", $sToken, $aMatches) > 2) $aSearch['iSearchRank']++;
-                                                                                       // also housenumbers should appear in the first or second phrase
-                                                                                       if ($iPhrase > 1) $aSearch['iSearchRank'] += 1;
-                                                                                       if ($aSearch['iSearchRank'] < $this->iMaxRank) $aNewWordsetSearches[] = $aSearch;
-                                                                                       /*
-                                                                                       // Fall back to not searching for this item (better than nothing)
-                                                                                       $aSearch = $aCurrentSearch;
-                                                                                       $aSearch['iSearchRank'] += 1;
-                                                                                       if ($aSearch['iSearchRank'] < $this->iMaxRank) $aNewWordsetSearches[] = $aSearch;
-                                                                                        */
-                                                                               }
-                                                                       }
-                                                                       elseif ($sPhraseType == '' && $aSearchTerm['class'] !== '' && $aSearchTerm['class'] !== null)
-                                                                       {
-                                                                               if ($aSearch['sClass'] === '')
-                                                                               {
-                                                                                       $aSearch['sOperator'] = $aSearchTerm['operator'];
-                                                                                       $aSearch['sClass'] = $aSearchTerm['class'];
-                                                                                       $aSearch['sType'] = $aSearchTerm['type'];
-                                                                                       if (sizeof($aSearch['aName'])) $aSearch['sOperator'] = 'name';
-                                                                                       else $aSearch['sOperator'] = 'near'; // near = in for the moment
-                                                                                       if (strlen($aSearchTerm['operator']) == 0) $aSearch['iSearchRank'] += 1;
-
-                                                                                       if ($aSearch['iSearchRank'] < $this->iMaxRank) $aNewWordsetSearches[] = $aSearch;
-                                                                               }
-                                                                       }
-                                                                       elseif (isset($aSearchTerm['word_id']) && $aSearchTerm['word_id'])
-                                                                       {
-                                                                               if (sizeof($aSearch['aName']))
-                                                                               {
-                                                                                       if ((!$bStructuredPhrases || $iPhrase > 0) && $sPhraseType != 'country' && (!isset($aValidTokens[$sToken]) || strpos($sToken, ' ') !== false))
-                                                                                       {
-                                                                                               $aSearch['aAddress'][$aSearchTerm['word_id']] = $aSearchTerm['word_id'];
-                                                                                       }
-                                                                                       else
-                                                                                       {
-                                                                                               $aCurrentSearch['aFullNameAddress'][$aSearchTerm['word_id']] = $aSearchTerm['word_id'];
-                                                                                               $aSearch['iSearchRank'] += 1000; // skip;
-                                                                                       }
-                                                                               }
-                                                                               else
-                                                                               {
-                                                                                       $aSearch['aName'][$aSearchTerm['word_id']] = $aSearchTerm['word_id'];
-                                                                                       //$aSearch['iNamePhrase'] = $iPhrase;
-                                                                               }
-                                                                               if ($aSearch['iSearchRank'] < $this->iMaxRank) $aNewWordsetSearches[] = $aSearch;
-                                                                       }
-                                                               }
-                                                       }
-                                                       // Look for partial matches.
-                                                       // Note that there is no point in adding country terms here
-                                                       // because country are omitted in the address.
-                                                       if (isset($aValidTokens[$sToken]) && $sPhraseType != 'country')
-                                                       {
-                                                               // Allow searching for a word - but at extra cost
-                                                               foreach($aValidTokens[$sToken] as $aSearchTerm)
-                                                               {
-                                                                       if (isset($aSearchTerm['word_id']) && $aSearchTerm['word_id'])
-                                                                       {
-                                                                               if ((!$bStructuredPhrases || $iPhrase > 0) && sizeof($aCurrentSearch['aName']) && strpos($sToken, ' ') === false)
-                                                                               {
-                                                                                       $aSearch = $aCurrentSearch;
-                                                                                       $aSearch['iSearchRank'] += 1;
-                                                                                       if ($aWordFrequencyScores[$aSearchTerm['word_id']] < CONST_Max_Word_Frequency)
-                                                                                       {
-                                                                                               $aSearch['aAddress'][$aSearchTerm['word_id']] = $aSearchTerm['word_id'];
-                                                                                               if ($aSearch['iSearchRank'] < $this->iMaxRank) $aNewWordsetSearches[] = $aSearch;
-                                                                                       }
-                                                                                       elseif (isset($aValidTokens[' '.$sToken])) // revert to the token version?
-                                                                                       {
-                                                                                               $aSearch['aAddressNonSearch'][$aSearchTerm['word_id']] = $aSearchTerm['word_id'];
-                                                                                               $aSearch['iSearchRank'] += 1;
-                                                                                               if ($aSearch['iSearchRank'] < $this->iMaxRank) $aNewWordsetSearches[] = $aSearch;
-                                                                                               foreach($aValidTokens[' '.$sToken] as $aSearchTermToken)
-                                                                                               {
-                                                                                                       if (empty($aSearchTermToken['country_code'])
-                                                                                                                       && empty($aSearchTermToken['lat'])
-                                                                                                                       && empty($aSearchTermToken['class']))
-                                                                                                       {
-                                                                                                               $aSearch = $aCurrentSearch;
-                                                                                                               $aSearch['iSearchRank'] += 1;
-                                                                                                               $aSearch['aAddress'][$aSearchTermToken['word_id']] = $aSearchTermToken['word_id'];
-                                                                                                               if ($aSearch['iSearchRank'] < $this->iMaxRank) $aNewWordsetSearches[] = $aSearch;
-                                                                                                       }
-                                                                                               }
-                                                                                       }
-                                                                                       else
-                                                                                       {
-                                                                                               $aSearch['aAddressNonSearch'][$aSearchTerm['word_id']] = $aSearchTerm['word_id'];
-                                                                                               if (preg_match('#^[0-9]+$#', $sToken)) $aSearch['iSearchRank'] += 2;
-                                                                                               if ($aSearch['iSearchRank'] < $this->iMaxRank) $aNewWordsetSearches[] = $aSearch;
-                                                                                       }
-                                                                               }
-
-                                                                               if (!sizeof($aCurrentSearch['aName']) || $aCurrentSearch['iNamePhrase'] == $iPhrase)
-                                                                               {
-                                                                                       $aSearch = $aCurrentSearch;
-                                                                                       $aSearch['iSearchRank'] += 1;
-                                                                                       if (!sizeof($aCurrentSearch['aName'])) $aSearch['iSearchRank'] += 1;
-                                                                                       if (preg_match('#^[0-9]+$#', $sToken)) $aSearch['iSearchRank'] += 2;
-                                                                                       if ($aWordFrequencyScores[$aSearchTerm['word_id']] < CONST_Max_Word_Frequency)
-                                                                                               $aSearch['aName'][$aSearchTerm['word_id']] = $aSearchTerm['word_id'];
-                                                                                       else
-                                                                                               $aSearch['aNameNonSearch'][$aSearchTerm['word_id']] = $aSearchTerm['word_id'];
-                                                                                       $aSearch['iNamePhrase'] = $iPhrase;
-                                                                                       if ($aSearch['iSearchRank'] < $this->iMaxRank) $aNewWordsetSearches[] = $aSearch;
-                                                                               }
-                                                                       }
-                                                               }
-                                                       }
-                                                       else
-                                                       {
-                                                               // Allow skipping a word - but at EXTREAM cost
-                                                               //$aSearch = $aCurrentSearch;
-                                                               //$aSearch['iSearchRank']+=100;
-                                                               //$aNewWordsetSearches[] = $aSearch;
-                                                       }
-                                               }
-                                               // Sort and cut
-                                               usort($aNewWordsetSearches, 'bySearchRank');
-                                               $aWordsetSearches = array_slice($aNewWordsetSearches, 0, 50);
-                                       }
-                                       //var_Dump('<hr>',sizeof($aWordsetSearches)); exit;
-
-                                       $aNewPhraseSearches = array_merge($aNewPhraseSearches, $aNewWordsetSearches);
-                                       usort($aNewPhraseSearches, 'bySearchRank');
-
-                                       $aSearchHash = array();
-                                       foreach($aNewPhraseSearches as $iSearch => $aSearch)
-                                       {
-                                               $sHash = serialize($aSearch);
-                                               if (isset($aSearchHash[$sHash])) unset($aNewPhraseSearches[$iSearch]);
-                                               else $aSearchHash[$sHash] = 1;
-                                       }
-
-                                       $aNewPhraseSearches = array_slice($aNewPhraseSearches, 0, 50);
-                               }
-
-                               // Re-group the searches by their score, junk anything over 20 as just not worth trying
-                               $aGroupedSearches = array();
-                               foreach($aNewPhraseSearches as $aSearch)
-                               {
-                                       if ($aSearch['iSearchRank'] < $this->iMaxRank)
-                                       {
-                                               if (!isset($aGroupedSearches[$aSearch['iSearchRank']])) $aGroupedSearches[$aSearch['iSearchRank']] = array();
-                                               $aGroupedSearches[$aSearch['iSearchRank']][] = $aSearch;
-                                       }
-                               }
-                               ksort($aGroupedSearches);
-
-                               $iSearchCount = 0;
-                               $aSearches = array();
-                               foreach($aGroupedSearches as $iScore => $aNewSearches)
-                               {
-                                       $iSearchCount += sizeof($aNewSearches);
-                                       $aSearches = array_merge($aSearches, $aNewSearches);
-                                       if ($iSearchCount > 50) break;
-                               }
-
-                               //if (CONST_Debug) _debugDumpGroupedSearches($aGroupedSearches, $aValidTokens);
-
-                       }
-                       return $aGroupedSearches;
-
-               }
-
-               /* Perform the actual query lookup.
-
-                       Returns an ordered list of results, each with the following fields:
-                               osm_type: type of corresponding OSM object
-                                                       N - node
-                                                       W - way
-                                                       R - relation
-                                                       P - postcode (internally computed)
-                               osm_id: id of corresponding OSM object
-                               class: general object class (corresponds to tag key of primary OSM tag)
-                               type: subclass of object (corresponds to tag value of primary OSM tag)
-                               admin_level: see http://wiki.openstreetmap.org/wiki/Admin_level
-                               rank_search: rank in search hierarchy
-                                                       (see also http://wiki.openstreetmap.org/wiki/Nominatim/Development_overview#Country_to_street_level)
-                               rank_address: rank in address hierarchy (determines orer in address)
-                               place_id: internal key (may differ between different instances)
-                               country_code: ISO country code
-                               langaddress: localized full address
-                               placename: localized name of object
-                               ref: content of ref tag (if available)
-                               lon: longitude
-                               lat: latitude
-                               importance: importance of place based on Wikipedia link count
-                               addressimportance: cumulated importance of address elements
-                               extra_place: type of place (for admin boundaries, if there is a place tag)
-                               aBoundingBox: bounding Box
-                               label: short description of the object class/type (English only)
-                               name: full name (currently the same as langaddress)
-                               foundorder: secondary ordering for places with same importance
-               */
-               function lookup()
-               {
-                       if (!$this->sQuery && !$this->aStructuredQuery) return false;
-
-                       $sLanguagePrefArraySQL = "ARRAY[".join(',',array_map("getDBQuoted",$this->aLangPrefOrder))."]";
-                       $sCountryCodesSQL = false;
-                       if ($this->aCountryCodes && sizeof($this->aCountryCodes))
-                       {
-                               $sCountryCodesSQL = join(',', array_map('addQuotes', $this->aCountryCodes));
-                       }
-
-                       $sQuery = $this->sQuery;
-
-                       // Conflicts between US state abreviations and various words for 'the' in different languages
-                       if (isset($this->aLangPrefOrder['name:en']))
-                       {
-                               $sQuery = preg_replace('/(^|,)\s*il\s*(,|$)/','\1illinois\2', $sQuery);
-                               $sQuery = preg_replace('/(^|,)\s*al\s*(,|$)/','\1alabama\2', $sQuery);
-                               $sQuery = preg_replace('/(^|,)\s*la\s*(,|$)/','\1louisiana\2', $sQuery);
-                       }
-
-                       // View Box SQL
-                       $sViewboxCentreSQL = false;
-                       $bBoundingBoxSearch = false;
-                       if ($this->aViewBox)
-                       {
-                               $fHeight = $this->aViewBox[0]-$this->aViewBox[2];
-                               $fWidth = $this->aViewBox[1]-$this->aViewBox[3];
-                               $aBigViewBox[0] = $this->aViewBox[0] + $fHeight;
-                               $aBigViewBox[2] = $this->aViewBox[2] - $fHeight;
-                               $aBigViewBox[1] = $this->aViewBox[1] + $fWidth;
-                               $aBigViewBox[3] = $this->aViewBox[3] - $fWidth;
-
-                               $this->sViewboxSmallSQL = "ST_SetSRID(ST_MakeBox2D(ST_Point(".(float)$this->aViewBox[0].",".(float)$this->aViewBox[1]."),ST_Point(".(float)$this->aViewBox[2].",".(float)$this->aViewBox[3].")),4326)";
-                               $this->sViewboxLargeSQL = "ST_SetSRID(ST_MakeBox2D(ST_Point(".(float)$aBigViewBox[0].",".(float)$aBigViewBox[1]."),ST_Point(".(float)$aBigViewBox[2].",".(float)$aBigViewBox[3].")),4326)";
-                               $bBoundingBoxSearch = $this->bBoundedSearch;
-                       }
-
-                       // Route SQL
-                       if ($this->aRoutePoints)
-                       {
-                               $sViewboxCentreSQL = "ST_SetSRID('LINESTRING(";
-                               $bFirst = true;
-                               foreach($this->aRoutePoints as $aPoint)
-                               {
-                                       if (!$bFirst) $sViewboxCentreSQL .= ",";
-                                       $sViewboxCentreSQL .= $aPoint[0].' '.$aPoint[1];
-                                       $bFirst = false;
-                               }
-                               $sViewboxCentreSQL .= ")'::geometry,4326)";
-
-                               $sSQL = "select st_buffer(".$sViewboxCentreSQL.",".(float)($_GET['routewidth']/69).")";
-                               $this->sViewboxSmallSQL = chksql($this->oDB->getOne($sSQL),
-                                                                "Could not get small viewbox.");
-                               $this->sViewboxSmallSQL = "'".$this->sViewboxSmallSQL."'::geometry";
-
-                               $sSQL = "select st_buffer(".$sViewboxCentreSQL.",".(float)($_GET['routewidth']/30).")";
-                               $this->sViewboxLargeSQL = chksql($this->oDB->getOne($sSQL),
-                                                                "Could not get large viewbox.");
-                               $this->sViewboxLargeSQL = "'".$this->sViewboxLargeSQL."'::geometry";
-                               $bBoundingBoxSearch = $this->bBoundedSearch;
-                       }
-
-                       // Do we have anything that looks like a lat/lon pair?
-                       if ( $aLooksLike = looksLikeLatLonPair($sQuery) )
-                       {
-                               $this->setNearPoint(array($aLooksLike['lat'], $aLooksLike['lon']));
-                               $sQuery = $aLooksLike['query'];
-                       }
-
-                       $aSearchResults = array();
-                       if ($sQuery || $this->aStructuredQuery)
-                       {
-                               // Start with a blank search
-                               $aSearches = array(
-                                       array('iSearchRank' => 0,
-                                                               'iNamePhrase' => -1,
-                                                               'sCountryCode' => false,
-                                                               'aName' => array(),
-                                                               'aAddress' => array(),
-                                                               'aFullNameAddress' => array(),
-                                                               'aNameNonSearch' => array(),
-                                                               'aAddressNonSearch' => array(),
-                                                               'sOperator' => '',
-                                                               'aFeatureName' => array(),
-                                                               'sClass' => '',
-                                                               'sType' => '',
-                                                               'sHouseNumber' => '',
-                                                               'fLat' => '',
-                                                               'fLon' => '',
-                                                               'fRadius' => ''
-                                                       )
-                               );
-
-                               // Do we have a radius search?
-                               $sNearPointSQL = false;
-                               if ($this->aNearPoint)
-                               {
-                                       $sNearPointSQL = "ST_SetSRID(ST_Point(".(float)$this->aNearPoint[1].",".(float)$this->aNearPoint[0]."),4326)";
-                                       $aSearches[0]['fLat'] = (float)$this->aNearPoint[0];
-                                       $aSearches[0]['fLon'] = (float)$this->aNearPoint[1];
-                                       $aSearches[0]['fRadius'] = (float)$this->aNearPoint[2];
-                               }
-
-                               // Any 'special' terms in the search?
-                               $bSpecialTerms = false;
-                               preg_match_all('/\\[(.*)=(.*)\\]/', $sQuery, $aSpecialTermsRaw, PREG_SET_ORDER);
-                               $aSpecialTerms = array();
-                               foreach($aSpecialTermsRaw as $aSpecialTerm)
-                               {
-                                       $sQuery = str_replace($aSpecialTerm[0], ' ', $sQuery);
-                                       $aSpecialTerms[strtolower($aSpecialTerm[1])] = $aSpecialTerm[2];
-                               }
-
-                               preg_match_all('/\\[([\\w ]*)\\]/u', $sQuery, $aSpecialTermsRaw, PREG_SET_ORDER);
-                               $aSpecialTerms = array();
-                               if (isset($this->aStructuredQuery['amenity']) && $this->aStructuredQuery['amenity'])
-                               {
-                                       $aSpecialTermsRaw[] = array('['.$this->aStructuredQuery['amenity'].']', $this->aStructuredQuery['amenity']);
-                                       unset($this->aStructuredQuery['amenity']);
-                               }
-                               foreach($aSpecialTermsRaw as $aSpecialTerm)
-                               {
-                                       $sQuery = str_replace($aSpecialTerm[0], ' ', $sQuery);
-                                       $sToken = chksql($this->oDB->getOne("select make_standard_name('".$aSpecialTerm[1]."') as string"));
-                                       $sSQL = 'select * from (select word_id,word_token, word, class, type, country_code, operator';
-                                       $sSQL .= ' from word where word_token in (\' '.$sToken.'\')) as x where (class is not null and class not in (\'place\')) or country_code is not null';
-                                       if (CONST_Debug) var_Dump($sSQL);
-                                       $aSearchWords = chksql($this->oDB->getAll($sSQL));
-                                       $aNewSearches = array();
-                                       foreach($aSearches as $aSearch)
-                                       {
-                                               foreach($aSearchWords as $aSearchTerm)
-                                               {
-                                                       $aNewSearch = $aSearch;
-                                                       if ($aSearchTerm['country_code'])
-                                                       {
-                                                               $aNewSearch['sCountryCode'] = strtolower($aSearchTerm['country_code']);
-                                                               $aNewSearches[] = $aNewSearch;
-                                                               $bSpecialTerms = true;
-                                                       }
-                                                       if ($aSearchTerm['class'])
-                                                       {
-                                                               $aNewSearch['sClass'] = $aSearchTerm['class'];
-                                                               $aNewSearch['sType'] = $aSearchTerm['type'];
-                                                               $aNewSearches[] = $aNewSearch;
-                                                               $bSpecialTerms = true;
-                                                       }
-                                               }
-                                       }
-                                       $aSearches = $aNewSearches;
-                               }
-
-                               // Split query into phrases
-                               // Commas are used to reduce the search space by indicating where phrases split
-                               if ($this->aStructuredQuery)
-                               {
-                                       $aPhrases = $this->aStructuredQuery;
-                                       $bStructuredPhrases = true;
-                               }
-                               else
-                               {
-                                       $aPhrases = explode(',',$sQuery);
-                                       $bStructuredPhrases = false;
-                               }
-
-                               // Convert each phrase to standard form
-                               // Create a list of standard words
-                               // Get all 'sets' of words
-                               // Generate a complete list of all
-                               $aTokens = array();
-                               foreach($aPhrases as $iPhrase => $sPhrase)
-                               {
-                                       $aPhrase = chksql($this->oDB->getRow("select make_standard_name('".pg_escape_string($sPhrase)."') as string"),
-                                                         "Cannot nomralize query string (is it an UTF-8 string?)");
-                                       if (trim($aPhrase['string']))
-                                       {
-                                               $aPhrases[$iPhrase] = $aPhrase;
-                                               $aPhrases[$iPhrase]['words'] = explode(' ',$aPhrases[$iPhrase]['string']);
-                                               $aPhrases[$iPhrase]['wordsets'] = getWordSets($aPhrases[$iPhrase]['words'], 0);
-                                               $aTokens = array_merge($aTokens, getTokensFromSets($aPhrases[$iPhrase]['wordsets']));
-                                       }
-                                       else
-                                       {
-                                               unset($aPhrases[$iPhrase]);
-                                       }
-                               }
-
-                               // Reindex phrases - we make assumptions later on that they are numerically keyed in order
-                               $aPhraseTypes = array_keys($aPhrases);
-                               $aPhrases = array_values($aPhrases);
-
-                               if (sizeof($aTokens))
-                               {
-                                       // Check which tokens we have, get the ID numbers
-                                       $sSQL = 'select word_id,word_token, word, class, type, country_code, operator, search_name_count';
-                                       $sSQL .= ' from word where word_token in ('.join(',',array_map("getDBQuoted",$aTokens)).')';
-
-                                       if (CONST_Debug) var_Dump($sSQL);
-
-                                       $aValidTokens = array();
-                                       if (sizeof($aTokens))
-                                       {
-                                               $aDatabaseWords = chksql($this->oDB->getAll($sSQL),
-                                                                        "Could not get word tokens.");
-                                       }
-                                       else
-                                       {
-                                               $aDatabaseWords = array();
-                                       }
-                                       $aPossibleMainWordIDs = array();
-                                       $aWordFrequencyScores = array();
-                                       foreach($aDatabaseWords as $aToken)
-                                       {
-                                               // Very special case - require 2 letter country param to match the country code found
-                                               if ($bStructuredPhrases && $aToken['country_code'] && !empty($this->aStructuredQuery['country'])
-                                                               && strlen($this->aStructuredQuery['country']) == 2 && strtolower($this->aStructuredQuery['country']) != $aToken['country_code'])
-                                               {
-                                                       continue;
-                                               }
-
-                                               if (isset($aValidTokens[$aToken['word_token']]))
-                                               {
-                                                       $aValidTokens[$aToken['word_token']][] = $aToken;
-                                               }
-                                               else
-                                               {
-                                                       $aValidTokens[$aToken['word_token']] = array($aToken);
-                                               }
-                                               if (!$aToken['class'] && !$aToken['country_code']) $aPossibleMainWordIDs[$aToken['word_id']] = 1;
-                                               $aWordFrequencyScores[$aToken['word_id']] = $aToken['search_name_count'] + 1;
-                                       }
-                                       if (CONST_Debug) var_Dump($aPhrases, $aValidTokens);
-
-                                       // Try and calculate GB postcodes we might be missing
-                                       foreach($aTokens as $sToken)
-                                       {
-                                               // Source of gb postcodes is now definitive - always use
-                                               if (preg_match('/^([A-Z][A-Z]?[0-9][0-9A-Z]? ?[0-9])([A-Z][A-Z])$/', strtoupper(trim($sToken)), $aData))
-                                               {
-                                                       if (substr($aData[1],-2,1) != ' ')
-                                                       {
-                                                               $aData[0] = substr($aData[0],0,strlen($aData[1])-1).' '.substr($aData[0],strlen($aData[1])-1);
-                                                               $aData[1] = substr($aData[1],0,-1).' '.substr($aData[1],-1,1);
-                                                       }
-                                                       $aGBPostcodeLocation = gbPostcodeCalculate($aData[0], $aData[1], $aData[2], $this->oDB);
-                                                       if ($aGBPostcodeLocation)
-                                                       {
-                                                               $aValidTokens[$sToken] = $aGBPostcodeLocation;
-                                                       }
-                                               }
-                                               // US ZIP+4 codes - if there is no token,
-                                               //      merge in the 5-digit ZIP code
-                                               else if (!isset($aValidTokens[$sToken]) && preg_match('/^([0-9]{5}) [0-9]{4}$/', $sToken, $aData))
-                                               {
-                                                       if (isset($aValidTokens[$aData[1]]))
-                                                       {
-                                                               foreach($aValidTokens[$aData[1]] as $aToken)
-                                                               {
-                                                                       if (!$aToken['class'])
-                                                                       {
-                                                                               if (isset($aValidTokens[$sToken]))
-                                                                               {
-                                                                                       $aValidTokens[$sToken][] = $aToken;
-                                                                               }
-                                                                               else
-                                                                               {
-                                                                                       $aValidTokens[$sToken] = array($aToken);
-                                                                               }
-                                                                       }
-                                                               }
-                                                       }
-                                               }
-                                       }
-
-                                       foreach($aTokens as $sToken)
-                                       {
-                                               // Unknown single word token with a number - assume it is a house number
-                                               if (!isset($aValidTokens[' '.$sToken]) && strpos($sToken,' ') === false && preg_match('/[0-9]/', $sToken))
-                                               {
-                                                       $aValidTokens[' '.$sToken] = array(array('class'=>'place','type'=>'house'));
-                                               }
-                                       }
-
-                                       // Any words that have failed completely?
-                                       // TODO: suggestions
-
-                                       // Start the search process
-                                       // array with: placeid => -1 | tiger-housenumber
-                                       $aResultPlaceIDs = array();
-
-                                       $aGroupedSearches = $this->getGroupedSearches($aSearches, $aPhraseTypes, $aPhrases, $aValidTokens, $aWordFrequencyScores, $bStructuredPhrases);
-
-                                       if ($this->bReverseInPlan)
-                                       {
-                                               // Reverse phrase array and also reverse the order of the wordsets in
-                                               // the first and final phrase. Don't bother about phrases in the middle
-                                               // because order in the address doesn't matter.
-                                               $aPhrases = array_reverse($aPhrases);
-                                               $aPhrases[0]['wordsets'] = getInverseWordSets($aPhrases[0]['words'], 0);
-                                               if (sizeof($aPhrases) > 1)
-                                               {
-                                                       $aFinalPhrase = end($aPhrases);
-                                                       $aPhrases[sizeof($aPhrases)-1]['wordsets'] = getInverseWordSets($aFinalPhrase['words'], 0);
-                                               }
-                                               $aReverseGroupedSearches = $this->getGroupedSearches($aSearches, null, $aPhrases, $aValidTokens, $aWordFrequencyScores, false);
-
-                                               foreach($aGroupedSearches as $aSearches)
-                                               {
-                                                       foreach($aSearches as $aSearch)
-                                                       {
-                                                               if ($aSearch['iSearchRank'] < $this->iMaxRank)
-                                                               {
-                                                                       if (!isset($aReverseGroupedSearches[$aSearch['iSearchRank']])) $aReverseGroupedSearches[$aSearch['iSearchRank']] = array();
-                                                                       $aReverseGroupedSearches[$aSearch['iSearchRank']][] = $aSearch;
-                                                               }
-
-                                                       }
-                                               }
-
-                                               $aGroupedSearches = $aReverseGroupedSearches;
-                                               ksort($aGroupedSearches);
-                                       }
-                               }
-                               else
-                               {
-                                       // Re-group the searches by their score, junk anything over 20 as just not worth trying
-                                       $aGroupedSearches = array();
-                                       foreach($aSearches as $aSearch)
-                                       {
-                                               if ($aSearch['iSearchRank'] < $this->iMaxRank)
-                                               {
-                                                       if (!isset($aGroupedSearches[$aSearch['iSearchRank']])) $aGroupedSearches[$aSearch['iSearchRank']] = array();
-                                                       $aGroupedSearches[$aSearch['iSearchRank']][] = $aSearch;
-                                               }
-                                       }
-                                       ksort($aGroupedSearches);
-                               }
-
-                               if (CONST_Debug) var_Dump($aGroupedSearches);
-
-                               if (CONST_Search_TryDroppedAddressTerms && sizeof($this->aStructuredQuery) > 0)
-                               {
-                                       $aCopyGroupedSearches = $aGroupedSearches;
-                                       foreach($aCopyGroupedSearches as $iGroup => $aSearches)
-                                       {
-                                               foreach($aSearches as $iSearch => $aSearch)
-                                               {
-                                                       $aReductionsList = array($aSearch['aAddress']);
-                                                       $iSearchRank = $aSearch['iSearchRank'];
-                                                       while(sizeof($aReductionsList) > 0)
-                                                       {
-                                                               $iSearchRank += 5;
-                                                               if ($iSearchRank > iMaxRank) break 3;
-                                                               $aNewReductionsList = array();
-                                                               foreach($aReductionsList as $aReductionsWordList)
-                                                               {
-                                                                       for ($iReductionWord = 0; $iReductionWord < sizeof($aReductionsWordList); $iReductionWord++)
-                                                                       {
-                                                                               $aReductionsWordListResult = array_merge(array_slice($aReductionsWordList, 0, $iReductionWord), array_slice($aReductionsWordList, $iReductionWord+1));
-                                                                               $aReverseSearch = $aSearch;
-                                                                               $aSearch['aAddress'] = $aReductionsWordListResult;
-                                                                               $aSearch['iSearchRank'] = $iSearchRank;
-                                                                               $aGroupedSearches[$iSearchRank][] = $aReverseSearch;
-                                                                               if (sizeof($aReductionsWordListResult) > 0)
-                                                                               {
-                                                                                       $aNewReductionsList[] = $aReductionsWordListResult;
-                                                                               }
-                                                                       }
-                                                               }
-                                                               $aReductionsList = $aNewReductionsList;
-                                                       }
-                                               }
-                                       }
-                                       ksort($aGroupedSearches);
-                               }
-
-                               // Filter out duplicate searches
-                               $aSearchHash = array();
-                               foreach($aGroupedSearches as $iGroup => $aSearches)
-                               {
-                                       foreach($aSearches as $iSearch => $aSearch)
-                                       {
-                                               $sHash = serialize($aSearch);
-                                               if (isset($aSearchHash[$sHash]))
-                                               {
-                                                       unset($aGroupedSearches[$iGroup][$iSearch]);
-                                                       if (sizeof($aGroupedSearches[$iGroup]) == 0) unset($aGroupedSearches[$iGroup]);
-                                               }
-                                               else
-                                               {
-                                                       $aSearchHash[$sHash] = 1;
-                                               }
-                                       }
-                               }
-
-                               if (CONST_Debug) _debugDumpGroupedSearches($aGroupedSearches, $aValidTokens);
-
-                               $iGroupLoop = 0;
-                               $iQueryLoop = 0;
-                               foreach($aGroupedSearches as $iGroupedRank => $aSearches)
-                               {
-                                       $iGroupLoop++;
-                                       foreach($aSearches as $aSearch)
-                                       {
-                                               $iQueryLoop++;
-                                               $searchedHousenumber = -1;
-
-                                               if (CONST_Debug) { echo "<hr><b>Search Loop, group $iGroupLoop, loop $iQueryLoop</b>"; }
-                                               if (CONST_Debug) _debugDumpGroupedSearches(array($iGroupedRank => array($aSearch)), $aValidTokens);
-
-                                               // No location term?
-                                               if (!sizeof($aSearch['aName']) && !sizeof($aSearch['aAddress']) && !$aSearch['fLon'])
-                                               {
-                                                       if ($aSearch['sCountryCode'] && !$aSearch['sClass'] && !$aSearch['sHouseNumber'])
-                                                       {
-                                                               // Just looking for a country by code - look it up
-                                                               if (4 >= $this->iMinAddressRank && 4 <= $this->iMaxAddressRank)
-                                                               {
-                                                                       $sSQL = "select place_id from placex where calculated_country_code='".$aSearch['sCountryCode']."' and rank_search = 4";
-                                                                       if ($sCountryCodesSQL) $sSQL .= " and calculated_country_code in ($sCountryCodesSQL)";
-                                                                       if ($bBoundingBoxSearch)
-                                                                               $sSQL .= " and _st_intersects($this->sViewboxSmallSQL, geometry)";
-                                                                       $sSQL .= " order by st_area(geometry) desc limit 1";
-                                                                       if (CONST_Debug) var_dump($sSQL);
-                                                                       $aPlaceIDs = chksql($this->oDB->getCol($sSQL));
-                                                               }
-                                                               else
-                                                               {
-                                                                       $aPlaceIDs = array();
-                                                               }
-                                                       }
-                                                       else
-                                                       {
-                                                               if (!$bBoundingBoxSearch && !$aSearch['fLon']) continue;
-                                                               if (!$aSearch['sClass']) continue;
-                                                               $sSQL = "select count(*) from pg_tables where tablename = 'place_classtype_".$aSearch['sClass']."_".$aSearch['sType']."'";
-                                                               if (chksql($this->oDB->getOne($sSQL)))
-                                                               {
-                                                                       $sSQL = "select place_id from place_classtype_".$aSearch['sClass']."_".$aSearch['sType']." ct";
-                                                                       if ($sCountryCodesSQL) $sSQL .= " join placex using (place_id)";
-                                                                       $sSQL .= " where st_contains($this->sViewboxSmallSQL, ct.centroid)";
-                                                                       if ($sCountryCodesSQL) $sSQL .= " and calculated_country_code in ($sCountryCodesSQL)";
-                                                                       if (sizeof($this->aExcludePlaceIDs))
-                                                                       {
-                                                                               $sSQL .= " and place_id not in (".join(',',$this->aExcludePlaceIDs).")";
-                                                                       }
-                                                                       if ($sViewboxCentreSQL) $sSQL .= " order by st_distance($sViewboxCentreSQL, ct.centroid) asc";
-                                                                       $sSQL .= " limit $this->iLimit";
-                                                                       if (CONST_Debug) var_dump($sSQL);
-                                                                       $aPlaceIDs = chksql($this->oDB->getCol($sSQL));
-
-                                                                       // If excluded place IDs are given, it is fair to assume that
-                                                                       // there have been results in the small box, so no further
-                                                                       // expansion in that case.
-                                                                       // Also don't expand if bounded results were requested.
-                                                                       if (!sizeof($aPlaceIDs) && !sizeof($this->aExcludePlaceIDs) && !$this->bBoundedSearch)
-                                                                       {
-                                                                               $sSQL = "select place_id from place_classtype_".$aSearch['sClass']."_".$aSearch['sType']." ct";
-                                                                               if ($sCountryCodesSQL) $sSQL .= " join placex using (place_id)";
-                                                                               $sSQL .= " where st_contains($this->sViewboxLargeSQL, ct.centroid)";
-                                                                               if ($sCountryCodesSQL) $sSQL .= " and calculated_country_code in ($sCountryCodesSQL)";
-                                                                               if ($sViewboxCentreSQL) $sSQL .= " order by st_distance($sViewboxCentreSQL, ct.centroid) asc";
-                                                                               $sSQL .= " limit $this->iLimit";
-                                                                               if (CONST_Debug) var_dump($sSQL);
-                                                                               $aPlaceIDs = chksql($this->oDB->getCol($sSQL));
-                                                                       }
-                                                               }
-                                                               else
-                                                               {
-                                                                       $sSQL = "select place_id from placex where class='".$aSearch['sClass']."' and type='".$aSearch['sType']."'";
-                                                                       $sSQL .= " and st_contains($this->sViewboxSmallSQL, geometry) and linked_place_id is null";
-                                                                       if ($sCountryCodesSQL) $sSQL .= " and calculated_country_code in ($sCountryCodesSQL)";
-                                                                       if ($sViewboxCentreSQL) $sSQL .= " order by st_distance($sViewboxCentreSQL, centroid) asc";
-                                                                       $sSQL .= " limit $this->iLimit";
-                                                                       if (CONST_Debug) var_dump($sSQL);
-                                                                       $aPlaceIDs = chksql($this->oDB->getCol($sSQL));
-                                                               }
-                                                       }
-                                               }
-                                               // If a coordinate is given, the search must either
-                                               // be for a name or a special search. Ignore everythin else.
-                                               else if ($aSearch['fLon'] && !sizeof($aSearch['aName']) && !sizeof($aSearch['aAddress']) && !$aSearch['sClass'])
-                                               {
-                                                       $aPlaceIDs = array();
-                                               }
-                                               else
-                                               {
-                                                       $aPlaceIDs = array();
-
-                                                       // First we need a position, either aName or fLat or both
-                                                       $aTerms = array();
-                                                       $aOrder = array();
-
-                                                       if ($aSearch['sHouseNumber'] && sizeof($aSearch['aAddress']))
-                                                       {
-                                                               $sHouseNumberRegex = '\\\\m'.$aSearch['sHouseNumber'].'\\\\M';
-                                $aOrder[] = "";
-                                                               $aOrder[0] = " (exists(select place_id from placex where parent_place_id = search_name.place_id";
-                                $aOrder[0] .= " and transliteration(housenumber) ~* E'".$sHouseNumberRegex."' limit 1) ";
-                                                               // also housenumbers from interpolation lines table are needed
-                                                               $aOrder[0] .= " or exists(select place_id from location_property_osmline where parent_place_id = search_name.place_id";
-                                $aOrder[0] .= " and ".intval($aSearch['sHouseNumber']).">=startnumber and ".intval($aSearch['sHouseNumber'])."<=endnumber limit 1))";
-                                                               $aOrder[0] .= " desc";
-                                                       }
-
-                                                       // TODO: filter out the pointless search terms (2 letter name tokens and less)
-                                                       // they might be right - but they are just too darned expensive to run
-                                                       if (sizeof($aSearch['aName'])) $aTerms[] = "name_vector @> ARRAY[".join($aSearch['aName'],",")."]";
-                                                       //if (sizeof($aSearch['aNameNonSearch'])) $aTerms[] = "array_cat(name_vector,ARRAY[]::integer[]) @> ARRAY[".join($aSearch['aNameNonSearch'],",")."]";
-                                                       if (sizeof($aSearch['aAddress']) && $aSearch['aName'] != $aSearch['aAddress'])
-                                                       {
-                                                               // For infrequent name terms disable index usage for address
-                                                               if (CONST_Search_NameOnlySearchFrequencyThreshold &&
-                                                                               sizeof($aSearch['aName']) == 1 &&
-                                                                               $aWordFrequencyScores[$aSearch['aName'][reset($aSearch['aName'])]] < CONST_Search_NameOnlySearchFrequencyThreshold)
-                                                               {
-                                                                       //$aTerms[] = "array_cat(nameaddress_vector,ARRAY[]::integer[]) @> ARRAY[".join(array_merge($aSearch['aAddress'],$aSearch['aAddressNonSearch']),",")."]";
-                                                                       $aTerms[] = "array_cat(nameaddress_vector,ARRAY[]::integer[]) @> ARRAY[".join($aSearch['aAddress'],",")."]";
-                                                               }
-                                                               else
-                                                               {
-                                                                       $aTerms[] = "nameaddress_vector @> ARRAY[".join($aSearch['aAddress'],",")."]";
-                                                                       //if (sizeof($aSearch['aAddressNonSearch'])) $aTerms[] = "array_cat(nameaddress_vector,ARRAY[]::integer[]) @> ARRAY[".join($aSearch['aAddressNonSearch'],",")."]";
-                                                               }
-                                                       }
-                                                       if ($aSearch['sCountryCode']) $aTerms[] = "country_code = '".pg_escape_string($aSearch['sCountryCode'])."'";
-                                                       if ($aSearch['sHouseNumber'])
-                                                       {
-                                                               $aTerms[] = "address_rank between 16 and 27";
-                                                       }
-                                                       else
-                                                       {
-                                                               if ($this->iMinAddressRank > 0)
-                                                               {
-                                                                       $aTerms[] = "address_rank >= ".$this->iMinAddressRank;
-                                                               }
-                                                               if ($this->iMaxAddressRank < 30)
-                                                               {
-                                                                       $aTerms[] = "address_rank <= ".$this->iMaxAddressRank;
-                                                               }
-                                                       }
-                                                       if ($aSearch['fLon'] && $aSearch['fLat'])
-                                                       {
-                                                               $aTerms[] = "ST_DWithin(centroid, ST_SetSRID(ST_Point(".$aSearch['fLon'].",".$aSearch['fLat']."),4326), ".$aSearch['fRadius'].")";
-                                                               $aOrder[] = "ST_Distance(centroid, ST_SetSRID(ST_Point(".$aSearch['fLon'].",".$aSearch['fLat']."),4326)) ASC";
-                                                       }
-                                                       if (sizeof($this->aExcludePlaceIDs))
-                                                       {
-                                                               $aTerms[] = "place_id not in (".join(',',$this->aExcludePlaceIDs).")";
-                                                       }
-                                                       if ($sCountryCodesSQL)
-                                                       {
-                                                               $aTerms[] = "country_code in ($sCountryCodesSQL)";
-                                                       }
-
-                                                       if ($bBoundingBoxSearch) $aTerms[] = "centroid && $this->sViewboxSmallSQL";
-                                                       if ($sNearPointSQL) $aOrder[] = "ST_Distance($sNearPointSQL, centroid) asc";
-
-                                                       if ($aSearch['sHouseNumber'])
-                                                       {
-                                                               $sImportanceSQL = '- abs(26 - address_rank) + 3';
-                                                       }
-                                                       else
-                                                       {
-                                                               $sImportanceSQL = '(case when importance = 0 OR importance IS NULL then 0.75-(search_rank::float/40) else importance end)';
-                                                       }
-                                                       if ($this->sViewboxSmallSQL) $sImportanceSQL .= " * case when ST_Contains($this->sViewboxSmallSQL, centroid) THEN 1 ELSE 0.5 END";
-                                                       if ($this->sViewboxLargeSQL) $sImportanceSQL .= " * case when ST_Contains($this->sViewboxLargeSQL, centroid) THEN 1 ELSE 0.5 END";
-
-                                                       $aOrder[] = "$sImportanceSQL DESC";
-                                                       if (sizeof($aSearch['aFullNameAddress']))
-                                                       {
-                                                               $sExactMatchSQL = '(select count(*) from (select unnest(ARRAY['.join($aSearch['aFullNameAddress'],",").']) INTERSECT select unnest(nameaddress_vector))s) as exactmatch';
-                                                               $aOrder[] = 'exactmatch DESC';
-                                                       } else {
-                                                               $sExactMatchSQL = '0::int as exactmatch';
-                                                       }
-
-                                                       if (sizeof($aTerms))
-                                                       {
-                                                               $sSQL = "select place_id, ";
-                                                               $sSQL .= $sExactMatchSQL;
-                                                               $sSQL .= " from search_name";
-                                                               $sSQL .= " where ".join(' and ',$aTerms);
-                                                               $sSQL .= " order by ".join(', ',$aOrder);
-                                                               if ($aSearch['sHouseNumber'] || $aSearch['sClass'])
-                                                                       $sSQL .= " limit 20";
-                                                               elseif (!sizeof($aSearch['aName']) && !sizeof($aSearch['aAddress']) && $aSearch['sClass'])
-                                                                       $sSQL .= " limit 1";
-                                                               else
-                                                                       $sSQL .= " limit ".$this->iLimit;
-
-                                                               if (CONST_Debug) { var_dump($sSQL); }
-                                                               $aViewBoxPlaceIDs = chksql($this->oDB->getAll($sSQL),
-                                                                                          "Could not get places for search terms.");
-                                                               //var_dump($aViewBoxPlaceIDs);
-                                                               // Did we have an viewbox matches?
-                                                               $aPlaceIDs = array();
-                                                               $bViewBoxMatch = false;
-                                                               foreach($aViewBoxPlaceIDs as $aViewBoxRow)
-                                                               {
-                                                                       //if ($bViewBoxMatch == 1 && $aViewBoxRow['in_small'] == 'f') break;
-                                                                       //if ($bViewBoxMatch == 2 && $aViewBoxRow['in_large'] == 'f') break;
-                                                                       //if ($aViewBoxRow['in_small'] == 't') $bViewBoxMatch = 1;
-                                                                       //else if ($aViewBoxRow['in_large'] == 't') $bViewBoxMatch = 2;
-                                                                       $aPlaceIDs[] = $aViewBoxRow['place_id'];
-                                                                       $this->exactMatchCache[$aViewBoxRow['place_id']] = $aViewBoxRow['exactmatch'];
-                                                               }
-                                                       }
-                                                       //var_Dump($aPlaceIDs);
-                                                       //exit;
-
-                                                       //now search for housenumber, if housenumber provided
-                                                       if ($aSearch['sHouseNumber'] && sizeof($aPlaceIDs))
-                                                       {
-                                                               $searchedHousenumber = intval($aSearch['sHouseNumber']);
-                                                               $aRoadPlaceIDs = $aPlaceIDs;
-                                                               $sPlaceIDs = join(',',$aPlaceIDs);
-
-                                                               // Now they are indexed, look for a house attached to a street we found
-                                                               $sHouseNumberRegex = '\\\\m'.$aSearch['sHouseNumber'].'\\\\M';
-                                                               $sSQL = "select place_id from placex where parent_place_id in (".$sPlaceIDs.") and transliteration(housenumber) ~* E'".$sHouseNumberRegex."'";
-                                                               if (sizeof($this->aExcludePlaceIDs))
-                                                               {
-                                                                       $sSQL .= " and place_id not in (".join(',',$this->aExcludePlaceIDs).")";
-                                                               }
-                                                               $sSQL .= " limit $this->iLimit";
-                                                               if (CONST_Debug) var_dump($sSQL);
-                                                               $aPlaceIDs = chksql($this->oDB->getCol($sSQL));
-                                                               
-                                                               // if nothing found, search in the interpolation line table
-                                                               if(!sizeof($aPlaceIDs))
-                                                               {
-                                                                       // do we need to use transliteration and the regex for housenumbers???
-                                                                       //new query for lines, not housenumbers anymore
-                                                                       if($searchedHousenumber%2 == 0){
-                                                                               //if housenumber is even, look for housenumber in streets with interpolationtype even or all
-                                                                               $sSQL = "select distinct place_id from location_property_osmline where parent_place_id in (".$sPlaceIDs.") and (interpolationtype='even' or interpolationtype='all') and ".$searchedHousenumber.">=startnumber and ".$searchedHousenumber."<=endnumber";
-                                                                       }else{
-                                                                               //look for housenumber in streets with interpolationtype odd or all
-                                                                               $sSQL = "select distinct place_id from location_property_osmline where parent_place_id in (".$sPlaceIDs.") and (interpolationtype='odd' or interpolationtype='all') and ".$searchedHousenumber.">=startnumber and ".$searchedHousenumber."<=endnumber";
-                                                                       }
-
-                                                                       if (sizeof($this->aExcludePlaceIDs))
-                                                                       {
-                                                                               $sSQL .= " and place_id not in (".join(',', $this->aExcludePlaceIDs).")";
-                                                                       }
-                                                                       //$sSQL .= " limit $this->iLimit";
-                                                                       if (CONST_Debug) var_dump($sSQL);
-                                                                       //get place IDs
-                                                                       $aPlaceIDs = chksql($this->oDB->getCol($sSQL, 0));
-                                                               }
-                                                                       
-                                                               // If nothing found try the aux fallback table
-                                                               if (CONST_Use_Aux_Location_data && !sizeof($aPlaceIDs))
-                                                               {
-                                                                       $sSQL = "select place_id from location_property_aux where parent_place_id in (".$sPlaceIDs.") and housenumber = '".pg_escape_string($aSearch['sHouseNumber'])."'";
-                                                                       if (sizeof($this->aExcludePlaceIDs))
-                                                                       {
-                                                                               $sSQL .= " and parent_place_id not in (".join(',',$this->aExcludePlaceIDs).")";
-                                                                       }
-                                                                       //$sSQL .= " limit $this->iLimit";
-                                                                       if (CONST_Debug) var_dump($sSQL);
-                                                                       $aPlaceIDs = chksql($this->oDB->getCol($sSQL));
-                                                               }
-
-                                                               //if nothing was found in placex or location_property_aux, then search in Tiger data for this housenumber(location_property_tiger)
-                                                               if (CONST_Use_US_Tiger_Data && !sizeof($aPlaceIDs))
-                                                               {
-                                                                       //new query for lines, not housenumbers anymore
-                                                                       if($searchedHousenumber%2 == 0){
-                                                                               //if housenumber is even, look for housenumber in streets with interpolationtype even or all
-                                                                               $sSQL = "select distinct place_id from location_property_tiger where parent_place_id in (".$sPlaceIDs.") and (interpolationtype='even' or interpolationtype='all') and ".$searchedHousenumber.">=startnumber and ".$searchedHousenumber."<=endnumber";
-                                                                       }else{
-                                                                               //look for housenumber in streets with interpolationtype odd or all
-                                                                               $sSQL = "select distinct place_id from location_property_tiger where parent_place_id in (".$sPlaceIDs.") and (interpolationtype='odd' or interpolationtype='all') and ".$searchedHousenumber.">=startnumber and ".$searchedHousenumber."<=endnumber";
-                                                                       }
-
-                                                                       if (sizeof($this->aExcludePlaceIDs))
-                                                                       {
-                                                                               $sSQL .= " and place_id not in (".join(',', $this->aExcludePlaceIDs).")";
-                                                                       }
-                                                                       //$sSQL .= " limit $this->iLimit";
-                                                                       if (CONST_Debug) var_dump($sSQL);
-                                                                       //get place IDs
-                                                                       $aPlaceIDs = chksql($this->oDB->getCol($sSQL, 0));
-                                                               }
-
-                                                               // Fallback to the road (if no housenumber was found)
-                                                               if (!sizeof($aPlaceIDs) && preg_match('/[0-9]+/', $aSearch['sHouseNumber']))
-                                                               {
-                                                                       $aPlaceIDs = $aRoadPlaceIDs;
-                                                                       //set to -1, if no housenumbers were found
-                                                                       $searchedHousenumber = -1;
-                                                               }
-                                                               //else: housenumber was found, remains saved in searchedHousenumber
-                                                       }
-
-
-                                                       if ($aSearch['sClass'] && sizeof($aPlaceIDs))
-                                                       {
-                                                               $sPlaceIDs = join(',', $aPlaceIDs);
-                                                               $aClassPlaceIDs = array();
-
-                                                               if (!$aSearch['sOperator'] || $aSearch['sOperator'] == 'name')
-                                                               {
-                                                                       // If they were searching for a named class (i.e. 'Kings Head pub') then we might have an extra match
-                                                                       $sSQL = "select place_id from placex where place_id in ($sPlaceIDs) and class='".$aSearch['sClass']."' and type='".$aSearch['sType']."'";
-                                                                       $sSQL .= " and linked_place_id is null";
-                                                                       if ($sCountryCodesSQL) $sSQL .= " and calculated_country_code in ($sCountryCodesSQL)";
-                                                                       $sSQL .= " order by rank_search asc limit $this->iLimit";
-                                                                       if (CONST_Debug) var_dump($sSQL);
-                                                                       $aClassPlaceIDs = chksql($this->oDB->getCol($sSQL));
-                                                               }
-
-                                                               if (!$aSearch['sOperator'] || $aSearch['sOperator'] == 'near') // & in
-                                                               {
-                                                                       $sSQL = "select count(*) from pg_tables where tablename = 'place_classtype_".$aSearch['sClass']."_".$aSearch['sType']."'";
-                                                                       $bCacheTable = chksql($this->oDB->getOne($sSQL));
-
-                                                                       $sSQL = "select min(rank_search) from placex where place_id in ($sPlaceIDs)";
-
-                                                                       if (CONST_Debug) var_dump($sSQL);
-                                                                       $this->iMaxRank = ((int)chksql($this->oDB->getOne($sSQL)));
-
-                                                                       // For state / country level searches the normal radius search doesn't work very well
-                                                                       $sPlaceGeom = false;
-                                                                       if ($this->iMaxRank < 9 && $bCacheTable)
-                                                                       {
-                                                                               // Try and get a polygon to search in instead
-                                                                               $sSQL = "select geometry from placex where place_id in ($sPlaceIDs) and rank_search < $this->iMaxRank + 5 and st_geometrytype(geometry) in ('ST_Polygon','ST_MultiPolygon') order by rank_search asc limit 1";
-                                                                               if (CONST_Debug) var_dump($sSQL);
-                                                                               $sPlaceGeom = chksql($this->oDB->getOne($sSQL));
-                                                                       }
-
-                                                                       if ($sPlaceGeom)
-                                                                       {
-                                                                               $sPlaceIDs = false;
-                                                                       }
-                                                                       else
-                                                                       {
-                                                                               $this->iMaxRank += 5;
-                                                                               $sSQL = "select place_id from placex where place_id in ($sPlaceIDs) and rank_search < $this->iMaxRank";
-                                                                               if (CONST_Debug) var_dump($sSQL);
-                                                                               $aPlaceIDs = chksql($this->oDB->getCol($sSQL));
-                                                                               $sPlaceIDs = join(',',$aPlaceIDs);
-                                                                       }
-
-                                                                       if ($sPlaceIDs || $sPlaceGeom)
-                                                                       {
-
-                                                                               $fRange = 0.01;
-                                                                               if ($bCacheTable)
-                                                                               {
-                                                                                       // More efficient - can make the range bigger
-                                                                                       $fRange = 0.05;
-
-                                                                                       $sOrderBySQL = '';
-                                                                                       if ($sNearPointSQL) $sOrderBySQL = "ST_Distance($sNearPointSQL, l.centroid)";
-                                                                                       else if ($sPlaceIDs) $sOrderBySQL = "ST_Distance(l.centroid, f.geometry)";
-                                                                                       else if ($sPlaceGeom) $sOrderBysSQL = "ST_Distance(st_centroid('".$sPlaceGeom."'), l.centroid)";
-
-                                                                                       $sSQL = "select distinct l.place_id".($sOrderBySQL?','.$sOrderBySQL:'')." from place_classtype_".$aSearch['sClass']."_".$aSearch['sType']." as l";
-                                                                                       if ($sCountryCodesSQL) $sSQL .= " join placex as lp using (place_id)";
-                                                                                       if ($sPlaceIDs)
-                                                                                       {
-                                                                                               $sSQL .= ",placex as f where ";
-                                                                                               $sSQL .= "f.place_id in ($sPlaceIDs) and ST_DWithin(l.centroid, f.centroid, $fRange) ";
-                                                                                       }
-                                                                                       if ($sPlaceGeom)
-                                                                                       {
-                                                                                               $sSQL .= " where ";
-                                                                                               $sSQL .= "ST_Contains('".$sPlaceGeom."', l.centroid) ";
-                                                                                       }
-                                                                                       if (sizeof($this->aExcludePlaceIDs))
-                                                                                       {
-                                                                                               $sSQL .= " and l.place_id not in (".join(',',$this->aExcludePlaceIDs).")";
-                                                                                       }
-                                                                                       if ($sCountryCodesSQL) $sSQL .= " and lp.calculated_country_code in ($sCountryCodesSQL)";
-                                                                                       if ($sOrderBySQL) $sSQL .= "order by ".$sOrderBySQL." asc";
-                                                                                       if ($this->iOffset) $sSQL .= " offset $this->iOffset";
-                                                                                       $sSQL .= " limit $this->iLimit";
-                                                                                       if (CONST_Debug) var_dump($sSQL);
-                                                                                       $aClassPlaceIDs = array_merge($aClassPlaceIDs, chksql($this->oDB->getCol($sSQL)));
-                                                                               }
-                                                                               else
-                                                                               {
-                                                                                       if (isset($aSearch['fRadius']) && $aSearch['fRadius']) $fRange = $aSearch['fRadius'];
-
-                                                                                       $sOrderBySQL = '';
-                                                                                       if ($sNearPointSQL) $sOrderBySQL = "ST_Distance($sNearPointSQL, l.geometry)";
-                                                                                       else $sOrderBySQL = "ST_Distance(l.geometry, f.geometry)";
-
-                                                                                       $sSQL = "select distinct l.place_id".($sOrderBysSQL?','.$sOrderBysSQL:'')." from placex as l,placex as f where ";
-                                                                                       $sSQL .= "f.place_id in ( $sPlaceIDs) and ST_DWithin(l.geometry, f.centroid, $fRange) ";
-                                                                                       $sSQL .= "and l.class='".$aSearch['sClass']."' and l.type='".$aSearch['sType']."' ";
-                                                                                       if (sizeof($this->aExcludePlaceIDs))
-                                                                                       {
-                                                                                               $sSQL .= " and l.place_id not in (".join(',',$this->aExcludePlaceIDs).")";
-                                                                                       }
-                                                                                       if ($sCountryCodesSQL) $sSQL .= " and l.calculated_country_code in ($sCountryCodesSQL)";
-                                                                                       if ($sOrderBy) $sSQL .= "order by ".$OrderBysSQL." asc";
-                                                                                       if ($this->iOffset) $sSQL .= " offset $this->iOffset";
-                                                                                       $sSQL .= " limit $this->iLimit";
-                                                                                       if (CONST_Debug) var_dump($sSQL);
-                                                                                       $aClassPlaceIDs = array_merge($aClassPlaceIDs, chksql($this->oDB->getCol($sSQL)));
-                                                                               }
-                                                                       }
-                                                               }
-
-                                                               $aPlaceIDs = $aClassPlaceIDs;
-
-                                                       }
-
-                                               }
-
-                                               if (CONST_Debug) { echo "<br><b>Place IDs:</b> "; var_Dump($aPlaceIDs); }
-
-                                               foreach($aPlaceIDs as $iPlaceID)
-                                               {
-                                                       // array for placeID => -1 | Tiger housenumber
-                                                       $aResultPlaceIDs[$iPlaceID] = $searchedHousenumber;
-                                               }
-                                               if ($iQueryLoop > 20) break;
-                                       }
-
-                                       if (isset($aResultPlaceIDs) && sizeof($aResultPlaceIDs) && ($this->iMinAddressRank != 0 || $this->iMaxAddressRank != 30))
-                                       {
-                                               // Need to verify passes rank limits before dropping out of the loop (yuk!)
-                                               // reduces the number of place ids, like a filter
-                                               // rank_address is 30 for interpolated housenumbers
-                                               $sSQL = "select place_id from placex where place_id in (".join(',',array_keys($aResultPlaceIDs)).") ";
-                                               $sSQL .= "and (placex.rank_address between $this->iMinAddressRank and $this->iMaxAddressRank ";
-                                               if (14 >= $this->iMinAddressRank && 14 <= $this->iMaxAddressRank) $sSQL .= " OR (extratags->'place') = 'city'";
-                                               if ($this->aAddressRankList) $sSQL .= " OR placex.rank_address in (".join(',',$this->aAddressRankList).")";
-                                               if (CONST_Use_US_Tiger_Data)
-                                               {
-                                                       $sSQL .= ") UNION select place_id from location_property_tiger where place_id in (".join(',',array_keys($aResultPlaceIDs)).") ";
-                                                       $sSQL .= "and (30 between $this->iMinAddressRank and $this->iMaxAddressRank ";
-                                                       if ($this->aAddressRankList) $sSQL .= " OR 30 in (".join(',',$this->aAddressRankList).")";
-                                               }
-                                               $sSQL .= ") UNION select place_id from location_property_osmline where place_id in (".join(',',array_keys($aResultPlaceIDs)).")";
-                                               $sSQL .= " and (30 between $this->iMinAddressRank and $this->iMaxAddressRank)";
-                                               if (CONST_Debug) var_dump($sSQL);
-                                               $aFilteredPlaceIDs = chksql($this->oDB->getCol($sSQL));
-                                               $tempIDs = array();
-                                               foreach($aFilteredPlaceIDs as $placeID)
-                                               {
-                                                       $tempIDs[$placeID] = $aResultPlaceIDs[$placeID];  //assign housenumber to placeID
-                                               }
-                                               $aResultPlaceIDs = $tempIDs;
-                                       }
-
-                                       //exit;
-                                       if (isset($aResultPlaceIDs) && sizeof($aResultPlaceIDs)) break;
-                                       if ($iGroupLoop > 4) break;
-                                       if ($iQueryLoop > 30) break;
-                               }
-
-                               // Did we find anything?
-                               if (isset($aResultPlaceIDs) && sizeof($aResultPlaceIDs))
-                               {
-                                       $aSearchResults = $this->getDetails($aResultPlaceIDs);
-                               }
-
-                       }
-                       else
-                       {
-                               // Just interpret as a reverse geocode
-                               $oReverse = new ReverseGeocode($this->oDB);
-                               $oReverse->setZoom(18);
-
-                               $aLookup = $oReverse->lookup((float)$this->aNearPoint[0],
-                                                            (float)$this->aNearPoint[1],
-                                                            false);
-
-                               if (CONST_Debug) var_dump("Reverse search", $aLookup);
-
-                               if ($aLookup['place_id'])
-                                       $aSearchResults = $this->getDetails(array($aLookup['place_id'] => -1));
-                               else
-                                       $aSearchResults = array();
-                       }
-
-                       // No results? Done
-                       if (!sizeof($aSearchResults))
-                       {
-                               if ($this->bFallback)
-                               {
-                                       if ($this->fallbackStructuredQuery())
-                                       {
-                                               return $this->lookup();
-                                       }
-                               }
-
-                               return array();
-                       }
-
-                       $aClassType = getClassTypesWithImportance();
-                       $aRecheckWords = preg_split('/\b[\s,\\-]*/u',$sQuery);
-                       foreach($aRecheckWords as $i => $sWord)
-                       {
-                               if (!preg_match('/\pL/', $sWord)) unset($aRecheckWords[$i]);
-                       }
-
-                       if (CONST_Debug) { echo '<i>Recheck words:<\i>'; var_dump($aRecheckWords); }
-
-                       $oPlaceLookup = new PlaceLookup($this->oDB);
-                       $oPlaceLookup->setIncludePolygonAsPoints($this->bIncludePolygonAsPoints);
-                       $oPlaceLookup->setIncludePolygonAsText($this->bIncludePolygonAsText);
-                       $oPlaceLookup->setIncludePolygonAsGeoJSON($this->bIncludePolygonAsGeoJSON);
-                       $oPlaceLookup->setIncludePolygonAsKML($this->bIncludePolygonAsKML);
-                       $oPlaceLookup->setIncludePolygonAsSVG($this->bIncludePolygonAsSVG);
-                       $oPlaceLookup->setPolygonSimplificationThreshold($this->fPolygonSimplificationThreshold);
-
-                       foreach($aSearchResults as $iResNum => $aResult)
-                       {
-                               // Default
-                               $fDiameter = getResultDiameter($aResult);
-
-                               $aOutlineResult = $oPlaceLookup->getOutlines($aResult['place_id'], $aResult['lon'], $aResult['lat'], $fDiameter/2);
-                               if ($aOutlineResult)
-                               {
-                                       $aResult = array_merge($aResult, $aOutlineResult);
-                               }
-                               
-                               if ($aResult['extra_place'] == 'city')
-                               {
-                                       $aResult['class'] = 'place';
-                                       $aResult['type'] = 'city';
-                                       $aResult['rank_search'] = 16;
-                               }
-
-                               // Is there an icon set for this type of result?
-                               if (isset($aClassType[$aResult['class'].':'.$aResult['type']]['icon'])
-                                               && $aClassType[$aResult['class'].':'.$aResult['type']]['icon'])
-                               {
-                                       $aResult['icon'] = CONST_Website_BaseURL.'images/mapicons/'.$aClassType[$aResult['class'].':'.$aResult['type']]['icon'].'.p.20.png';
-                               }
-
-                               if (isset($aClassType[$aResult['class'].':'.$aResult['type'].':'.$aResult['admin_level']]['label'])
-                                               && $aClassType[$aResult['class'].':'.$aResult['type'].':'.$aResult['admin_level']]['label'])
-                               {
-                                       $aResult['label'] = $aClassType[$aResult['class'].':'.$aResult['type'].':'.$aResult['admin_level']]['label'];
-                               }
-                               elseif (isset($aClassType[$aResult['class'].':'.$aResult['type']]['label'])
-                                               && $aClassType[$aResult['class'].':'.$aResult['type']]['label'])
-                               {
-                                       $aResult['label'] = $aClassType[$aResult['class'].':'.$aResult['type']]['label'];
-                               }
-                               // if tag '&addressdetails=1' is set in query
-                               if ($this->bIncludeAddressDetails)
-                               {
-                                       // getAddressDetails() is defined in lib.php and uses the SQL function get_addressdata in functions.sql
-                                       $aResult['address'] = getAddressDetails($this->oDB, $sLanguagePrefArraySQL, $aResult['place_id'], $aResult['country_code'], $aResultPlaceIDs[$aResult['place_id']]);
-                                       if ($aResult['extra_place'] == 'city' && !isset($aResult['address']['city']))
-                                       {
-                                               $aResult['address'] = array_merge(array('city' => array_shift(array_values($aResult['address']))), $aResult['address']);
-                                       }
-                               }
-                               if ($this->bIncludeExtraTags)
-                               {
-                                       if ($aResult['extra'])
-                                       {
-                                               $aResult['sExtraTags'] = json_decode($aResult['extra']);
-                                       }
-                                       else
-                                       {
-                                               $aResult['sExtraTags'] = (object) array();
-                                       }
-                               }
-
-                               if ($this->bIncludeNameDetails)
-                               {
-                                       if ($aResult['names'])
-                                       {
-                                               $aResult['sNameDetails'] = json_decode($aResult['names']);
-                                       }
-                                       else
-                                       {
-                                               $aResult['sNameDetails'] = (object) array();
-                                       }
-                               }
-
-                               // Adjust importance for the number of exact string matches in the result
-                               $aResult['importance'] = max(0.001,$aResult['importance']);
-                               $iCountWords = 0;
-                               $sAddress = $aResult['langaddress'];
-                               foreach($aRecheckWords as $i => $sWord)
-                               {
-                                       if (stripos($sAddress, $sWord)!==false)
-                                       {
-                                               $iCountWords++;
-                                               if (preg_match("/(^|,)\s*".preg_quote($sWord, '/')."\s*(,|$)/", $sAddress)) $iCountWords += 0.1;
-                                       }
-                               }
-
-                               $aResult['importance'] = $aResult['importance'] + ($iCountWords*0.1); // 0.1 is a completely arbitrary number but something in the range 0.1 to 0.5 would seem right
-
-                               $aResult['name'] = $aResult['langaddress'];
-                               // secondary ordering (for results with same importance (the smaller the better):
-                               //   - approximate importance of address parts
-                               $aResult['foundorder'] = -$aResult['addressimportance']/10;
-                               //   - number of exact matches from the query
-                               if (isset($this->exactMatchCache[$aResult['place_id']]))
-                                       $aResult['foundorder'] -= $this->exactMatchCache[$aResult['place_id']];
-                               else if (isset($this->exactMatchCache[$aResult['parent_place_id']]))
-                                       $aResult['foundorder'] -= $this->exactMatchCache[$aResult['parent_place_id']];
-                               //  - importance of the class/type
-                               if (isset($aClassType[$aResult['class'].':'.$aResult['type']]['importance'])
-                                       && $aClassType[$aResult['class'].':'.$aResult['type']]['importance'])
-                               {
-                                       $aResult['foundorder'] += 0.0001 * $aClassType[$aResult['class'].':'.$aResult['type']]['importance'];
-                               }
-                               else
-                               {
-                                       $aResult['foundorder'] += 0.01;
-                               }
-                               if (CONST_Debug) { var_dump($aResult); }
-                               $aSearchResults[$iResNum] = $aResult;
-                       }
-                       uasort($aSearchResults, 'byImportance');
-
-                       $aOSMIDDone = array();
-                       $aClassTypeNameDone = array();
-                       $aToFilter = $aSearchResults;
-                       $aSearchResults = array();
-
-                       $bFirst = true;
-                       foreach($aToFilter as $iResNum => $aResult)
-                       {
-                               $this->aExcludePlaceIDs[$aResult['place_id']] = $aResult['place_id'];
-                               if ($bFirst)
-                               {
-                                       $fLat = $aResult['lat'];
-                                       $fLon = $aResult['lon'];
-                                       if (isset($aResult['zoom'])) $iZoom = $aResult['zoom'];
-                                       $bFirst = false;
-                               }
-                               if (!$this->bDeDupe || (!isset($aOSMIDDone[$aResult['osm_type'].$aResult['osm_id']])
-                                                       && !isset($aClassTypeNameDone[$aResult['osm_type'].$aResult['class'].$aResult['type'].$aResult['name'].$aResult['admin_level']])))
-                               {
-                                       $aOSMIDDone[$aResult['osm_type'].$aResult['osm_id']] = true;
-                                       $aClassTypeNameDone[$aResult['osm_type'].$aResult['class'].$aResult['type'].$aResult['name'].$aResult['admin_level']] = true;
-                                       $aSearchResults[] = $aResult;
-                               }
-
-                               // Absolute limit on number of results
-                               if (sizeof($aSearchResults) >= $this->iFinalLimit) break;
-                       }
-
-                       return $aSearchResults;
-
-               } // end lookup()
-
-
-       } // end class
 
+namespace Nominatim;
+
+require_once(CONST_BasePath.'/lib/PlaceLookup.php');
+require_once(CONST_BasePath.'/lib/ReverseGeocode.php');
+
+class Geocode
+{
+    protected $oDB;
+
+    protected $aLangPrefOrder = array();
+
+    protected $bIncludeAddressDetails = false;
+    protected $bIncludeExtraTags = false;
+    protected $bIncludeNameDetails = false;
+
+    protected $bIncludePolygonAsPoints = false;
+    protected $bIncludePolygonAsText = false;
+    protected $bIncludePolygonAsGeoJSON = false;
+    protected $bIncludePolygonAsKML = false;
+    protected $bIncludePolygonAsSVG = false;
+    protected $fPolygonSimplificationThreshold = 0.0;
+
+    protected $aExcludePlaceIDs = array();
+    protected $bDeDupe = true;
+    protected $bReverseInPlan = true;
+
+    protected $iLimit = 20;
+    protected $iFinalLimit = 10;
+    protected $iOffset = 0;
+    protected $bFallback = false;
+
+    protected $aCountryCodes = false;
+    protected $aNearPoint = false;
+
+    protected $bBoundedSearch = false;
+    protected $aViewBox = false;
+    protected $sViewboxCentreSQL = false;
+    protected $sViewboxSmallSQL = false;
+    protected $sViewboxLargeSQL = false;
+
+    protected $iMaxRank = 20;
+    protected $iMinAddressRank = 0;
+    protected $iMaxAddressRank = 30;
+    protected $aAddressRankList = array();
+    protected $exactMatchCache = array();
+
+    protected $sAllowedTypesSQLList = false;
+
+    protected $sQuery = false;
+    protected $aStructuredQuery = false;
+
+
+    public function __construct(&$oDB)
+    {
+        $this->oDB =& $oDB;
+    }
+
+    public function setReverseInPlan($bReverse)
+    {
+        $this->bReverseInPlan = $bReverse;
+    }
+
+    public function setLanguagePreference($aLangPref)
+    {
+        $this->aLangPrefOrder = $aLangPref;
+    }
+
+    public function getIncludeAddressDetails()
+    {
+        return $this->bIncludeAddressDetails;
+    }
+
+    public function getIncludeExtraTags()
+    {
+        return $this->bIncludeExtraTags;
+    }
+
+    public function getIncludeNameDetails()
+    {
+        return $this->bIncludeNameDetails;
+    }
+
+    public function setIncludePolygonAsPoints($b = true)
+    {
+        $this->bIncludePolygonAsPoints = $b;
+    }
+
+    public function setIncludePolygonAsText($b = true)
+    {
+        $this->bIncludePolygonAsText = $b;
+    }
+
+    public function setIncludePolygonAsGeoJSON($b = true)
+    {
+        $this->bIncludePolygonAsGeoJSON = $b;
+    }
+
+    public function setIncludePolygonAsKML($b = true)
+    {
+        $this->bIncludePolygonAsKML = $b;
+    }
+
+    public function setIncludePolygonAsSVG($b = true)
+    {
+        $this->bIncludePolygonAsSVG = $b;
+    }
+
+    public function setPolygonSimplificationThreshold($f)
+    {
+        $this->fPolygonSimplificationThreshold = $f;
+    }
+
+    public function setLimit($iLimit = 10)
+    {
+        if ($iLimit > 50) $iLimit = 50;
+        if ($iLimit < 1) $iLimit = 1;
+
+        $this->iFinalLimit = $iLimit;
+        $this->iLimit = $iLimit + min($iLimit, 10);
+    }
+
+    public function getExcludedPlaceIDs()
+    {
+        return $this->aExcludePlaceIDs;
+    }
+
+    public function getViewBoxString()
+    {
+        if (!$this->aViewBox) return null;
+        return $this->aViewBox[0].','.$this->aViewBox[3].','.$this->aViewBox[2].','.$this->aViewBox[1];
+    }
+
+    public function setFeatureType($sFeatureType)
+    {
+        switch ($sFeatureType) {
+            case 'country':
+                $this->setRankRange(4, 4);
+                break;
+            case 'state':
+                $this->setRankRange(8, 8);
+                break;
+            case 'city':
+                $this->setRankRange(14, 16);
+                break;
+            case 'settlement':
+                $this->setRankRange(8, 20);
+                break;
+        }
+    }
+
+    public function setRankRange($iMin, $iMax)
+    {
+        $this->iMinAddressRank = $iMin;
+        $this->iMaxAddressRank = $iMax;
+    }
+
+    public function setRoute($aRoutePoints, $fRouteWidth)
+    {
+        $this->aViewBox = false;
+
+        $this->sViewboxCentreSQL = "ST_SetSRID('LINESTRING(";
+        $sSep = '';
+        foreach ($this->aRoutePoints as $aPoint) {
+            $fPoint = (float)$aPoint;
+            $this->sViewboxCentreSQL .= $sSep.$fPoint;
+            $sSep = ($sSep == ' ') ? ',' : ' ';
+        }
+        $this->sViewboxCentreSQL .= ")'::geometry,4326)";
+
+        $this->sViewboxSmallSQL = 'st_buffer('.$this->sViewboxCentreSQL;
+        $this->sViewboxSmallSQL .= ','.($fRouteWidth/69).')';
+
+        $this->sViewboxLargeSQL = 'st_buffer('.$this->sViewboxCentreSQL;
+        $this->sViewboxLargeSQL .= ','.($fRouteWidth/30).')';
+    }
+
+    public function setViewbox($aViewbox)
+    {
+        $this->aViewBox = array_map('floatval', $aViewbox);
+
+        $fHeight = $this->aViewBox[0] - $this->aViewBox[2];
+        $fWidth = $this->aViewBox[1] - $this->aViewBox[3];
+        $aBigViewBox[0] = $this->aViewBox[0] + $fHeight;
+        $aBigViewBox[2] = $this->aViewBox[2] - $fHeight;
+        $aBigViewBox[1] = $this->aViewBox[1] + $fWidth;
+        $aBigViewBox[3] = $this->aViewBox[3] - $fWidth;
+
+        $this->sViewboxCentreSQL = false;
+        $this->sViewboxSmallSQL = "ST_SetSRID(ST_MakeBox2D(ST_Point(".$this->aViewBox[0].",".$this->aViewBox[1]."),ST_Point(".$this->aViewBox[2].",".$this->aViewBox[3].")),4326)";
+        $this->sViewboxLargeSQL = "ST_SetSRID(ST_MakeBox2D(ST_Point(".$aBigViewBox[0].",".$aBigViewBox[1]."),ST_Point(".$aBigViewBox[2].",".$aBigViewBox[3].")),4326)";
+    }
+
+    public function setNearPoint($aNearPoint, $fRadiusDeg = 0.1)
+    {
+        $this->aNearPoint = array((float)$aNearPoint[0], (float)$aNearPoint[1], (float)$fRadiusDeg);
+    }
+
+    public function setQuery($sQueryString)
+    {
+        $this->sQuery = $sQueryString;
+        $this->aStructuredQuery = false;
+    }
+
+    public function getQueryString()
+    {
+        return $this->sQuery;
+    }
+
+
+    public function loadParamArray($oParams)
+    {
+        $this->bIncludeAddressDetails
+         = $oParams->getBool('addressdetails', $this->bIncludeAddressDetails);
+        $this->bIncludeExtraTags
+         = $oParams->getBool('extratags', $this->bIncludeExtraTags);
+        $this->bIncludeNameDetails
+         = $oParams->getBool('namedetails', $this->bIncludeNameDetails);
+
+        $this->bBoundedSearch = $oParams->getBool('bounded', $this->bBoundedSearch);
+        $this->bDeDupe = $oParams->getBool('dedupe', $this->bDeDupe);
+
+        $this->setLimit($oParams->getInt('limit', $this->iFinalLimit));
+        $this->iOffset = $oParams->getInt('offset', $this->iOffset);
+
+        $this->bFallback = $oParams->getBool('fallback', $this->bFallback);
+
+        // List of excluded Place IDs - used for more acurate pageing
+        $sExcluded = $oParams->getStringList('exclude_place_ids');
+        if ($sExcluded) {
+            foreach ($sExcluded as $iExcludedPlaceID) {
+                $iExcludedPlaceID = (int)$iExcludedPlaceID;
+                if ($iExcludedPlaceID)
+                    $aExcludePlaceIDs[$iExcludedPlaceID] = $iExcludedPlaceID;
+            }
+
+            if (isset($aExcludePlaceIDs))
+                $this->aExcludePlaceIDs = $aExcludePlaceIDs;
+        }
+
+        // Only certain ranks of feature
+        $sFeatureType = $oParams->getString('featureType');
+        if (!$sFeatureType) $sFeatureType = $oParams->getString('featuretype');
+        if ($sFeatureType) $this->setFeatureType($sFeatureType);
+
+        // Country code list
+        $sCountries = $oParams->getStringList('countrycodes');
+        if ($sCountries) {
+            foreach ($sCountries as $sCountryCode) {
+                if (preg_match('/^[a-zA-Z][a-zA-Z]$/', $sCountryCode)) {
+                    $aCountries[] = strtolower($sCountryCode);
+                }
+            }
+            if (isset($aCountryCodes))
+                $this->aCountryCodes = $aCountries;
+        }
+
+        $aViewbox = $oParams->getStringList('viewboxlbrt');
+        if ($aViewbox) {
+            $this->setViewbox($aViewbox);
+        } else {
+            $aViewbox = $oParams->getStringList('viewbox');
+            if ($aViewbox) {
+                $this->setViewBox(array(
+                                   $aViewbox[0],
+                                   $aViewbox[3],
+                                   $aViewbox[2],
+                                   $aViewbox[1]
+                                  ));
+            } else {
+                $aRoute = $oParams->getStringList('route');
+                $fRouteWidth = $oParams->getFloat('routewidth');
+                if ($aRoute && $fRouteWidth) {
+                    $this->setRoute($aRoute, $fRouteWidth);
+                }
+            }
+        }
+    }
+
+    public function setQueryFromParams($oParams)
+    {
+        // Search query
+        $sQuery = $oParams->getString('q');
+        if (!$sQuery) {
+            $this->setStructuredQuery(
+                $oParams->getString('amenity'),
+                $oParams->getString('street'),
+                $oParams->getString('city'),
+                $oParams->getString('county'),
+                $oParams->getString('state'),
+                $oParams->getString('country'),
+                $oParams->getString('postalcode')
+            );
+            $this->setReverseInPlan(false);
+        } else {
+            $this->setQuery($sQuery);
+        }
+    }
+
+    public function loadStructuredAddressElement($sValue, $sKey, $iNewMinAddressRank, $iNewMaxAddressRank, $aItemListValues)
+    {
+        $sValue = trim($sValue);
+        if (!$sValue) return false;
+        $this->aStructuredQuery[$sKey] = $sValue;
+        if ($this->iMinAddressRank == 0 && $this->iMaxAddressRank == 30) {
+            $this->iMinAddressRank = $iNewMinAddressRank;
+            $this->iMaxAddressRank = $iNewMaxAddressRank;
+        }
+        if ($aItemListValues) $this->aAddressRankList = array_merge($this->aAddressRankList, $aItemListValues);
+        return true;
+    }
+
+    public function setStructuredQuery($sAmentiy = false, $sStreet = false, $sCity = false, $sCounty = false, $sState = false, $sCountry = false, $sPostalCode = false)
+    {
+        $this->sQuery = false;
+
+        // Reset
+        $this->iMinAddressRank = 0;
+        $this->iMaxAddressRank = 30;
+        $this->aAddressRankList = array();
+
+        $this->aStructuredQuery = array();
+        $this->sAllowedTypesSQLList = '';
+
+        $this->loadStructuredAddressElement($sAmentiy, 'amenity', 26, 30, false);
+        $this->loadStructuredAddressElement($sStreet, 'street', 26, 30, false);
+        $this->loadStructuredAddressElement($sCity, 'city', 14, 24, false);
+        $this->loadStructuredAddressElement($sCounty, 'county', 9, 13, false);
+        $this->loadStructuredAddressElement($sState, 'state', 8, 8, false);
+        $this->loadStructuredAddressElement($sPostalCode, 'postalcode', 5, 11, array(5, 11));
+        $this->loadStructuredAddressElement($sCountry, 'country', 4, 4, false);
+
+        if (sizeof($this->aStructuredQuery) > 0) {
+            $this->sQuery = join(', ', $this->aStructuredQuery);
+            if ($this->iMaxAddressRank < 30) {
+                $sAllowedTypesSQLList = '(\'place\',\'boundary\')';
+            }
+        }
+    }
+
+    public function fallbackStructuredQuery()
+    {
+        if (!$this->aStructuredQuery) return false;
+
+        $aParams = $this->aStructuredQuery;
+
+        if (sizeof($aParams) == 1) return false;
+
+        $aOrderToFallback = array('postalcode', 'street', 'city', 'county', 'state');
+
+        foreach ($aOrderToFallback as $sType) {
+            if (isset($aParams[$sType])) {
+                unset($aParams[$sType]);
+                $this->setStructuredQuery(@$aParams['amenity'], @$aParams['street'], @$aParams['city'], @$aParams['county'], @$aParams['state'], @$aParams['country'], @$aParams['postalcode']);
+                return true;
+            }
+        }
+
+        return false;
+    }
+
+    public function getDetails($aPlaceIDs)
+    {
+        //$aPlaceIDs is an array with key: placeID and value: tiger-housenumber, if found, else -1
+        if (sizeof($aPlaceIDs) == 0) return array();
+
+        $sLanguagePrefArraySQL = "ARRAY[".join(',', array_map("getDBQuoted", $this->aLangPrefOrder))."]";
+
+        // Get the details for display (is this a redundant extra step?)
+        $sPlaceIDs = join(',', array_keys($aPlaceIDs));
+
+        $sImportanceSQL = '';
+        if ($this->sViewboxSmallSQL) $sImportanceSQL .= " case when ST_Contains($this->sViewboxSmallSQL, ST_Collect(centroid)) THEN 1 ELSE 0.75 END * ";
+        if ($this->sViewboxLargeSQL) $sImportanceSQL .= " case when ST_Contains($this->sViewboxLargeSQL, ST_Collect(centroid)) THEN 1 ELSE 0.75 END * ";
+
+        $sSQL = "select osm_type,osm_id,class,type,admin_level,rank_search,rank_address,min(place_id) as place_id, min(parent_place_id) as parent_place_id, calculated_country_code as country_code,";
+        $sSQL .= "get_address_by_language(place_id, -1, $sLanguagePrefArraySQL) as langaddress,";
+        $sSQL .= "get_name_by_language(name, $sLanguagePrefArraySQL) as placename,";
+        $sSQL .= "get_name_by_language(name, ARRAY['ref']) as ref,";
+        if ($this->bIncludeExtraTags) $sSQL .= "hstore_to_json(extratags)::text as extra,";
+        if ($this->bIncludeNameDetails) $sSQL .= "hstore_to_json(name)::text as names,";
+        $sSQL .= "avg(ST_X(centroid)) as lon,avg(ST_Y(centroid)) as lat, ";
+        $sSQL .= $sImportanceSQL."coalesce(importance,0.75-(rank_search::float/40)) as importance, ";
+        $sSQL .= "(select max(p.importance*(p.rank_address+2)) from place_addressline s, placex p where s.place_id = min(CASE WHEN placex.rank_search < 28 THEN placex.place_id ELSE placex.parent_place_id END) and p.place_id = s.address_place_id and s.isaddress and p.importance is not null) as addressimportance, ";
+        $sSQL .= "(extratags->'place') as extra_place ";
+        $sSQL .= "from placex where place_id in ($sPlaceIDs) ";
+        $sSQL .= "and (placex.rank_address between $this->iMinAddressRank and $this->iMaxAddressRank ";
+        if (14 >= $this->iMinAddressRank && 14 <= $this->iMaxAddressRank) $sSQL .= " OR (extratags->'place') = 'city'";
+        if ($this->aAddressRankList) $sSQL .= " OR placex.rank_address in (".join(',', $this->aAddressRankList).")";
+        $sSQL .= ") ";
+        if ($this->sAllowedTypesSQLList) $sSQL .= "and placex.class in $this->sAllowedTypesSQLList ";
+        $sSQL .= "and linked_place_id is null ";
+        $sSQL .= "group by osm_type,osm_id,class,type,admin_level,rank_search,rank_address,calculated_country_code,importance";
+        if (!$this->bDeDupe) $sSQL .= ",place_id";
+        $sSQL .= ",langaddress ";
+        $sSQL .= ",placename ";
+        $sSQL .= ",ref ";
+        if ($this->bIncludeExtraTags) $sSQL .= ",extratags";
+        if ($this->bIncludeNameDetails) $sSQL .= ",name";
+        $sSQL .= ",extratags->'place' ";
+
+        if (30 >= $this->iMinAddressRank && 30 <= $this->iMaxAddressRank) {
+            // only Tiger housenumbers and interpolation lines need to be interpolated, because they are saved as lines
+            // with start- and endnumber, the common osm housenumbers are usually saved as points
+            $sHousenumbers = "";
+            $i = 0;
+            $length = count($aPlaceIDs);
+            foreach ($aPlaceIDs as $placeID => $housenumber) {
+                $i++;
+                $sHousenumbers .= "(".$placeID.", ".$housenumber.")";
+                if ($i<$length) $sHousenumbers .= ", ";
+            }
+            if (CONST_Use_US_Tiger_Data) {
+                // Tiger search only if a housenumber was searched and if it was found (i.e. aPlaceIDs[placeID] = housenumber != -1) (realized through a join)
+                $sSQL .= " union";
+                $sSQL .= " select 'T' as osm_type, place_id as osm_id, 'place' as class, 'house' as type, null as admin_level, 30 as rank_search, 30 as rank_address, min(place_id) as place_id, min(parent_place_id) as parent_place_id, 'us' as country_code";
+                $sSQL .= ", get_address_by_language(place_id, housenumber_for_place, $sLanguagePrefArraySQL) as langaddress ";
+                $sSQL .= ", null as placename";
+                $sSQL .= ", null as ref";
+                if ($this->bIncludeExtraTags) $sSQL .= ", null as extra";
+                if ($this->bIncludeNameDetails) $sSQL .= ", null as names";
+                $sSQL .= ", avg(st_x(centroid)) as lon, avg(st_y(centroid)) as lat,";
+                $sSQL .= $sImportanceSQL."-1.15 as importance ";
+                $sSQL .= ", (select max(p.importance*(p.rank_address+2)) from place_addressline s, placex p where s.place_id = min(blub.parent_place_id) and p.place_id = s.address_place_id and s.isaddress and p.importance is not null) as addressimportance ";
+                $sSQL .= ", null as extra_place ";
+                $sSQL .= " from (select place_id";
+                // interpolate the Tiger housenumbers here
+                $sSQL .= ", ST_LineInterpolatePoint(linegeo, (housenumber_for_place-startnumber::float)/(endnumber-startnumber)::float) as centroid, parent_place_id, housenumber_for_place";
+                $sSQL .= " from (location_property_tiger ";
+                $sSQL .= " join (values ".$sHousenumbers.") as housenumbers(place_id, housenumber_for_place) using(place_id)) ";
+                $sSQL .= " where housenumber_for_place>=0 and 30 between $this->iMinAddressRank and $this->iMaxAddressRank) as blub"; //postgres wants an alias here
+                $sSQL .= " group by place_id, housenumber_for_place"; //is this group by really needed?, place_id + housenumber (in combination) are unique
+                if (!$this->bDeDupe) $sSQL .= ", place_id ";
+            }
+            // osmline
+            // interpolation line search only if a housenumber was searched and if it was found (i.e. aPlaceIDs[placeID] = housenumber != -1) (realized through a join)
+            $sSQL .= " union ";
+            $sSQL .= "select 'W' as osm_type, place_id as osm_id, 'place' as class, 'house' as type, null as admin_level, 30 as rank_search, 30 as rank_address, min(place_id) as place_id, min(parent_place_id) as parent_place_id, calculated_country_code as country_code, ";
+            $sSQL .= "get_address_by_language(place_id, housenumber_for_place, $sLanguagePrefArraySQL) as langaddress, ";
+            $sSQL .= "null as placename, ";
+            $sSQL .= "null as ref, ";
+            if ($this->bIncludeExtraTags) $sSQL .= "null as extra, ";
+            if ($this->bIncludeNameDetails) $sSQL .= "null as names, ";
+            $sSQL .= " avg(st_x(centroid)) as lon, avg(st_y(centroid)) as lat,";
+            $sSQL .= $sImportanceSQL."-0.1 as importance, ";  // slightly smaller than the importance for normal houses with rank 30, which is 0
+            $sSQL .= " (select max(p.importance*(p.rank_address+2)) from place_addressline s, placex p";
+            $sSQL .= " where s.place_id = min(blub.parent_place_id) and p.place_id = s.address_place_id and s.isaddress and p.importance is not null) as addressimportance,";
+            $sSQL .= " null as extra_place ";
+            $sSQL .= " from (select place_id, calculated_country_code ";
+            // interpolate the housenumbers here
+            $sSQL .= ", CASE WHEN startnumber != endnumber 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, housenumber_for_place ";
+            $sSQL .= " from (location_property_osmline ";
+            $sSQL .= " join (values ".$sHousenumbers.") as housenumbers(place_id, housenumber_for_place) using(place_id)) ";
+            $sSQL .= " where housenumber_for_place>=0 and 30 between $this->iMinAddressRank and $this->iMaxAddressRank) as blub"; //postgres wants an alias here
+            $sSQL .= " group by place_id, housenumber_for_place, calculated_country_code "; //is this group by really needed?, place_id + housenumber (in combination) are unique
+            if (!$this->bDeDupe) $sSQL .= ", place_id ";
+
+            if (CONST_Use_Aux_Location_data) {
+                $sSQL .= " union ";
+                $sSQL .= "select 'L' as osm_type, place_id as osm_id, 'place' as class, 'house' as type, null as admin_level, 0 as rank_search, 0 as rank_address, min(place_id) as place_id, min(parent_place_id) as parent_place_id, 'us' as country_code, ";
+                $sSQL .= "get_address_by_language(place_id, -1, $sLanguagePrefArraySQL) as langaddress, ";
+                $sSQL .= "null as placename, ";
+                $sSQL .= "null as ref, ";
+                if ($this->bIncludeExtraTags) $sSQL .= "null as extra, ";
+                if ($this->bIncludeNameDetails) $sSQL .= "null as names, ";
+                $sSQL .= "avg(ST_X(centroid)) as lon, avg(ST_Y(centroid)) as lat, ";
+                $sSQL .= $sImportanceSQL."-1.10 as importance, ";
+                $sSQL .= "(select max(p.importance*(p.rank_address+2)) from place_addressline s, placex p where s.place_id = min(location_property_aux.parent_place_id) and p.place_id = s.address_place_id and s.isaddress and p.importance is not null) as addressimportance, ";
+                $sSQL .= "null as extra_place ";
+                $sSQL .= "from location_property_aux where place_id in ($sPlaceIDs) ";
+                $sSQL .= "and 30 between $this->iMinAddressRank and $this->iMaxAddressRank ";
+                $sSQL .= "group by place_id";
+                if (!$this->bDeDupe) $sSQL .= ", place_id";
+                $sSQL .= ", get_address_by_language(place_id, -1, $sLanguagePrefArraySQL) ";
+            }
+        }
+
+        $sSQL .= " order by importance desc";
+        if (CONST_Debug) {
+            echo "<hr>";
+            var_dump($sSQL);
+        }
+        $aSearchResults = chksql(
+            $this->oDB->getAll($sSQL),
+            "Could not get details for place."
+        );
+
+        return $aSearchResults;
+    }
+
+    public function getGroupedSearches($aSearches, $aPhraseTypes, $aPhrases, $aValidTokens, $aWordFrequencyScores, $bStructuredPhrases)
+    {
+        /*
+             Calculate all searches using aValidTokens i.e.
+             'Wodsworth Road, Sheffield' =>
+
+             Phrase Wordset
+             0      0       (wodsworth road)
+             0      1       (wodsworth)(road)
+             1      0       (sheffield)
+
+             Score how good the search is so they can be ordered
+         */
+        foreach ($aPhrases as $iPhrase => $sPhrase) {
+            $aNewPhraseSearches = array();
+            if ($bStructuredPhrases) $sPhraseType = $aPhraseTypes[$iPhrase];
+            else $sPhraseType = '';
+
+            foreach ($aPhrases[$iPhrase]['wordsets'] as $iWordSet => $aWordset) {
+                // Too many permutations - too expensive
+                if ($iWordSet > 120) break;
+
+                $aWordsetSearches = $aSearches;
+
+                // Add all words from this wordset
+                foreach ($aWordset as $iToken => $sToken) {
+                    //echo "<br><b>$sToken</b>";
+                    $aNewWordsetSearches = array();
+
+                    foreach ($aWordsetSearches as $aCurrentSearch) {
+                        //echo "<i>";
+                        //var_dump($aCurrentSearch);
+                        //echo "</i>";
+
+                        // If the token is valid
+                        if (isset($aValidTokens[' '.$sToken])) {
+                            foreach ($aValidTokens[' '.$sToken] as $aSearchTerm) {
+                                $aSearch = $aCurrentSearch;
+                                $aSearch['iSearchRank']++;
+                                if (($sPhraseType == '' || $sPhraseType == 'country') && !empty($aSearchTerm['country_code']) && $aSearchTerm['country_code'] != '0') {
+                                    if ($aSearch['sCountryCode'] === false) {
+                                        $aSearch['sCountryCode'] = strtolower($aSearchTerm['country_code']);
+                                        // Country is almost always at the end of the string - increase score for finding it anywhere else (optimisation)
+                                        if (($iToken+1 != sizeof($aWordset) || $iPhrase+1 != sizeof($aPhrases))) {
+                                            $aSearch['iSearchRank'] += 5;
+                                        }
+                                        if ($aSearch['iSearchRank'] < $this->iMaxRank) $aNewWordsetSearches[] = $aSearch;
+                                    }
+                                } elseif (isset($aSearchTerm['lat']) && $aSearchTerm['lat'] !== '' && $aSearchTerm['lat'] !== null) {
+                                    if ($aSearch['fLat'] === '') {
+                                        $aSearch['fLat'] = $aSearchTerm['lat'];
+                                        $aSearch['fLon'] = $aSearchTerm['lon'];
+                                        $aSearch['fRadius'] = $aSearchTerm['radius'];
+                                        if ($aSearch['iSearchRank'] < $this->iMaxRank) $aNewWordsetSearches[] = $aSearch;
+                                    }
+                                } elseif ($sPhraseType == 'postalcode') {
+                                    // We need to try the case where the postal code is the primary element (i.e. no way to tell if it is (postalcode, city) OR (city, postalcode) so try both
+                                    if (isset($aSearchTerm['word_id']) && $aSearchTerm['word_id']) {
+                                        // If we already have a name try putting the postcode first
+                                        if (sizeof($aSearch['aName'])) {
+                                            $aNewSearch = $aSearch;
+                                            $aNewSearch['aAddress'] = array_merge($aNewSearch['aAddress'], $aNewSearch['aName']);
+                                            $aNewSearch['aName'] = array();
+                                            $aNewSearch['aName'][$aSearchTerm['word_id']] = $aSearchTerm['word_id'];
+                                            if ($aSearch['iSearchRank'] < $this->iMaxRank) $aNewWordsetSearches[] = $aNewSearch;
+                                        }
+
+                                        if (sizeof($aSearch['aName'])) {
+                                            if ((!$bStructuredPhrases || $iPhrase > 0) && $sPhraseType != 'country' && (!isset($aValidTokens[$sToken]) || strpos($sToken, ' ') !== false)) {
+                                                $aSearch['aAddress'][$aSearchTerm['word_id']] = $aSearchTerm['word_id'];
+                                            } else {
+                                                $aCurrentSearch['aFullNameAddress'][$aSearchTerm['word_id']] = $aSearchTerm['word_id'];
+                                                $aSearch['iSearchRank'] += 1000; // skip;
+                                            }
+                                        } else {
+                                            $aSearch['aName'][$aSearchTerm['word_id']] = $aSearchTerm['word_id'];
+                                            //$aSearch['iNamePhrase'] = $iPhrase;
+                                        }
+                                        if ($aSearch['iSearchRank'] < $this->iMaxRank) $aNewWordsetSearches[] = $aSearch;
+                                    }
+                                } elseif (($sPhraseType == '' || $sPhraseType == 'street') && $aSearchTerm['class'] == 'place' && $aSearchTerm['type'] == 'house') {
+                                    if ($aSearch['sHouseNumber'] === '') {
+                                        $aSearch['sHouseNumber'] = $sToken;
+                                        // sanity check: if the housenumber is not mainly made
+                                        // up of numbers, add a penalty
+                                        if (preg_match_all("/[^0-9]/", $sToken, $aMatches) > 2) $aSearch['iSearchRank']++;
+                                        // also housenumbers should appear in the first or second phrase
+                                        if ($iPhrase > 1) $aSearch['iSearchRank'] += 1;
+                                        if ($aSearch['iSearchRank'] < $this->iMaxRank) $aNewWordsetSearches[] = $aSearch;
+                                        /*
+                                        // Fall back to not searching for this item (better than nothing)
+                                        $aSearch = $aCurrentSearch;
+                                        $aSearch['iSearchRank'] += 1;
+                                        if ($aSearch['iSearchRank'] < $this->iMaxRank) $aNewWordsetSearches[] = $aSearch;
+                                         */
+                                    }
+                                } elseif ($sPhraseType == '' && $aSearchTerm['class'] !== '' && $aSearchTerm['class'] !== null) {
+                                    if ($aSearch['sClass'] === '') {
+                                        $aSearch['sOperator'] = $aSearchTerm['operator'];
+                                        $aSearch['sClass'] = $aSearchTerm['class'];
+                                        $aSearch['sType'] = $aSearchTerm['type'];
+                                        if (sizeof($aSearch['aName'])) $aSearch['sOperator'] = 'name';
+                                        else $aSearch['sOperator'] = 'near'; // near = in for the moment
+                                        if (strlen($aSearchTerm['operator']) == 0) $aSearch['iSearchRank'] += 1;
+
+                                        if ($aSearch['iSearchRank'] < $this->iMaxRank) $aNewWordsetSearches[] = $aSearch;
+                                    }
+                                } elseif (isset($aSearchTerm['word_id']) && $aSearchTerm['word_id']) {
+                                    if (sizeof($aSearch['aName'])) {
+                                        if ((!$bStructuredPhrases || $iPhrase > 0) && $sPhraseType != 'country' && (!isset($aValidTokens[$sToken]) || strpos($sToken, ' ') !== false)) {
+                                            $aSearch['aAddress'][$aSearchTerm['word_id']] = $aSearchTerm['word_id'];
+                                        } else {
+                                            $aCurrentSearch['aFullNameAddress'][$aSearchTerm['word_id']] = $aSearchTerm['word_id'];
+                                            $aSearch['iSearchRank'] += 1000; // skip;
+                                        }
+                                    } else {
+                                        $aSearch['aName'][$aSearchTerm['word_id']] = $aSearchTerm['word_id'];
+                                        //$aSearch['iNamePhrase'] = $iPhrase;
+                                    }
+                                    if ($aSearch['iSearchRank'] < $this->iMaxRank) $aNewWordsetSearches[] = $aSearch;
+                                }
+                            }
+                        }
+                        // Look for partial matches.
+                        // Note that there is no point in adding country terms here
+                        // because country are omitted in the address.
+                        if (isset($aValidTokens[$sToken]) && $sPhraseType != 'country') {
+                            // Allow searching for a word - but at extra cost
+                            foreach ($aValidTokens[$sToken] as $aSearchTerm) {
+                                if (isset($aSearchTerm['word_id']) && $aSearchTerm['word_id']) {
+                                    if ((!$bStructuredPhrases || $iPhrase > 0) && sizeof($aCurrentSearch['aName']) && strpos($sToken, ' ') === false) {
+                                        $aSearch = $aCurrentSearch;
+                                        $aSearch['iSearchRank'] += 1;
+                                        if ($aWordFrequencyScores[$aSearchTerm['word_id']] < CONST_Max_Word_Frequency) {
+                                            $aSearch['aAddress'][$aSearchTerm['word_id']] = $aSearchTerm['word_id'];
+                                            if ($aSearch['iSearchRank'] < $this->iMaxRank) $aNewWordsetSearches[] = $aSearch;
+                                        } elseif (isset($aValidTokens[' '.$sToken])) { // revert to the token version?
+                                            $aSearch['aAddressNonSearch'][$aSearchTerm['word_id']] = $aSearchTerm['word_id'];
+                                            $aSearch['iSearchRank'] += 1;
+                                            if ($aSearch['iSearchRank'] < $this->iMaxRank) $aNewWordsetSearches[] = $aSearch;
+                                            foreach ($aValidTokens[' '.$sToken] as $aSearchTermToken) {
+                                                if (empty($aSearchTermToken['country_code'])
+                                                    && empty($aSearchTermToken['lat'])
+                                                    && empty($aSearchTermToken['class'])
+                                                ) {
+                                                    $aSearch = $aCurrentSearch;
+                                                    $aSearch['iSearchRank'] += 1;
+                                                    $aSearch['aAddress'][$aSearchTermToken['word_id']] = $aSearchTermToken['word_id'];
+                                                    if ($aSearch['iSearchRank'] < $this->iMaxRank) $aNewWordsetSearches[] = $aSearch;
+                                                }
+                                            }
+                                        } else {
+                                            $aSearch['aAddressNonSearch'][$aSearchTerm['word_id']] = $aSearchTerm['word_id'];
+                                            if (preg_match('#^[0-9]+$#', $sToken)) $aSearch['iSearchRank'] += 2;
+                                            if ($aSearch['iSearchRank'] < $this->iMaxRank) $aNewWordsetSearches[] = $aSearch;
+                                        }
+                                    }
+
+                                    if (!sizeof($aCurrentSearch['aName']) || $aCurrentSearch['iNamePhrase'] == $iPhrase) {
+                                        $aSearch = $aCurrentSearch;
+                                        $aSearch['iSearchRank'] += 1;
+                                        if (!sizeof($aCurrentSearch['aName'])) $aSearch['iSearchRank'] += 1;
+                                        if (preg_match('#^[0-9]+$#', $sToken)) $aSearch['iSearchRank'] += 2;
+                                        if ($aWordFrequencyScores[$aSearchTerm['word_id']] < CONST_Max_Word_Frequency) {
+                                            $aSearch['aName'][$aSearchTerm['word_id']] = $aSearchTerm['word_id'];
+                                        } else {
+                                            $aSearch['aNameNonSearch'][$aSearchTerm['word_id']] = $aSearchTerm['word_id'];
+                                        }
+                                        $aSearch['iNamePhrase'] = $iPhrase;
+                                        if ($aSearch['iSearchRank'] < $this->iMaxRank) $aNewWordsetSearches[] = $aSearch;
+                                    }
+                                }
+                            }
+                        } else {
+                            // Allow skipping a word - but at EXTREAM cost
+                            //$aSearch = $aCurrentSearch;
+                            //$aSearch['iSearchRank']+=100;
+                            //$aNewWordsetSearches[] = $aSearch;
+                        }
+                    }
+                    // Sort and cut
+                    usort($aNewWordsetSearches, 'bySearchRank');
+                    $aWordsetSearches = array_slice($aNewWordsetSearches, 0, 50);
+                }
+                //var_Dump('<hr>',sizeof($aWordsetSearches)); exit;
+
+                $aNewPhraseSearches = array_merge($aNewPhraseSearches, $aNewWordsetSearches);
+                usort($aNewPhraseSearches, 'bySearchRank');
+
+                $aSearchHash = array();
+                foreach ($aNewPhraseSearches as $iSearch => $aSearch) {
+                    $sHash = serialize($aSearch);
+                    if (isset($aSearchHash[$sHash])) unset($aNewPhraseSearches[$iSearch]);
+                    else $aSearchHash[$sHash] = 1;
+                }
+
+                $aNewPhraseSearches = array_slice($aNewPhraseSearches, 0, 50);
+            }
+
+            // Re-group the searches by their score, junk anything over 20 as just not worth trying
+            $aGroupedSearches = array();
+            foreach ($aNewPhraseSearches as $aSearch) {
+                if ($aSearch['iSearchRank'] < $this->iMaxRank) {
+                    if (!isset($aGroupedSearches[$aSearch['iSearchRank']])) $aGroupedSearches[$aSearch['iSearchRank']] = array();
+                    $aGroupedSearches[$aSearch['iSearchRank']][] = $aSearch;
+                }
+            }
+            ksort($aGroupedSearches);
+
+            $iSearchCount = 0;
+            $aSearches = array();
+            foreach ($aGroupedSearches as $iScore => $aNewSearches) {
+                $iSearchCount += sizeof($aNewSearches);
+                $aSearches = array_merge($aSearches, $aNewSearches);
+                if ($iSearchCount > 50) break;
+            }
+
+            //if (CONST_Debug) _debugDumpGroupedSearches($aGroupedSearches, $aValidTokens);
+        }
+        return $aGroupedSearches;
+    }
+
+    /* Perform the actual query lookup.
+
+        Returns an ordered list of results, each with the following fields:
+            osm_type: type of corresponding OSM object
+                        N - node
+                        W - way
+                        R - relation
+                        P - postcode (internally computed)
+            osm_id: id of corresponding OSM object
+            class: general object class (corresponds to tag key of primary OSM tag)
+            type: subclass of object (corresponds to tag value of primary OSM tag)
+            admin_level: see http://wiki.openstreetmap.org/wiki/Admin_level
+            rank_search: rank in search hierarchy
+                        (see also http://wiki.openstreetmap.org/wiki/Nominatim/Development_overview#Country_to_street_level)
+            rank_address: rank in address hierarchy (determines orer in address)
+            place_id: internal key (may differ between different instances)
+            country_code: ISO country code
+            langaddress: localized full address
+            placename: localized name of object
+            ref: content of ref tag (if available)
+            lon: longitude
+            lat: latitude
+            importance: importance of place based on Wikipedia link count
+            addressimportance: cumulated importance of address elements
+            extra_place: type of place (for admin boundaries, if there is a place tag)
+            aBoundingBox: bounding Box
+            label: short description of the object class/type (English only)
+            name: full name (currently the same as langaddress)
+            foundorder: secondary ordering for places with same importance
+    */
+
+
+    public function lookup()
+    {
+        if (!$this->sQuery && !$this->aStructuredQuery) return false;
+
+        $sLanguagePrefArraySQL = "ARRAY[".join(',', array_map("getDBQuoted", $this->aLangPrefOrder))."]";
+        $sCountryCodesSQL = false;
+        if ($this->aCountryCodes) {
+            $sCountryCodesSQL = join(',', array_map('addQuotes', $this->aCountryCodes));
+        }
+
+        $sQuery = $this->sQuery;
+
+        // Conflicts between US state abreviations and various words for 'the' in different languages
+        if (isset($this->aLangPrefOrder['name:en'])) {
+            $sQuery = preg_replace('/(^|,)\s*il\s*(,|$)/', '\1illinois\2', $sQuery);
+            $sQuery = preg_replace('/(^|,)\s*al\s*(,|$)/', '\1alabama\2', $sQuery);
+            $sQuery = preg_replace('/(^|,)\s*la\s*(,|$)/', '\1louisiana\2', $sQuery);
+        }
+
+        $bBoundingBoxSearch = $this->bBoundedSearch && $this->sViewboxSmallSQL;
+        if ($this->sViewboxCentreSQL) {
+            // For complex viewboxes (routes) precompute the bounding geometry
+            $sGeom = chksql(
+                $this->oDB->getOne("select ".$this->sViewboxSmallSQL),
+                "Could not get small viewbox"
+            );
+            $this->sViewboxSmallSQL = "'".$sGeom."'::geometry";
+
+            $sGeom = chksql(
+                $this->oDB->getOne("select ".$this->sViewboxLargeSQL),
+                "Could not get large viewbox"
+            );
+            $this->sViewboxLargeSQL = "'".$sGeom."'::geometry";
+        }
+
+        // Do we have anything that looks like a lat/lon pair?
+        if ($aLooksLike = looksLikeLatLonPair($sQuery)) {
+            $this->setNearPoint(array($aLooksLike['lat'], $aLooksLike['lon']));
+            $sQuery = $aLooksLike['query'];
+        }
+
+        $aSearchResults = array();
+        if ($sQuery || $this->aStructuredQuery) {
+            // Start with a blank search
+            $aSearches = array(
+                          array(
+                           'iSearchRank' => 0,
+                           'iNamePhrase' => -1,
+                           'sCountryCode' => false,
+                           'aName' => array(),
+                           'aAddress' => array(),
+                           'aFullNameAddress' => array(),
+                           'aNameNonSearch' => array(),
+                           'aAddressNonSearch' => array(),
+                           'sOperator' => '',
+                           'aFeatureName' => array(),
+                           'sClass' => '',
+                           'sType' => '',
+                           'sHouseNumber' => '',
+                           'fLat' => '',
+                           'fLon' => '',
+                           'fRadius' => ''
+                          )
+                         );
+
+            // Do we have a radius search?
+            $sNearPointSQL = false;
+            if ($this->aNearPoint) {
+                $sNearPointSQL = "ST_SetSRID(ST_Point(".(float)$this->aNearPoint[1].",".(float)$this->aNearPoint[0]."),4326)";
+                $aSearches[0]['fLat'] = (float)$this->aNearPoint[0];
+                $aSearches[0]['fLon'] = (float)$this->aNearPoint[1];
+                $aSearches[0]['fRadius'] = (float)$this->aNearPoint[2];
+            }
+
+            // Any 'special' terms in the search?
+            $bSpecialTerms = false;
+            preg_match_all('/\\[(.*)=(.*)\\]/', $sQuery, $aSpecialTermsRaw, PREG_SET_ORDER);
+            $aSpecialTerms = array();
+            foreach ($aSpecialTermsRaw as $aSpecialTerm) {
+                $sQuery = str_replace($aSpecialTerm[0], ' ', $sQuery);
+                $aSpecialTerms[strtolower($aSpecialTerm[1])] = $aSpecialTerm[2];
+            }
+
+            preg_match_all('/\\[([\\w ]*)\\]/u', $sQuery, $aSpecialTermsRaw, PREG_SET_ORDER);
+            $aSpecialTerms = array();
+            if (isset($this->aStructuredQuery['amenity']) && $this->aStructuredQuery['amenity']) {
+                $aSpecialTermsRaw[] = array('['.$this->aStructuredQuery['amenity'].']', $this->aStructuredQuery['amenity']);
+                unset($this->aStructuredQuery['amenity']);
+            }
+
+            foreach ($aSpecialTermsRaw as $aSpecialTerm) {
+                $sQuery = str_replace($aSpecialTerm[0], ' ', $sQuery);
+                $sToken = chksql($this->oDB->getOne("select make_standard_name('".$aSpecialTerm[1]."') as string"));
+                $sSQL = 'select * from (select word_id,word_token, word, class, type, country_code, operator';
+                $sSQL .= ' from word where word_token in (\' '.$sToken.'\')) as x where (class is not null and class not in (\'place\')) or country_code is not null';
+                if (CONST_Debug) var_Dump($sSQL);
+                $aSearchWords = chksql($this->oDB->getAll($sSQL));
+                $aNewSearches = array();
+                foreach ($aSearches as $aSearch) {
+                    foreach ($aSearchWords as $aSearchTerm) {
+                        $aNewSearch = $aSearch;
+                        if ($aSearchTerm['country_code']) {
+                            $aNewSearch['sCountryCode'] = strtolower($aSearchTerm['country_code']);
+                            $aNewSearches[] = $aNewSearch;
+                            $bSpecialTerms = true;
+                        }
+                        if ($aSearchTerm['class']) {
+                            $aNewSearch['sClass'] = $aSearchTerm['class'];
+                            $aNewSearch['sType'] = $aSearchTerm['type'];
+                            $aNewSearches[] = $aNewSearch;
+                            $bSpecialTerms = true;
+                        }
+                    }
+                }
+                $aSearches = $aNewSearches;
+            }
+
+            // Split query into phrases
+            // Commas are used to reduce the search space by indicating where phrases split
+            if ($this->aStructuredQuery) {
+                $aPhrases = $this->aStructuredQuery;
+                $bStructuredPhrases = true;
+            } else {
+                $aPhrases = explode(',', $sQuery);
+                $bStructuredPhrases = false;
+            }
+
+            // Convert each phrase to standard form
+            // Create a list of standard words
+            // Get all 'sets' of words
+            // Generate a complete list of all
+            $aTokens = array();
+            foreach ($aPhrases as $iPhrase => $sPhrase) {
+                $aPhrase = chksql(
+                    $this->oDB->getRow("select make_standard_name('".pg_escape_string($sPhrase)."') as string"),
+                    "Cannot nomralize query string (is it an UTF-8 string?)"
+                );
+                if (trim($aPhrase['string'])) {
+                    $aPhrases[$iPhrase] = $aPhrase;
+                    $aPhrases[$iPhrase]['words'] = explode(' ', $aPhrases[$iPhrase]['string']);
+                    $aPhrases[$iPhrase]['wordsets'] = getWordSets($aPhrases[$iPhrase]['words'], 0);
+                    $aTokens = array_merge($aTokens, getTokensFromSets($aPhrases[$iPhrase]['wordsets']));
+                } else {
+                    unset($aPhrases[$iPhrase]);
+                }
+            }
+
+            // Reindex phrases - we make assumptions later on that they are numerically keyed in order
+            $aPhraseTypes = array_keys($aPhrases);
+            $aPhrases = array_values($aPhrases);
+
+            if (sizeof($aTokens)) {
+                // Check which tokens we have, get the ID numbers
+                $sSQL = 'select word_id,word_token, word, class, type, country_code, operator, search_name_count';
+                $sSQL .= ' from word where word_token in ('.join(',', array_map("getDBQuoted", $aTokens)).')';
+
+                if (CONST_Debug) var_Dump($sSQL);
+
+                $aValidTokens = array();
+                if (sizeof($aTokens)) {
+                    $aDatabaseWords = chksql(
+                        $this->oDB->getAll($sSQL),
+                        "Could not get word tokens."
+                    );
+                } else {
+                    $aDatabaseWords = array();
+                }
+                $aPossibleMainWordIDs = array();
+                $aWordFrequencyScores = array();
+                foreach ($aDatabaseWords as $aToken) {
+                    // Very special case - require 2 letter country param to match the country code found
+                    if ($bStructuredPhrases && $aToken['country_code'] && !empty($this->aStructuredQuery['country'])
+                        && strlen($this->aStructuredQuery['country']) == 2 && strtolower($this->aStructuredQuery['country']) != $aToken['country_code']
+                    ) {
+                        continue;
+                    }
+
+                    if (isset($aValidTokens[$aToken['word_token']])) {
+                        $aValidTokens[$aToken['word_token']][] = $aToken;
+                    } else {
+                        $aValidTokens[$aToken['word_token']] = array($aToken);
+                    }
+                    if (!$aToken['class'] && !$aToken['country_code']) $aPossibleMainWordIDs[$aToken['word_id']] = 1;
+                    $aWordFrequencyScores[$aToken['word_id']] = $aToken['search_name_count'] + 1;
+                }
+                if (CONST_Debug) var_Dump($aPhrases, $aValidTokens);
+
+                // Try and calculate GB postcodes we might be missing
+                foreach ($aTokens as $sToken) {
+                    // Source of gb postcodes is now definitive - always use
+                    if (preg_match('/^([A-Z][A-Z]?[0-9][0-9A-Z]? ?[0-9])([A-Z][A-Z])$/', strtoupper(trim($sToken)), $aData)) {
+                        if (substr($aData[1], -2, 1) != ' ') {
+                            $aData[0] = substr($aData[0], 0, strlen($aData[1])-1).' '.substr($aData[0], strlen($aData[1])-1);
+                            $aData[1] = substr($aData[1], 0, -1).' '.substr($aData[1], -1, 1);
+                        }
+                        $aGBPostcodeLocation = gbPostcodeCalculate($aData[0], $aData[1], $aData[2], $this->oDB);
+                        if ($aGBPostcodeLocation) {
+                            $aValidTokens[$sToken] = $aGBPostcodeLocation;
+                        }
+                    } elseif (!isset($aValidTokens[$sToken]) && preg_match('/^([0-9]{5}) [0-9]{4}$/', $sToken, $aData)) {
+                        // US ZIP+4 codes - if there is no token,
+                        // merge in the 5-digit ZIP code
+                        if (isset($aValidTokens[$aData[1]])) {
+                            foreach ($aValidTokens[$aData[1]] as $aToken) {
+                                if (!$aToken['class']) {
+                                    if (isset($aValidTokens[$sToken])) {
+                                        $aValidTokens[$sToken][] = $aToken;
+                                    } else {
+                                        $aValidTokens[$sToken] = array($aToken);
+                                    }
+                                }
+                            }
+                        }
+                    }
+                }
+
+                foreach ($aTokens as $sToken) {
+                    // Unknown single word token with a number - assume it is a house number
+                    if (!isset($aValidTokens[' '.$sToken]) && strpos($sToken, ' ') === false && preg_match('/[0-9]/', $sToken)) {
+                        $aValidTokens[' '.$sToken] = array(array('class' => 'place', 'type' => 'house'));
+                    }
+                }
+
+                // Any words that have failed completely?
+                // TODO: suggestions
+
+                // Start the search process
+                // array with: placeid => -1 | tiger-housenumber
+                $aResultPlaceIDs = array();
+
+                $aGroupedSearches = $this->getGroupedSearches($aSearches, $aPhraseTypes, $aPhrases, $aValidTokens, $aWordFrequencyScores, $bStructuredPhrases);
+
+                if ($this->bReverseInPlan) {
+                    // Reverse phrase array and also reverse the order of the wordsets in
+                    // the first and final phrase. Don't bother about phrases in the middle
+                    // because order in the address doesn't matter.
+                    $aPhrases = array_reverse($aPhrases);
+                    $aPhrases[0]['wordsets'] = getInverseWordSets($aPhrases[0]['words'], 0);
+                    if (sizeof($aPhrases) > 1) {
+                        $aFinalPhrase = end($aPhrases);
+                        $aPhrases[sizeof($aPhrases)-1]['wordsets'] = getInverseWordSets($aFinalPhrase['words'], 0);
+                    }
+                    $aReverseGroupedSearches = $this->getGroupedSearches($aSearches, null, $aPhrases, $aValidTokens, $aWordFrequencyScores, false);
+
+                    foreach ($aGroupedSearches as $aSearches) {
+                        foreach ($aSearches as $aSearch) {
+                            if ($aSearch['iSearchRank'] < $this->iMaxRank) {
+                                if (!isset($aReverseGroupedSearches[$aSearch['iSearchRank']])) $aReverseGroupedSearches[$aSearch['iSearchRank']] = array();
+                                $aReverseGroupedSearches[$aSearch['iSearchRank']][] = $aSearch;
+                            }
+                        }
+                    }
+
+                    $aGroupedSearches = $aReverseGroupedSearches;
+                    ksort($aGroupedSearches);
+                }
+            } else {
+                // Re-group the searches by their score, junk anything over 20 as just not worth trying
+                $aGroupedSearches = array();
+                foreach ($aSearches as $aSearch) {
+                    if ($aSearch['iSearchRank'] < $this->iMaxRank) {
+                        if (!isset($aGroupedSearches[$aSearch['iSearchRank']])) $aGroupedSearches[$aSearch['iSearchRank']] = array();
+                        $aGroupedSearches[$aSearch['iSearchRank']][] = $aSearch;
+                    }
+                }
+                ksort($aGroupedSearches);
+            }
+
+            if (CONST_Debug) var_Dump($aGroupedSearches);
+            if (CONST_Search_TryDroppedAddressTerms && sizeof($this->aStructuredQuery) > 0) {
+                $aCopyGroupedSearches = $aGroupedSearches;
+                foreach ($aCopyGroupedSearches as $iGroup => $aSearches) {
+                    foreach ($aSearches as $iSearch => $aSearch) {
+                        $aReductionsList = array($aSearch['aAddress']);
+                        $iSearchRank = $aSearch['iSearchRank'];
+                        while (sizeof($aReductionsList) > 0) {
+                            $iSearchRank += 5;
+                            if ($iSearchRank > iMaxRank) break 3;
+                            $aNewReductionsList = array();
+                            foreach ($aReductionsList as $aReductionsWordList) {
+                                for ($iReductionWord = 0; $iReductionWord < sizeof($aReductionsWordList); $iReductionWord++) {
+                                    $aReductionsWordListResult = array_merge(array_slice($aReductionsWordList, 0, $iReductionWord), array_slice($aReductionsWordList, $iReductionWord+1));
+                                    $aReverseSearch = $aSearch;
+                                    $aSearch['aAddress'] = $aReductionsWordListResult;
+                                    $aSearch['iSearchRank'] = $iSearchRank;
+                                    $aGroupedSearches[$iSearchRank][] = $aReverseSearch;
+                                    if (sizeof($aReductionsWordListResult) > 0) {
+                                        $aNewReductionsList[] = $aReductionsWordListResult;
+                                    }
+                                }
+                            }
+                            $aReductionsList = $aNewReductionsList;
+                        }
+                    }
+                }
+                ksort($aGroupedSearches);
+            }
+
+            // Filter out duplicate searches
+            $aSearchHash = array();
+            foreach ($aGroupedSearches as $iGroup => $aSearches) {
+                foreach ($aSearches as $iSearch => $aSearch) {
+                    $sHash = serialize($aSearch);
+                    if (isset($aSearchHash[$sHash])) {
+                        unset($aGroupedSearches[$iGroup][$iSearch]);
+                        if (sizeof($aGroupedSearches[$iGroup]) == 0) unset($aGroupedSearches[$iGroup]);
+                    } else {
+                        $aSearchHash[$sHash] = 1;
+                    }
+                }
+            }
+
+            if (CONST_Debug) _debugDumpGroupedSearches($aGroupedSearches, $aValidTokens);
+
+            $iGroupLoop = 0;
+            $iQueryLoop = 0;
+            foreach ($aGroupedSearches as $iGroupedRank => $aSearches) {
+                $iGroupLoop++;
+                foreach ($aSearches as $aSearch) {
+                    $iQueryLoop++;
+                    $searchedHousenumber = -1;
+
+                    if (CONST_Debug) echo "<hr><b>Search Loop, group $iGroupLoop, loop $iQueryLoop</b>";
+                    if (CONST_Debug) _debugDumpGroupedSearches(array($iGroupedRank => array($aSearch)), $aValidTokens);
+
+                    // No location term?
+                    if (!sizeof($aSearch['aName']) && !sizeof($aSearch['aAddress']) && !$aSearch['fLon']) {
+                        if ($aSearch['sCountryCode'] && !$aSearch['sClass'] && !$aSearch['sHouseNumber']) {
+                            // Just looking for a country by code - look it up
+                            if (4 >= $this->iMinAddressRank && 4 <= $this->iMaxAddressRank) {
+                                $sSQL = "select place_id from placex where calculated_country_code='".$aSearch['sCountryCode']."' and rank_search = 4";
+                                if ($sCountryCodesSQL) $sSQL .= " and calculated_country_code in ($sCountryCodesSQL)";
+                                if ($bBoundingBoxSearch)
+                                    $sSQL .= " and _st_intersects($this->sViewboxSmallSQL, geometry)";
+                                $sSQL .= " order by st_area(geometry) desc limit 1";
+                                if (CONST_Debug) var_dump($sSQL);
+                                $aPlaceIDs = chksql($this->oDB->getCol($sSQL));
+                            } else {
+                                $aPlaceIDs = array();
+                            }
+                        } else {
+                            if (!$bBoundingBoxSearch && !$aSearch['fLon']) continue;
+                            if (!$aSearch['sClass']) continue;
+
+                            $sSQL = "select count(*) from pg_tables where tablename = 'place_classtype_".$aSearch['sClass']."_".$aSearch['sType']."'";
+                            if (chksql($this->oDB->getOne($sSQL))) {
+                                $sSQL = "select place_id from place_classtype_".$aSearch['sClass']."_".$aSearch['sType']." ct";
+                                if ($sCountryCodesSQL) $sSQL .= " join placex using (place_id)";
+                                $sSQL .= " where st_contains($this->sViewboxSmallSQL, ct.centroid)";
+                                if ($sCountryCodesSQL) $sSQL .= " and calculated_country_code in ($sCountryCodesSQL)";
+                                if (sizeof($this->aExcludePlaceIDs)) {
+                                    $sSQL .= " and place_id not in (".join(',', $this->aExcludePlaceIDs).")";
+                                }
+                                if ($this->sViewboxCentreSQL) $sSQL .= " order by st_distance($this->sViewboxCentreSQL, ct.centroid) asc";
+                                $sSQL .= " limit $this->iLimit";
+                                if (CONST_Debug) var_dump($sSQL);
+                                $aPlaceIDs = chksql($this->oDB->getCol($sSQL));
+
+                                // If excluded place IDs are given, it is fair to assume that
+                                // there have been results in the small box, so no further
+                                // expansion in that case.
+                                // Also don't expand if bounded results were requested.
+                                if (!sizeof($aPlaceIDs) && !sizeof($this->aExcludePlaceIDs) && !$this->bBoundedSearch) {
+                                    $sSQL = "select place_id from place_classtype_".$aSearch['sClass']."_".$aSearch['sType']." ct";
+                                    if ($sCountryCodesSQL) $sSQL .= " join placex using (place_id)";
+                                    $sSQL .= " where st_contains($this->sViewboxLargeSQL, ct.centroid)";
+                                    if ($sCountryCodesSQL) $sSQL .= " and calculated_country_code in ($sCountryCodesSQL)";
+                                    if ($this->sViewboxCentreSQL) $sSQL .= " order by st_distance($this->sViewboxCentreSQL, ct.centroid) asc";
+                                    $sSQL .= " limit $this->iLimit";
+                                    if (CONST_Debug) var_dump($sSQL);
+                                    $aPlaceIDs = chksql($this->oDB->getCol($sSQL));
+                                }
+                            } else {
+                                $sSQL = "select place_id from placex where class='".$aSearch['sClass']."' and type='".$aSearch['sType']."'";
+                                $sSQL .= " and st_contains($this->sViewboxSmallSQL, geometry) and linked_place_id is null";
+                                if ($sCountryCodesSQL) $sSQL .= " and calculated_country_code in ($sCountryCodesSQL)";
+                                if ($this->sViewboxCentreSQL)   $sSQL .= " order by st_distance($this->sViewboxCentreSQL, centroid) asc";
+                                $sSQL .= " limit $this->iLimit";
+                                if (CONST_Debug) var_dump($sSQL);
+                                $aPlaceIDs = chksql($this->oDB->getCol($sSQL));
+                            }
+                        }
+                    } elseif ($aSearch['fLon'] && !sizeof($aSearch['aName']) && !sizeof($aSearch['aAddress']) && !$aSearch['sClass']) {
+                        // If a coordinate is given, the search must either
+                        // be for a name or a special search. Ignore everythin else.
+                        $aPlaceIDs = array();
+                    } else {
+                        $aPlaceIDs = array();
+
+                        // First we need a position, either aName or fLat or both
+                        $aTerms = array();
+                        $aOrder = array();
+
+                        if ($aSearch['sHouseNumber'] && sizeof($aSearch['aAddress'])) {
+                            $sHouseNumberRegex = '\\\\m'.$aSearch['sHouseNumber'].'\\\\M';
+                            $aOrder[] = "";
+                            $aOrder[0] = " (exists(select place_id from placex where parent_place_id = search_name.place_id";
+                            $aOrder[0] .= " and transliteration(housenumber) ~* E'".$sHouseNumberRegex."' limit 1) ";
+                            // also housenumbers from interpolation lines table are needed
+                            $aOrder[0] .= " or exists(select place_id from location_property_osmline where parent_place_id = search_name.place_id";
+                            $aOrder[0] .= " and ".intval($aSearch['sHouseNumber']).">=startnumber and ".intval($aSearch['sHouseNumber'])."<=endnumber limit 1))";
+                            $aOrder[0] .= " desc";
+                        }
+
+                        // TODO: filter out the pointless search terms (2 letter name tokens and less)
+                        // they might be right - but they are just too darned expensive to run
+                        if (sizeof($aSearch['aName'])) $aTerms[] = "name_vector @> ARRAY[".join($aSearch['aName'], ",")."]";
+                        //if (sizeof($aSearch['aNameNonSearch'])) $aTerms[] = "array_cat(name_vector,ARRAY[]::integer[]) @> ARRAY[".join($aSearch['aNameNonSearch'], ",")."]";
+                        if (sizeof($aSearch['aAddress']) && $aSearch['aName'] != $aSearch['aAddress']) {
+                            // For infrequent name terms disable index usage for address
+                            if (CONST_Search_NameOnlySearchFrequencyThreshold
+                                && sizeof($aSearch['aName']) == 1
+                                && $aWordFrequencyScores[$aSearch['aName'][reset($aSearch['aName'])]] < CONST_Search_NameOnlySearchFrequencyThreshold
+                            ) {
+                                //$aTerms[] = "array_cat(nameaddress_vector,ARRAY[]::integer[]) @> ARRAY[".join(array_merge($aSearch['aAddress'], $aSearch['aAddressNonSearch']), ",")."]";
+                            } else {
+                                $aTerms[] = "nameaddress_vector @> ARRAY[".join($aSearch['aAddress'], ",")."]";
+                                /*if (sizeof($aSearch['aAddressNonSearch'])) {
+                                    $aTerms[] = "array_cat(nameaddress_vector,ARRAY[]::integer[]) @> ARRAY[".join($aSearch['aAddressNonSearch'], ",")."]";
+                                }*/
+                            }
+                        }
+                        if ($aSearch['sCountryCode']) $aTerms[] = "country_code = '".pg_escape_string($aSearch['sCountryCode'])."'";
+                        if ($aSearch['sHouseNumber']) {
+                            $aTerms[] = "address_rank between 16 and 27";
+                        } else {
+                            if ($this->iMinAddressRank > 0) {
+                                $aTerms[] = "address_rank >= ".$this->iMinAddressRank;
+                            }
+                            if ($this->iMaxAddressRank < 30) {
+                                $aTerms[] = "address_rank <= ".$this->iMaxAddressRank;
+                            }
+                        }
+                        if ($aSearch['fLon'] && $aSearch['fLat']) {
+                            $aTerms[] = "ST_DWithin(centroid, ST_SetSRID(ST_Point(".$aSearch['fLon'].",".$aSearch['fLat']."),4326), ".$aSearch['fRadius'].")";
+                            $aOrder[] = "ST_Distance(centroid, ST_SetSRID(ST_Point(".$aSearch['fLon'].",".$aSearch['fLat']."),4326)) ASC";
+                        }
+                        if (sizeof($this->aExcludePlaceIDs)) {
+                            $aTerms[] = "place_id not in (".join(',', $this->aExcludePlaceIDs).")";
+                        }
+                        if ($sCountryCodesSQL) {
+                            $aTerms[] = "country_code in ($sCountryCodesSQL)";
+                        }
+
+                        if ($bBoundingBoxSearch) $aTerms[] = "centroid && $this->sViewboxSmallSQL";
+                        if ($sNearPointSQL) $aOrder[] = "ST_Distance($sNearPointSQL, centroid) asc";
+
+                        if ($aSearch['sHouseNumber']) {
+                            $sImportanceSQL = '- abs(26 - address_rank) + 3';
+                        } else {
+                            $sImportanceSQL = '(case when importance = 0 OR importance IS NULL then 0.75-(search_rank::float/40) else importance end)';
+                        }
+                        if ($this->sViewboxSmallSQL) $sImportanceSQL .= " * case when ST_Contains($this->sViewboxSmallSQL, centroid) THEN 1 ELSE 0.5 END";
+                        if ($this->sViewboxLargeSQL) $sImportanceSQL .= " * case when ST_Contains($this->sViewboxLargeSQL, centroid) THEN 1 ELSE 0.5 END";
+
+                        $aOrder[] = "$sImportanceSQL DESC";
+                        if (sizeof($aSearch['aFullNameAddress'])) {
+                            $sExactMatchSQL = '(select count(*) from (select unnest(ARRAY['.join($aSearch['aFullNameAddress'], ",").']) INTERSECT select unnest(nameaddress_vector))s) as exactmatch';
+                            $aOrder[] = 'exactmatch DESC';
+                        } else {
+                            $sExactMatchSQL = '0::int as exactmatch';
+                        }
+
+                        if (sizeof($aTerms)) {
+                            $sSQL = "select place_id, ";
+                            $sSQL .= $sExactMatchSQL;
+                            $sSQL .= " from search_name";
+                            $sSQL .= " where ".join(' and ', $aTerms);
+                            $sSQL .= " order by ".join(', ', $aOrder);
+                            if ($aSearch['sHouseNumber'] || $aSearch['sClass']) {
+                                $sSQL .= " limit 20";
+                            } elseif (!sizeof($aSearch['aName']) && !sizeof($aSearch['aAddress']) && $aSearch['sClass']) {
+                                $sSQL .= " limit 1";
+                            } else {
+                                $sSQL .= " limit ".$this->iLimit;
+                            }
+
+                            if (CONST_Debug) var_dump($sSQL);
+                            $aViewBoxPlaceIDs = chksql(
+                                $this->oDB->getAll($sSQL),
+                                "Could not get places for search terms."
+                            );
+                            //var_dump($aViewBoxPlaceIDs);
+                            // Did we have an viewbox matches?
+                            $aPlaceIDs = array();
+                            $bViewBoxMatch = false;
+                            foreach ($aViewBoxPlaceIDs as $aViewBoxRow) {
+                                //if ($bViewBoxMatch == 1 && $aViewBoxRow['in_small'] == 'f') break;
+                                //if ($bViewBoxMatch == 2 && $aViewBoxRow['in_large'] == 'f') break;
+                                //if ($aViewBoxRow['in_small'] == 't') $bViewBoxMatch = 1;
+                                //else if ($aViewBoxRow['in_large'] == 't') $bViewBoxMatch = 2;
+                                $aPlaceIDs[] = $aViewBoxRow['place_id'];
+                                $this->exactMatchCache[$aViewBoxRow['place_id']] = $aViewBoxRow['exactmatch'];
+                            }
+                        }
+                        //var_Dump($aPlaceIDs);
+                        //exit;
+
+                        //now search for housenumber, if housenumber provided
+                        if ($aSearch['sHouseNumber'] && sizeof($aPlaceIDs)) {
+                            $searchedHousenumber = intval($aSearch['sHouseNumber']);
+                            $aRoadPlaceIDs = $aPlaceIDs;
+                            $sPlaceIDs = join(',', $aPlaceIDs);
+
+                            // Now they are indexed, look for a house attached to a street we found
+                            $sHouseNumberRegex = '\\\\m'.$aSearch['sHouseNumber'].'\\\\M';
+                            $sSQL = "select place_id from placex where parent_place_id in (".$sPlaceIDs.") and transliteration(housenumber) ~* E'".$sHouseNumberRegex."'";
+                            if (sizeof($this->aExcludePlaceIDs)) {
+                                $sSQL .= " and place_id not in (".join(',', $this->aExcludePlaceIDs).")";
+                            }
+                            $sSQL .= " limit $this->iLimit";
+                            if (CONST_Debug) var_dump($sSQL);
+                            $aPlaceIDs = chksql($this->oDB->getCol($sSQL));
+                            
+                            // if nothing found, search in the interpolation line table
+                            if (!sizeof($aPlaceIDs)) {
+                                // do we need to use transliteration and the regex for housenumbers???
+                                //new query for lines, not housenumbers anymore
+                                if ($searchedHousenumber%2 == 0) {
+                                    //if housenumber is even, look for housenumber in streets with interpolationtype even or all
+                                    $sSQL = "select distinct place_id from location_property_osmline where parent_place_id in (".$sPlaceIDs.") and (interpolationtype='even' or interpolationtype='all') and ".$searchedHousenumber.">=startnumber and ".$searchedHousenumber."<=endnumber";
+                                } else {
+                                    //look for housenumber in streets with interpolationtype odd or all
+                                    $sSQL = "select distinct place_id from location_property_osmline where parent_place_id in (".$sPlaceIDs.") and (interpolationtype='odd' or interpolationtype='all') and ".$searchedHousenumber.">=startnumber and ".$searchedHousenumber."<=endnumber";
+                                }
+
+                                if (sizeof($this->aExcludePlaceIDs)) {
+                                    $sSQL .= " and place_id not in (".join(',', $this->aExcludePlaceIDs).")";
+                                }
+                                //$sSQL .= " limit $this->iLimit";
+                                if (CONST_Debug) var_dump($sSQL);
+                                //get place IDs
+                                $aPlaceIDs = chksql($this->oDB->getCol($sSQL, 0));
+                            }
+                                
+                            // If nothing found try the aux fallback table
+                            if (CONST_Use_Aux_Location_data && !sizeof($aPlaceIDs)) {
+                                $sSQL = "select place_id from location_property_aux where parent_place_id in (".$sPlaceIDs.") and housenumber = '".pg_escape_string($aSearch['sHouseNumber'])."'";
+                                if (sizeof($this->aExcludePlaceIDs)) {
+                                    $sSQL .= " and parent_place_id not in (".join(',', $this->aExcludePlaceIDs).")";
+                                }
+                                //$sSQL .= " limit $this->iLimit";
+                                if (CONST_Debug) var_dump($sSQL);
+                                $aPlaceIDs = chksql($this->oDB->getCol($sSQL));
+                            }
+
+                            //if nothing was found in placex or location_property_aux, then search in Tiger data for this housenumber(location_property_tiger)
+                            if (CONST_Use_US_Tiger_Data && !sizeof($aPlaceIDs)) {
+                                //new query for lines, not housenumbers anymore
+                                if ($searchedHousenumber%2 == 0) {
+                                    //if housenumber is even, look for housenumber in streets with interpolationtype even or all
+                                    $sSQL = "select distinct place_id from location_property_tiger where parent_place_id in (".$sPlaceIDs.") and (interpolationtype='even' or interpolationtype='all') and ".$searchedHousenumber.">=startnumber and ".$searchedHousenumber."<=endnumber";
+                                } else {
+                                    //look for housenumber in streets with interpolationtype odd or all
+                                    $sSQL = "select distinct place_id from location_property_tiger where parent_place_id in (".$sPlaceIDs.") and (interpolationtype='odd' or interpolationtype='all') and ".$searchedHousenumber.">=startnumber and ".$searchedHousenumber."<=endnumber";
+                                }
+
+                                if (sizeof($this->aExcludePlaceIDs)) {
+                                    $sSQL .= " and place_id not in (".join(',', $this->aExcludePlaceIDs).")";
+                                }
+                                //$sSQL .= " limit $this->iLimit";
+                                if (CONST_Debug) var_dump($sSQL);
+                                //get place IDs
+                                $aPlaceIDs = chksql($this->oDB->getCol($sSQL, 0));
+                            }
+
+                            // Fallback to the road (if no housenumber was found)
+                            if (!sizeof($aPlaceIDs) && preg_match('/[0-9]+/', $aSearch['sHouseNumber'])) {
+                                $aPlaceIDs = $aRoadPlaceIDs;
+                                //set to -1, if no housenumbers were found
+                                $searchedHousenumber = -1;
+                            }
+                            //else: housenumber was found, remains saved in searchedHousenumber
+                        }
+
+
+                        if ($aSearch['sClass'] && sizeof($aPlaceIDs)) {
+                            $sPlaceIDs = join(',', $aPlaceIDs);
+                            $aClassPlaceIDs = array();
+
+                            if (!$aSearch['sOperator'] || $aSearch['sOperator'] == 'name') {
+                                // If they were searching for a named class (i.e. 'Kings Head pub') then we might have an extra match
+                                $sSQL = "select place_id from placex where place_id in ($sPlaceIDs) and class='".$aSearch['sClass']."' and type='".$aSearch['sType']."'";
+                                $sSQL .= " and linked_place_id is null";
+                                if ($sCountryCodesSQL) $sSQL .= " and calculated_country_code in ($sCountryCodesSQL)";
+                                $sSQL .= " order by rank_search asc limit $this->iLimit";
+                                if (CONST_Debug) var_dump($sSQL);
+                                $aClassPlaceIDs = chksql($this->oDB->getCol($sSQL));
+                            }
+
+                            if (!$aSearch['sOperator'] || $aSearch['sOperator'] == 'near') { // & in
+                                $sSQL = "select count(*) from pg_tables where tablename = 'place_classtype_".$aSearch['sClass']."_".$aSearch['sType']."'";
+                                $bCacheTable = chksql($this->oDB->getOne($sSQL));
+
+                                $sSQL = "select min(rank_search) from placex where place_id in ($sPlaceIDs)";
+
+                                if (CONST_Debug) var_dump($sSQL);
+                                $this->iMaxRank = ((int)chksql($this->oDB->getOne($sSQL)));
+
+                                // For state / country level searches the normal radius search doesn't work very well
+                                $sPlaceGeom = false;
+                                if ($this->iMaxRank < 9 && $bCacheTable) {
+                                    // Try and get a polygon to search in instead
+                                    $sSQL = "select geometry from placex where place_id in ($sPlaceIDs) and rank_search < $this->iMaxRank + 5 and st_geometrytype(geometry) in ('ST_Polygon','ST_MultiPolygon') order by rank_search asc limit 1";
+                                    if (CONST_Debug) var_dump($sSQL);
+                                    $sPlaceGeom = chksql($this->oDB->getOne($sSQL));
+                                }
+
+                                if ($sPlaceGeom) {
+                                    $sPlaceIDs = false;
+                                } else {
+                                    $this->iMaxRank += 5;
+                                    $sSQL = "select place_id from placex where place_id in ($sPlaceIDs) and rank_search < $this->iMaxRank";
+                                    if (CONST_Debug) var_dump($sSQL);
+                                    $aPlaceIDs = chksql($this->oDB->getCol($sSQL));
+                                    $sPlaceIDs = join(',', $aPlaceIDs);
+                                }
+
+                                if ($sPlaceIDs || $sPlaceGeom) {
+                                    $fRange = 0.01;
+                                    if ($bCacheTable) {
+                                        // More efficient - can make the range bigger
+                                        $fRange = 0.05;
+
+                                        $sOrderBySQL = '';
+                                        if ($sNearPointSQL) $sOrderBySQL = "ST_Distance($sNearPointSQL, l.centroid)";
+                                        elseif ($sPlaceIDs) $sOrderBySQL = "ST_Distance(l.centroid, f.geometry)";
+                                        elseif ($sPlaceGeom) $sOrderBysSQL = "ST_Distance(st_centroid('".$sPlaceGeom."'), l.centroid)";
+
+                                        $sSQL = "select distinct l.place_id".($sOrderBySQL?','.$sOrderBySQL:'')." from place_classtype_".$aSearch['sClass']."_".$aSearch['sType']." as l";
+                                        if ($sCountryCodesSQL) $sSQL .= " join placex as lp using (place_id)";
+                                        if ($sPlaceIDs) {
+                                            $sSQL .= ",placex as f where ";
+                                            $sSQL .= "f.place_id in ($sPlaceIDs) and ST_DWithin(l.centroid, f.centroid, $fRange) ";
+                                        }
+                                        if ($sPlaceGeom) {
+                                            $sSQL .= " where ";
+                                            $sSQL .= "ST_Contains('".$sPlaceGeom."', l.centroid) ";
+                                        }
+                                        if (sizeof($this->aExcludePlaceIDs)) {
+                                            $sSQL .= " and l.place_id not in (".join(',', $this->aExcludePlaceIDs).")";
+                                        }
+                                        if ($sCountryCodesSQL) $sSQL .= " and lp.calculated_country_code in ($sCountryCodesSQL)";
+                                        if ($sOrderBySQL) $sSQL .= "order by ".$sOrderBySQL." asc";
+                                        if ($this->iOffset) $sSQL .= " offset $this->iOffset";
+                                        $sSQL .= " limit $this->iLimit";
+                                        if (CONST_Debug) var_dump($sSQL);
+                                        $aClassPlaceIDs = array_merge($aClassPlaceIDs, chksql($this->oDB->getCol($sSQL)));
+                                    } else {
+                                        if (isset($aSearch['fRadius']) && $aSearch['fRadius']) $fRange = $aSearch['fRadius'];
+
+                                        $sOrderBySQL = '';
+                                        if ($sNearPointSQL) $sOrderBySQL = "ST_Distance($sNearPointSQL, l.geometry)";
+                                        else $sOrderBySQL = "ST_Distance(l.geometry, f.geometry)";
+
+                                        $sSQL = "select distinct l.place_id".($sOrderBysSQL?','.$sOrderBysSQL:'')." from placex as l,placex as f where ";
+                                        $sSQL .= "f.place_id in ( $sPlaceIDs) and ST_DWithin(l.geometry, f.centroid, $fRange) ";
+                                        $sSQL .= "and l.class='".$aSearch['sClass']."' and l.type='".$aSearch['sType']."' ";
+                                        if (sizeof($this->aExcludePlaceIDs)) {
+                                            $sSQL .= " and l.place_id not in (".join(',', $this->aExcludePlaceIDs).")";
+                                        }
+                                        if ($sCountryCodesSQL) $sSQL .= " and l.calculated_country_code in ($sCountryCodesSQL)";
+                                        if ($sOrderBy) $sSQL .= "order by ".$OrderBysSQL." asc";
+                                        if ($this->iOffset) $sSQL .= " offset $this->iOffset";
+                                        $sSQL .= " limit $this->iLimit";
+                                        if (CONST_Debug) var_dump($sSQL);
+                                        $aClassPlaceIDs = array_merge($aClassPlaceIDs, chksql($this->oDB->getCol($sSQL)));
+                                    }
+                                }
+                            }
+                            $aPlaceIDs = $aClassPlaceIDs;
+                        }
+                    }
+
+                    if (CONST_Debug) {
+                        echo "<br><b>Place IDs:</b> ";
+                        var_Dump($aPlaceIDs);
+                    }
+
+                    foreach ($aPlaceIDs as $iPlaceID) {
+                        // array for placeID => -1 | Tiger housenumber
+                        $aResultPlaceIDs[$iPlaceID] = $searchedHousenumber;
+                    }
+                    if ($iQueryLoop > 20) break;
+                }
+
+                if (isset($aResultPlaceIDs) && sizeof($aResultPlaceIDs) && ($this->iMinAddressRank != 0 || $this->iMaxAddressRank != 30)) {
+                    // Need to verify passes rank limits before dropping out of the loop (yuk!)
+                    // reduces the number of place ids, like a filter
+                    // rank_address is 30 for interpolated housenumbers
+                    $sSQL = "select place_id from placex where place_id in (".join(',', array_keys($aResultPlaceIDs)).") ";
+                    $sSQL .= "and (placex.rank_address between $this->iMinAddressRank and $this->iMaxAddressRank ";
+                    if (14 >= $this->iMinAddressRank && 14 <= $this->iMaxAddressRank) $sSQL .= " OR (extratags->'place') = 'city'";
+                    if ($this->aAddressRankList) $sSQL .= " OR placex.rank_address in (".join(',', $this->aAddressRankList).")";
+                    if (CONST_Use_US_Tiger_Data) {
+                        $sSQL .= ") UNION select place_id from location_property_tiger where place_id in (".join(',', array_keys($aResultPlaceIDs)).") ";
+                        $sSQL .= "and (30 between $this->iMinAddressRank and $this->iMaxAddressRank ";
+                        if ($this->aAddressRankList) $sSQL .= " OR 30 in (".join(',', $this->aAddressRankList).")";
+                    }
+                    $sSQL .= ") UNION select place_id from location_property_osmline where place_id in (".join(',', array_keys($aResultPlaceIDs)).")";
+                    $sSQL .= " and (30 between $this->iMinAddressRank and $this->iMaxAddressRank)";
+                    if (CONST_Debug) var_dump($sSQL);
+                    $aFilteredPlaceIDs = chksql($this->oDB->getCol($sSQL));
+                    $tempIDs = array();
+                    foreach ($aFilteredPlaceIDs as $placeID) {
+                        $tempIDs[$placeID] = $aResultPlaceIDs[$placeID];  //assign housenumber to placeID
+                    }
+                    $aResultPlaceIDs = $tempIDs;
+                }
+
+                //exit;
+                if (isset($aResultPlaceIDs) && sizeof($aResultPlaceIDs)) break;
+                if ($iGroupLoop > 4) break;
+                if ($iQueryLoop > 30) break;
+            }
+
+            // Did we find anything?
+            if (isset($aResultPlaceIDs) && sizeof($aResultPlaceIDs)) {
+                $aSearchResults = $this->getDetails($aResultPlaceIDs);
+            }
+        } else {
+            // Just interpret as a reverse geocode
+            $oReverse = new Nominatim\ReverseGeocode($this->oDB);
+            $oReverse->setZoom(18);
+
+            $aLookup = $oReverse->lookup(
+                (float)$this->aNearPoint[0],
+                (float)$this->aNearPoint[1],
+                false
+            );
+
+            if (CONST_Debug) var_dump("Reverse search", $aLookup);
+
+            if ($aLookup['place_id']) {
+                $aSearchResults = $this->getDetails(array($aLookup['place_id'] => -1));
+            } else {
+                $aSearchResults = array();
+            }
+        }
+
+        // No results? Done
+        if (!sizeof($aSearchResults)) {
+            if ($this->bFallback) {
+                if ($this->fallbackStructuredQuery()) {
+                    return $this->lookup();
+                }
+            }
+
+            return array();
+        }
+
+        $aClassType = getClassTypesWithImportance();
+        $aRecheckWords = preg_split('/\b[\s,\\-]*/u', $sQuery);
+        foreach ($aRecheckWords as $i => $sWord) {
+            if (!preg_match('/\pL/', $sWord)) unset($aRecheckWords[$i]);
+        }
+
+        if (CONST_Debug) {
+            echo '<i>Recheck words:<\i>';
+            var_dump($aRecheckWords);
+        }
+
+        $oPlaceLookup = new PlaceLookup($this->oDB);
+        $oPlaceLookup->setIncludePolygonAsPoints($this->bIncludePolygonAsPoints);
+        $oPlaceLookup->setIncludePolygonAsText($this->bIncludePolygonAsText);
+        $oPlaceLookup->setIncludePolygonAsGeoJSON($this->bIncludePolygonAsGeoJSON);
+        $oPlaceLookup->setIncludePolygonAsKML($this->bIncludePolygonAsKML);
+        $oPlaceLookup->setIncludePolygonAsSVG($this->bIncludePolygonAsSVG);
+        $oPlaceLookup->setPolygonSimplificationThreshold($this->fPolygonSimplificationThreshold);
+
+        foreach ($aSearchResults as $iResNum => $aResult) {
+            // Default
+            $fDiameter = getResultDiameter($aResult);
+
+            $aOutlineResult = $oPlaceLookup->getOutlines($aResult['place_id'], $aResult['lon'], $aResult['lat'], $fDiameter/2);
+            if ($aOutlineResult) {
+                $aResult = array_merge($aResult, $aOutlineResult);
+            }
+            
+            if ($aResult['extra_place'] == 'city') {
+                $aResult['class'] = 'place';
+                $aResult['type'] = 'city';
+                $aResult['rank_search'] = 16;
+            }
+
+            // Is there an icon set for this type of result?
+            if (isset($aClassType[$aResult['class'].':'.$aResult['type']]['icon'])
+                && $aClassType[$aResult['class'].':'.$aResult['type']]['icon']
+            ) {
+                $aResult['icon'] = CONST_Website_BaseURL.'images/mapicons/'.$aClassType[$aResult['class'].':'.$aResult['type']]['icon'].'.p.20.png';
+            }
+
+            if (isset($aClassType[$aResult['class'].':'.$aResult['type'].':'.$aResult['admin_level']]['label'])
+                && $aClassType[$aResult['class'].':'.$aResult['type'].':'.$aResult['admin_level']]['label']
+            ) {
+                $aResult['label'] = $aClassType[$aResult['class'].':'.$aResult['type'].':'.$aResult['admin_level']]['label'];
+            } elseif (isset($aClassType[$aResult['class'].':'.$aResult['type']]['label'])
+                && $aClassType[$aResult['class'].':'.$aResult['type']]['label']
+            ) {
+                $aResult['label'] = $aClassType[$aResult['class'].':'.$aResult['type']]['label'];
+            }
+            // if tag '&addressdetails=1' is set in query
+            if ($this->bIncludeAddressDetails) {
+                // getAddressDetails() is defined in lib.php and uses the SQL function get_addressdata in functions.sql
+                $aResult['address'] = getAddressDetails($this->oDB, $sLanguagePrefArraySQL, $aResult['place_id'], $aResult['country_code'], $aResultPlaceIDs[$aResult['place_id']]);
+                if ($aResult['extra_place'] == 'city' && !isset($aResult['address']['city'])) {
+                    $aResult['address'] = array_merge(array('city' => array_shift(array_values($aResult['address']))), $aResult['address']);
+                }
+            }
+
+            if ($this->bIncludeExtraTags) {
+                if ($aResult['extra']) {
+                    $aResult['sExtraTags'] = json_decode($aResult['extra']);
+                } else {
+                    $aResult['sExtraTags'] = (object) array();
+                }
+            }
+
+            if ($this->bIncludeNameDetails) {
+                if ($aResult['names']) {
+                    $aResult['sNameDetails'] = json_decode($aResult['names']);
+                } else {
+                    $aResult['sNameDetails'] = (object) array();
+                }
+            }
+
+            // Adjust importance for the number of exact string matches in the result
+            $aResult['importance'] = max(0.001, $aResult['importance']);
+            $iCountWords = 0;
+            $sAddress = $aResult['langaddress'];
+            foreach ($aRecheckWords as $i => $sWord) {
+                if (stripos($sAddress, $sWord)!==false) {
+                    $iCountWords++;
+                    if (preg_match("/(^|,)\s*".preg_quote($sWord, '/')."\s*(,|$)/", $sAddress)) $iCountWords += 0.1;
+                }
+            }
+
+            $aResult['importance'] = $aResult['importance'] + ($iCountWords*0.1); // 0.1 is a completely arbitrary number but something in the range 0.1 to 0.5 would seem right
+
+            $aResult['name'] = $aResult['langaddress'];
+            // secondary ordering (for results with same importance (the smaller the better):
+            // - approximate importance of address parts
+            $aResult['foundorder'] = -$aResult['addressimportance']/10;
+            // - number of exact matches from the query
+            if (isset($this->exactMatchCache[$aResult['place_id']])) {
+                $aResult['foundorder'] -= $this->exactMatchCache[$aResult['place_id']];
+            } elseif (isset($this->exactMatchCache[$aResult['parent_place_id']])) {
+                $aResult['foundorder'] -= $this->exactMatchCache[$aResult['parent_place_id']];
+            }
+            // - importance of the class/type
+            if (isset($aClassType[$aResult['class'].':'.$aResult['type']]['importance'])
+                && $aClassType[$aResult['class'].':'.$aResult['type']]['importance']
+            ) {
+                $aResult['foundorder'] += 0.0001 * $aClassType[$aResult['class'].':'.$aResult['type']]['importance'];
+            } else {
+                $aResult['foundorder'] += 0.01;
+            }
+            if (CONST_Debug) var_dump($aResult);
+            $aSearchResults[$iResNum] = $aResult;
+        }
+        uasort($aSearchResults, 'byImportance');
+
+        $aOSMIDDone = array();
+        $aClassTypeNameDone = array();
+        $aToFilter = $aSearchResults;
+        $aSearchResults = array();
+
+        $bFirst = true;
+        foreach ($aToFilter as $iResNum => $aResult) {
+            $this->aExcludePlaceIDs[$aResult['place_id']] = $aResult['place_id'];
+            if ($bFirst) {
+                $fLat = $aResult['lat'];
+                $fLon = $aResult['lon'];
+                if (isset($aResult['zoom'])) $iZoom = $aResult['zoom'];
+                $bFirst = false;
+            }
+            if (!$this->bDeDupe || (!isset($aOSMIDDone[$aResult['osm_type'].$aResult['osm_id']])
+                && !isset($aClassTypeNameDone[$aResult['osm_type'].$aResult['class'].$aResult['type'].$aResult['name'].$aResult['admin_level']]))
+            ) {
+                $aOSMIDDone[$aResult['osm_type'].$aResult['osm_id']] = true;
+                $aClassTypeNameDone[$aResult['osm_type'].$aResult['class'].$aResult['type'].$aResult['name'].$aResult['admin_level']] = true;
+                $aSearchResults[] = $aResult;
+            }
+
+            // Absolute limit on number of results
+            if (sizeof($aSearchResults) >= $this->iFinalLimit) break;
+        }
+
+        return $aSearchResults;
+    } // end lookup()
+} // end class
diff --git a/lib/ParameterParser.php b/lib/ParameterParser.php
new file mode 100644 (file)
index 0000000..5177a08
--- /dev/null
@@ -0,0 +1,120 @@
+<?php
+
+namespace Nominatim;
+
+class ParameterParser
+{
+    private $aParams;
+
+
+    public function __construct($aParams = null)
+    {
+        $this->aParams = ($aParams === null) ? $_GET : $aParams;
+    }
+
+    public function getBool($sName, $bDefault = false)
+    {
+        if (!isset($this->aParams[$sName]) || strlen($this->aParams[$sName]) == 0) {
+            return $bDefault;
+        }
+
+        return (bool) $this->aParams[$sName];
+    }
+
+    public function getInt($sName, $bDefault = false)
+    {
+        if (!isset($this->aParams[$sName]) || strlen($this->aParams[$sName]) == 0) {
+            return $bDefault;
+        }
+
+        if (!preg_match('/^[+-]?[0-9]+$/', $this->aParams[$sName])) {
+            userError("Integer number expected for parameter '$sName'");
+        }
+
+        return (int) $this->aParams[$sName];
+    }
+
+    public function getFloat($sName, $bDefault = false)
+    {
+        if (!isset($this->aParams[$sName]) || strlen($this->aParams[$sName]) == 0) {
+            return $bDefault;
+        }
+
+        if (!preg_match('/^[+-]?[0-9]*\.?[0-9]+$/', $this->aParams[$sName])) {
+            userError("Floating-point number expected for parameter '$sName'");
+        }
+
+        return (float) $this->aParams[$sName];
+    }
+
+    public function getString($sName, $bDefault = false)
+    {
+        if (!isset($this->aParams[$sName]) || strlen($this->aParams[$sName]) == 0) {
+            return $bDefault;
+        }
+
+        return $this->aParams[$sName];
+    }
+
+    public function getSet($sName, $aValues, $sDefault = false)
+    {
+        if (!isset($this->aParams[$sName]) || strlen($this->aParams[$sName]) == 0) {
+            return $sDefault;
+        }
+
+        if (!in_array($this->aParams[$sName], $aValues)) {
+            userError("Parameter '$sName' must be one of: ".join(', ', $aValues));
+        }
+
+        return $this->aParams[$sName];
+    }
+
+    public function getStringList($sName, $aDefault = false)
+    {
+        $sValue = $this->getString($sName);
+
+        if ($sValue) {
+            return explode(',', $sValue);
+        }
+
+        return $aDefault;
+    }
+
+    public function getPreferredLanguages($sFallback = null)
+    {
+        if ($sFallback === null && isset($_SERVER["HTTP_ACCEPT_LANGUAGE"])) {
+            $sFallback = $_SERVER["HTTP_ACCEPT_LANGUAGE"];
+        }
+
+        $aLanguages = array();
+        $sLangString = $this->getString('accept-language', $sFallback);
+
+        if ($sLangString) {
+            if (preg_match_all('/(([a-z]{1,8})(-[a-z]{1,8})?)\s*(;\s*q\s*=\s*(1|0\.[0-9]+))?/i', $sLangString, $aLanguagesParse, PREG_SET_ORDER)) {
+                foreach ($aLanguagesParse as $iLang => $aLanguage) {
+                    $aLanguages[$aLanguage[1]] = isset($aLanguage[5])?(float)$aLanguage[5]:1 - ($iLang/100);
+                    if (!isset($aLanguages[$aLanguage[2]])) $aLanguages[$aLanguage[2]] = $aLanguages[$aLanguage[1]]/10;
+                }
+                arsort($aLanguages);
+            }
+        }
+        if (!sizeof($aLanguages) && CONST_Default_Language) {
+            $aLanguages[CONST_Default_Language] = 1;
+        }
+
+        foreach ($aLanguages as $sLanguage => $fLanguagePref) {
+            $aLangPrefOrder['short_name:'.$sLanguage] = 'short_name:'.$sLanguage;
+            $aLangPrefOrder['name:'.$sLanguage] = 'name:'.$sLanguage;
+        }
+        $aLangPrefOrder['short_name'] = 'short_name';
+        $aLangPrefOrder['name'] = 'name';
+        $aLangPrefOrder['brand'] = 'brand';
+        foreach ($aLanguages as $sLanguage => $fLanguagePref) {
+            $aLangPrefOrder['official_name:'.$sLanguage] = 'official_name:'.$sLanguage;
+        }
+        $aLangPrefOrder['official_name'] = 'official_name';
+        $aLangPrefOrder['ref'] = 'ref';
+        $aLangPrefOrder['type'] = 'type';
+        return $aLangPrefOrder;
+    }
+}
index 7ba192d72fc044168a1b5ec2d738c9d928674dde..3fd882a70c12719447fd662ad6f4611ea662e60c 100644 (file)
 <?php
-       class PlaceLookup
-       {
-               protected $oDB;
-
-               protected $aLangPrefOrder = array();
-
-               protected $bAddressDetails = false;
-               protected $bExtraTags = false;
-               protected $bNameDetails = false;
-
-               protected $bIncludePolygonAsPoints = false;
-               protected $bIncludePolygonAsText = false;
-               protected $bIncludePolygonAsGeoJSON = false;
-               protected $bIncludePolygonAsKML = false;
-               protected $bIncludePolygonAsSVG = false;
-               protected $fPolygonSimplificationThreshold = 0.0;
-
-
-               function PlaceLookup(&$oDB)
-               {
-                       $this->oDB =& $oDB;
-               }
-
-               function setLanguagePreference($aLangPrefOrder)
-               {
-                       $this->aLangPrefOrder = $aLangPrefOrder;
-               }
-
-               function setIncludeAddressDetails($bAddressDetails = true)
-               {
-                       $this->bAddressDetails = $bAddressDetails;
-               }
-
-               function setIncludeExtraTags($bExtraTags = false)
-               {
-                       $this->bExtraTags = $bExtraTags;
-               }
-
-               function setIncludeNameDetails($bNameDetails = false)
-               {
-                       $this->bNameDetails = $bNameDetails;
-               }
-
-
-               function setIncludePolygonAsPoints($b = true)
-               {
-                       $this->bIncludePolygonAsPoints = $b;
-               }
-
-               function getIncludePolygonAsPoints()
-               {
-                       return $this->bIncludePolygonAsPoints;
-               }
-
-               function setIncludePolygonAsText($b = true)
-               {
-                       $this->bIncludePolygonAsText = $b;
-               }
-
-               function getIncludePolygonAsText()
-               {
-                       return $this->bIncludePolygonAsText;
-               }
-
-               function setIncludePolygonAsGeoJSON($b = true)
-               {
-                       $this->bIncludePolygonAsGeoJSON = $b;
-               }
-
-               function setIncludePolygonAsKML($b = true)
-               {
-                       $this->bIncludePolygonAsKML = $b;
-               }
-
-               function setIncludePolygonAsSVG($b = true)
-               {
-                       $this->bIncludePolygonAsSVG = $b;
-               }
-
-               function setPolygonSimplificationThreshold($f)
-               {
-                       $this->fPolygonSimplificationThreshold = $f;
-               }
-
-               function lookupOSMID($sType, $iID)
-               {
-                       $sSQL = "select place_id from placex where osm_type = '".pg_escape_string($sType)."' and osm_id = ".(int)$iID." order by type = 'postcode' asc";
-                       $iPlaceID = chksql($this->oDB->getOne($sSQL));
-
-                       return $this->lookup((int)$iPlaceID);
-               }
-
-               function lookup($iPlaceID, $sType = '', $fInterpolFraction = 0.0)
-               {
-                       if (!$iPlaceID) return null;
-
-                       $sLanguagePrefArraySQL = "ARRAY[".join(',',array_map("getDBQuoted", $this->aLangPrefOrder))."]";
-                       $bIsTiger = CONST_Use_US_Tiger_Data && $sType == 'tiger';
-                       $bIsInterpolation = $sType == 'interpolation';
-
-                       if ($bIsTiger)
-                       {
-                               $sSQL = "select place_id,partition, 'T' as osm_type, place_id as osm_id, 'place' as class, 'house' as type, null as admin_level, housenumber, null as street, null as isin, postcode,";
-                               $sSQL .= " 'us' as country_code, parent_place_id, null as linked_place_id, 30 as rank_address, 30 as rank_search,";
-                               $sSQL .= " coalesce(null,0.75-(30::float/40)) as importance, null as indexed_status, null as indexed_date, null as wikipedia, 'us' as calculated_country_code, ";
-                               $sSQL .= " get_address_by_language(place_id, housenumber, $sLanguagePrefArraySQL) as langaddress,";
-                               $sSQL .= " null as placename,";
-                               $sSQL .= " null as ref,";
-                               if ($this->bExtraTags) $sSQL .= " null as extra,";
-                               if ($this->bNameDetails) $sSQL .= " null as names,";
-                               $sSQL .= " ST_X(point) as lon, ST_Y(point) as lat from (select *, ST_LineInterpolatePoint(linegeo, (housenumber-startnumber::float)/(endnumber-startnumber)::float) as point from ";
-                               $sSQL .= " (select *, ";
-                               $sSQL .= " CASE WHEN interpolationtype='odd' THEN floor((".$fInterpolFraction."*(endnumber-startnumber)+startnumber)/2)::int*2+1";
-                               $sSQL .= " WHEN interpolationtype='even' THEN ((".$fInterpolFraction."*(endnumber-startnumber)+startnumber)/2)::int*2";
-                               $sSQL .= " WHEN interpolationtype='all' THEN (".$fInterpolFraction."*(endnumber-startnumber)+startnumber)::int";
-                               $sSQL .= " END as housenumber";
-                               $sSQL .= " from location_property_tiger where place_id = ".$iPlaceID.") as blub1) as blub2";
-                       }
-                       else if ($bIsInterpolation)
-                       {
-                               $sSQL = "select place_id, partition, 'W' as osm_type, osm_id, 'place' as class, 'house' as type, null admin_level, housenumber, null as street, null as isin, postcode,";
-                               $sSQL .= " calculated_country_code as country_code, parent_place_id, null as linked_place_id, 30 as rank_address, 30 as rank_search,";
-                               $sSQL .= " (0.75-(30::float/40)) as importance, null as indexed_status, null as indexed_date, null as wikipedia, calculated_country_code, ";
-                               $sSQL .= " get_address_by_language(place_id, housenumber, $sLanguagePrefArraySQL) as langaddress,";
-                               $sSQL .= " null as placename,";
-                               $sSQL .= " null as ref,";
-                               if ($this->bExtraTags) $sSQL .= " null as extra,";
-                               if ($this->bNameDetails) $sSQL .= " null as names,";
-                               $sSQL .= " ST_X(point) as lon, ST_Y(point) as lat from (select *, ST_LineInterpolatePoint(linegeo, (housenumber-startnumber::float)/(endnumber-startnumber)::float) as point from ";
-                               $sSQL .= " (select *, ";
-                               $sSQL .= " CASE WHEN interpolationtype='odd' THEN floor((".$fInterpolFraction."*(endnumber-startnumber)+startnumber)/2)::int*2+1";
-                               $sSQL .= " WHEN interpolationtype='even' THEN ((".$fInterpolFraction."*(endnumber-startnumber)+startnumber)/2)::int*2";
-                               $sSQL .= " WHEN interpolationtype='all' THEN (".$fInterpolFraction."*(endnumber-startnumber)+startnumber)::int";
-                               $sSQL .= " END as housenumber";
-                               $sSQL .= " from location_property_osmline where place_id = ".$iPlaceID.") as blub1) as blub2";
-                               // testcase: interpolationtype=odd, startnumber=1000, endnumber=1006, fInterpolFraction=1 => housenumber=1007 => error in st_lineinterpolatepoint
-                               // but this will never happen, because if the searched point is that close to the endnumber, the endnumber house will be directly taken from placex (in ReverseGeocode.php line 220)
-                               // and not interpolated
-                       }
-                       else
-                       {
-                               $sSQL = "select placex.place_id, partition, osm_type, osm_id, class, type, admin_level, housenumber, street, isin, postcode, country_code, parent_place_id, linked_place_id, rank_address, rank_search, ";
-                               $sSQL .= " coalesce(importance,0.75-(rank_search::float/40)) as importance, indexed_status, indexed_date, wikipedia, calculated_country_code, ";
-                               $sSQL .= " get_address_by_language(place_id, -1, $sLanguagePrefArraySQL) as langaddress,";
-                               $sSQL .= " get_name_by_language(name, $sLanguagePrefArraySQL) as placename,";
-                               $sSQL .= " get_name_by_language(name, ARRAY['ref']) as ref,";
-                               if ($this->bExtraTags) $sSQL .= " hstore_to_json(extratags) as extra,";
-                               if ($this->bNameDetails) $sSQL .= " hstore_to_json(name) as names,";
-                               $sSQL .= " (case when centroid is null then st_y(st_centroid(geometry)) else st_y(centroid) end) as lat,";
-                               $sSQL .= " (case when centroid is null then st_x(st_centroid(geometry)) else st_x(centroid) end) as lon";
-                               $sSQL .= " from placex where place_id = ".$iPlaceID;
-                       }
-
-                       $aPlace = chksql($this->oDB->getRow($sSQL), "Could not lookup place");
-
-                       if (!$aPlace['place_id']) return null;
-
-                       if ($this->bAddressDetails)
-                       {
-                               // to get addressdetails for tiger data, the housenumber is needed
-                               $iHousenumber = ($bIsTiger || $bIsInterpolation) ? $aPlace['housenumber'] : -1;
-                               $aPlace['aAddress'] = $this->getAddressNames($aPlace['place_id'],
-                                                                            $iHousenumber);
-                       }
-
-                       if ($this->bExtraTags)
-                       {
-                               if ($aPlace['extra'])
-                               {
-                                       $aPlace['sExtraTags'] = json_decode($aPlace['extra']);
-                               }
-                               else
-                               {
-                                       $aPlace['sExtraTags'] = (object) array();
-                               }
-                       }
-
-                       if ($this->bNameDetails)
-                       {
-                               if ($aPlace['names'])
-                               {
-                                       $aPlace['sNameDetails'] = json_decode($aPlace['names']);
-                               }
-                               else
-                               {
-                                       $aPlace['sNameDetails'] = (object) array();
-                               }
-                       }
-
-                       $aClassType = getClassTypes();
-                       $sAddressType = '';
-                       $sClassType = $aPlace['class'].':'.$aPlace['type'].':'.$aPlace['admin_level'];
-                       if (isset($aClassType[$sClassType]) && isset($aClassType[$sClassType]['simplelabel']))
-                       {
-                               $sAddressType = $aClassType[$aClassType]['simplelabel'];
-                       }
-                       else
-                       {
-                               $sClassType = $aPlace['class'].':'.$aPlace['type'];
-                               if (isset($aClassType[$sClassType]) && isset($aClassType[$sClassType]['simplelabel']))
-                                       $sAddressType = $aClassType[$sClassType]['simplelabel'];
-                               else $sAddressType = $aPlace['class'];
-                       }
-
-                       $aPlace['addresstype'] = $sAddressType;
-
-                       return $aPlace;
-               }
-
-               function getAddressDetails($iPlaceID, $bAll = false, $housenumber = -1)
-               {
-                       $sLanguagePrefArraySQL = "ARRAY[".join(',',array_map("getDBQuoted", $this->aLangPrefOrder))."]";
-
-                       $sSQL = "select *,get_name_by_language(name,$sLanguagePrefArraySQL) as localname from get_addressdata(".$iPlaceID.",".$housenumber.")";
-                       if (!$bAll) $sSQL .= " WHERE isaddress OR type = 'country_code'";
-                       $sSQL .= " order by rank_address desc,isaddress desc";
-
-                       return chksql($this->oDB->getAll($sSQL));
-               }
-
-               function getAddressNames($iPlaceID, $housenumber = -1)
-               {
-                       $aAddressLines = $this->getAddressDetails($iPlaceID, false, $housenumber);
-
-                       $aAddress = array();
-                       $aFallback = array();
-                       $aClassType = getClassTypes();
-                       foreach($aAddressLines as $aLine)
-                       {
-                               $bFallback = false;
-                               $aTypeLabel = false;
-                               if (isset($aClassType[$aLine['class'].':'.$aLine['type'].':'.$aLine['admin_level']])) $aTypeLabel = $aClassType[$aLine['class'].':'.$aLine['type'].':'.$aLine['admin_level']];
-                               elseif (isset($aClassType[$aLine['class'].':'.$aLine['type']])) $aTypeLabel = $aClassType[$aLine['class'].':'.$aLine['type']];
-                               elseif (isset($aClassType['boundary:administrative:'.((int)($aLine['rank_address']/2))]))
-                               {
-                                       $aTypeLabel = $aClassType['boundary:administrative:'.((int)($aLine['rank_address']/2))];
-                                       $bFallback = true;
-                               }
-                               else
-                               {
-                                       $aTypeLabel = array('simplelabel'=>'address'.$aLine['rank_address']);
-                                       $bFallback = true;
-                               }
-                               if ($aTypeLabel && ((isset($aLine['localname']) && $aLine['localname']) || (isset($aLine['housenumber']) && $aLine['housenumber'])))
-                               {
-                                       $sTypeLabel = strtolower(isset($aTypeLabel['simplelabel'])?$aTypeLabel['simplelabel']:$aTypeLabel['label']);
-                                       $sTypeLabel = str_replace(' ','_',$sTypeLabel);
-                                       if (!isset($aAddress[$sTypeLabel]) || (isset($aFallback[$sTypeLabel]) && $aFallback[$sTypeLabel]) || $aLine['class'] == 'place')
-                                       {
-                                               $aAddress[$sTypeLabel] = $aLine['localname']?$aLine['localname']:$aLine['housenumber'];
-                                       }
-                                       $aFallback[$sTypeLabel] = $bFallback;
-                               }
-                       }
-                       return $aAddress;
-               }
-
-
-
-               // returns an array which will contain the keys
-               //   aBoundingBox
-               // and may also contain one or more of the keys
-               //   asgeojson
-               //   askml
-               //   assvg
-               //   astext
-               //   lat
-               //   lon
-               function getOutlines($iPlaceID, $fLon=null, $fLat=null, $fRadius=null)
-               {
-
-                       $aOutlineResult = array();
-                       if (!$iPlaceID) return $aOutlineResult;
-
-                       if (CONST_Search_AreaPolygons)
-                       {
-                               // Get the bounding box and outline polygon
-                               $sSQL  = "select place_id,0 as numfeatures,st_area(geometry) as area,";
-                               $sSQL .= "ST_Y(centroid) as centrelat,ST_X(centroid) as centrelon,";
-                               $sSQL .= "ST_YMin(geometry) as minlat,ST_YMax(geometry) as maxlat,";
-                               $sSQL .= "ST_XMin(geometry) as minlon,ST_XMax(geometry) as maxlon";
-                               if ($this->bIncludePolygonAsGeoJSON) $sSQL .= ",ST_AsGeoJSON(geometry) as asgeojson";
-                               if ($this->bIncludePolygonAsKML) $sSQL .= ",ST_AsKML(geometry) as askml";
-                               if ($this->bIncludePolygonAsSVG) $sSQL .= ",ST_AsSVG(geometry) as assvg";
-                               if ($this->bIncludePolygonAsText || $this->bIncludePolygonAsPoints) $sSQL .= ",ST_AsText(geometry) as astext";
-                               $sFrom = " from placex where place_id = ".$iPlaceID;
-                               if ($this->fPolygonSimplificationThreshold > 0)
-                               {
-                                       $sSQL .= " from (select place_id,centroid,ST_SimplifyPreserveTopology(geometry,".$this->fPolygonSimplificationThreshold.") as geometry".$sFrom.") as plx";
-                               }
-                               else
-                               {
-                                       $sSQL .= $sFrom;
-                               }
-
-                               $aPointPolygon = chksql($this->oDB->getRow($sSQL),
-                                                       "Could not get outline");
-
-                               if ($aPointPolygon['place_id'])
-                               {
-                                       if ($aPointPolygon['centrelon'] !== null && $aPointPolygon['centrelat'] !== null )
-                                       {
-                                               $aOutlineResult['lat'] = $aPointPolygon['centrelat'];
-                                               $aOutlineResult['lon'] = $aPointPolygon['centrelon'];
-                                       }
-
-                                       if ($this->bIncludePolygonAsGeoJSON) $aOutlineResult['asgeojson'] = $aPointPolygon['asgeojson'];
-                                       if ($this->bIncludePolygonAsKML) $aOutlineResult['askml'] = $aPointPolygon['askml'];
-                                       if ($this->bIncludePolygonAsSVG) $aOutlineResult['assvg'] = $aPointPolygon['assvg'];
-                                       if ($this->bIncludePolygonAsText) $aOutlineResult['astext'] = $aPointPolygon['astext'];
-                                       if ($this->bIncludePolygonAsPoints) $aOutlineResult['aPolyPoints'] = geometryText2Points($aPointPolygon['astext'], $fRadius);
-
-
-                                       if (abs($aPointPolygon['minlat'] - $aPointPolygon['maxlat']) < 0.0000001)
-                                       {
-                                               $aPointPolygon['minlat'] = $aPointPolygon['minlat'] - $fRadius;
-                                               $aPointPolygon['maxlat'] = $aPointPolygon['maxlat'] + $fRadius;
-                                       }
-                                       if (abs($aPointPolygon['minlon'] - $aPointPolygon['maxlon']) < 0.0000001)
-                                       {
-                                               $aPointPolygon['minlon'] = $aPointPolygon['minlon'] - $fRadius;
-                                               $aPointPolygon['maxlon'] = $aPointPolygon['maxlon'] + $fRadius;
-                                       }
-
-                                       $aOutlineResult['aBoundingBox'] = array(
-                                                                         (string)$aPointPolygon['minlat'],
-                                                                         (string)$aPointPolygon['maxlat'],
-                                                                         (string)$aPointPolygon['minlon'],
-                                                                         (string)$aPointPolygon['maxlon']
-                                                                        );
-                               }
-                       } // CONST_Search_AreaPolygons
-
-                       // as a fallback we generate a bounding box without knowing the size of the geometry
-                       if ( (!isset($aOutlineResult['aBoundingBox'])) && isset($fLon) )
-                       {
-
-                               if ($this->bIncludePolygonAsPoints)
-                               {
-                                       $sGeometryText = 'POINT('.$fLon.','.$fLat.')';
-                                       $aOutlineResult['aPolyPoints'] = geometryText2Points($sGeometryText, $fRadius);
-                               }
-
-                               $aBounds = array();
-                               $aBounds['minlat'] = $fLat - $fRadius;
-                               $aBounds['maxlat'] = $fLat + $fRadius;
-                               $aBounds['minlon'] = $fLon - $fRadius;
-                               $aBounds['maxlon'] = $fLon + $fRadius;
-
-                               $aOutlineResult['aBoundingBox'] = array(
-                                                                 (string)$aBounds['minlat'],
-                                                                 (string)$aBounds['maxlat'],
-                                                                 (string)$aBounds['minlon'],
-                                                                 (string)$aBounds['maxlon']
-                                                                );
-                       }
-                       return $aOutlineResult;
-               }
-       }
-?>
+
+namespace Nominatim;
+
+class PlaceLookup
+{
+    protected $oDB;
+
+    protected $aLangPrefOrder = array();
+
+    protected $bAddressDetails = false;
+    protected $bExtraTags = false;
+    protected $bNameDetails = false;
+
+    protected $bIncludePolygonAsPoints = false;
+    protected $bIncludePolygonAsText = false;
+    protected $bIncludePolygonAsGeoJSON = false;
+    protected $bIncludePolygonAsKML = false;
+    protected $bIncludePolygonAsSVG = false;
+    protected $fPolygonSimplificationThreshold = 0.0;
+
+
+    public function __construct(&$oDB)
+    {
+        $this->oDB =& $oDB;
+    }
+
+    public function setLanguagePreference($aLangPrefOrder)
+    {
+        $this->aLangPrefOrder = $aLangPrefOrder;
+    }
+
+    public function setIncludeAddressDetails($bAddressDetails = true)
+    {
+        $this->bAddressDetails = $bAddressDetails;
+    }
+
+    public function setIncludeExtraTags($bExtraTags = false)
+    {
+        $this->bExtraTags = $bExtraTags;
+    }
+
+    public function setIncludeNameDetails($bNameDetails = false)
+    {
+        $this->bNameDetails = $bNameDetails;
+    }
+
+
+    public function setIncludePolygonAsPoints($b = true)
+    {
+        $this->bIncludePolygonAsPoints = $b;
+    }
+
+    public function getIncludePolygonAsPoints()
+    {
+        return $this->bIncludePolygonAsPoints;
+    }
+
+    public function setIncludePolygonAsText($b = true)
+    {
+        $this->bIncludePolygonAsText = $b;
+    }
+
+    public function getIncludePolygonAsText()
+    {
+        return $this->bIncludePolygonAsText;
+    }
+
+    public function setIncludePolygonAsGeoJSON($b = true)
+    {
+        $this->bIncludePolygonAsGeoJSON = $b;
+    }
+
+    public function setIncludePolygonAsKML($b = true)
+    {
+        $this->bIncludePolygonAsKML = $b;
+    }
+
+    public function setIncludePolygonAsSVG($b = true)
+    {
+        $this->bIncludePolygonAsSVG = $b;
+    }
+
+    public function setPolygonSimplificationThreshold($f)
+    {
+        $this->fPolygonSimplificationThreshold = $f;
+    }
+
+    public function lookupOSMID($sType, $iID)
+    {
+        $sSQL = "select place_id from placex where osm_type = '".pg_escape_string($sType)."' and osm_id = ".(int)$iID." order by type = 'postcode' asc";
+        $iPlaceID = chksql($this->oDB->getOne($sSQL));
+
+        return $this->lookup((int)$iPlaceID);
+    }
+
+    public function lookup($iPlaceID, $sType = '', $fInterpolFraction = 0.0)
+    {
+        if (!$iPlaceID) return null;
+
+        $sLanguagePrefArraySQL = "ARRAY[".join(',', array_map("getDBQuoted", $this->aLangPrefOrder))."]";
+        $bIsTiger = CONST_Use_US_Tiger_Data && $sType == 'tiger';
+        $bIsInterpolation = $sType == 'interpolation';
+
+        if ($bIsTiger) {
+            $sSQL = "select place_id,partition, 'T' as osm_type, place_id as osm_id, 'place' as class, 'house' as type, null as admin_level, housenumber, null as street, null as isin, postcode,";
+            $sSQL .= " 'us' as country_code, parent_place_id, null as linked_place_id, 30 as rank_address, 30 as rank_search,";
+            $sSQL .= " coalesce(null,0.75-(30::float/40)) as importance, null as indexed_status, null as indexed_date, null as wikipedia, 'us' as calculated_country_code, ";
+            $sSQL .= " get_address_by_language(place_id, housenumber, $sLanguagePrefArraySQL) as langaddress,";
+            $sSQL .= " null as placename,";
+            $sSQL .= " null as ref,";
+            if ($this->bExtraTags) $sSQL .= " null as extra,";
+            if ($this->bNameDetails) $sSQL .= " null as names,";
+            $sSQL .= " ST_X(point) as lon, ST_Y(point) as lat from (select *, ST_LineInterpolatePoint(linegeo, (housenumber-startnumber::float)/(endnumber-startnumber)::float) as point from ";
+            $sSQL .= " (select *, ";
+            $sSQL .= " CASE WHEN interpolationtype='odd' THEN floor((".$fInterpolFraction."*(endnumber-startnumber)+startnumber)/2)::int*2+1";
+            $sSQL .= " WHEN interpolationtype='even' THEN ((".$fInterpolFraction."*(endnumber-startnumber)+startnumber)/2)::int*2";
+            $sSQL .= " WHEN interpolationtype='all' THEN (".$fInterpolFraction."*(endnumber-startnumber)+startnumber)::int";
+            $sSQL .= " END as housenumber";
+            $sSQL .= " from location_property_tiger where place_id = ".$iPlaceID.") as blub1) as blub2";
+        } elseif ($bIsInterpolation) {
+            $sSQL = "select place_id, partition, 'W' as osm_type, osm_id, 'place' as class, 'house' as type, null admin_level, housenumber, null as street, null as isin, postcode,";
+            $sSQL .= " calculated_country_code as country_code, parent_place_id, null as linked_place_id, 30 as rank_address, 30 as rank_search,";
+            $sSQL .= " (0.75-(30::float/40)) as importance, null as indexed_status, null as indexed_date, null as wikipedia, calculated_country_code, ";
+            $sSQL .= " get_address_by_language(place_id, housenumber, $sLanguagePrefArraySQL) as langaddress,";
+            $sSQL .= " null as placename,";
+            $sSQL .= " null as ref,";
+            if ($this->bExtraTags) $sSQL .= " null as extra,";
+            if ($this->bNameDetails) $sSQL .= " null as names,";
+            $sSQL .= " ST_X(point) as lon, ST_Y(point) as lat from (select *, ST_LineInterpolatePoint(linegeo, (housenumber-startnumber::float)/(endnumber-startnumber)::float) as point from ";
+            $sSQL .= " (select *, ";
+            $sSQL .= " CASE WHEN interpolationtype='odd' THEN floor((".$fInterpolFraction."*(endnumber-startnumber)+startnumber)/2)::int*2+1";
+            $sSQL .= " WHEN interpolationtype='even' THEN ((".$fInterpolFraction."*(endnumber-startnumber)+startnumber)/2)::int*2";
+            $sSQL .= " WHEN interpolationtype='all' THEN (".$fInterpolFraction."*(endnumber-startnumber)+startnumber)::int";
+            $sSQL .= " END as housenumber";
+            $sSQL .= " from location_property_osmline where place_id = ".$iPlaceID.") as blub1) as blub2";
+            // testcase: interpolationtype=odd, startnumber=1000, endnumber=1006, fInterpolFraction=1 => housenumber=1007 => error in st_lineinterpolatepoint
+            // but this will never happen, because if the searched point is that close to the endnumber, the endnumber house will be directly taken from placex (in ReverseGeocode.php line 220)
+            // and not interpolated
+        } else {
+            $sSQL = "select placex.place_id, partition, osm_type, osm_id, class, type, admin_level, housenumber, street, isin, postcode, country_code, parent_place_id, linked_place_id, rank_address, rank_search, ";
+            $sSQL .= " coalesce(importance,0.75-(rank_search::float/40)) as importance, indexed_status, indexed_date, wikipedia, calculated_country_code, ";
+            $sSQL .= " get_address_by_language(place_id, -1, $sLanguagePrefArraySQL) as langaddress,";
+            $sSQL .= " get_name_by_language(name, $sLanguagePrefArraySQL) as placename,";
+            $sSQL .= " get_name_by_language(name, ARRAY['ref']) as ref,";
+            if ($this->bExtraTags) $sSQL .= " hstore_to_json(extratags) as extra,";
+            if ($this->bNameDetails) $sSQL .= " hstore_to_json(name) as names,";
+            $sSQL .= " (case when centroid is null then st_y(st_centroid(geometry)) else st_y(centroid) end) as lat,";
+            $sSQL .= " (case when centroid is null then st_x(st_centroid(geometry)) else st_x(centroid) end) as lon";
+            $sSQL .= " from placex where place_id = ".$iPlaceID;
+        }
+
+        $aPlace = chksql($this->oDB->getRow($sSQL), "Could not lookup place");
+
+        if (!$aPlace['place_id']) return null;
+
+        if ($this->bAddressDetails) {
+            // to get addressdetails for tiger data, the housenumber is needed
+            $iHousenumber = ($bIsTiger || $bIsInterpolation) ? $aPlace['housenumber'] : -1;
+            $aPlace['aAddress'] = $this->getAddressNames($aPlace['place_id'], $iHousenumber);
+        }
+
+        if ($this->bExtraTags) {
+            if ($aPlace['extra']) {
+                $aPlace['sExtraTags'] = json_decode($aPlace['extra']);
+            } else {
+                $aPlace['sExtraTags'] = (object) array();
+            }
+        }
+
+        if ($this->bNameDetails) {
+            if ($aPlace['names']) {
+                $aPlace['sNameDetails'] = json_decode($aPlace['names']);
+            } else {
+                $aPlace['sNameDetails'] = (object) array();
+            }
+        }
+
+        $aClassType = getClassTypes();
+        $sAddressType = '';
+        $sClassType = $aPlace['class'].':'.$aPlace['type'].':'.$aPlace['admin_level'];
+        if (isset($aClassType[$sClassType]) && isset($aClassType[$sClassType]['simplelabel'])) {
+            $sAddressType = $aClassType[$aClassType]['simplelabel'];
+        } else {
+            $sClassType = $aPlace['class'].':'.$aPlace['type'];
+            if (isset($aClassType[$sClassType]) && isset($aClassType[$sClassType]['simplelabel']))
+                $sAddressType = $aClassType[$sClassType]['simplelabel'];
+            else $sAddressType = $aPlace['class'];
+        }
+
+        $aPlace['addresstype'] = $sAddressType;
+
+        return $aPlace;
+    }
+
+    public function getAddressDetails($iPlaceID, $bAll = false, $housenumber = -1)
+    {
+        $sLanguagePrefArraySQL = "ARRAY[".join(',', array_map("getDBQuoted", $this->aLangPrefOrder))."]";
+
+        $sSQL = "select *,get_name_by_language(name,$sLanguagePrefArraySQL) as localname from get_addressdata(".$iPlaceID.",".$housenumber.")";
+        if (!$bAll) $sSQL .= " WHERE isaddress OR type = 'country_code'";
+        $sSQL .= " order by rank_address desc,isaddress desc";
+
+        return chksql($this->oDB->getAll($sSQL));
+    }
+
+    public function getAddressNames($iPlaceID, $housenumber = -1)
+    {
+        $aAddressLines = $this->getAddressDetails($iPlaceID, false, $housenumber);
+
+        $aAddress = array();
+        $aFallback = array();
+        $aClassType = getClassTypes();
+        foreach ($aAddressLines as $aLine) {
+            $bFallback = false;
+            $aTypeLabel = false;
+            if (isset($aClassType[$aLine['class'].':'.$aLine['type'].':'.$aLine['admin_level']])) {
+                $aTypeLabel = $aClassType[$aLine['class'].':'.$aLine['type'].':'.$aLine['admin_level']];
+            } elseif (isset($aClassType[$aLine['class'].':'.$aLine['type']])) {
+                $aTypeLabel = $aClassType[$aLine['class'].':'.$aLine['type']];
+            } elseif (isset($aClassType['boundary:administrative:'.((int)($aLine['rank_address']/2))])) {
+                $aTypeLabel = $aClassType['boundary:administrative:'.((int)($aLine['rank_address']/2))];
+                $bFallback = true;
+            } else {
+                $aTypeLabel = array('simplelabel' => 'address'.$aLine['rank_address']);
+                $bFallback = true;
+            }
+            if ($aTypeLabel && ((isset($aLine['localname']) && $aLine['localname']) || (isset($aLine['housenumber']) && $aLine['housenumber']))) {
+                $sTypeLabel = strtolower(isset($aTypeLabel['simplelabel'])?$aTypeLabel['simplelabel']:$aTypeLabel['label']);
+                $sTypeLabel = str_replace(' ', '_', $sTypeLabel);
+                if (!isset($aAddress[$sTypeLabel]) || (isset($aFallback[$sTypeLabel]) && $aFallback[$sTypeLabel]) || $aLine['class'] == 'place') {
+                    $aAddress[$sTypeLabel] = $aLine['localname']?$aLine['localname']:$aLine['housenumber'];
+                }
+                $aFallback[$sTypeLabel] = $bFallback;
+            }
+        }
+        return $aAddress;
+    }
+
+
+
+    /* returns an array which will contain the keys
+     *   aBoundingBox
+     * and may also contain one or more of the keys
+     *   asgeojson
+     *   askml
+     *   assvg
+     *   astext
+     *   lat
+     *   lon
+     */
+
+
+    public function getOutlines($iPlaceID, $fLon = null, $fLat = null, $fRadius = null)
+    {
+
+        $aOutlineResult = array();
+        if (!$iPlaceID) return $aOutlineResult;
+
+        if (CONST_Search_AreaPolygons) {
+            // Get the bounding box and outline polygon
+            $sSQL  = "select place_id,0 as numfeatures,st_area(geometry) as area,";
+            $sSQL .= "ST_Y(centroid) as centrelat,ST_X(centroid) as centrelon,";
+            $sSQL .= "ST_YMin(geometry) as minlat,ST_YMax(geometry) as maxlat,";
+            $sSQL .= "ST_XMin(geometry) as minlon,ST_XMax(geometry) as maxlon";
+            if ($this->bIncludePolygonAsGeoJSON) $sSQL .= ",ST_AsGeoJSON(geometry) as asgeojson";
+            if ($this->bIncludePolygonAsKML) $sSQL .= ",ST_AsKML(geometry) as askml";
+            if ($this->bIncludePolygonAsSVG) $sSQL .= ",ST_AsSVG(geometry) as assvg";
+            if ($this->bIncludePolygonAsText || $this->bIncludePolygonAsPoints) $sSQL .= ",ST_AsText(geometry) as astext";
+            $sFrom = " from placex where place_id = ".$iPlaceID;
+            if ($this->fPolygonSimplificationThreshold > 0) {
+                $sSQL .= " from (select place_id,centroid,ST_SimplifyPreserveTopology(geometry,".$this->fPolygonSimplificationThreshold.") as geometry".$sFrom.") as plx";
+            } else {
+                $sSQL .= $sFrom;
+            }
+
+            $aPointPolygon = chksql($this->oDB->getRow($sSQL), "Could not get outline");
+
+            if ($aPointPolygon['place_id']) {
+                if ($aPointPolygon['centrelon'] !== null && $aPointPolygon['centrelat'] !== null) {
+                    $aOutlineResult['lat'] = $aPointPolygon['centrelat'];
+                    $aOutlineResult['lon'] = $aPointPolygon['centrelon'];
+                }
+
+                if ($this->bIncludePolygonAsGeoJSON) $aOutlineResult['asgeojson'] = $aPointPolygon['asgeojson'];
+                if ($this->bIncludePolygonAsKML) $aOutlineResult['askml'] = $aPointPolygon['askml'];
+                if ($this->bIncludePolygonAsSVG) $aOutlineResult['assvg'] = $aPointPolygon['assvg'];
+                if ($this->bIncludePolygonAsText) $aOutlineResult['astext'] = $aPointPolygon['astext'];
+                if ($this->bIncludePolygonAsPoints) $aOutlineResult['aPolyPoints'] = geometryText2Points($aPointPolygon['astext'], $fRadius);
+
+
+                if (abs($aPointPolygon['minlat'] - $aPointPolygon['maxlat']) < 0.0000001) {
+                    $aPointPolygon['minlat'] = $aPointPolygon['minlat'] - $fRadius;
+                    $aPointPolygon['maxlat'] = $aPointPolygon['maxlat'] + $fRadius;
+                }
+
+                if (abs($aPointPolygon['minlon'] - $aPointPolygon['maxlon']) < 0.0000001) {
+                    $aPointPolygon['minlon'] = $aPointPolygon['minlon'] - $fRadius;
+                    $aPointPolygon['maxlon'] = $aPointPolygon['maxlon'] + $fRadius;
+                }
+
+                $aOutlineResult['aBoundingBox'] = array(
+                                                   (string)$aPointPolygon['minlat'],
+                                                   (string)$aPointPolygon['maxlat'],
+                                                   (string)$aPointPolygon['minlon'],
+                                                   (string)$aPointPolygon['maxlon']
+                                                  );
+            }
+        }
+
+        // as a fallback we generate a bounding box without knowing the size of the geometry
+        if ((!isset($aOutlineResult['aBoundingBox'])) && isset($fLon)) {
+            //
+            if ($this->bIncludePolygonAsPoints) {
+                $sGeometryText = 'POINT('.$fLon.','.$fLat.')';
+                $aOutlineResult['aPolyPoints'] = geometryText2Points($sGeometryText, $fRadius);
+            }
+
+            $aBounds = array();
+            $aBounds['minlat'] = $fLat - $fRadius;
+            $aBounds['maxlat'] = $fLat + $fRadius;
+            $aBounds['minlon'] = $fLon - $fRadius;
+            $aBounds['maxlon'] = $fLon + $fRadius;
+
+            $aOutlineResult['aBoundingBox'] = array(
+                                               (string)$aBounds['minlat'],
+                                               (string)$aBounds['maxlat'],
+                                               (string)$aBounds['minlon'],
+                                               (string)$aBounds['maxlon']
+                                              );
+        }
+        return $aOutlineResult;
+    }
+}
index b523d0aaa9b54a726389691596d28eea5c2a9d31..c56c9b29b2cbadc417092147f93fc30ee6501cf6 100644 (file)
 <?php
-       class ReverseGeocode
-       {
-               protected $oDB;
-               protected $iMaxRank = 28;
-
-               function ReverseGeocode(&$oDB)
-               {
-                       $this->oDB =& $oDB;
-               }
-
-               function setZoom($iZoom)
-               {
-                       // Zoom to rank, this could probably be calculated but a lookup gives fine control
-                       $aZoomRank = array(
-                               0 => 2, // Continent / Sea
-                               1 => 2,
-                               2 => 2,
-                               3 => 4, // Country
-                               4 => 4,
-                               5 => 8, // State
-                               6 => 10, // Region
-                               7 => 10,
-                               8 => 12, // County
-                               9 => 12,
-                               10 => 17, // City
-                               11 => 17,
-                               12 => 18, // Town / Village
-                               13 => 18,
-                               14 => 22, // Suburb
-                               15 => 22,
-                               16 => 26, // Street, TODO: major street?
-                               17 => 26,
-                               18 => 30, // or >, Building
-                               19 => 30, // or >, Building
-                               );
-                       $this->iMaxRank = (isset($iZoom) && isset($aZoomRank[$iZoom]))?$aZoomRank[$iZoom]:28;
-               }
-
-               // returns { place_id =>, type => '(osm|tiger)' }
-               // fails if no place was found
-               function lookup($fLat, $fLon, $bDoInterpolation = true)
-               {
-                       $sPointSQL = 'ST_SetSRID(ST_Point('.$fLon.','.$fLat.'),4326)';
-                       $iMaxRank = $this->iMaxRank;
-
-                       // Find the nearest point
-                       $fSearchDiam = 0.0004;
-                       $iPlaceID = null;
-                       $aArea = false;
-                       $fMaxAreaDistance = 1;
-                       $bIsInUnitedStates = false;
-                       $bPlaceIsTiger = false;
-                       $bPlaceIsLine = false;
-                       while(!$iPlaceID && $fSearchDiam < $fMaxAreaDistance)
-                       {
-                               $fSearchDiam = $fSearchDiam * 2;
-
-                               // If we have to expand the search area by a large amount then we need a larger feature
-                               // then there is a limit to how small the feature should be
-                               if ($fSearchDiam > 2 && $iMaxRank > 4) $iMaxRank = 4;
-                               if ($fSearchDiam > 1 && $iMaxRank > 9) $iMaxRank = 8;
-                               if ($fSearchDiam > 0.8 && $iMaxRank > 10) $iMaxRank = 10;
-                               if ($fSearchDiam > 0.6 && $iMaxRank > 12) $iMaxRank = 12;
-                               if ($fSearchDiam > 0.2 && $iMaxRank > 17) $iMaxRank = 17;
-                               if ($fSearchDiam > 0.1 && $iMaxRank > 18) $iMaxRank = 18;
-                               if ($fSearchDiam > 0.008 && $iMaxRank > 22) $iMaxRank = 22;
-                               if ($fSearchDiam > 0.001 && $iMaxRank > 26) $iMaxRank = 26;
-
-                               $sSQL = 'select place_id,parent_place_id,rank_search,calculated_country_code';
-                               $sSQL .= ' FROM placex';
-                               $sSQL .= ' WHERE ST_DWithin('.$sPointSQL.', geometry, '.$fSearchDiam.')';
-                               $sSQL .= ' and rank_search != 28 and rank_search >= '.$iMaxRank;
-                               $sSQL .= ' and (name is not null or housenumber is not null)';
-                               $sSQL .= ' and class not in (\'waterway\',\'railway\',\'tunnel\',\'bridge\',\'man_made\')';
-                               $sSQL .= ' and indexed_status = 0 ';
-                               $sSQL .= ' and (ST_GeometryType(geometry) not in (\'ST_Polygon\',\'ST_MultiPolygon\') ';
-                               $sSQL .= ' OR ST_DWithin('.$sPointSQL.', centroid, '.$fSearchDiam.'))';
-                               $sSQL .= ' ORDER BY ST_distance('.$sPointSQL.', geometry) ASC limit 1';
-                               if (CONST_Debug) var_dump($sSQL);
-                               $aPlace = chksql($this->oDB->getRow($sSQL),
-                                                "Could not determine closest place.");
-                               $iPlaceID = $aPlace['place_id'];
-                               $iParentPlaceID = $aPlace['parent_place_id'];
-                               $bIsInUnitedStates = ($aPlace['calculated_country_code'] == 'us');
-                       }
-                       // if a street or house was found, look in interpolation lines table
-                       if ($bDoInterpolation && $this->iMaxRank >= 28 && $aPlace && $aPlace['rank_search'] >= 26)
-                       {
-                               // if a house was found, search the interpolation line that is at least as close as the house
-                               $sSQL = 'SELECT place_id, parent_place_id, 30 as rank_search, ST_line_locate_point(linegeo,'.$sPointSQL.') as fraction';
-                               $sSQL .= ' FROM location_property_osmline';
-                               $sSQL .= ' WHERE ST_DWithin('.$sPointSQL.', linegeo, '.$fSearchDiam.')';
-                               $sSQL .= ' and indexed_status = 0 ';
-                               $sSQL .= ' ORDER BY ST_distance('.$sPointSQL.', linegeo) ASC limit 1';
-                               
-                               if (CONST_Debug)
-                               {
-                                       $sSQL = preg_replace('/limit 1/', 'limit 100', $sSQL);
-                                       var_dump($sSQL);
-
-                                       $aAllHouses = chksql($this->oDB->getAll($sSQL));
-                                       foreach($aAllHouses as $i)
-                                       {
-                                               echo $i['housenumber'] . ' | ' . $i['distance'] * 1000 . ' | ' . $i['lat'] . ' | ' . $i['lon']. ' | '. "<br>\n";
-                                       }
-                               }
-                               $aPlaceLine = chksql($this->oDB->getRow($sSQL),
-                                                    "Could not determine closest housenumber on an osm interpolation line.");
-                               if ($aPlaceLine)
-                               {
-                                       if (CONST_Debug) var_dump('found housenumber in interpolation lines table', $aPlaceLine);
-                                       if ($aPlace['rank_search'] == 30)
-                                       {
-                                               // if a house was already found in placex, we have to find out, 
-                                               // if the placex house or the interpolated house are closer to the searched point
-                                               // distance between point and placex house
-                                               $sSQL = 'SELECT ST_distance('.$sPointSQL.', house.geometry) as distance FROM placex as house WHERE house.place_id='.$iPlaceID;
-                                               $aDistancePlacex = chksql($this->oDB->getRow($sSQL),
-                                                                         "Could not determine distance between searched point and placex house.");
-                                               $fDistancePlacex = $aDistancePlacex['distance'];
-                                               // distance between point and interpolated house (fraction on interpolation line)
-                                               $sSQL = 'SELECT ST_distance('.$sPointSQL.', ST_LineInterpolatePoint(linegeo, '.$aPlaceLine['fraction'].')) as distance';
-                                               $sSQL .= ' FROM location_property_osmline WHERE place_id = '.$aPlaceLine['place_id'];
-                                               $aDistanceInterpolation = chksql($this->oDB->getRow($sSQL),
-                                                                                "Could not determine distance between searched point and interpolated house.");
-                                               $fDistanceInterpolation = $aDistanceInterpolation['distance'];
-                                               if ($fDistanceInterpolation < $fDistancePlacex)
-                                               {
-                                                       // interpolation is closer to point than placex house
-                                                       $bPlaceIsLine = true;
-                                                       $aPlace = $aPlaceLine;
-                                                       $iPlaceID = $aPlaceLine['place_id'];
-                                                       $iParentPlaceID = $aPlaceLine['parent_place_id']; // the street
-                                                       $fFraction = $aPlaceLine['fraction'];
-                                                       $iMaxRank = 30;
-                                               }
-                                               // else: nothing to do, take placex house from above
-                                       }
-                                       else
-                                       {
-                                               $bPlaceIsLine = true;
-                                               $aPlace = $aPlaceLine;
-                                               $iPlaceID = $aPlaceLine['place_id'];
-                                               $iParentPlaceID = $aPlaceLine['parent_place_id']; // the street
-                                               $fFraction = $aPlaceLine['fraction'];
-                                               $iMaxRank = 30;
-                                       }
-                               }
-                       }
-                       
-                       // Only street found? If it's in the US we can check TIGER data for nearest housenumber
-                       if (CONST_Use_US_Tiger_Data && $bDoInterpolation && $bIsInUnitedStates && $this->iMaxRank >= 28 && $iPlaceID && ($aPlace['rank_search'] == 26 || $aPlace['rank_search'] == 27 ))
-                       {
-                               $fSearchDiam = 0.001;
-                               $sSQL = 'SELECT place_id,parent_place_id,30 as rank_search, ST_line_locate_point(linegeo,'.$sPointSQL.') as fraction';
-                               //if (CONST_Debug) { $sSQL .= ', housenumber, ST_distance('.$sPointSQL.', centroid) as distance, st_y(centroid) as lat, st_x(centroid) as lon'; }
-                               $sSQL .= ' FROM location_property_tiger WHERE parent_place_id = '.$iPlaceID;
-                               $sSQL .= ' AND ST_DWithin('.$sPointSQL.', linegeo, '.$fSearchDiam.')';  //no centroid anymore in Tiger data, now we have lines
-                               $sSQL .= ' ORDER BY ST_distance('.$sPointSQL.', linegeo) ASC limit 1';
-
-                               if (CONST_Debug)
-                               {
-                                       $sSQL = preg_replace('/limit 1/', 'limit 100', $sSQL);
-                                       var_dump($sSQL);
-
-                                       $aAllHouses = chksql($this->oDB->getAll($sSQL));
-                                       foreach($aAllHouses as $i)
-                                       {
-                                               echo $i['housenumber'] . ' | ' . $i['distance'] * 1000 . ' | ' . $i['lat'] . ' | ' . $i['lon']. ' | '. "<br>\n";
-                                       }
-                               }
-
-                               $aPlaceTiger = chksql($this->oDB->getRow($sSQL),
-                                                     "Could not determine closest Tiger place.");
-                               if ($aPlaceTiger)
-                               {
-                                       if (CONST_Debug) var_dump('found Tiger housenumber', $aPlaceTiger);
-                                       $bPlaceIsTiger = true;
-                                       $aPlace = $aPlaceTiger;
-                                       $iPlaceID = $aPlaceTiger['place_id'];
-                                       $iParentPlaceID = $aPlaceTiger['parent_place_id']; // the street
-                                       $fFraction = $aPlaceTiger['fraction'];
-                                       $iMaxRank = 30;
-                               }
-                       }
-
-                       // The point we found might be too small - use the address to find what it is a child of
-                       if ($iPlaceID && $iMaxRank < 28)
-                       {
-                               if (($aPlace['rank_search'] > 28 || $bPlaceIsTiger || $bPlaceIsLine) && $iParentPlaceID)
-                               {
-                                       $iPlaceID = $iParentPlaceID;
-                               }
-                               $sSQL  = 'select address_place_id';
-                               $sSQL .= ' FROM place_addressline';
-                               $sSQL .= " WHERE place_id = $iPlaceID";
-                               $sSQL .= " ORDER BY abs(cached_rank_address - $iMaxRank) asc,cached_rank_address desc,isaddress desc,distance desc";
-                               $sSQL .= ' LIMIT 1';
-                               $iPlaceID = chksql($this->oDB->getOne($sSQL),
-                                                  "Could not get parent for place.");
-                               if (!$iPlaceID)
-                               {
-                                       $iPlaceID = $aPlace['place_id'];
-                               }
-                       }
-                       return array('place_id' => $iPlaceID,
-                                               'type' => $bPlaceIsTiger ? 'tiger' : ($bPlaceIsLine ? 'interpolation' : 'osm'),
-                                               'fraction' => ($bPlaceIsTiger || $bPlaceIsLine) ? $fFraction : -1);
-               }
-               
-       }
-?>
+
+namespace Nominatim;
+
+class ReverseGeocode
+{
+    protected $oDB;
+    protected $iMaxRank = 28;
+
+
+    public function __construct(&$oDB)
+    {
+        $this->oDB =& $oDB;
+    }
+
+
+    public function setZoom($iZoom)
+    {
+        // Zoom to rank, this could probably be calculated but a lookup gives fine control
+        $aZoomRank = array(
+                      0 => 2, // Continent / Sea
+                      1 => 2,
+                      2 => 2,
+                      3 => 4, // Country
+                      4 => 4,
+                      5 => 8, // State
+                      6 => 10, // Region
+                      7 => 10,
+                      8 => 12, // County
+                      9 => 12,
+                      10 => 17, // City
+                      11 => 17,
+                      12 => 18, // Town / Village
+                      13 => 18,
+                      14 => 22, // Suburb
+                      15 => 22,
+                      16 => 26, // Street, TODO: major street?
+                      17 => 26,
+                      18 => 30, // or >, Building
+                      19 => 30, // or >, Building
+                     );
+        $this->iMaxRank = (isset($iZoom) && isset($aZoomRank[$iZoom]))?$aZoomRank[$iZoom]:28;
+    }
+
+
+    /* lookup()
+     * returns { place_id =>, type => '(osm|tiger)' }
+     * fails if no place was found
+     */
+
+
+    public function lookup($fLat, $fLon, $bDoInterpolation = true)
+    {
+        $sPointSQL = 'ST_SetSRID(ST_Point('.$fLon.','.$fLat.'),4326)';
+        $iMaxRank = $this->iMaxRank;
+
+        // Find the nearest point
+        $fSearchDiam = 0.0004;
+        $iPlaceID = null;
+        $aArea = false;
+        $fMaxAreaDistance = 1;
+        $bIsInUnitedStates = false;
+        $bPlaceIsTiger = false;
+        $bPlaceIsLine = false;
+        while (!$iPlaceID && $fSearchDiam < $fMaxAreaDistance) {
+            $fSearchDiam = $fSearchDiam * 2;
+
+            // If we have to expand the search area by a large amount then we need a larger feature
+            // then there is a limit to how small the feature should be
+            if ($fSearchDiam > 2 && $iMaxRank > 4) $iMaxRank = 4;
+            if ($fSearchDiam > 1 && $iMaxRank > 9) $iMaxRank = 8;
+            if ($fSearchDiam > 0.8 && $iMaxRank > 10) $iMaxRank = 10;
+            if ($fSearchDiam > 0.6 && $iMaxRank > 12) $iMaxRank = 12;
+            if ($fSearchDiam > 0.2 && $iMaxRank > 17) $iMaxRank = 17;
+            if ($fSearchDiam > 0.1 && $iMaxRank > 18) $iMaxRank = 18;
+            if ($fSearchDiam > 0.008 && $iMaxRank > 22) $iMaxRank = 22;
+            if ($fSearchDiam > 0.001 && $iMaxRank > 26) $iMaxRank = 26;
+
+            $sSQL = 'select place_id,parent_place_id,rank_search,calculated_country_code';
+            $sSQL .= ' FROM placex';
+            $sSQL .= ' WHERE ST_DWithin('.$sPointSQL.', geometry, '.$fSearchDiam.')';
+            $sSQL .= ' and rank_search != 28 and rank_search >= '.$iMaxRank;
+            $sSQL .= ' and (name is not null or housenumber is not null)';
+            $sSQL .= ' and class not in (\'waterway\',\'railway\',\'tunnel\',\'bridge\',\'man_made\')';
+            $sSQL .= ' and indexed_status = 0 ';
+            $sSQL .= ' and (ST_GeometryType(geometry) not in (\'ST_Polygon\',\'ST_MultiPolygon\') ';
+            $sSQL .= ' OR ST_DWithin('.$sPointSQL.', centroid, '.$fSearchDiam.'))';
+            $sSQL .= ' ORDER BY ST_distance('.$sPointSQL.', geometry) ASC limit 1';
+            if (CONST_Debug) var_dump($sSQL);
+            $aPlace = chksql(
+                $this->oDB->getRow($sSQL),
+                "Could not determine closest place."
+            );
+            $iPlaceID = $aPlace['place_id'];
+            $iParentPlaceID = $aPlace['parent_place_id'];
+            $bIsInUnitedStates = ($aPlace['calculated_country_code'] == 'us');
+        }
+        // if a street or house was found, look in interpolation lines table
+        if ($bDoInterpolation && $this->iMaxRank >= 28 && $aPlace && $aPlace['rank_search'] >= 26) {
+            // if a house was found, search the interpolation line that is at least as close as the house
+            $sSQL = 'SELECT place_id, parent_place_id, 30 as rank_search, ST_line_locate_point(linegeo,'.$sPointSQL.') as fraction';
+            $sSQL .= ' FROM location_property_osmline';
+            $sSQL .= ' WHERE ST_DWithin('.$sPointSQL.', linegeo, '.$fSearchDiam.')';
+            $sSQL .= ' and indexed_status = 0 ';
+            $sSQL .= ' ORDER BY ST_distance('.$sPointSQL.', linegeo) ASC limit 1';
+            
+            if (CONST_Debug) {
+                $sSQL = preg_replace('/limit 1/', 'limit 100', $sSQL);
+                var_dump($sSQL);
+
+                $aAllHouses = chksql($this->oDB->getAll($sSQL));
+                foreach ($aAllHouses as $i) {
+                    echo $i['housenumber'] . ' | ' . $i['distance'] * 1000 . ' | ' . $i['lat'] . ' | ' . $i['lon']. ' | '. "<br>\n";
+                }
+            }
+            $aPlaceLine = chksql(
+                $this->oDB->getRow($sSQL),
+                "Could not determine closest housenumber on an osm interpolation line."
+            );
+            if ($aPlaceLine) {
+                if (CONST_Debug) var_dump('found housenumber in interpolation lines table', $aPlaceLine);
+                if ($aPlace['rank_search'] == 30) {
+                    // if a house was already found in placex, we have to find out,
+                    // if the placex house or the interpolated house are closer to the searched point
+                    // distance between point and placex house
+                    $sSQL = 'SELECT ST_distance('.$sPointSQL.', house.geometry) as distance FROM placex as house WHERE house.place_id='.$iPlaceID;
+                    $aDistancePlacex = chksql(
+                        $this->oDB->getRow($sSQL),
+                        "Could not determine distance between searched point and placex house."
+                    );
+                    $fDistancePlacex = $aDistancePlacex['distance'];
+                    // distance between point and interpolated house (fraction on interpolation line)
+                    $sSQL = 'SELECT ST_distance('.$sPointSQL.', ST_LineInterpolatePoint(linegeo, '.$aPlaceLine['fraction'].')) as distance';
+                    $sSQL .= ' FROM location_property_osmline WHERE place_id = '.$aPlaceLine['place_id'];
+                    $aDistanceInterpolation = chksql(
+                        $this->oDB->getRow($sSQL),
+                        "Could not determine distance between searched point and interpolated house."
+                    );
+                    $fDistanceInterpolation = $aDistanceInterpolation['distance'];
+                    if ($fDistanceInterpolation < $fDistancePlacex) {
+                        // interpolation is closer to point than placex house
+                        $bPlaceIsLine = true;
+                        $aPlace = $aPlaceLine;
+                        $iPlaceID = $aPlaceLine['place_id'];
+                        $iParentPlaceID = $aPlaceLine['parent_place_id']; // the street
+                        $fFraction = $aPlaceLine['fraction'];
+                        $iMaxRank = 30;
+                    }
+                    // else: nothing to do, take placex house from above
+                } else {
+                    $bPlaceIsLine = true;
+                    $aPlace = $aPlaceLine;
+                    $iPlaceID = $aPlaceLine['place_id'];
+                    $iParentPlaceID = $aPlaceLine['parent_place_id']; // the street
+                    $fFraction = $aPlaceLine['fraction'];
+                    $iMaxRank = 30;
+                }
+            }
+        }
+        
+        // Only street found? If it's in the US we can check TIGER data for nearest housenumber
+        if (CONST_Use_US_Tiger_Data && $bDoInterpolation && $bIsInUnitedStates && $this->iMaxRank >= 28 && $iPlaceID && ($aPlace['rank_search'] == 26 || $aPlace['rank_search'] == 27 )) {
+            $fSearchDiam = 0.001;
+            $sSQL = 'SELECT place_id,parent_place_id,30 as rank_search, ST_line_locate_point(linegeo,'.$sPointSQL.') as fraction';
+            //if (CONST_Debug) { $sSQL .= ', housenumber, ST_distance('.$sPointSQL.', centroid) as distance, st_y(centroid) as lat, st_x(centroid) as lon'; }
+            $sSQL .= ' FROM location_property_tiger WHERE parent_place_id = '.$iPlaceID;
+            $sSQL .= ' AND ST_DWithin('.$sPointSQL.', linegeo, '.$fSearchDiam.')';  //no centroid anymore in Tiger data, now we have lines
+            $sSQL .= ' ORDER BY ST_distance('.$sPointSQL.', linegeo) ASC limit 1';
+
+            if (CONST_Debug) {
+                $sSQL = preg_replace('/limit 1/', 'limit 100', $sSQL);
+                var_dump($sSQL);
+
+                $aAllHouses = chksql($this->oDB->getAll($sSQL));
+                foreach ($aAllHouses as $i) {
+                    echo $i['housenumber'] . ' | ' . $i['distance'] * 1000 . ' | ' . $i['lat'] . ' | ' . $i['lon']. ' | '. "<br>\n";
+                }
+            }
+
+            $aPlaceTiger = chksql(
+                $this->oDB->getRow($sSQL),
+                "Could not determine closest Tiger place."
+            );
+            if ($aPlaceTiger) {
+                if (CONST_Debug) var_dump('found Tiger housenumber', $aPlaceTiger);
+                $bPlaceIsTiger = true;
+                $aPlace = $aPlaceTiger;
+                $iPlaceID = $aPlaceTiger['place_id'];
+                $iParentPlaceID = $aPlaceTiger['parent_place_id']; // the street
+                $fFraction = $aPlaceTiger['fraction'];
+                $iMaxRank = 30;
+            }
+        }
+
+        // The point we found might be too small - use the address to find what it is a child of
+        if ($iPlaceID && $iMaxRank < 28) {
+            if (($aPlace['rank_search'] > 28 || $bPlaceIsTiger || $bPlaceIsLine) && $iParentPlaceID) {
+                $iPlaceID = $iParentPlaceID;
+            }
+            $sSQL  = 'select address_place_id';
+            $sSQL .= ' FROM place_addressline';
+            $sSQL .= " WHERE place_id = $iPlaceID";
+            $sSQL .= " ORDER BY abs(cached_rank_address - $iMaxRank) asc,cached_rank_address desc,isaddress desc,distance desc";
+            $sSQL .= ' LIMIT 1';
+            $iPlaceID = chksql($this->oDB->getOne($sSQL), "Could not get parent for place.");
+            if (!$iPlaceID) {
+                $iPlaceID = $aPlace['place_id'];
+            }
+        }
+        return array(
+                'place_id' => $iPlaceID,
+                'type' => $bPlaceIsTiger ? 'tiger' : ($bPlaceIsLine ? 'interpolation' : 'osm'),
+                'fraction' => ($bPlaceIsTiger || $bPlaceIsLine) ? $fFraction : -1
+               );
+    }
+}
index c73074a18517d2674e8fc80debdf7caa89b72ea6..37ba87b8a51c69e38ca0758d378292f61590f756 100644 (file)
 <?php
 
-       function getCmdOpt($aArg, $aSpec, &$aResult, $bExitOnError = false, $bExitOnUnknown = false)
-       {
-               $aQuick = array();
-               $aCounts = array();
 
-               foreach($aSpec as $aLine)
-               {
-                       if (is_array($aLine))
-                       {
-                               if ($aLine[0]) $aQuick['--'.$aLine[0]] = $aLine;
-                               if ($aLine[1]) $aQuick['-'.$aLine[1]] = $aLine;
-                               $aCounts[$aLine[0]] = 0;
-                       }
-               }
+function getCmdOpt($aArg, $aSpec, &$aResult, $bExitOnError = false, $bExitOnUnknown = false)
+{
+    $aQuick = array();
+    $aCounts = array();
 
-               $aResult = array();
-               $bUnknown = false;
-               $iSize = sizeof($aArg);
-               for ($i = 1; $i < $iSize; $i++)
-               {
-                       if (isset($aQuick[$aArg[$i]]))
-                       {
-                               $aLine = $aQuick[$aArg[$i]];
-                               $aCounts[$aLine[0]]++;
-                               $xVal = null;
-                               if ($aLine[4] == $aLine[5])
-                               {
-                                       if ($aLine[4])
-                                       {
-                                               $xVal = array();
-                                               for($n = $aLine[4]; $i < $iSize && $n; $n--)
-                                               {
-                                                       $i++;
-                                                       if ($i >= $iSize || $aArg[$i][0] == '-') showUsage($aSpec, $bExitOnError, 'Parameter of  \''.$aLine[0].'\' is missing');
+    foreach ($aSpec as $aLine) {
+        if (is_array($aLine)) {
+            if ($aLine[0]) $aQuick['--'.$aLine[0]] = $aLine;
+            if ($aLine[1]) $aQuick['-'.$aLine[1]] = $aLine;
+            $aCounts[$aLine[0]] = 0;
+        }
+    }
 
-                                                       switch ($aLine[6])
-                                                       {
-                                                       case 'realpath':
-                                                               $xVal[] = realpath($aArg[$i]);
-                                                               break;
-                                                       case 'realdir':
-                                                               $sPath = realpath(dirname($aArg[$i]));
-                                                               if ($sPath)
-                                                                       $xVal[] = $sPath . '/' . basename($aArg[$i]);
-                                                               else
-                                                                       $xVal[] = $sPath;
-                                                               break;
-                                                       case 'bool':
-                                                               $xVal[] = (bool)$aArg[$i];
-                                                               break;
-                                                       case 'int':
-                                                               $xVal[] = (int)$aArg[$i];
-                                                               break;
-                                                       case 'float':
-                                                               $xVal[] = (float)$aArg[$i];
-                                                               break;
-                                                       default:
-                                                               $xVal[] = $aArg[$i];
-                                                               break;
-                                                       }
-                                               }
-                                               if ($aLine[4] == 1) $xVal = $xVal[0];
-                                       }
-                                       else
-                                       {
-                                               $xVal = true;
-                                       }
-                               }
-                               else
-                               {
-                                       fail('Variable numbers of params not yet supported');
-                               }
+    $aResult = array();
+    $bUnknown = false;
+    $iSize = sizeof($aArg);
+    for ($i = 1; $i < $iSize; $i++) {
+        if (isset($aQuick[$aArg[$i]])) {
+            $aLine = $aQuick[$aArg[$i]];
+            $aCounts[$aLine[0]]++;
+            $xVal = null;
+            if ($aLine[4] == $aLine[5]) {
+                if ($aLine[4]) {
+                    $xVal = array();
+                    for ($n = $aLine[4]; $i < $iSize && $n; $n--) {
+                        $i++;
+                        if ($i >= $iSize || $aArg[$i][0] == '-') showUsage($aSpec, $bExitOnError, 'Parameter of  \''.$aLine[0].'\' is missing');
 
-                               if ($aLine[3] > 1)
-                               {
-                                       if (!array_key_exists($aLine[0], $aResult)) $aResult[$aLine[0]] = array();
-                                       $aResult[$aLine[0]][] = $xVal;
-                               }
-                               else
-                               {
-                                       $aResult[$aLine[0]] = $xVal;
-                               }
-                       }
-                       else
-                       {
-                               $bUnknown = $aArg[$i];
-                       }
-               }
+                        switch ($aLine[6]) {
+                            case 'realpath':
+                                $xVal[] = realpath($aArg[$i]);
+                                break;
+                            case 'realdir':
+                                $sPath = realpath(dirname($aArg[$i]));
+                                if ($sPath) {
+                                    $xVal[] = $sPath . '/' . basename($aArg[$i]);
+                                } else {
+                                    $xVal[] = $sPath;
+                                }
+                                break;
+                            case 'bool':
+                                $xVal[] = (bool)$aArg[$i];
+                                break;
+                            case 'int':
+                                $xVal[] = (int)$aArg[$i];
+                                break;
+                            case 'float':
+                                $xVal[] = (float)$aArg[$i];
+                                break;
+                            default:
+                                $xVal[] = $aArg[$i];
+                                break;
+                        }
+                    }
+                    if ($aLine[4] == 1) $xVal = $xVal[0];
+                } else {
+                    $xVal = true;
+                }
+            } else {
+                fail('Variable numbers of params not yet supported');
+            }
 
-               if (array_key_exists('help', $aResult)) showUsage($aSpec);
-               if ($bUnknown && $bExitOnUnknown) showUsage($aSpec, $bExitOnError, 'Unknown option \''.$bUnknown.'\'');
+            if ($aLine[3] > 1) {
+                if (!array_key_exists($aLine[0], $aResult)) $aResult[$aLine[0]] = array();
+                $aResult[$aLine[0]][] = $xVal;
+            } else {
+                $aResult[$aLine[0]] = $xVal;
+            }
+        } else {
+            $bUnknown = $aArg[$i];
+        }
+    }
 
-               foreach($aSpec as $aLine)
-               {
-                       if (is_array($aLine))
-                       {
-                               if ($aCounts[$aLine[0]] < $aLine[2]) 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');
-                               switch ($aLine[6])
-                               {
-                               case 'bool':
-                                       if (!array_key_exists($aLine[0], $aResult))
-                                               $aResult[$aLine[0]] = false;
-                                       break;
-                               }
-                       }
-               }
-               return $bUnknown;
-       }
+    if (array_key_exists('help', $aResult)) showUsage($aSpec);
+    if ($bUnknown && $bExitOnUnknown) showUsage($aSpec, $bExitOnError, 'Unknown option \''.$bUnknown.'\'');
 
-       function showUsage($aSpec, $bExit = false, $sError = false)
-       {
-               if ($sError)
-               {
-                       echo basename($_SERVER['argv'][0]).': '.$sError."\n";
-                       echo 'Try `'.basename($_SERVER['argv'][0]).' --help` for more information.'."\n";
-                       exit;
-               }
-               echo "Usage: ".basename($_SERVER['argv'][0])."\n";
-               $bFirst = true;
-               foreach($aSpec as $aLine)
-               {
-                       if (is_array($aLine))
-                       {
-                               if ($bFirst)
-                               {
-                                       $bFirst = false;
-                                       echo "\n";
-                               }
-                               $aNames = array();
-                               if ($aLine[1]) $aNames[] = '-'.$aLine[1];
-                               if ($aLine[0]) $aNames[] = '--'.$aLine[0];
-                               $sName = join(', ',$aNames);
-                               echo '  '.$sName.str_repeat(' ',30-strlen($sName)).$aLine[7]."\n";
-                       }
-                       else
-                       {
-                               echo $aLine."\n";
-                       }
-               }
-               echo "\n";
-               exit;
-       }
+    foreach ($aSpec as $aLine) {
+        if (is_array($aLine)) {
+            if ($aCounts[$aLine[0]] < $aLine[2]) 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');
+            switch ($aLine[6]) {
+                case 'bool':
+                    if (!array_key_exists($aLine[0], $aResult))
+                        $aResult[$aLine[0]] = false;
+                    break;
+            }
+        }
+    }
+    return $bUnknown;
+}
 
-       function chksql($oSql, $sMsg = false)
-       {
-               if (PEAR::isError($oSql))
-               {
-                       fail($sMsg || $oSql->getMessage(), $oSql->userinfo);
-               }
+function showUsage($aSpec, $bExit = false, $sError = false)
+{
+    if ($sError) {
+        echo basename($_SERVER['argv'][0]).': '.$sError."\n";
+        echo 'Try `'.basename($_SERVER['argv'][0]).' --help` for more information.'."\n";
+        exit;
+    }
+    echo "Usage: ".basename($_SERVER['argv'][0])."\n";
+    $bFirst = true;
+    foreach ($aSpec as $aLine) {
+        if (is_array($aLine)) {
+            if ($bFirst) {
+                $bFirst = false;
+                echo "\n";
+            }
+            $aNames = array();
+            if ($aLine[1]) $aNames[] = '-'.$aLine[1];
+            if ($aLine[0]) $aNames[] = '--'.$aLine[0];
+            $sName = join(', ', $aNames);
+            echo '  '.$sName.str_repeat(' ', 30-strlen($sName)).$aLine[7]."\n";
+        } else {
+            echo $aLine."\n";
+        }
+    }
+    echo "\n";
+    exit;
+}
 
-               return $oSql;
-       }
+function chksql($oSql, $sMsg = false)
+{
+    if (PEAR::isError($oSql)) {
+        fail($sMsg || $oSql->getMessage(), $oSql->userinfo);
+    }
+
+    return $oSql;
+}
index 822acc37d4997f64bca66bc7ea506dcb3ab0f9e3..145c57d0b09847b1491bdfe5d72612d6ad192376 100644 (file)
@@ -1,34 +1,38 @@
 <?php
-       require_once('DB.php');
 
-       function &getDB($bNew = false, $bPersistent = false)
-       {
-               // Get the database object
-               $oDB = chksql(DB::connect(CONST_Database_DSN.($bNew?'?new_link=true':''), $bPersistent),
-                             "Failed to establish database connection");
-               $oDB->setFetchMode(DB_FETCHMODE_ASSOC);
-               $oDB->query("SET DateStyle TO 'sql,european'");
-               $oDB->query("SET client_encoding TO 'utf-8'");
-               $iMaxExecution = ini_get('max_execution_time') * 1000;
-               if ($iMaxExecution > 0) $oDB->query("SET statement_timeout TO $iMaxExecution");
-               return $oDB;
-       }
+require_once('DB.php');
 
-       function getDBQuoted($s)
-       {
-               return "'".pg_escape_string($s)."'";
-       }
 
-       function getPostgresVersion(&$oDB)
-       {
-               $sVersionString = $oDB->getOne('select version()');
-               preg_match('#PostgreSQL ([0-9]+)[.]([0-9]+)[^0-9]#', $sVersionString, $aMatches);
-               return (float) ($aMatches[1].'.'.$aMatches[2]);
-       }
+function &getDB($bNew = false, $bPersistent = false)
+{
+    // Get the database object
+    $oDB = chksql(
+        DB::connect(CONST_Database_DSN.($bNew?'?new_link=true':''), $bPersistent),
+        "Failed to establish database connection"
+    );
+    $oDB->setFetchMode(DB_FETCHMODE_ASSOC);
+    $oDB->query("SET DateStyle TO 'sql,european'");
+    $oDB->query("SET client_encoding TO 'utf-8'");
+    $iMaxExecution = ini_get('max_execution_time') * 1000;
+    if ($iMaxExecution > 0) $oDB->query("SET statement_timeout TO $iMaxExecution");
+    return $oDB;
+}
 
-       function getPostgisVersion(&$oDB)
-       {
-               $sVersionString = $oDB->getOne('select postgis_full_version()');
-               preg_match('#POSTGIS="([0-9]+)[.]([0-9]+)[.]([0-9]+)( r([0-9]+))?"#', $sVersionString, $aMatches);
-               return (float) ($aMatches[1].'.'.$aMatches[2]);
-       }
+function getDBQuoted($s)
+{
+    return "'".pg_escape_string($s)."'";
+}
+
+function getPostgresVersion(&$oDB)
+{
+    $sVersionString = $oDB->getOne('select version()');
+    preg_match('#PostgreSQL ([0-9]+)[.]([0-9]+)[^0-9]#', $sVersionString, $aMatches);
+    return (float) ($aMatches[1].'.'.$aMatches[2]);
+}
+
+function getPostgisVersion(&$oDB)
+{
+    $sVersionString = $oDB->getOne('select postgis_full_version()');
+    preg_match('#POSTGIS="([0-9]+)[.]([0-9]+)[.]([0-9]+)( r([0-9]+))?"#', $sVersionString, $aMatches);
+    return (float) ($aMatches[1].'.'.$aMatches[2]);
+}
index 274256a642e96bd58339dec1f50de75d9ae1e636..860ef2158264b5a9c910af85388079111eac5ec1 100644 (file)
@@ -1,26 +1,27 @@
 <?php
-       require_once('init.php');
-       require_once('cmd.php');
 
-       // handle http proxy when using file_get_contents
-       if (CONST_HTTP_Proxy) {
-         $proxy = 'tcp://' . CONST_HTTP_Proxy_Host . ':' . CONST_HTTP_Proxy_Port;
-         $aHeaders = array();
-         if(CONST_HTTP_Proxy_Login != null && CONST_HTTP_Proxy_Login != '' && CONST_HTTP_Proxy_Password != null && CONST_HTTP_Proxy_Password != '') {
-           $auth = base64_encode(CONST_HTTP_Proxy_Login . ':' . CONST_HTTP_Proxy_Password);
-           $aHeaders = array("Proxy-Authorization: Basic $auth");
-         }
-         $aContext = array(
-           'http' => array(
-             'proxy' => $proxy,
-             'request_fulluri' => true,
-             'header' => $aHeaders
-           ),
-           'https' => array(
-             'proxy' => $proxy,
-             'request_fulluri' => true,
-             'header' => $aHeaders
-           )
-         );
-         stream_context_set_default($aContext);
-       }
+require_once('init.php');
+require_once('cmd.php');
+
+// handle http proxy when using file_get_contents
+if (CONST_HTTP_Proxy) {
+    $proxy = 'tcp://' . CONST_HTTP_Proxy_Host . ':' . CONST_HTTP_Proxy_Port;
+    $aHeaders = array();
+    if (CONST_HTTP_Proxy_Login != null && CONST_HTTP_Proxy_Login != '' && CONST_HTTP_Proxy_Password != null && CONST_HTTP_Proxy_Password != '') {
+        $auth = base64_encode(CONST_HTTP_Proxy_Login . ':' . CONST_HTTP_Proxy_Password);
+        $aHeaders = array("Proxy-Authorization: Basic $auth");
+    }
+    $aContext = array(
+                 'http' => array(
+                            'proxy' => $proxy,
+                            'request_fulluri' => true,
+                            'header' => $aHeaders
+                           ),
+                 'https' => array(
+                             'proxy' => $proxy,
+                             'request_fulluri' => true,
+                             'header' => $aHeaders
+                            )
+                );
+    stream_context_set_default($aContext);
+}
index db03a12ce1b694381412dd8e636e19bad6f4fb3f..4ca927cfcdb38efcf11475d7e71c9838ed01cc8b 100644 (file)
@@ -1,17 +1,98 @@
 <?php
-       require_once('init.php');
-       require_once('website.php');
-
-       if (CONST_NoAccessControl)
-       {
-               header("Access-Control-Allow-Origin: *");
-               header("Access-Control-Allow-Methods: OPTIONS,GET");
-               header("Access-Control-Max-Age: 8640000");
-               if (!empty($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']))
-               {
-                       header("Access-Control-Allow-Headers: ".$_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']);
-               }
-       }
-       if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') exit;
-
-       header('Content-type: text/html; charset=utf-8');
+
+require_once('init.php');
+require_once('ParameterParser.php');
+
+/***************************************************************************
+ *
+ * Error handling functions
+ *
+ */
+
+
+function chksql($oSql, $sMsg = "Database request failed")
+{
+    if (!PEAR::isError($oSql)) return $oSql;
+
+    header('HTTP/1.0 500 Internal Server Error');
+    header('Content-type: text/html; charset=utf-8');
+
+    $sSqlError = $oSql->getMessage();
+
+    echo <<<INTERNALFAIL
+<html>
+  <head><title>Internal Server Error</title></head>
+  <body>
+    <h1>Internal Server Error</h1>
+    <p>Nominatim has encountered an internal error while accessing the database.
+       This may happen because the database is broken or because of a bug in
+       the software. If you think it is a bug, feel free to report
+       it over on <a href="https://github.com/twain47/Nominatim/issues">
+       Github</a>. Please include the URL that caused the problem and the
+       complete error details below.</p>
+    <p><b>Message:</b> $sMsg</p>
+    <p><b>SQL Error:</b> $sSqlError</p>
+    <p><b>Details:</b> <pre>
+INTERNALFAIL;
+
+    if (CONST_Debug) {
+        var_dump($oSql);
+    } else {
+        echo "<pre>\n".$oSql->getUserInfo()."</pre>";
+    }
+
+    echo "</pre></p></body></html>";
+    exit;
+}
+
+function failInternalError($sError, $sSQL = false, $vDumpVar = false)
+{
+    header('HTTP/1.0 500 Internal Server Error');
+    header('Content-type: text/html; charset=utf-8');
+    echo "<html><body><h1>Internal Server Error</h1>";
+    echo '<p>Nominatim has encountered an internal error while processing your request. This is most likely because of a bug in the software.</p>';
+    echo "<p><b>Details:</b> ".$sError,"</p>";
+    echo '<p>Feel free to file an issue on <a href="https://github.com/twain47/Nominatim/issues">Github</a>. Please include the error message above and the URL you used.</p>';
+    if (CONST_Debug) {
+        echo "<hr><h2>Debugging Information</h2><br>";
+        if ($sSQL) {
+            echo "<h3>SQL query</h3><code>".$sSQL."</code>";
+        }
+        if ($vDumpVar) {
+            echo "<h3>Result</h3> <code>";
+            var_dump($vDumpVar);
+            echo "</code>";
+        }
+    }
+    echo "\n</body></html>\n";
+    exit;
+}
+
+
+function userError($sError)
+{
+    header('HTTP/1.0 400 Bad Request');
+    header('Content-type: text/html; charset=utf-8');
+    echo "<html><body><h1>Bad Request</h1>";
+    echo '<p>Nominatim has encountered an error with your request.</p>';
+    echo "<p><b>Details:</b> ".$sError."</p>";
+    echo '<p>If you feel this error is incorrect feel file an issue on <a href="https://github.com/twain47/Nominatim/issues">Github</a>. Please include the error message above and the URL you used.</p>';
+    echo "\n</body></html>\n";
+    exit;
+}
+
+
+/***************************************************************************
+ * HTTP Reply header setup
+ */
+
+if (CONST_NoAccessControl) {
+    header("Access-Control-Allow-Origin: *");
+    header("Access-Control-Allow-Methods: OPTIONS,GET");
+    if (!empty($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS'])) {
+        header("Access-Control-Allow-Headers: ".$_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']);
+    }
+}
+if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') exit;
+
+if (CONST_Debug) header('Content-type: text/html; charset=utf-8');
index 1d47c98fb2e4a6f652a557af640352c315f1e97a..d21880715abcbe8f91429c2effb973d603de768e 100644 (file)
@@ -1,10 +1,9 @@
 <?php
 
-       require_once(CONST_BasePath.'/lib/lib.php');
-       require_once(CONST_BasePath.'/lib/db.php');
+require_once(CONST_BasePath.'/lib/lib.php');
+require_once(CONST_BasePath.'/lib/db.php');
 
-       if (get_magic_quotes_gpc())
-       {
-               echo "Please disable magic quotes in your php.ini configuration\n";
-               exit;
-       }
+if (get_magic_quotes_gpc()) {
+    echo "Please disable magic quotes in your php.ini configuration\n";
+    exit;
+}
index 2278c6c1a2d00f1de93fff56cfed595838fc5332..9de2a548b54ae9378b96d7c12aa8b254e6f9ede8 100644 (file)
 <?php
 
-       function fail($sError, $sUserError = false)
-       {
-               if (!$sUserError) $sUserError = $sError;
-               error_log('ERROR: '.$sError);
-               echo $sUserError."\n";
-               exit(-1);
-       }
-
-
-       function getProcessorCount()
-       {
-               $sCPU = file_get_contents('/proc/cpuinfo');
-               preg_match_all('#processor\s+: [0-9]+#', $sCPU, $aMatches);
-               return sizeof($aMatches[0]);
-       }
-
-
-       function getTotalMemoryMB()
-       {
-               $sCPU = file_get_contents('/proc/meminfo');
-               preg_match('#MemTotal: +([0-9]+) kB#', $sCPU, $aMatches);
-               return (int)($aMatches[1]/1024);
-       }
-
-
-       function getCacheMemoryMB()
-       {
-               $sCPU = file_get_contents('/proc/meminfo');
-               preg_match('#Cached: +([0-9]+) kB#', $sCPU, $aMatches);
-               return (int)($aMatches[1]/1024);
-       }
-
-
-       function bySearchRank($a, $b)
-       {
-               if ($a['iSearchRank'] == $b['iSearchRank'])
-                       return strlen($a['sOperator']) + strlen($a['sHouseNumber']) - strlen($b['sOperator']) - strlen($b['sHouseNumber']);
-               return ($a['iSearchRank'] < $b['iSearchRank']?-1:1);
-       }
-
-
-       function byImportance($a, $b)
-       {
-               if ($a['importance'] != $b['importance'])
-                       return ($a['importance'] > $b['importance']?-1:1);
-
-               return ($a['foundorder'] < $b['foundorder']?-1:1);
-       }
-
-
-       function getPreferredLanguages($sLangString=false)
-       {
-               if (!$sLangString)
-               {
-                       // If we have been provided the value in $_GET it overrides browser value
-                       if (isset($_GET['accept-language']) && $_GET['accept-language'])
-                       {
-                               $_SERVER["HTTP_ACCEPT_LANGUAGE"] = $_GET['accept-language'];
-                               $sLangString = $_GET['accept-language'];
-                       }
-                       else if (isset($_SERVER["HTTP_ACCEPT_LANGUAGE"]))
-                       {
-                               $sLangString = $_SERVER["HTTP_ACCEPT_LANGUAGE"];
-                       }
-               }
-
-               $aLanguages = array();
-               if ($sLangString)
-               {
-                       if (preg_match_all('/(([a-z]{1,8})(-[a-z]{1,8})?)\s*(;\s*q\s*=\s*(1|0\.[0-9]+))?/i', $sLangString, $aLanguagesParse, PREG_SET_ORDER))
-                       {
-                               foreach($aLanguagesParse as $iLang => $aLanguage)
-                               {
-                                       $aLanguages[$aLanguage[1]] = isset($aLanguage[5])?(float)$aLanguage[5]:1 - ($iLang/100);
-                                       if (!isset($aLanguages[$aLanguage[2]])) $aLanguages[$aLanguage[2]] = $aLanguages[$aLanguage[1]]/10;
-                               }
-                               arsort($aLanguages);
-                       }
-               }
-               if (!sizeof($aLanguages) && CONST_Default_Language) $aLanguages = array(CONST_Default_Language=>1);
-               foreach($aLanguages as $sLangauge => $fLangauagePref)
-               {
-                       $aLangPrefOrder['short_name:'.$sLangauge] = 'short_name:'.$sLangauge;
-               }
-               foreach($aLanguages as $sLangauge => $fLangauagePref)
-               {
-                       $aLangPrefOrder['name:'.$sLangauge] = 'name:'.$sLangauge;
-               }
-               foreach($aLanguages as $sLangauge => $fLangauagePref)
-               {
-                       $aLangPrefOrder['place_name:'.$sLangauge] = 'place_name:'.$sLangauge;
-               }
-               foreach($aLanguages as $sLangauge => $fLangauagePref)
-               {
-                       $aLangPrefOrder['official_name:'.$sLangauge] = 'official_name:'.$sLangauge;
-               }
-               $aLangPrefOrder['short_name'] = 'short_name';
-               $aLangPrefOrder['name'] = 'name';
-               $aLangPrefOrder['place_name'] = 'place_name';
-               $aLangPrefOrder['official_name'] = 'official_name';
-               $aLangPrefOrder['ref'] = 'ref';
-               $aLangPrefOrder['type'] = 'type';
-               return $aLangPrefOrder;
-       }
-
-
-       function getWordSets($aWords, $iDepth)
-       {
-               $aResult = array(array(join(' ',$aWords)));
-               $sFirstToken = '';
-               if ($iDepth < 7) {
-                       while(sizeof($aWords) > 1)
-                       {
-                               $sWord = array_shift($aWords);
-                               $sFirstToken .= ($sFirstToken?' ':'').$sWord;
-                               $aRest = getWordSets($aWords, $iDepth+1);
-                               foreach($aRest as $aSet)
-                               {
-                                       $aResult[] = array_merge(array($sFirstToken),$aSet);
-                               }
-                       }
-               }
-               return $aResult;
-       }
-
-       function getInverseWordSets($aWords, $iDepth)
-       {
-               $aResult = array(array(join(' ',$aWords)));
-               $sFirstToken = '';
-               if ($iDepth < 8)
-               {
-                       while(sizeof($aWords) > 1)
-                       {
-                               $sWord = array_pop($aWords);
-                               $sFirstToken = $sWord.($sFirstToken?' ':'').$sFirstToken;
-                               $aRest = getInverseWordSets($aWords, $iDepth+1);
-                               foreach($aRest as $aSet)
-                               {
-                                       $aResult[] = array_merge(array($sFirstToken),$aSet);
-                               }
-                       }
-               }
-               return $aResult;
-       }
-
-
-       function getTokensFromSets($aSets)
-       {
-               $aTokens = array();
-               foreach($aSets as $aSet)
-               {
-                       foreach($aSet as $sWord)
-                       {
-                               $aTokens[' '.$sWord] = ' '.$sWord;
-                               $aTokens[$sWord] = $sWord;
-                       }
-               }
-               return $aTokens;
-       }
-
-
-       /*
-          GB Postcode functions
-        */
-
-       function gbPostcodeCalculate($sPostcode, $sPostcodeSector, $sPostcodeEnd, &$oDB)
-       {
-               // Try an exact match on the gb_postcode table
-               $sSQL = 'select \'AA\', ST_X(ST_Centroid(geometry)) as lon,ST_Y(ST_Centroid(geometry)) as lat from gb_postcode where postcode = \''.$sPostcode.'\'';
-               $aNearPostcodes = chksql($oDB->getAll($sSQL));
-
-               if (sizeof($aNearPostcodes))
-               {
-                       $aPostcodes = array();
-                       foreach($aNearPostcodes as $aPostcode)
-                       {
-                               $aPostcodes[] = array('lat' => $aPostcode['lat'], 'lon' => $aPostcode['lon'], 'radius' => 0.005);
-                       }
-
-                       return $aPostcodes;
-               }
-
-               return false;
-       }
-
-
-       function getClassTypes()
-       {
-               return array(
- 'boundary:administrative:1' => array('label'=>'Continent','frequency'=>0,'icon'=>'poi_boundary_administrative', 'defdiameter' => 0.32,),
- 'boundary:administrative:2' => array('label'=>'Country','frequency'=>0,'icon'=>'poi_boundary_administrative', 'defdiameter' => 0.32,),
- 'place:country' => array('label'=>'Country','frequency'=>0,'icon'=>'poi_boundary_administrative','defzoom'=>6, 'defdiameter' => 15,),
- 'boundary:administrative:3' => array('label'=>'State','frequency'=>0,'icon'=>'poi_boundary_administrative', 'defdiameter' => 0.32,),
- 'boundary:administrative:4' => array('label'=>'State','frequency'=>0,'icon'=>'poi_boundary_administrative', 'defdiameter' => 0.32,),
- 'place:state' => array('label'=>'State','frequency'=>0,'icon'=>'poi_boundary_administrative','defzoom'=>8, 'defdiameter' => 5.12,),
- 'boundary:administrative:5' => array('label'=>'State District','frequency'=>0,'icon'=>'poi_boundary_administrative', 'defdiameter' => 0.32,),
- 'boundary:administrative:6' => array('label'=>'County','frequency'=>0,'icon'=>'poi_boundary_administrative', 'defdiameter' => 0.32,),
- 'boundary:administrative:7' => array('label'=>'County','frequency'=>0,'icon'=>'poi_boundary_administrative', 'defdiameter' => 0.32,),
- 'place:county' => array('label'=>'County','frequency'=>108,'icon'=>'poi_boundary_administrative','defzoom'=>10, 'defdiameter' => 1.28,),
- 'boundary:administrative:8' => array('label'=>'City','frequency'=>0,'icon'=>'poi_boundary_administrative', 'defdiameter' => 0.32,),
- 'place:city' => array('label'=>'City','frequency'=>66,'icon'=>'poi_place_city','defzoom'=>12, 'defdiameter' => 0.32,),
- 'boundary:administrative:9' => array('label'=>'City District','frequency'=>0,'icon'=>'poi_boundary_administrative', 'defdiameter' => 0.32,),
- 'boundary:administrative:10' => array('label'=>'Suburb','frequency'=>0,'icon'=>'poi_boundary_administrative', 'defdiameter' => 0.32,),
- 'boundary:administrative:11' => array('label'=>'Neighbourhood','frequency'=>0,'icon'=>'poi_boundary_administrative', 'defdiameter' => 0.32,),
- 'place:region' => array('label'=>'Region','frequency'=>0,'icon'=>'poi_boundary_administrative','defzoom'=>8, 'defdiameter' => 0.04,),
- 'place:island' => array('label'=>'Island','frequency'=>288,'icon'=>'','defzoom'=>11, 'defdiameter' => 0.64,),
- 'boundary:administrative' => array('label'=>'Administrative','frequency'=>413,'icon'=>'poi_boundary_administrative', 'defdiameter' => 0.32,),
- 'boundary:postal_code' => array('label'=>'Postcode','frequency'=>413,'icon'=>'poi_boundary_administrative', 'defdiameter' => 0.32,),
- 'place:town' => array('label'=>'Town','frequency'=>1497,'icon'=>'poi_place_town','defzoom'=>14, 'defdiameter' => 0.08,),
- 'place:village' => array('label'=>'Village','frequency'=>11230,'icon'=>'poi_place_village','defzoom'=>15, 'defdiameter' => 0.04,),
- 'place:hamlet' => array('label'=>'Hamlet','frequency'=>7075,'icon'=>'poi_place_village','defzoom'=>15, 'defdiameter' => 0.04,),
- 'place:suburb' => array('label'=>'Suburb','frequency'=>2528,'icon'=>'poi_place_village', 'defdiameter' => 0.04,),
- 'place:locality' => array('label'=>'Locality','frequency'=>4113,'icon'=>'poi_place_village', 'defdiameter' => 0.02,),
- 'landuse:farm' => array('label'=>'Farm','frequency'=>1201,'icon'=>'', 'defdiameter' => 0.02,),
- 'place:farm' => array('label'=>'Farm','frequency'=>1162,'icon'=>'', 'defdiameter' => 0.02,),
-
- 'highway:motorway_junction' => array('label'=>'Motorway Junction','frequency'=>1126,'icon'=>'','simplelabel'=>'Junction',),
- 'highway:motorway' => array('label'=>'Motorway','frequency'=>4627,'icon'=>'','simplelabel'=>'Road',),
- 'highway:trunk' => array('label'=>'Trunk','frequency'=>23084,'icon'=>'','simplelabel'=>'Road',),
- 'highway:primary' => array('label'=>'Primary','frequency'=>32138,'icon'=>'','simplelabel'=>'Road',),
- 'highway:secondary' => array('label'=>'Secondary','frequency'=>25807,'icon'=>'','simplelabel'=>'Road',),
- 'highway:tertiary' => array('label'=>'Tertiary','frequency'=>29829,'icon'=>'','simplelabel'=>'Road',),
- 'highway:residential' => array('label'=>'Residential','frequency'=>361498,'icon'=>'','simplelabel'=>'Road',),
- 'highway:unclassified' => array('label'=>'Unclassified','frequency'=>66441,'icon'=>'','simplelabel'=>'Road',),
- 'highway:living_street' => array('label'=>'Living Street','frequency'=>710,'icon'=>'','simplelabel'=>'Road',),
- 'highway:service' => array('label'=>'Service','frequency'=>9963,'icon'=>'','simplelabel'=>'Road',),
- 'highway:track' => array('label'=>'Track','frequency'=>2565,'icon'=>'','simplelabel'=>'Road',),
- 'highway:road' => array('label'=>'Road','frequency'=>591,'icon'=>'','simplelabel'=>'Road',),
- 'highway:byway' => array('label'=>'Byway','frequency'=>346,'icon'=>'','simplelabel'=>'Road',),
- 'highway:bridleway' => array('label'=>'Bridleway','frequency'=>1556,'icon'=>'',),
- 'highway:cycleway' => array('label'=>'Cycleway','frequency'=>2419,'icon'=>'',),
- 'highway:pedestrian' => array('label'=>'Pedestrian','frequency'=>2757,'icon'=>'',),
- 'highway:footway' => array('label'=>'Footway','frequency'=>15008,'icon'=>'',),
- 'highway:steps' => array('label'=>'Steps','frequency'=>444,'icon'=>'','simplelabel'=>'Footway',),
- 'highway:motorway_link' => array('label'=>'Motorway Link','frequency'=>795,'icon'=>'','simplelabel'=>'Road',),
- 'highway:trunk_link' => array('label'=>'Trunk Link','frequency'=>1258,'icon'=>'','simplelabel'=>'Road',),
- 'highway:primary_link' => array('label'=>'Primary Link','frequency'=>313,'icon'=>'','simplelabel'=>'Road',),
-
- 'landuse:industrial' => array('label'=>'Industrial','frequency'=>1062,'icon'=>'',),
- 'landuse:residential' => array('label'=>'Residential','frequency'=>886,'icon'=>'',),
- 'landuse:retail' => array('label'=>'Retail','frequency'=>754,'icon'=>'',),
- 'landuse:commercial' => array('label'=>'Commercial','frequency'=>657,'icon'=>'',),
-
- 'place:airport' => array('label'=>'Airport','frequency'=>36,'icon'=>'transport_airport2', 'defdiameter' => 0.03,),
- 'aeroway:aerodrome' => array('label'=>'Aerodrome','frequency'=>36,'icon'=>'transport_airport2', 'defdiameter' => 0.03,),
- 'aeroway' => array('label'=>'Aeroway','frequency'=>36,'icon'=>'transport_airport2', 'defdiameter' => 0.03,),
- 'railway:station' => array('label'=>'Station','frequency'=>3431,'icon'=>'transport_train_station2', 'defdiameter' => 0.01,),
- 'amenity:place_of_worship' => array('label'=>'Place Of Worship','frequency'=>9049,'icon'=>'place_of_worship_unknown3',),
- 'amenity:pub' => array('label'=>'Pub','frequency'=>18969,'icon'=>'food_pub',),
- 'amenity:bar' => array('label'=>'Bar','frequency'=>164,'icon'=>'food_bar',),
- 'amenity:university' => array('label'=>'University','frequency'=>607,'icon'=>'education_university',),
- 'tourism:museum' => array('label'=>'Museum','frequency'=>543,'icon'=>'tourist_museum',),
- 'amenity:arts_centre' => array('label'=>'Arts Centre','frequency'=>136,'icon'=>'tourist_art_gallery2',),
- 'tourism:zoo' => array('label'=>'Zoo','frequency'=>47,'icon'=>'tourist_zoo',),
- 'tourism:theme_park' => array('label'=>'Theme Park','frequency'=>24,'icon'=>'poi_point_of_interest',),
- 'tourism:attraction' => array('label'=>'Attraction','frequency'=>1463,'icon'=>'poi_point_of_interest',),
- 'leisure:golf_course' => array('label'=>'Golf Course','frequency'=>712,'icon'=>'sport_golf',),
- 'historic:castle' => array('label'=>'Castle','frequency'=>316,'icon'=>'tourist_castle',),
- 'amenity:hospital' => array('label'=>'Hospital','frequency'=>879,'icon'=>'health_hospital',),
- 'amenity:school' => array('label'=>'School','frequency'=>8192,'icon'=>'education_school',),
- 'amenity:theatre' => array('label'=>'Theatre','frequency'=>371,'icon'=>'tourist_theatre',),
- 'amenity:public_building' => array('label'=>'Public Building','frequency'=>985,'icon'=>'',),
- 'amenity:library' => array('label'=>'Library','frequency'=>794,'icon'=>'amenity_library',),
- 'amenity:townhall' => array('label'=>'Townhall','frequency'=>242,'icon'=>'',),
- 'amenity:community_centre' => array('label'=>'Community Centre','frequency'=>157,'icon'=>'',),
- 'amenity:fire_station' => array('label'=>'Fire Station','frequency'=>221,'icon'=>'amenity_firestation3',),
- 'amenity:police' => array('label'=>'Police','frequency'=>334,'icon'=>'amenity_police2',),
- 'amenity:bank' => array('label'=>'Bank','frequency'=>1248,'icon'=>'money_bank2',),
- 'amenity:post_office' => array('label'=>'Post Office','frequency'=>859,'icon'=>'amenity_post_office',),
- 'leisure:park' => array('label'=>'Park','frequency'=>2378,'icon'=>'',),
- 'amenity:park' => array('label'=>'Park','frequency'=>53,'icon'=>'',),
- 'landuse:park' => array('label'=>'Park','frequency'=>50,'icon'=>'',),
- 'landuse:recreation_ground' => array('label'=>'Recreation Ground','frequency'=>517,'icon'=>'',),
- 'tourism:hotel' => array('label'=>'Hotel','frequency'=>2150,'icon'=>'accommodation_hotel2',),
- 'tourism:motel' => array('label'=>'Motel','frequency'=>43,'icon'=>'',),
- 'amenity:cinema' => array('label'=>'Cinema','frequency'=>277,'icon'=>'tourist_cinema',),
- 'tourism:artwork' => array('label'=>'Artwork','frequency'=>171,'icon'=>'tourist_art_gallery2',),
- 'historic:archaeological_site' => array('label'=>'Archaeological Site','frequency'=>407,'icon'=>'tourist_archaeological2',),
- 'amenity:doctors' => array('label'=>'Doctors','frequency'=>581,'icon'=>'health_doctors',),
- 'leisure:sports_centre' => array('label'=>'Sports Centre','frequency'=>767,'icon'=>'sport_leisure_centre',),
- 'leisure:swimming_pool' => array('label'=>'Swimming Pool','frequency'=>24,'icon'=>'sport_swimming_outdoor',),
- 'shop:supermarket' => array('label'=>'Supermarket','frequency'=>2673,'icon'=>'shopping_supermarket',),
- 'shop:convenience' => array('label'=>'Convenience','frequency'=>1469,'icon'=>'shopping_convenience',),
- 'amenity:restaurant' => array('label'=>'Restaurant','frequency'=>3179,'icon'=>'food_restaurant',),
- 'amenity:fast_food' => array('label'=>'Fast Food','frequency'=>2289,'icon'=>'food_fastfood',),
- 'amenity:cafe' => array('label'=>'Cafe','frequency'=>1780,'icon'=>'food_cafe',),
- 'tourism:guest_house' => array('label'=>'Guest House','frequency'=>223,'icon'=>'accommodation_bed_and_breakfast',),
- 'amenity:pharmacy' => array('label'=>'Pharmacy','frequency'=>733,'icon'=>'health_pharmacy_dispensing',),
- 'amenity:fuel' => array('label'=>'Fuel','frequency'=>1308,'icon'=>'transport_fuel',),
- 'natural:peak' => array('label'=>'Peak','frequency'=>3212,'icon'=>'poi_peak',),
- 'waterway:waterfall' => array('label'=>'Waterfall','frequency'=>24,'icon'=>'',),
- 'natural:wood' => array('label'=>'Wood','frequency'=>1845,'icon'=>'landuse_coniferous_and_deciduous',),
- 'natural:water' => array('label'=>'Water','frequency'=>1790,'icon'=>'',),
- 'landuse:forest' => array('label'=>'Forest','frequency'=>467,'icon'=>'',),
- 'landuse:cemetery' => array('label'=>'Cemetery','frequency'=>463,'icon'=>'',),
- 'landuse:allotments' => array('label'=>'Allotments','frequency'=>408,'icon'=>'',),
- 'landuse:farmyard' => array('label'=>'Farmyard','frequency'=>397,'icon'=>'',),
- 'railway:rail' => array('label'=>'Rail','frequency'=>4894,'icon'=>'',),
- 'waterway:canal' => array('label'=>'Canal','frequency'=>1723,'icon'=>'',),
- 'waterway:river' => array('label'=>'River','frequency'=>4089,'icon'=>'',),
- 'waterway:stream' => array('label'=>'Stream','frequency'=>2684,'icon'=>'',),
- 'shop:bicycle' => array('label'=>'Bicycle','frequency'=>349,'icon'=>'shopping_bicycle',),
- 'shop:clothes' => array('label'=>'Clothes','frequency'=>315,'icon'=>'shopping_clothes',),
- 'shop:hairdresser' => array('label'=>'Hairdresser','frequency'=>312,'icon'=>'shopping_hairdresser',),
- 'shop:doityourself' => array('label'=>'Doityourself','frequency'=>247,'icon'=>'shopping_diy',),
- 'shop:estate_agent' => array('label'=>'Estate Agent','frequency'=>162,'icon'=>'shopping_estateagent2',),
- 'shop:car' => array('label'=>'Car','frequency'=>159,'icon'=>'shopping_car',),
- 'shop:garden_centre' => array('label'=>'Garden Centre','frequency'=>143,'icon'=>'shopping_garden_centre',),
- 'shop:car_repair' => array('label'=>'Car Repair','frequency'=>141,'icon'=>'shopping_car_repair',),
- 'shop:newsagent' => array('label'=>'Newsagent','frequency'=>132,'icon'=>'',),
- 'shop:bakery' => array('label'=>'Bakery','frequency'=>129,'icon'=>'shopping_bakery',),
- 'shop:furniture' => array('label'=>'Furniture','frequency'=>124,'icon'=>'',),
- 'shop:butcher' => array('label'=>'Butcher','frequency'=>105,'icon'=>'shopping_butcher',),
- 'shop:apparel' => array('label'=>'Apparel','frequency'=>98,'icon'=>'shopping_clothes',),
- 'shop:electronics' => array('label'=>'Electronics','frequency'=>96,'icon'=>'',),
- 'shop:department_store' => array('label'=>'Department Store','frequency'=>86,'icon'=>'',),
- 'shop:books' => array('label'=>'Books','frequency'=>85,'icon'=>'',),
- 'shop:yes' => array('label'=>'Shop','frequency'=>68,'icon'=>'',),
- 'shop:outdoor' => array('label'=>'Outdoor','frequency'=>67,'icon'=>'',),
- 'shop:mall' => array('label'=>'Mall','frequency'=>63,'icon'=>'',),
- 'shop:florist' => array('label'=>'Florist','frequency'=>61,'icon'=>'',),
- 'shop:charity' => array('label'=>'Charity','frequency'=>60,'icon'=>'',),
- 'shop:hardware' => array('label'=>'Hardware','frequency'=>59,'icon'=>'',),
- 'shop:laundry' => array('label'=>'Laundry','frequency'=>51,'icon'=>'shopping_laundrette',),
- 'shop:shoes' => array('label'=>'Shoes','frequency'=>49,'icon'=>'',),
- 'shop:beverages' => array('label'=>'Beverages','frequency'=>48,'icon'=>'shopping_alcohol',),
- 'shop:dry_cleaning' => array('label'=>'Dry Cleaning','frequency'=>46,'icon'=>'',),
- 'shop:carpet' => array('label'=>'Carpet','frequency'=>45,'icon'=>'',),
- 'shop:computer' => array('label'=>'Computer','frequency'=>44,'icon'=>'',),
- 'shop:alcohol' => array('label'=>'Alcohol','frequency'=>44,'icon'=>'shopping_alcohol',),
- 'shop:optician' => array('label'=>'Optician','frequency'=>55,'icon'=>'health_opticians',),
- 'shop:chemist' => array('label'=>'Chemist','frequency'=>42,'icon'=>'health_pharmacy',),
- 'shop:gallery' => array('label'=>'Gallery','frequency'=>38,'icon'=>'tourist_art_gallery2',),
- 'shop:mobile_phone' => array('label'=>'Mobile Phone','frequency'=>37,'icon'=>'',),
- 'shop:sports' => array('label'=>'Sports','frequency'=>37,'icon'=>'',),
- 'shop:jewelry' => array('label'=>'Jewelry','frequency'=>32,'icon'=>'shopping_jewelry',),
- 'shop:pet' => array('label'=>'Pet','frequency'=>29,'icon'=>'',),
- 'shop:beauty' => array('label'=>'Beauty','frequency'=>28,'icon'=>'',),
- 'shop:stationery' => array('label'=>'Stationery','frequency'=>25,'icon'=>'',),
- 'shop:shopping_centre' => array('label'=>'Shopping Centre','frequency'=>25,'icon'=>'',),
- 'shop:general' => array('label'=>'General','frequency'=>25,'icon'=>'',),
- 'shop:electrical' => array('label'=>'Electrical','frequency'=>25,'icon'=>'',),
- 'shop:toys' => array('label'=>'Toys','frequency'=>23,'icon'=>'',),
- 'shop:jeweller' => array('label'=>'Jeweller','frequency'=>23,'icon'=>'',),
- 'shop:betting' => array('label'=>'Betting','frequency'=>23,'icon'=>'',),
- 'shop:household' => array('label'=>'Household','frequency'=>21,'icon'=>'',),
- 'shop:travel_agency' => array('label'=>'Travel Agency','frequency'=>21,'icon'=>'',),
- 'shop:hifi' => array('label'=>'Hifi','frequency'=>21,'icon'=>'',),
- 'amenity:shop' => array('label'=>'Shop','frequency'=>61,'icon'=>'',),
- 'tourism:information' => array('label'=>'Information','frequency'=>224,'icon'=>'amenity_information',),
-
- 'place:house' => array('label'=>'House','frequency'=>2086,'icon'=>'','defzoom'=>18,),
- 'place:house_name' => array('label'=>'House','frequency'=>2086,'icon'=>'','defzoom'=>18,),
- 'place:house_number' => array('label'=>'House Number','frequency'=>2086,'icon'=>'','defzoom'=>18,),
- 'place:country_code' => array('label'=>'Country Code','frequency'=>2086,'icon'=>'','defzoom'=>18,),
-
- //
-
- 'leisure:pitch' => array('label'=>'Pitch','frequency'=>762,'icon'=>'',),
- 'highway:unsurfaced' => array('label'=>'Unsurfaced','frequency'=>492,'icon'=>'',),
- 'historic:ruins' => array('label'=>'Ruins','frequency'=>483,'icon'=>'tourist_ruin',),
- 'amenity:college' => array('label'=>'College','frequency'=>473,'icon'=>'education_school',),
- 'historic:monument' => array('label'=>'Monument','frequency'=>470,'icon'=>'tourist_monument',),
- 'railway:subway' => array('label'=>'Subway','frequency'=>385,'icon'=>'',),
- 'historic:memorial' => array('label'=>'Memorial','frequency'=>382,'icon'=>'tourist_monument',),
- 'leisure:nature_reserve' => array('label'=>'Nature Reserve','frequency'=>342,'icon'=>'',),
- 'leisure:common' => array('label'=>'Common','frequency'=>322,'icon'=>'',),
- 'waterway:lock_gate' => array('label'=>'Lock Gate','frequency'=>321,'icon'=>'',),
- 'natural:fell' => array('label'=>'Fell','frequency'=>308,'icon'=>'',),
- 'amenity:nightclub' => array('label'=>'Nightclub','frequency'=>292,'icon'=>'',),
- 'highway:path' => array('label'=>'Path','frequency'=>287,'icon'=>'',),
- 'leisure:garden' => array('label'=>'Garden','frequency'=>285,'icon'=>'',),
- 'landuse:reservoir' => array('label'=>'Reservoir','frequency'=>276,'icon'=>'',),
- 'leisure:playground' => array('label'=>'Playground','frequency'=>264,'icon'=>'',),
- 'leisure:stadium' => array('label'=>'Stadium','frequency'=>212,'icon'=>'',),
- 'historic:mine' => array('label'=>'Mine','frequency'=>193,'icon'=>'poi_mine',),
- 'natural:cliff' => array('label'=>'Cliff','frequency'=>193,'icon'=>'',),
- 'tourism:caravan_site' => array('label'=>'Caravan Site','frequency'=>183,'icon'=>'accommodation_caravan_park',),
- 'amenity:bus_station' => array('label'=>'Bus Station','frequency'=>181,'icon'=>'transport_bus_station',),
- 'amenity:kindergarten' => array('label'=>'Kindergarten','frequency'=>179,'icon'=>'',),
- 'highway:construction' => array('label'=>'Construction','frequency'=>176,'icon'=>'',),
- 'amenity:atm' => array('label'=>'Atm','frequency'=>172,'icon'=>'money_atm2',),
- 'amenity:emergency_phone' => array('label'=>'Emergency Phone','frequency'=>164,'icon'=>'',),
- 'waterway:lock' => array('label'=>'Lock','frequency'=>146,'icon'=>'',),
- 'waterway:riverbank' => array('label'=>'Riverbank','frequency'=>143,'icon'=>'',),
- 'natural:coastline' => array('label'=>'Coastline','frequency'=>142,'icon'=>'',),
- 'tourism:viewpoint' => array('label'=>'Viewpoint','frequency'=>140,'icon'=>'tourist_view_point',),
- 'tourism:hostel' => array('label'=>'Hostel','frequency'=>140,'icon'=>'',),
- 'tourism:bed_and_breakfast' => array('label'=>'Bed And Breakfast','frequency'=>140,'icon'=>'accommodation_bed_and_breakfast',),
- 'railway:halt' => array('label'=>'Halt','frequency'=>135,'icon'=>'',),
- 'railway:platform' => array('label'=>'Platform','frequency'=>134,'icon'=>'',),
- 'railway:tram' => array('label'=>'Tram','frequency'=>130,'icon'=>'transport_tram_stop',),
- 'amenity:courthouse' => array('label'=>'Courthouse','frequency'=>129,'icon'=>'amenity_court',),
- 'amenity:recycling' => array('label'=>'Recycling','frequency'=>126,'icon'=>'amenity_recycling',),
- 'amenity:dentist' => array('label'=>'Dentist','frequency'=>124,'icon'=>'health_dentist',),
- 'natural:beach' => array('label'=>'Beach','frequency'=>121,'icon'=>'tourist_beach',),
- 'place:moor' => array('label'=>'Moor','frequency'=>118,'icon'=>'',),
- 'amenity:grave_yard' => array('label'=>'Grave Yard','frequency'=>110,'icon'=>'',),
- 'waterway:drain' => array('label'=>'Drain','frequency'=>108,'icon'=>'',),
- 'landuse:grass' => array('label'=>'Grass','frequency'=>106,'icon'=>'',),
- 'landuse:village_green' => array('label'=>'Village Green','frequency'=>106,'icon'=>'',),
- 'natural:bay' => array('label'=>'Bay','frequency'=>102,'icon'=>'',),
- 'railway:tram_stop' => array('label'=>'Tram Stop','frequency'=>101,'icon'=>'transport_tram_stop',),
- 'leisure:marina' => array('label'=>'Marina','frequency'=>98,'icon'=>'',),
- 'highway:stile' => array('label'=>'Stile','frequency'=>97,'icon'=>'',),
- 'natural:moor' => array('label'=>'Moor','frequency'=>95,'icon'=>'',),
- 'railway:light_rail' => array('label'=>'Light Rail','frequency'=>91,'icon'=>'',),
- 'railway:narrow_gauge' => array('label'=>'Narrow Gauge','frequency'=>90,'icon'=>'',),
- 'natural:land' => array('label'=>'Land','frequency'=>86,'icon'=>'',),
- 'amenity:village_hall' => array('label'=>'Village Hall','frequency'=>82,'icon'=>'',),
- 'waterway:dock' => array('label'=>'Dock','frequency'=>80,'icon'=>'',),
- 'amenity:veterinary' => array('label'=>'Veterinary','frequency'=>79,'icon'=>'',),
- 'landuse:brownfield' => array('label'=>'Brownfield','frequency'=>77,'icon'=>'',),
- 'leisure:track' => array('label'=>'Track','frequency'=>76,'icon'=>'',),
- 'railway:historic_station' => array('label'=>'Historic Station','frequency'=>74,'icon'=>'',),
- 'landuse:construction' => array('label'=>'Construction','frequency'=>72,'icon'=>'',),
- 'amenity:prison' => array('label'=>'Prison','frequency'=>71,'icon'=>'amenity_prison',),
- 'landuse:quarry' => array('label'=>'Quarry','frequency'=>71,'icon'=>'',),
- 'amenity:telephone' => array('label'=>'Telephone','frequency'=>70,'icon'=>'',),
- 'highway:traffic_signals' => array('label'=>'Traffic Signals','frequency'=>66,'icon'=>'',),
- 'natural:heath' => array('label'=>'Heath','frequency'=>62,'icon'=>'',),
- 'historic:house' => array('label'=>'House','frequency'=>61,'icon'=>'',),
- 'amenity:social_club' => array('label'=>'Social Club','frequency'=>61,'icon'=>'',),
- 'landuse:military' => array('label'=>'Military','frequency'=>61,'icon'=>'',),
- 'amenity:health_centre' => array('label'=>'Health Centre','frequency'=>59,'icon'=>'',),
- 'historic:building' => array('label'=>'Building','frequency'=>58,'icon'=>'',),
- 'amenity:clinic' => array('label'=>'Clinic','frequency'=>57,'icon'=>'',),
- 'highway:services' => array('label'=>'Services','frequency'=>56,'icon'=>'',),
- 'amenity:ferry_terminal' => array('label'=>'Ferry Terminal','frequency'=>55,'icon'=>'',),
- 'natural:marsh' => array('label'=>'Marsh','frequency'=>55,'icon'=>'',),
- 'natural:hill' => array('label'=>'Hill','frequency'=>54,'icon'=>'',),
- 'highway:raceway' => array('label'=>'Raceway','frequency'=>53,'icon'=>'',),
- 'amenity:taxi' => array('label'=>'Taxi','frequency'=>47,'icon'=>'',),
- 'amenity:take_away' => array('label'=>'Take Away','frequency'=>45,'icon'=>'',),
- 'amenity:car_rental' => array('label'=>'Car Rental','frequency'=>44,'icon'=>'',),
- 'place:islet' => array('label'=>'Islet','frequency'=>44,'icon'=>'',),
- 'amenity:nursery' => array('label'=>'Nursery','frequency'=>44,'icon'=>'',),
- 'amenity:nursing_home' => array('label'=>'Nursing Home','frequency'=>43,'icon'=>'',),
- 'amenity:toilets' => array('label'=>'Toilets','frequency'=>38,'icon'=>'',),
- 'amenity:hall' => array('label'=>'Hall','frequency'=>38,'icon'=>'',),
- 'waterway:boatyard' => array('label'=>'Boatyard','frequency'=>36,'icon'=>'',),
- 'highway:mini_roundabout' => array('label'=>'Mini Roundabout','frequency'=>35,'icon'=>'',),
- 'historic:manor' => array('label'=>'Manor','frequency'=>35,'icon'=>'',),
- 'tourism:chalet' => array('label'=>'Chalet','frequency'=>34,'icon'=>'',),
- 'amenity:bicycle_parking' => array('label'=>'Bicycle Parking','frequency'=>34,'icon'=>'',),
- 'amenity:hotel' => array('label'=>'Hotel','frequency'=>34,'icon'=>'',),
- 'waterway:weir' => array('label'=>'Weir','frequency'=>33,'icon'=>'',),
- 'natural:wetland' => array('label'=>'Wetland','frequency'=>33,'icon'=>'',),
- 'natural:cave_entrance' => array('label'=>'Cave Entrance','frequency'=>32,'icon'=>'',),
- 'amenity:crematorium' => array('label'=>'Crematorium','frequency'=>31,'icon'=>'',),
- 'tourism:picnic_site' => array('label'=>'Picnic Site','frequency'=>31,'icon'=>'',),
- 'landuse:wood' => array('label'=>'Wood','frequency'=>30,'icon'=>'',),
- 'landuse:basin' => array('label'=>'Basin','frequency'=>30,'icon'=>'',),
- 'natural:tree' => array('label'=>'Tree','frequency'=>30,'icon'=>'',),
- 'leisure:slipway' => array('label'=>'Slipway','frequency'=>29,'icon'=>'',),
- 'landuse:meadow' => array('label'=>'Meadow','frequency'=>29,'icon'=>'',),
- 'landuse:piste' => array('label'=>'Piste','frequency'=>28,'icon'=>'',),
- 'amenity:care_home' => array('label'=>'Care Home','frequency'=>28,'icon'=>'',),
- 'amenity:club' => array('label'=>'Club','frequency'=>28,'icon'=>'',),
- 'amenity:medical_centre' => array('label'=>'Medical Centre','frequency'=>27,'icon'=>'',),
- 'historic:roman_road' => array('label'=>'Roman Road','frequency'=>27,'icon'=>'',),
- 'historic:fort' => array('label'=>'Fort','frequency'=>26,'icon'=>'',),
- 'railway:subway_entrance' => array('label'=>'Subway Entrance','frequency'=>26,'icon'=>'',),
- 'historic:yes' => array('label'=>'Historic','frequency'=>25,'icon'=>'',),
- 'highway:gate' => array('label'=>'Gate','frequency'=>25,'icon'=>'',),
- 'leisure:fishing' => array('label'=>'Fishing','frequency'=>24,'icon'=>'',),
- 'historic:museum' => array('label'=>'Museum','frequency'=>24,'icon'=>'',),
- 'amenity:car_wash' => array('label'=>'Car Wash','frequency'=>24,'icon'=>'',),
- 'railway:level_crossing' => array('label'=>'Level Crossing','frequency'=>23,'icon'=>'',),
- 'leisure:bird_hide' => array('label'=>'Bird Hide','frequency'=>23,'icon'=>'',),
- 'natural:headland' => array('label'=>'Headland','frequency'=>21,'icon'=>'',),
- 'tourism:apartments' => array('label'=>'Apartments','frequency'=>21,'icon'=>'',),
- 'amenity:shopping' => array('label'=>'Shopping','frequency'=>21,'icon'=>'',),
- 'natural:scrub' => array('label'=>'Scrub','frequency'=>20,'icon'=>'',),
- 'natural:fen' => array('label'=>'Fen','frequency'=>20,'icon'=>'',),
- 'building:yes' => array('label'=>'Building','frequency'=>200,'icon'=>'',),
- 'mountain_pass:yes' => array('label'=>'Mountain Pass','frequency'=>200,'icon'=>'',),
-
- 'amenity:parking' => array('label'=>'Parking','frequency'=>3157,'icon'=>'',),
- 'highway:bus_stop' => array('label'=>'Bus Stop','frequency'=>35777,'icon'=>'transport_bus_stop2',),
- 'place:postcode' => array('label'=>'Postcode','frequency'=>27267,'icon'=>'',),
- 'amenity:post_box' => array('label'=>'Post Box','frequency'=>9613,'icon'=>'',),
-
- 'place:houses' => array('label'=>'Houses','frequency'=>85,'icon'=>'',),
- 'railway:preserved' => array('label'=>'Preserved','frequency'=>227,'icon'=>'',),
- 'waterway:derelict_canal' => array('label'=>'Derelict Canal','frequency'=>21,'icon'=>'',),
- 'amenity:dead_pub' => array('label'=>'Dead Pub','frequency'=>20,'icon'=>'',),
- 'railway:disused_station' => array('label'=>'Disused Station','frequency'=>114,'icon'=>'',),
- 'railway:abandoned' => array('label'=>'Abandoned','frequency'=>641,'icon'=>'',),
- 'railway:disused' => array('label'=>'Disused','frequency'=>72,'icon'=>'',),
-                               );
-       }
-
-
-       function getClassTypesWithImportance()
-       {
-               $aOrders = getClassTypes();
-               $i = 1;
-               foreach($aOrders as $sID => $a)
-               {
-                       $aOrders[$sID]['importance'] = $i++;
-               }
-               return $aOrders;
-       }
-
-       function getResultDiameter($aResult)
-       {
-               $aClassType = getClassTypes();
-
-               $fDiameter = 0.0001;
-
-               if (isset($aResult['class'])
-                         && isset($aResult['type'])
-                         && isset($aResult['admin_level'])
-                         && isset($aClassType[$aResult['class'].':'.$aResult['type'].':'.$aResult['admin_level']]['defdiameter'])
-                               && $aClassType[$aResult['class'].':'.$aResult['type'].':'.$aResult['admin_level']]['defdiameter'])
-               {
-                       $fDiameter = $aClassType[$aResult['class'].':'.$aResult['type'].':'.$aResult['admin_level']]['defdiameter'];
-               }
-               elseif (isset($aResult['class'])
-                         && isset($aResult['type'])
-                         && isset($aClassType[$aResult['class'].':'.$aResult['type']]['defdiameter'])
-                               && $aClassType[$aResult['class'].':'.$aResult['type']]['defdiameter'])
-               {
-                       $fDiameter = $aClassType[$aResult['class'].':'.$aResult['type']]['defdiameter'];
-               }
-
-               return $fDiameter;
-       }
-
-
-       function javascript_renderData($xVal, $iOptions = 0)
-       {
-               if (defined('PHP_VERSION_ID') && PHP_VERSION_ID > 50400)
-                       $iOptions |= JSON_UNESCAPED_UNICODE;
-               $jsonout = json_encode($xVal, $iOptions);
-
-               if( ! isset($_GET['json_callback']))
-               {
-                       header("Content-Type: application/json; charset=UTF-8");
-                       echo $jsonout;
-               } else
-               {
-                       if (preg_match('/^[$_\p{L}][$_\p{L}\p{Nd}.[\]]*$/u',$_GET['json_callback']))
-                       {
-                               header("Content-Type: application/javascript; charset=UTF-8");
-                               echo $_GET['json_callback'].'('.$jsonout.')';
-                       }
-                       else
-                       {
-                               header('HTTP/1.0 400 Bad Request');
-                       }
-               }
-       }
-
-
-       function _debugDumpGroupedSearches($aData, $aTokens)
-       {
-               $aWordsIDs = array();
-               if ($aTokens)
-               {
-                       foreach($aTokens as $sToken => $aWords)
-                       {
-                               if ($aWords)
-                               {
-                                       foreach($aWords as $aToken)
-                                       {
-                                               $aWordsIDs[$aToken['word_id']] = $sToken.'('.$aToken['word_id'].')';
-                                       }
-                               }
-                       }
-               }
-               echo "<table border=\"1\">";
-               echo "<tr><th>rank</th><th>Name Tokens</th><th>Name Not</th><th>Address Tokens</th><th>Address Not</th><th>country</th><th>operator</th><th>class</th><th>type</th><th>house#</th><th>Lat</th><th>Lon</th><th>Radius</th></tr>";
-               foreach($aData as $iRank => $aRankedSet)
-               {
-                       foreach($aRankedSet as $aRow)
-                       {
-                               echo "<tr>";
-                               echo "<td>$iRank</td>";
-
-                               echo "<td>";
-                               $sSep = '';
-                               foreach($aRow['aName'] as $iWordID)
-                               {
-                                       echo $sSep.'#'.$aWordsIDs[$iWordID].'#';
-                                       $sSep = ', ';
-                               }
-                               echo "</td>";
-
-                               echo "<td>";
-                               $sSep = '';
-                               foreach($aRow['aNameNonSearch'] as $iWordID)
-                               {
-                                       echo $sSep.'#'.$aWordsIDs[$iWordID].'#';
-                                       $sSep = ', ';
-                               }
-                               echo "</td>";
-
-                               echo "<td>";
-                               $sSep = '';
-                               foreach($aRow['aAddress'] as $iWordID)
-                               {
-                                       echo $sSep.'#'.$aWordsIDs[$iWordID].'#';
-                                       $sSep = ', ';
-                               }
-                               echo "</td>";
-
-                               echo "<td>";
-                               $sSep = '';
-                               foreach($aRow['aAddressNonSearch'] as $iWordID)
-                               {
-                                       echo $sSep.'#'.$aWordsIDs[$iWordID].'#';
-                                       $sSep = ', ';
-                               }
-                               echo "</td>";
-
-                               echo "<td>".$aRow['sCountryCode']."</td>";
-
-                               echo "<td>".$aRow['sOperator']."</td>";
-                               echo "<td>".$aRow['sClass']."</td>";
-                               echo "<td>".$aRow['sType']."</td>";
-
-                               echo "<td>".$aRow['sHouseNumber']."</td>";
-
-                               echo "<td>".$aRow['fLat']."</td>";
-                               echo "<td>".$aRow['fLon']."</td>";
-                               echo "<td>".$aRow['fRadius']."</td>";
-
-                               echo "</tr>";
-                       }
-               }
-               echo "</table>";
-       }
-
-
-       function getAddressDetails(&$oDB, $sLanguagePrefArraySQL, $iPlaceID, $sCountryCode = false, $housenumber = -1, $bRaw = false)
-       {
-               $sSQL = "select *,get_name_by_language(name,$sLanguagePrefArraySQL) as localname from get_addressdata($iPlaceID, $housenumber)";
-               if (!$bRaw) $sSQL .= " WHERE isaddress OR type = 'country_code'";
-               $sSQL .= " order by rank_address desc,isaddress desc";
-
-               $aAddressLines = chksql($oDB->getAll($sSQL));
-               if ($bRaw) return $aAddressLines;
-               //echo "<pre>";
-               //var_dump($aAddressLines);
-               $aAddress = array();
-               $aFallback = array();
-               $aClassType = getClassTypes();
-               foreach($aAddressLines as $aLine)
-               {
-                       $bFallback = false;
-                       $aTypeLabel = false;
-                       if (isset($aClassType[$aLine['class'].':'.$aLine['type'].':'.$aLine['admin_level']])) $aTypeLabel = $aClassType[$aLine['class'].':'.$aLine['type'].':'.$aLine['admin_level']];
-                       elseif (isset($aClassType[$aLine['class'].':'.$aLine['type']])) $aTypeLabel = $aClassType[$aLine['class'].':'.$aLine['type']];
-                       elseif (isset($aClassType['boundary:administrative:'.((int)($aLine['rank_address']/2))]))
-                       {
-                               $aTypeLabel = $aClassType['boundary:administrative:'.((int)($aLine['rank_address']/2))];
-                               $bFallback = true;
-                       }
-                       else
-                       {
-                               $aTypeLabel = array('simplelabel'=>'address'.$aLine['rank_address']);
-                               $bFallback = true;
-                       }
-                       if ($aTypeLabel && ((isset($aLine['localname']) && $aLine['localname']) || (isset($aLine['housenumber']) && $aLine['housenumber'])))
-                       {
-                               $sTypeLabel = strtolower(isset($aTypeLabel['simplelabel'])?$aTypeLabel['simplelabel']:$aTypeLabel['label']);
-                               $sTypeLabel = str_replace(' ','_',$sTypeLabel);
-                               if (!isset($aAddress[$sTypeLabel]) || (isset($aFallback[$sTypeLabel]) && $aFallback[$sTypeLabel]) || $aLine['class'] == 'place')
-                               {
-                                       $aAddress[$sTypeLabel] = $aLine['localname']?$aLine['localname']:$aLine['housenumber'];
-                               }
-                               $aFallback[$sTypeLabel] = $bFallback;
-                       }
-               }
-               return $aAddress;
-       }
-
-
-       function addQuotes($s)
-       {
-               return "'".$s."'";
-       }
-
-       // returns boolean
-       function validLatLon($fLat,$fLon)
-       {
-               return ($fLat <= 90.1 && $fLat >= -90.1 && $fLon <= 180.1 && $fLon >= -180.1);
-       }
-
-       // Do we have anything that looks like a lat/lon pair?
-       // returns array(lat,lon,query_with_lat_lon_removed)
-       // or null
-       function looksLikeLatLonPair($sQuery)
-       {
-               $sFound    = null;
-               $fQueryLat = null;
-               $fQueryLon = null;
-
-               // degrees decimal minutes
-               // N 40 26.767, W 79 58.933
-               // N 40°26.767′, W 79°58.933′
-               //                  1         2                   3                  4         5            6
-               if (preg_match('/\\b([NS])[ ]+([0-9]+[0-9.]*)[° ]+([0-9.]+)?[′\']*[, ]+([EW])[ ]+([0-9]+)[° ]+([0-9]+[0-9.]*)[′\']*?\\b/', $sQuery, $aData))
-               {
-                       $sFound    = $aData[0];
-                       $fQueryLat = ($aData[1]=='N'?1:-1) * ($aData[2] + $aData[3]/60);
-                       $fQueryLon = ($aData[4]=='E'?1:-1) * ($aData[5] + $aData[6]/60);
-               }
-               // degrees decimal minutes
-               // 40 26.767 N, 79 58.933 W
-               // 40° 26.767′ N 79° 58.933′ W
-               //                      1             2                      3          4            5                    6
-               elseif (preg_match('/\\b([0-9]+)[° ]+([0-9]+[0-9.]*)?[′\']*[ ]+([NS])[, ]+([0-9]+)[° ]+([0-9]+[0-9.]*)?[′\' ]+([EW])\\b/', $sQuery, $aData))
-               {
-                       $sFound    = $aData[0];
-                       $fQueryLat = ($aData[3]=='N'?1:-1) * ($aData[1] + $aData[2]/60);
-                       $fQueryLon = ($aData[6]=='E'?1:-1) * ($aData[4] + $aData[5]/60);
-               }
-               // degrees decimal seconds
-               // N 40 26 46 W 79 58 56
-               // N 40° 26′ 46″, W 79° 58′ 56″
-               //                      1        2            3            4                5        6            7            8
-               elseif (preg_match('/\\b([NS])[ ]([0-9]+)[° ]+([0-9]+)[′\' ]+([0-9]+)[″"]*[, ]+([EW])[ ]([0-9]+)[° ]+([0-9]+)[′\' ]+([0-9]+)[″"]*\\b/', $sQuery, $aData))
-               {
-                       $sFound    = $aData[0];
-                       $fQueryLat = ($aData[1]=='N'?1:-1) * ($aData[2] + $aData[3]/60 + $aData[4]/3600);
-                       $fQueryLon = ($aData[5]=='E'?1:-1) * ($aData[6] + $aData[7]/60 + $aData[8]/3600);
-               }
-               // degrees decimal seconds
-               // 40 26 46 N 79 58 56 W
-               // 40° 26′ 46″ N, 79° 58′ 56″ W
-               //                      1            2            3            4          5            6            7            8
-               elseif (preg_match('/\\b([0-9]+)[° ]+([0-9]+)[′\' ]+([0-9]+)[″" ]+([NS])[, ]+([0-9]+)[° ]+([0-9]+)[′\' ]+([0-9]+)[″" ]+([EW])\\b/', $sQuery, $aData))
-               {
-                       $sFound    = $aData[0];
-                       $fQueryLat = ($aData[4]=='N'?1:-1) * ($aData[1] + $aData[2]/60 + $aData[3]/3600);
-                       $fQueryLon = ($aData[8]=='E'?1:-1) * ($aData[5] + $aData[6]/60 + $aData[7]/3600);
-               }
-               // degrees decimal
-               // N 40.446° W 79.982°
-               //                      1        2                               3        4
-               elseif (preg_match('/\\b([NS])[ ]([0-9]+[0-9]*\\.[0-9]+)[°]*[, ]+([EW])[ ]([0-9]+[0-9]*\\.[0-9]+)[°]*\\b/', $sQuery, $aData))
-               {
-                       $sFound    = $aData[0];
-                       $fQueryLat = ($aData[1]=='N'?1:-1) * ($aData[2]);
-                       $fQueryLon = ($aData[3]=='E'?1:-1) * ($aData[4]);
-               }
-               // degrees decimal
-               // 40.446° N 79.982° W
-               //                      1                           2          3                           4
-               elseif (preg_match('/\\b([0-9]+[0-9]*\\.[0-9]+)[° ]+([NS])[, ]+([0-9]+[0-9]*\\.[0-9]+)[° ]+([EW])\\b/', $sQuery, $aData))
-               {
-                       $sFound    = $aData[0];
-                       $fQueryLat = ($aData[2]=='N'?1:-1) * ($aData[1]);
-                       $fQueryLon = ($aData[4]=='E'?1:-1) * ($aData[3]);
-               }
-               // degrees decimal
-               // 12.34, 56.78
-               // [12.456,-78.90]
-               //                   1          2                             3                        4
-               elseif (preg_match('/(\\[|^|\\b)(-?[0-9]+[0-9]*\\.[0-9]+)[, ]+(-?[0-9]+[0-9]*\\.[0-9]+)(\\]|$|\\b)/', $sQuery, $aData))
-               {
-                       $sFound    = $aData[0];
-                       $fQueryLat = $aData[2];
-                       $fQueryLon = $aData[3];
-               }
-
-               if (!validLatLon($fQueryLat, $fQueryLon)) return;
-               $sQuery = trim(str_replace($sFound, ' ', $sQuery));
-
-               return array('lat' => $fQueryLat, 'lon' => $fQueryLon, 'query' => $sQuery);
-       }
-
-
-       function geometryText2Points($geometry_as_text, $fRadius)
-       {
-               $aPolyPoints = NULL;
-               if (preg_match('#POLYGON\\(\\(([- 0-9.,]+)#', $geometry_as_text, $aMatch))
-               {
-                       preg_match_all('/(-?[0-9.]+) (-?[0-9.]+)/', $aMatch[1], $aPolyPoints, PREG_SET_ORDER);
-               }
-               elseif (preg_match('#LINESTRING\\(([- 0-9.,]+)#', $geometry_as_text, $aMatch))
-               {
-                       preg_match_all('/(-?[0-9.]+) (-?[0-9.]+)/', $aMatch[1], $aPolyPoints, PREG_SET_ORDER);
-               }
-/*             elseif (preg_match('#MULTIPOLYGON\\(\\(\\(([- 0-9.,]+)#', $geometry_as_text, $aMatch))
-               {
-                       preg_match_all('/(-?[0-9.]+) (-?[0-9.]+)/', $aMatch[1], $aPolyPoints, PREG_SET_ORDER);
-        }*/
-               elseif (preg_match('#POINT\\((-?[0-9.]+) (-?[0-9.]+)\\)#', $geometry_as_text, $aMatch))
-               {
-                       $aPolyPoints = createPointsAroundCenter($aMatch[1], $aMatch[2], $fRadius);
-               }
-
-               if (isset($aPolyPoints))
-               {
-                       $aResultPoints = array();
-                       foreach($aPolyPoints as $aPoint)
-                       {
-                               $aResultPoints[] = array($aPoint[1], $aPoint[2]);
-                       }
-                       return $aResultPoints;
-               }
-
-               return;
-       }
-
-       function createPointsAroundCenter($fLon, $fLat, $fRadius)
-       {
-                       $iSteps = max(8, min(100, ($fRadius * 40000)^2));
-                       $fStepSize = (2*pi())/$iSteps;
-                       $aPolyPoints = array();
-                       for($f = 0; $f < 2*pi(); $f += $fStepSize)
-                       {
-                               $aPolyPoints[] = array('', $fLon+($fRadius*sin($f)), $fLat+($fRadius*cos($f)) );
-                       }
-                       return $aPolyPoints;
-       }
+
+function fail($sError, $sUserError = false)
+{
+    if (!$sUserError) $sUserError = $sError;
+    error_log('ERROR: '.$sError);
+    echo $sUserError."\n";
+    exit(-1);
+}
+
+
+function getProcessorCount()
+{
+    $sCPU = file_get_contents('/proc/cpuinfo');
+    preg_match_all('#processor\s+: [0-9]+#', $sCPU, $aMatches);
+    return sizeof($aMatches[0]);
+}
+
+
+function getTotalMemoryMB()
+{
+    $sCPU = file_get_contents('/proc/meminfo');
+    preg_match('#MemTotal: +([0-9]+) kB#', $sCPU, $aMatches);
+    return (int)($aMatches[1]/1024);
+}
+
+
+function getCacheMemoryMB()
+{
+    $sCPU = file_get_contents('/proc/meminfo');
+    preg_match('#Cached: +([0-9]+) kB#', $sCPU, $aMatches);
+    return (int)($aMatches[1]/1024);
+}
+
+
+function bySearchRank($a, $b)
+{
+    if ($a['iSearchRank'] == $b['iSearchRank'])
+        return strlen($a['sOperator']) + strlen($a['sHouseNumber']) - strlen($b['sOperator']) - strlen($b['sHouseNumber']);
+    return ($a['iSearchRank'] < $b['iSearchRank']?-1:1);
+}
+
+
+function byImportance($a, $b)
+{
+    if ($a['importance'] != $b['importance'])
+        return ($a['importance'] > $b['importance']?-1:1);
+
+    return ($a['foundorder'] < $b['foundorder']?-1:1);
+}
+
+
+function getWordSets($aWords, $iDepth)
+{
+    $aResult = array(array(join(' ', $aWords)));
+    $sFirstToken = '';
+    if ($iDepth < 8) {
+        while (sizeof($aWords) > 1) {
+            $sWord = array_shift($aWords);
+            $sFirstToken .= ($sFirstToken?' ':'').$sWord;
+            $aRest = getWordSets($aWords, $iDepth+1);
+            foreach ($aRest as $aSet) {
+                $aResult[] = array_merge(array($sFirstToken), $aSet);
+            }
+        }
+    }
+    return $aResult;
+}
+
+function getInverseWordSets($aWords, $iDepth)
+{
+    $aResult = array(array(join(' ', $aWords)));
+    $sFirstToken = '';
+    if ($iDepth < 8) {
+        while (sizeof($aWords) > 1) {
+            $sWord = array_pop($aWords);
+            $sFirstToken = $sWord.($sFirstToken?' ':'').$sFirstToken;
+            $aRest = getInverseWordSets($aWords, $iDepth+1);
+            foreach ($aRest as $aSet) {
+                $aResult[] = array_merge(array($sFirstToken), $aSet);
+            }
+        }
+    }
+    return $aResult;
+}
+
+
+function getTokensFromSets($aSets)
+{
+    $aTokens = array();
+    foreach ($aSets as $aSet) {
+        foreach ($aSet as $sWord) {
+            $aTokens[' '.$sWord] = ' '.$sWord;
+            $aTokens[$sWord] = $sWord;
+        }
+    }
+    return $aTokens;
+}
+
+
+function gbPostcodeCalculate($sPostcode, $sPostcodeSector, $sPostcodeEnd, &$oDB)
+{
+    // Try an exact match on the gb_postcode table
+    $sSQL = 'select \'AA\', ST_X(ST_Centroid(geometry)) as lon,ST_Y(ST_Centroid(geometry)) as lat from gb_postcode where postcode = \''.$sPostcode.'\'';
+    $aNearPostcodes = chksql($oDB->getAll($sSQL));
+
+    if (sizeof($aNearPostcodes)) {
+        $aPostcodes = array();
+        foreach ($aNearPostcodes as $aPostcode) {
+            $aPostcodes[] = array('lat' => $aPostcode['lat'], 'lon' => $aPostcode['lon'], 'radius' => 0.005);
+        }
+
+        return $aPostcodes;
+    }
+
+    return false;
+}
+
+
+function getClassTypes()
+{
+    return array(
+            'boundary:administrative:1' => array('label' => 'Continent', 'frequency' => 0, 'icon' => 'poi_boundary_administrative', 'defdiameter' => 0.32),
+            'boundary:administrative:2' => array('label' => 'Country', 'frequency' => 0, 'icon' => 'poi_boundary_administrative', 'defdiameter' => 0.32),
+            'place:country' => array('label' => 'Country', 'frequency' => 0, 'icon' => 'poi_boundary_administrative', 'defzoom' => 6, 'defdiameter' => 15),
+            'boundary:administrative:3' => array('label' => 'State', 'frequency' => 0, 'icon' => 'poi_boundary_administrative', 'defdiameter' => 0.32),
+            'boundary:administrative:4' => array('label' => 'State', 'frequency' => 0, 'icon' => 'poi_boundary_administrative', 'defdiameter' => 0.32),
+            'place:state' => array('label' => 'State', 'frequency' => 0, 'icon' => 'poi_boundary_administrative', 'defzoom' => 8, 'defdiameter' => 5.12),
+            'boundary:administrative:5' => array('label' => 'State District', 'frequency' => 0, 'icon' => 'poi_boundary_administrative', 'defdiameter' => 0.32),
+            'boundary:administrative:6' => array('label' => 'County', 'frequency' => 0, 'icon' => 'poi_boundary_administrative', 'defdiameter' => 0.32),
+            'boundary:administrative:7' => array('label' => 'County', 'frequency' => 0, 'icon' => 'poi_boundary_administrative', 'defdiameter' => 0.32),
+            'place:county' => array('label' => 'County', 'frequency' => 108, 'icon' => 'poi_boundary_administrative', 'defzoom' => 10, 'defdiameter' => 1.28),
+            'boundary:administrative:8' => array('label' => 'City', 'frequency' => 0, 'icon' => 'poi_boundary_administrative', 'defdiameter' => 0.32),
+            'place:city' => array('label' => 'City', 'frequency' => 66, 'icon' => 'poi_place_city', 'defzoom' => 12, 'defdiameter' => 0.32),
+            'boundary:administrative:9' => array('label' => 'City District', 'frequency' => 0, 'icon' => 'poi_boundary_administrative', 'defdiameter' => 0.32),
+            'boundary:administrative:10' => array('label' => 'Suburb', 'frequency' => 0, 'icon' => 'poi_boundary_administrative', 'defdiameter' => 0.32),
+            'boundary:administrative:11' => array('label' => 'Neighbourhood', 'frequency' => 0, 'icon' => 'poi_boundary_administrative', 'defdiameter' => 0.32),
+            'place:region' => array('label' => 'Region', 'frequency' => 0, 'icon' => 'poi_boundary_administrative', 'defzoom' => 8, 'defdiameter' => 0.04),
+            'place:island' => array('label' => 'Island', 'frequency' => 288, 'icon' => '', 'defzoom' => 11, 'defdiameter' => 0.64),
+            'boundary:administrative' => array('label' => 'Administrative', 'frequency' => 413, 'icon' => 'poi_boundary_administrative', 'defdiameter' => 0.32),
+            'boundary:postal_code' => array('label' => 'Postcode', 'frequency' => 413, 'icon' => 'poi_boundary_administrative', 'defdiameter' => 0.32),
+            'place:town' => array('label' => 'Town', 'frequency' => 1497, 'icon' => 'poi_place_town', 'defzoom' => 14, 'defdiameter' => 0.08),
+            'place:village' => array('label' => 'Village', 'frequency' => 11230, 'icon' => 'poi_place_village', 'defzoom' => 15, 'defdiameter' => 0.04),
+            'place:hamlet' => array('label' => 'Hamlet', 'frequency' => 7075, 'icon' => 'poi_place_village', 'defzoom' => 15, 'defdiameter' => 0.04),
+            'place:suburb' => array('label' => 'Suburb', 'frequency' => 2528, 'icon' => 'poi_place_village', 'defdiameter' => 0.04),
+            'place:locality' => array('label' => 'Locality', 'frequency' => 4113, 'icon' => 'poi_place_village', 'defdiameter' => 0.02),
+            'landuse:farm' => array('label' => 'Farm', 'frequency' => 1201, 'icon' => '', 'defdiameter' => 0.02),
+            'place:farm' => array('label' => 'Farm', 'frequency' => 1162, 'icon' => '', 'defdiameter' => 0.02),
+
+            'highway:motorway_junction' => array('label' => 'Motorway Junction', 'frequency' => 1126, 'icon' => '', 'simplelabel' => 'Junction'),
+            'highway:motorway' => array('label' => 'Motorway', 'frequency' => 4627, 'icon' => '', 'simplelabel' => 'Road'),
+            'highway:trunk' => array('label' => 'Trunk', 'frequency' => 23084, 'icon' => '', 'simplelabel' => 'Road'),
+            'highway:primary' => array('label' => 'Primary', 'frequency' => 32138, 'icon' => '', 'simplelabel' => 'Road'),
+            'highway:secondary' => array('label' => 'Secondary', 'frequency' => 25807, 'icon' => '', 'simplelabel' => 'Road'),
+            'highway:tertiary' => array('label' => 'Tertiary', 'frequency' => 29829, 'icon' => '', 'simplelabel' => 'Road'),
+            'highway:residential' => array('label' => 'Residential', 'frequency' => 361498, 'icon' => '', 'simplelabel' => 'Road'),
+            'highway:unclassified' => array('label' => 'Unclassified', 'frequency' => 66441, 'icon' => '', 'simplelabel' => 'Road'),
+            'highway:living_street' => array('label' => 'Living Street', 'frequency' => 710, 'icon' => '', 'simplelabel' => 'Road'),
+            'highway:service' => array('label' => 'Service', 'frequency' => 9963, 'icon' => '', 'simplelabel' => 'Road'),
+            'highway:track' => array('label' => 'Track', 'frequency' => 2565, 'icon' => '', 'simplelabel' => 'Road'),
+            'highway:road' => array('label' => 'Road', 'frequency' => 591, 'icon' => '', 'simplelabel' => 'Road'),
+            'highway:byway' => array('label' => 'Byway', 'frequency' => 346, 'icon' => '', 'simplelabel' => 'Road'),
+            'highway:bridleway' => array('label' => 'Bridleway', 'frequency' => 1556, 'icon' => ''),
+            'highway:cycleway' => array('label' => 'Cycleway', 'frequency' => 2419, 'icon' => ''),
+            'highway:pedestrian' => array('label' => 'Pedestrian', 'frequency' => 2757, 'icon' => ''),
+            'highway:footway' => array('label' => 'Footway', 'frequency' => 15008, 'icon' => ''),
+            'highway:steps' => array('label' => 'Steps', 'frequency' => 444, 'icon' => '', 'simplelabel' => 'Footway'),
+            'highway:motorway_link' => array('label' => 'Motorway Link', 'frequency' => 795, 'icon' => '', 'simplelabel' => 'Road'),
+            'highway:trunk_link' => array('label' => 'Trunk Link', 'frequency' => 1258, 'icon' => '', 'simplelabel' => 'Road'),
+            'highway:primary_link' => array('label' => 'Primary Link', 'frequency' => 313, 'icon' => '', 'simplelabel' => 'Road'),
+
+            'landuse:industrial' => array('label' => 'Industrial', 'frequency' => 1062, 'icon' => ''),
+            'landuse:residential' => array('label' => 'Residential', 'frequency' => 886, 'icon' => ''),
+            'landuse:retail' => array('label' => 'Retail', 'frequency' => 754, 'icon' => ''),
+            'landuse:commercial' => array('label' => 'Commercial', 'frequency' => 657, 'icon' => ''),
+
+            'place:airport' => array('label' => 'Airport', 'frequency' => 36, 'icon' => 'transport_airport2', 'defdiameter' => 0.03),
+            'aeroway:aerodrome' => array('label' => 'Aerodrome', 'frequency' => 36, 'icon' => 'transport_airport2', 'defdiameter' => 0.03),
+            'aeroway' => array('label' => 'Aeroway', 'frequency' => 36, 'icon' => 'transport_airport2', 'defdiameter' => 0.03),
+            'railway:station' => array('label' => 'Station', 'frequency' => 3431, 'icon' => 'transport_train_station2', 'defdiameter' => 0.01),
+            'amenity:place_of_worship' => array('label' => 'Place Of Worship', 'frequency' => 9049, 'icon' => 'place_of_worship_unknown3'),
+            'amenity:pub' => array('label' => 'Pub', 'frequency' => 18969, 'icon' => 'food_pub'),
+            'amenity:bar' => array('label' => 'Bar', 'frequency' => 164, 'icon' => 'food_bar'),
+            'amenity:university' => array('label' => 'University', 'frequency' => 607, 'icon' => 'education_university'),
+            'tourism:museum' => array('label' => 'Museum', 'frequency' => 543, 'icon' => 'tourist_museum'),
+            'amenity:arts_centre' => array('label' => 'Arts Centre', 'frequency' => 136, 'icon' => 'tourist_art_gallery2'),
+            'tourism:zoo' => array('label' => 'Zoo', 'frequency' => 47, 'icon' => 'tourist_zoo'),
+            'tourism:theme_park' => array('label' => 'Theme Park', 'frequency' => 24, 'icon' => 'poi_point_of_interest'),
+            'tourism:attraction' => array('label' => 'Attraction', 'frequency' => 1463, 'icon' => 'poi_point_of_interest'),
+            'leisure:golf_course' => array('label' => 'Golf Course', 'frequency' => 712, 'icon' => 'sport_golf'),
+            'historic:castle' => array('label' => 'Castle', 'frequency' => 316, 'icon' => 'tourist_castle'),
+            'amenity:hospital' => array('label' => 'Hospital', 'frequency' => 879, 'icon' => 'health_hospital'),
+            'amenity:school' => array('label' => 'School', 'frequency' => 8192, 'icon' => 'education_school'),
+            'amenity:theatre' => array('label' => 'Theatre', 'frequency' => 371, 'icon' => 'tourist_theatre'),
+            'amenity:public_building' => array('label' => 'Public Building', 'frequency' => 985, 'icon' => ''),
+            'amenity:library' => array('label' => 'Library', 'frequency' => 794, 'icon' => 'amenity_library'),
+            'amenity:townhall' => array('label' => 'Townhall', 'frequency' => 242, 'icon' => ''),
+            'amenity:community_centre' => array('label' => 'Community Centre', 'frequency' => 157, 'icon' => ''),
+            'amenity:fire_station' => array('label' => 'Fire Station', 'frequency' => 221, 'icon' => 'amenity_firestation3'),
+            'amenity:police' => array('label' => 'Police', 'frequency' => 334, 'icon' => 'amenity_police2'),
+            'amenity:bank' => array('label' => 'Bank', 'frequency' => 1248, 'icon' => 'money_bank2'),
+            'amenity:post_office' => array('label' => 'Post Office', 'frequency' => 859, 'icon' => 'amenity_post_office'),
+            'leisure:park' => array('label' => 'Park', 'frequency' => 2378, 'icon' => ''),
+            'amenity:park' => array('label' => 'Park', 'frequency' => 53, 'icon' => ''),
+            'landuse:park' => array('label' => 'Park', 'frequency' => 50, 'icon' => ''),
+            'landuse:recreation_ground' => array('label' => 'Recreation Ground', 'frequency' => 517, 'icon' => ''),
+            'tourism:hotel' => array('label' => 'Hotel', 'frequency' => 2150, 'icon' => 'accommodation_hotel2'),
+            'tourism:motel' => array('label' => 'Motel', 'frequency' => 43, 'icon' => ''),
+            'amenity:cinema' => array('label' => 'Cinema', 'frequency' => 277, 'icon' => 'tourist_cinema'),
+            'tourism:artwork' => array('label' => 'Artwork', 'frequency' => 171, 'icon' => 'tourist_art_gallery2'),
+            'historic:archaeological_site' => array('label' => 'Archaeological Site', 'frequency' => 407, 'icon' => 'tourist_archaeological2'),
+            'amenity:doctors' => array('label' => 'Doctors', 'frequency' => 581, 'icon' => 'health_doctors'),
+            'leisure:sports_centre' => array('label' => 'Sports Centre', 'frequency' => 767, 'icon' => 'sport_leisure_centre'),
+            'leisure:swimming_pool' => array('label' => 'Swimming Pool', 'frequency' => 24, 'icon' => 'sport_swimming_outdoor'),
+            'shop:supermarket' => array('label' => 'Supermarket', 'frequency' => 2673, 'icon' => 'shopping_supermarket'),
+            'shop:convenience' => array('label' => 'Convenience', 'frequency' => 1469, 'icon' => 'shopping_convenience'),
+            'amenity:restaurant' => array('label' => 'Restaurant', 'frequency' => 3179, 'icon' => 'food_restaurant'),
+            'amenity:fast_food' => array('label' => 'Fast Food', 'frequency' => 2289, 'icon' => 'food_fastfood'),
+            'amenity:cafe' => array('label' => 'Cafe', 'frequency' => 1780, 'icon' => 'food_cafe'),
+            'tourism:guest_house' => array('label' => 'Guest House', 'frequency' => 223, 'icon' => 'accommodation_bed_and_breakfast'),
+            'amenity:pharmacy' => array('label' => 'Pharmacy', 'frequency' => 733, 'icon' => 'health_pharmacy_dispensing'),
+            'amenity:fuel' => array('label' => 'Fuel', 'frequency' => 1308, 'icon' => 'transport_fuel'),
+            'natural:peak' => array('label' => 'Peak', 'frequency' => 3212, 'icon' => 'poi_peak'),
+            'waterway:waterfall' => array('label' => 'Waterfall', 'frequency' => 24, 'icon' => ''),
+            'natural:wood' => array('label' => 'Wood', 'frequency' => 1845, 'icon' => 'landuse_coniferous_and_deciduous'),
+            'natural:water' => array('label' => 'Water', 'frequency' => 1790, 'icon' => ''),
+            'landuse:forest' => array('label' => 'Forest', 'frequency' => 467, 'icon' => ''),
+            'landuse:cemetery' => array('label' => 'Cemetery', 'frequency' => 463, 'icon' => ''),
+            'landuse:allotments' => array('label' => 'Allotments', 'frequency' => 408, 'icon' => ''),
+            'landuse:farmyard' => array('label' => 'Farmyard', 'frequency' => 397, 'icon' => ''),
+            'railway:rail' => array('label' => 'Rail', 'frequency' => 4894, 'icon' => ''),
+            'waterway:canal' => array('label' => 'Canal', 'frequency' => 1723, 'icon' => ''),
+            'waterway:river' => array('label' => 'River', 'frequency' => 4089, 'icon' => ''),
+            'waterway:stream' => array('label' => 'Stream', 'frequency' => 2684, 'icon' => ''),
+            'shop:bicycle' => array('label' => 'Bicycle', 'frequency' => 349, 'icon' => 'shopping_bicycle'),
+            'shop:clothes' => array('label' => 'Clothes', 'frequency' => 315, 'icon' => 'shopping_clothes'),
+            'shop:hairdresser' => array('label' => 'Hairdresser', 'frequency' => 312, 'icon' => 'shopping_hairdresser'),
+            'shop:doityourself' => array('label' => 'Doityourself', 'frequency' => 247, 'icon' => 'shopping_diy'),
+            'shop:estate_agent' => array('label' => 'Estate Agent', 'frequency' => 162, 'icon' => 'shopping_estateagent2'),
+            'shop:car' => array('label' => 'Car', 'frequency' => 159, 'icon' => 'shopping_car'),
+            'shop:garden_centre' => array('label' => 'Garden Centre', 'frequency' => 143, 'icon' => 'shopping_garden_centre'),
+            'shop:car_repair' => array('label' => 'Car Repair', 'frequency' => 141, 'icon' => 'shopping_car_repair'),
+            'shop:newsagent' => array('label' => 'Newsagent', 'frequency' => 132, 'icon' => ''),
+            'shop:bakery' => array('label' => 'Bakery', 'frequency' => 129, 'icon' => 'shopping_bakery'),
+            'shop:furniture' => array('label' => 'Furniture', 'frequency' => 124, 'icon' => ''),
+            'shop:butcher' => array('label' => 'Butcher', 'frequency' => 105, 'icon' => 'shopping_butcher'),
+            'shop:apparel' => array('label' => 'Apparel', 'frequency' => 98, 'icon' => 'shopping_clothes'),
+            'shop:electronics' => array('label' => 'Electronics', 'frequency' => 96, 'icon' => ''),
+            'shop:department_store' => array('label' => 'Department Store', 'frequency' => 86, 'icon' => ''),
+            'shop:books' => array('label' => 'Books', 'frequency' => 85, 'icon' => ''),
+            'shop:yes' => array('label' => 'Shop', 'frequency' => 68, 'icon' => ''),
+            'shop:outdoor' => array('label' => 'Outdoor', 'frequency' => 67, 'icon' => ''),
+            'shop:mall' => array('label' => 'Mall', 'frequency' => 63, 'icon' => ''),
+            'shop:florist' => array('label' => 'Florist', 'frequency' => 61, 'icon' => ''),
+            'shop:charity' => array('label' => 'Charity', 'frequency' => 60, 'icon' => ''),
+            'shop:hardware' => array('label' => 'Hardware', 'frequency' => 59, 'icon' => ''),
+            'shop:laundry' => array('label' => 'Laundry', 'frequency' => 51, 'icon' => 'shopping_laundrette'),
+            'shop:shoes' => array('label' => 'Shoes', 'frequency' => 49, 'icon' => ''),
+            'shop:beverages' => array('label' => 'Beverages', 'frequency' => 48, 'icon' => 'shopping_alcohol'),
+            'shop:dry_cleaning' => array('label' => 'Dry Cleaning', 'frequency' => 46, 'icon' => ''),
+            'shop:carpet' => array('label' => 'Carpet', 'frequency' => 45, 'icon' => ''),
+            'shop:computer' => array('label' => 'Computer', 'frequency' => 44, 'icon' => ''),
+            'shop:alcohol' => array('label' => 'Alcohol', 'frequency' => 44, 'icon' => 'shopping_alcohol'),
+            'shop:optician' => array('label' => 'Optician', 'frequency' => 55, 'icon' => 'health_opticians'),
+            'shop:chemist' => array('label' => 'Chemist', 'frequency' => 42, 'icon' => 'health_pharmacy'),
+            'shop:gallery' => array('label' => 'Gallery', 'frequency' => 38, 'icon' => 'tourist_art_gallery2'),
+            'shop:mobile_phone' => array('label' => 'Mobile Phone', 'frequency' => 37, 'icon' => ''),
+            'shop:sports' => array('label' => 'Sports', 'frequency' => 37, 'icon' => ''),
+            'shop:jewelry' => array('label' => 'Jewelry', 'frequency' => 32, 'icon' => 'shopping_jewelry'),
+            'shop:pet' => array('label' => 'Pet', 'frequency' => 29, 'icon' => ''),
+            'shop:beauty' => array('label' => 'Beauty', 'frequency' => 28, 'icon' => ''),
+            'shop:stationery' => array('label' => 'Stationery', 'frequency' => 25, 'icon' => ''),
+            'shop:shopping_centre' => array('label' => 'Shopping Centre', 'frequency' => 25, 'icon' => ''),
+            'shop:general' => array('label' => 'General', 'frequency' => 25, 'icon' => ''),
+            'shop:electrical' => array('label' => 'Electrical', 'frequency' => 25, 'icon' => ''),
+            'shop:toys' => array('label' => 'Toys', 'frequency' => 23, 'icon' => ''),
+            'shop:jeweller' => array('label' => 'Jeweller', 'frequency' => 23, 'icon' => ''),
+            'shop:betting' => array('label' => 'Betting', 'frequency' => 23, 'icon' => ''),
+            'shop:household' => array('label' => 'Household', 'frequency' => 21, 'icon' => ''),
+            'shop:travel_agency' => array('label' => 'Travel Agency', 'frequency' => 21, 'icon' => ''),
+            'shop:hifi' => array('label' => 'Hifi', 'frequency' => 21, 'icon' => ''),
+            'amenity:shop' => array('label' => 'Shop', 'frequency' => 61, 'icon' => ''),
+            'tourism:information' => array('label' => 'Information', 'frequency' => 224, 'icon' => 'amenity_information'),
+
+            'place:house' => array('label' => 'House', 'frequency' => 2086, 'icon' => '', 'defzoom' => 18),
+            'place:house_name' => array('label' => 'House', 'frequency' => 2086, 'icon' => '', 'defzoom' => 18),
+            'place:house_number' => array('label' => 'House Number', 'frequency' => 2086, 'icon' => '', 'defzoom' => 18),
+            'place:country_code' => array('label' => 'Country Code', 'frequency' => 2086, 'icon' => '', 'defzoom' => 18),
+
+            //
+
+            'leisure:pitch' => array('label' => 'Pitch', 'frequency' => 762, 'icon' => ''),
+            'highway:unsurfaced' => array('label' => 'Unsurfaced', 'frequency' => 492, 'icon' => ''),
+            'historic:ruins' => array('label' => 'Ruins', 'frequency' => 483, 'icon' => 'tourist_ruin'),
+            'amenity:college' => array('label' => 'College', 'frequency' => 473, 'icon' => 'education_school'),
+            'historic:monument' => array('label' => 'Monument', 'frequency' => 470, 'icon' => 'tourist_monument'),
+            'railway:subway' => array('label' => 'Subway', 'frequency' => 385, 'icon' => ''),
+            'historic:memorial' => array('label' => 'Memorial', 'frequency' => 382, 'icon' => 'tourist_monument'),
+            'leisure:nature_reserve' => array('label' => 'Nature Reserve', 'frequency' => 342, 'icon' => ''),
+            'leisure:common' => array('label' => 'Common', 'frequency' => 322, 'icon' => ''),
+            'waterway:lock_gate' => array('label' => 'Lock Gate', 'frequency' => 321, 'icon' => ''),
+            'natural:fell' => array('label' => 'Fell', 'frequency' => 308, 'icon' => ''),
+            'amenity:nightclub' => array('label' => 'Nightclub', 'frequency' => 292, 'icon' => ''),
+            'highway:path' => array('label' => 'Path', 'frequency' => 287, 'icon' => ''),
+            'leisure:garden' => array('label' => 'Garden', 'frequency' => 285, 'icon' => ''),
+            'landuse:reservoir' => array('label' => 'Reservoir', 'frequency' => 276, 'icon' => ''),
+            'leisure:playground' => array('label' => 'Playground', 'frequency' => 264, 'icon' => ''),
+            'leisure:stadium' => array('label' => 'Stadium', 'frequency' => 212, 'icon' => ''),
+            'historic:mine' => array('label' => 'Mine', 'frequency' => 193, 'icon' => 'poi_mine'),
+            'natural:cliff' => array('label' => 'Cliff', 'frequency' => 193, 'icon' => ''),
+            'tourism:caravan_site' => array('label' => 'Caravan Site', 'frequency' => 183, 'icon' => 'accommodation_caravan_park'),
+            'amenity:bus_station' => array('label' => 'Bus Station', 'frequency' => 181, 'icon' => 'transport_bus_station'),
+            'amenity:kindergarten' => array('label' => 'Kindergarten', 'frequency' => 179, 'icon' => ''),
+            'highway:construction' => array('label' => 'Construction', 'frequency' => 176, 'icon' => ''),
+            'amenity:atm' => array('label' => 'Atm', 'frequency' => 172, 'icon' => 'money_atm2'),
+            'amenity:emergency_phone' => array('label' => 'Emergency Phone', 'frequency' => 164, 'icon' => ''),
+            'waterway:lock' => array('label' => 'Lock', 'frequency' => 146, 'icon' => ''),
+            'waterway:riverbank' => array('label' => 'Riverbank', 'frequency' => 143, 'icon' => ''),
+            'natural:coastline' => array('label' => 'Coastline', 'frequency' => 142, 'icon' => ''),
+            'tourism:viewpoint' => array('label' => 'Viewpoint', 'frequency' => 140, 'icon' => 'tourist_view_point'),
+            'tourism:hostel' => array('label' => 'Hostel', 'frequency' => 140, 'icon' => ''),
+            'tourism:bed_and_breakfast' => array('label' => 'Bed And Breakfast', 'frequency' => 140, 'icon' => 'accommodation_bed_and_breakfast'),
+            'railway:halt' => array('label' => 'Halt', 'frequency' => 135, 'icon' => ''),
+            'railway:platform' => array('label' => 'Platform', 'frequency' => 134, 'icon' => ''),
+            'railway:tram' => array('label' => 'Tram', 'frequency' => 130, 'icon' => 'transport_tram_stop'),
+            'amenity:courthouse' => array('label' => 'Courthouse', 'frequency' => 129, 'icon' => 'amenity_court'),
+            'amenity:recycling' => array('label' => 'Recycling', 'frequency' => 126, 'icon' => 'amenity_recycling'),
+            'amenity:dentist' => array('label' => 'Dentist', 'frequency' => 124, 'icon' => 'health_dentist'),
+            'natural:beach' => array('label' => 'Beach', 'frequency' => 121, 'icon' => 'tourist_beach'),
+            'place:moor' => array('label' => 'Moor', 'frequency' => 118, 'icon' => ''),
+            'amenity:grave_yard' => array('label' => 'Grave Yard', 'frequency' => 110, 'icon' => ''),
+            'waterway:drain' => array('label' => 'Drain', 'frequency' => 108, 'icon' => ''),
+            'landuse:grass' => array('label' => 'Grass', 'frequency' => 106, 'icon' => ''),
+            'landuse:village_green' => array('label' => 'Village Green', 'frequency' => 106, 'icon' => ''),
+            'natural:bay' => array('label' => 'Bay', 'frequency' => 102, 'icon' => ''),
+            'railway:tram_stop' => array('label' => 'Tram Stop', 'frequency' => 101, 'icon' => 'transport_tram_stop'),
+            'leisure:marina' => array('label' => 'Marina', 'frequency' => 98, 'icon' => ''),
+            'highway:stile' => array('label' => 'Stile', 'frequency' => 97, 'icon' => ''),
+            'natural:moor' => array('label' => 'Moor', 'frequency' => 95, 'icon' => ''),
+            'railway:light_rail' => array('label' => 'Light Rail', 'frequency' => 91, 'icon' => ''),
+            'railway:narrow_gauge' => array('label' => 'Narrow Gauge', 'frequency' => 90, 'icon' => ''),
+            'natural:land' => array('label' => 'Land', 'frequency' => 86, 'icon' => ''),
+            'amenity:village_hall' => array('label' => 'Village Hall', 'frequency' => 82, 'icon' => ''),
+            'waterway:dock' => array('label' => 'Dock', 'frequency' => 80, 'icon' => ''),
+            'amenity:veterinary' => array('label' => 'Veterinary', 'frequency' => 79, 'icon' => ''),
+            'landuse:brownfield' => array('label' => 'Brownfield', 'frequency' => 77, 'icon' => ''),
+            'leisure:track' => array('label' => 'Track', 'frequency' => 76, 'icon' => ''),
+            'railway:historic_station' => array('label' => 'Historic Station', 'frequency' => 74, 'icon' => ''),
+            'landuse:construction' => array('label' => 'Construction', 'frequency' => 72, 'icon' => ''),
+            'amenity:prison' => array('label' => 'Prison', 'frequency' => 71, 'icon' => 'amenity_prison'),
+            'landuse:quarry' => array('label' => 'Quarry', 'frequency' => 71, 'icon' => ''),
+            'amenity:telephone' => array('label' => 'Telephone', 'frequency' => 70, 'icon' => ''),
+            'highway:traffic_signals' => array('label' => 'Traffic Signals', 'frequency' => 66, 'icon' => ''),
+            'natural:heath' => array('label' => 'Heath', 'frequency' => 62, 'icon' => ''),
+            'historic:house' => array('label' => 'House', 'frequency' => 61, 'icon' => ''),
+            'amenity:social_club' => array('label' => 'Social Club', 'frequency' => 61, 'icon' => ''),
+            'landuse:military' => array('label' => 'Military', 'frequency' => 61, 'icon' => ''),
+            'amenity:health_centre' => array('label' => 'Health Centre', 'frequency' => 59, 'icon' => ''),
+            'historic:building' => array('label' => 'Building', 'frequency' => 58, 'icon' => ''),
+            'amenity:clinic' => array('label' => 'Clinic', 'frequency' => 57, 'icon' => ''),
+            'highway:services' => array('label' => 'Services', 'frequency' => 56, 'icon' => ''),
+            'amenity:ferry_terminal' => array('label' => 'Ferry Terminal', 'frequency' => 55, 'icon' => ''),
+            'natural:marsh' => array('label' => 'Marsh', 'frequency' => 55, 'icon' => ''),
+            'natural:hill' => array('label' => 'Hill', 'frequency' => 54, 'icon' => ''),
+            'highway:raceway' => array('label' => 'Raceway', 'frequency' => 53, 'icon' => ''),
+            'amenity:taxi' => array('label' => 'Taxi', 'frequency' => 47, 'icon' => ''),
+            'amenity:take_away' => array('label' => 'Take Away', 'frequency' => 45, 'icon' => ''),
+            'amenity:car_rental' => array('label' => 'Car Rental', 'frequency' => 44, 'icon' => ''),
+            'place:islet' => array('label' => 'Islet', 'frequency' => 44, 'icon' => ''),
+            'amenity:nursery' => array('label' => 'Nursery', 'frequency' => 44, 'icon' => ''),
+            'amenity:nursing_home' => array('label' => 'Nursing Home', 'frequency' => 43, 'icon' => ''),
+            'amenity:toilets' => array('label' => 'Toilets', 'frequency' => 38, 'icon' => ''),
+            'amenity:hall' => array('label' => 'Hall', 'frequency' => 38, 'icon' => ''),
+            'waterway:boatyard' => array('label' => 'Boatyard', 'frequency' => 36, 'icon' => ''),
+            'highway:mini_roundabout' => array('label' => 'Mini Roundabout', 'frequency' => 35, 'icon' => ''),
+            'historic:manor' => array('label' => 'Manor', 'frequency' => 35, 'icon' => ''),
+            'tourism:chalet' => array('label' => 'Chalet', 'frequency' => 34, 'icon' => ''),
+            'amenity:bicycle_parking' => array('label' => 'Bicycle Parking', 'frequency' => 34, 'icon' => ''),
+            'amenity:hotel' => array('label' => 'Hotel', 'frequency' => 34, 'icon' => ''),
+            'waterway:weir' => array('label' => 'Weir', 'frequency' => 33, 'icon' => ''),
+            'natural:wetland' => array('label' => 'Wetland', 'frequency' => 33, 'icon' => ''),
+            'natural:cave_entrance' => array('label' => 'Cave Entrance', 'frequency' => 32, 'icon' => ''),
+            'amenity:crematorium' => array('label' => 'Crematorium', 'frequency' => 31, 'icon' => ''),
+            'tourism:picnic_site' => array('label' => 'Picnic Site', 'frequency' => 31, 'icon' => ''),
+            'landuse:wood' => array('label' => 'Wood', 'frequency' => 30, 'icon' => ''),
+            'landuse:basin' => array('label' => 'Basin', 'frequency' => 30, 'icon' => ''),
+            'natural:tree' => array('label' => 'Tree', 'frequency' => 30, 'icon' => ''),
+            'leisure:slipway' => array('label' => 'Slipway', 'frequency' => 29, 'icon' => ''),
+            'landuse:meadow' => array('label' => 'Meadow', 'frequency' => 29, 'icon' => ''),
+            'landuse:piste' => array('label' => 'Piste', 'frequency' => 28, 'icon' => ''),
+            'amenity:care_home' => array('label' => 'Care Home', 'frequency' => 28, 'icon' => ''),
+            'amenity:club' => array('label' => 'Club', 'frequency' => 28, 'icon' => ''),
+            'amenity:medical_centre' => array('label' => 'Medical Centre', 'frequency' => 27, 'icon' => ''),
+            'historic:roman_road' => array('label' => 'Roman Road', 'frequency' => 27, 'icon' => ''),
+            'historic:fort' => array('label' => 'Fort', 'frequency' => 26, 'icon' => ''),
+            'railway:subway_entrance' => array('label' => 'Subway Entrance', 'frequency' => 26, 'icon' => ''),
+            'historic:yes' => array('label' => 'Historic', 'frequency' => 25, 'icon' => ''),
+            'highway:gate' => array('label' => 'Gate', 'frequency' => 25, 'icon' => ''),
+            'leisure:fishing' => array('label' => 'Fishing', 'frequency' => 24, 'icon' => ''),
+            'historic:museum' => array('label' => 'Museum', 'frequency' => 24, 'icon' => ''),
+            'amenity:car_wash' => array('label' => 'Car Wash', 'frequency' => 24, 'icon' => ''),
+            'railway:level_crossing' => array('label' => 'Level Crossing', 'frequency' => 23, 'icon' => ''),
+            'leisure:bird_hide' => array('label' => 'Bird Hide', 'frequency' => 23, 'icon' => ''),
+            'natural:headland' => array('label' => 'Headland', 'frequency' => 21, 'icon' => ''),
+            'tourism:apartments' => array('label' => 'Apartments', 'frequency' => 21, 'icon' => ''),
+            'amenity:shopping' => array('label' => 'Shopping', 'frequency' => 21, 'icon' => ''),
+            'natural:scrub' => array('label' => 'Scrub', 'frequency' => 20, 'icon' => ''),
+            'natural:fen' => array('label' => 'Fen', 'frequency' => 20, 'icon' => ''),
+            'building:yes' => array('label' => 'Building', 'frequency' => 200, 'icon' => ''),
+            'mountain_pass:yes' => array('label' => 'Mountain Pass', 'frequency' => 200, 'icon' => ''),
+
+            'amenity:parking' => array('label' => 'Parking', 'frequency' => 3157, 'icon' => ''),
+            'highway:bus_stop' => array('label' => 'Bus Stop', 'frequency' => 35777, 'icon' => 'transport_bus_stop2'),
+            'place:postcode' => array('label' => 'Postcode', 'frequency' => 27267, 'icon' => ''),
+            'amenity:post_box' => array('label' => 'Post Box', 'frequency' => 9613, 'icon' => ''),
+
+            'place:houses' => array('label' => 'Houses', 'frequency' => 85, 'icon' => ''),
+            'railway:preserved' => array('label' => 'Preserved', 'frequency' => 227, 'icon' => ''),
+            'waterway:derelict_canal' => array('label' => 'Derelict Canal', 'frequency' => 21, 'icon' => ''),
+            'amenity:dead_pub' => array('label' => 'Dead Pub', 'frequency' => 20, 'icon' => ''),
+            'railway:disused_station' => array('label' => 'Disused Station', 'frequency' => 114, 'icon' => ''),
+            'railway:abandoned' => array('label' => 'Abandoned', 'frequency' => 641, 'icon' => ''),
+            'railway:disused' => array('label' => 'Disused', 'frequency' => 72, 'icon' => ''),
+           );
+}
+
+
+function getClassTypesWithImportance()
+{
+    $aOrders = getClassTypes();
+    $i = 1;
+    foreach ($aOrders as $sID => $a) {
+        $aOrders[$sID]['importance'] = $i++;
+    }
+    return $aOrders;
+}
+
+function getResultDiameter($aResult)
+{
+    $aClassType = getClassTypes();
+
+    $fDiameter = 0.0001;
+
+    if (isset($aResult['class'])
+        && isset($aResult['type'])
+        && isset($aResult['admin_level'])
+        && isset($aClassType[$aResult['class'].':'.$aResult['type'].':'.$aResult['admin_level']]['defdiameter'])
+        && $aClassType[$aResult['class'].':'.$aResult['type'].':'.$aResult['admin_level']]['defdiameter']
+    ) {
+        $fDiameter = $aClassType[$aResult['class'].':'.$aResult['type'].':'.$aResult['admin_level']]['defdiameter'];
+    } elseif (isset($aResult['class'])
+        && isset($aResult['type'])
+        && isset($aClassType[$aResult['class'].':'.$aResult['type']]['defdiameter'])
+        && $aClassType[$aResult['class'].':'.$aResult['type']]['defdiameter']
+    ) {
+        $fDiameter = $aClassType[$aResult['class'].':'.$aResult['type']]['defdiameter'];
+    }
+
+    return $fDiameter;
+}
+
+
+function javascript_renderData($xVal, $iOptions = 0)
+{
+    if (defined('PHP_VERSION_ID') && PHP_VERSION_ID > 50400)
+        $iOptions |= JSON_UNESCAPED_UNICODE;
+    $jsonout = json_encode($xVal, $iOptions);
+
+    if (! isset($_GET['json_callback'])) {
+        header("Content-Type: application/json; charset=UTF-8");
+        echo $jsonout;
+    } else {
+        if (preg_match('/^[$_\p{L}][$_\p{L}\p{Nd}.[\]]*$/u', $_GET['json_callback'])) {
+            header("Content-Type: application/javascript; charset=UTF-8");
+            echo $_GET['json_callback'].'('.$jsonout.')';
+        } else {
+            header('HTTP/1.0 400 Bad Request');
+        }
+    }
+}
+
+
+function _debugDumpGroupedSearches($aData, $aTokens)
+{
+    $aWordsIDs = array();
+    if ($aTokens) {
+        foreach ($aTokens as $sToken => $aWords) {
+            if ($aWords) {
+                foreach ($aWords as $aToken) {
+                    $aWordsIDs[$aToken['word_id']] = $sToken.'('.$aToken['word_id'].')';
+                }
+            }
+        }
+    }
+    echo "<table border=\"1\">";
+    echo "<tr><th>rank</th><th>Name Tokens</th><th>Name Not</th><th>Address Tokens</th><th>Address Not</th><th>country</th><th>operator</th><th>class</th><th>type</th><th>house#</th><th>Lat</th><th>Lon</th><th>Radius</th></tr>";
+    foreach ($aData as $iRank => $aRankedSet) {
+        foreach ($aRankedSet as $aRow) {
+            echo "<tr>";
+            echo "<td>$iRank</td>";
+
+            echo "<td>";
+            $sSep = '';
+            foreach ($aRow['aName'] as $iWordID) {
+                echo $sSep.'#'.$aWordsIDs[$iWordID].'#';
+                $sSep = ', ';
+            }
+            echo "</td>";
+
+            echo "<td>";
+            $sSep = '';
+            foreach ($aRow['aNameNonSearch'] as $iWordID) {
+                echo $sSep.'#'.$aWordsIDs[$iWordID].'#';
+                $sSep = ', ';
+            }
+            echo "</td>";
+
+            echo "<td>";
+            $sSep = '';
+            foreach ($aRow['aAddress'] as $iWordID) {
+                echo $sSep.'#'.$aWordsIDs[$iWordID].'#';
+                $sSep = ', ';
+            }
+            echo "</td>";
+
+            echo "<td>";
+            $sSep = '';
+            foreach ($aRow['aAddressNonSearch'] as $iWordID) {
+                echo $sSep.'#'.$aWordsIDs[$iWordID].'#';
+                $sSep = ', ';
+            }
+            echo "</td>";
+
+            echo "<td>".$aRow['sCountryCode']."</td>";
+
+            echo "<td>".$aRow['sOperator']."</td>";
+            echo "<td>".$aRow['sClass']."</td>";
+            echo "<td>".$aRow['sType']."</td>";
+
+            echo "<td>".$aRow['sHouseNumber']."</td>";
+
+            echo "<td>".$aRow['fLat']."</td>";
+            echo "<td>".$aRow['fLon']."</td>";
+            echo "<td>".$aRow['fRadius']."</td>";
+
+            echo "</tr>";
+        }
+    }
+    echo "</table>";
+}
+
+
+function getAddressDetails(&$oDB, $sLanguagePrefArraySQL, $iPlaceID, $sCountryCode = false, $housenumber = -1, $bRaw = false)
+{
+    $sSQL = "select *,get_name_by_language(name,$sLanguagePrefArraySQL) as localname from get_addressdata($iPlaceID, $housenumber)";
+    if (!$bRaw) $sSQL .= " WHERE isaddress OR type = 'country_code'";
+    $sSQL .= " order by rank_address desc,isaddress desc";
+
+    $aAddressLines = chksql($oDB->getAll($sSQL));
+    if ($bRaw) return $aAddressLines;
+    //echo "<pre>";
+    //var_dump($aAddressLines);
+    $aAddress = array();
+    $aFallback = array();
+    $aClassType = getClassTypes();
+    foreach ($aAddressLines as $aLine) {
+        $bFallback = false;
+        $aTypeLabel = false;
+        if (isset($aClassType[$aLine['class'].':'.$aLine['type'].':'.$aLine['admin_level']])) {
+            $aTypeLabel = $aClassType[$aLine['class'].':'.$aLine['type'].':'.$aLine['admin_level']];
+        } elseif (isset($aClassType[$aLine['class'].':'.$aLine['type']])) {
+            $aTypeLabel = $aClassType[$aLine['class'].':'.$aLine['type']];
+        } elseif (isset($aClassType['boundary:administrative:'.((int)($aLine['rank_address']/2))])) {
+            $aTypeLabel = $aClassType['boundary:administrative:'.((int)($aLine['rank_address']/2))];
+            $bFallback = true;
+        } else {
+            $aTypeLabel = array('simplelabel' => 'address'.$aLine['rank_address']);
+            $bFallback = true;
+        }
+        if ($aTypeLabel && ((isset($aLine['localname']) && $aLine['localname']) || (isset($aLine['housenumber']) && $aLine['housenumber']))) {
+            $sTypeLabel = strtolower(isset($aTypeLabel['simplelabel'])?$aTypeLabel['simplelabel']:$aTypeLabel['label']);
+            $sTypeLabel = str_replace(' ', '_', $sTypeLabel);
+            if (!isset($aAddress[$sTypeLabel]) || (isset($aFallback[$sTypeLabel]) && $aFallback[$sTypeLabel]) || $aLine['class'] == 'place') {
+                $aAddress[$sTypeLabel] = $aLine['localname']?$aLine['localname']:$aLine['housenumber'];
+            }
+            $aFallback[$sTypeLabel] = $bFallback;
+        }
+    }
+    return $aAddress;
+}
+
+
+function addQuotes($s)
+{
+    return "'".$s."'";
+}
+
+function validLatLon($fLat, $fLon)
+{
+    return ($fLat <= 90.1 && $fLat >= -90.1 && $fLon <= 180.1 && $fLon >= -180.1);
+}
+
+function looksLikeLatLonPair($sQuery)
+{
+    // Do we have anything that looks like a lat/lon pair?
+    // returns array(lat,lon,query_with_lat_lon_removed)
+    // or null
+    $sFound    = null;
+    $fQueryLat = null;
+    $fQueryLon = null;
+
+    if (preg_match('/\\b([NS])[ ]+([0-9]+[0-9.]*)[° ]+([0-9.]+)?[′\']*[, ]+([EW])[ ]+([0-9]+)[° ]+([0-9]+[0-9.]*)[′\']*?\\b/', $sQuery, $aData)) {
+        /*              1         2                   3                  4         5            6
+         * degrees decimal minutes
+         * N 40 26.767, W 79 58.933
+         * N 40°26.767′, W 79°58.933′
+         */
+        $sFound    = $aData[0];
+        $fQueryLat = ($aData[1]=='N'?1:-1) * ($aData[2] + $aData[3]/60);
+        $fQueryLon = ($aData[4]=='E'?1:-1) * ($aData[5] + $aData[6]/60);
+    } elseif (preg_match('/\\b([0-9]+)[° ]+([0-9]+[0-9.]*)?[′\']*[ ]+([NS])[, ]+([0-9]+)[° ]+([0-9]+[0-9.]*)?[′\' ]+([EW])\\b/', $sQuery, $aData)) {
+        /*                    1             2                      3          4            5                    6
+         * degrees decimal minutes
+         * 40 26.767 N, 79 58.933 W
+         * 40° 26.767′ N 79° 58.933′ W
+         */
+        $sFound    = $aData[0];
+        $fQueryLat = ($aData[3]=='N'?1:-1) * ($aData[1] + $aData[2]/60);
+        $fQueryLon = ($aData[6]=='E'?1:-1) * ($aData[4] + $aData[5]/60);
+    } elseif (preg_match('/\\b([NS])[ ]([0-9]+)[° ]+([0-9]+)[′\' ]+([0-9]+)[″"]*[, ]+([EW])[ ]([0-9]+)[° ]+([0-9]+)[′\' ]+([0-9]+)[″"]*\\b/', $sQuery, $aData)) {
+        /*                    1        2            3            4                5        6            7            8
+         * degrees decimal seconds
+         * N 40 26 46 W 79 58 56
+         * N 40° 26′ 46″, W 79° 58′ 56″
+         */
+        $sFound    = $aData[0];
+        $fQueryLat = ($aData[1]=='N'?1:-1) * ($aData[2] + $aData[3]/60 + $aData[4]/3600);
+        $fQueryLon = ($aData[5]=='E'?1:-1) * ($aData[6] + $aData[7]/60 + $aData[8]/3600);
+    } elseif (preg_match('/\\b([0-9]+)[° ]+([0-9]+)[′\' ]+([0-9]+)[″" ]+([NS])[, ]+([0-9]+)[° ]+([0-9]+)[′\' ]+([0-9]+)[″" ]+([EW])\\b/', $sQuery, $aData)) {
+        /*                    1            2            3            4          5            6            7            8
+         * degrees decimal seconds
+         * 40 26 46 N 79 58 56 W
+         * 40° 26′ 46″ N, 79° 58′ 56″ W
+         */
+        $sFound    = $aData[0];
+        $fQueryLat = ($aData[4]=='N'?1:-1) * ($aData[1] + $aData[2]/60 + $aData[3]/3600);
+        $fQueryLon = ($aData[8]=='E'?1:-1) * ($aData[5] + $aData[6]/60 + $aData[7]/3600);
+    } elseif (preg_match('/\\b([NS])[ ]([0-9]+[0-9]*\\.[0-9]+)[°]*[, ]+([EW])[ ]([0-9]+[0-9]*\\.[0-9]+)[°]*\\b/', $sQuery, $aData)) {
+        /*                    1        2                               3        4
+         * degrees decimal
+         * N 40.446° W 79.982°
+         */
+        $sFound    = $aData[0];
+        $fQueryLat = ($aData[1]=='N'?1:-1) * ($aData[2]);
+        $fQueryLon = ($aData[3]=='E'?1:-1) * ($aData[4]);
+    } elseif (preg_match('/\\b([0-9]+[0-9]*\\.[0-9]+)[° ]+([NS])[, ]+([0-9]+[0-9]*\\.[0-9]+)[° ]+([EW])\\b/', $sQuery, $aData)) {
+        /*                    1                           2          3                           4
+         * degrees decimal
+         * 40.446° N 79.982° W
+         */
+        $sFound    = $aData[0];
+        $fQueryLat = ($aData[2]=='N'?1:-1) * ($aData[1]);
+        $fQueryLon = ($aData[4]=='E'?1:-1) * ($aData[3]);
+    } elseif (preg_match('/(\\[|^|\\b)(-?[0-9]+[0-9]*\\.[0-9]+)[, ]+(-?[0-9]+[0-9]*\\.[0-9]+)(\\]|$|\\b)/', $sQuery, $aData)) {
+        /*                 1          2                             3                        4
+         * degrees decimal
+         * 12.34, 56.78
+         * [12.456,-78.90]
+         */
+        $sFound    = $aData[0];
+        $fQueryLat = $aData[2];
+        $fQueryLon = $aData[3];
+    }
+
+    if (!validLatLon($fQueryLat, $fQueryLon)) return;
+    $sQuery = trim(str_replace($sFound, ' ', $sQuery));
+
+    return array('lat' => $fQueryLat, 'lon' => $fQueryLon, 'query' => $sQuery);
+}
+
+
+function geometryText2Points($geometry_as_text, $fRadius)
+{
+    $aPolyPoints = null;
+    if (preg_match('#POLYGON\\(\\(([- 0-9.,]+)#', $geometry_as_text, $aMatch)) {
+        //
+        preg_match_all('/(-?[0-9.]+) (-?[0-9.]+)/', $aMatch[1], $aPolyPoints, PREG_SET_ORDER);
+        //
+    } elseif (preg_match('#LINESTRING\\(([- 0-9.,]+)#', $geometry_as_text, $aMatch)) {
+        //
+        preg_match_all('/(-?[0-9.]+) (-?[0-9.]+)/', $aMatch[1], $aPolyPoints, PREG_SET_ORDER);
+        //
+/*    } elseif (preg_match('#MULTIPOLYGON\\(\\(\\(([- 0-9.,]+)#', $geometry_as_text, $aMatch)) {
+        //
+        preg_match_all('/(-?[0-9.]+) (-?[0-9.]+)/', $aMatch[1], $aPolyPoints, PREG_SET_ORDER);
+        */
+    } elseif (preg_match('#POINT\\((-?[0-9.]+) (-?[0-9.]+)\\)#', $geometry_as_text, $aMatch)) {
+        //
+        $aPolyPoints = createPointsAroundCenter($aMatch[1], $aMatch[2], $fRadius);
+        //
+    }
+
+    if (isset($aPolyPoints)) {
+        $aResultPoints = array();
+        foreach ($aPolyPoints as $aPoint) {
+            $aResultPoints[] = array($aPoint[1], $aPoint[2]);
+        }
+        return $aResultPoints;
+    }
+
+    return;
+}
+
+function createPointsAroundCenter($fLon, $fLat, $fRadius)
+{
+    $iSteps = max(8, min(100, ($fRadius * 40000)^2));
+    $fStepSize = (2*pi())/$iSteps;
+    $aPolyPoints = array();
+    for ($f = 0; $f < 2*pi(); $f += $fStepSize) {
+        $aPolyPoints[] = array('', $fLon+($fRadius*sin($f)), $fLat+($fRadius*cos($f)) );
+    }
+    return $aPolyPoints;
+}
index de19167bbb864294e07d8c0418ab51abe9fd7bf3..9a064b9b7309058cf31db900772ea52e774ebfa7 100644 (file)
@@ -1,74 +1,74 @@
 <?php
 
-       function logStart(&$oDB, $sType = '', $sQuery = '', $aLanguageList = array())
-       {
-               $fStartTime = microtime(true);
-               $aStartTime = explode('.', $fStartTime);
-               if (!isset($aStartTime[1])) $aStartTime[1] = '0';
 
-               $sOutputFormat = '';
-               if (isset($_GET['format'])) $sOutputFormat = $_GET['format'];
+function logStart(&$oDB, $sType = '', $sQuery = '', $aLanguageList = array())
+{
+    $fStartTime = microtime(true);
+    $aStartTime = explode('.', $fStartTime);
+    if (!isset($aStartTime[1])) $aStartTime[1] = '0';
 
-               if ($sType == 'reverse')
-               {
-                       $sOutQuery = (isset($_GET['lat'])?$_GET['lat']:'').'/';
-                       if (isset($_GET['lon'])) $sOutQuery .= $_GET['lon'];
-                       if (isset($_GET['zoom'])) $sOutQuery .= '/'.$_GET['zoom'];
-               }
-               else
-                       $sOutQuery = $sQuery;
+    $sOutputFormat = '';
+    if (isset($_GET['format'])) $sOutputFormat = $_GET['format'];
 
-               $hLog = array(
-                               date('Y-m-d H:i:s',$aStartTime[0]).'.'.$aStartTime[1],
-                               $_SERVER["REMOTE_ADDR"],
-                               $_SERVER['QUERY_STRING'],
-                               $sOutQuery,
-                               $sType,
-                               $fStartTime
-                               );
+    if ($sType == 'reverse') {
+        $sOutQuery = (isset($_GET['lat'])?$_GET['lat']:'').'/';
+        if (isset($_GET['lon'])) $sOutQuery .= $_GET['lon'];
+        if (isset($_GET['zoom'])) $sOutQuery .= '/'.$_GET['zoom'];
+    } else {
+        $sOutQuery = $sQuery;
+    }
 
-               if (CONST_Log_DB)
-               {
-                       if (isset($_GET['email']))
-                               $sUserAgent = $_GET['email'];
-                       elseif (isset($_SERVER['HTTP_REFERER']))
-                               $sUserAgent = $_SERVER['HTTP_REFERER'];
-                       elseif (isset($_SERVER['HTTP_USER_AGENT']))
-                               $sUserAgent = $_SERVER['HTTP_USER_AGENT'];
-                       else
-                               $sUserAgent = '';
-                       $sSQL = 'insert into new_query_log (type,starttime,query,ipaddress,useragent,language,format,searchterm)';
-                       $sSQL .= ' values ('.getDBQuoted($sType).','.getDBQuoted($hLog[0]).','.getDBQuoted($hLog[2]);
-                       $sSQL .= ','.getDBQuoted($hLog[1]).','.getDBQuoted($sUserAgent).','.getDBQuoted(join(',',$aLanguageList)).','.getDBQuoted($sOutputFormat).','.getDBQuoted($hLog[3]).')';
-                       $oDB->query($sSQL);
-               }
+    $hLog = array(
+             date('Y-m-d H:i:s', $aStartTime[0]).'.'.$aStartTime[1],
+             $_SERVER["REMOTE_ADDR"],
+             $_SERVER['QUERY_STRING'],
+             $sOutQuery,
+             $sType,
+             $fStartTime
+            );
 
-               return $hLog;
-       }
+    if (CONST_Log_DB) {
+        if (isset($_GET['email']))
+            $sUserAgent = $_GET['email'];
+        elseif (isset($_SERVER['HTTP_REFERER']))
+            $sUserAgent = $_SERVER['HTTP_REFERER'];
+        elseif (isset($_SERVER['HTTP_USER_AGENT']))
+            $sUserAgent = $_SERVER['HTTP_USER_AGENT'];
+        else $sUserAgent = '';
+        $sSQL = 'insert into new_query_log (type,starttime,query,ipaddress,useragent,language,format,searchterm)';
+        $sSQL .= ' values ('.getDBQuoted($sType).','.getDBQuoted($hLog[0]).','.getDBQuoted($hLog[2]);
+        $sSQL .= ','.getDBQuoted($hLog[1]).','.getDBQuoted($sUserAgent).','.getDBQuoted(join(',', $aLanguageList)).','.getDBQuoted($sOutputFormat).','.getDBQuoted($hLog[3]).')';
+        $oDB->query($sSQL);
+    }
 
-       function logEnd(&$oDB, $hLog, $iNumResults)
-       {
-               $fEndTime = microtime(true);
+    return $hLog;
+}
 
-               if (CONST_Log_DB)
-               {
-                       $aEndTime = explode('.', $fEndTime);
-                       if (!$aEndTime[1]) $aEndTime[1] = '0';
-                       $sEndTime = date('Y-m-d H:i:s',$aEndTime[0]).'.'.$aEndTime[1];
+function logEnd(&$oDB, $hLog, $iNumResults)
+{
+    $fEndTime = microtime(true);
 
-                       $sSQL = 'update new_query_log set endtime = '.getDBQuoted($sEndTime).', results = '.$iNumResults;
-                       $sSQL .= ' where starttime = '.getDBQuoted($hLog[0]);
-                       $sSQL .= ' and ipaddress = '.getDBQuoted($hLog[1]);
-                       $sSQL .= ' and query = '.getDBQuoted($hLog[2]);
-                       $oDB->query($sSQL);
-               }
+    if (CONST_Log_DB) {
+        $aEndTime = explode('.', $fEndTime);
+        if (!$aEndTime[1]) $aEndTime[1] = '0';
+        $sEndTime = date('Y-m-d H:i:s', $aEndTime[0]).'.'.$aEndTime[1];
 
-               if (CONST_Log_File)
-               {
-                       $aOutdata = sprintf("[%s] %.4f %d %s \"%s\"\n",
-                                           $hLog[0], $fEndTime-$hLog[5], $iNumResults,
-                                           $hLog[4], $hLog[2]);
-                       file_put_contents(CONST_Log_File, $aOutdata, FILE_APPEND | LOCK_EX);
-               }
+        $sSQL = 'update new_query_log set endtime = '.getDBQuoted($sEndTime).', results = '.$iNumResults;
+        $sSQL .= ' where starttime = '.getDBQuoted($hLog[0]);
+        $sSQL .= ' and ipaddress = '.getDBQuoted($hLog[1]);
+        $sSQL .= ' and query = '.getDBQuoted($hLog[2]);
+        $oDB->query($sSQL);
+    }
 
-       }
+    if (CONST_Log_File) {
+        $aOutdata = sprintf(
+            "[%s] %.4f %d %s \"%s\"\n",
+            $hLog[0],
+            $fEndTime-$hLog[5],
+            $iNumResults,
+            $hLog[4],
+            $hLog[2]
+        );
+        file_put_contents(CONST_Log_File, $aOutdata, FILE_APPEND | LOCK_EX);
+    }
+}
index 722d73b18aa79e80b4509fc6a4c165b6f60bca48..58f00091707ffbce13cc85c9ad1ed3192d701726 100644 (file)
@@ -1,43 +1,41 @@
 <?php
 
-       function formatOSMType($sType, $bIncludeExternal=true)
-       {
-               if ($sType == 'N') return 'node';
-               if ($sType == 'W') return 'way';
-               if ($sType == 'R') return 'relation';
-
-               if (!$bIncludeExternal) return '';
-
-               if ($sType == 'T') return 'tiger';
-               if ($sType == 'I') return 'way';
-
-               return '';
-       }
-
-       function osmLink($aFeature, $sRefText=false)
-       {
-               $sOSMType = formatOSMType($aFeature['osm_type'], false);
-               if ($sOSMType)
-               {
-                       return '<a href="//www.openstreetmap.org/'.$sOSMType.'/'.$aFeature['osm_id'].'">'.$sOSMType.' '.($sRefText?$sRefText:$aFeature['osm_id']).'</a>';
-               }
-               return '';
-       }
-
-       function wikipediaLink($aFeature)
-       {
-               if ($aFeature['wikipedia'])
-               {
-                       list($sLanguage, $sArticle) = explode(':',$aFeature['wikipedia']);
-                       return '<a href="https://'.$sLanguage.'.wikipedia.org/wiki/'.urlencode($sArticle).'" target="_blank">'.$aFeature['wikipedia'].'</a>';
-               }
-               return '';
-       }
-
-       function detailsLink($aFeature, $sTitle=false)
-       {
-               if (!$aFeature['place_id']) return '';
-
-               return '<a href="details.php?place_id='.$aFeature['place_id'].'">'.($sTitle?$sTitle:$aFeature['place_id']).'</a>';
-       }
 
+function formatOSMType($sType, $bIncludeExternal = true)
+{
+    if ($sType == 'N') return 'node';
+    if ($sType == 'W') return 'way';
+    if ($sType == 'R') return 'relation';
+
+    if (!$bIncludeExternal) return '';
+
+    if ($sType == 'T') return 'tiger';
+    if ($sType == 'I') return 'way';
+
+    return '';
+}
+
+function osmLink($aFeature, $sRefText = false)
+{
+    $sOSMType = formatOSMType($aFeature['osm_type'], false);
+    if ($sOSMType) {
+        return '<a href="//www.openstreetmap.org/'.$sOSMType.'/'.$aFeature['osm_id'].'">'.$sOSMType.' '.($sRefText?$sRefText:$aFeature['osm_id']).'</a>';
+    }
+    return '';
+}
+
+function wikipediaLink($aFeature)
+{
+    if ($aFeature['wikipedia']) {
+        list($sLanguage, $sArticle) = explode(':', $aFeature['wikipedia']);
+        return '<a href="https://'.$sLanguage.'.wikipedia.org/wiki/'.urlencode($sArticle).'" target="_blank">'.$aFeature['wikipedia'].'</a>';
+    }
+    return '';
+}
+
+function detailsLink($aFeature, $sTitle = false)
+{
+    if (!$aFeature['place_id']) return '';
+
+    return '<a href="details.php?place_id='.$aFeature['place_id'].'">'.($sTitle?$sTitle:$aFeature['place_id']).'</a>';
+}
index ed5c39eb83ab5e0c81486d4ec481802cfd990ba8..4a9f6325eb7463e67ad830db2ac79953507b2a29 100644 (file)
 <?php
-       header("content-type: text/html; charset=UTF-8");
+    header("content-type: text/html; charset=UTF-8");
 ?>
 <?php include(CONST_BasePath.'/lib/template/includes/html-header.php'); ?>
-       <link href="css/common.css" rel="stylesheet" type="text/css" />
-       <link href="css/search.css" rel="stylesheet" type="text/css" />
+    <link href="css/common.css" rel="stylesheet" type="text/css" />
+    <link href="css/search.css" rel="stylesheet" type="text/css" />
 </head>
 
 <body id="reverse-page">
 
-       <?php include(CONST_BasePath.'/lib/template/includes/html-top-navigation.php'); ?>
-
-       <form class="form-inline" role="search" accept-charset="UTF-8" action="<?php echo CONST_Website_BaseURL; ?>reverse.php">
-               <div class="form-group">
-                       <input name="format" type="hidden" value="html">
-                       <input name="lat" type="text" class="form-control input-sm" placeholder="latitude"  value="<?php echo htmlspecialchars($_GET['lat']); ?>" >
-                       <input name="lon" type="text" class="form-control input-sm" placeholder="longitude" value="<?php echo htmlspecialchars($_GET['lon']); ?>" >
-                       max zoom
-
-                       <select name="zoom" class="form-control input-sm" value="<?php echo htmlspecialchars($_GET['zoom']); ?>">
-                               <option value="" <?php echo $_GET['zoom']==''?'selected':'' ?> >--</option>
-                               <?php
-
-                                       $aZoomLevels = array(
-                                                0 => "Continent / Sea",
-                                                1 => "",
-                                                2 => "",
-                                                3 => "Country",
-                                                4 => "",
-                                                5 => "State",
-                                                6 => "Region",
-                                                7 => "",
-                                                8 => "County",
-                                                9 => "",
-                                               10 => "City",
-                                               11 => "",
-                                               12 => "Town / Village",
-                                               13 => "",
-                                               14 => "Suburb",
-                                               15 => "",
-                                               16 => "Street",
-                                               17 => "",
-                                               18 => "Building",
-                                               19 => "",
-                                               20 => "",
-                                               21 => "",
-                                       );
-
-                                       foreach($aZoomLevels as $iZoomLevel => $sLabel)
-                                       {
-                                               $bSel = isset($_GET['zoom']) && ($_GET['zoom'] == (string)$iZoomLevel);
-                                               echo '<option value="'.$iZoomLevel.'"'.($bSel?'selected':'').'>'.$iZoomLevel.' '.$sLabel.'</option>'."\n";
-                                       }
-                               ?>
-                       </select>
-               </div>
-               <div class="form-group search-button-group">
-                       <button type="submit" class="btn btn-primary btn-sm">Search</button>
-               </div>
-               <div class="search-type-link">
-                       <a href="<?php echo CONST_Website_BaseURL; ?>search.php">forward search</a>
-               </div>
-       </form>
-
-
-       <div id="content">
+    <?php include(CONST_BasePath.'/lib/template/includes/html-top-navigation.php'); ?>
+
+    <form class="form-inline" role="search" accept-charset="UTF-8" action="<?php echo CONST_Website_BaseURL; ?>reverse.php">
+        <div class="form-group">
+            <input name="format" type="hidden" value="html">
+            <input name="lat" type="text" class="form-control input-sm" placeholder="latitude"  value="<?php echo htmlspecialchars($_GET['lat']); ?>" >
+            <input name="lon" type="text" class="form-control input-sm" placeholder="longitude" value="<?php echo htmlspecialchars($_GET['lon']); ?>" >
+            max zoom
+
+            <select name="zoom" class="form-control input-sm" value="<?php echo htmlspecialchars($_GET['zoom']); ?>">
+                <option value="" <?php echo $_GET['zoom']==''?'selected':'' ?> >--</option>
+                <?php
+
+                    $aZoomLevels = array(
+                         0 => "Continent / Sea",
+                         1 => "",
+                         2 => "",
+                         3 => "Country",
+                         4 => "",
+                         5 => "State",
+                         6 => "Region",
+                         7 => "",
+                         8 => "County",
+                         9 => "",
+                        10 => "City",
+                        11 => "",
+                        12 => "Town / Village",
+                        13 => "",
+                        14 => "Suburb",
+                        15 => "",
+                        16 => "Street",
+                        17 => "",
+                        18 => "Building",
+                        19 => "",
+                        20 => "",
+                        21 => "",
+                    );
+
+                    foreach($aZoomLevels as $iZoomLevel => $sLabel)
+                    {
+                        $bSel = isset($_GET['zoom']) && ($_GET['zoom'] == (string)$iZoomLevel);
+                        echo '<option value="'.$iZoomLevel.'"'.($bSel?'selected':'').'>'.$iZoomLevel.' '.$sLabel.'</option>'."\n";
+                    }
+                ?>
+            </select>
+        </div>
+        <div class="form-group search-button-group">
+            <button type="submit" class="btn btn-primary btn-sm">Search</button>
+        </div>
+        <div class="search-type-link">
+            <a href="<?php echo CONST_Website_BaseURL; ?>search.php">forward search</a>
+        </div>
+    </form>
+
+
+    <div id="content">
 
 <?php if ($aPlace) { ?>
 
-               <div id="searchresults" class="sidebar">
-               <?php
-                       $aResult = $aPlace;
-
-                       echo '<div class="result" data-position="0">';
-
-                       echo (isset($aResult['icon'])?'<img alt="icon" src="'.$aResult['icon'].'"/>':'');
-                       echo ' <span class="name">'.htmlspecialchars($aResult['langaddress']).'</span>';
-                       if (isset($aResult['label']))
-                               echo ' <span class="type">('.$aResult['label'].')</span>';
-                       else if ($aResult['type'] == 'yes')
-                               echo ' <span class="type">('.ucwords(str_replace('_',' ',$aResult['class'])).')</span>';
-                       else
-                               echo ' <span class="type">('.ucwords(str_replace('_',' ',$aResult['type'])).')</span>';
-                       echo '<p>'.$aResult['lat'].','.$aResult['lon'].'</p>';
-                       echo ' <a class="btn btn-default btn-xs details" href="details.php?place_id='.$aResult['place_id'].'">details</a>';
-                       echo '</div>';
-               ?>
-               </div>
+        <div id="searchresults" class="sidebar">
+        <?php
+            $aResult = $aPlace;
+
+            echo '<div class="result" data-position="0">';
+
+            echo (isset($aResult['icon'])?'<img alt="icon" src="'.$aResult['icon'].'"/>':'');
+            echo ' <span class="name">'.htmlspecialchars($aResult['langaddress']).'</span>';
+            if (isset($aResult['label']))
+                echo ' <span class="type">('.$aResult['label'].')</span>';
+            else if ($aResult['type'] == 'yes')
+                echo ' <span class="type">('.ucwords(str_replace('_',' ',$aResult['class'])).')</span>';
+            else
+                echo ' <span class="type">('.ucwords(str_replace('_',' ',$aResult['type'])).')</span>';
+            echo '<p>'.$aResult['lat'].','.$aResult['lon'].'</p>';
+            echo ' <a class="btn btn-default btn-xs details" href="details.php?place_id='.$aResult['place_id'].'">details</a>';
+            echo '</div>';
+        ?>
+        </div>
 
 <?php } else { ?>
 
-               <div id="intro" class="sidebar">
-                       Search for coordinates or click anywhere on the map.
-               </div>
+        <div id="intro" class="sidebar">
+            Search for coordinates or click anywhere on the map.
+        </div>
 
 <?php } ?>
 
-               <div id="map-wrapper">
-                       <div id="map-position"></div>
-                       <div id="map"></div>
-               </div>
+        <div id="map-wrapper">
+            <div id="map-position">
+                <div id="map-position-inner"></div>
+                <div id="map-position-close"><a href="#">hide</a></div>
+            </div>
+            <div id="map"></div>
+        </div>
 
-       </div> <!-- /content -->
+    </div> <!-- /content -->
 
 
 
 
 
 
-       <script type="text/javascript">
-       <?php
+    <script type="text/javascript">
+    <?php
 
-               $aNominatimMapInit = array(
-                       'zoom' => isset($_GET['zoom']) ? htmlspecialchars($_GET['zoom']) : CONST_Default_Zoom,
-                       'lat'  => isset($_GET['lat']) ? htmlspecialchars($_GET['lat']) : CONST_Default_Lat,
-                       'lon'  => isset($_GET['lon']) ? htmlspecialchars($_GET['lon']) : CONST_Default_Lon,
-                       'tile_url' => $sTileURL,
-                       'tile_attribution' => $sTileAttribution
-               );
-               echo 'var nominatim_map_init = ' . json_encode($aNominatimMapInit, JSON_PRETTY_PRINT) . ';';
+        $aNominatimMapInit = array(
+            'zoom' => isset($_GET['zoom']) ? htmlspecialchars($_GET['zoom']) : CONST_Default_Zoom,
+            'lat'  => isset($_GET['lat']) ? htmlspecialchars($_GET['lat']) : CONST_Default_Lat,
+            'lon'  => isset($_GET['lon']) ? htmlspecialchars($_GET['lon']) : CONST_Default_Lon,
+            'tile_url' => $sTileURL,
+            'tile_attribution' => $sTileAttribution
+        );
+        echo 'var nominatim_map_init = ' . json_encode($aNominatimMapInit, JSON_PRETTY_PRINT) . ';';
 
-               echo 'var nominatim_results = ' . json_encode([$aPlace], JSON_PRETTY_PRINT) . ';'; 
-       ?>
-       </script>
-       <?php include(CONST_BasePath.'/lib/template/includes/html-footer.php'); ?>
+        echo 'var nominatim_results = ' . json_encode([$aPlace], JSON_PRETTY_PRINT) . ';'; 
+    ?>
+    </script>
+    <?php include(CONST_BasePath.'/lib/template/includes/html-footer.php'); ?>
 
 </body>
 </html>
index bf6c700bf580acaec788671cbf734a8167613db0..9cefe3ef15a6b6effab46118295f95d66c493f28 100644 (file)
@@ -1,55 +1,56 @@
 <?php
-       $aFilteredPlaces = array();
-
-       if (!sizeof($aPlace))
-       {
-               if (isset($sError))
-                       $aFilteredPlaces['error'] = $sError;
-               else
-                       $aFilteredPlaces['error'] = 'Unable to geocode';
-       }
-       else
-       {
-               if (isset($aPlace['place_id'])) $aFilteredPlaces['place_id'] = $aPlace['place_id'];
-               $aFilteredPlaces['licence'] = "Data © OpenStreetMap contributors, ODbL 1.0. http://www.openstreetmap.org/copyright";
-               $sOSMType = formatOSMType($aPlace['osm_type']);
-               if ($sOSMType)
-               {
-                       $aFilteredPlaces['osm_type'] = $sOSMType;
-                       $aFilteredPlaces['osm_id'] = $aPlace['osm_id'];
-               }
-               if (isset($aPlace['lat'])) $aFilteredPlaces['lat'] = $aPlace['lat'];
-               if (isset($aPlace['lon'])) $aFilteredPlaces['lon'] = $aPlace['lon'];
-               $aFilteredPlaces['display_name'] = $aPlace['langaddress'];
-               if (isset($aPlace['aAddress'])) $aFilteredPlaces['address'] = $aPlace['aAddress'];
-               if (isset($aPlace['sExtraTags'])) $aFilteredPlaces['extratags'] = $aPlace['sExtraTags'];
-               if (isset($aPlace['sNameDetails'])) $aFilteredPlaces['namedetails'] = $aPlace['sNameDetails'];
-
-               if (isset($aPlace['aBoundingBox']))
-               {
-                       $aFilteredPlaces['boundingbox'] = $aPlace['aBoundingBox'];
-               }
-
-               if (isset($aPlace['asgeojson']))
-               {
-                       $aFilteredPlaces['geojson'] = json_decode($aPlace['asgeojson']);
-               }
-
-               if (isset($aPlace['assvg']))
-               {
-                       $aFilteredPlaces['svg'] = $aPlace['assvg'];
-               }
-
-               if (isset($aPlace['astext']))
-               {
-                       $aFilteredPlaces['geotext'] = $aPlace['astext'];
-               }
-
-               if (isset($aPlace['askml']))
-               {
-                       $aFilteredPlaces['geokml'] = $aPlace['askml'];
-               }
-       }
-
-       javascript_renderData($aFilteredPlaces);
+
+$aFilteredPlaces = array();
+
+if (!sizeof($aPlace))
+{
+    if (isset($sError))
+        $aFilteredPlaces['error'] = $sError;
+    else
+        $aFilteredPlaces['error'] = 'Unable to geocode';
+}
+else
+{
+    if (isset($aPlace['place_id'])) $aFilteredPlaces['place_id'] = $aPlace['place_id'];
+    $aFilteredPlaces['licence'] = "Data © OpenStreetMap contributors, ODbL 1.0. http://www.openstreetmap.org/copyright";
+    $sOSMType = formatOSMType($aPlace['osm_type']);
+    if ($sOSMType)
+    {
+        $aFilteredPlaces['osm_type'] = $sOSMType;
+        $aFilteredPlaces['osm_id'] = $aPlace['osm_id'];
+    }
+    if (isset($aPlace['lat'])) $aFilteredPlaces['lat'] = $aPlace['lat'];
+    if (isset($aPlace['lon'])) $aFilteredPlaces['lon'] = $aPlace['lon'];
+    $aFilteredPlaces['display_name'] = $aPlace['langaddress'];
+    if (isset($aPlace['aAddress'])) $aFilteredPlaces['address'] = $aPlace['aAddress'];
+    if (isset($aPlace['sExtraTags'])) $aFilteredPlaces['extratags'] = $aPlace['sExtraTags'];
+    if (isset($aPlace['sNameDetails'])) $aFilteredPlaces['namedetails'] = $aPlace['sNameDetails'];
+
+    if (isset($aPlace['aBoundingBox']))
+    {
+        $aFilteredPlaces['boundingbox'] = $aPlace['aBoundingBox'];
+    }
+
+    if (isset($aPlace['asgeojson']))
+    {
+        $aFilteredPlaces['geojson'] = json_decode($aPlace['asgeojson']);
+    }
+
+    if (isset($aPlace['assvg']))
+    {
+        $aFilteredPlaces['svg'] = $aPlace['assvg'];
+    }
+
+    if (isset($aPlace['astext']))
+    {
+        $aFilteredPlaces['geotext'] = $aPlace['astext'];
+    }
+
+    if (isset($aPlace['askml']))
+    {
+        $aFilteredPlaces['geokml'] = $aPlace['askml'];
+    }
+}
+
+javascript_renderData($aFilteredPlaces);
 
index d62141769b89cc33ecc26e19fb6e03d585f95b74..b157ed56d5e75e9e5c27c0904f16170f1067be15 100644 (file)
@@ -1,67 +1,68 @@
 <?php
-       $aFilteredPlaces = array();
 
-       if (!sizeof($aPlace))
-       {
-               if (isset($sError))
-                       $aFilteredPlaces['error'] = $sError;
-               else
-                       $aFilteredPlaces['error'] = 'Unable to geocode';
-       }
-       else
-       {
-               if ($aPlace['place_id']) $aFilteredPlaces['place_id'] = $aPlace['place_id'];
-               $aFilteredPlaces['licence'] = "Data © OpenStreetMap contributors, ODbL 1.0. http://www.openstreetmap.org/copyright";
-               $sOSMType = formatOSMType($aPlace['osm_type']);
-               if ($sOSMType)
-               {
-                       $aFilteredPlaces['osm_type'] = $sOSMType;
-                       $aFilteredPlaces['osm_id'] = $aPlace['osm_id'];
-               }
-               if (isset($aPlace['lat'])) $aFilteredPlaces['lat'] = $aPlace['lat'];
-               if (isset($aPlace['lon'])) $aFilteredPlaces['lon'] = $aPlace['lon'];
+$aFilteredPlaces = array();
 
-               $aFilteredPlaces['place_rank'] = $aPlace['rank_search'];
+if (!sizeof($aPlace))
+{
+    if (isset($sError))
+        $aFilteredPlaces['error'] = $sError;
+    else
+        $aFilteredPlaces['error'] = 'Unable to geocode';
+}
+else
+{
+    if ($aPlace['place_id']) $aFilteredPlaces['place_id'] = $aPlace['place_id'];
+    $aFilteredPlaces['licence'] = "Data © OpenStreetMap contributors, ODbL 1.0. http://www.openstreetmap.org/copyright";
+    $sOSMType = formatOSMType($aPlace['osm_type']);
+    if ($sOSMType)
+    {
+        $aFilteredPlaces['osm_type'] = $sOSMType;
+        $aFilteredPlaces['osm_id'] = $aPlace['osm_id'];
+    }
+    if (isset($aPlace['lat'])) $aFilteredPlaces['lat'] = $aPlace['lat'];
+    if (isset($aPlace['lon'])) $aFilteredPlaces['lon'] = $aPlace['lon'];
 
-               $aFilteredPlaces['category'] = $aPlace['class'];
-               $aFilteredPlaces['type'] = $aPlace['type'];
+    $aFilteredPlaces['place_rank'] = $aPlace['rank_search'];
 
-               $aFilteredPlaces['importance'] = $aPlace['importance'];
+    $aFilteredPlaces['category'] = $aPlace['class'];
+    $aFilteredPlaces['type'] = $aPlace['type'];
 
-               $aFilteredPlaces['addresstype'] = strtolower($aPlace['addresstype']);
+    $aFilteredPlaces['importance'] = $aPlace['importance'];
 
-               $aFilteredPlaces['display_name'] = $aPlace['langaddress'];
-               $aFilteredPlaces['name'] = $aPlace['placename'];
+    $aFilteredPlaces['addresstype'] = strtolower($aPlace['addresstype']);
 
-               if (isset($aPlace['aAddress'])) $aFilteredPlaces['address'] = $aPlace['aAddress'];
-               if (isset($aPlace['sExtraTags'])) $aFilteredPlaces['extratags'] = $aPlace['sExtraTags'];
-               if (isset($aPlace['sNameDetails'])) $aFilteredPlaces['namedetails'] = $aPlace['sNameDetails'];
+    $aFilteredPlaces['display_name'] = $aPlace['langaddress'];
+    $aFilteredPlaces['name'] = $aPlace['placename'];
 
-               if (isset($aPlace['aBoundingBox']))
-               {
-                       $aFilteredPlaces['boundingbox'] = $aPlace['aBoundingBox'];
-               }
+    if (isset($aPlace['aAddress'])) $aFilteredPlaces['address'] = $aPlace['aAddress'];
+    if (isset($aPlace['sExtraTags'])) $aFilteredPlaces['extratags'] = $aPlace['sExtraTags'];
+    if (isset($aPlace['sNameDetails'])) $aFilteredPlaces['namedetails'] = $aPlace['sNameDetails'];
 
-               if (isset($aPlace['asgeojson']))
-               {
-                       $aFilteredPlaces['geojson'] = json_decode($aPlace['asgeojson']);
-               }
+    if (isset($aPlace['aBoundingBox']))
+    {
+        $aFilteredPlaces['boundingbox'] = $aPlace['aBoundingBox'];
+    }
 
-               if (isset($aPlace['assvg']))
-               {
-                       $aFilteredPlaces['svg'] = $aPlace['assvg'];
-               }
+    if (isset($aPlace['asgeojson']))
+    {
+        $aFilteredPlaces['geojson'] = json_decode($aPlace['asgeojson']);
+    }
 
-               if (isset($aPlace['astext']))
-               {
-                       $aFilteredPlaces['geotext'] = $aPlace['astext'];
-               }
+    if (isset($aPlace['assvg']))
+    {
+        $aFilteredPlaces['svg'] = $aPlace['assvg'];
+    }
 
-               if (isset($aPlace['askml']))
-               {
-                       $aFilteredPlaces['geokml'] = $aPlace['askml'];
-               }
+    if (isset($aPlace['astext']))
+    {
+        $aFilteredPlaces['geotext'] = $aPlace['astext'];
+    }
 
-       }
+    if (isset($aPlace['askml']))
+    {
+        $aFilteredPlaces['geokml'] = $aPlace['askml'];
+    }
 
-       javascript_renderData($aFilteredPlaces);
+}
+
+javascript_renderData($aFilteredPlaces);
index 2bfcffbf5ac0b3a3d8bb6b0e646e3139b5b90697..d3db2eddaeb04ac376e0535b1499587fc94c7470 100644 (file)
 <?php
-       header("content-type: text/xml; charset=UTF-8");
+header("content-type: text/xml; charset=UTF-8");
 
-       echo "<";
-       echo "?xml version=\"1.0\" encoding=\"UTF-8\" ?";
-       echo ">\n";
+echo "<";
+echo "?xml version=\"1.0\" encoding=\"UTF-8\" ?";
+echo ">\n";
 
-       echo "<reversegeocode";
-       echo " timestamp='".date(DATE_RFC822)."'";
-       echo " attribution='Data © OpenStreetMap contributors, ODbL 1.0. http://www.openstreetmap.org/copyright'";
-       echo " querystring='".htmlspecialchars($_SERVER['QUERY_STRING'], ENT_QUOTES)."'";
-       echo ">\n";
+echo "<reversegeocode";
+echo " timestamp='".date(DATE_RFC822)."'";
+echo " attribution='Data © OpenStreetMap contributors, ODbL 1.0. http://www.openstreetmap.org/copyright'";
+echo " querystring='".htmlspecialchars($_SERVER['QUERY_STRING'], ENT_QUOTES)."'";
+echo ">\n";
 
-       if (!sizeof($aPlace))
-       {
-               if (isset($sError))
-                       echo "<error>$sError</error>";
-               else
-                       echo "<error>Unable to geocode</error>";
-       }
-       else
-       {
-               echo "<result";
-               if ($aPlace['place_id']) echo ' place_id="'.$aPlace['place_id'].'"';
-               $sOSMType = formatOSMType($aPlace['osm_type']);
-               if ($sOSMType) echo ' osm_type="'.$sOSMType.'"'.' osm_id="'.$aPlace['osm_id'].'"';
-               if ($aPlace['ref']) echo ' ref="'.htmlspecialchars($aPlace['ref']).'"';
-               if (isset($aPlace['lat'])) echo ' lat="'.htmlspecialchars($aPlace['lat']).'"';
-               if (isset($aPlace['lon'])) echo ' lon="'.htmlspecialchars($aPlace['lon']).'"';
-               if (isset($aPlace['aBoundingBox']))
-               {
-                       echo ' boundingbox="';
-                       echo join(',', $aPlace['aBoundingBox']);
-                       echo '"';
-               }
+if (!sizeof($aPlace))
+{
+    if (isset($sError))
+        echo "<error>$sError</error>";
+    else
+        echo "<error>Unable to geocode</error>";
+}
+else
+{
+    echo "<result";
+    if ($aPlace['place_id']) echo ' place_id="'.$aPlace['place_id'].'"';
+    $sOSMType = formatOSMType($aPlace['osm_type']);
+    if ($sOSMType) echo ' osm_type="'.$sOSMType.'"'.' osm_id="'.$aPlace['osm_id'].'"';
+    if ($aPlace['ref']) echo ' ref="'.htmlspecialchars($aPlace['ref']).'"';
+    if (isset($aPlace['lat'])) echo ' lat="'.htmlspecialchars($aPlace['lat']).'"';
+    if (isset($aPlace['lon'])) echo ' lon="'.htmlspecialchars($aPlace['lon']).'"';
+    if (isset($aPlace['aBoundingBox']))
+    {
+        echo ' boundingbox="';
+        echo join(',', $aPlace['aBoundingBox']);
+        echo '"';
+    }
 
-               if (isset($aPlace['asgeojson']))
-               {
-                       echo ' geojson=\'';
-                       echo $aPlace['asgeojson'];
-                       echo '\'';
-               }
+    if (isset($aPlace['asgeojson']))
+    {
+        echo ' geojson=\'';
+        echo $aPlace['asgeojson'];
+        echo '\'';
+    }
 
-               if (isset($aPlace['assvg']))
-               {
-                       echo ' geosvg=\'';
-                       echo $aPlace['assvg'];
-                       echo '\'';
-               }
+    if (isset($aPlace['assvg']))
+    {
+        echo ' geosvg=\'';
+        echo $aPlace['assvg'];
+        echo '\'';
+    }
 
-               if (isset($aPlace['astext']))
-               {
-                       echo ' geotext=\'';
-                       echo $aPlace['astext'];
-                       echo '\'';
-               }
-               echo ">".htmlspecialchars($aPlace['langaddress'])."</result>";
+    if (isset($aPlace['astext']))
+    {
+        echo ' geotext=\'';
+        echo $aPlace['astext'];
+        echo '\'';
+    }
+    echo ">".htmlspecialchars($aPlace['langaddress'])."</result>";
 
-               if (isset($aPlace['aAddress']))
-               {
-                       echo "<addressparts>";
-                       foreach($aPlace['aAddress'] as $sKey => $sValue)
-                       {
-                               $sKey = str_replace(' ','_',$sKey);
-                               echo "<$sKey>";
-                               echo htmlspecialchars($sValue);
-                               echo "</$sKey>";
-                       }
-                       echo "</addressparts>";
-               }
+    if (isset($aPlace['aAddress']))
+    {
+        echo "<addressparts>";
+        foreach($aPlace['aAddress'] as $sKey => $sValue)
+        {
+            $sKey = str_replace(' ','_',$sKey);
+            echo "<$sKey>";
+            echo htmlspecialchars($sValue);
+            echo "</$sKey>";
+        }
+        echo "</addressparts>";
+    }
 
-               if (isset($aPlace['sExtraTags']))
-               {
-                       echo "<extratags>";
-                       foreach ($aPlace['sExtraTags'] as $sKey => $sValue)
-                       {
-                               echo '<tag key="'.htmlspecialchars($sKey).'" value="'.htmlspecialchars($sValue).'"/>';
-                       }
-                       echo "</extratags>";
-               }
+    if (isset($aPlace['sExtraTags']))
+    {
+        echo "<extratags>";
+        foreach ($aPlace['sExtraTags'] as $sKey => $sValue)
+        {
+            echo '<tag key="'.htmlspecialchars($sKey).'" value="'.htmlspecialchars($sValue).'"/>';
+        }
+        echo "</extratags>";
+    }
 
-               if (isset($aPlace['sNameDetails']))
-               {
-                       echo "<namedetails>";
-                       foreach ($aPlace['sNameDetails'] as $sKey => $sValue)
-                       {
-                               echo '<name desc="'.htmlspecialchars($sKey).'">';
-                               echo htmlspecialchars($sValue);
-                               echo "</name>";
-                       }
-                       echo "</namedetails>";
-               }
+    if (isset($aPlace['sNameDetails']))
+    {
+        echo "<namedetails>";
+        foreach ($aPlace['sNameDetails'] as $sKey => $sValue)
+        {
+            echo '<name desc="'.htmlspecialchars($sKey).'">';
+            echo htmlspecialchars($sValue);
+            echo "</name>";
+        }
+        echo "</namedetails>";
+    }
 
-               if (isset($aPlace['askml']))
-               {
-                       echo "\n<geokml>";
-                       echo $aPlace['askml'];
-                       echo "</geokml>";
-               }
+    if (isset($aPlace['askml']))
+    {
+        echo "\n<geokml>";
+        echo $aPlace['askml'];
+        echo "</geokml>";
+    }
 
-       }
+}
 
-       echo "</reversegeocode>";
+echo "</reversegeocode>";
index bc00f84d6e97d88639722850bfd68ce5e561fa17..0f5ae26db9217cdb53706f07133843c61168a33e 100644 (file)
 <?php
-       header("content-type: text/html; charset=UTF-8");
+    header("content-type: text/html; charset=UTF-8");
 ?>
 <?php include(CONST_BasePath.'/lib/template/includes/html-header.php'); ?>
-       <link href="css/common.css" rel="stylesheet" type="text/css" />
-       <link href="css/details.css" rel="stylesheet" type="text/css" />
+    <link href="css/common.css" rel="stylesheet" type="text/css" />
+    <link href="css/details.css" rel="stylesheet" type="text/css" />
 </head>
 
 
 <?php
 
-       function osmMapUrl($aFeature)
-       {
-               if (isset($sFeature['error_x']) && isset($sFeature['error_y']))
-               {
-                       $sBaseUrl = '//www.openstreetmap.org/';
-                       $sOSMType = formatOSMType($aFeature['osm_type'], false);
-                       if ($sOSMType)
-                       {
-                               $sBaseUrl += $sOSMType.'/'.$aFeature['osm_id'];
-                       }
-
-                       return '<a href="'.$sBaseUrl.'?mlat='.$aFeature['error_y'].'&mlon='.$aFeature['error_x'].'">view on osm.org</a>';
-               }
-               return '';
-       }
-
-       function josm_edit_url($aFeature)
-       {
-               $fWidth = 0.0002;
-               $sLon = $aFeature['error_x'];
-               $sLat = $aFeature['error_y'];
-
-               if (isset($sLat))
-               {
-                       return "http://localhost:8111/load_and_zoom?left=".($sLon-$fWidth)."&right=".($sLon+$fWidth)."&top=".($sLat+$fWidth)."&bottom=".($sLat-$fWidth);
-               }
-
-               $sOSMType = formatOSMType($aFeature['osm_type'], false);
-               if ($sOSMType)
-               {
-                       return 'http://localhost:8111/import?url=http://www.openstreetmap.org/api/0.6/'.$sOSMType.'/'.$aFeature['osm_id'].'/full';
-                       // Should be better to load by object id - but this doesn't seem to zoom correctly
-                       // return " <a href=\"http://localhost:8111/load_object?new_layer=true&objects=".strtolower($aFeature['osm_type']).$sOSMID."\" target=\"josm\">Remote Control (JOSM / Merkaartor)</a>";
-               }
-               return '';
-       }
-
-       function potlach_edit_url($aFeature)
-       {
-               $fWidth = 0.0002;
-               $sLat = $aFeature['error_y'];
-               $sLon = $aFeature['error_x'];
-
-               if (isset($sLat))
-               {
-                       return "//www.openstreetmap.org/edit?editor=potlatch2&bbox=".($sLon-$fWidth).",".($sLat-$fWidth).",".($sLon+$fWidth).",".($sLat+$fWidth);
-               }
-               return '';
-       }
+    function osmMapUrl($aFeature)
+    {
+        if (isset($sFeature['error_x']) && isset($sFeature['error_y']))
+        {
+            $sBaseUrl = '//www.openstreetmap.org/';
+            $sOSMType = formatOSMType($aFeature['osm_type'], false);
+            if ($sOSMType)
+            {
+                $sBaseUrl += $sOSMType.'/'.$aFeature['osm_id'];
+            }
+
+            return '<a href="'.$sBaseUrl.'?mlat='.$aFeature['error_y'].'&mlon='.$aFeature['error_x'].'">view on osm.org</a>';
+        }
+        return '';
+    }
+
+    function josm_edit_url($aFeature)
+    {
+        $fWidth = 0.0002;
+        $sLon = $aFeature['error_x'];
+        $sLat = $aFeature['error_y'];
+
+        if (isset($sLat))
+        {
+            return "http://localhost:8111/load_and_zoom?left=".($sLon-$fWidth)."&right=".($sLon+$fWidth)."&top=".($sLat+$fWidth)."&bottom=".($sLat-$fWidth);
+        }
+
+        $sOSMType = formatOSMType($aFeature['osm_type'], false);
+        if ($sOSMType)
+        {
+            return 'http://localhost:8111/import?url=http://www.openstreetmap.org/api/0.6/'.$sOSMType.'/'.$aFeature['osm_id'].'/full';
+            // Should be better to load by object id - but this doesn't seem to zoom correctly
+            // return " <a href=\"http://localhost:8111/load_object?new_layer=true&objects=".strtolower($aFeature['osm_type']).$sOSMID."\" target=\"josm\">Remote Control (JOSM / Merkaartor)</a>";
+        }
+        return '';
+    }
+
+    function potlach_edit_url($aFeature)
+    {
+        $fWidth = 0.0002;
+        $sLat = $aFeature['error_y'];
+        $sLon = $aFeature['error_x'];
+
+        if (isset($sLat))
+        {
+            return "//www.openstreetmap.org/edit?editor=potlatch2&bbox=".($sLon-$fWidth).",".($sLat-$fWidth).",".($sLon+$fWidth).",".($sLat+$fWidth);
+        }
+        return '';
+    }
 
 
 
 ?>
 
 <body id="details-page">
-       <div class="container">
-               <div class="row">
-                       <div class="col-md-6">
+    <div class="container">
+        <div class="row">
+            <div class="col-md-6">
 
 
-                               <h1><?php echo $aPointDetails['localname'] ?></h1>
-                               <div class="locationdetails">
-                                       <h2 class="bg-danger">This object has an invalid geometry.</h2>
+                <h1><?php echo $aPointDetails['localname'] ?></h1>
+                <div class="locationdetails">
+                    <h2 class="bg-danger">This object has an invalid geometry.</h2>
 
-                                       <div>
-                                               Type: <span class="type"><?php echo $aPointDetails['class'].':'.$aPointDetails['type'];?></span>
-                                       </div>
+                    <div>
+                        Type: <span class="type"><?php echo $aPointDetails['class'].':'.$aPointDetails['type'];?></span>
+                    </div>
 
-                                       <div>
-                                               OSM: <span class="label"><?php echo osmLink($aPointDetails); ?><span>
-                                       </div>
+                    <div>
+                        OSM: <span class="label"><?php echo osmLink($aPointDetails); ?><span>
+                    </div>
 
 
-                                       <h4>Error</h4>
-                                       <p>
-                                               <?php echo $aPointDetails['errormessage']?$aPointDetails['errormessage']:'unknown'; ?>
-                                       </p>
-                                       <?php echo osmMapUrl($aPointDetails); ?>
+                    <h4>Error</h4>
+                    <p>
+                        <?php echo $aPointDetails['errormessage']?$aPointDetails['errormessage']:'unknown'; ?>
+                    </p>
+                    <?php echo osmMapUrl($aPointDetails); ?>
 
-                                       <h4>Edit</h4>
-                                       <ul>
-                                       <?php if (josm_edit_url($aPointDetails)) { ?>
-                                                       <li><a href="<?php echo josm_edit_url($aPointDetails); ?>" target="josm">Remote Control (JOSM / Merkaartor)</a></li>
-                                       <?php } ?>
-                                       <?php if (potlach_edit_url($aPointDetails)) { ?>
-                                                       <li><a href="<?php echo potlach_edit_url($aPointDetails); ?>" target="potlatch2">Potlatch 2</a></li>
-                                       <?php } ?>
-                                       </ul>
-                       </div>
-               </div>
-               <div class="col-md-6">
-                       <div id="map"></div>
-               </div>
+                    <h4>Edit</h4>
+                    <ul>
+                    <?php if (josm_edit_url($aPointDetails)) { ?>
+                            <li><a href="<?php echo josm_edit_url($aPointDetails); ?>" target="josm">Remote Control (JOSM / Merkaartor)</a></li>
+                    <?php } ?>
+                    <?php if (potlach_edit_url($aPointDetails)) { ?>
+                            <li><a href="<?php echo potlach_edit_url($aPointDetails); ?>" target="potlatch2">Potlatch 2</a></li>
+                    <?php } ?>
+                    </ul>
+            </div>
+        </div>
+        <div class="col-md-6">
+            <div id="map"></div>
+        </div>
 
-       </div>
+    </div>
 
 
-       <script type="text/javascript">
+    <script type="text/javascript">
 
-               var nominatim_result = {
-                       outlinestring: '<?php echo $aPointDetails['outlinestring'];?>',
-                       lon: <?php echo isset($aPointDetails['error_x']) ? $aPointDetails['error_x'] : 0; ?>,
-                       lat: <?php echo isset($aPointDetails['error_y']) ? $aPointDetails['error_y'] : 0; ?>
-               };
+        var nominatim_result = {
+            outlinestring: '<?php echo $aPointDetails['outlinestring'];?>',
+            lon: <?php echo isset($aPointDetails['error_x']) ? $aPointDetails['error_x'] : 0; ?>,
+            lat: <?php echo isset($aPointDetails['error_y']) ? $aPointDetails['error_y'] : 0; ?>
+        };
 
-       </script>
+    </script>
 
 
-       <?php include(CONST_BasePath.'/lib/template/includes/html-footer.php'); ?>
-       </body>
+    <?php include(CONST_BasePath.'/lib/template/includes/html-footer.php'); ?>
+    </body>
 </html>
index 71fcc7b3e0a0aa67c61151ce496e2c5dd02bba10..a1334740e3fffeb9a0042b33255c15cf3d61683c 100644 (file)
 <?php
-       header("content-type: text/html; charset=UTF-8");
+    header("content-type: text/html; charset=UTF-8");
 ?>
 <?php include(CONST_BasePath.'/lib/template/includes/html-header.php'); ?>
-       <link href="css/common.css" rel="stylesheet" type="text/css" />
-       <link href="css/details.css" rel="stylesheet" type="text/css" />
+    <link href="css/common.css" rel="stylesheet" type="text/css" />
+    <link href="css/details.css" rel="stylesheet" type="text/css" />
 </head>
 
 
 <?php
 
-       function headline($sTitle)
-       {
-               echo "<tr class='all-columns'><td colspan='6'><h2>".$sTitle."</h2></td></tr>\n";
-       }
-
-       function headline3($sTitle)
-       {
-               echo "<tr class='all-columns'><td colspan='6'><h3>".$sTitle."</h3></td></tr>\n";
-       }
-
-
-       function format_distance($fDistance)
-       {
-               // $fDistance is in meters
-               if ($fDistance < 1)
-               {
-                       return '0';
-               }
-               elseif ($fDistance < 1000)
-               {
-                       return'<abbr class="distance" title="'.$fDistance.'">~'.(round($fDistance,0)).' m</abbr>';
-               }
-               else
-               {
-                       return'<abbr class="distance" title="'.$fDistance.'">~'.(round($fDistance/1000,1)).' km</abbr>';
-               }
-       }
-
-       function kv($sKey,$sValue)
-       {
-               echo ' <tr><td>' . $sKey . '</td><td>'.$sValue.'</td></tr>'. "\n";
-       }
-
-
-       function hash_to_subtable($aAssociatedList)
-       {
-               $sHTML = '';
-               foreach($aAssociatedList as $sKey => $sValue)
-               {
-                       $sHTML = $sHTML.' <div class="line"><span class="name">'.$sValue.'</span> ('.$sKey.')</div>'."\n";
-               }
-               return $sHTML;
-       }
-
-       function map_icon($sIcon)
-       {
-               if ($sIcon){
-                       echo '<img id="mapicon" src="'.CONST_Website_BaseURL.'images/mapicons/'.$sIcon.'.n.32.png'.'" alt="'.$sIcon.'" />';
-               }
-       }
-
-
-       function _one_row($aAddressLine){
-               $bNotUsed = (isset($aAddressLine['isaddress']) && $aAddressLine['isaddress'] == 'f');
-
-               echo '<tr class="' . ($bNotUsed?'notused':'') . '">'."\n";
-               echo '  <td class="name">'.(trim($aAddressLine['localname'])?$aAddressLine['localname']:'<span class="noname">No Name</span>')."</td>\n";
-               echo '  <td>' . $aAddressLine['class'].':'.$aAddressLine['type'] . "</td>\n";
-               echo '  <td>' . osmLink($aAddressLine) . "</td>\n";
-               echo '  <td>' . (isset($aAddressLine['admin_level']) ? $aAddressLine['admin_level'] : '') . "</td>\n";
-               echo '  <td>' . format_distance($aAddressLine['distance'])."</td>\n";
-               echo '  <td>' . detailsLink($aAddressLine,'details &gt;') . "</td>\n";
-               echo "</tr>\n";
-       }
-
-       function _one_keyword_row($keyword_token,$word_id){
-               echo "<tr>\n";
-               echo '<td>';
-               // mark partial tokens (those starting with a space) with a star for readability
-               echo ($keyword_token[0]==' '?'*':'');
-               echo $keyword_token;
-               if (isset($word_id))
-               {
-                       echo '</td><td>word id: '.$word_id;
-               }
-               echo "</td></tr>\n";
-       }
+    function headline($sTitle)
+    {
+        echo "<tr class='all-columns'><td colspan='6'><h2>".$sTitle."</h2></td></tr>\n";
+    }
+
+    function headline3($sTitle)
+    {
+        echo "<tr class='all-columns'><td colspan='6'><h3>".$sTitle."</h3></td></tr>\n";
+    }
+
+
+    function format_distance($fDistance)
+    {
+        // $fDistance is in meters
+        if ($fDistance < 1)
+        {
+            return '0';
+        }
+        elseif ($fDistance < 1000)
+        {
+            return'<abbr class="distance" title="'.$fDistance.'">~'.(round($fDistance,0)).' m</abbr>';
+        }
+        else
+        {
+            return'<abbr class="distance" title="'.$fDistance.'">~'.(round($fDistance/1000,1)).' km</abbr>';
+        }
+    }
+
+    function kv($sKey,$sValue)
+    {
+        echo ' <tr><td>' . $sKey . '</td><td>'.$sValue.'</td></tr>'. "\n";
+    }
+
+
+    function hash_to_subtable($aAssociatedList)
+    {
+        $sHTML = '';
+        foreach($aAssociatedList as $sKey => $sValue)
+        {
+            $sHTML = $sHTML.' <div class="line"><span class="name">'.$sValue.'</span> ('.$sKey.')</div>'."\n";
+        }
+        return $sHTML;
+    }
+
+    function map_icon($sIcon)
+    {
+        if ($sIcon){
+            echo '<img id="mapicon" src="'.CONST_Website_BaseURL.'images/mapicons/'.$sIcon.'.n.32.png'.'" alt="'.$sIcon.'" />';
+        }
+    }
+
+
+    function _one_row($aAddressLine){
+        $bNotUsed = (isset($aAddressLine['isaddress']) && $aAddressLine['isaddress'] == 'f');
+
+        echo '<tr class="' . ($bNotUsed?'notused':'') . '">'."\n";
+        echo '  <td class="name">'.(trim($aAddressLine['localname'])?$aAddressLine['localname']:'<span class="noname">No Name</span>')."</td>\n";
+        echo '  <td>' . $aAddressLine['class'].':'.$aAddressLine['type'] . "</td>\n";
+        echo '  <td>' . osmLink($aAddressLine) . "</td>\n";
+        echo '  <td>' . (isset($aAddressLine['admin_level']) ? $aAddressLine['admin_level'] : '') . "</td>\n";
+        echo '  <td>' . format_distance($aAddressLine['distance'])."</td>\n";
+        echo '  <td>' . detailsLink($aAddressLine,'details &gt;') . "</td>\n";
+        echo "</tr>\n";
+    }
+
+    function _one_keyword_row($keyword_token,$word_id){
+        echo "<tr>\n";
+        echo '<td>';
+        // mark partial tokens (those starting with a space) with a star for readability
+        echo ($keyword_token[0]==' '?'*':'');
+        echo $keyword_token;
+        if (isset($word_id))
+        {
+            echo '</td><td>word id: '.$word_id;
+        }
+        echo "</td></tr>\n";
+    }
 
 ?>
 
 
 
 <body id="details-page">
-       <?php include(CONST_BasePath.'/lib/template/includes/html-top-navigation.php'); ?>
-       <div class="container">
-               <div class="row">
-                       <div class="col-sm-10">
-                               <h1><?php echo $aPointDetails['localname'] ?></h1>
-                       </div>
-                       <div class="col-sm-2 text-right">
-                               <?php map_icon($aPointDetails['icon']) ?>
-                       </div>
-               </div>
-               <div class="row">
-                       <div class="col-md-6">
-                               <table id="locationdetails" class="table table-striped">
-
-                               <?php
-
-                                       kv('Name'            , hash_to_subtable($aPointDetails['aNames']) );
-                                       kv('Type'            , $aPointDetails['class'].':'.$aPointDetails['type'] );
-                                       kv('Last Updated'    , $aPointDetails['indexed_date'] );
-                                       kv('Admin Level'     , $aPointDetails['admin_level'] );
-                                       kv('Rank'            , $aPointDetails['rank_search_label'] );
-                                       if ($aPointDetails['calculated_importance']) {
-                                               kv('Importance'    , $aPointDetails['calculated_importance'].($aPointDetails['importance']?'':' (estimated)') );
-                                       }
-                                       kv('Coverage'        , ($aPointDetails['isarea']=='t'?'Polygon':'Point') );
-                                       kv('Centre Point'    , $aPointDetails['lat'].','.$aPointDetails['lon'] );
-                                       kv('OSM'             , osmLink($aPointDetails) );
-                                       if ($aPointDetails['wikipedia'])
-                                       {
-                                               kv('Wikipedia Calculated' , wikipediaLink($aPointDetails) );
-                                       }
-
-                                       kv('Extra Tags'      , hash_to_subtable($aPointDetails['aExtraTags']) );
-
-                               ?>
-
-                               </table>
-                       </div>
-
-                       <div class="col-md-6">
-                               <div id="map"></div>
-                       </div>
-
-               </div>
-               <div class="row">
-                       <div class="col-md-12">
-
-                       <h2>Address</h2>
-
-                       <table id="address" class="table table-striped table-responsive">
-                               <thead>
-                                       <tr>
-                                         <td>Local name</td>
-                                         <td>Type</td>
-                                         <td>OSM</td>
-                                         <td>Admin level</td>
-                                         <td>Distance</td>
-                                         <td></td>
-                                       </tr>
-                               </thead>
-                               <tbody>
-
-                               <?php
-
-                                       foreach($aAddressLines as $aAddressLine)
-                                       {       
-                                               _one_row($aAddressLine);
-                                       }
-                               ?>
-       
+    <?php include(CONST_BasePath.'/lib/template/includes/html-top-navigation.php'); ?>
+    <div class="container">
+        <div class="row">
+            <div class="col-sm-10">
+                <h1><?php echo $aPointDetails['localname'] ?></h1>
+            </div>
+            <div class="col-sm-2 text-right">
+                <?php map_icon($aPointDetails['icon']) ?>
+            </div>
+        </div>
+        <div class="row">
+            <div class="col-md-6">
+                <table id="locationdetails" class="table table-striped">
+
+                <?php
+
+                    kv('Name'            , hash_to_subtable($aPointDetails['aNames']) );
+                    kv('Type'            , $aPointDetails['class'].':'.$aPointDetails['type'] );
+                    kv('Last Updated'    , $aPointDetails['indexed_date'] );
+                    kv('Admin Level'     , $aPointDetails['admin_level'] );
+                    kv('Rank'            , $aPointDetails['rank_search_label'] );
+                    if ($aPointDetails['calculated_importance']) {
+                        kv('Importance'    , $aPointDetails['calculated_importance'].($aPointDetails['importance']?'':' (estimated)') );
+                    }
+                    kv('Coverage'        , ($aPointDetails['isarea']=='t'?'Polygon':'Point') );
+                    kv('Centre Point'    , $aPointDetails['lat'].','.$aPointDetails['lon'] );
+                    kv('OSM'             , osmLink($aPointDetails) );
+                    if ($aPointDetails['wikipedia'])
+                    {
+                        kv('Wikipedia Calculated' , wikipediaLink($aPointDetails) );
+                    }
+
+                    kv('Extra Tags'      , hash_to_subtable($aPointDetails['aExtraTags']) );
+
+                ?>
+
+                </table>
+            </div>
+
+            <div class="col-md-6">
+                <div id="map"></div>
+            </div>
+
+        </div>
+        <div class="row">
+            <div class="col-md-12">
+
+            <h2>Address</h2>
+
+            <table id="address" class="table table-striped table-responsive">
+                <thead>
+                    <tr>
+                      <td>Local name</td>
+                      <td>Type</td>
+                      <td>OSM</td>
+                      <td>Admin level</td>
+                      <td>Distance</td>
+                      <td></td>
+                    </tr>
+                </thead>
+                <tbody>
+
+                <?php
+
+                    foreach($aAddressLines as $aAddressLine)
+                    {   
+                        _one_row($aAddressLine);
+                    }
+                ?>
+    
 
 
 <?php
 
-       if ($aLinkedLines)
-       {
-               headline('Linked Places');
-               foreach($aLinkedLines as $aAddressLine)
-               {       
-                       _one_row($aAddressLine);
-               }
-       }
-
-
-
-       if ($aPlaceSearchNameKeywords)
-       {
-               headline('Name Keywords');
-               foreach($aPlaceSearchNameKeywords as $aRow)
-               {
-                       _one_keyword_row($aRow['word_token'], $aRow['word_id']);
-               }
-       }
-
-       if ($aPlaceSearchAddressKeywords)
-       {
-               headline('Address Keywords');
-               foreach($aPlaceSearchAddressKeywords as $aRow)
-               {
-                       _one_keyword_row($aRow['word_token'], $aRow['word_id']);
-               }
-       }
-       
-       if (sizeof($aParentOfLines))
-       {
-               headline('Parent Of');
-
-               $aGroupedAddressLines = array();
-               foreach($aParentOfLines as $aAddressLine)
-               {
-                       if ($aAddressLine['type'] == 'yes') $sType = $aAddressLine['class'];
-                       else $sType = $aAddressLine['type'];
-
-                       if (!isset($aGroupedAddressLines[$sType]))
-                               $aGroupedAddressLines[$sType] = array();
-                       $aGroupedAddressLines[$sType][] = $aAddressLine;
-               }
-               foreach($aGroupedAddressLines as $sGroupHeading => $aParentOfLines)
-               {
-                       $sGroupHeading = ucwords($sGroupHeading);
-                       headline3($sGroupHeading);
-
-                       foreach($aParentOfLines as $aAddressLine)
-                       {
-                               _one_row($aAddressLine);
-                       }
-               }
-               if (sizeof($aParentOfLines) >= 500) {
-                       echo '<p>There are more child objects which are not shown.</p>';
-               }
-       }
-
-       echo "</table>\n";
+    if ($aLinkedLines)
+    {
+        headline('Linked Places');
+        foreach($aLinkedLines as $aAddressLine)
+        {   
+            _one_row($aAddressLine);
+        }
+    }
+
+
+
+    if ($aPlaceSearchNameKeywords)
+    {
+        headline('Name Keywords');
+        foreach($aPlaceSearchNameKeywords as $aRow)
+        {
+            _one_keyword_row($aRow['word_token'], $aRow['word_id']);
+        }
+    }
+
+    if ($aPlaceSearchAddressKeywords)
+    {
+        headline('Address Keywords');
+        foreach($aPlaceSearchAddressKeywords as $aRow)
+        {
+            _one_keyword_row($aRow['word_token'], $aRow['word_id']);
+        }
+    }
+    
+    if (sizeof($aParentOfLines))
+    {
+        headline('Parent Of');
+
+        $aGroupedAddressLines = array();
+        foreach($aParentOfLines as $aAddressLine)
+        {
+            if ($aAddressLine['type'] == 'yes') $sType = $aAddressLine['class'];
+            else $sType = $aAddressLine['type'];
+
+            if (!isset($aGroupedAddressLines[$sType]))
+                $aGroupedAddressLines[$sType] = array();
+            $aGroupedAddressLines[$sType][] = $aAddressLine;
+        }
+        foreach($aGroupedAddressLines as $sGroupHeading => $aParentOfLines)
+        {
+            $sGroupHeading = ucwords($sGroupHeading);
+            headline3($sGroupHeading);
+
+            foreach($aParentOfLines as $aAddressLine)
+            {
+                _one_row($aAddressLine);
+            }
+        }
+        if (sizeof($aParentOfLines) >= 500) {
+            echo '<p>There are more child objects which are not shown.</p>';
+        }
+    }
+
+    echo "</table>\n";
 ?>
 
-                       </div>
-               </div>
-       </div>
+            </div>
+        </div>
+    </div>
 
-       <script type="text/javascript">
-       <?php
+    <script type="text/javascript">
+    <?php
 
-               $aNominatimMapInit = array(
-                 'tile_url' => $sTileURL,
-                 'tile_attribution' => $sTileAttribution
-               );
-               echo 'var nominatim_map_init = ' . json_encode($aNominatimMapInit, JSON_PRETTY_PRINT) . ';';
+        $aNominatimMapInit = array(
+          'tile_url' => $sTileURL,
+          'tile_attribution' => $sTileAttribution
+        );
+        echo 'var nominatim_map_init = ' . json_encode($aNominatimMapInit, JSON_PRETTY_PRINT) . ';';
 
-               $aPlace = array(
-                               'outlinestring' => $aPointDetails['outlinestring'],
-                               'lon' => $aPointDetails['lon'],
-                               'lat' => $aPointDetails['lat'],
-               );
-               echo 'var nominatim_result = ' . json_encode($aPlace, JSON_PRETTY_PRINT) . ';'; 
+        $aPlace = array(
+                'outlinestring' => $aPointDetails['outlinestring'],
+                'lon' => $aPointDetails['lon'],
+                'lat' => $aPointDetails['lat'],
+        );
+        echo 'var nominatim_result = ' . json_encode($aPlace, JSON_PRETTY_PRINT) . ';'; 
 
 
-       ?>
-       </script>
+    ?>
+    </script>
 
 
 
-       <?php include(CONST_BasePath.'/lib/template/includes/html-footer.php'); ?>
+    <?php include(CONST_BasePath.'/lib/template/includes/html-footer.php'); ?>
 </body>
 </html>
index 3d73b1e47cf81166131939b227f2a8766319d8d3..a38e45dd2e85fa233f60a438b6d95ff24e84f90f 100644 (file)
@@ -1,10 +1,10 @@
 <footer>
-       <p class="disclaimer">
-               Addresses and postcodes are approximate
-       </p>
-       <p class="copyright">
-               &copy; <a href="http://osm.org/copyright">OpenStreetMap</a> contributors
-       </p>
+    <p class="disclaimer">
+        Addresses and postcodes are approximate
+    </p>
+    <p class="copyright">
+        &copy; <a href="http://osm.org/copyright">OpenStreetMap</a> contributors
+    </p>
 </footer>
 
 <script src="js/jquery.min.js"></script>
index 0832bff3a3a7ba3f8a2abb4daccbaa5d165cd2f5..405efd7f8439ce1a5f6f1a78abf867adf6dd7700 100644 (file)
@@ -1,11 +1,11 @@
 <!DOCTYPE html>
 <html lang="en">
 <head>
-       <title>OpenStreetMap Nominatim: Search</title>
-       <meta name="viewport" content="width=device-width, initial-scale=1">
+    <title>OpenStreetMap Nominatim: Search</title>
+    <meta name="viewport" content="width=device-width, initial-scale=1">
 
-       <base href="<?php echo CONST_Website_BaseURL;?>" />
-       <link href="nominatim.xml" rel="search" title="Nominatim Search" type="application/opensearchdescription+xml" />
-       <link href="css/leaflet.css" rel="stylesheet" />
-       <link href="css/bootstrap-theme.min.css" rel="stylesheet" />
-       <link href="css/bootstrap.min.css" rel="stylesheet" />
+    <base href="<?php echo CONST_Website_BaseURL;?>" />
+    <link href="nominatim.xml" rel="search" title="Nominatim Search" type="application/opensearchdescription+xml" />
+    <link href="css/leaflet.css" rel="stylesheet" />
+    <link href="css/bootstrap-theme.min.css" rel="stylesheet" />
+    <link href="css/bootstrap.min.css" rel="stylesheet" />
index d72fcb7c1c91d1cee1625f8730a299e134ce6ac6..2f539cdb8a5573787a25086e96bfd44638ec8f7f 100644 (file)
@@ -1,49 +1,49 @@
-       <header class="container-fluid">
-               <div class="row">
-                       <div class="col-xs-4">
-                               <div class="brand">
-                                       <a href="<?php echo CONST_Website_BaseURL;?>">
-                                       <img alt="logo" src="images/osm_logo.120px.png" width="30" height="30"/>
-                                       <h1>Nominatim</h1>
-                                       </a>
-                               </div>
-                       </div>
-                       <div id="last-updated" class="col-xs-4 text-center">
-                               <?php if (isset($sDataDate)){ ?>
-                                       Data last updated:
-                                       <br>
-                                       <?php echo $sDataDate; ?>
-                               <?php } ?>
-                       </div>
-                       <div class="col-xs-4 text-right">
-                               <div class="btn-group">
-                                       <button class="dropdown-toggle btn btn-sm btn-default" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">
-                                               About &amp; Help <span class="caret"></span>
-                                       </button>
-                                       <ul class="dropdown-menu dropdown-menu-right">
-                                               <li><a href="http://wiki.openstreetmap.org/wiki/Nominatim" target="_blank">Documentation</a></li>
-                                               <li><a href="http://wiki.openstreetmap.org/wiki/Nominatim/FAQ" target="_blank">FAQ</a></li>
-                                               <li role="separator" class="divider"></li>
-                                               <li><a href="#" class="" data-toggle="modal" data-target="#report-modal">Report problem with results</a></li>
-                                       </ul>
-                               </div>
-                       </div>
-               </div>
-       </header>
+<header class="container-fluid">
+    <div class="row">
+        <div class="col-xs-4">
+            <div class="brand">
+                <a href="<?php echo CONST_Website_BaseURL;?>">
+                <img alt="logo" src="images/osm_logo.120px.png" width="30" height="30"/>
+                <h1>Nominatim</h1>
+                </a>
+            </div>
+        </div>
+        <div id="last-updated" class="col-xs-4 text-center">
+            <?php if (isset($sDataDate)){ ?>
+                Data last updated:
+                <br>
+                <?php echo $sDataDate; ?>
+            <?php } ?>
+        </div>
+        <div class="col-xs-4 text-right">
+            <div class="btn-group">
+                <button class="dropdown-toggle btn btn-sm btn-default" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">
+                    About &amp; Help <span class="caret"></span>
+                </button>
+                <ul class="dropdown-menu dropdown-menu-right">
+                    <li><a href="http://wiki.openstreetmap.org/wiki/Nominatim" target="_blank">Documentation</a></li>
+                    <li><a href="http://wiki.openstreetmap.org/wiki/Nominatim/FAQ" target="_blank">FAQ</a></li>
+                    <li role="separator" class="divider"></li>
+                    <li><a href="#" class="" data-toggle="modal" data-target="#report-modal">Report problem with results</a></li>
+                </ul>
+            </div>
+        </div>
+    </div>
+</header>
 
-       <div class="modal fade" id="report-modal">
-               <div class="modal-dialog">
-                       <div class="modal-content">
-                               <div class="modal-header">
-                                       <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
-                                       <h4 class="modal-title">Report a problem</h4>
-                               </div>
-                               <div class="modal-body">
-                                       <?php include(CONST_BasePath.'/lib/template/includes/report-errors.php'); ?>
-                               </div>
-                               <div class="modal-footer">
-                                       <button type="button" class="btn btn-default" data-dismiss="modal">OK</button>
-                               </div>
-                       </div>
-               </div>
-       </div>
+<div class="modal fade" id="report-modal">
+    <div class="modal-dialog">
+        <div class="modal-content">
+            <div class="modal-header">
+                <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
+                <h4 class="modal-title">Report a problem</h4>
+            </div>
+            <div class="modal-body">
+                <?php include(CONST_BasePath.'/lib/template/includes/report-errors.php'); ?>
+            </div>
+            <div class="modal-footer">
+                <button type="button" class="btn btn-default" data-dismiss="modal">OK</button>
+            </div>
+        </div>
+    </div>
+</div>
index f6b04e7e9a9236d6d4aa29fe358cf9b14aac49a1..a6a9be62a1afadac5e778ed586fc6bbcbd2d0877 100644 (file)
@@ -1,24 +1,24 @@
 <p>
-       Before reporting problems please read the <a target="_blank" href="http://wiki.openstreetmap.org/wiki/Nominatim">user documentation</a>
-       and
-       <a target="_blank" href="http://wiki.openstreetmap.org/wiki/Nominatim/FAQ">FAQ</a>.
+    Before reporting problems please read the <a target="_blank" href="http://wiki.openstreetmap.org/wiki/Nominatim">user documentation</a>
+    and
+    <a target="_blank" href="http://wiki.openstreetmap.org/wiki/Nominatim/FAQ">FAQ</a>.
 
-       If your problem relates to the address of a particular search result please use the 'details' link 
-       to check how the address was generated before reporting a problem.
+    If your problem relates to the address of a particular search result please use the 'details' link 
+    to check how the address was generated before reporting a problem.
 </p>
 <p>
-       Use <a target="_blank" href="https://github.com/twain47/nominatim/issues">Nominatim issues on github</a>
-       to report problems.
-<!--   You can search for existing bug reports
-       <a href="http://trac.openstreetmap.org/query?status=new&amp;status=assigned&amp;status=reopened&amp;component=nominatim&amp;order=priority">here</a>.</p>
+    Use <a target="_blank" href="https://github.com/twain47/nominatim/issues">Nominatim issues on github</a>
+    to report problems.
+<!-- You can search for existing bug reports
+    <a href="http://trac.openstreetmap.org/query?status=new&amp;status=assigned&amp;status=reopened&amp;component=nominatim&amp;order=priority">here</a>.</p>
  -->
 </p>
 <p>
-       Please ensure that you include a full description of the problem, including the search
-       query that you used, the problem with the result and, if the problem relates to missing data,
-       the osm type (node, way, relation) and id of the item that is missing.
+    Please ensure that you include a full description of the problem, including the search
+    query that you used, the problem with the result and, if the problem relates to missing data,
+    the osm type (node, way, relation) and id of the item that is missing.
 </p>
 <p>
-       Problems that contain enough detail are likely to get looked at before ones that require
-       significant research.
+    Problems that contain enough detail are likely to get looked at before ones that require
+    significant research.
 </p>
index 60d380418d6f74e86f665173d16a112fe3600b2b..9fa83e2a22c854bb965dc43a2b2a69f7894861f3 100644 (file)
@@ -1,88 +1,88 @@
 <?php
 
-       $aOutput = array();
-       $aOutput['licence'] = "Data © OpenStreetMap contributors, ODbL 1.0. http://www.openstreetmap.org/copyright";
-       $aOutput['batch'] = array();
-
-       foreach($aBatchResults as $aSearchResults)
-       {
-               if (!$aSearchResults) $aSearchResults = array();
-               $aFilteredPlaces = array();
-               foreach($aSearchResults as $iResNum => $aPointDetails)
-               {
-                       $aPlace = array(
-                                               'place_id'=>$aPointDetails['place_id'],
-                                       );
-
-                       $sOSMType = formatOSMType($aPointDetails['osm_type']);
-                       if ($sOSMType)
-                       {
-                               $aPlace['osm_type'] = $sOSMType;
-                               $aPlace['osm_id'] = $aPointDetails['osm_id'];
-                       }
-
-                       if (isset($aPointDetails['aBoundingBox']))
-                       {
-                               $aPlace['boundingbox'] = array(
-                                       $aPointDetails['aBoundingBox'][0],
-                                       $aPointDetails['aBoundingBox'][1],
-                                       $aPointDetails['aBoundingBox'][2],
-                                       $aPointDetails['aBoundingBox'][3]);
-
-                               if (isset($aPointDetails['aPolyPoints']) && $bShowPolygons)
-                               {
-                                       $aPlace['polygonpoints'] = $aPointDetails['aPolyPoints'];
-                               }
-                       }
-
-                       if (isset($aPointDetails['zoom']))
-                       {
-                               $aPlace['zoom'] = $aPointDetails['zoom'];
-                       }
-
-                       $aPlace['lat'] = $aPointDetails['lat'];
-                       $aPlace['lon'] = $aPointDetails['lon'];
-                       $aPlace['display_name'] = $aPointDetails['name'];
-                       $aPlace['place_rank'] = $aPointDetails['rank_search'];
-
-                       $aPlace['category'] = $aPointDetails['class'];
-                       $aPlace['type'] = $aPointDetails['type'];
-
-                       $aPlace['importance'] = $aPointDetails['importance'];
-
-                       if (isset($aPointDetails['icon']))
-                       {
-                               $aPlace['icon'] = $aPointDetails['icon'];
-                       }
-
-                       if (isset($aPointDetails['address']) && sizeof($aPointDetails['address'])>0)
-                       {
-                               $aPlace['address'] = $aPointDetails['address'];
-                       }
-
-                       if (isset($aPointDetails['asgeojson']))
-                       {
-                               $aPlace['geojson'] = json_decode($aPointDetails['asgeojson']);
-                       }
-
-                       if (isset($aPointDetails['assvg']))
-                       {
-                               $aPlace['svg'] = $aPointDetails['assvg'];
-                       }
-
-                       if (isset($aPointDetails['astext']))
-                       {
-                               $aPlace['geotext'] = $aPointDetails['astext'];
-                       }
-
-                       if (isset($aPointDetails['askml']))
-                       {
-                               $aPlace['geokml'] = $aPointDetails['askml'];
-                       }
-
-                       $aFilteredPlaces[] = $aPlace;
-               }
-               $aOutput['batch'][] = $aFilteredPlaces;
-       }
-
-       javascript_renderData($aOutput, array('geojson'));
+$aOutput = array();
+$aOutput['licence'] = "Data © OpenStreetMap contributors, ODbL 1.0. http://www.openstreetmap.org/copyright";
+$aOutput['batch'] = array();
+
+foreach($aBatchResults as $aSearchResults)
+{
+    if (!$aSearchResults) $aSearchResults = array();
+    $aFilteredPlaces = array();
+    foreach($aSearchResults as $iResNum => $aPointDetails)
+    {
+        $aPlace = array(
+                    'place_id'=>$aPointDetails['place_id'],
+                );
+
+        $sOSMType = formatOSMType($aPointDetails['osm_type']);
+        if ($sOSMType)
+        {
+            $aPlace['osm_type'] = $sOSMType;
+            $aPlace['osm_id'] = $aPointDetails['osm_id'];
+        }
+
+        if (isset($aPointDetails['aBoundingBox']))
+        {
+            $aPlace['boundingbox'] = array(
+                $aPointDetails['aBoundingBox'][0],
+                $aPointDetails['aBoundingBox'][1],
+                $aPointDetails['aBoundingBox'][2],
+                $aPointDetails['aBoundingBox'][3]);
+
+            if (isset($aPointDetails['aPolyPoints']) && $bShowPolygons)
+            {
+                $aPlace['polygonpoints'] = $aPointDetails['aPolyPoints'];
+            }
+        }
+
+        if (isset($aPointDetails['zoom']))
+        {
+            $aPlace['zoom'] = $aPointDetails['zoom'];
+        }
+
+        $aPlace['lat'] = $aPointDetails['lat'];
+        $aPlace['lon'] = $aPointDetails['lon'];
+        $aPlace['display_name'] = $aPointDetails['name'];
+        $aPlace['place_rank'] = $aPointDetails['rank_search'];
+
+        $aPlace['category'] = $aPointDetails['class'];
+        $aPlace['type'] = $aPointDetails['type'];
+
+        $aPlace['importance'] = $aPointDetails['importance'];
+
+        if (isset($aPointDetails['icon']))
+        {
+            $aPlace['icon'] = $aPointDetails['icon'];
+        }
+
+        if (isset($aPointDetails['address']) && sizeof($aPointDetails['address'])>0)
+        {
+            $aPlace['address'] = $aPointDetails['address'];
+        }
+
+        if (isset($aPointDetails['asgeojson']))
+        {
+            $aPlace['geojson'] = json_decode($aPointDetails['asgeojson']);
+        }
+
+        if (isset($aPointDetails['assvg']))
+        {
+            $aPlace['svg'] = $aPointDetails['assvg'];
+        }
+
+        if (isset($aPointDetails['astext']))
+        {
+            $aPlace['geotext'] = $aPointDetails['astext'];
+        }
+
+        if (isset($aPointDetails['askml']))
+        {
+            $aPlace['geokml'] = $aPointDetails['askml'];
+        }
+
+        $aFilteredPlaces[] = $aPlace;
+    }
+    $aOutput['batch'][] = $aFilteredPlaces;
+}
+
+javascript_renderData($aOutput, array('geojson'));
index dc4dcc748929f00cbb4110d57f2d42e87ce633d7..02c338cd8cfe334a18018c4308b8ea195da9b0f2 100644 (file)
@@ -1,91 +1,92 @@
 <?php
-       header("content-type: text/html; charset=UTF-8");
+    header("content-type: text/html; charset=UTF-8");
 ?>
 <?php include(CONST_BasePath.'/lib/template/includes/html-header.php'); ?>
-       <link href="css/common.css" rel="stylesheet" type="text/css" />
-       <link href="css/search.css" rel="stylesheet" type="text/css" />
+    <link href="css/common.css" rel="stylesheet" type="text/css" />
+    <link href="css/search.css" rel="stylesheet" type="text/css" />
 </head>
 
 <body id="search-page">
 
-       <?php include(CONST_BasePath.'/lib/template/includes/html-top-navigation.php'); ?>
-
-       <form class="form-inline" role="search" accept-charset="UTF-8" action="<?php echo CONST_Website_BaseURL; ?>search.php">
-               <div class="form-group">
-                       <input id="q" name="q" type="text" class="form-control input-sm" placeholder="Search" value="<?php echo htmlspecialchars($sQuery); ?>" >
-               </div>
-               <div class="form-group search-button-group">
-                       <button type="submit" class="btn btn-primary btn-sm">Search</button>
-                       <?php if (CONST_Search_AreaPolygons) { ?>
-                               <!-- <input type="checkbox" value="1" name="polygon" <?php if ($bAsText) echo "checked='checked'"; ?>/> Highlight -->
-                               <input type="hidden" value="1" name="polygon" />
-                       <?php } ?>
-                       <input type="hidden" name="viewbox" value="<?php echo $sViewBox; ?>" />
-                       <div class="checkbox-inline">
-                               <label>
-                                       <input type="checkbox" id="use_viewbox" <?php if ($sViewBox) echo "checked='checked'"; ?>>
-                                       apply viewbox
-                               </label>
-                       </div>
-               </div>
-               <div class="search-type-link">
-                       <a href="<?php echo CONST_Website_BaseURL; ?>reverse.php?format=html">reverse search</a>
-               </div>
-       </form>
-
-
-       <div id="content">
+    <?php include(CONST_BasePath.'/lib/template/includes/html-top-navigation.php'); ?>
+
+    <form class="form-inline" role="search" accept-charset="UTF-8" action="<?php echo CONST_Website_BaseURL; ?>search.php">
+        <div class="form-group">
+            <input id="q" name="q" type="text" class="form-control input-sm" placeholder="Search" value="<?php echo htmlspecialchars($sQuery); ?>" >
+        </div>
+        <div class="form-group search-button-group">
+            <button type="submit" class="btn btn-primary btn-sm">Search</button>
+            <?php if (CONST_Search_AreaPolygons) { ?>
+                <!-- <input type="checkbox" value="1" name="polygon" <?php if ($bAsText) echo "checked='checked'"; ?>/> Highlight -->
+                <input type="hidden" value="1" name="polygon" />
+            <?php } ?>
+            <input type="hidden" name="viewbox" value="<?php echo $sViewBox; ?>" />
+            <div class="checkbox-inline">
+                <input type="checkbox" id="use_viewbox" <?php if ($sViewBox) echo "checked='checked'"; ?>>
+                <label for="use_viewbox">apply viewbox</label>
+            </div>
+        </div>
+        <div class="search-type-link">
+            <a href="<?php echo CONST_Website_BaseURL; ?>reverse.php?format=html">reverse search</a>
+        </div>
+    </form>
+
+
+    <div id="content">
 
 <?php if ($sQuery) { ?>
 
-               <div id="searchresults" class="sidebar">
-               <?php
-                       $i = 0;
-                       foreach($aSearchResults as $iResNum => $aResult)
-                       {
-
-                               echo '<div class="result" data-position=' . $i . '>';
-
-                               echo (isset($aResult['icon'])?'<img alt="icon" src="'.$aResult['icon'].'"/>':'');
-                               echo ' <span class="name">'.htmlspecialchars($aResult['name']).'</span>';
-                               // echo ' <span class="latlon">'.round($aResult['lat'],3).','.round($aResult['lon'],3).'</span>';
-                               // echo ' <span class="place_id">'.$aResult['place_id'].'</span>';
-                               if (isset($aResult['label']))
-                                       echo ' <span class="type">('.$aResult['label'].')</span>';
-                               else if ($aResult['type'] == 'yes')
-                                       echo ' <span class="type">('.ucwords(str_replace('_',' ',$aResult['class'])).')</span>';
-                               else
-                                       echo ' <span class="type">('.ucwords(str_replace('_',' ',$aResult['type'])).')</span>';
-                               echo ' <a class="btn btn-default btn-xs details" href="details.php?place_id='.$aResult['place_id'].'">details</a>';
-                               echo '</div>';
-                               $i = $i+1;
-                       }
-                       if (sizeof($aSearchResults) && $sMoreURL)
-                       {
-                               echo '<div class="more"><a class="btn btn-primary" href="'.htmlentities($sMoreURL).'">Search for more results</a></div>';
-                       }
-                       else
-                       {
-                               echo '<div class="noresults">No search results found</div>';
-                       }
-
-               ?>
-               </div>
+        <div id="searchresults" class="sidebar">
+        <?php
+            $i = 0;
+            foreach($aSearchResults as $iResNum => $aResult)
+            {
+
+                echo '<div class="result" data-position=' . $i . '>';
+
+                echo (isset($aResult['icon'])?'<img alt="icon" src="'.$aResult['icon'].'"/>':'');
+                echo ' <span class="name">'.htmlspecialchars($aResult['name']).'</span>';
+                // echo ' <span class="latlon">'.round($aResult['lat'],3).','.round($aResult['lon'],3).'</span>';
+                // echo ' <span class="place_id">'.$aResult['place_id'].'</span>';
+                if (isset($aResult['label']))
+                    echo ' <span class="type">('.$aResult['label'].')</span>';
+                else if ($aResult['type'] == 'yes')
+                    echo ' <span class="type">('.ucwords(str_replace('_',' ',$aResult['class'])).')</span>';
+                else
+                    echo ' <span class="type">('.ucwords(str_replace('_',' ',$aResult['type'])).')</span>';
+                echo ' <a class="btn btn-default btn-xs details" href="details.php?place_id='.$aResult['place_id'].'">details</a>';
+                echo '</div>';
+                $i = $i+1;
+            }
+            if (sizeof($aSearchResults) && $sMoreURL)
+            {
+                echo '<div class="more"><a class="btn btn-primary" href="'.htmlentities($sMoreURL).'">Search for more results</a></div>';
+            }
+            else
+            {
+                echo '<div class="noresults">No search results found</div>';
+            }
+
+        ?>
+        </div>
 
 <?php } else { ?>
 
-               <div id="intro" class="sidebar">
-                       <?php include(CONST_BasePath.'/lib/template/includes/introduction.php'); ?>
-               </div>
+        <div id="intro" class="sidebar">
+            <?php include(CONST_BasePath.'/lib/template/includes/introduction.php'); ?>
+        </div>
 
 <?php } ?>
 
-               <div id="map-wrapper">
-                       <div id="map-position"></div>
-                       <div id="map"></div>
-               </div>
+        <div id="map-wrapper">
+            <div id="map-position">
+                <div id="map-position-inner"></div>
+                <div id="map-position-close"><a href="#">hide</a></div>
+            </div>
+            <div id="map"></div>
+        </div>
 
-       </div> <!-- /content -->
+    </div> <!-- /content -->
 
 
 
 
 
 
-       <script type="text/javascript">
-       <?php
+    <script type="text/javascript">
+    <?php
 
-               $aNominatimMapInit = array(
-                       'zoom' => CONST_Default_Zoom,
-                       'lat' => CONST_Default_Lat,
-                       'lon' => CONST_Default_Lon,
-                       'tile_url' => CONST_Map_Tile_URL,
-                       'tile_attribution' => CONST_Map_Tile_Attribution
-               );
-               echo 'var nominatim_map_init = ' . json_encode($aNominatimMapInit, JSON_PRETTY_PRINT) . ';';
+        $aNominatimMapInit = array(
+            'zoom' => CONST_Default_Zoom,
+            'lat' => CONST_Default_Lat,
+            'lon' => CONST_Default_Lon,
+            'tile_url' => CONST_Map_Tile_URL,
+            'tile_attribution' => CONST_Map_Tile_Attribution
+        );
+        echo 'var nominatim_map_init = ' . json_encode($aNominatimMapInit, JSON_PRETTY_PRINT) . ';';
 
-               echo 'var nominatim_results = ' . json_encode($aSearchResults, JSON_PRETTY_PRINT) . ';'; 
-       ?>
-       </script>
-       <?php include(CONST_BasePath.'/lib/template/includes/html-footer.php'); ?>
+        echo 'var nominatim_results = ' . json_encode($aSearchResults, JSON_PRETTY_PRINT) . ';'; 
+    ?>
+    </script>
+    <?php include(CONST_BasePath.'/lib/template/includes/html-footer.php'); ?>
 
 </body>
 </html>
index d3dc00f3b505b497eb90f404d770f9ce2e2d0f56..ee2b4bd280b99e0d6df1dd9e45ee27226dde9202 100644 (file)
@@ -1,79 +1,79 @@
 <?php
-       header("content-type: application/json; charset=UTF-8");
-
-       $aFilteredPlaces = array();
-       foreach($aSearchResults as $iResNum => $aPointDetails)
-       {
-               $aPlace = array(
-                               'place_id'=>$aPointDetails['place_id'],
-                               'licence'=>"Data © OpenStreetMap contributors, ODbL 1.0. http://www.openstreetmap.org/copyright",
-                       );
-        
-               $sOSMType = formatOSMType($aPointDetails['osm_type']);
-               if ($sOSMType)
-               {
-                       $aPlace['osm_type'] = $sOSMType;
-                       $aPlace['osm_id'] = $aPointDetails['osm_id'];
-               }
-
-               if (isset($aPointDetails['aBoundingBox']))
-               {
-                       $aPlace['boundingbox'] = $aPointDetails['aBoundingBox'];
-
-                       if (isset($aPointDetails['aPolyPoints']) && $bShowPolygons)
-                       {
-                               $aPlace['polygonpoints'] = $aPointDetails['aPolyPoints'];
-                       }
-               }
-
-               if (isset($aPointDetails['zoom']))
-               {
-                       $aPlace['zoom'] = $aPointDetails['zoom'];
-               }
-
-               $aPlace['lat'] = $aPointDetails['lat'];
-               $aPlace['lon'] = $aPointDetails['lon'];
-               $aPlace['display_name'] = $aPointDetails['name'];
-
-               $aPlace['class'] = $aPointDetails['class'];
-               $aPlace['type'] = $aPointDetails['type'];
-
-               $aPlace['importance'] = $aPointDetails['importance'];
-
-               if (isset($aPointDetails['icon']) && $aPointDetails['icon'])
-               {
-                       $aPlace['icon'] = $aPointDetails['icon'];
-               }
-
-               if (isset($aPointDetails['address']))
-               {
-                       $aPlace['address'] = $aPointDetails['address'];
-               }
-
-               if (isset($aPointDetails['asgeojson']))
-               {
-                       $aPlace['geojson'] = json_decode($aPointDetails['asgeojson']);
-               }
-
-               if (isset($aPointDetails['assvg']))
-               {
-                       $aPlace['svg'] = $aPointDetails['assvg'];
-               }
-
-               if (isset($aPointDetails['astext']))
-               {
-                       $aPlace['geotext'] = $aPointDetails['astext'];
-               }
-
-               if (isset($aPointDetails['askml']))
-               {
-                       $aPlace['geokml'] = $aPointDetails['askml'];
-               }
-
-               if (isset($aPointDetails['sExtraTags'])) $aPlace['extratags'] = $aPointDetails['sExtraTags'];
-               if (isset($aPointDetails['sNameDetails'])) $aPlace['namedetails'] = $aPointDetails['sNameDetails'];
-
-               $aFilteredPlaces[] = $aPlace;
-       }
-
-       javascript_renderData($aFilteredPlaces);
+header("content-type: application/json; charset=UTF-8");
+
+$aFilteredPlaces = array();
+foreach($aSearchResults as $iResNum => $aPointDetails)
+{
+    $aPlace = array(
+            'place_id'=>$aPointDetails['place_id'],
+            'licence'=>"Data © OpenStreetMap contributors, ODbL 1.0. http://www.openstreetmap.org/copyright",
+        );
+    
+    $sOSMType = formatOSMType($aPointDetails['osm_type']);
+    if ($sOSMType)
+    {
+        $aPlace['osm_type'] = $sOSMType;
+        $aPlace['osm_id'] = $aPointDetails['osm_id'];
+    }
+
+    if (isset($aPointDetails['aBoundingBox']))
+    {
+        $aPlace['boundingbox'] = $aPointDetails['aBoundingBox'];
+
+        if (isset($aPointDetails['aPolyPoints']) && $bShowPolygons)
+        {
+            $aPlace['polygonpoints'] = $aPointDetails['aPolyPoints'];
+        }
+    }
+
+    if (isset($aPointDetails['zoom']))
+    {
+        $aPlace['zoom'] = $aPointDetails['zoom'];
+    }
+
+    $aPlace['lat'] = $aPointDetails['lat'];
+    $aPlace['lon'] = $aPointDetails['lon'];
+    $aPlace['display_name'] = $aPointDetails['name'];
+
+    $aPlace['class'] = $aPointDetails['class'];
+    $aPlace['type'] = $aPointDetails['type'];
+
+    $aPlace['importance'] = $aPointDetails['importance'];
+
+    if (isset($aPointDetails['icon']) && $aPointDetails['icon'])
+    {
+        $aPlace['icon'] = $aPointDetails['icon'];
+    }
+
+    if (isset($aPointDetails['address']))
+    {
+        $aPlace['address'] = $aPointDetails['address'];
+    }
+
+    if (isset($aPointDetails['asgeojson']))
+    {
+        $aPlace['geojson'] = json_decode($aPointDetails['asgeojson']);
+    }
+
+    if (isset($aPointDetails['assvg']))
+    {
+        $aPlace['svg'] = $aPointDetails['assvg'];
+    }
+
+    if (isset($aPointDetails['astext']))
+    {
+        $aPlace['geotext'] = $aPointDetails['astext'];
+    }
+
+    if (isset($aPointDetails['askml']))
+    {
+        $aPlace['geokml'] = $aPointDetails['askml'];
+    }
+
+    if (isset($aPointDetails['sExtraTags'])) $aPlace['extratags'] = $aPointDetails['sExtraTags'];
+    if (isset($aPointDetails['sNameDetails'])) $aPlace['namedetails'] = $aPointDetails['sNameDetails'];
+
+    $aFilteredPlaces[] = $aPlace;
+}
+
+javascript_renderData($aFilteredPlaces);
index e907a081f206750ac1a7e37de321c796c9de9af8..35538797184808477ae7b96d9f33e7a69bac66bd 100644 (file)
@@ -1,78 +1,79 @@
 <?php
-       $aFilteredPlaces = array();
-       foreach($aSearchResults as $iResNum => $aPointDetails)
-       {
-               $aPlace = array(
-                               'place_id'=>$aPointDetails['place_id'],
-                               'licence'=>"Data © OpenStreetMap contributors, ODbL 1.0. http://www.openstreetmap.org/copyright",
-                       );
-
-               $sOSMType = formatOSMType($aPointDetails['osm_type']);
-               if ($sOSMType)
-               {
-                       $aPlace['osm_type'] = $sOSMType;
-                       $aPlace['osm_id'] = $aPointDetails['osm_id'];
-               }
-
-               if (isset($aPointDetails['aBoundingBox']))
-               {
-                       $aPlace['boundingbox'] = $aPointDetails['aBoundingBox'];
-
-                       if (isset($aPointDetails['aPolyPoints']) && $bShowPolygons)
-                       {
-                               $aPlace['polygonpoints'] = $aPointDetails['aPolyPoints'];
-                       }
-               }
-
-               if (isset($aPointDetails['zoom']))
-               {
-                       $aPlace['zoom'] = $aPointDetails['zoom'];
-               }
-
-               $aPlace['lat'] = $aPointDetails['lat'];
-               $aPlace['lon'] = $aPointDetails['lon'];
-               $aPlace['display_name'] = $aPointDetails['name'];
-               $aPlace['place_rank'] = $aPointDetails['rank_search'];
-
-               $aPlace['category'] = $aPointDetails['class'];
-               $aPlace['type'] = $aPointDetails['type'];
-
-               $aPlace['importance'] = $aPointDetails['importance'];
-
-               if (isset($aPointDetails['icon']))
-               {
-                       $aPlace['icon'] = $aPointDetails['icon'];
-               }
-
-               if (isset($aPointDetails['address']) && sizeof($aPointDetails['address'])>0)
-               {
-                       $aPlace['address'] = $aPointDetails['address'];
-               }
-
-               if (isset($aPointDetails['asgeojson']))
-               {
-                       $aPlace['geojson'] = json_decode($aPointDetails['asgeojson']);
-               }
-
-               if (isset($aPointDetails['assvg']))
-               {
-                       $aPlace['svg'] = $aPointDetails['assvg'];
-               }
-
-               if (isset($aPointDetails['astext']))
-               {
-                       $aPlace['geotext'] = $aPointDetails['astext'];
-               }
-
-               if (isset($aPointDetails['askml']))
-               {
-                       $aPlace['geokml'] = $aPointDetails['askml'];
-               }
-
-               if (isset($aPointDetails['sExtraTags'])) $aPlace['extratags'] = $aPointDetails['sExtraTags'];
-               if (isset($aPointDetails['sNameDetails'])) $aPlace['namedetails'] = $aPointDetails['sNameDetails'];
-
-               $aFilteredPlaces[] = $aPlace;
-       }
-
-       javascript_renderData($aFilteredPlaces);
+
+$aFilteredPlaces = array();
+foreach($aSearchResults as $iResNum => $aPointDetails)
+{
+    $aPlace = array(
+            'place_id'=>$aPointDetails['place_id'],
+            'licence'=>"Data © OpenStreetMap contributors, ODbL 1.0. http://www.openstreetmap.org/copyright",
+        );
+
+    $sOSMType = formatOSMType($aPointDetails['osm_type']);
+    if ($sOSMType)
+    {
+        $aPlace['osm_type'] = $sOSMType;
+        $aPlace['osm_id'] = $aPointDetails['osm_id'];
+    }
+
+    if (isset($aPointDetails['aBoundingBox']))
+    {
+        $aPlace['boundingbox'] = $aPointDetails['aBoundingBox'];
+
+        if (isset($aPointDetails['aPolyPoints']) && $bShowPolygons)
+        {
+            $aPlace['polygonpoints'] = $aPointDetails['aPolyPoints'];
+        }
+    }
+
+    if (isset($aPointDetails['zoom']))
+    {
+        $aPlace['zoom'] = $aPointDetails['zoom'];
+    }
+
+    $aPlace['lat'] = $aPointDetails['lat'];
+    $aPlace['lon'] = $aPointDetails['lon'];
+    $aPlace['display_name'] = $aPointDetails['name'];
+    $aPlace['place_rank'] = $aPointDetails['rank_search'];
+
+    $aPlace['category'] = $aPointDetails['class'];
+    $aPlace['type'] = $aPointDetails['type'];
+
+    $aPlace['importance'] = $aPointDetails['importance'];
+
+    if (isset($aPointDetails['icon']))
+    {
+        $aPlace['icon'] = $aPointDetails['icon'];
+    }
+
+    if (isset($aPointDetails['address']) && sizeof($aPointDetails['address'])>0)
+    {
+        $aPlace['address'] = $aPointDetails['address'];
+    }
+
+    if (isset($aPointDetails['asgeojson']))
+    {
+        $aPlace['geojson'] = json_decode($aPointDetails['asgeojson']);
+    }
+
+    if (isset($aPointDetails['assvg']))
+    {
+        $aPlace['svg'] = $aPointDetails['assvg'];
+    }
+
+    if (isset($aPointDetails['astext']))
+    {
+        $aPlace['geotext'] = $aPointDetails['astext'];
+    }
+
+    if (isset($aPointDetails['askml']))
+    {
+        $aPlace['geokml'] = $aPointDetails['askml'];
+    }
+
+    if (isset($aPointDetails['sExtraTags'])) $aPlace['extratags'] = $aPointDetails['sExtraTags'];
+    if (isset($aPointDetails['sNameDetails'])) $aPlace['namedetails'] = $aPointDetails['sNameDetails'];
+
+    $aFilteredPlaces[] = $aPlace;
+}
+
+javascript_renderData($aFilteredPlaces);
index 7a5c997fddd1b35b222871b7cd160fdca161c0e3..80091b0aeedecc123c4ab0e3d4f7c2a2bacd7aed 100644 (file)
 <?php
-       header("content-type: text/xml; charset=UTF-8");
-
-       echo "<";
-       echo "?xml version=\"1.0\" encoding=\"UTF-8\" ?";
-       echo ">\n";
-
-       echo "<";
-       echo (isset($sXmlRootTag)?$sXmlRootTag:'searchresults');
-       echo " timestamp='".date(DATE_RFC822)."'";
-       echo " attribution='Data © OpenStreetMap contributors, ODbL 1.0. http://www.openstreetmap.org/copyright'";
-       echo " querystring='".htmlspecialchars($sQuery, ENT_QUOTES)."'";
-       if ($sViewBox) echo " viewbox='".htmlspecialchars($sViewBox, ENT_QUOTES)."'";
-       echo " polygon='".($bShowPolygons?'true':'false')."'";
-       if (sizeof($aExcludePlaceIDs))
-       {
-               echo " exclude_place_ids='".htmlspecialchars(join(',',$aExcludePlaceIDs))."'";
-       }
-       if ($sMoreURL)
-       {
-               echo " more_url='".htmlspecialchars($sMoreURL)."'";
-       }
-       echo ">\n";
-
-       foreach($aSearchResults as $iResNum => $aResult)
-       {
-               echo "<place place_id='".$aResult['place_id']."'";
-               $sOSMType = formatOSMType($aResult['osm_type']);
-               if ($sOSMType)
-               {
-                       echo " osm_type='$sOSMType'";
-                       echo " osm_id='".$aResult['osm_id']."'";
-               }
-               echo " place_rank='".$aResult['rank_search']."'";
-
-               if (isset($aResult['aBoundingBox']))
-               {
-                       echo ' boundingbox="';
-                       echo join(',',$aResult['aBoundingBox']);
-                       echo '"';
-
-                       if ($bShowPolygons && isset($aResult['aPolyPoints']))
-                       {
-                               echo ' polygonpoints=\'';
-                               echo json_encode($aResult['aPolyPoints']);
-                               echo '\'';
-                       }
-               }
-
-               if (isset($aResult['asgeojson']))
-               {
-                       echo ' geojson=\'';
-                       echo $aResult['asgeojson'];
-                       echo '\'';
-               }
-
-               if (isset($aResult['assvg']))
-               {
-                       echo ' geosvg=\'';
-                       echo $aResult['assvg'];
-                       echo '\'';
-               }
-
-               if (isset($aResult['astext']))
-               {
-                       echo ' geotext=\'';
-                       echo $aResult['astext'];
-                       echo '\'';
-               }
-
-               if (isset($aResult['zoom']))
-               {
-                       echo " zoom='".$aResult['zoom']."'";
-               }
-
-               echo " lat='".$aResult['lat']."'";
-               echo " lon='".$aResult['lon']."'";
-               echo " display_name='".htmlspecialchars($aResult['name'], ENT_QUOTES)."'";
-
-               echo " class='".htmlspecialchars($aResult['class'])."'";
-               echo " type='".htmlspecialchars($aResult['type'], ENT_QUOTES)."'";
-               echo " importance='".htmlspecialchars($aResult['importance'])."'";
-               if (isset($aResult['icon']) && $aResult['icon'])
-               {
-                       echo " icon='".htmlspecialchars($aResult['icon'], ENT_QUOTES)."'";
-               }
-
-               $bHasDelim = false;
-
-               if (isset($aResult['askml']))
-               {
-                       if (!$bHasDelim)
-                       {
-                               $bHasDelim = true;
-                               echo ">";
-                       }
-                       echo "\n<geokml>";
-                       echo $aResult['askml'];
-                       echo "</geokml>";
-               }
-
-               if (isset($aResult['sExtraTags']))
-               {
-                       if (!$bHasDelim)
-                       {
-                               $bHasDelim = true;
-                               echo ">";
-                       }
-                       echo "\n<extratags>";
-                       foreach ($aResult['sExtraTags'] as $sKey => $sValue)
-                       {
-                               echo '<tag key="'.htmlspecialchars($sKey).'" value="'.htmlspecialchars($sValue).'"/>';
-                       }
-                       echo "</extratags>";
-               }
-
-               if (isset($aResult['sNameDetails']))
-               {
-                       if (!$bHasDelim)
-                       {
-                               $bHasDelim = true;
-                               echo ">";
-                       }
-                       echo "\n<namedetails>";
-                       foreach ($aResult['sNameDetails'] as $sKey => $sValue)
-                       {
-                               echo '<name desc="'.htmlspecialchars($sKey).'">';
-                               echo htmlspecialchars($sValue);
-                               echo "</name>";
-                       }
-                       echo "</namedetails>";
-               }
-
-               if (isset($aResult['address']))
-               {
-                       if (!$bHasDelim)
-                       {
-                               $bHasDelim = true;
-                               echo ">";
-                       }
-                       echo "\n";
-                       foreach($aResult['address'] as $sKey => $sValue)
-                       {
-                               $sKey = str_replace(' ','_',$sKey);
-                               echo "<$sKey>";
-                               echo htmlspecialchars($sValue);
-                               echo "</$sKey>";
-                       }
-               }
-
-               if ($bHasDelim)
-               {
-                       echo "</place>";
-               }
-               else
-               {
-                       echo "/>";
-               }
-       }
-       
-       echo "</" . (isset($sXmlRootTag)?$sXmlRootTag:'searchresults') . ">";
+header("content-type: text/xml; charset=UTF-8");
+
+echo "<";
+echo "?xml version=\"1.0\" encoding=\"UTF-8\" ?";
+echo ">\n";
+
+echo "<";
+echo (isset($sXmlRootTag)?$sXmlRootTag:'searchresults');
+echo " timestamp='".date(DATE_RFC822)."'";
+echo " attribution='Data © OpenStreetMap contributors, ODbL 1.0. http://www.openstreetmap.org/copyright'";
+echo " querystring='".htmlspecialchars($sQuery, ENT_QUOTES)."'";
+if ($sViewBox) echo " viewbox='".htmlspecialchars($sViewBox, ENT_QUOTES)."'";
+echo " polygon='".($bShowPolygons?'true':'false')."'";
+if (sizeof($aExcludePlaceIDs))
+{
+    echo " exclude_place_ids='".htmlspecialchars(join(',',$aExcludePlaceIDs))."'";
+}
+if ($sMoreURL)
+{
+    echo " more_url='".htmlspecialchars($sMoreURL)."'";
+}
+echo ">\n";
+
+foreach($aSearchResults as $iResNum => $aResult)
+{
+    echo "<place place_id='".$aResult['place_id']."'";
+    $sOSMType = formatOSMType($aResult['osm_type']);
+    if ($sOSMType)
+    {
+        echo " osm_type='$sOSMType'";
+        echo " osm_id='".$aResult['osm_id']."'";
+    }
+    echo " place_rank='".$aResult['rank_search']."'";
+
+    if (isset($aResult['aBoundingBox']))
+    {
+        echo ' boundingbox="';
+        echo join(',',$aResult['aBoundingBox']);
+        echo '"';
+
+        if ($bShowPolygons && isset($aResult['aPolyPoints']))
+        {
+            echo ' polygonpoints=\'';
+            echo json_encode($aResult['aPolyPoints']);
+            echo '\'';
+        }
+    }
+
+    if (isset($aResult['asgeojson']))
+    {
+        echo ' geojson=\'';
+        echo $aResult['asgeojson'];
+        echo '\'';
+    }
+
+    if (isset($aResult['assvg']))
+    {
+        echo ' geosvg=\'';
+        echo $aResult['assvg'];
+        echo '\'';
+    }
+
+    if (isset($aResult['astext']))
+    {
+        echo ' geotext=\'';
+        echo $aResult['astext'];
+        echo '\'';
+    }
+
+    if (isset($aResult['zoom']))
+    {
+        echo " zoom='".$aResult['zoom']."'";
+    }
+
+    echo " lat='".$aResult['lat']."'";
+    echo " lon='".$aResult['lon']."'";
+    echo " display_name='".htmlspecialchars($aResult['name'], ENT_QUOTES)."'";
+
+    echo " class='".htmlspecialchars($aResult['class'])."'";
+    echo " type='".htmlspecialchars($aResult['type'], ENT_QUOTES)."'";
+    echo " importance='".htmlspecialchars($aResult['importance'])."'";
+    if (isset($aResult['icon']) && $aResult['icon'])
+    {
+        echo " icon='".htmlspecialchars($aResult['icon'], ENT_QUOTES)."'";
+    }
+
+    $bHasDelim = false;
+
+    if (isset($aResult['askml']))
+    {
+        if (!$bHasDelim)
+        {
+            $bHasDelim = true;
+            echo ">";
+        }
+        echo "\n<geokml>";
+        echo $aResult['askml'];
+        echo "</geokml>";
+    }
+
+    if (isset($aResult['sExtraTags']))
+    {
+        if (!$bHasDelim)
+        {
+            $bHasDelim = true;
+            echo ">";
+        }
+        echo "\n<extratags>";
+        foreach ($aResult['sExtraTags'] as $sKey => $sValue)
+        {
+            echo '<tag key="'.htmlspecialchars($sKey).'" value="'.htmlspecialchars($sValue).'"/>';
+        }
+        echo "</extratags>";
+    }
+
+    if (isset($aResult['sNameDetails']))
+    {
+        if (!$bHasDelim)
+        {
+            $bHasDelim = true;
+            echo ">";
+        }
+        echo "\n<namedetails>";
+        foreach ($aResult['sNameDetails'] as $sKey => $sValue)
+        {
+            echo '<name desc="'.htmlspecialchars($sKey).'">';
+            echo htmlspecialchars($sValue);
+            echo "</name>";
+        }
+        echo "</namedetails>";
+    }
+
+    if (isset($aResult['address']))
+    {
+        if (!$bHasDelim)
+        {
+            $bHasDelim = true;
+            echo ">";
+        }
+        echo "\n";
+        foreach($aResult['address'] as $sKey => $sValue)
+        {
+            $sKey = str_replace(' ','_',$sKey);
+            echo "<$sKey>";
+            echo htmlspecialchars($sValue);
+            echo "</$sKey>";
+        }
+    }
+
+    if ($bHasDelim)
+    {
+        echo "</place>";
+    }
+    else
+    {
+        echo "/>";
+    }
+}
+
+echo "</" . (isset($sXmlRootTag)?$sXmlRootTag:'searchresults') . ">";
diff --git a/lib/website.php b/lib/website.php
deleted file mode 100644 (file)
index a6afb69..0000000
+++ /dev/null
@@ -1,140 +0,0 @@
-<?php
-
-/***************************************************************************
- *
- * Error handling functions
- *
- */
-       function chksql($oSql, $sMsg = "Database request failed")
-       {
-               if (!PEAR::isError($oSql)) return $oSql;
-
-               header('HTTP/1.0 500 Internal Server Error');
-               header('Content-type: text/html; charset=utf-8');
-
-               $sSqlError = $oSql->getMessage();
-
-               echo <<<INTERNALFAIL
-       <html>
-         <head><title>Internal Server Error</title></head>
-         <body>
-               <h1>Internal Server Error</h1>
-               <p>Nominatim has encountered an internal error while accessing the database.
-                  This may happen because the database is broken or because of a bug in
-                  the software. If you think it is a bug, feel free to report
-                  it over on <a href="https://github.com/twain47/Nominatim/issues">
-                  Github</a>. Please include the URL that caused the problem and the
-                  complete error details below.</p>
-               <p><b>Message:</b> $sMsg</p>
-               <p><b>SQL Error:</b> $sSqlError</p>
-               <p><b>Details:</b> <pre>
-INTERNALFAIL;
-
-               if (CONST_Debug)
-               {
-                       var_dump($oSql);
-               }
-               else
-               {
-                       echo "<pre>\n".$oSql->getUserInfo()."</pre>";
-               }
-
-               echo "</pre></p></body></html>";
-               exit;
-       }
-
-       function failInternalError($sError, $sSQL = false, $vDumpVar = false)
-       {
-               header('HTTP/1.0 500 Internal Server Error');
-               header('Content-type: text/html; charset=utf-8');
-               echo "<html><body><h1>Internal Server Error</h1>";
-               echo '<p>Nominatim has encountered an internal error while processing your request. This is most likely because of a bug in the software.</p>';
-               echo "<p><b>Details:</b> ".$sError,"</p>";
-               echo '<p>Feel free to file an issue on <a href="https://github.com/twain47/Nominatim/issues">Github</a>. Please include the error message above and the URL you used.</p>';
-               if (CONST_Debug)
-               {
-                       echo "<hr><h2>Debugging Information</h2><br>";
-                       if ($sSQL)
-                       {
-                               echo "<h3>SQL query</h3><code>".$sSQL."</code>";
-                       }
-                       if ($vDumpVar)
-                       {
-                               echo "<h3>Result</h3> <code>";
-                               var_dump($vDumpVar);
-                               echo "</code>";
-                       }
-               }
-               echo "\n</body></html>\n";
-               exit;
-       }
-
-
-       function userError($sError)
-       {
-               header('HTTP/1.0 400 Bad Request');
-               header('Content-type: text/html; charset=utf-8');
-               echo "<html><body><h1>Bad Request</h1>";
-               echo '<p>Nominatim has encountered an error with your request.</p>';
-               echo "<p><b>Details:</b> ".$sError."</p>";
-               echo '<p>If you feel this error is incorrect feel file an issue on <a href="https://github.com/twain47/Nominatim/issues">Github</a>. Please include the error message above and the URL you used.</p>';
-               echo "\n</body></html>\n";
-               exit;
-       }
-
-
-/***************************************************************************
- *
- * Functions for parsing URL parameters
- *
- */
-
-       function getParamBool($sName, $bDefault=false)
-       {
-               if (!isset($_GET[$sName]) || strlen($_GET[$sName]) == 0) return $bDefault;
-
-               return (bool) $_GET[$sName];
-       }
-
-       function getParamInt($sName, $bDefault=false)
-       {
-               if (!isset($_GET[$sName]) || strlen($_GET[$sName]) == 0) return $bDefault;
-
-               if (!preg_match('/^[+-]?[0-9]+$/', $_GET[$sName]))
-               {
-                       userError("Integer number expected for parameter '$sName'");
-               }
-
-               return (int) $_GET[$sName];
-       }
-
-       function getParamFloat($sName, $bDefault=false)
-       {
-               if (!isset($_GET[$sName]) || strlen($_GET[$sName]) == 0) return $bDefault;
-
-               if (!preg_match('/^[+-]?[0-9]*\.?[0-9]+$/', $_GET[$sName]))
-               {
-                       userError("Floating-point number expected for parameter '$sName'");
-               }
-
-               return (float) $_GET[$sName];
-       }
-
-       function getParamString($sName, $bDefault=false)
-       {
-               if (!isset($_GET[$sName]) || strlen($_GET[$sName]) == 0) return $bDefault;
-
-               return $_GET[$sName];
-       }
-
-       function getParamSet($sName, $aValues, $sDefault=false)
-       {
-               if (!isset($_GET[$sName]) || strlen($_GET[$sName]) == 0) return $sDefault;
-
-               if (!in_array($_GET[$sName], $aValues))
-               {
-                       userError("Parameter '$sName' must be one of: ".join(', ', $aValues));
-               }
-
-               return $_GET[$sName];
-       }
diff --git a/phpcs.xml b/phpcs.xml
new file mode 100644 (file)
index 0000000..c8b8a80
--- /dev/null
+++ b/phpcs.xml
@@ -0,0 +1,156 @@
+<?xml version="1.0"?>
+<ruleset name="Nominatim Standard">
+
+  <description>Nominatim coding standard</description>
+
+  <!-- based on another standard, you can find it here -->
+  <!-- /usr/share/php/PHP/CodeSniffer/Standards/PSR2/ruleset.xml -->
+  <!-- https://github.com/squizlabs/PHP_CodeSniffer/blob/master/CodeSniffer/Standards/PSR2/ruleset.xml -->
+  <rule ref="PSR2"/>
+
+
+
+
+  <!-- currently 300 warnings, we set a limit later -->
+  <rule ref="Generic.Files.LineLength">
+    <properties>
+     <property name="lineLimit" value="9999"/>
+     <property name="absoluteLineLimit" value="0"/>
+    </properties>
+  </rule>
+
+
+  <!-- "A file should declare new symbols (classes, functions, constants, etc.) and cause no
+    other side effects, or it should execute logic with side effects, but should not do both."
+    ... we have too many script and includes to be able to enforce that.
+     -->
+  <rule ref="PSR1.Files.SideEffects.FoundWithSymbols">
+    <severity>0</severity>
+  </rule>
+
+
+
+  <!-- **************************************************************
+       DOCUMENTATION
+       ************************************************************** -->
+
+  <rule ref="PEAR.Commenting.FunctionComment.Missing">
+    <severity>0</severity>
+  </rule>
+
+
+
+
+  <!-- **************************************************************
+       COMMENTS
+       ************************************************************** -->
+
+  <!-- any comments in the lines before function() are better than forcing
+       a PHPdoc style right now -->
+  <rule ref="PEAR.Commenting.FunctionComment.WrongStyle">
+    <severity>0</severity>
+  </rule>
+
+  <!-- We allow comments after statements -->
+  <rule ref="Squiz.Commenting.PostStatementComment.Found">
+    <severity>0</severity>
+  </rule>
+  <!-- ... even without space e.g. //some words -->
+  <rule ref="Squiz.Commenting.InlineComment.NoSpaceBefore">
+    <severity>0</severity>
+  </rule>
+  <!-- blank lines after inline comments are fine -->
+  <rule ref="Squiz.Commenting.InlineComment.SpacingAfter">
+    <severity>0</severity>
+  </rule>
+
+  <!-- Comments don't have to start uppercase -->
+  <rule ref="Squiz.Commenting.InlineComment.NotCapital">
+    <severity>0</severity>
+  </rule>
+  <!-- Comments don't have to end with one of .!? -->
+  <rule ref="Squiz.Commenting.InlineComment.InvalidEndChar">
+    <severity>0</severity>
+  </rule>
+  <!-- Empty comments are fine -->
+  <rule ref="Squiz.Commenting.InlineComment.Empty">
+    <severity>0</severity>
+  </rule>
+
+
+
+
+  <!-- **************************************************************
+       INDENTATION, SPACING
+       ************************************************************** -->
+
+  <!-- We don't need 2 blank lines after function -->
+  <rule ref="Squiz.WhiteSpace.FunctionSpacing.After">
+    <severity>0</severity>
+  </rule>
+
+  <!-- Aligned looks nicer, but causes too many warnings currently -->
+  <rule ref="Generic.Formatting.MultipleStatementAlignment.NotSame">
+    <severity>0</severity>
+  </rule>
+  <rule ref="Generic.Formatting.MultipleStatementAlignment.NotSameWarning">
+    <severity>0</severity>
+  </rule>
+
+  <!-- Aligned looks nicer, but causes too many warnings currently -->
+  <rule ref="Squiz.Arrays.ArrayDeclaration.DoubleArrowNotAligned">
+    <severity>0</severity>
+  </rule>
+
+
+
+
+
+
+
+  <!-- **************************************************************
+       VARIABLES
+       ************************************************************** -->
+
+  <!-- CONST_this_var is fine, we don't need ConstThisVar -->
+  <rule ref="Generic.NamingConventions.UpperCaseConstantName.ConstantNotUpperCase">
+    <severity>0</severity>
+  </rule>
+
+  <!-- simply disagree with "Each line in an array declaration must end in a comma" -->
+  <rule ref="Squiz.Arrays.ArrayDeclaration.NoCommaAfterLast">
+    <severity>0</severity>
+  </rule>
+  <rule ref="Squiz.Arrays.ArrayDeclaration.NoComma">
+    <severity>0</severity>
+  </rule>
+
+  <!-- We allow "$abc = array($aPoint[1], $aPoint[2])" -->
+  <rule ref="Squiz.Arrays.ArrayDeclaration.SingleLineNotAllowed">
+    <severity>0</severity>
+  </rule>
+
+
+
+
+  <!-- **************************************************************
+       CONTROL STRUCTURES
+       ************************************************************** -->
+
+  <!-- we allow "if (a) echo 'b'" without brackets -->
+  <rule ref="Generic.ControlStructures.InlineControlStructure.NotAllowed">
+    <severity>0</severity>
+  </rule>
+
+  <!-- We allow "if (a)". No need for "if (a === TRUE)" -->
+  <rule ref="Squiz.Operators.ComparisonOperatorUsage.ImplicitTrue">
+    <severity>0</severity>
+  </rule>
+  <!-- ... same for "if (!a)" -->
+  <rule ref="Squiz.Operators.ComparisonOperatorUsage.NotAllowed">
+    <severity>0</severity>
+  </rule>
+
+
+
+</ruleset>
index cdb02924a6c0dcfa9d76dce4f2e978dc3b36205d..a953e460f1d81a7651cedd606d5d238e3613822c 100644 (file)
 <?php
-       @define('CONST_BasePath', '@CMAKE_SOURCE_DIR@');
-       @define('CONST_InstallPath', '@CMAKE_BINARY_DIR@');
-       if (file_exists(getenv('NOMINATIM_SETTINGS'))) require_once(getenv('NOMINATIM_SETTINGS'));
-       if (file_exists(CONST_InstallPath.'/settings/local.php')) require_once(CONST_InstallPath.'/settings/local.php');
-       if (isset($_GET['debug']) && $_GET['debug']) @define('CONST_Debug', true);
-
-       // General settings
-       @define('CONST_Debug', false);
-       @define('CONST_Database_DSN', 'pgsql://@/nominatim'); // <driver>://<username>:<password>@<host>:<port>/<database>
-       @define('CONST_Database_Web_User', 'www-data');
-       @define('CONST_Max_Word_Frequency', '50000');
-       @define('CONST_Limit_Reindexing', true);
-       // Set to false to avoid importing extra postcodes for the US.
-       @define('CONST_Use_Extra_US_Postcodes', true);
-       // Set to true after importing Tiger house number data for the US.
-       // Note: The tables must already exist or queries will throw errors.
-       //       After changing this setting run ./utils/setup --create-functions
-       //       again.
-       @define('CONST_Use_US_Tiger_Data', false);
-       // Set to true after importing other external house number data.
-       // Note: the aux tables must already exist or queries will throw errors.
-       //       After changing this setting run ./utils/setup --create-functions
-       //       again.
-       @define('CONST_Use_Aux_Location_data', false);
-
-       // Proxy settings
-       @define('CONST_HTTP_Proxy', false);
-       @define('CONST_HTTP_Proxy_Host', 'proxy.mydomain.com');
-       @define('CONST_HTTP_Proxy_Port', '3128');
-       @define('CONST_HTTP_Proxy_Login', '');
-       @define('CONST_HTTP_Proxy_Password', '');
-
-       // Paths
-       @define('CONST_Osm2pgsql_Binary', CONST_InstallPath.'/osm2pgsql/osm2pgsql');
-       @define('CONST_Osmosis_Binary', '/usr/bin/osmosis');
-       @define('CONST_Tiger_Data_Path', CONST_BasePath.'/data/tiger');
-
-       // osm2pgsql settings
-       @define('CONST_Osm2pgsql_Flatnode_File', null);
-
-       // tablespace settings
-       // osm2pgsql caching tables (aka slim mode tables) - update only
-       @define('CONST_Tablespace_Osm2pgsql_Data', false);
-       @define('CONST_Tablespace_Osm2pgsql_Index', false);
-       // osm2pgsql output tables (aka main table) - update only
-       @define('CONST_Tablespace_Place_Data', false);
-       @define('CONST_Tablespace_Place_Index', false);
-       // address computation tables - update only
-       @define('CONST_Tablespace_Address_Data', false);
-       @define('CONST_Tablespace_Address_Index', false);
-       // search tables - needed for lookups
-       @define('CONST_Tablespace_Search_Data', false);
-       @define('CONST_Tablespace_Search_Index', false);
-       // additional data, e.g. TIGER data, type searches - needed for lookups
-       @define('CONST_Tablespace_Aux_Data', false);
-       @define('CONST_Tablespace_Aux_Index', false);
-
-       // Replication settings
-       @define('CONST_Replication_Url', 'http://planet.openstreetmap.org/replication/minute');
-       @define('CONST_Replication_MaxInterval', '3600');
-       @define('CONST_Replication_Update_Interval', '60');  // How often upstream publishes diffs
-       @define('CONST_Replication_Recheck_Interval', '60'); // How long to sleep if no update found yet
-
-       // Website settings
-       @define('CONST_NoAccessControl', true);
-
-       @define('CONST_Website_BaseURL', 'http://'.php_uname('n').'/');
-       // Language to assume when none is supplied with the query.
-       // When set to false, the local language (i.e. the name tag without suffix)
-       // will be used.
-       @define('CONST_Default_Language', false);
-       // Appearance of the map in the debug interface.
-       @define('CONST_Default_Lat', 20.0);
-       @define('CONST_Default_Lon', 0.0);
-       @define('CONST_Default_Zoom', 2);
-       @define('CONST_Map_Tile_URL', 'http://{s}.tile.osm.org/{z}/{x}/{y}.png');
-       @define('CONST_Map_Tile_Attribution', ''); // Set if tile source isn't osm.org
-
-       @define('CONST_Search_AreaPolygons', true);
-
-       @define('CONST_Search_BatchMode', false);
-
-       @define('CONST_Search_TryDroppedAddressTerms', false);
-       @define('CONST_Search_NameOnlySearchFrequencyThreshold', 500);
-       // If set to true, then reverse order of queries will be tried by default.
-       // When set to false only selected languages alloow reverse search.
-       @define('CONST_Search_ReversePlanForAll', true);
-
-       // Maximum number of OSM ids that may be queried at once
-       // for the places endpoint.
-       @define('CONST_Places_Max_ID_count', 50); 
-
-       // Number of different geometry formats that may be queried in parallel.
-       // Set to zero to disable polygon output.
-       @define('CONST_PolygonOutput_MaximumTypes', 1);
-
-       // Log settings
-       // Set to true to log into new_query_log table.
-       // You should set up a cron job that regularly clears out this table.
-       @define('CONST_Log_DB', false);
-       // Set to a file name to enable logging to a file.
-       @define('CONST_Log_File', false);
-
-
+@define('CONST_BasePath', '@CMAKE_SOURCE_DIR@');
+@define('CONST_InstallPath', '@CMAKE_BINARY_DIR@');
+if (file_exists(getenv('NOMINATIM_SETTINGS'))) require_once(getenv('NOMINATIM_SETTINGS'));
+if (file_exists(CONST_InstallPath.'/settings/local.php')) require_once(CONST_InstallPath.'/settings/local.php');
+if (isset($_GET['debug']) && $_GET['debug']) @define('CONST_Debug', true);
+
+// General settings
+@define('CONST_Debug', false);
+@define('CONST_Database_DSN', 'pgsql://@/nominatim'); // <driver>://<username>:<password>@<host>:<port>/<database>
+@define('CONST_Database_Web_User', 'www-data');
+@define('CONST_Max_Word_Frequency', '50000');
+@define('CONST_Limit_Reindexing', true);
+// Restrict search languages.
+// Normally Nominatim will include all language variants of name:XX
+// in the search index. Set this to a comma separated list of language
+// codes, to restrict import to a subset of languages.
+// Currently only affects the import of country names and special phrases.
+@define('CONST_Languages', false);
+
+// Set to false to avoid importing extra postcodes for the US.
+@define('CONST_Use_Extra_US_Postcodes', true);
+/* Set to true after importing Tiger house number data for the US.
+   Note: The tables must already exist or queries will throw errors.
+         After changing this setting run ./utils/setup --create-functions
+         again. */
+@define('CONST_Use_US_Tiger_Data', false);
+/* Set to true after importing other external house number data.
+   Note: the aux tables must already exist or queries will throw errors.
+        After changing this setting run ./utils/setup --create-functions
+        again. */
+@define('CONST_Use_Aux_Location_data', false);
+
+// Proxy settings
+@define('CONST_HTTP_Proxy', false);
+@define('CONST_HTTP_Proxy_Host', 'proxy.mydomain.com');
+@define('CONST_HTTP_Proxy_Port', '3128');
+@define('CONST_HTTP_Proxy_Login', '');
+@define('CONST_HTTP_Proxy_Password', '');
+
+// Paths
+@define('CONST_Osm2pgsql_Binary', CONST_InstallPath.'/osm2pgsql/osm2pgsql');
+@define('CONST_Osmosis_Binary', '/usr/bin/osmosis');
+@define('CONST_Tiger_Data_Path', CONST_BasePath.'/data/tiger');
+
+// osm2pgsql settings
+@define('CONST_Osm2pgsql_Flatnode_File', null);
+
+// tablespace settings
+// osm2pgsql caching tables (aka slim mode tables) - update only
+@define('CONST_Tablespace_Osm2pgsql_Data', false);
+@define('CONST_Tablespace_Osm2pgsql_Index', false);
+// osm2pgsql output tables (aka main table) - update only
+@define('CONST_Tablespace_Place_Data', false);
+@define('CONST_Tablespace_Place_Index', false);
+// address computation tables - update only
+@define('CONST_Tablespace_Address_Data', false);
+@define('CONST_Tablespace_Address_Index', false);
+// search tables - needed for lookups
+@define('CONST_Tablespace_Search_Data', false);
+@define('CONST_Tablespace_Search_Index', false);
+// additional data, e.g. TIGER data, type searches - needed for lookups
+@define('CONST_Tablespace_Aux_Data', false);
+@define('CONST_Tablespace_Aux_Index', false);
+
+// Replication settings
+@define('CONST_Replication_Url', 'http://planet.openstreetmap.org/replication/minute');
+@define('CONST_Replication_MaxInterval', '3600');
+@define('CONST_Replication_Update_Interval', '60');  // How often upstream publishes diffs
+@define('CONST_Replication_Recheck_Interval', '60'); // How long to sleep if no update found yet
+
+// Website settings
+@define('CONST_NoAccessControl', true);
+
+@define('CONST_Website_BaseURL', 'http://'.php_uname('n').'/');
+// Language to assume when none is supplied with the query.
+// When set to false, the local language (i.e. the name tag without suffix)
+// will be used.
+@define('CONST_Default_Language', false);
+// Appearance of the map in the debug interface.
+@define('CONST_Default_Lat', 20.0);
+@define('CONST_Default_Lon', 0.0);
+@define('CONST_Default_Zoom', 2);
+@define('CONST_Map_Tile_URL', 'http://{s}.tile.osm.org/{z}/{x}/{y}.png');
+@define('CONST_Map_Tile_Attribution', ''); // Set if tile source isn't osm.org
+
+@define('CONST_Search_AreaPolygons', true);
+
+@define('CONST_Search_BatchMode', false);
+
+@define('CONST_Search_TryDroppedAddressTerms', false);
+@define('CONST_Search_NameOnlySearchFrequencyThreshold', 500);
+// If set to true, then reverse order of queries will be tried by default.
+// When set to false only selected languages alloow reverse search.
+@define('CONST_Search_ReversePlanForAll', true);
+
+// Maximum number of OSM ids that may be queried at once
+// for the places endpoint.
+@define('CONST_Places_Max_ID_count', 50);
+
+// Number of different geometry formats that may be queried in parallel.
+// Set to zero to disable polygon output.
+@define('CONST_PolygonOutput_MaximumTypes', 1);
+
+// Log settings
+// Set to true to log into new_query_log table.
+// You should set up a cron job that regularly clears out this table.
+@define('CONST_Log_DB', false);
+// Set to a file name to enable logging to a file.
+@define('CONST_Log_File', false);
index 2e199ada0ffffe718934da125d297ef6f87ab330..cee7028ba384e6a4196fe397288352dcda39d457 100644 (file)
@@ -1,51 +1,20 @@
 <?php
-# These settings control the import of special phrases from the wiki.
 
-# Languages to download the special phrases for.
-$aLanguageIn = array(
-                       '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',
-                       'sv',
-                       'uk',
-                       'vi',
-               );
+// These settings control the import of special phrases from the wiki.
 
-# class/type combinations to exclude
-$aTagsBlacklist = array(
-       'boundary' => array('administrative'),
-       'place' => array('house', 'houses'),
-);
-# If a class is in the white list then all types will 
-# be ignored except the ones given in the list.
-# Also use this list to exclude an entire class from
-# special phrases.
-$aTagsWhitelist = array(
-       'highway' => array('bus_stop', 'rest_area', 'raceway'),
-       'building' => array(),
-);
+// class/type combinations to exclude
+$aTagsBlacklist
+ = array(
+    'boundary' => array('administrative'),
+    'place' => array('house', 'houses'),
+   );
+
+// If a class is in the white list then all types will 
+// be ignored except the ones given in the list.
+// Also use this list to exclude an entire class from
+// special phrases.
+$aTagsWhitelist
+ = array(
+    'highway' => array('bus_stop', 'rest_area', 'raceway'),
+    'building' => array(),
+   );
index 3475ae7b309b0ba909146e62e28a3add5aef2b30..d45a42376cb3cfe055b62b7dd672b5b927fd91f0 100644 (file)
@@ -1,4 +1,4 @@
 <?php
-       echo "ERROR: Scripts must be run from build directory.\n";
-       exit;
 
+echo "ERROR: Scripts must be run from build directory.\n";
+exit;
index 00fdc132cd77c32ef8e29310d1646b890a79f5f0..a90bbf2ebe70775822e0b42273c73bde46468b4d 100644 (file)
 <?php
 
 namespace Nominatim;
-require '../lib/lib.php';
 
+require '../lib/lib.php';
 
 class NominatimTest extends \PHPUnit_Framework_TestCase
 {
 
-       protected function setUp()
-       {
-       }
-
-
-       public function test_getClassTypesWithImportance()
-       {
-               $aClasses = getClassTypesWithImportance();
-
-               $this->assertGreaterThan(
-                       200,
-                       count($aClasses)
-               );
-
-               $this->assertEquals(
-                       array(
-                               'label' => "Country",
-                               'frequency' => 0,
-                               'icon' => "poi_boundary_administrative",
-                               'defzoom' => 6,
-                               'defdiameter' => 15,
-                               'importance' => 3
-                       ),
-                       $aClasses['place:country']
-               );
-       }
-
-
-       public function test_getResultDiameter()
-       {
-               $aResult = array();
-               $this->assertEquals(
-                       0.0001,
-                       getResultDiameter($aResult)
-               );
-
-               $aResult = array('class' => 'place', 'type' => 'country');
-               $this->assertEquals(
-                       15,
-                       getResultDiameter($aResult)
-               );
-
-               $aResult = array('class' => 'boundary', 'type' => 'administrative', 'admin_level' => 6);
-               $this->assertEquals(
-                       0.32,
-                       getResultDiameter($aResult)
-               );
-       }
-
-
-       public function test_addQuotes()
-       {
-               // FIXME: not quoting existing quote signs is probably a bug
-               $this->assertSame("'St. John's'", addQuotes("St. John's"));
-               $this->assertSame("''", addQuotes(''));
-       }
-
-       public function test_looksLikeLatLonPair()
-       {
-               // no coordinates expected
-               $this->assertNull(looksLikeLatLonPair(''));
-               $this->assertNull(looksLikeLatLonPair('abc'));
-               $this->assertNull(looksLikeLatLonPair('12 34'));
-               $this->assertNull(looksLikeLatLonPair('200.1 89.9')); // because latitude > 180
-
-               // coordinates expected
-               $this->assertNotNull(looksLikeLatLonPair('0.0 -0.0'));
-
-               $this->assertEquals(
-                               array( 'lat' => 12.456, 'lon' => -78.90, 'query' => 'abc   def'),
-                               looksLikeLatLonPair(' abc 12.456 -78.90 def ')
-                       );
-
-               $this->assertEquals(
-                               array( 'lat' => 12.456, 'lon' => -78.90, 'query' => ''),
-                               looksLikeLatLonPair(' [12.456,-78.90] ')
-                       );
-
-               // http://en.wikipedia.org/wiki/Geographic_coordinate_conversion
-               // these all represent the same location
-               $aQueries = array(
-                                       '40 26.767 N 79 58.933 W',
-                                       '40° 26.767′ N 79° 58.933′ W',
-                                       "40° 26.767' N 79° 58.933' W",
-                                       'N 40 26.767, W 79 58.933',
-                                       'N 40°26.767′, W 79°58.933′',
-                                       "N 40°26.767', W 79°58.933'",
-
-                                       '40 26 46 N 79 58 56 W',
-                                       '40° 26′ 46″ N 79° 58′ 56″ W',
-                                       'N 40 26 46 W 79 58 56',
-                                       'N 40° 26′ 46″, W 79° 58′ 56″',
-                                       'N 40° 26\' 46", W 79° 58\' 56"',
-
-                                       '40.446 -79.982',
-                                       '40.446,-79.982',
-                                       '40.446° N 79.982° W',
-                                       'N 40.446° W 79.982°',
-
-                                       '[40.446 -79.982]',
-                                       '       40.446  ,   -79.982     ',
-               );
-
-
-               foreach($aQueries as $sQuery){
-                       $aRes = looksLikeLatLonPair($sQuery);
-                       $this->assertEquals( 40.446, $aRes['lat'], 'degrees decimal ' . $sQuery, 0.01);
-                       $this->assertEquals(-79.982, $aRes['lon'], 'degrees decimal ' . $sQuery, 0.01);
-               }
-
-       }
-
-
-
-       public function test_getWordSets()
-       {
-
-               // given an array of arrays like
-               // array( array('a','b'), array('c','d') )
-               // returns a summary as string: '(a|b),(c|d)'
-               function serialize_sets($aSets)
-               {       
-                       $aParts = array();
-                       foreach($aSets as $aSet){
-                               $aParts[] = '(' . join('|', $aSet) . ')';
-                       }
-                       return join(',', $aParts);
-               }
-
-               $this->assertEquals(
-                       array(array('')),
-                       getWordSets(array(),0)
-               );
-
-               $this->assertEquals(
-                       '(a)',
-                       serialize_sets( getWordSets(array("a"),0) )
-               );
-
-               $this->assertEquals(
-                       '(a b),(a|b)',
-                       serialize_sets( getWordSets(array('a','b'),0) )
-               );
-
-               $this->assertEquals(
-                       '(a b c),(a|b c),(a|b|c),(a b|c)',
-                       serialize_sets( getWordSets(array('a','b','c'),0) )
-               );
-
-               $this->assertEquals(
-                       '(a b c d),(a|b c d),(a|b|c d),(a|b|c|d),(a|b c|d),(a b|c d),(a b|c|d),(a b c|d)',
-                       serialize_sets( getWordSets(array('a','b','c','d'),0) )
-               );
-
-
-               // Inverse
-               $this->assertEquals(
-                       '(a b c),(c|a b),(c|b|a),(b c|a)',
-                       serialize_sets( getInverseWordSets(array('a','b','c'),0) )
-               );
-
-
-               // make sure we don't create too many sets
-               // 4 words => 8 sets
-               // 10 words => 511 sets
-               // 15 words => 12911 sets
-               // 18 words => 65536 sets
-               // 20 words => 169766 sets
-               // 22 words => 401930 sets
-               // 28 words => 3505699 sets (needs more than 4GB via 'phpunit -d memory_limit=' to run)
-               $this->assertEquals(
-                       8,
-                       count( getWordSets(array_fill( 0, 4, 'a'),0) )
-               );
-
-
-               $this->assertEquals(
-                       65536,
-                       count( getWordSets(array_fill( 0, 18, 'a'),0) )
-               );
-       }
-
-
-
-       // you might say we're creating a circle
-       public function test_createPointsAroundCenter()
-       {
-               $aPoints = createPointsAroundCenter(0, 0, 2);
-
-               $this->assertEquals(
-                       101,
-                       count($aPoints)
-               );
-               $this->assertEquals(
-                       array(
-                               ['', 0, 2],
-                               ['', 0.12558103905863, 1.9960534568565],
-                               ['', 0.25066646712861, 1.984229402629]
-                       ),
-                       array_splice($aPoints, 0, 3)
-               );
-       }
-
-       public function test_geometryText2Points()
-       {
-               $fRadius = 1;
-               // invalid value
-               $this->assertEquals(
-                       NULL,
-                       geometryText2Points('', $fRadius)
-               );
-
-               // POINT
-               $aPoints = geometryText2Points('POINT(10 20)', $fRadius);
-               $this->assertEquals(
-                       101,
-                       count($aPoints)
-               );
-               $this->assertEquals(
-                       array(
-                               [10, 21],
-                               [10.062790519529, 20.998026728428],
-                               [10.125333233564, 20.992114701314]
-                       ),
-                       array_splice($aPoints, 0,3)
-               );
-
-               // POLYGON
-               $this->assertEquals(
-                       array(
-                               ['30', '10'],
-                               ['40', '40'],
-                               ['20', '40'],
-                               ['10', '20'],
-                               ['30', '10']
-                       ),
-                       geometryText2Points('POLYGON((30 10, 40 40, 20 40, 10 20, 30 10))', $fRadius)
-               );
-
-               // MULTIPOLYGON
-               $this->assertEquals(
-                       array(
-                               ['30', '20'], // first polygon only
-                               ['45', '40'],
-                               ['10', '40'],
-                               ['30', '20'],
-                       ),
-                       geometryText2Points('MULTIPOLYGON(((30 20, 45 40, 10 40, 30 20)),((15 5, 40 10, 10 20, 5 10, 15 5)))', $fRadius)
-               );
-       }
 
+    protected function setUp()
+    {
+    }
+
+
+    public function testGetClassTypesWithImportance()
+    {
+        $aClasses = getClassTypesWithImportance();
+
+        $this->assertGreaterThan(
+            200,
+            count($aClasses)
+        );
+
+        $this->assertEquals(
+            array(
+             'label' => "Country",
+             'frequency' => 0,
+             'icon' => "poi_boundary_administrative",
+             'defzoom' => 6,
+             'defdiameter' => 15,
+             'importance' => 3
+            ),
+            $aClasses['place:country']
+        );
+    }
+
+
+    public function testGetResultDiameter()
+    {
+        $aResult = array();
+        $this->assertEquals(
+            0.0001,
+            getResultDiameter($aResult)
+        );
+
+        $aResult = array('class' => 'place', 'type' => 'country');
+        $this->assertEquals(
+            15,
+            getResultDiameter($aResult)
+        );
+
+        $aResult = array('class' => 'boundary', 'type' => 'administrative', 'admin_level' => 6);
+        $this->assertEquals(
+            0.32,
+            getResultDiameter($aResult)
+        );
+    }
+
+
+    public function testAddQuotes()
+    {
+        // FIXME: not quoting existing quote signs is probably a bug
+        $this->assertSame("'St. John's'", addQuotes("St. John's"));
+        $this->assertSame("''", addQuotes(''));
+    }
+
+
+    public function testLooksLikeLatLonPair()
+    {
+        // no coordinates expected
+        $this->assertNull(looksLikeLatLonPair(''));
+        $this->assertNull(looksLikeLatLonPair('abc'));
+        $this->assertNull(looksLikeLatLonPair('12 34'));
+        $this->assertNull(looksLikeLatLonPair('200.1 89.9')); // because latitude > 180
+
+        // coordinates expected
+        $this->assertNotNull(looksLikeLatLonPair('0.0 -0.0'));
+
+        $this->assertEquals(
+            array( 'lat' => 12.456, 'lon' => -78.90, 'query' => 'abc   def'),
+            looksLikeLatLonPair(' abc 12.456 -78.90 def ')
+        );
+
+        $this->assertEquals(
+            array( 'lat' => 12.456, 'lon' => -78.90, 'query' => ''),
+            looksLikeLatLonPair(' [12.456,-78.90] ')
+        );
+
+        // http://en.wikipedia.org/wiki/Geographic_coordinate_conversion
+        // these all represent the same location
+        $aQueries = array(
+                     '40 26.767 N 79 58.933 W',
+                     '40° 26.767′ N 79° 58.933′ W',
+                     "40° 26.767' N 79° 58.933' W",
+                     'N 40 26.767, W 79 58.933',
+                     'N 40°26.767′, W 79°58.933′',
+                     "N 40°26.767', W 79°58.933'",
+                     '40 26 46 N 79 58 56 W',
+                     '40° 26′ 46″ N 79° 58′ 56″ W',
+                     'N 40 26 46 W 79 58 56',
+                     'N 40° 26′ 46″, W 79° 58′ 56″',
+                     'N 40° 26\' 46", W 79° 58\' 56"',
+                     '40.446 -79.982',
+                     '40.446,-79.982',
+                     '40.446° N 79.982° W',
+                     'N 40.446° W 79.982°',
+                     '[40.446 -79.982]',
+                     '       40.446  ,   -79.982     ',
+                    );
+
+
+        foreach ($aQueries as $sQuery) {
+            $aRes = looksLikeLatLonPair($sQuery);
+            $this->assertEquals(40.446, $aRes['lat'], 'degrees decimal ' . $sQuery, 0.01);
+            $this->assertEquals(-79.982, $aRes['lon'], 'degrees decimal ' . $sQuery, 0.01);
+        }
+    }
+
+
+
+    public function testGetWordSets()
+    {
+        // given an array of arrays like
+        // array( array('a','b'), array('c','d') )
+        // returns a summary as string: '(a|b),(c|d)'
+
+
+        function serializeSets($aSets)
+        {
+            $aParts = array();
+            foreach ($aSets as $aSet) {
+                $aParts[] = '(' . join('|', $aSet) . ')';
+            }
+            return join(',', $aParts);
+        }
+
+        $this->assertEquals(
+            array(array('')),
+            getWordSets(array(), 0)
+        );
+
+        $this->assertEquals(
+            '(a)',
+            serializeSets(getWordSets(array("a"), 0))
+        );
+
+        $this->assertEquals(
+            '(a b),(a|b)',
+            serializeSets(getWordSets(array('a', 'b'), 0))
+        );
+
+        $this->assertEquals(
+            '(a b c),(a|b c),(a|b|c),(a b|c)',
+            serializeSets(getWordSets(array('a', 'b', 'c'), 0))
+        );
+
+        $this->assertEquals(
+            '(a b c d),(a|b c d),(a|b|c d),(a|b|c|d),(a|b c|d),(a b|c d),(a b|c|d),(a b c|d)',
+            serializeSets(getWordSets(array('a', 'b', 'c', 'd'), 0))
+        );
+
+
+        // Inverse
+        $this->assertEquals(
+            '(a b c),(c|a b),(c|b|a),(b c|a)',
+            serializeSets(getInverseWordSets(array('a', 'b', 'c'), 0))
+        );
+
+
+        // make sure we don't create too many sets
+        // 4 words => 8 sets
+        // 10 words => 511 sets
+        // 15 words => 12911 sets
+        // 18 words => 65536 sets
+        // 20 words => 169766 sets
+        // 22 words => 401930 sets
+        // 28 words => 3505699 sets (needs more than 4GB via 'phpunit -d memory_limit=' to run)
+        $this->assertEquals(
+            8,
+            count(getWordSets(array_fill(0, 4, 'a'), 0))
+        );
+
+
+        $this->assertEquals(
+            65536,
+            count(getWordSets(array_fill(0, 18, 'a'), 0))
+        );
+    }
+
+
+    public function testCreatePointsAroundCenter()
+    {
+        // you might say we're creating a circle
+        $aPoints = createPointsAroundCenter(0, 0, 2);
+
+        $this->assertEquals(
+            101,
+            count($aPoints)
+        );
+        $this->assertEquals(
+            array(
+             ['', 0, 2],
+             ['', 0.12558103905863, 1.9960534568565],
+             ['', 0.25066646712861, 1.984229402629]
+            ),
+            array_splice($aPoints, 0, 3)
+        );
+    }
+
+
+    public function testGeometryText2Points()
+    {
+        $fRadius = 1;
+        // invalid value
+        $this->assertEquals(
+            null,
+            geometryText2Points('', $fRadius)
+        );
+
+        // POINT
+        $aPoints = geometryText2Points('POINT(10 20)', $fRadius);
+        $this->assertEquals(
+            101,
+            count($aPoints)
+        );
+        $this->assertEquals(
+            array(
+             [10, 21],
+             [10.062790519529, 20.998026728428],
+             [10.125333233564, 20.992114701314]
+            ),
+            array_splice($aPoints, 0, 3)
+        );
+
+        // POLYGON
+        $this->assertEquals(
+            array(
+             ['30', '10'],
+             ['40', '40'],
+             ['20', '40'],
+             ['10', '20'],
+             ['30', '10']
+            ),
+            geometryText2Points('POLYGON((30 10, 40 40, 20 40, 10 20, 30 10))', $fRadius)
+        );
+
+        // MULTIPOLYGON
+        $this->assertEquals(
+            array(
+             ['30', '20'], // first polygon only
+             ['45', '40'],
+             ['10', '40'],
+             ['30', '20'],
+            ),
+            geometryText2Points('MULTIPOLYGON(((30 20, 45 40, 10 40, 30 20)),((15 5, 40 10, 10 20, 5 10, 15 5)))', $fRadius)
+        );
+    }
 }
index a4abe2dafcb3fabac023b6d4630c24fed41379c0..b3d9bbc7f3711e882119cd6b3af051245d859d04 100644 (file)
@@ -1,2 +1 @@
 <?php
-
index bbff268a566f9476c6442545007164c21cb1b384..ba8cca9b1c1a3f94b142bd6727d4785ba8b092b3 100644 (file)
@@ -108,13 +108,13 @@ Feature: API regression tests
          | 0  | Philippstraße | Düren
 
     Scenario: trac #2830
-        When sending json search query "528, Merkley Drive, K4A 1N5,CA" with address
+        When sending json search query "207, Boardman Street, S0J 1L0, CA" with address
         Then result addresses contain
-         | ID | house_number | road          | postcode | country
-         | 0  | 528          | Merkley Drive | K4A 1N5  | Canada
+         | ID | house_number | road            | postcode | country
+         | 0  | 207          | Boardman Street | S0J 1L0  | Canada
 
     Scenario: trac #2830
-        When sending json search query "K4A 1N5,CA"
+        When sending json search query "S0J 1L0,CA"
         Then results contain
          | ID | class | type     | display_name
          | 0  | place | postcode | .*, Canada
@@ -134,17 +134,8 @@ Feature: API regression tests
     Scenario: trac #2871
         When looking up coordinates -33.906895553,150.99609375
         Then result addresses contain
-         | ID | city       | postcode | country
-         | 0  | [^0-9]*    | 2197     | Australia
-
-    Scenario: trac #2974
-        When sending json search query "Azadi Square, Faruj" with address
-        Then result addresses contain
-         | ID | road        | city
-         | 0  | ميدان آزادي | فاروج
-        And results contain
-         | ID | latlon
-         | 0  | 37.2323,58.2193 +-1km
+         | ID | city       | country
+         | 0  | [^0-9]*$   | Australia
 
      Scenario: trac #2981
         When sending json search query "Ohmstraße 7, Berlin" with address
@@ -202,7 +193,7 @@ Feature: API regression tests
         When sending json search query "<query>" with address
         Then result addresses contain
          | ID | road     | city
-         | 0  | Seegasse | Wieselburg-Land
+         | 0  | Seegasse | .*Wieselburg-Land
 
     Examples:
          | query
index 656bfb2948df6c31f1322b325b192174aa1bc6a6..08b2653c7784c389679a253b0c281edb39a125ef 100644 (file)
@@ -9,7 +9,7 @@ Feature: Search queries
           | road         | Thoresby Road
           | city         | Broxtowe
           | state        | England
-          | country      | United Kingdom
+          | country      | U.*K.*
           | country_code | gb
 
 
@@ -31,13 +31,13 @@ Feature: Search queries
     Scenario: House number interpolation even
         Given the request parameters
           | accept-language
-          | en        
+          | en
         When sending json search query "140 rue Don Bosco, Saguenay" with address
         Then address of result 0 contains
           | type         | value
           | house_number | 140
           | road         | [Rr]ue Don Bosco
-          | city         | Saguenay
+          | city         | .*Saguenay
           | state        | Quebec
           | country      | Canada
           | country_code | ca
@@ -45,13 +45,13 @@ Feature: Search queries
     Scenario: House number interpolation odd
         Given the request parameters
           | accept-language
-          | en        
+          | en
         When sending json search query "141 rue Don Bosco, Saguenay" with address
         Then address of result 0 contains
           | type         | value
           | house_number | 141
           | road         | [rR]ue Don Bosco
-          | city         | Saguenay
+          | city         | .*Saguenay
           | state        | Quebec
           | country      | Canada
           | country_code | ca
@@ -73,7 +73,7 @@ Feature: Search queries
     Scenario: Expansion of Illinois
         Given the request parameters
           | accept-language
-          | en        
+          | en
         When sending json search query "il, us"
         Then results contain
           | ID | display_name
index 4a2dfa010d2e6b31896940e89be61cc7e7ed1ddb..7cb597a86e1835759af15badd02c17c607cb6526 100644 (file)
@@ -31,7 +31,6 @@ Feature: Search queries
         When sending xml search query "Inuvik" with address
         Then address of result 0 contains
           | type         | value
-          | city         | Inuvik
           | state        | Northwest Territories
           | country      | Canada
           | country_code | ca
index 28c48c588d03a6557c2de446d635034433c3dfc3..b213e4545d9774a5872f4c764a4e0ff652a90934 100755 (executable)
@@ -1,53 +1,55 @@
 #!/usr/bin/php -Cq
 <?php
 
-       require_once(dirname(dirname(__FILE__)).'/settings/settings.php');
-       require_once(CONST_BasePath.'/lib/init-cmd.php');
-       ini_set('memory_limit', '800M');
+require_once(dirname(dirname(__FILE__)).'/settings/settings.php');
+require_once(CONST_BasePath.'/lib/init-cmd.php');
+ini_set('memory_limit', '800M');
 
-       $aCMDOptions = array(
-               "Manage service blocks / restrictions",
-               array('help', 'h', 0, 1, 0, 0, false, 'Show Help'),
-               array('quiet', 'q', 0, 1, 0, 0, 'bool', 'Quiet output'),
-               array('verbose', 'v', 0, 1, 0, 0, 'bool', 'Verbose output'),
-               array('list', 'l', 0, 1, 0, 0, 'bool', 'List recent blocks'),
-               array('delete', 'd', 0, 1, 0, 0, 'bool', 'Clear recent blocks list'),
-               array('flush', '', 0, 1, 0, 0, 'bool', 'Flush all blocks / stats'),
-       );
-       getCmdOpt($_SERVER['argv'], $aCMDOptions, $aResult, true, true);
+$aCMDOptions
+ = array(
+    "Manage service blocks / restrictions",
+    array('help', 'h', 0, 1, 0, 0, false, 'Show Help'),
+    array('quiet', 'q', 0, 1, 0, 0, 'bool', 'Quiet output'),
+    array('verbose', 'v', 0, 1, 0, 0, 'bool', 'Verbose output'),
+    array('list', 'l', 0, 1, 0, 0, 'bool', 'List recent blocks'),
+    array('delete', 'd', 0, 1, 0, 0, 'bool', 'Clear recent blocks list'),
+    array('flush', '', 0, 1, 0, 0, 'bool', 'Flush all blocks / stats'),
+   );
+getCmdOpt($_SERVER['argv'], $aCMDOptions, $aResult, true, true);
 
-       $m = getBucketMemcache();
-        if (!$m)
-       {
-               echo "ERROR: Bucket memcache is not configured\n";
-               exit;
-       }
+$m = getBucketMemcache();
+if (!$m) {
+    echo "ERROR: Bucket memcache is not configured\n";
+    exit;
+}
 
-       if ($aResult['list'])
-       {
-               $iCurrentSleeping = $m->get('sleepCounter');
-               echo "\n Sleeping blocks count: $iCurrentSleeping\n";
+if ($aResult['list']) {
+    $iCurrentSleeping = $m->get('sleepCounter');
+    echo "\n Sleeping blocks count: $iCurrentSleeping\n";
 
-               $aBlocks = getBucketBlocks();
-               echo "\n";
-               printf(" %-40s | %12s | %7s | %13s | %31s | %8s\n", "Key", "Total Blocks", "Current", "Still Blocked", "Last Block Time", "Sleeping");
-               printf(" %'--40s-|-%'-12s-|-%'-7s-|-%'-13s-|-%'-31s-|-%'-8s\n", "", "", "", "", "", "");
-               foreach($aBlocks as $sKey => $aDetails)
-               {
-                       printf(" %-40s | %12s | %7s | %13s | %31s | %8s\n", $sKey, $aDetails['totalBlocks'], 
-                               (int)$aDetails['currentBucketSize'], $aDetails['currentlyBlocked']?'Y':'N', 
-                               date("r", $aDetails['lastBlockTimestamp']), $aDetails['isSleeping']?'Y':'N');
-               }
-               echo "\n";
-       }
+    $aBlocks = getBucketBlocks();
+    echo "\n";
+    printf(" %-40s | %12s | %7s | %13s | %31s | %8s\n", "Key", "Total Blocks", "Current", "Still Blocked", "Last Block Time", "Sleeping");
+    printf(" %'--40s-|-%'-12s-|-%'-7s-|-%'-13s-|-%'-31s-|-%'-8s\n", "", "", "", "", "", "");
+    foreach ($aBlocks as $sKey => $aDetails) {
+        printf(
+            " %-40s | %12s | %7s | %13s | %31s | %8s\n",
+            $sKey,
+            $aDetails['totalBlocks'],
+            (int)$aDetails['currentBucketSize'],
+            $aDetails['currentlyBlocked']?'Y':'N',
+            date("r", $aDetails['lastBlockTimestamp']),
+            $aDetails['isSleeping']?'Y':'N'
+        );
+    }
+    echo "\n";
+}
 
-       if ($aResult['delete'])
-       {
-               $m->set('sleepCounter', 0);
-               clearBucketBlocks();
-       }
+if ($aResult['delete']) {
+    $m->set('sleepCounter', 0);
+    clearBucketBlocks();
+}
 
-       if ($aResult['flush'])
-       {
-               $m->flush();
-       }
+if ($aResult['flush']) {
+    $m->flush();
+}
index 5f890083122846eabe1f5e06cdead0997b2a9366..5608247e8de231e34bf2d2d186b9fe00bf02e322 100755 (executable)
@@ -1,36 +1,33 @@
 #!/usr/bin/php -Cq
 <?php
 
-       require_once(dirname(dirname(__FILE__)).'/settings/settings.php');
-       require_once(CONST_BasePath.'/lib/init-cmd.php');
+require_once(dirname(dirname(__FILE__)).'/settings/settings.php');
+require_once(CONST_BasePath.'/lib/init-cmd.php');
 
-        ini_set('memory_limit', '800M');
-        ini_set('display_errors', 'stderr');
+ini_set('memory_limit', '800M');
+ini_set('display_errors', 'stderr');
 
-        $aCMDOptions = array(
-                "Import country language data from osm wiki",
-                array('help', 'h', 0, 1, 0, 0, false, 'Show Help'),
-                array('quiet', 'q', 0, 1, 0, 0, 'bool', 'Quiet output'),
-                array('verbose', 'v', 0, 1, 0, 0, 'bool', 'Verbose output'),
-        );
-        getCmdOpt($_SERVER['argv'], $aCMDOptions, $aCMDResult, true, true);
+$aCMDOptions
+ = array(
+    "Import country language data from osm wiki",
+    array('help', 'h', 0, 1, 0, 0, false, 'Show Help'),
+    array('quiet', 'q', 0, 1, 0, 0, 'bool', 'Quiet output'),
+    array('verbose', 'v', 0, 1, 0, 0, 'bool', 'Verbose output'),
+   );
+getCmdOpt($_SERVER['argv'], $aCMDOptions, $aCMDResult, true, true);
 
-       include(CONST_InstallPath.'/settings/phrase_settings.php');
+include(CONST_InstallPath.'/settings/phrase_settings.php');
 
-       if (true)
-       {
-               $sURL = 'http://wiki.openstreetmap.org/wiki/Special:Export/Nominatim/Country_Codes';
-               $sWikiPageXML = file_get_contents($sURL);
-               if (preg_match_all('#\\| ([a-z]{2}) \\|\\| [^|]+\\|\\| ([a-z,]+)#', $sWikiPageXML, $aMatches, PREG_SET_ORDER))
-               {
-                       foreach($aMatches as $aMatch)
-                       {
-                               $aLanguages = explode(',', $aMatch[2]);
-                               foreach($aLanguages as $i => $s)
-                               {
-                                       $aLanguages[$i] = '"'.pg_escape_string($s).'"';
-                               }
-                               echo "UPDATE country_name set country_default_language_codes = '{".join(',',$aLanguages)."}' where country_code = '".pg_escape_string($aMatch[1])."';\n";
-                       }
-               }
-       }
+if (true) {
+    $sURL = 'http://wiki.openstreetmap.org/wiki/Special:Export/Nominatim/Country_Codes';
+    $sWikiPageXML = file_get_contents($sURL);
+    if (preg_match_all('#\\| ([a-z]{2}) \\|\\| [^|]+\\|\\| ([a-z,]+)#', $sWikiPageXML, $aMatches, PREG_SET_ORDER)) {
+        foreach ($aMatches as $aMatch) {
+            $aLanguages = explode(',', $aMatch[2]);
+            foreach ($aLanguages as $i => $s) {
+                $aLanguages[$i] = '"'.pg_escape_string($s).'"';
+            }
+            echo "UPDATE country_name set country_default_language_codes = '{".join(',', $aLanguages)."}' where country_code = '".pg_escape_string($aMatch[1])."';\n";
+        }
+    }
+}
index 8e527467a8f01c6db1d64982a61c958514f1442f..6138398bfd63e638dc1b1d0fd16b9e7a6aa588fd 100755 (executable)
@@ -1,21 +1,22 @@
 #!/usr/bin/php -Cq
 <?php
 
-       require_once(dirname(dirname(__FILE__)).'/settings/settings.php');
-       require_once(CONST_BasePath.'/lib/init-cmd.php');
-       ini_set('memory_limit', '800M');
-
-       $aCMDOptions = array(
-               "Create and setup nominatim search system",
-               array('help', 'h', 0, 1, 0, 0, false, 'Show Help'),
-               array('quiet', 'q', 0, 1, 0, 0, 'bool', 'Quiet output'),
-               array('verbose', 'v', 0, 1, 0, 0, 'bool', 'Verbose output'),
-
-               array('create-tables', '', 0, 1, 0, 0, 'bool', 'Create wikipedia tables'),
-               array('parse-articles', '', 0, 1, 0, 0, 'bool', 'Parse wikipedia articles'),
-               array('link', '', 0, 1, 0, 0, 'bool', 'Try to link to existing OSM ids'),
-       );
-       getCmdOpt($_SERVER['argv'], $aCMDOptions, $aCMDResult, true, true);
+require_once(dirname(dirname(__FILE__)).'/settings/settings.php');
+require_once(CONST_BasePath.'/lib/init-cmd.php');
+ini_set('memory_limit', '800M');
+
+$aCMDOptions
+ = array(
+    "Create and setup nominatim search system",
+    array('help', 'h', 0, 1, 0, 0, false, 'Show Help'),
+    array('quiet', 'q', 0, 1, 0, 0, 'bool', 'Quiet output'),
+    array('verbose', 'v', 0, 1, 0, 0, 'bool', 'Verbose output'),
+
+    array('create-tables', '', 0, 1, 0, 0, 'bool', 'Create wikipedia tables'),
+    array('parse-articles', '', 0, 1, 0, 0, 'bool', 'Parse wikipedia articles'),
+    array('link', '', 0, 1, 0, 0, 'bool', 'Try to link to existing OSM ids'),
+   );
+getCmdOpt($_SERVER['argv'], $aCMDOptions, $aCMDResult, true, true);
 
 /*
 $sTestPageText = <<<EOD
@@ -46,21 +47,20 @@ exit;
 */
 /*
 
-       $a = array();
-       $a[] = 'test';
+    $a = array();
+    $a[] = 'test';
 
-       $oDB &= getDB();
+    $oDB &= getDB();
 
-       if ($aCMDResult['drop-tables'])
-       {
-               $oDB->query('DROP TABLE wikipedia_article');
-               $oDB->query('DROP TABLE wikipedia_link');
-       }
+    if ($aCMDResult['drop-tables'])
+    {
+        $oDB->query('DROP TABLE wikipedia_article');
+        $oDB->query('DROP TABLE wikipedia_link');
+    }
 */
 
-       if ($aCMDResult['create-tables'])
-       {
-               $sSQL = <<<'EOD'
+if ($aCMDResult['create-tables']) {
+    $sSQL = <<<'EOD'
 CREATE TABLE wikipedia_article (
     language text NOT NULL,
     title text NOT NULL,
@@ -77,518 +77,469 @@ CREATE TABLE wikipedia_article (
     population bigint,
     website text
 );
-               $oDB->query($sSQL);
+        $oDB->query($sSQL);
 
-               $oDB->query("SELECT AddGeometryColumn('wikipedia_article', 'location', 4326, 'GEOMETRY', 2)");
+        $oDB->query("SELECT AddGeometryColumn('wikipedia_article', 'location', 4326, 'GEOMETRY', 2)");
 
-               $sSQL = <<<'EOD'
+        $sSQL = <<<'EOD'
 CREATE TABLE wikipedia_link (
   from_id INTEGER,
   to_name text
   );
 EOD;
-               $oDB->query($sSQL);
-       }
-
-       function degreesAndMinutesToDecimal($iDegrees, $iMinutes=0, $fSeconds=0, $sNSEW='N')
-       {
-               $sNSEW = strtoupper($sNSEW);
-               return ($sNSEW == 'S' || $sNSEW == 'W'?-1:1) * ((float)$iDegrees + (float)$iMinutes/60 + (float)$fSeconds/3600);
-       }
-
-       function _parseWikipediaContent($sPageText)
-       {
-               $sPageText = str_replace("\n", ' ', $sPageText);
-               $sPageText = preg_replace('#<!--.*?-->#m', '', $sPageText);
-               $sPageText = preg_replace('#<math>.*?<\\/math>#m', '', $sPageText);
-
-               $aPageText = preg_split('#({{|}}|\\[\\[|\\]\\]|[|])#', $sPageText, -1, PREG_SPLIT_DELIM_CAPTURE);
-
-               $aPageProperties = array();
-               $sPageBody = '';
-               $aTemplates = array();
-               $aLinks = array();
-
-               $aTemplateStack = array();
-               $aState = array('body');
-               foreach($aPageText as $i => $sPart)
-               {
-                       switch($sPart)
-                       {
-                       case '{{':
-                               array_unshift($aTemplateStack, array('', array()));
-                               array_unshift($aState, 'template');
-                               break;
-                       case '}}':
-                               if ($aState[0] == 'template' || $aState[0] == 'templateparam')
-                               {
-                                       $aTemplate = array_shift($aTemplateStack);
-                                       array_shift($aState);
-
-                                       $aTemplates[] = $aTemplate;
-
-                               }
-                               break;
-                       case '[[':
-                               $sLinkPage = '';
-                               $sLinkSyn = '';
-                               array_unshift($aState, 'link');
-                               break;
-                       case ']]':
-                               if ($aState[0] == 'link' || $aState[0] == 'linksynonim')
-                               {
-                                       if (!$sLinkSyn) $sLinkSyn = $sLinkPage;
-                                       if (substr($sLinkPage, 0, 6) == 'Image:') $sLinkSyn = substr($sLinkPage, 6);
-
-                                       $aLinks[] = array($sLinkPage, $sLinkSyn);
-
-                                       array_shift($aState);
-                                       switch($aState[0])
-                                       {
-                                       case 'template':
-                                               $aTemplateStack[0][0] .= trim($sPart);
-                                               break;
-                                       case 'templateparam':
-                                               $aTemplateStack[0][1][0] .= $sLinkSyn;
-                                               break;
-                                       case 'link':
-                                               $sLinkPage .= trim($sPart);
-                                               break;
-                                       case 'linksynonim':
-                                               $sLinkSyn .= $sPart;
-                                               break;
-                                       case 'body':
-                                               $sPageBody .= $sLinkSyn;
-                                               break;
-                                       default:
-                                               var_dump($aState, $sPageName, $aTemplateStack, $sPart, $aPageText);
-                                               fail('unknown state');
-                                       }
-                               }
-                               break;
-                       case '|':
-                               if ($aState[0] == 'template' || $aState[0] == 'templateparam')
-                               {
-                                       // Create a new template paramater
-                                       $aState[0] = 'templateparam';
-                                       array_unshift($aTemplateStack[0][1], '');
-                               }
-                               if ($aState[0] == 'link') $aState[0] = 'linksynonim';
-                               break;
-                       default:
-                               switch($aState[0])
-                               {
-                               case 'template':
-                                       $aTemplateStack[0][0] .= trim($sPart);
-                                       break;
-                               case 'templateparam':
-                                       $aTemplateStack[0][1][0] .= $sPart;
-                                       break;
-                               case 'link':
-                                       $sLinkPage .= trim($sPart);
-                                       break;
-                               case 'linksynonim':
-                                       $sLinkSyn .= $sPart;
-                                       break;
-                               case 'body':
-                                       $sPageBody .= $sPart;
-                                       break;
-                               default:
-                                       var_dump($aState, $aPageText);
-                                       fail('unknown state');
-                               }
-                               break;
-                       }
-               }
-               return $aTemplates;
-       }
-
-       function _templatesToProperties($aTemplates)
-       {
-               $aPageProperties = array();
-               foreach($aTemplates as $iTemplate => $aTemplate)
-               {
-                       $aParams = array();
-                       foreach(array_reverse($aTemplate[1]) as $iParam => $sParam)
-                       {
-                               if (($iPos = strpos($sParam, '=')) === FALSE)
-                               {
-                                       $aParams[] = trim($sParam);
-                               }
-                               else
-                               {
-                                       $aParams[trim(substr($sParam, 0, $iPos))] = trim(substr($sParam, $iPos+1));
-                               }
-                       }
-                       $aTemplates[$iTemplate][1] = $aParams;
-                       if (!isset($aPageProperties['sOfficialName']) && isset($aParams['official_name']) && $aParams['official_name']) $aPageProperties['sOfficialName'] = $aParams['official_name'];
-                       if (!isset($aPageProperties['iPopulation']) && isset($aParams['population']) && $aParams['population'] && preg_match('#^[0-9.,]+#', $aParams['population']))
-                       {
-                               $aPageProperties['iPopulation'] = (int)str_replace(array(',','.'), '', $aParams['population']);
-                       }
-                       if (!isset($aPageProperties['iPopulation']) && isset($aParams['population_total']) && $aParams['population_total'] && preg_match('#^[0-9.,]+#', $aParams['population_total']))
-                       {
-                               $aPageProperties['iPopulation'] = (int)str_replace(array(',','.'), '', $aParams['population_total']);
-                       }
-                       if (!isset($aPageProperties['iPopulation']) && isset($aParams['population_urban']) && $aParams['population_urban'] && preg_match('#^[0-9.,]+#', $aParams['population_urban']))
-                       {
-                               $aPageProperties['iPopulation'] = (int)str_replace(array(',','.'), '', $aParams['population_urban']);
-                       }
-                       if (!isset($aPageProperties['iPopulation']) && isset($aParams['population_estimate']) && $aParams['population_estimate'] && preg_match('#^[0-9.,]+#', $aParams['population_estimate']))
-                       {
-                               $aPageProperties['iPopulation'] = (int)str_replace(array(',','.'), '', $aParams['population_estimate']);
-                       }
-                       if (!isset($aPageProperties['sWebsite']) && isset($aParams['website']) && $aParams['website'])
-                       {
-                               if (preg_match('#^\\[?([^ \\]]+)[^\\]]*\\]?$#', $aParams['website'], $aMatch))
-                               {
-                                       $aPageProperties['sWebsite'] = $aMatch[1];
-                                       if (strpos($aPageProperties['sWebsite'],':/'.'/') === FALSE)
-                                       {
-                                               $aPageProperties['sWebsite'] = 'http:/'.'/'.$aPageProperties['sWebsite'];
-                                       }
-                               }
-                       }
-                       if (!isset($aPageProperties['sTopLevelDomain']) && isset($aParams['cctld']) && $aParams['cctld'])
-                       {
-                               $aPageProperties['sTopLevelDomain'] = str_replace(array('[',']','.'),'', $aParams['cctld']);
-                       }
-
-                       if (!isset($aPageProperties['sInfoboxType']) && strtolower(substr($aTemplate[0],0,7)) == 'infobox')
-                       {
-                               $aPageProperties['sInfoboxType'] = trim(substr($aTemplate[0],8));
-                               // $aPageProperties['aInfoboxParams'] = $aParams;
-                       }
-
-                       // Assume the first template with lots of params is the type (fallback for infobox)
-                       if (!isset($aPageProperties['sPossibleInfoboxType']) && sizeof($aParams) > 10)
-                       {
-                               $aPageProperties['sPossibleInfoboxType'] = trim($aTemplate[0]);
-                               // $aPageProperties['aInfoboxParams'] = $aParams;
-                       }
-
-                       // do we have a lat/lon
-                       if (!isset($aPageProperties['fLat']))
-                       {
-                               if (isset($aParams['latd']) && isset($aParams['longd']))
-                               {
-                                       $aPageProperties['fLat'] = degreesAndMinutesToDecimal($aParams['latd'], @$aParams['latm'], @$aParams['lats'], @$aParams['latNS']);
-                                       $aPageProperties['fLon'] = degreesAndMinutesToDecimal($aParams['longd'], @$aParams['longm'], @$aParams['longs'], @$aParams['longEW']);
-                               }
-                               if (isset($aParams['lat_degrees']) && isset($aParams['lat_degrees']))
-                               {
-                                       $aPageProperties['fLat'] = degreesAndMinutesToDecimal($aParams['lat_degrees'], @$aParams['lat_minutes'], @$aParams['lat_seconds'], @$aParams['lat_direction']);
-                                       $aPageProperties['fLon'] = degreesAndMinutesToDecimal($aParams['long_degrees'], @$aParams['long_minutes'], @$aParams['long_seconds'], @$aParams['long_direction']);
-                               }
-                               if (isset($aParams['latitude']) && isset($aParams['longitude']))
-                               {
-                                       if (preg_match('#[0-9.]+#', $aParams['latitude']) && preg_match('#[0-9.]+#', $aParams['longitude']))
-                                       {
-                                               $aPageProperties['fLat'] = (float)$aParams['latitude'];
-                                               $aPageProperties['fLon'] = (float)$aParams['longitude'];
-                                       }
-                               }
-                               if (strtolower($aTemplate[0]) == 'coord')
-                               {
-                                       if (isset($aParams[3]) && (strtoupper($aParams[3]) == 'N' || strtoupper($aParams[3]) == 'S'))
-                                       {
-                                               $aPageProperties['fLat'] = degreesAndMinutesToDecimal($aParams[0], $aParams[1], $aParams[2], $aParams[3]);
-                                               $aPageProperties['fLon'] = degreesAndMinutesToDecimal($aParams[4], $aParams[5], $aParams[6], $aParams[7]);
-                                       }
-                                       elseif (isset($aParams[0]) && isset($aParams[1]) && isset($aParams[2]) && (strtoupper($aParams[2]) == 'N' || strtoupper($aParams[2]) == 'S'))
-                                       {
-                                               $aPageProperties['fLat'] = degreesAndMinutesToDecimal($aParams[0], $aParams[1], 0, $aParams[2]);
-                                               $aPageProperties['fLon'] = degreesAndMinutesToDecimal($aParams[3], $aParams[4], 0, $aParams[5]);
-                                       }
-                                       else if (isset($aParams[0]) && isset($aParams[1]) && (strtoupper($aParams[1]) == 'N' || strtoupper($aParams[1]) == 'S'))
-                                       {
-                                               $aPageProperties['fLat'] = (strtoupper($aParams[1]) == 'N'?1:-1) * (float)$aParams[0];
-                                               $aPageProperties['fLon'] = (strtoupper($aParams[3]) == 'E'?1:-1) * (float)$aParams[2];
-                                       }
-                                       else if (isset($aParams[0]) && is_numeric($aParams[0]) && isset($aParams[1]) && is_numeric($aParams[1]))
-                                       {
-                                               $aPageProperties['fLat'] = (float)$aParams[0];
-                                               $aPageProperties['fLon'] = (float)$aParams[1];
-                                       }
-                               }
-                               if (isset($aParams['Latitude']) && isset($aParams['Longitude']))
-                               {
-                                       $aParams['Latitude'] = str_replace('&nbsp;',' ',$aParams['Latitude']);
-                                       $aParams['Longitude'] = str_replace('&nbsp;',' ',$aParams['Longitude']);
-                                       if (preg_match('#^([0-9]+)°( ([0-9]+)′)? ([NS]) to ([0-9]+)°( ([0-9]+)′)? ([NS])#', $aParams['Latitude'], $aMatch))
-                                       {
-                                               $aPageProperties['fLat'] =
-                                                       (degreesAndMinutesToDecimal($aMatch[1], $aMatch[3], 0, $aMatch[4])
-                                                       +degreesAndMinutesToDecimal($aMatch[5], $aMatch[7], 0, $aMatch[8])) / 2;
-                                       }
-                                       else if (preg_match('#^([0-9]+)°( ([0-9]+)′)? ([NS])#', $aParams['Latitude'], $aMatch))
-                                       {
-                                               $aPageProperties['fLat'] = degreesAndMinutesToDecimal($aMatch[1], $aMatch[3], 0, $aMatch[4]);
-                                       }
-
-                                       if (preg_match('#^([0-9]+)°( ([0-9]+)′)? ([EW]) to ([0-9]+)°( ([0-9]+)′)? ([EW])#', $aParams['Longitude'], $aMatch))
-                                       {
-                                               $aPageProperties['fLon'] =
-                                                       (degreesAndMinutesToDecimal($aMatch[1], $aMatch[3], 0, $aMatch[4])
-                                                       +degreesAndMinutesToDecimal($aMatch[5], $aMatch[7], 0, $aMatch[8])) / 2;
-                                       }
-                                       else if (preg_match('#^([0-9]+)°( ([0-9]+)′)? ([EW])#', $aParams['Longitude'], $aMatch))
-                                       {
-                                               $aPageProperties['fLon'] = degreesAndMinutesToDecimal($aMatch[1], $aMatch[3], 0, $aMatch[4]);
-                                       }
-                               }
-                       }
-               }
-               if (isset($aPageProperties['sPossibleInfoboxType']))
-               {
-                       if (!isset($aPageProperties['sInfoboxType'])) $aPageProperties['sInfoboxType'] = '#'.$aPageProperties['sPossibleInfoboxType'];
-                       unset($aPageProperties['sPossibleInfoboxType']);
-               }
-               return $aPageProperties;
-       }
-
-       if (isset($aCMDResult['parse-wikipedia']))
-       {
-               $oDB =& getDB();
-               $aArticleNames = $oDB->getCol('select page_title from content where page_namespace = 0 and page_id %10 = '.$aCMDResult['parse-wikipedia'].' and (page_content ilike \'%{{Coord%\' or (page_content ilike \'%lat%\' and page_content ilike \'%lon%\'))');
-//             $aArticleNames = $oDB->getCol($sSQL = 'select page_title from content where page_namespace = 0 and (page_content ilike \'%{{Coord%\' or (page_content ilike \'%lat%\' and page_content ilike \'%lon%\')) and page_title in (\'Virginia\')');
-               foreach($aArticleNames as $sArticleName)
-               {
-                       $sPageText = $oDB->getOne('select page_content from content where page_namespace = 0 and page_title = \''.pg_escape_string($sArticleName).'\'');
-                       $aP = _templatesToProperties(_parseWikipediaContent($sPageText));
-
-                       if (isset($aP['sInfoboxType']))
-                       {
-                               $aP['sInfoboxType'] = preg_replace('#\\s+#',' ',$aP['sInfoboxType']);
-                               $sSQL = 'update wikipedia_article set ';
-                               $sSQL .= 'infobox_type = \''.pg_escape_string($aP['sInfoboxType']).'\'';
-                               $sSQL .= ' where language = \'en\' and title = \''.pg_escape_string($sArticleName).'\';';
-                               $oDB->query($sSQL);
-                       }
-                       if (isset($aP['iPopulation']))
-                       {
-                               $sSQL = 'update wikipedia_article set ';
-                               $sSQL .= 'population = \''.pg_escape_string($aP['iPopulation']).'\'';
-                               $sSQL .= ' where language = \'en\' and title = \''.pg_escape_string($sArticleName).'\';';
-                               $oDB->query($sSQL);
-                       }
-                       if (isset($aP['sWebsite']))
-                       {
-                               $sSQL = 'update wikipedia_article set ';
-                               $sSQL .= 'website = \''.pg_escape_string($aP['sWebsite']).'\'';
-                               $sSQL .= ' where language = \'en\' and title = \''.pg_escape_string($sArticleName).'\';';
-                               $oDB->query($sSQL);
-                       }
-                       if (isset($aP['fLat']) && ($aP['fLat']!='-0' || $aP['fLon']!='-0'))
-                       {
-                               if (!isset($aP['sInfoboxType'])) $aP['sInfoboxType'] = '';
-                               echo $sArticleName.'|'.$aP['sInfoboxType'].'|'.$aP['fLat'].'|'.$aP['fLon'] ."\n";
-                               $sSQL = 'update wikipedia_article set ';
-                               $sSQL .= 'lat = \''.pg_escape_string($aP['fLat']).'\',';
-                               $sSQL .= 'lon = \''.pg_escape_string($aP['fLon']).'\'';
-                               $sSQL .= ' where language = \'en\' and title = \''.pg_escape_string($sArticleName).'\';';
-                               $oDB->query($sSQL);
-                       }
-               }
-       }
-
-       function nominatimXMLStart($hParser, $sName, $aAttr)
-       {
-               global $aNominatRecords;
-               switch($sName)
-               {
-               case 'PLACE':
-                       $aNominatRecords[] = $aAttr;
-                       break;
-               }
-       }
-
-       function nominatimXMLEnd($hParser, $sName)
-       {
-       }
-
-
-       if (isset($aCMDResult['link']))
-       {
-               $oDB =& getDB();
-               $aWikiArticles = $oDB->getAll("select * from wikipedia_article where language = 'en' and lat is not null and osm_type is null and totalcount < 31 order by importance desc limit 200000");
-
-               // If you point this script at production OSM you will be blocked
-               $sNominatimBaseURL = 'http://SEVERNAME/search.php';
-
-               foreach($aWikiArticles as $aRecord)
-               {
-                       $aRecord['name'] = str_replace('_',' ',$aRecord['title']);
-
-                       $sURL = $sNominatimBaseURL.'?format=xml&accept-language=en';
-
-                       echo "\n-- ".$aRecord['name'].", ".$aRecord['infobox_type']."\n";
-                       $fMaxDist = 0.0000001;
-                       $bUnknown = false;
-                       switch(strtolower($aRecord['infobox_type']))
-                       {
-                       case 'former country':
-                               continue 2;
-                       case 'sea':
-                               $fMaxDist = 60; // effectively turn it off
-                               $sURL .= "&viewbox=".($aRecord['lon']-$fMaxDist).",".($aRecord['lat']+$fMaxDist).",".($aRecord['lon']+$fMaxDist).",".($aRecord['lat']-$fMaxDist);
-                               break;
-                       case 'country':
-                       case 'island':
-                       case 'islands':
-                       case 'continent':
-                               $fMaxDist = 60; // effectively turn it off
-                               $sURL .= "&featuretype=country";
-                               $sURL .= "&viewbox=".($aRecord['lon']-$fMaxDist).",".($aRecord['lat']+$fMaxDist).",".($aRecord['lon']+$fMaxDist).",".($aRecord['lat']-$fMaxDist);
-                               break;
-                       case 'prefecture japan':
-                               $aRecord['name'] = trim(str_replace(' Prefecture',' ', $aRecord['name']));
-                       case 'state':
-                       case '#us state':
-                       case 'county':
-                       case 'u.s. state':
-                       case 'u.s. state symbols':
-                       case 'german state':
-                       case 'province or territory of canada';
-                       case 'indian jurisdiction';
-                       case 'province';
-                       case 'french region':
-                       case 'region of italy':
-                       case 'kommune':
-                       case '#australia state or territory':
-                       case 'russian federal subject':
-                               $fMaxDist = 4;
-                               $sURL .= "&featuretype=state";
-                               $sURL .= "&viewbox=".($aRecord['lon']-$fMaxDist).",".($aRecord['lat']+$fMaxDist).",".($aRecord['lon']+$fMaxDist).",".($aRecord['lat']-$fMaxDist);
-                               break;
-                       case 'protected area':
-                               $fMaxDist = 1;
-                               $sURL .= "&nearlat=".$aRecord['lat'];
-                               $sURL .= "&nearlon=".$aRecord['lon'];
-                               $sURL .= "&viewbox=".($aRecord['lon']-$fMaxDist).",".($aRecord['lat']+$fMaxDist).",".($aRecord['lon']+$fMaxDist).",".($aRecord['lat']-$fMaxDist);
-                               break;
-                       case 'settlement':
-                               $bUnknown = true;
-                       case 'french commune':
-                       case 'italian comune':
-                       case 'uk place':
-                       case 'italian comune':
-                       case 'australian place':
-                       case 'german place':
-                       case '#geobox':
-                       case 'u.s. county':
-                       case 'municipality':
-                       case 'city japan':
-                       case 'russian inhabited locality':
-                       case 'finnish municipality/land area':
-                       case 'england county':
-                       case 'israel municipality':
-                       case 'russian city':
-                       case 'city':
-                               $fMaxDist = 0.2;
-                               $sURL .= "&featuretype=settlement";
-                               $sURL .= "&viewbox=".($aRecord['lon']-0.5).",".($aRecord['lat']+0.5).",".($aRecord['lon']+0.5).",".($aRecord['lat']-0.5);
-                               break;
-                       case 'mountain':
-                       case 'mountain pass':
-                       case 'river':
-                       case 'lake':
-                       case 'airport':
-                               $fMaxDist = 0.2;
-                               $sURL .= "&viewbox=".($aRecord['lon']-0.5).",".($aRecord['lat']+0.5).",".($aRecord['lon']+0.5).",".($aRecord['lat']-0.5);
-
-                       case 'ship begin':
-                               $fMaxDist = 0.1;
-                               $aTypes = array('wreck');
-                               $sURL .= "&viewbox=".($aRecord['lon']-0.01).",".($aRecord['lat']+0.01).",".($aRecord['lon']+0.01).",".($aRecord['lat']-0.01);
-                               $sURL .= "&nearlat=".$aRecord['lat'];
-                               $sURL .= "&nearlon=".$aRecord['lon'];
-                               break;
-                       case 'road':
-                       case 'university':
-                       case 'company':
-                       case 'department':
-                               $fMaxDist = 0.005;
-                               $sURL .= "&viewbox=".($aRecord['lon']-0.01).",".($aRecord['lat']+0.01).",".($aRecord['lon']+0.01).",".($aRecord['lat']-0.01);
-                               $sURL .= "&bounded=1";
-                               $sURL .= "&nearlat=".$aRecord['lat'];
-                               $sURL .= "&nearlon=".$aRecord['lon'];
-                               break;
-                       default:
-                               $bUnknown = true;
-                               $fMaxDist = 0.005;
-                               $sURL .= "&viewbox=".($aRecord['lon']-0.01).",".($aRecord['lat']+0.01).",".($aRecord['lon']+0.01).",".($aRecord['lat']-0.01);
-//                             $sURL .= "&bounded=1";
-                               $sURL .= "&nearlat=".$aRecord['lat'];
-                               $sURL .= "&nearlon=".$aRecord['lon'];
-                               echo "-- Unknown: ".$aRecord['infobox_type']."\n";
-                               break;
-                       }
-                       $sNameURL = $sURL.'&q='.urlencode($aRecord['name']);
-
-                       var_Dump($sNameURL);
-                       $sXML = file_get_contents($sNameURL);
-
-                       $aNominatRecords = array();
-                       $hXMLParser = xml_parser_create();
-                       xml_set_element_handler($hXMLParser, 'nominatimXMLStart', 'nominatimXMLEnd');
-                       xml_parse($hXMLParser, $sXML, true);
-                       xml_parser_free($hXMLParser);
-
-                       if (!isset($aNominatRecords[0]))
-                       {
-                               $aNameParts = preg_split('#[(,]#',$aRecord['name']);
-                               if (sizeof($aNameParts) > 1)
-                               {
-                                       $sNameURL = $sURL.'&q='.urlencode(trim($aNameParts[0]));
-                                       var_Dump($sNameURL);
-                                       $sXML = file_get_contents($sNameURL);
-
-                                       $aNominatRecords = array();
-                                       $hXMLParser = xml_parser_create();
-                                       xml_set_element_handler($hXMLParser, 'nominatimXMLStart', 'nominatimXMLEnd');
-                                       xml_parse($hXMLParser, $sXML, true);
-                                       xml_parser_free($hXMLParser);#
-                               }
-                       }
-
-                       // assume first is best/right
-                       for($i = 0; $i < sizeof($aNominatRecords); $i++)
-                       {
-                               $fDiff = ($aRecord['lat']-$aNominatRecords[$i]['LAT']) * ($aRecord['lat']-$aNominatRecords[$i]['LAT']);
-                               $fDiff += ($aRecord['lon']-$aNominatRecords[$i]['LON']) * ($aRecord['lon']-$aNominatRecords[$i]['LON']);
-                               $fDiff = sqrt($fDiff);
-                               if ($bUnknown) {
-                                       // If it was an unknown type base it on the rank of the found result
-                                       $iRank = (int)$aNominatRecords[$i]['PLACE_RANK'];
-                                       if ($iRank <= 4) $fMaxDist = 2;
-                                       elseif ($iRank <= 8) $fMaxDist = 1;
-                                       elseif ($iRank <= 10) $fMaxDist = 0.8;
-                                       elseif ($iRank <= 12) $fMaxDist = 0.6;
-                                       elseif ($iRank <= 17) $fMaxDist = 0.2;
-                                       elseif ($iRank <= 18) $fMaxDist = 0.1;
-                                       elseif ($iRank <= 22) $fMaxDist = 0.02;
-                                       elseif ($iRank <= 26) $fMaxDist = 0.001;
-                                       else $fMaxDist = 0.001;
-                               }
-                               echo "-- FOUND \"".substr($aNominatRecords[$i]['DISPLAY_NAME'],0,50)."\", ".$aNominatRecords[$i]['CLASS'].", ".$aNominatRecords[$i]['TYPE'].", ".$aNominatRecords[$i]['PLACE_RANK'].", ".$aNominatRecords[$i]['OSM_TYPE']." (dist:$fDiff, max:$fMaxDist)\n";
-                               if ($fDiff > $fMaxDist)
-                               {
-                                       echo "-- Diff too big $fDiff (max: $fMaxDist)".$aRecord['lat'].','.$aNominatRecords[$i]['LAT'].' & '.$aRecord['lon'].','.$aNominatRecords[$i]['LON']." \n";
-                               }
-                               else
-                               {
-                                       $sSQL = "update wikipedia_article set osm_type=";
-                                       switch($aNominatRecords[$i]['OSM_TYPE'])
-                                       {
-                                       case 'relation': $sSQL .= "'R'"; break;
-                                       case 'way': $sSQL .= "'W'"; break;
-                                       case 'node': $sSQL .= "'N'"; break;
-                                       }
-                                       $sSQL .= ", osm_id=".$aNominatRecords[$i]['OSM_ID']." where language = '".pg_escape_string($aRecord['language'])."' and title = '".pg_escape_string($aRecord['title'])."'";
-                                       $oDB->query($sSQL);
-                                       break;
-                               }
-                       }
-               }
-       }
+    $oDB->query($sSQL);
+}
+
+
+function degreesAndMinutesToDecimal($iDegrees, $iMinutes = 0, $fSeconds = 0, $sNSEW = 'N')
+{
+    $sNSEW = strtoupper($sNSEW);
+    return ($sNSEW == 'S' || $sNSEW == 'W'?-1:1) * ((float)$iDegrees + (float)$iMinutes/60 + (float)$fSeconds/3600);
+}
+
+
+function _parseWikipediaContent($sPageText)
+{
+    $sPageText = str_replace("\n", ' ', $sPageText);
+    $sPageText = preg_replace('#<!--.*?-->#m', '', $sPageText);
+    $sPageText = preg_replace('#<math>.*?<\\/math>#m', '', $sPageText);
+
+    $aPageText = preg_split('#({{|}}|\\[\\[|\\]\\]|[|])#', $sPageText, -1, PREG_SPLIT_DELIM_CAPTURE);
+
+    $aPageProperties = array();
+    $sPageBody = '';
+    $aTemplates = array();
+    $aLinks = array();
+
+    $aTemplateStack = array();
+    $aState = array('body');
+    foreach ($aPageText as $i => $sPart) {
+        switch ($sPart) {
+            case '{{':
+                array_unshift($aTemplateStack, array('', array()));
+                array_unshift($aState, 'template');
+                break;
+            case '}}':
+                if ($aState[0] == 'template' || $aState[0] == 'templateparam') {
+                    $aTemplate = array_shift($aTemplateStack);
+                    array_shift($aState);
+
+                    $aTemplates[] = $aTemplate;
+                }
+                break;
+            case '[[':
+                $sLinkPage = '';
+                $sLinkSyn = '';
+                array_unshift($aState, 'link');
+                break;
+            case ']]':
+                if ($aState[0] == 'link' || $aState[0] == 'linksynonim') {
+                    if (!$sLinkSyn) $sLinkSyn = $sLinkPage;
+                    if (substr($sLinkPage, 0, 6) == 'Image:') $sLinkSyn = substr($sLinkPage, 6);
+
+                    $aLinks[] = array($sLinkPage, $sLinkSyn);
+
+                    array_shift($aState);
+                    switch ($aState[0]) {
+                        case 'template':
+                            $aTemplateStack[0][0] .= trim($sPart);
+                            break;
+                        case 'templateparam':
+                            $aTemplateStack[0][1][0] .= $sLinkSyn;
+                            break;
+                        case 'link':
+                            $sLinkPage .= trim($sPart);
+                            break;
+                        case 'linksynonim':
+                            $sLinkSyn .= $sPart;
+                            break;
+                        case 'body':
+                            $sPageBody .= $sLinkSyn;
+                            break;
+                        default:
+                            var_dump($aState, $sPageName, $aTemplateStack, $sPart, $aPageText);
+                            fail('unknown state');
+                    }
+                }
+                break;
+            case '|':
+                if ($aState[0] == 'template' || $aState[0] == 'templateparam') {
+                    // Create a new template paramater
+                    $aState[0] = 'templateparam';
+                    array_unshift($aTemplateStack[0][1], '');
+                }
+                if ($aState[0] == 'link') $aState[0] = 'linksynonim';
+                break;
+            default:
+                switch ($aState[0]) {
+                    case 'template':
+                        $aTemplateStack[0][0] .= trim($sPart);
+                        break;
+                    case 'templateparam':
+                        $aTemplateStack[0][1][0] .= $sPart;
+                        break;
+                    case 'link':
+                        $sLinkPage .= trim($sPart);
+                        break;
+                    case 'linksynonim':
+                        $sLinkSyn .= $sPart;
+                        break;
+                    case 'body':
+                        $sPageBody .= $sPart;
+                        break;
+                    default:
+                        var_dump($aState, $aPageText);
+                        fail('unknown state');
+                }
+                break;
+        }
+    }
+    return $aTemplates;
+}
+
+function _templatesToProperties($aTemplates)
+{
+    $aPageProperties = array();
+    foreach ($aTemplates as $iTemplate => $aTemplate) {
+        $aParams = array();
+        foreach (array_reverse($aTemplate[1]) as $iParam => $sParam) {
+            if (($iPos = strpos($sParam, '=')) === false) {
+                $aParams[] = trim($sParam);
+            } else {
+                $aParams[trim(substr($sParam, 0, $iPos))] = trim(substr($sParam, $iPos+1));
+            }
+        }
+        $aTemplates[$iTemplate][1] = $aParams;
+        if (!isset($aPageProperties['sOfficialName']) && isset($aParams['official_name']) && $aParams['official_name']) $aPageProperties['sOfficialName'] = $aParams['official_name'];
+        if (!isset($aPageProperties['iPopulation']) && isset($aParams['population']) && $aParams['population'] && preg_match('#^[0-9.,]+#', $aParams['population'])) {
+            $aPageProperties['iPopulation'] = (int)str_replace(array(',', '.'), '', $aParams['population']);
+        }
+        if (!isset($aPageProperties['iPopulation']) && isset($aParams['population_total']) && $aParams['population_total'] && preg_match('#^[0-9.,]+#', $aParams['population_total'])) {
+            $aPageProperties['iPopulation'] = (int)str_replace(array(',', '.'), '', $aParams['population_total']);
+        }
+        if (!isset($aPageProperties['iPopulation']) && isset($aParams['population_urban']) && $aParams['population_urban'] && preg_match('#^[0-9.,]+#', $aParams['population_urban'])) {
+            $aPageProperties['iPopulation'] = (int)str_replace(array(',', '.'), '', $aParams['population_urban']);
+        }
+        if (!isset($aPageProperties['iPopulation']) && isset($aParams['population_estimate']) && $aParams['population_estimate'] && preg_match('#^[0-9.,]+#', $aParams['population_estimate'])) {
+            $aPageProperties['iPopulation'] = (int)str_replace(array(',', '.'), '', $aParams['population_estimate']);
+        }
+        if (!isset($aPageProperties['sWebsite']) && isset($aParams['website']) && $aParams['website']) {
+            if (preg_match('#^\\[?([^ \\]]+)[^\\]]*\\]?$#', $aParams['website'], $aMatch)) {
+                $aPageProperties['sWebsite'] = $aMatch[1];
+                if (strpos($aPageProperties['sWebsite'], ':/'.'/') === false) {
+                    $aPageProperties['sWebsite'] = 'http:/'.'/'.$aPageProperties['sWebsite'];
+                }
+            }
+        }
+        if (!isset($aPageProperties['sTopLevelDomain']) && isset($aParams['cctld']) && $aParams['cctld']) {
+            $aPageProperties['sTopLevelDomain'] = str_replace(array('[', ']', '.'), '', $aParams['cctld']);
+        }
+
+        if (!isset($aPageProperties['sInfoboxType']) && strtolower(substr($aTemplate[0], 0, 7)) == 'infobox') {
+            $aPageProperties['sInfoboxType'] = trim(substr($aTemplate[0], 8));
+            // $aPageProperties['aInfoboxParams'] = $aParams;
+        }
+
+        // Assume the first template with lots of params is the type (fallback for infobox)
+        if (!isset($aPageProperties['sPossibleInfoboxType']) && sizeof($aParams) > 10) {
+            $aPageProperties['sPossibleInfoboxType'] = trim($aTemplate[0]);
+            // $aPageProperties['aInfoboxParams'] = $aParams;
+        }
+
+        // do we have a lat/lon
+        if (!isset($aPageProperties['fLat'])) {
+            if (isset($aParams['latd']) && isset($aParams['longd'])) {
+                $aPageProperties['fLat'] = degreesAndMinutesToDecimal($aParams['latd'], @$aParams['latm'], @$aParams['lats'], @$aParams['latNS']);
+                $aPageProperties['fLon'] = degreesAndMinutesToDecimal($aParams['longd'], @$aParams['longm'], @$aParams['longs'], @$aParams['longEW']);
+            }
+            if (isset($aParams['lat_degrees']) && isset($aParams['lat_degrees'])) {
+                $aPageProperties['fLat'] = degreesAndMinutesToDecimal($aParams['lat_degrees'], @$aParams['lat_minutes'], @$aParams['lat_seconds'], @$aParams['lat_direction']);
+                $aPageProperties['fLon'] = degreesAndMinutesToDecimal($aParams['long_degrees'], @$aParams['long_minutes'], @$aParams['long_seconds'], @$aParams['long_direction']);
+            }
+            if (isset($aParams['latitude']) && isset($aParams['longitude'])) {
+                if (preg_match('#[0-9.]+#', $aParams['latitude']) && preg_match('#[0-9.]+#', $aParams['longitude'])) {
+                    $aPageProperties['fLat'] = (float)$aParams['latitude'];
+                    $aPageProperties['fLon'] = (float)$aParams['longitude'];
+                }
+            }
+            if (strtolower($aTemplate[0]) == 'coord') {
+                if (isset($aParams[3]) && (strtoupper($aParams[3]) == 'N' || strtoupper($aParams[3]) == 'S')) {
+                    $aPageProperties['fLat'] = degreesAndMinutesToDecimal($aParams[0], $aParams[1], $aParams[2], $aParams[3]);
+                    $aPageProperties['fLon'] = degreesAndMinutesToDecimal($aParams[4], $aParams[5], $aParams[6], $aParams[7]);
+                } elseif (isset($aParams[0]) && isset($aParams[1]) && isset($aParams[2]) && (strtoupper($aParams[2]) == 'N' || strtoupper($aParams[2]) == 'S')) {
+                    $aPageProperties['fLat'] = degreesAndMinutesToDecimal($aParams[0], $aParams[1], 0, $aParams[2]);
+                    $aPageProperties['fLon'] = degreesAndMinutesToDecimal($aParams[3], $aParams[4], 0, $aParams[5]);
+                } elseif (isset($aParams[0]) && isset($aParams[1]) && (strtoupper($aParams[1]) == 'N' || strtoupper($aParams[1]) == 'S')) {
+                    $aPageProperties['fLat'] = (strtoupper($aParams[1]) == 'N'?1:-1) * (float)$aParams[0];
+                    $aPageProperties['fLon'] = (strtoupper($aParams[3]) == 'E'?1:-1) * (float)$aParams[2];
+                } elseif (isset($aParams[0]) && is_numeric($aParams[0]) && isset($aParams[1]) && is_numeric($aParams[1])) {
+                    $aPageProperties['fLat'] = (float)$aParams[0];
+                    $aPageProperties['fLon'] = (float)$aParams[1];
+                }
+            }
+            if (isset($aParams['Latitude']) && isset($aParams['Longitude'])) {
+                $aParams['Latitude'] = str_replace('&nbsp;', ' ', $aParams['Latitude']);
+                $aParams['Longitude'] = str_replace('&nbsp;', ' ', $aParams['Longitude']);
+                if (preg_match('#^([0-9]+)°( ([0-9]+)′)? ([NS]) to ([0-9]+)°( ([0-9]+)′)? ([NS])#', $aParams['Latitude'], $aMatch)) {
+                    $aPageProperties['fLat'] =
+                        (degreesAndMinutesToDecimal($aMatch[1], $aMatch[3], 0, $aMatch[4])
+                        +degreesAndMinutesToDecimal($aMatch[5], $aMatch[7], 0, $aMatch[8])) / 2;
+                } elseif (preg_match('#^([0-9]+)°( ([0-9]+)′)? ([NS])#', $aParams['Latitude'], $aMatch)) {
+                    $aPageProperties['fLat'] = degreesAndMinutesToDecimal($aMatch[1], $aMatch[3], 0, $aMatch[4]);
+                }
+
+                if (preg_match('#^([0-9]+)°( ([0-9]+)′)? ([EW]) to ([0-9]+)°( ([0-9]+)′)? ([EW])#', $aParams['Longitude'], $aMatch)) {
+                    $aPageProperties['fLon'] =
+                        (degreesAndMinutesToDecimal($aMatch[1], $aMatch[3], 0, $aMatch[4])
+                        +degreesAndMinutesToDecimal($aMatch[5], $aMatch[7], 0, $aMatch[8])) / 2;
+                } elseif (preg_match('#^([0-9]+)°( ([0-9]+)′)? ([EW])#', $aParams['Longitude'], $aMatch)) {
+                    $aPageProperties['fLon'] = degreesAndMinutesToDecimal($aMatch[1], $aMatch[3], 0, $aMatch[4]);
+                }
+            }
+        }
+    }
+    if (isset($aPageProperties['sPossibleInfoboxType'])) {
+        if (!isset($aPageProperties['sInfoboxType'])) $aPageProperties['sInfoboxType'] = '#'.$aPageProperties['sPossibleInfoboxType'];
+        unset($aPageProperties['sPossibleInfoboxType']);
+    }
+    return $aPageProperties;
+}
+
+if (isset($aCMDResult['parse-wikipedia'])) {
+    $oDB =& getDB();
+    $aArticleNames = $oDB->getCol('select page_title from content where page_namespace = 0 and page_id %10 = '.$aCMDResult['parse-wikipedia'].' and (page_content ilike \'%{{Coord%\' or (page_content ilike \'%lat%\' and page_content ilike \'%lon%\'))');
+    // $aArticleNames = $oDB->getCol($sSQL = 'select page_title from content where page_namespace = 0 and (page_content ilike \'%{{Coord%\' or (page_content ilike \'%lat%\' and page_content ilike \'%lon%\')) and page_title in (\'Virginia\')');
+    foreach ($aArticleNames as $sArticleName) {
+        $sPageText = $oDB->getOne('select page_content from content where page_namespace = 0 and page_title = \''.pg_escape_string($sArticleName).'\'');
+        $aP = _templatesToProperties(_parseWikipediaContent($sPageText));
+
+        if (isset($aP['sInfoboxType'])) {
+            $aP['sInfoboxType'] = preg_replace('#\\s+#', ' ', $aP['sInfoboxType']);
+            $sSQL = 'update wikipedia_article set ';
+            $sSQL .= 'infobox_type = \''.pg_escape_string($aP['sInfoboxType']).'\'';
+            $sSQL .= ' where language = \'en\' and title = \''.pg_escape_string($sArticleName).'\';';
+            $oDB->query($sSQL);
+        }
+        if (isset($aP['iPopulation'])) {
+            $sSQL = 'update wikipedia_article set ';
+            $sSQL .= 'population = \''.pg_escape_string($aP['iPopulation']).'\'';
+            $sSQL .= ' where language = \'en\' and title = \''.pg_escape_string($sArticleName).'\';';
+            $oDB->query($sSQL);
+        }
+        if (isset($aP['sWebsite'])) {
+            $sSQL = 'update wikipedia_article set ';
+            $sSQL .= 'website = \''.pg_escape_string($aP['sWebsite']).'\'';
+            $sSQL .= ' where language = \'en\' and title = \''.pg_escape_string($sArticleName).'\';';
+            $oDB->query($sSQL);
+        }
+        if (isset($aP['fLat']) && ($aP['fLat']!='-0' || $aP['fLon']!='-0')) {
+            if (!isset($aP['sInfoboxType'])) $aP['sInfoboxType'] = '';
+            echo $sArticleName.'|'.$aP['sInfoboxType'].'|'.$aP['fLat'].'|'.$aP['fLon'] ."\n";
+            $sSQL = 'update wikipedia_article set ';
+            $sSQL .= 'lat = \''.pg_escape_string($aP['fLat']).'\',';
+            $sSQL .= 'lon = \''.pg_escape_string($aP['fLon']).'\'';
+            $sSQL .= ' where language = \'en\' and title = \''.pg_escape_string($sArticleName).'\';';
+            $oDB->query($sSQL);
+        }
+    }
+}
+
+
+function nominatimXMLStart($hParser, $sName, $aAttr)
+{
+    global $aNominatRecords;
+    switch ($sName) {
+        case 'PLACE':
+            $aNominatRecords[] = $aAttr;
+            break;
+    }
+}
+
+
+function nominatimXMLEnd($hParser, $sName)
+{
+}
+
+
+if (isset($aCMDResult['link'])) {
+    $oDB =& getDB();
+    $aWikiArticles = $oDB->getAll("select * from wikipedia_article where language = 'en' and lat is not null and osm_type is null and totalcount < 31 order by importance desc limit 200000");
+
+    // If you point this script at production OSM you will be blocked
+    $sNominatimBaseURL = 'http://SEVERNAME/search.php';
+
+    foreach ($aWikiArticles as $aRecord) {
+        $aRecord['name'] = str_replace('_', ' ', $aRecord['title']);
+
+        $sURL = $sNominatimBaseURL.'?format=xml&accept-language=en';
+
+        echo "\n-- ".$aRecord['name'].", ".$aRecord['infobox_type']."\n";
+        $fMaxDist = 0.0000001;
+        $bUnknown = false;
+        switch (strtolower($aRecord['infobox_type'])) {
+            case 'former country':
+                continue 2;
+            case 'sea':
+                $fMaxDist = 60; // effectively turn it off
+                $sURL .= "&viewbox=".($aRecord['lon']-$fMaxDist).",".($aRecord['lat']+$fMaxDist).",".($aRecord['lon']+$fMaxDist).",".($aRecord['lat']-$fMaxDist);
+                break;
+            case 'country':
+            case 'island':
+            case 'islands':
+            case 'continent':
+                $fMaxDist = 60; // effectively turn it off
+                $sURL .= "&featuretype=country";
+                $sURL .= "&viewbox=".($aRecord['lon']-$fMaxDist).",".($aRecord['lat']+$fMaxDist).",".($aRecord['lon']+$fMaxDist).",".($aRecord['lat']-$fMaxDist);
+                break;
+            case 'prefecture japan':
+                $aRecord['name'] = trim(str_replace(' Prefecture', ' ', $aRecord['name']));
+                // intentionally no break
+            case 'state':
+            case '#us state':
+            case 'county':
+            case 'u.s. state':
+            case 'u.s. state symbols':
+            case 'german state':
+            case 'province or territory of canada':
+            case 'indian jurisdiction':
+            case 'province':
+            case 'french region':
+            case 'region of italy':
+            case 'kommune':
+            case '#australia state or territory':
+            case 'russian federal subject':
+                $fMaxDist = 4;
+                $sURL .= "&featuretype=state";
+                $sURL .= "&viewbox=".($aRecord['lon']-$fMaxDist).",".($aRecord['lat']+$fMaxDist).",".($aRecord['lon']+$fMaxDist).",".($aRecord['lat']-$fMaxDist);
+                break;
+            case 'protected area':
+                $fMaxDist = 1;
+                $sURL .= "&nearlat=".$aRecord['lat'];
+                $sURL .= "&nearlon=".$aRecord['lon'];
+                $sURL .= "&viewbox=".($aRecord['lon']-$fMaxDist).",".($aRecord['lat']+$fMaxDist).",".($aRecord['lon']+$fMaxDist).",".($aRecord['lat']-$fMaxDist);
+                break;
+            case 'settlement':
+                $bUnknown = true;
+                // intentionally no break
+            case 'french commune':
+            case 'italian comune':
+            case 'uk place':
+            case 'italian comune':
+            case 'australian place':
+            case 'german place':
+            case '#geobox':
+            case 'u.s. county':
+            case 'municipality':
+            case 'city japan':
+            case 'russian inhabited locality':
+            case 'finnish municipality/land area':
+            case 'england county':
+            case 'israel municipality':
+            case 'russian city':
+            case 'city':
+                $fMaxDist = 0.2;
+                $sURL .= "&featuretype=settlement";
+                $sURL .= "&viewbox=".($aRecord['lon']-0.5).",".($aRecord['lat']+0.5).",".($aRecord['lon']+0.5).",".($aRecord['lat']-0.5);
+                break;
+            case 'mountain':
+            case 'mountain pass':
+            case 'river':
+            case 'lake':
+            case 'airport':
+                $fMaxDist = 0.2;
+                $sURL .= "&viewbox=".($aRecord['lon']-0.5).",".($aRecord['lat']+0.5).",".($aRecord['lon']+0.5).",".($aRecord['lat']-0.5);
+                break;
+            case 'ship begin':
+                $fMaxDist = 0.1;
+                $aTypes = array('wreck');
+                $sURL .= "&viewbox=".($aRecord['lon']-0.01).",".($aRecord['lat']+0.01).",".($aRecord['lon']+0.01).",".($aRecord['lat']-0.01);
+                $sURL .= "&nearlat=".$aRecord['lat'];
+                $sURL .= "&nearlon=".$aRecord['lon'];
+                break;
+            case 'road':
+            case 'university':
+            case 'company':
+            case 'department':
+                $fMaxDist = 0.005;
+                $sURL .= "&viewbox=".($aRecord['lon']-0.01).",".($aRecord['lat']+0.01).",".($aRecord['lon']+0.01).",".($aRecord['lat']-0.01);
+                $sURL .= "&bounded=1";
+                $sURL .= "&nearlat=".$aRecord['lat'];
+                $sURL .= "&nearlon=".$aRecord['lon'];
+                break;
+            default:
+                $bUnknown = true;
+                $fMaxDist = 0.005;
+                $sURL .= "&viewbox=".($aRecord['lon']-0.01).",".($aRecord['lat']+0.01).",".($aRecord['lon']+0.01).",".($aRecord['lat']-0.01);
+                // $sURL .= "&bounded=1";
+                $sURL .= "&nearlat=".$aRecord['lat'];
+                $sURL .= "&nearlon=".$aRecord['lon'];
+                echo "-- Unknown: ".$aRecord['infobox_type']."\n";
+                break;
+        }
+        $sNameURL = $sURL.'&q='.urlencode($aRecord['name']);
+
+        var_Dump($sNameURL);
+        $sXML = file_get_contents($sNameURL);
+
+        $aNominatRecords = array();
+        $hXMLParser = xml_parser_create();
+        xml_set_element_handler($hXMLParser, 'nominatimXMLStart', 'nominatimXMLEnd');
+        xml_parse($hXMLParser, $sXML, true);
+        xml_parser_free($hXMLParser);
+
+        if (!isset($aNominatRecords[0])) {
+            $aNameParts = preg_split('#[(,]#', $aRecord['name']);
+            if (sizeof($aNameParts) > 1) {
+                $sNameURL = $sURL.'&q='.urlencode(trim($aNameParts[0]));
+                var_Dump($sNameURL);
+                $sXML = file_get_contents($sNameURL);
+
+                $aNominatRecords = array();
+                $hXMLParser = xml_parser_create();
+                xml_set_element_handler($hXMLParser, 'nominatimXMLStart', 'nominatimXMLEnd');
+                xml_parse($hXMLParser, $sXML, true);
+                xml_parser_free($hXMLParser);
+            }
+        }
+
+        // assume first is best/right
+        for ($i = 0; $i < sizeof($aNominatRecords); $i++) {
+            $fDiff = ($aRecord['lat']-$aNominatRecords[$i]['LAT']) * ($aRecord['lat']-$aNominatRecords[$i]['LAT']);
+            $fDiff += ($aRecord['lon']-$aNominatRecords[$i]['LON']) * ($aRecord['lon']-$aNominatRecords[$i]['LON']);
+            $fDiff = sqrt($fDiff);
+            if ($bUnknown) {
+                // If it was an unknown type base it on the rank of the found result
+                $iRank = (int)$aNominatRecords[$i]['PLACE_RANK'];
+                if ($iRank <= 4) $fMaxDist = 2;
+                elseif ($iRank <= 8) $fMaxDist = 1;
+                elseif ($iRank <= 10) $fMaxDist = 0.8;
+                elseif ($iRank <= 12) $fMaxDist = 0.6;
+                elseif ($iRank <= 17) $fMaxDist = 0.2;
+                elseif ($iRank <= 18) $fMaxDist = 0.1;
+                elseif ($iRank <= 22) $fMaxDist = 0.02;
+                elseif ($iRank <= 26) $fMaxDist = 0.001;
+                else $fMaxDist = 0.001;
+            }
+            echo "-- FOUND \"".substr($aNominatRecords[$i]['DISPLAY_NAME'], 0, 50)."\", ".$aNominatRecords[$i]['CLASS'].", ".$aNominatRecords[$i]['TYPE'].", ".$aNominatRecords[$i]['PLACE_RANK'].", ".$aNominatRecords[$i]['OSM_TYPE']." (dist:$fDiff, max:$fMaxDist)\n";
+            if ($fDiff > $fMaxDist) {
+                echo "-- Diff too big $fDiff (max: $fMaxDist)".$aRecord['lat'].','.$aNominatRecords[$i]['LAT'].' & '.$aRecord['lon'].','.$aNominatRecords[$i]['LON']." \n";
+            } else {
+                $sSQL = "update wikipedia_article set osm_type=";
+                switch ($aNominatRecords[$i]['OSM_TYPE']) {
+                    case 'relation':
+                        $sSQL .= "'R'";
+                        break;
+                    case 'way':
+                        $sSQL .= "'W'";
+                        break;
+                    case 'node':
+                        $sSQL .= "'N'";
+                        break;
+                }
+                $sSQL .= ", osm_id=".$aNominatRecords[$i]['OSM_ID']." where language = '".pg_escape_string($aRecord['language'])."' and title = '".pg_escape_string($aRecord['title'])."'";
+                $oDB->query($sSQL);
+                break;
+            }
+        }
+    }
+}
index 0a15e2d016909a7bbd5657a4e08dac28a3b40151..f053499c0d830d6c3f2d550df7564fb9ef373a3c 100755 (executable)
@@ -11,32 +11,32 @@ echo "CREATE TABLE wikipedia_redirect (language text, from_title text, to_title
 
 for i in "${language[@]}"
 do
-       wget http://dumps.wikimedia.org/${i}wiki/latest/${i}wiki-latest-page.sql.gz
-       wget http://dumps.wikimedia.org/${i}wiki/latest/${i}wiki-latest-pagelinks.sql.gz
-       wget http://dumps.wikimedia.org/${i}wiki/latest/${i}wiki-latest-langlinks.sql.gz
-       wget http://dumps.wikimedia.org/${i}wiki/latest/${i}wiki-latest-redirect.sql.gz
+    wget http://dumps.wikimedia.org/${i}wiki/latest/${i}wiki-latest-page.sql.gz
+    wget http://dumps.wikimedia.org/${i}wiki/latest/${i}wiki-latest-pagelinks.sql.gz
+    wget http://dumps.wikimedia.org/${i}wiki/latest/${i}wiki-latest-langlinks.sql.gz
+    wget http://dumps.wikimedia.org/${i}wiki/latest/${i}wiki-latest-redirect.sql.gz
 done
 
 for i in "${language[@]}"
 do
-  gzip -dc ${i}wiki-latest-pagelinks.sql.gz | sed "s/\`pagelinks\`/\`${i}pagelinks\`/g" | $mysql2pgsqlcmd | $psqlcmd
-  gzip -dc ${i}wiki-latest-page.sql.gz | sed "s/\`page\`/\`${i}page\`/g" | $mysql2pgsqlcmd | $psqlcmd
-  gzip -dc ${i}wiki-latest-langlinks.sql.gz | sed "s/\`langlinks\`/\`${i}langlinks\`/g" | $mysql2pgsqlcmd | $psqlcmd
-  gzip -dc ${i}wiki-latest-redirect.sql.gz | sed "s/\`redirect\`/\`${i}redirect\`/g" | $mysql2pgsqlcmd | $psqlcmd
+    gzip -dc ${i}wiki-latest-pagelinks.sql.gz | sed "s/\`pagelinks\`/\`${i}pagelinks\`/g" | $mysql2pgsqlcmd | $psqlcmd
+    gzip -dc ${i}wiki-latest-page.sql.gz | sed "s/\`page\`/\`${i}page\`/g" | $mysql2pgsqlcmd | $psqlcmd
+    gzip -dc ${i}wiki-latest-langlinks.sql.gz | sed "s/\`langlinks\`/\`${i}langlinks\`/g" | $mysql2pgsqlcmd | $psqlcmd
+    gzip -dc ${i}wiki-latest-redirect.sql.gz | sed "s/\`redirect\`/\`${i}redirect\`/g" | $mysql2pgsqlcmd | $psqlcmd
 done
 
 for i in "${language[@]}"
 do
-  echo "create table ${i}pagelinkcount as select pl_title as title,count(*) as count from ${i}pagelinks where pl_namespace = 0 group by pl_title;" | $psqlcmd
-  echo "insert into linkcounts select '${i}',pl_title,count(*) from ${i}pagelinks where pl_namespace = 0 group by pl_title;" | $psqlcmd
-  echo "insert into wikipedia_redirect select '${i}',page_title,rd_title from ${i}redirect join ${i}page on (rd_from = page_id) where page_namespace = 0 and rd_namespace = 0;" | $psqlcmd
-  echo "alter table ${i}pagelinkcount add column othercount integer;" | $psqlcmd
-  echo "update ${i}pagelinkcount set othercount = 0;" | $psqlcmd
-  for j in "${language[@]}"
-  do
-    echo "update ${i}pagelinkcount set othercount = ${i}pagelinkcount.othercount + x.count from (select page_title as title,count from ${i}langlinks join ${i}page on (ll_from = page_id) join ${j}pagelinkcount on (ll_lang = '${j}' and ll_title = title)) as x where x.title = ${i}pagelinkcount.title;" | $psqlcmd
-  done
-  echo "insert into wikipedia_article select '${i}', title, count, othercount, count+othercount from ${i}pagelinkcount;" | $psqlcmd
+    echo "create table ${i}pagelinkcount as select pl_title as title,count(*) as count from ${i}pagelinks where pl_namespace = 0 group by pl_title;" | $psqlcmd
+    echo "insert into linkcounts select '${i}',pl_title,count(*) from ${i}pagelinks where pl_namespace = 0 group by pl_title;" | $psqlcmd
+    echo "insert into wikipedia_redirect select '${i}',page_title,rd_title from ${i}redirect join ${i}page on (rd_from = page_id) where page_namespace = 0 and rd_namespace = 0;" | $psqlcmd
+    echo "alter table ${i}pagelinkcount add column othercount integer;" | $psqlcmd
+    echo "update ${i}pagelinkcount set othercount = 0;" | $psqlcmd
+    for j in "${language[@]}"
+    do
+        echo "update ${i}pagelinkcount set othercount = ${i}pagelinkcount.othercount + x.count from (select page_title as title,count from ${i}langlinks join ${i}page on (ll_from = page_id) join ${j}pagelinkcount on (ll_lang = '${j}' and ll_title = title)) as x where x.title = ${i}pagelinkcount.title;" | $psqlcmd
+    done
+    echo "insert into wikipedia_article select '${i}', title, count, othercount, count+othercount from ${i}pagelinkcount;" | $psqlcmd
 done
 
 echo "update wikipedia_article set importance = log(totalcount)/log((select max(totalcount) from wikipedia_article))" | $psqlcmd
index a3a4848e9d0c5eb62031a1690b7b598c115ca44e..8dc2c8203b3309dcc677972cb64a9fea2019756b 100755 (executable)
@@ -1,61 +1,52 @@
 #!/usr/bin/php -Cq
 <?php
 
-       require_once(dirname(dirname(__FILE__)).'/settings/settings.php');
-       require_once(CONST_BasePath.'/lib/init-cmd.php');
-       ini_set('memory_limit', '800M');
-
-       $aCMDOptions = array(
-               "Create and setup nominatim search system",
-               array('help', 'h', 0, 1, 0, 0, false, 'Show Help'),
-               array('quiet', 'q', 0, 1, 0, 0, 'bool', 'Quiet output'),
-               array('verbose', 'v', 0, 1, 0, 0, 'bool', 'Verbose output'),
-
-               array('parse-tiger', '', 0, 1, 1, 1, 'realpath', 'Convert tiger edge files to nominatim sql import - datafiles from 2011 or later (source: edges directory of tiger data)'),
-       );
-       getCmdOpt($_SERVER['argv'], $aCMDOptions, $aCMDResult, true, true);
-
-
-       if (isset($aCMDResult['parse-tiger']))
-       {
-               if (!file_exists(CONST_Tiger_Data_Path)) mkdir(CONST_Tiger_Data_Path);
-
-               $sTempDir = tempnam('/tmp', 'tiger');
-               unlink($sTempDir);
-               mkdir($sTempDir);
-
-               foreach(glob($aCMDResult['parse-tiger'].'/tl_20??_?????_edges.zip', 0) as $sImportFile)
-               {
-                       set_time_limit(30);
-                       preg_match('#([0-9]{5})_(.*)#',basename($sImportFile), $aMatch);
-                       $sCountyID = $aMatch[1];
-                       echo "Processing ".$sCountyID."...\n";
-                       $sUnzipCmd = "unzip -d $sTempDir $sImportFile";
-                       exec($sUnzipCmd);
-                       $sShapeFile = $sTempDir.'/'.basename($sImportFile, '.zip').'.shp';
-                       if (!file_exists($sShapeFile))
-                       {
-                               echo "Failed unzip ($sImportFile)\n";
-                       }
-                       else
-                       {
-                               $sParseCmd = CONST_BasePath.'/utils/tigerAddressImport.py '.$sShapeFile;
-                               exec($sParseCmd);
-                               $sOsmFile = $sTempDir.'/'.basename($sImportFile, '.zip').'.osm1.osm';
-                               if (!file_exists($sOsmFile))
-                               {
-                                       echo "Failed parse ($sImportFile)\n";
-                               }
-                               else
-                               {
-                                       copy($sOsmFile, CONST_Tiger_Data_Path.'/'.$sCountyID.'.sql');
-                               }
-                       }
-                       // Cleanup
-                       foreach(glob($sTempDir.'/*') as $sTmpFile)
-                       {
-                               unlink($sTmpFile);
-                       }
-
-               }
-       }
+require_once(dirname(dirname(__FILE__)).'/settings/settings.php');
+require_once(CONST_BasePath.'/lib/init-cmd.php');
+ini_set('memory_limit', '800M');
+
+$aCMDOptions
+ = array(
+    "Create and setup nominatim search system",
+    array('help', 'h', 0, 1, 0, 0, false, 'Show Help'),
+    array('quiet', 'q', 0, 1, 0, 0, 'bool', 'Quiet output'),
+    array('verbose', 'v', 0, 1, 0, 0, 'bool', 'Verbose output'),
+
+    array('parse-tiger', '', 0, 1, 1, 1, 'realpath', 'Convert tiger edge files to nominatim sql import - datafiles from 2011 or later (source: edges directory of tiger data)'),
+   );
+getCmdOpt($_SERVER['argv'], $aCMDOptions, $aCMDResult, true, true);
+
+
+if (isset($aCMDResult['parse-tiger'])) {
+    if (!file_exists(CONST_Tiger_Data_Path)) mkdir(CONST_Tiger_Data_Path);
+
+    $sTempDir = tempnam('/tmp', 'tiger');
+    unlink($sTempDir);
+    mkdir($sTempDir);
+
+    foreach (glob($aCMDResult['parse-tiger'].'/tl_20??_?????_edges.zip', 0) as $sImportFile) {
+        set_time_limit(30);
+        preg_match('#([0-9]{5})_(.*)#', basename($sImportFile), $aMatch);
+        $sCountyID = $aMatch[1];
+        echo "Processing ".$sCountyID."...\n";
+        $sUnzipCmd = "unzip -d $sTempDir $sImportFile";
+        exec($sUnzipCmd);
+        $sShapeFile = $sTempDir.'/'.basename($sImportFile, '.zip').'.shp';
+        if (!file_exists($sShapeFile)) {
+            echo "Failed unzip ($sImportFile)\n";
+        } else {
+            $sParseCmd = CONST_BasePath.'/utils/tigerAddressImport.py '.$sShapeFile;
+            exec($sParseCmd);
+            $sOsmFile = $sTempDir.'/'.basename($sImportFile, '.zip').'.osm1.osm';
+            if (!file_exists($sOsmFile)) {
+                echo "Failed parse ($sImportFile)\n";
+            } else {
+                copy($sOsmFile, CONST_Tiger_Data_Path.'/'.$sCountyID.'.sql');
+            }
+        }
+        // Cleanup
+        foreach (glob($sTempDir.'/*') as $sTmpFile) {
+            unlink($sTmpFile);
+        }
+    }
+}
index 919486adc340503051d10a9d0cdfdb8ab086c7bd..85ec87374dd9ce2c8e0191f6a2f86e893aff31e4 100755 (executable)
@@ -1,56 +1,51 @@
 #!/usr/bin/php -Cq
 <?php
 
-       require_once(dirname(dirname(__FILE__)).'/settings/settings.php');
-       require_once(CONST_BasePath.'/lib/init-cmd.php');
-       require_once(CONST_BasePath.'/lib/Geocode.php');
-       ini_set('memory_limit', '800M');
-
-       $aCMDOptions = array(
-               "Query database from command line. Returns search result as JSON.",
-               array('help', 'h', 0, 1, 0, 0, false, 'Show Help'),
-               array('quiet', 'q', 0, 1, 0, 0, 'bool', 'Quiet output'),
-               array('verbose', 'v', 0, 1, 0, 0, 'bool', 'Verbose output'),
-
-        array('search', '', 0, 1, 1, 1, 'string', 'Search for given term or coordinate'),
-
-        array('accept-language', '', 0, 1, 1, 1, 'string', 'Preferred language order for showing search results'),
-        array('bounded', '', 0, 1, 0, 0, 'bool', 'Restrict results to given viewbox'),
-        array('nodedupe', '', 0, 1, 0, 0, 'bool', 'Do not remove duplicate results'),
-        array('limit', '', 0, 1, 1, 1, 'int', 'Maximum number of results returned (default: 10)'),
-        array('exclude_place_ids', '', 0, 1, 1, 1, 'string', 'Comma-separated list of place ids to exclude from results'),
-        array('featureType', '', 0, 1, 1, 1, 'string', 'Restrict results to certain features (country, state,city,settlement)'),
-        array('countrycodes', '', 0, 1, 1, 1, 'string', 'Comma-separated list of countries to restrict search to'),
-        array('viewbox', '', 0, 1, 1, 1, 'string', 'Prefer results in given view box')
-    );
-    getCmdOpt($_SERVER['argv'], $aCMDOptions, $aCMDResult, true, true);
-
-    $oDB =& getDB();
-
-    if (isset($aCMDResult['search']) && $aCMDResult['search'])
-    {
-        if (isset($aCMDResult['bounded'])) $aCMDResult['bounded'] = 'true';
-        if (isset($aCMDResult['nodedupe'])) $aCMDResult['dedupe'] = 'false';
-
-        $oGeocode = new Geocode($oDB);
-        if (isset($aCMDResult['accept-language']) && $aCMDResult['accept-language'])
-            $oGeocode->setLanguagePreference(getPreferredLanguages($aCMDResult['accept-language']));
-        else
-            $oGeocode->setLanguagePreference(getPreferredLanguages());
-        $oGeocode->loadParamArray($aCMDResult);
-        $oGeocode->setQuery($aCMDResult['search']);
-
-        $aSearchResults = $oGeocode->lookup();
-
-        if (version_compare(phpversion(), "5.4.0", '<'))
-            echo json_encode($aSearchResults);
-        else
-            echo json_encode($aSearchResults, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE)."\n";
+require_once(dirname(dirname(__FILE__)).'/settings/settings.php');
+require_once(CONST_BasePath.'/lib/init-cmd.php');
+require_once(CONST_BasePath.'/lib/Geocode.php');
+require_once(CONST_BasePath.'/lib/ParameterParser.php');
+ini_set('memory_limit', '800M');
+
+$aCMDOptions
+= array(
+   "Query database from command line. Returns search result as JSON.",
+   array('help', 'h', 0, 1, 0, 0, false, 'Show Help'),
+   array('quiet', 'q', 0, 1, 0, 0, 'bool', 'Quiet output'),
+   array('verbose', 'v', 0, 1, 0, 0, 'bool', 'Verbose output'),
+
+   array('search', '', 0, 1, 1, 1, 'string', 'Search for given term or coordinate'),
+
+   array('accept-language', '', 0, 1, 1, 1, 'string', 'Preferred language order for showing search results'),
+   array('bounded', '', 0, 1, 0, 0, 'bool', 'Restrict results to given viewbox'),
+   array('nodedupe', '', 0, 1, 0, 0, 'bool', 'Do not remove duplicate results'),
+   array('limit', '', 0, 1, 1, 1, 'int', 'Maximum number of results returned (default: 10)'),
+   array('exclude_place_ids', '', 0, 1, 1, 1, 'string', 'Comma-separated list of place ids to exclude from results'),
+   array('featureType', '', 0, 1, 1, 1, 'string', 'Restrict results to certain features (country, state,city,settlement)'),
+   array('countrycodes', '', 0, 1, 1, 1, 'string', 'Comma-separated list of countries to restrict search to'),
+   array('viewbox', '', 0, 1, 1, 1, 'string', 'Prefer results in given view box')
+  );
+getCmdOpt($_SERVER['argv'], $aCMDOptions, $aCMDResult, true, true);
+
+$oDB =& getDB();
+$oParams = new Nominatim\ParameterParser($aCMDResult);
+
+if ($oParams->getBool('search')) {
+    if (isset($aCMDResult['nodedupe'])) $aCMDResult['dedupe'] = 'false';
+
+    $oGeocode = new Nominatim\Geocode($oDB);
+
+    $oGeocode->setLanguagePreference($oParams->getPreferredLanguages(false));
+    $oGeocode->loadParamArray($oParams);
+    $oGeocode->setQuery($aCMDResult['search']);
+
+    $aSearchResults = $oGeocode->lookup();
+
+    if (version_compare(phpversion(), "5.4.0", '<')) {
+        echo json_encode($aSearchResults);
+    } else {
+        echo json_encode($aSearchResults, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE)."\n";
     }
-    else
-    {
-        showUsage($aCMDOptions, true);
-    }
-    
-
-
+} else {
+    showUsage($aCMDOptions, true);
+}
index 8464677d134ded396f7255079c5f1af19c9c284f..70a92e9b589d5f38285faab7502ede56bee58077 100755 (executable)
@@ -1,78 +1,68 @@
 #!/usr/bin/php -Cq
 <?php
 
-       // Apache log file
-       $sFile = "sample.log.txt";
-       $sHost1 = 'http://mq-open-search-lm02.ihost.aol.com:8000/nominatim/v1';
-       $sHost2 = 'http://mq-open-search-lm03.ihost.aol.com:8000/nominatim/v1';
+$sFile = "sample.log.txt"; // Apache log file
+$sHost1 = 'http://mq-open-search-lm02.ihost.aol.com:8000/nominatim/v1';
+$sHost2 = 'http://mq-open-search-lm03.ihost.aol.com:8000/nominatim/v1';
 
 
-       $sHost1Escaped = str_replace('/', '\\/', $sHost1);
-       $sHost2Escaped = str_replace('/', '\\/', $sHost2);
+$sHost1Escaped = str_replace('/', '\\/', $sHost1);
+$sHost2Escaped = str_replace('/', '\\/', $sHost2);
 
-       $aToDo = array(251, 293, 328, 399.1, 455.1, 479, 496, 499, 574, 609, 702, 790, 846, 865, 878, 894, 902, 961, 980);
+$aToDo = array(251, 293, 328, 399.1, 455.1, 479, 496, 499, 574, 609, 702, 790, 846, 865, 878, 894, 902, 961, 980);
 
-       $hFile = @fopen($sFile, "r");
-       if (!$hFile)
-       {
-               echo "Unable to open file: $sFile\n";
-               exit;
-       }
+$hFile = @fopen($sFile, "r");
+if (!$hFile) {
+    echo "Unable to open file: $sFile\n";
+    exit;
+}
 
-       $i = 0;
-       while (($sLine = fgets($hFile, 10000)) !== false)
-       {
-               $i++;
-               if (!in_array($i, $aToDo)) continue;
+$i = 0;
+while (($sLine = fgets($hFile, 10000)) !== false) {
+    $i++;
+    if (!in_array($i, $aToDo)) continue;
 
-               if (preg_match('#"GET (.*) HTTP/1.[01]"#', $sLine, $aResult))
-               {
-                       $sURL1 = $sHost1.$aResult[1];
-                       $sURL2 = $sHost2.$aResult[1];
+    if (preg_match('#"GET (.*) HTTP/1.[01]"#', $sLine, $aResult)) {
+        $sURL1 = $sHost1.$aResult[1];
+        $sURL2 = $sHost2.$aResult[1];
 
-                       $sRes1 = '';
-                       $k = 0;
-                       while(!$sRes1 && $k < 10)
-                       {
-                               $sRes1 = file_get_contents($sURL1);
-                               $k++;
-                               if (!$sRes1) sleep(10);
-                       }
-                       $sRes2 = file_get_contents($sURL2);
+        $sRes1 = '';
+        $k = 0;
+        while (!$sRes1 && $k < 10) {
+            $sRes1 = file_get_contents($sURL1);
+            $k++;
+            if (!$sRes1) sleep(10);
+        }
+        $sRes2 = file_get_contents($sURL2);
 
-                       // Strip out the things that will always change
-                       $sRes1 =  preg_replace('# timestamp=\'[^\']*\'#', '', $sRes1);
-                       $sRes1 =  str_replace($sHost1, '', $sRes1);
-                       $sRes1 =  str_replace($sHost1Escaped, '', $sRes1);
-                       $sRes2 =  preg_replace('# timestamp=\'[^\']*\'#', '', $sRes2);
-                       $sRes2 =  str_replace($sHost2, '', $sRes2);
-                       $sRes2 =  str_replace($sHost2Escaped, '', $sRes2);
+        // Strip out the things that will always change
+        $sRes1 =  preg_replace('# timestamp=\'[^\']*\'#', '', $sRes1);
+        $sRes1 =  str_replace($sHost1, '', $sRes1);
+        $sRes1 =  str_replace($sHost1Escaped, '', $sRes1);
+        $sRes2 =  preg_replace('# timestamp=\'[^\']*\'#', '', $sRes2);
+        $sRes2 =  str_replace($sHost2, '', $sRes2);
+        $sRes2 =  str_replace($sHost2Escaped, '', $sRes2);
 
-                       if ($sRes1 != $sRes2)
-                       {
-                               echo "$i:\n";
-                               var_dump($sURL1, $sURL2);
+        if ($sRes1 != $sRes2) {
+            echo "$i:\n";
+            var_dump($sURL1, $sURL2);
 
-                               $sRes = $sURL1.":\n";
-                               for ($j = 0; $j < strlen($sRes1); $j+=40)
-                               {
-                                       $sRes  .= substr($sRes1, $j, 40)."\n";
-                               }
-                               file_put_contents('log/'.$i.'.1', $sRes);
+            $sRes = $sURL1.":\n";
+            for ($j = 0; $j < strlen($sRes1); $j+=40) {
+                $sRes .= substr($sRes1, $j, 40)."\n";
+            }
+            file_put_contents('log/'.$i.'.1', $sRes);
 
-                               $sRes = $sURL2.":\n";
-                               for ($j = 0; $j < strlen($sRes2); $j+=40)
-                               {
-                                       $sRes  .= substr($sRes2, $j, 40)."\n";
-                               }
-                               file_put_contents('log/'.$i.'.2', $sRes);
-                       }
-                       echo ".\n";
-               }
-               else
-               {
-                       var_dump($sLine);
-               }
-       }
+            $sRes = $sURL2.":\n";
+            for ($j = 0; $j < strlen($sRes2); $j+=40) {
+                $sRes .= substr($sRes2, $j, 40)."\n";
+            }
+            file_put_contents('log/'.$i.'.2', $sRes);
+        }
+        echo ".\n";
+    } else {
+        var_dump($sLine);
+    }
+}
 
-       fclose($hFile);
+fclose($hFile);
index 25e1435671b69b115c79d07c9e4b62717d6b0d2d..7706b60b36387927611ef9271b110047d7528aa1 100755 (executable)
 #!/usr/bin/php -Cq
 <?php
 
-       require_once(dirname(dirname(__FILE__)).'/settings/settings.php');
-       require_once(CONST_BasePath.'/lib/init-cmd.php');
-       ini_set('memory_limit', '800M');
-
-       $aCMDOptions = array(
-               "Create and setup nominatim search system",
-               array('help', 'h', 0, 1, 0, 0, false, 'Show Help'),
-               array('quiet', 'q', 0, 1, 0, 0, 'bool', 'Quiet output'),
-               array('verbose', 'v', 0, 1, 0, 0, 'bool', 'Verbose output'),
-
-               array('osm-file', '', 0, 1, 1, 1, 'realpath', 'File to import'),
-               array('threads', '', 0, 1, 1, 1, 'int', 'Number of threads (where possible)'),
-
-               array('all', '', 0, 1, 0, 0, 'bool', 'Do the complete process'),
-
-               array('create-db', '', 0, 1, 0, 0, 'bool', 'Create nominatim db'),
-               array('setup-db', '', 0, 1, 0, 0, 'bool', 'Build a blank nominatim db'),
-               array('import-data', '', 0, 1, 0, 0, 'bool', 'Import a osm file'),
-               array('osm2pgsql-cache', '', 0, 1, 1, 1, 'int', 'Cache size used by osm2pgsql'),
-               array('create-functions', '', 0, 1, 0, 0, 'bool', 'Create functions'),
-               array('enable-diff-updates', '', 0, 1, 0, 0, 'bool', 'Turn on the code required to make diff updates work'),
-               array('enable-debug-statements', '', 0, 1, 0, 0, 'bool', 'Include debug warning statements in pgsql commands'),
-               array('ignore-errors', '', 0, 1, 0, 0, 'bool', 'Continue import even when errors in SQL are present (EXPERT)'),
-               array('create-tables', '', 0, 1, 0, 0, 'bool', 'Create main tables'),
-               array('create-partition-tables', '', 0, 1, 0, 0, 'bool', 'Create required partition tables'),
-               array('create-partition-functions', '', 0, 1, 0, 0, 'bool', 'Create required partition triggers'),
-               array('no-partitions', '', 0, 1, 0, 0, 'bool', "Do not partition search indices (speeds up import of single country extracts)"),
-               array('import-wikipedia-articles', '', 0, 1, 0, 0, 'bool', 'Import wikipedia article dump'),
-               array('load-data', '', 0, 1, 0, 0, 'bool', 'Copy data to live tables from import table'),
-               array('disable-token-precalc', '', 0, 1, 0, 0, 'bool', 'Disable name precalculation (EXPERT)'),
-               array('import-tiger-data', '', 0, 1, 0, 0, 'bool', 'Import tiger data (not included in \'all\')'),
-               array('calculate-postcodes', '', 0, 1, 0, 0, 'bool', 'Calculate postcode centroids'),
-               array('osmosis-init', '', 0, 1, 0, 0, 'bool', 'Generate default osmosis configuration'),
-               array('index', '', 0, 1, 0, 0, 'bool', 'Index the data'),
-               array('index-noanalyse', '', 0, 1, 0, 0, 'bool', 'Do not perform analyse operations during index (EXPERT)'),
-               array('create-search-indices', '', 0, 1, 0, 0, 'bool', 'Create additional indices required for search and update'),
-               array('drop', '', 0, 1, 0, 0, 'bool', 'Drop tables needed for updates, making the database readonly (EXPERIMENTAL)'),
-       );
-       getCmdOpt($_SERVER['argv'], $aCMDOptions, $aCMDResult, true, true);
-
-       $bDidSomething = false;
-
-       // Check if osm-file is set and points to a valid file if --all or --import-data is given
-       if ($aCMDResult['import-data'] || $aCMDResult['all'])
-       {
-               if (!isset($aCMDResult['osm-file']))
-               {
-                       fail('missing --osm-file for data import');
-               }
-
-               if (!file_exists($aCMDResult['osm-file']))
-               {
-                       fail('the path supplied to --osm-file does not exist');
-               }
-
-               if (!is_readable($aCMDResult['osm-file']))
-               {
-                       fail('osm-file "'.$aCMDResult['osm-file'].'" not readable');
-               }
-       }
-
-
-       // This is a pretty hard core default - the number of processors in the box - 1
-       $iInstances = isset($aCMDResult['threads'])?$aCMDResult['threads']:(getProcessorCount()-1);
-       if ($iInstances < 1)
-       {
-               $iInstances = 1;
-               echo "WARNING: resetting threads to $iInstances\n";
-       }
-       if ($iInstances > getProcessorCount())
-       {
-               $iInstances = getProcessorCount();
-               echo "WARNING: resetting threads to $iInstances\n";
-       }
-
-       // Assume we can steal all the cache memory in the box (unless told otherwise)
-       if (isset($aCMDResult['osm2pgsql-cache']))
-       {
-               $iCacheMemory = $aCMDResult['osm2pgsql-cache'];
-       }
-       else
-       {
-               $iCacheMemory = getCacheMemoryMB();
-       }
-
-       $aDSNInfo = DB::parseDSN(CONST_Database_DSN);
-       if (!isset($aDSNInfo['port']) || !$aDSNInfo['port']) $aDSNInfo['port'] = 5432;
-
-       if ($aCMDResult['create-db'] || $aCMDResult['all'])
-       {
-               echo "Create DB\n";
-               $bDidSomething = true;
-               $oDB = DB::connect(CONST_Database_DSN, false);
-               if (!PEAR::isError($oDB))
-               {
-                       fail('database already exists ('.CONST_Database_DSN.')');
-               }
-               passthruCheckReturn('createdb -E UTF-8 -p '.$aDSNInfo['port'].' '.$aDSNInfo['database']);
-       }
-
-       if ($aCMDResult['setup-db'] || $aCMDResult['all'])
-       {
-               echo "Setup DB\n";
-               $bDidSomething = true;
-               // TODO: path detection, detection memory, etc.
-
-               $oDB =& getDB();
-
-               $fPostgresVersion = getPostgresVersion($oDB);
-               echo 'Postgres version found: '.$fPostgresVersion."\n";
-
-               if ($fPostgresVersion < 9.1)
-               {
-                       fail("Minimum supported version of Postgresql is 9.1.");
-               }
-
-               pgsqlRunScript('CREATE EXTENSION IF NOT EXISTS hstore');
-               pgsqlRunScript('CREATE EXTENSION IF NOT EXISTS postgis');
-
-               // For extratags and namedetails the hstore_to_json converter is
-               // needed which is only available from Postgresql 9.3+. For older
-               // versions add a dummy function that returns nothing.
-               $iNumFunc = chksql($oDB->getOne("select count(*) from pg_proc where proname = 'hstore_to_json'"));
-
-               if ($iNumFunc == 0)
-               {
-                       pgsqlRunScript("create function hstore_to_json(dummy hstore) returns text AS 'select null::text' language sql immutable");
-                       echo "WARNING: Postgresql is too old. extratags and namedetails API not available.";
-               }
-
-               $fPostgisVersion = getPostgisVersion($oDB);
-               echo 'Postgis version found: '.$fPostgisVersion."\n";
-
-               if ($fPostgisVersion < 2.1)
-               {
-                       // Function was renamed in 2.1 and throws an annoying deprecation warning
-                       pgsqlRunScript('ALTER FUNCTION st_line_interpolate_point(geometry, double precision) RENAME TO ST_LineInterpolatePoint');
-               }
-
-               pgsqlRunScriptFile(CONST_BasePath.'/data/country_name.sql');
-               pgsqlRunScriptFile(CONST_BasePath.'/data/country_naturalearthdata.sql');
-               pgsqlRunScriptFile(CONST_BasePath.'/data/country_osm_grid.sql');
-               pgsqlRunScriptFile(CONST_BasePath.'/data/gb_postcode_table.sql');
-               if (file_exists(CONST_BasePath.'/data/gb_postcode_data.sql.gz'))
-               {
-                       pgsqlRunScriptFile(CONST_BasePath.'/data/gb_postcode_data.sql.gz');
-               }
-               else
-               {
-                       echo "WARNING: external UK postcode table not found.\n";
-               }
-               if (CONST_Use_Extra_US_Postcodes)
-               {
-                       pgsqlRunScriptFile(CONST_BasePath.'/data/us_postcode.sql');
-               }
-
-               if ($aCMDResult['no-partitions'])
-               {
-                       pgsqlRunScript('update country_name set partition = 0');
-               }
-
-               // the following will be needed by create_functions later but
-               // is only defined in the subsequently called create_tables.
-               // Create dummies here that will be overwritten by the proper
-               // versions in create-tables.
-               pgsqlRunScript('CREATE TABLE place_boundingbox ()');
-               pgsqlRunScript('create type wikipedia_article_match as ()');
-       }
-
-       if ($aCMDResult['import-data'] || $aCMDResult['all'])
-       {
-               echo "Import\n";
-               $bDidSomething = true;
-
-               $osm2pgsql = CONST_Osm2pgsql_Binary;
-               if (!file_exists($osm2pgsql))
-               {
-                       echo "Please download and build osm2pgsql.\nIf it is already installed, check the path in your local settings (settings/local.php) file.\n";
-                       fail("osm2pgsql not found in '$osm2pgsql'");
-               }
-
-               if (!is_null(CONST_Osm2pgsql_Flatnode_File))
-               {
-                       $osm2pgsql .= ' --flat-nodes '.CONST_Osm2pgsql_Flatnode_File;
-               }
-               if (CONST_Tablespace_Osm2pgsql_Data)
-                       $osm2pgsql .= ' --tablespace-slim-data '.CONST_Tablespace_Osm2pgsql_Data;
-               if (CONST_Tablespace_Osm2pgsql_Index)
-                       $osm2pgsql .= ' --tablespace-slim-index '.CONST_Tablespace_Osm2pgsql_Index;
-               if (CONST_Tablespace_Place_Data)
-                       $osm2pgsql .= ' --tablespace-main-data '.CONST_Tablespace_Place_Data;
-               if (CONST_Tablespace_Place_Index)
-                       $osm2pgsql .= ' --tablespace-main-index '.CONST_Tablespace_Place_Index;
-               $osm2pgsql .= ' -lsc -O gazetteer --hstore --number-processes 1';
-               $osm2pgsql .= ' -C 25000';
-               $osm2pgsql .= ' -P '.$aDSNInfo['port'];
-               $osm2pgsql .= ' -d '.$aDSNInfo['database'].' '.$aCMDResult['osm-file'];
-               passthruCheckReturn($osm2pgsql);
-
-               $oDB =& getDB();
-               if (!chksql($oDB->getRow('select * from place limit 1')))
-               {
-                       fail('No Data');
-               }
-       }
-
-       if ($aCMDResult['create-functions'] || $aCMDResult['all'])
-       {
-               echo "Functions\n";
-               $bDidSomething = true;
-               if (!file_exists(CONST_InstallPath.'/module/nominatim.so')) fail("nominatim module not built");
-               create_sql_functions($aCMDResult);
-       }
-
-       if ($aCMDResult['create-tables'] || $aCMDResult['all'])
-       {
-               $bDidSomething = true;
-
-               echo "Tables\n";
-               $sTemplate = file_get_contents(CONST_BasePath.'/sql/tables.sql');
-               $sTemplate = str_replace('{www-user}', CONST_Database_Web_User, $sTemplate);
-               $sTemplate = replace_tablespace('{ts:address-data}',
-                                               CONST_Tablespace_Address_Data, $sTemplate);
-               $sTemplate = replace_tablespace('{ts:address-index}',
-                                               CONST_Tablespace_Address_Index, $sTemplate);
-               $sTemplate = replace_tablespace('{ts:search-data}',
-                                               CONST_Tablespace_Search_Data, $sTemplate);
-               $sTemplate = replace_tablespace('{ts:search-index}',
-                                               CONST_Tablespace_Search_Index, $sTemplate);
-               $sTemplate = replace_tablespace('{ts:aux-data}',
-                                               CONST_Tablespace_Aux_Data, $sTemplate);
-               $sTemplate = replace_tablespace('{ts:aux-index}',
-                                               CONST_Tablespace_Aux_Index, $sTemplate);
-               pgsqlRunScript($sTemplate, false);
-
-               // re-run the functions
-               echo "Functions\n";
-               create_sql_functions($aCMDResult);
-       }
-
-       if ($aCMDResult['create-partition-tables'] || $aCMDResult['all'])
-       {
-               echo "Partition Tables\n";
-               $bDidSomething = true;
-
-               $sTemplate = file_get_contents(CONST_BasePath.'/sql/partition-tables.src.sql');
-               $sTemplate = replace_tablespace('{ts:address-data}',
-                                               CONST_Tablespace_Address_Data, $sTemplate);
-               $sTemplate = replace_tablespace('{ts:address-index}',
-                                               CONST_Tablespace_Address_Index, $sTemplate);
-               $sTemplate = replace_tablespace('{ts:search-data}',
-                                               CONST_Tablespace_Search_Data, $sTemplate);
-               $sTemplate = replace_tablespace('{ts:search-index}',
-                                               CONST_Tablespace_Search_Index, $sTemplate);
-               $sTemplate = replace_tablespace('{ts:aux-data}',
-                                               CONST_Tablespace_Aux_Data, $sTemplate);
-               $sTemplate = replace_tablespace('{ts:aux-index}',
-                                               CONST_Tablespace_Aux_Index, $sTemplate);
-
-               pgsqlRunPartitionScript($sTemplate);
-       }
-
-
-       if ($aCMDResult['create-partition-functions'] || $aCMDResult['all'])
-       {
-               echo "Partition Functions\n";
-               $bDidSomething = true;
-
-               $sTemplate = file_get_contents(CONST_BasePath.'/sql/partition-functions.src.sql');
-
-               pgsqlRunPartitionScript($sTemplate);
-       }
-
-       if ($aCMDResult['import-wikipedia-articles'] || $aCMDResult['all'])
-       {
-               $bDidSomething = true;
-               $sWikiArticlesFile = CONST_BasePath.'/data/wikipedia_article.sql.bin';
-               $sWikiRedirectsFile = CONST_BasePath.'/data/wikipedia_redirect.sql.bin';
-               if (file_exists($sWikiArticlesFile))
-               {
-                       echo "Importing wikipedia articles...";
-                       pgsqlRunDropAndRestore($sWikiArticlesFile);
-                       echo "...done\n";
-               }
-               else
-               {
-                       echo "WARNING: wikipedia article dump file not found - places will have default importance\n";
-               }
-               if (file_exists($sWikiRedirectsFile))
-               {
-                       echo "Importing wikipedia redirects...";
-                       pgsqlRunDropAndRestore($sWikiRedirectsFile);
-                       echo "...done\n";
-               }
-               else
-               {
-                       echo "WARNING: wikipedia redirect dump file not found - some place importance values may be missing\n";
-               }
-       }
-
-
-       if ($aCMDResult['load-data'] || $aCMDResult['all'])
-       {
-               echo "Drop old Data\n";
-               $bDidSomething = true;
-
-               $oDB =& getDB();
-               if (!pg_query($oDB->connection, 'TRUNCATE word')) fail(pg_last_error($oDB->connection));
-               echo '.';
-               if (!pg_query($oDB->connection, 'TRUNCATE placex')) fail(pg_last_error($oDB->connection));
-               echo '.';
-               if (!pg_query($oDB->connection, 'TRUNCATE location_property_osmline')) fail(pg_last_error($oDB->connection));
-               echo '.';
-               if (!pg_query($oDB->connection, 'TRUNCATE place_addressline')) fail(pg_last_error($oDB->connection));
-               echo '.';
-               if (!pg_query($oDB->connection, 'TRUNCATE place_boundingbox')) fail(pg_last_error($oDB->connection));
-               echo '.';
-               if (!pg_query($oDB->connection, 'TRUNCATE location_area')) fail(pg_last_error($oDB->connection));
-               echo '.';
-               if (!pg_query($oDB->connection, 'TRUNCATE search_name')) fail(pg_last_error($oDB->connection));
-               echo '.';
-               if (!pg_query($oDB->connection, 'TRUNCATE search_name_blank')) fail(pg_last_error($oDB->connection));
-               echo '.';
-               if (!pg_query($oDB->connection, 'DROP SEQUENCE seq_place')) fail(pg_last_error($oDB->connection));
-               echo '.';
-               if (!pg_query($oDB->connection, 'CREATE SEQUENCE seq_place start 100000')) fail(pg_last_error($oDB->connection));
-               echo '.';
-
-               $sSQL = 'select distinct partition from country_name';
-               $aPartitions = chksql($oDB->getCol($sSQL));
-               if (!$aCMDResult['no-partitions']) $aPartitions[] = 0;
-               foreach($aPartitions as $sPartition)
-               {
-                       if (!pg_query($oDB->connection, 'TRUNCATE location_road_'.$sPartition)) fail(pg_last_error($oDB->connection));
-                       echo '.';
-               }
-
-               // used by getorcreate_word_id to ignore frequent partial words
-               if (!pg_query($oDB->connection, 'CREATE OR REPLACE FUNCTION get_maxwordfreq() RETURNS integer AS $$ SELECT '.CONST_Max_Word_Frequency.' as maxwordfreq; $$ LANGUAGE SQL IMMUTABLE')) fail(pg_last_error($oDB->connection));
-               echo ".\n";
-
-               // pre-create the word list
-               if (!$aCMDResult['disable-token-precalc'])
-               {
-                       echo "Loading word list\n";
-                       pgsqlRunScriptFile(CONST_BasePath.'/data/words.sql');
-               }
-
-               echo "Load Data\n";
-               $aDBInstances = array();
-               $iLoadThreads = max(1, $iInstances - 1);
-               for($i = 0; $i < $iLoadThreads; $i++)
-               {
-                       $aDBInstances[$i] =& getDB(true);
-                       $sSQL = 'insert into placex (osm_type, osm_id, class, type, name, admin_level, ';
-                       $sSQL .= 'housenumber, street, addr_place, isin, postcode, country_code, extratags, ';
-                       $sSQL .= 'geometry) select * from place where osm_id % '.$iLoadThreads.' = '.$i;
-                       $sSQL .= " and not (class='place' and type='houses' and osm_type='W' and ST_GeometryType(geometry) = 'ST_LineString')";
-                       if ($aCMDResult['verbose']) echo "$sSQL\n";
-                       if (!pg_send_query($aDBInstances[$i]->connection, $sSQL)) fail(pg_last_error($oDB->connection));
-               }
-               // last thread for interpolation lines
-               $aDBInstances[$iLoadThreads] =& getDB(true);
-               $sSQL = 'select insert_osmline (osm_id, housenumber, street, addr_place, postcode, country_code, ';
-               $sSQL .= 'geometry) from place where ';
-               $sSQL .= "class='place' and type='houses' and osm_type='W' and ST_GeometryType(geometry) = 'ST_LineString'";
-               if ($aCMDResult['verbose']) echo "$sSQL\n";
-               if (!pg_send_query($aDBInstances[$i]->connection, $sSQL)) fail(pg_last_error($oDB->connection));
-
-               $bAnyBusy = true;
-               while($bAnyBusy)
-               {
-                       $bAnyBusy = false;
-                       for($i = 0; $i <= $iLoadThreads; $i++)
-                       {
-                               if (pg_connection_busy($aDBInstances[$i]->connection)) $bAnyBusy = true;
-                       }
-                       sleep(1);
-                       echo '.';
-               }
-               echo "\n";
-               echo "Reanalysing database...\n";
-               pgsqlRunScript('ANALYSE');
-       }
-
-       if ($aCMDResult['import-tiger-data'])
-       {
-               $bDidSomething = true;
-
-               $sTemplate = file_get_contents(CONST_BasePath.'/sql/tiger_import_start.sql');
-               $sTemplate = str_replace('{www-user}', CONST_Database_Web_User, $sTemplate);
-               $sTemplate = replace_tablespace('{ts:aux-data}',
-                                               CONST_Tablespace_Aux_Data, $sTemplate);
-               $sTemplate = replace_tablespace('{ts:aux-index}',
-                                               CONST_Tablespace_Aux_Index, $sTemplate);
-               pgsqlRunScript($sTemplate, false);
-
-               $aDBInstances = array();
-               for($i = 0; $i < $iInstances; $i++)
-               {
-                       $aDBInstances[$i] =& getDB(true);
-               }
-
-               foreach(glob(CONST_Tiger_Data_Path.'/*.sql') as $sFile)
-               {
-                       echo $sFile.': ';
-                       $hFile = fopen($sFile, "r");
-                       $sSQL = fgets($hFile, 100000);
-                       $iLines = 0;
-
-                       while(true)
-                       {
-                               for($i = 0; $i < $iInstances; $i++)
-                               {
-                                       if (!pg_connection_busy($aDBInstances[$i]->connection))
-                                       {
-                                               while(pg_get_result($aDBInstances[$i]->connection));
-                                               $sSQL = fgets($hFile, 100000);
-                                               if (!$sSQL) break 2;
-                                               if (!pg_send_query($aDBInstances[$i]->connection, $sSQL)) fail(pg_last_error($oDB->connection));
-                                               $iLines++;
-                                               if ($iLines == 1000)
-                                               {
-                                                       echo ".";
-                                                       $iLines = 0;
-                                               }
-                                       }
-                               }
-                               usleep(10);
-                       }
-
-                       fclose($hFile);
-
-                       $bAnyBusy = true;
-                       while($bAnyBusy)
-                       {
-                               $bAnyBusy = false;
-                               for($i = 0; $i < $iInstances; $i++)
-                               {
-                                       if (pg_connection_busy($aDBInstances[$i]->connection)) $bAnyBusy = true;
-                               }
-                               usleep(10);
-                       }
-                       echo "\n";
-               }
-
-               echo "Creating indexes\n";
-               $sTemplate = file_get_contents(CONST_BasePath.'/sql/tiger_import_finish.sql');
-               $sTemplate = str_replace('{www-user}', CONST_Database_Web_User, $sTemplate);
-               $sTemplate = replace_tablespace('{ts:aux-data}',
-                                               CONST_Tablespace_Aux_Data, $sTemplate);
-               $sTemplate = replace_tablespace('{ts:aux-index}',
-                                               CONST_Tablespace_Aux_Index, $sTemplate);
-               pgsqlRunScript($sTemplate, false);
-       }
-
-       if ($aCMDResult['calculate-postcodes'] || $aCMDResult['all'])
-       {
-               $bDidSomething = true;
-               $oDB =& getDB();
-               if (!pg_query($oDB->connection, 'DELETE from placex where osm_type=\'P\'')) fail(pg_last_error($oDB->connection));
-               $sSQL = "insert into placex (osm_type,osm_id,class,type,postcode,calculated_country_code,geometry) ";
-               $sSQL .= "select 'P',nextval('seq_postcodes'),'place','postcode',postcode,calculated_country_code,";
-               $sSQL .= "ST_SetSRID(ST_Point(x,y),4326) as geometry from (select calculated_country_code,postcode,";
-               $sSQL .= "avg(st_x(st_centroid(geometry))) as x,avg(st_y(st_centroid(geometry))) as y ";
-               $sSQL .= "from placex where postcode is not null and calculated_country_code not in ('ie') group by calculated_country_code,postcode) as x";
-               if (!pg_query($oDB->connection, $sSQL)) fail(pg_last_error($oDB->connection));
-
-               if (CONST_Use_Extra_US_Postcodes)
-               {
-                       $sSQL = "insert into placex (osm_type,osm_id,class,type,postcode,calculated_country_code,geometry) ";
-                       $sSQL .= "select 'P',nextval('seq_postcodes'),'place','postcode',postcode,'us',";
-                       $sSQL .= "ST_SetSRID(ST_Point(x,y),4326) as geometry from us_postcode";
-                       if (!pg_query($oDB->connection, $sSQL)) fail(pg_last_error($oDB->connection));
-               }
-       }
-
-       if ($aCMDResult['osmosis-init'] || ($aCMDResult['all'] && !$aCMDResult['drop'])) // no use doing osmosis-init when dropping update tables
-       {
-               $bDidSomething = true;
-               $oDB =& getDB();
-
-               if (!file_exists(CONST_Osmosis_Binary))
-               {
-                       echo "Please download osmosis.\nIf it is already installed, check the path in your local settings (settings/local.php) file.\n";
-                       if (!$aCMDResult['all'])
-                       {
-                               fail("osmosis not found in '".CONST_Osmosis_Binary."'");
-                       }
-               }
-               else
-               {
-                       if (file_exists(CONST_InstallPath.'/settings/configuration.txt'))
-                       {
-                               echo "settings/configuration.txt already exists\n";
-                       }
-                       else
-                       {
-                               passthru(CONST_Osmosis_Binary.' --read-replication-interval-init '.CONST_InstallPath.'/settings');
-                               // update osmosis configuration.txt with our settings
-                               passthru("sed -i 's!baseUrl=.*!baseUrl=".CONST_Replication_Url."!' ".CONST_InstallPath.'/settings/configuration.txt');
-                               passthru("sed -i 's:maxInterval = .*:maxInterval = ".CONST_Replication_MaxInterval.":' ".CONST_InstallPath.'/settings/configuration.txt');
-                       }
-
-                       // Find the last node in the DB
-                       $iLastOSMID = $oDB->getOne("select max(osm_id) from place where osm_type = 'N'");
-
-                       // Lookup the timestamp that node was created (less 3 hours for margin for changsets to be closed)
-                       $sLastNodeURL = 'http://www.openstreetmap.org/api/0.6/node/'.$iLastOSMID."/1";
-                       $sLastNodeXML = file_get_contents($sLastNodeURL);
-                       preg_match('#timestamp="(([0-9]{4})-([0-9]{2})-([0-9]{2})T([0-9]{2}):([0-9]{2}):([0-9]{2})Z)"#', $sLastNodeXML, $aLastNodeDate);
-                       $iLastNodeTimestamp = strtotime($aLastNodeDate[1]) - (3*60*60);
-
-                       // Search for the correct state file - uses file timestamps so need to sort by date descending
-                       $sRepURL = CONST_Replication_Url."/";
-                       $sRep = file_get_contents($sRepURL."?C=M;O=D;F=1");
-                       // download.geofabrik.de:    <a href="000/">000/</a></td><td align="right">26-Feb-2013 11:53  </td>
-                       // planet.openstreetmap.org: <a href="273/">273/</a>                    2013-03-11 07:41    -
-                       preg_match_all('#<a href="[0-9]{3}/">([0-9]{3}/)</a>\s*([-0-9a-zA-Z]+ [0-9]{2}:[0-9]{2})#', $sRep, $aRepMatches, PREG_SET_ORDER);
-                       if ($aRepMatches)
-                       {
-                               $aPrevRepMatch = false;
-                               foreach($aRepMatches as $aRepMatch)
-                               {
-                                       if (strtotime($aRepMatch[2]) < $iLastNodeTimestamp) break;
-                                       $aPrevRepMatch = $aRepMatch;
-                               }
-                               if ($aPrevRepMatch) $aRepMatch = $aPrevRepMatch;
-
-                               $sRepURL .= $aRepMatch[1];
-                               $sRep = file_get_contents($sRepURL."?C=M;O=D;F=1");
-                               preg_match_all('#<a href="[0-9]{3}/">([0-9]{3}/)</a>\s*([-0-9a-zA-Z]+ [0-9]{2}:[0-9]{2})#', $sRep, $aRepMatches, PREG_SET_ORDER);
-                               $aPrevRepMatch = false;
-                               foreach($aRepMatches as $aRepMatch)
-                               {
-                                       if (strtotime($aRepMatch[2]) < $iLastNodeTimestamp) break;
-                                       $aPrevRepMatch = $aRepMatch;
-                               }
-                               if ($aPrevRepMatch) $aRepMatch = $aPrevRepMatch;
-
-                               $sRepURL .= $aRepMatch[1];
-                               $sRep = file_get_contents($sRepURL."?C=M;O=D;F=1");
-                               preg_match_all('#<a href="[0-9]{3}.state.txt">([0-9]{3}).state.txt</a>\s*([-0-9a-zA-Z]+ [0-9]{2}:[0-9]{2})#', $sRep, $aRepMatches, PREG_SET_ORDER);
-                               $aPrevRepMatch = false;
-                               foreach($aRepMatches as $aRepMatch)
-                               {
-                                       if (strtotime($aRepMatch[2]) < $iLastNodeTimestamp) break;
-                                       $aPrevRepMatch = $aRepMatch;
-                               }
-                               if ($aPrevRepMatch) $aRepMatch = $aPrevRepMatch;
-
-                               $sRepURL .= $aRepMatch[1].'.state.txt';
-                               echo "Getting state file: $sRepURL\n";
-                               $sStateFile = file_get_contents($sRepURL);
-                               if (!$sStateFile || strlen($sStateFile) > 1000) fail("unable to obtain state file");
-                               file_put_contents(CONST_InstallPath.'/settings/state.txt', $sStateFile);
-                               echo "Updating DB status\n";
-                               pg_query($oDB->connection, 'TRUNCATE import_status');
-                               $sSQL = "INSERT INTO import_status VALUES('".$aRepMatch[2]."')";
-                               pg_query($oDB->connection, $sSQL);
-                       }
-                       else
-                       {
-                               if (!$aCMDResult['all'])
-                               {
-                                       fail("Cannot read state file directory.");
-                               }
-                       }
-               }
-       }
-
-       if ($aCMDResult['index'] || $aCMDResult['all'])
-       {
-               $bDidSomething = true;
-               $sOutputFile = '';
-               $sBaseCmd = CONST_InstallPath.'/nominatim/nominatim -i -d '.$aDSNInfo['database'].' -P '.$aDSNInfo['port'].' -t '.$iInstances.$sOutputFile;
-               passthruCheckReturn($sBaseCmd.' -R 4');
-               if (!$aCMDResult['index-noanalyse']) pgsqlRunScript('ANALYSE');
-               passthruCheckReturn($sBaseCmd.' -r 5 -R 25');
-               if (!$aCMDResult['index-noanalyse']) pgsqlRunScript('ANALYSE');
-               passthruCheckReturn($sBaseCmd.' -r 26');
-       }
-
-       if ($aCMDResult['create-search-indices'] || $aCMDResult['all'])
-       {
-               echo "Search indices\n";
-               $bDidSomething = true;
-
-               $sTemplate = file_get_contents(CONST_BasePath.'/sql/indices.src.sql');
-               $sTemplate = replace_tablespace('{ts:address-index}',
-                                               CONST_Tablespace_Address_Index, $sTemplate);
-               $sTemplate = replace_tablespace('{ts:search-index}',
-                                               CONST_Tablespace_Search_Index, $sTemplate);
-               $sTemplate = replace_tablespace('{ts:aux-index}',
-                                               CONST_Tablespace_Aux_Index, $sTemplate);
-
-               pgsqlRunScript($sTemplate);
-       }
-
-       if ($aCMDResult['drop'])
-       {
-               // The implementation is potentially a bit dangerous because it uses
-               // a positive selection of tables to keep, and deletes everything else.
-               // Including any tables that the unsuspecting user might have manually
-               // created. USE AT YOUR OWN PERIL.
-               $bDidSomething = true;
-
-               // tables we want to keep. everything else goes.
-               $aKeepTables = array(
-                  "*columns",
-                  "import_polygon_*",
-                  "import_status",
-                  "place_addressline",
-                  "location_property*",
-                  "placex",
-                  "search_name",
-                  "seq_*",
-                  "word",
-                  "query_log",
-                  "new_query_log",
-                  "gb_postcode",
-                  "spatial_ref_sys",
-                  "country_name",
-                  "place_classtype_*"
-               );
-
-               $oDB =& getDB();
-               $aDropTables = array();
-               $aHaveTables = chksql($oDB->getCol("SELECT tablename FROM pg_tables WHERE schemaname='public'"));
-
-               foreach($aHaveTables as $sTable)
-               {
-                       $bFound = false;
-                       foreach ($aKeepTables as $sKeep)
-                       {
-                               if (fnmatch($sKeep, $sTable))
-                               {
-                                       $bFound = true;
-                                       break;
-                               }
-                       }
-                       if (!$bFound) array_push($aDropTables, $sTable);
-               }
-
-               foreach ($aDropTables as $sDrop)
-               {
-                       if ($aCMDResult['verbose']) echo "dropping table $sDrop\n";
-                       @pg_query($oDB->connection, "DROP TABLE $sDrop CASCADE");
-                       // ignore warnings/errors as they might be caused by a table having
-                       // been deleted already by CASCADE
-               }
-
-               if (!is_null(CONST_Osm2pgsql_Flatnode_File))
-               {
-                       if ($aCMDResult['verbose']) echo "deleting ".CONST_Osm2pgsql_Flatnode_File."\n";
-                       unlink(CONST_Osm2pgsql_Flatnode_File);
-               }
-       }
-
-       if (!$bDidSomething)
-       {
-               showUsage($aCMDOptions, true);
-       }
-       else
-       {
-               echo "Setup finished.\n";
-       }
-
-       function pgsqlRunScriptFile($sFilename)
-       {
-               if (!file_exists($sFilename)) fail('unable to find '.$sFilename);
-
-               // Convert database DSN to psql parameters
-               $aDSNInfo = DB::parseDSN(CONST_Database_DSN);
-               if (!isset($aDSNInfo['port']) || !$aDSNInfo['port']) $aDSNInfo['port'] = 5432;
-               $sCMD = 'psql -p '.$aDSNInfo['port'].' -d '.$aDSNInfo['database'];
-
-               $ahGzipPipes = null;
-               if (preg_match('/\\.gz$/', $sFilename))
-               {
-                       $aDescriptors = array(
-                               0 => array('pipe', 'r'),
-                               1 => array('pipe', 'w'),
-                               2 => array('file', '/dev/null', 'a')
-                       );
-                       $hGzipProcess = proc_open('zcat '.$sFilename, $aDescriptors, $ahGzipPipes);
-                       if (!is_resource($hGzipProcess)) fail('unable to start zcat');
-                       $aReadPipe = $ahGzipPipes[1];
-                       fclose($ahGzipPipes[0]);
-               }
-               else
-               {
-                       $sCMD .= ' -f '.$sFilename;
-                       $aReadPipe = array('pipe', 'r');
-               }
-
-               $aDescriptors = array(
-                       0 => $aReadPipe,
-                       1 => array('pipe', 'w'),
-                       2 => array('file', '/dev/null', 'a')
-               );
-               $ahPipes = null;
-               $hProcess = proc_open($sCMD, $aDescriptors, $ahPipes);
-               if (!is_resource($hProcess)) fail('unable to start pgsql');
-
-
-               // TODO: error checking
-               while(!feof($ahPipes[1]))
-               {
-                       echo fread($ahPipes[1], 4096);
-               }
-               fclose($ahPipes[1]);
-
-               $iReturn = proc_close($hProcess);
-               if ($iReturn > 0)
-               {
-                       fail("pgsql returned with error code ($iReturn)");
-               }
-               if ($ahGzipPipes)
-               {
-                       fclose($ahGzipPipes[1]);
-                       proc_close($hGzipProcess);
-               }
-
-       }
-
-       function pgsqlRunScript($sScript, $bfatal = true)
-       {
-               global $aCMDResult;
-               // Convert database DSN to psql parameters
-               $aDSNInfo = DB::parseDSN(CONST_Database_DSN);
-               if (!isset($aDSNInfo['port']) || !$aDSNInfo['port']) $aDSNInfo['port'] = 5432;
-               $sCMD = 'psql -p '.$aDSNInfo['port'].' -d '.$aDSNInfo['database'];
-               if ($bfatal && !$aCMDResult['ignore-errors'])
-                       $sCMD .= ' -v ON_ERROR_STOP=1';
-               $aDescriptors = array(
-                       0 => array('pipe', 'r'),
-                       1 => STDOUT, 
-                       2 => STDERR
-               );
-               $ahPipes = null;
-               $hProcess = @proc_open($sCMD, $aDescriptors, $ahPipes);
-               if (!is_resource($hProcess)) fail('unable to start pgsql');
-
-               while(strlen($sScript))
-               {
-                       $written = fwrite($ahPipes[0], $sScript);
-                       if ($written <= 0) break;
-                       $sScript = substr($sScript, $written);
-               }
-               fclose($ahPipes[0]);
-               $iReturn = proc_close($hProcess);
-               if ($bfatal && $iReturn > 0)
-               {
-                       fail("pgsql returned with error code ($iReturn)");
-               }
-       }
-
-       function pgsqlRunPartitionScript($sTemplate)
-       {
-               global $aCMDResult;
-               $oDB =& getDB();
-
-               $sSQL = 'select distinct partition from country_name';
-               $aPartitions = chksql($oDB->getCol($sSQL));
-               if (!$aCMDResult['no-partitions']) $aPartitions[] = 0;
-
-               preg_match_all('#^-- start(.*?)^-- end#ms', $sTemplate, $aMatches, PREG_SET_ORDER);
-               foreach($aMatches as $aMatch)
-               {
-                       $sResult = '';
-                       foreach($aPartitions as $sPartitionName)
-                       {
-                               $sResult .= str_replace('-partition-', $sPartitionName, $aMatch[1]);
-                       }
-                       $sTemplate = str_replace($aMatch[0], $sResult, $sTemplate);
-               }
-
-               pgsqlRunScript($sTemplate);
-       }
-
-       function pgsqlRunRestoreData($sDumpFile)
-       {
-               // Convert database DSN to psql parameters
-               $aDSNInfo = DB::parseDSN(CONST_Database_DSN);
-               if (!isset($aDSNInfo['port']) || !$aDSNInfo['port']) $aDSNInfo['port'] = 5432;
-               $sCMD = 'pg_restore -p '.$aDSNInfo['port'].' -d '.$aDSNInfo['database'].' -Fc -a '.$sDumpFile;
-
-               $aDescriptors = array(
-                       0 => array('pipe', 'r'),
-                       1 => array('pipe', 'w'),
-                       2 => array('file', '/dev/null', 'a')
-               );
-               $ahPipes = null;
-               $hProcess = proc_open($sCMD, $aDescriptors, $ahPipes);
-               if (!is_resource($hProcess)) fail('unable to start pg_restore');
-
-               fclose($ahPipes[0]);
-
-               // TODO: error checking
-               while(!feof($ahPipes[1]))
-               {
-                       echo fread($ahPipes[1], 4096);
-               }
-               fclose($ahPipes[1]);
-
-               $iReturn = proc_close($hProcess);
-       }
-
-       function pgsqlRunDropAndRestore($sDumpFile)
-       {
-               // Convert database DSN to psql parameters
-               $aDSNInfo = DB::parseDSN(CONST_Database_DSN);
-               if (!isset($aDSNInfo['port']) || !$aDSNInfo['port']) $aDSNInfo['port'] = 5432;
-               $sCMD = 'pg_restore -p '.$aDSNInfo['port'].' -d '.$aDSNInfo['database'].' -Fc --clean '.$sDumpFile;
-
-               $aDescriptors = array(
-                       0 => array('pipe', 'r'),
-                       1 => array('pipe', 'w'),
-                       2 => array('file', '/dev/null', 'a')
-               );
-               $ahPipes = null;
-               $hProcess = proc_open($sCMD, $aDescriptors, $ahPipes);
-               if (!is_resource($hProcess)) fail('unable to start pg_restore');
-
-               fclose($ahPipes[0]);
-
-               // TODO: error checking
-               while(!feof($ahPipes[1]))
-               {
-                       echo fread($ahPipes[1], 4096);
-               }
-               fclose($ahPipes[1]);
-
-               $iReturn = proc_close($hProcess);
-       }
-
-       function passthruCheckReturn($cmd)
-       {
-               $result = -1;
-               passthru($cmd, $result);
-               if ($result != 0) fail('Error executing external command: '.$cmd);
-       }
-
-       function replace_tablespace($sTemplate, $sTablespace, $sSql)
-       {
-               if ($sTablespace)
-                       $sSql = str_replace($sTemplate, 'TABLESPACE "'.$sTablespace.'"',
-                                           $sSql);
-               else
-                       $sSql = str_replace($sTemplate, '', $sSql);
-
-               return $sSql;
-       }
-
-       function create_sql_functions($aCMDResult)
-       {
-               $sTemplate = file_get_contents(CONST_BasePath.'/sql/functions.sql');
-               $sTemplate = str_replace('{modulepath}', CONST_InstallPath.'/module', $sTemplate);
-               if ($aCMDResult['enable-diff-updates'])
-               {
-                       $sTemplate = str_replace('RETURN NEW; -- %DIFFUPDATES%', '--', $sTemplate);
-               }
-               if ($aCMDResult['enable-debug-statements'])
-               {
-                       $sTemplate = str_replace('--DEBUG:', '', $sTemplate);
-               }
-               if (CONST_Limit_Reindexing)
-               {
-                       $sTemplate = str_replace('--LIMIT INDEXING:', '', $sTemplate);
-               }
-               if (!CONST_Use_US_Tiger_Data)
-               {
-                       $sTemplate = str_replace('-- %NOTIGERDATA% ', '', $sTemplate);
-               }
-               if (!CONST_Use_Aux_Location_data)
-               {
-                       $sTemplate = str_replace('-- %NOAUXDATA% ', '', $sTemplate);
-               }
-               pgsqlRunScript($sTemplate);
-
-       }
-
+require_once(dirname(dirname(__FILE__)).'/settings/settings.php');
+require_once(CONST_BasePath.'/lib/init-cmd.php');
+ini_set('memory_limit', '800M');
+
+$aCMDOptions
+= array(
+   "Create and setup nominatim search system",
+   array('help', 'h', 0, 1, 0, 0, false, 'Show Help'),
+   array('quiet', 'q', 0, 1, 0, 0, 'bool', 'Quiet output'),
+   array('verbose', 'v', 0, 1, 0, 0, 'bool', 'Verbose output'),
+
+   array('osm-file', '', 0, 1, 1, 1, 'realpath', 'File to import'),
+   array('threads', '', 0, 1, 1, 1, 'int', 'Number of threads (where possible)'),
+
+   array('all', '', 0, 1, 0, 0, 'bool', 'Do the complete process'),
+
+   array('create-db', '', 0, 1, 0, 0, 'bool', 'Create nominatim db'),
+   array('setup-db', '', 0, 1, 0, 0, 'bool', 'Build a blank nominatim db'),
+   array('import-data', '', 0, 1, 0, 0, 'bool', 'Import a osm file'),
+   array('osm2pgsql-cache', '', 0, 1, 1, 1, 'int', 'Cache size used by osm2pgsql'),
+   array('create-functions', '', 0, 1, 0, 0, 'bool', 'Create functions'),
+   array('enable-diff-updates', '', 0, 1, 0, 0, 'bool', 'Turn on the code required to make diff updates work'),
+   array('enable-debug-statements', '', 0, 1, 0, 0, 'bool', 'Include debug warning statements in pgsql commands'),
+   array('ignore-errors', '', 0, 1, 0, 0, 'bool', 'Continue import even when errors in SQL are present (EXPERT)'),
+   array('create-tables', '', 0, 1, 0, 0, 'bool', 'Create main tables'),
+   array('create-partition-tables', '', 0, 1, 0, 0, 'bool', 'Create required partition tables'),
+   array('create-partition-functions', '', 0, 1, 0, 0, 'bool', 'Create required partition triggers'),
+   array('no-partitions', '', 0, 1, 0, 0, 'bool', "Do not partition search indices (speeds up import of single country extracts)"),
+   array('import-wikipedia-articles', '', 0, 1, 0, 0, 'bool', 'Import wikipedia article dump'),
+   array('load-data', '', 0, 1, 0, 0, 'bool', 'Copy data to live tables from import table'),
+   array('disable-token-precalc', '', 0, 1, 0, 0, 'bool', 'Disable name precalculation (EXPERT)'),
+   array('import-tiger-data', '', 0, 1, 0, 0, 'bool', 'Import tiger data (not included in \'all\')'),
+   array('calculate-postcodes', '', 0, 1, 0, 0, 'bool', 'Calculate postcode centroids'),
+   array('osmosis-init', '', 0, 1, 0, 0, 'bool', 'Generate default osmosis configuration'),
+   array('index', '', 0, 1, 0, 0, 'bool', 'Index the data'),
+   array('index-noanalyse', '', 0, 1, 0, 0, 'bool', 'Do not perform analyse operations during index (EXPERT)'),
+   array('create-search-indices', '', 0, 1, 0, 0, 'bool', 'Create additional indices required for search and update'),
+   array('create-country-names', '', 0, 1, 0, 0, 'bool', 'Create default list of searchable country names'),
+   array('drop', '', 0, 1, 0, 0, 'bool', 'Drop tables needed for updates, making the database readonly (EXPERIMENTAL)'),
+  );
+getCmdOpt($_SERVER['argv'], $aCMDOptions, $aCMDResult, true, true);
+
+$bDidSomething = false;
+
+// Check if osm-file is set and points to a valid file if --all or --import-data is given
+if ($aCMDResult['import-data'] || $aCMDResult['all']) {
+    if (!isset($aCMDResult['osm-file'])) {
+        fail('missing --osm-file for data import');
+    }
+
+    if (!file_exists($aCMDResult['osm-file'])) {
+        fail('the path supplied to --osm-file does not exist');
+    }
+
+    if (!is_readable($aCMDResult['osm-file'])) {
+        fail('osm-file "'.$aCMDResult['osm-file'].'" not readable');
+    }
+}
+
+
+// This is a pretty hard core default - the number of processors in the box - 1
+$iInstances = isset($aCMDResult['threads'])?$aCMDResult['threads']:(getProcessorCount()-1);
+if ($iInstances < 1) {
+    $iInstances = 1;
+    echo "WARNING: resetting threads to $iInstances\n";
+}
+if ($iInstances > getProcessorCount()) {
+    $iInstances = getProcessorCount();
+    echo "WARNING: resetting threads to $iInstances\n";
+}
+
+// Assume we can steal all the cache memory in the box (unless told otherwise)
+if (isset($aCMDResult['osm2pgsql-cache'])) {
+    $iCacheMemory = $aCMDResult['osm2pgsql-cache'];
+} else {
+    $iCacheMemory = getCacheMemoryMB();
+}
+
+$aDSNInfo = DB::parseDSN(CONST_Database_DSN);
+if (!isset($aDSNInfo['port']) || !$aDSNInfo['port']) $aDSNInfo['port'] = 5432;
+
+if ($aCMDResult['create-db'] || $aCMDResult['all']) {
+    echo "Create DB\n";
+    $bDidSomething = true;
+    $oDB = DB::connect(CONST_Database_DSN, false);
+    if (!PEAR::isError($oDB)) {
+        fail('database already exists ('.CONST_Database_DSN.')');
+    }
+    passthruCheckReturn('createdb -E UTF-8 -p '.$aDSNInfo['port'].' '.$aDSNInfo['database']);
+}
+
+if ($aCMDResult['setup-db'] || $aCMDResult['all']) {
+    echo "Setup DB\n";
+    $bDidSomething = true;
+
+    // TODO: path detection, detection memory, etc.
+    //
+    $oDB =& getDB();
+
+    $fPostgresVersion = getPostgresVersion($oDB);
+    echo 'Postgres version found: '.$fPostgresVersion."\n";
+
+    if ($fPostgresVersion < 9.1) {
+        fail("Minimum supported version of Postgresql is 9.1.");
+    }
+
+    pgsqlRunScript('CREATE EXTENSION IF NOT EXISTS hstore');
+    pgsqlRunScript('CREATE EXTENSION IF NOT EXISTS postgis');
+
+    // For extratags and namedetails the hstore_to_json converter is
+    // needed which is only available from Postgresql 9.3+. For older
+    // versions add a dummy function that returns nothing.
+    $iNumFunc = chksql($oDB->getOne("select count(*) from pg_proc where proname = 'hstore_to_json'"));
+
+    if ($iNumFunc == 0) {
+        pgsqlRunScript("create function hstore_to_json(dummy hstore) returns text AS 'select null::text' language sql immutable");
+        echo "WARNING: Postgresql is too old. extratags and namedetails API not available.";
+    }
+
+    $fPostgisVersion = getPostgisVersion($oDB);
+    echo 'Postgis version found: '.$fPostgisVersion."\n";
+
+    if ($fPostgisVersion < 2.1) {
+        // Function was renamed in 2.1 and throws an annoying deprecation warning
+        pgsqlRunScript('ALTER FUNCTION st_line_interpolate_point(geometry, double precision) RENAME TO ST_LineInterpolatePoint');
+    }
+
+    pgsqlRunScriptFile(CONST_BasePath.'/data/country_name.sql');
+    pgsqlRunScriptFile(CONST_BasePath.'/data/country_naturalearthdata.sql');
+    pgsqlRunScriptFile(CONST_BasePath.'/data/country_osm_grid.sql');
+    pgsqlRunScriptFile(CONST_BasePath.'/data/gb_postcode_table.sql');
+    if (file_exists(CONST_BasePath.'/data/gb_postcode_data.sql.gz')) {
+        pgsqlRunScriptFile(CONST_BasePath.'/data/gb_postcode_data.sql.gz');
+    } else {
+        echo "WARNING: external UK postcode table not found.\n";
+    }
+    if (CONST_Use_Extra_US_Postcodes) {
+        pgsqlRunScriptFile(CONST_BasePath.'/data/us_postcode.sql');
+    }
+
+    if ($aCMDResult['no-partitions']) {
+        pgsqlRunScript('update country_name set partition = 0');
+    }
+
+    // the following will be needed by create_functions later but
+    // is only defined in the subsequently called create_tables.
+    // Create dummies here that will be overwritten by the proper
+    // versions in create-tables.
+    pgsqlRunScript('CREATE TABLE place_boundingbox ()');
+    pgsqlRunScript('create type wikipedia_article_match as ()');
+}
+
+if ($aCMDResult['import-data'] || $aCMDResult['all']) {
+    echo "Import\n";
+    $bDidSomething = true;
+
+    $osm2pgsql = CONST_Osm2pgsql_Binary;
+    if (!file_exists($osm2pgsql)) {
+        echo "Please download and build osm2pgsql.\nIf it is already installed, check the path in your local settings (settings/local.php) file.\n";
+        fail("osm2pgsql not found in '$osm2pgsql'");
+    }
+
+    if (!is_null(CONST_Osm2pgsql_Flatnode_File)) {
+        $osm2pgsql .= ' --flat-nodes '.CONST_Osm2pgsql_Flatnode_File;
+    }
+    if (CONST_Tablespace_Osm2pgsql_Data)
+        $osm2pgsql .= ' --tablespace-slim-data '.CONST_Tablespace_Osm2pgsql_Data;
+    if (CONST_Tablespace_Osm2pgsql_Index)
+        $osm2pgsql .= ' --tablespace-slim-index '.CONST_Tablespace_Osm2pgsql_Index;
+    if (CONST_Tablespace_Place_Data)
+        $osm2pgsql .= ' --tablespace-main-data '.CONST_Tablespace_Place_Data;
+    if (CONST_Tablespace_Place_Index)
+        $osm2pgsql .= ' --tablespace-main-index '.CONST_Tablespace_Place_Index;
+    $osm2pgsql .= ' -lsc -O gazetteer --hstore --number-processes 1';
+    $osm2pgsql .= ' -C '.$iCacheMemory;
+    $osm2pgsql .= ' -P '.$aDSNInfo['port'];
+    $osm2pgsql .= ' -d '.$aDSNInfo['database'].' '.$aCMDResult['osm-file'];
+    passthruCheckReturn($osm2pgsql);
+
+    $oDB =& getDB();
+    if (!chksql($oDB->getRow('select * from place limit 1'))) {
+        fail('No Data');
+    }
+}
+
+if ($aCMDResult['create-functions'] || $aCMDResult['all']) {
+    echo "Functions\n";
+    $bDidSomething = true;
+    if (!file_exists(CONST_InstallPath.'/module/nominatim.so')) fail("nominatim module not built");
+    create_sql_functions($aCMDResult);
+}
+
+if ($aCMDResult['create-tables'] || $aCMDResult['all']) {
+    $bDidSomething = true;
+
+    echo "Tables\n";
+    $sTemplate = file_get_contents(CONST_BasePath.'/sql/tables.sql');
+    $sTemplate = str_replace('{www-user}', CONST_Database_Web_User, $sTemplate);
+    $sTemplate = replace_tablespace(
+        '{ts:address-data}',
+        CONST_Tablespace_Address_Data,
+        $sTemplate
+    );
+    $sTemplate = replace_tablespace(
+        '{ts:address-index}',
+        CONST_Tablespace_Address_Index,
+        $sTemplate
+    );
+    $sTemplate = replace_tablespace(
+        '{ts:search-data}',
+        CONST_Tablespace_Search_Data,
+        $sTemplate
+    );
+    $sTemplate = replace_tablespace(
+        '{ts:search-index}',
+        CONST_Tablespace_Search_Index,
+        $sTemplate
+    );
+    $sTemplate = replace_tablespace(
+        '{ts:aux-data}',
+        CONST_Tablespace_Aux_Data,
+        $sTemplate
+    );
+    $sTemplate = replace_tablespace(
+        '{ts:aux-index}',
+        CONST_Tablespace_Aux_Index,
+        $sTemplate
+    );
+    pgsqlRunScript($sTemplate, false);
+
+    // re-run the functions
+    echo "Functions\n";
+    create_sql_functions($aCMDResult);
+}
+
+if ($aCMDResult['create-partition-tables'] || $aCMDResult['all']) {
+    echo "Partition Tables\n";
+    $bDidSomething = true;
+
+    $sTemplate = file_get_contents(CONST_BasePath.'/sql/partition-tables.src.sql');
+    $sTemplate = replace_tablespace(
+        '{ts:address-data}',
+        CONST_Tablespace_Address_Data,
+        $sTemplate
+    );
+    $sTemplate = replace_tablespace(
+        '{ts:address-index}',
+        CONST_Tablespace_Address_Index,
+        $sTemplate
+    );
+    $sTemplate = replace_tablespace(
+        '{ts:search-data}',
+        CONST_Tablespace_Search_Data,
+        $sTemplate
+    );
+    $sTemplate = replace_tablespace(
+        '{ts:search-index}',
+        CONST_Tablespace_Search_Index,
+        $sTemplate
+    );
+    $sTemplate = replace_tablespace(
+        '{ts:aux-data}',
+        CONST_Tablespace_Aux_Data,
+        $sTemplate
+    );
+    $sTemplate = replace_tablespace(
+        '{ts:aux-index}',
+        CONST_Tablespace_Aux_Index,
+        $sTemplate
+    );
+
+    pgsqlRunPartitionScript($sTemplate);
+}
+
+
+if ($aCMDResult['create-partition-functions'] || $aCMDResult['all']) {
+    echo "Partition Functions\n";
+    $bDidSomething = true;
+
+    $sTemplate = file_get_contents(CONST_BasePath.'/sql/partition-functions.src.sql');
+
+    pgsqlRunPartitionScript($sTemplate);
+}
+
+if ($aCMDResult['import-wikipedia-articles'] || $aCMDResult['all']) {
+    $bDidSomething = true;
+    $sWikiArticlesFile = CONST_BasePath.'/data/wikipedia_article.sql.bin';
+    $sWikiRedirectsFile = CONST_BasePath.'/data/wikipedia_redirect.sql.bin';
+    if (file_exists($sWikiArticlesFile)) {
+        echo "Importing wikipedia articles...";
+        pgsqlRunDropAndRestore($sWikiArticlesFile);
+        echo "...done\n";
+    } else {
+        echo "WARNING: wikipedia article dump file not found - places will have default importance\n";
+    }
+    if (file_exists($sWikiRedirectsFile)) {
+        echo "Importing wikipedia redirects...";
+        pgsqlRunDropAndRestore($sWikiRedirectsFile);
+        echo "...done\n";
+    } else {
+        echo "WARNING: wikipedia redirect dump file not found - some place importance values may be missing\n";
+    }
+}
+
+
+if ($aCMDResult['load-data'] || $aCMDResult['all']) {
+    echo "Drop old Data\n";
+    $bDidSomething = true;
+
+    $oDB =& getDB();
+    if (!pg_query($oDB->connection, 'TRUNCATE word')) fail(pg_last_error($oDB->connection));
+    echo '.';
+    if (!pg_query($oDB->connection, 'TRUNCATE placex')) fail(pg_last_error($oDB->connection));
+    echo '.';
+    if (!pg_query($oDB->connection, 'TRUNCATE location_property_osmline')) fail(pg_last_error($oDB->connection));
+    echo '.';
+    if (!pg_query($oDB->connection, 'TRUNCATE place_addressline')) fail(pg_last_error($oDB->connection));
+    echo '.';
+    if (!pg_query($oDB->connection, 'TRUNCATE place_boundingbox')) fail(pg_last_error($oDB->connection));
+    echo '.';
+    if (!pg_query($oDB->connection, 'TRUNCATE location_area')) fail(pg_last_error($oDB->connection));
+    echo '.';
+    if (!pg_query($oDB->connection, 'TRUNCATE search_name')) fail(pg_last_error($oDB->connection));
+    echo '.';
+    if (!pg_query($oDB->connection, 'TRUNCATE search_name_blank')) fail(pg_last_error($oDB->connection));
+    echo '.';
+    if (!pg_query($oDB->connection, 'DROP SEQUENCE seq_place')) fail(pg_last_error($oDB->connection));
+    echo '.';
+    if (!pg_query($oDB->connection, 'CREATE SEQUENCE seq_place start 100000')) fail(pg_last_error($oDB->connection));
+    echo '.';
+
+    $sSQL = 'select distinct partition from country_name';
+    $aPartitions = chksql($oDB->getCol($sSQL));
+    if (!$aCMDResult['no-partitions']) $aPartitions[] = 0;
+    foreach ($aPartitions as $sPartition) {
+        if (!pg_query($oDB->connection, 'TRUNCATE location_road_'.$sPartition)) fail(pg_last_error($oDB->connection));
+        echo '.';
+    }
+
+    // used by getorcreate_word_id to ignore frequent partial words
+    if (!pg_query($oDB->connection, 'CREATE OR REPLACE FUNCTION get_maxwordfreq() RETURNS integer AS $$ SELECT '.CONST_Max_Word_Frequency.' as maxwordfreq; $$ LANGUAGE SQL IMMUTABLE')) fail(pg_last_error($oDB->connection));
+    echo ".\n";
+
+    // pre-create the word list
+    if (!$aCMDResult['disable-token-precalc']) {
+        echo "Loading word list\n";
+        pgsqlRunScriptFile(CONST_BasePath.'/data/words.sql');
+    }
+
+    echo "Load Data\n";
+    $aDBInstances = array();
+    $iLoadThreads = max(1, $iInstances - 1);
+    for ($i = 0; $i < $iLoadThreads; $i++) {
+        $aDBInstances[$i] =& getDB(true);
+        $sSQL = 'insert into placex (osm_type, osm_id, class, type, name, admin_level, ';
+        $sSQL .= 'housenumber, street, addr_place, isin, postcode, country_code, extratags, ';
+        $sSQL .= 'geometry) select * from place where osm_id % '.$iLoadThreads.' = '.$i;
+        $sSQL .= " and not (class='place' and type='houses' and osm_type='W' and ST_GeometryType(geometry) = 'ST_LineString')";
+        if ($aCMDResult['verbose']) echo "$sSQL\n";
+        if (!pg_send_query($aDBInstances[$i]->connection, $sSQL)) fail(pg_last_error($oDB->connection));
+    }
+    // last thread for interpolation lines
+    $aDBInstances[$iLoadThreads] =& getDB(true);
+    $sSQL = 'select insert_osmline (osm_id, housenumber, street, addr_place, postcode, country_code, ';
+    $sSQL .= 'geometry) from place where ';
+    $sSQL .= "class='place' and type='houses' and osm_type='W' and ST_GeometryType(geometry) = 'ST_LineString'";
+    if ($aCMDResult['verbose']) echo "$sSQL\n";
+    if (!pg_send_query($aDBInstances[$i]->connection, $sSQL)) fail(pg_last_error($oDB->connection));
+
+    $bAnyBusy = true;
+    while ($bAnyBusy) {
+        $bAnyBusy = false;
+        for ($i = 0; $i <= $iLoadThreads; $i++) {
+            if (pg_connection_busy($aDBInstances[$i]->connection)) $bAnyBusy = true;
+        }
+        sleep(1);
+        echo '.';
+    }
+    echo "\n";
+    echo "Reanalysing database...\n";
+    pgsqlRunScript('ANALYSE');
+}
+
+if ($aCMDResult['import-tiger-data']) {
+    $bDidSomething = true;
+
+    $sTemplate = file_get_contents(CONST_BasePath.'/sql/tiger_import_start.sql');
+    $sTemplate = str_replace('{www-user}', CONST_Database_Web_User, $sTemplate);
+    $sTemplate = replace_tablespace(
+        '{ts:aux-data}',
+        CONST_Tablespace_Aux_Data,
+        $sTemplate
+    );
+    $sTemplate = replace_tablespace(
+        '{ts:aux-index}',
+        CONST_Tablespace_Aux_Index,
+        $sTemplate
+    );
+    pgsqlRunScript($sTemplate, false);
+
+    $aDBInstances = array();
+    for ($i = 0; $i < $iInstances; $i++) {
+        $aDBInstances[$i] =& getDB(true);
+    }
+
+    foreach (glob(CONST_Tiger_Data_Path.'/*.sql') as $sFile) {
+        echo $sFile.': ';
+        $hFile = fopen($sFile, "r");
+        $sSQL = fgets($hFile, 100000);
+        $iLines = 0;
+
+        while (true) {
+            for ($i = 0; $i < $iInstances; $i++) {
+                if (!pg_connection_busy($aDBInstances[$i]->connection)) {
+                    while (pg_get_result($aDBInstances[$i]->connection));
+                    $sSQL = fgets($hFile, 100000);
+                    if (!$sSQL) break 2;
+                    if (!pg_send_query($aDBInstances[$i]->connection, $sSQL)) fail(pg_last_error($oDB->connection));
+                    $iLines++;
+                    if ($iLines == 1000) {
+                        echo ".";
+                        $iLines = 0;
+                    }
+                }
+            }
+            usleep(10);
+        }
+
+        fclose($hFile);
+
+        $bAnyBusy = true;
+        while ($bAnyBusy) {
+            $bAnyBusy = false;
+            for ($i = 0; $i < $iInstances; $i++) {
+                if (pg_connection_busy($aDBInstances[$i]->connection)) $bAnyBusy = true;
+            }
+            usleep(10);
+        }
+        echo "\n";
+    }
+
+    echo "Creating indexes\n";
+    $sTemplate = file_get_contents(CONST_BasePath.'/sql/tiger_import_finish.sql');
+    $sTemplate = str_replace('{www-user}', CONST_Database_Web_User, $sTemplate);
+    $sTemplate = replace_tablespace(
+        '{ts:aux-data}',
+        CONST_Tablespace_Aux_Data,
+        $sTemplate
+    );
+    $sTemplate = replace_tablespace(
+        '{ts:aux-index}',
+        CONST_Tablespace_Aux_Index,
+        $sTemplate
+    );
+    pgsqlRunScript($sTemplate, false);
+}
+
+if ($aCMDResult['calculate-postcodes'] || $aCMDResult['all']) {
+    $bDidSomething = true;
+    $oDB =& getDB();
+    if (!pg_query($oDB->connection, 'DELETE from placex where osm_type=\'P\'')) fail(pg_last_error($oDB->connection));
+    $sSQL = "insert into placex (osm_type,osm_id,class,type,postcode,calculated_country_code,geometry) ";
+    $sSQL .= "select 'P',nextval('seq_postcodes'),'place','postcode',postcode,calculated_country_code,";
+    $sSQL .= "ST_SetSRID(ST_Point(x,y),4326) as geometry from (select calculated_country_code,postcode,";
+    $sSQL .= "avg(st_x(st_centroid(geometry))) as x,avg(st_y(st_centroid(geometry))) as y ";
+    $sSQL .= "from placex where postcode is not null group by calculated_country_code,postcode) as x";
+    if (!pg_query($oDB->connection, $sSQL)) fail(pg_last_error($oDB->connection));
+
+    if (CONST_Use_Extra_US_Postcodes) {
+        $sSQL = "insert into placex (osm_type,osm_id,class,type,postcode,calculated_country_code,geometry) ";
+        $sSQL .= "select 'P',nextval('seq_postcodes'),'place','postcode',postcode,'us',";
+        $sSQL .= "ST_SetSRID(ST_Point(x,y),4326) as geometry from us_postcode";
+        if (!pg_query($oDB->connection, $sSQL)) fail(pg_last_error($oDB->connection));
+    }
+}
+
+if ($aCMDResult['osmosis-init'] || ($aCMDResult['all'] && !$aCMDResult['drop'])) { // no use doing osmosis-init when dropping update tables
+    $bDidSomething = true;
+    $oDB =& getDB();
+
+    if (!file_exists(CONST_Osmosis_Binary)) {
+        echo "Please download osmosis.\nIf it is already installed, check the path in your local settings (settings/local.php) file.\n";
+        if (!$aCMDResult['all']) {
+            fail("osmosis not found in '".CONST_Osmosis_Binary."'");
+        }
+    } else {
+        if (file_exists(CONST_InstallPath.'/settings/configuration.txt')) {
+            echo "settings/configuration.txt already exists\n";
+        } else {
+            passthru(CONST_Osmosis_Binary.' --read-replication-interval-init '.CONST_InstallPath.'/settings');
+            // update osmosis configuration.txt with our settings
+            passthru("sed -i 's!baseUrl=.*!baseUrl=".CONST_Replication_Url."!' ".CONST_InstallPath.'/settings/configuration.txt');
+            passthru("sed -i 's:maxInterval = .*:maxInterval = ".CONST_Replication_MaxInterval.":' ".CONST_InstallPath.'/settings/configuration.txt');
+        }
+
+        // Find the last node in the DB
+        $iLastOSMID = $oDB->getOne("select max(osm_id) from place where osm_type = 'N'");
+
+        // Lookup the timestamp that node was created (less 3 hours for margin for changsets to be closed)
+        $sLastNodeURL = 'http://www.openstreetmap.org/api/0.6/node/'.$iLastOSMID."/1";
+        $sLastNodeXML = file_get_contents($sLastNodeURL);
+        preg_match('#timestamp="(([0-9]{4})-([0-9]{2})-([0-9]{2})T([0-9]{2}):([0-9]{2}):([0-9]{2})Z)"#', $sLastNodeXML, $aLastNodeDate);
+        $iLastNodeTimestamp = strtotime($aLastNodeDate[1]) - (3*60*60);
+
+        // Search for the correct state file - uses file timestamps so need to sort by date descending
+        $sRepURL = CONST_Replication_Url."/";
+        $sRep = file_get_contents($sRepURL."?C=M;O=D;F=1");
+        // download.geofabrik.de:    <a href="000/">000/</a></td><td align="right">26-Feb-2013 11:53  </td>
+        // planet.openstreetmap.org: <a href="273/">273/</a>                    2013-03-11 07:41    -
+        preg_match_all('#<a href="[0-9]{3}/">([0-9]{3}/)</a>\s*([-0-9a-zA-Z]+ [0-9]{2}:[0-9]{2})#', $sRep, $aRepMatches, PREG_SET_ORDER);
+        if ($aRepMatches) {
+            $aPrevRepMatch = false;
+            foreach ($aRepMatches as $aRepMatch) {
+                if (strtotime($aRepMatch[2]) < $iLastNodeTimestamp) break;
+                $aPrevRepMatch = $aRepMatch;
+            }
+            if ($aPrevRepMatch) $aRepMatch = $aPrevRepMatch;
+
+            $sRepURL .= $aRepMatch[1];
+            $sRep = file_get_contents($sRepURL."?C=M;O=D;F=1");
+            preg_match_all('#<a href="[0-9]{3}/">([0-9]{3}/)</a>\s*([-0-9a-zA-Z]+ [0-9]{2}:[0-9]{2})#', $sRep, $aRepMatches, PREG_SET_ORDER);
+            $aPrevRepMatch = false;
+            foreach ($aRepMatches as $aRepMatch) {
+                if (strtotime($aRepMatch[2]) < $iLastNodeTimestamp) break;
+                $aPrevRepMatch = $aRepMatch;
+            }
+            if ($aPrevRepMatch) $aRepMatch = $aPrevRepMatch;
+
+            $sRepURL .= $aRepMatch[1];
+            $sRep = file_get_contents($sRepURL."?C=M;O=D;F=1");
+            preg_match_all('#<a href="[0-9]{3}.state.txt">([0-9]{3}).state.txt</a>\s*([-0-9a-zA-Z]+ [0-9]{2}:[0-9]{2})#', $sRep, $aRepMatches, PREG_SET_ORDER);
+            $aPrevRepMatch = false;
+            foreach ($aRepMatches as $aRepMatch) {
+                if (strtotime($aRepMatch[2]) < $iLastNodeTimestamp) break;
+                $aPrevRepMatch = $aRepMatch;
+            }
+            if ($aPrevRepMatch) $aRepMatch = $aPrevRepMatch;
+
+            $sRepURL .= $aRepMatch[1].'.state.txt';
+            echo "Getting state file: $sRepURL\n";
+            $sStateFile = file_get_contents($sRepURL);
+            if (!$sStateFile || strlen($sStateFile) > 1000) fail("unable to obtain state file");
+            file_put_contents(CONST_InstallPath.'/settings/state.txt', $sStateFile);
+            echo "Updating DB status\n";
+            pg_query($oDB->connection, 'TRUNCATE import_status');
+            $sSQL = "INSERT INTO import_status VALUES('".$aRepMatch[2]."')";
+            pg_query($oDB->connection, $sSQL);
+        } else {
+            if (!$aCMDResult['all']) {
+                fail("Cannot read state file directory.");
+            }
+        }
+    }
+}
+
+if ($aCMDResult['index'] || $aCMDResult['all']) {
+    $bDidSomething = true;
+    $sOutputFile = '';
+    $sBaseCmd = CONST_InstallPath.'/nominatim/nominatim -i -d '.$aDSNInfo['database'].' -P '.$aDSNInfo['port'].' -t '.$iInstances.$sOutputFile;
+    passthruCheckReturn($sBaseCmd.' -R 4');
+    if (!$aCMDResult['index-noanalyse']) pgsqlRunScript('ANALYSE');
+    passthruCheckReturn($sBaseCmd.' -r 5 -R 25');
+    if (!$aCMDResult['index-noanalyse']) pgsqlRunScript('ANALYSE');
+    passthruCheckReturn($sBaseCmd.' -r 26');
+}
+
+if ($aCMDResult['create-search-indices'] || $aCMDResult['all']) {
+    echo "Search indices\n";
+    $bDidSomething = true;
+
+    $sTemplate = file_get_contents(CONST_BasePath.'/sql/indices.src.sql');
+    $sTemplate = replace_tablespace(
+        '{ts:address-index}',
+        CONST_Tablespace_Address_Index,
+        $sTemplate
+    );
+    $sTemplate = replace_tablespace(
+        '{ts:search-index}',
+        CONST_Tablespace_Search_Index,
+        $sTemplate
+    );
+    $sTemplate = replace_tablespace(
+        '{ts:aux-index}',
+        CONST_Tablespace_Aux_Index,
+        $sTemplate
+    );
+
+    pgsqlRunScript($sTemplate);
+}
+
+if ($aCMDResult['create-country-names'] || $aCMDResult['all']) {
+    echo 'Creating search index for default country names';
+    $bDidSomething = true;
+
+    pgsqlRunScript("select getorcreate_country(make_standard_name('uk'), 'gb')");
+    pgsqlRunScript("select getorcreate_country(make_standard_name('united states'), 'us')");
+    pgsqlRunScript("select count(*) from (select getorcreate_country(make_standard_name(country_code), country_code) from country_name where country_code is not null) as x");
+    pgsqlRunScript("select count(*) from (select getorcreate_country(make_standard_name(name->'name'), country_code) from country_name where name ? 'name') as x");
+
+    $sSQL = 'select count(*) from (select getorcreate_country(make_standard_name(v), country_code) from (select country_code, skeys(name) as k, svals(name) as v from country_name) x where k ';
+    if (CONST_Languages) {
+        $sSQL .= 'in ';
+        $sDelim = '(';
+        foreach (explode(',', CONST_Languages) as $sLang) {
+            $sSQL .= $sDelim."'name:$sLang'";
+            $sDelim = ',';
+        }
+        $sSQL .= ')';
+    } else {
+        // all include all simple name tags
+        $sSQL .= "like 'name:%'";
+    }
+    $sSQL .= ') v';
+    pgsqlRunScript($sSQL);
+}
+
+if ($aCMDResult['drop']) {
+    // The implementation is potentially a bit dangerous because it uses
+    // a positive selection of tables to keep, and deletes everything else.
+    // Including any tables that the unsuspecting user might have manually
+    // created. USE AT YOUR OWN PERIL.
+    $bDidSomething = true;
+
+    // tables we want to keep. everything else goes.
+    $aKeepTables = array(
+                    "*columns",
+                    "import_polygon_*",
+                    "import_status",
+                    "place_addressline",
+                    "location_property*",
+                    "placex",
+                    "search_name",
+                    "seq_*",
+                    "word",
+                    "query_log",
+                    "new_query_log",
+                    "gb_postcode",
+                    "spatial_ref_sys",
+                    "country_name",
+                    "place_classtype_*"
+                   );
+
+    $oDB =& getDB();
+    $aDropTables = array();
+    $aHaveTables = chksql($oDB->getCol("SELECT tablename FROM pg_tables WHERE schemaname='public'"));
+
+    foreach ($aHaveTables as $sTable) {
+        $bFound = false;
+        foreach ($aKeepTables as $sKeep) {
+            if (fnmatch($sKeep, $sTable)) {
+                $bFound = true;
+                break;
+            }
+        }
+        if (!$bFound) array_push($aDropTables, $sTable);
+    }
+
+    foreach ($aDropTables as $sDrop) {
+        if ($aCMDResult['verbose']) echo "dropping table $sDrop\n";
+        @pg_query($oDB->connection, "DROP TABLE $sDrop CASCADE");
+        // ignore warnings/errors as they might be caused by a table having
+        // been deleted already by CASCADE
+    }
+
+    if (!is_null(CONST_Osm2pgsql_Flatnode_File)) {
+        if ($aCMDResult['verbose']) echo "deleting ".CONST_Osm2pgsql_Flatnode_File."\n";
+        unlink(CONST_Osm2pgsql_Flatnode_File);
+    }
+}
+
+if (!$bDidSomething) {
+    showUsage($aCMDOptions, true);
+} else {
+    echo "Setup finished.\n";
+}
+
+
+function pgsqlRunScriptFile($sFilename)
+{
+    if (!file_exists($sFilename)) fail('unable to find '.$sFilename);
+
+    // Convert database DSN to psql parameters
+    $aDSNInfo = DB::parseDSN(CONST_Database_DSN);
+    if (!isset($aDSNInfo['port']) || !$aDSNInfo['port']) $aDSNInfo['port'] = 5432;
+    $sCMD = 'psql -p '.$aDSNInfo['port'].' -d '.$aDSNInfo['database'];
+
+    $ahGzipPipes = null;
+    if (preg_match('/\\.gz$/', $sFilename)) {
+        $aDescriptors = array(
+                         0 => array('pipe', 'r'),
+                         1 => array('pipe', 'w'),
+                         2 => array('file', '/dev/null', 'a')
+                        );
+        $hGzipProcess = proc_open('zcat '.$sFilename, $aDescriptors, $ahGzipPipes);
+        if (!is_resource($hGzipProcess)) fail('unable to start zcat');
+        $aReadPipe = $ahGzipPipes[1];
+        fclose($ahGzipPipes[0]);
+    } else {
+        $sCMD .= ' -f '.$sFilename;
+        $aReadPipe = array('pipe', 'r');
+    }
+
+    $aDescriptors = array(
+                     0 => $aReadPipe,
+                     1 => array('pipe', 'w'),
+                     2 => array('file', '/dev/null', 'a')
+                    );
+    $ahPipes = null;
+    $hProcess = proc_open($sCMD, $aDescriptors, $ahPipes);
+    if (!is_resource($hProcess)) fail('unable to start pgsql');
+
+
+    // TODO: error checking
+    while (!feof($ahPipes[1])) {
+        echo fread($ahPipes[1], 4096);
+    }
+    fclose($ahPipes[1]);
+
+    $iReturn = proc_close($hProcess);
+    if ($iReturn > 0) {
+        fail("pgsql returned with error code ($iReturn)");
+    }
+    if ($ahGzipPipes) {
+        fclose($ahGzipPipes[1]);
+        proc_close($hGzipProcess);
+    }
+}
+
+function pgsqlRunScript($sScript, $bfatal = true)
+{
+    global $aCMDResult;
+    // Convert database DSN to psql parameters
+    $aDSNInfo = DB::parseDSN(CONST_Database_DSN);
+    if (!isset($aDSNInfo['port']) || !$aDSNInfo['port']) $aDSNInfo['port'] = 5432;
+    $sCMD = 'psql -p '.$aDSNInfo['port'].' -d '.$aDSNInfo['database'];
+    if ($bfatal && !$aCMDResult['ignore-errors'])
+        $sCMD .= ' -v ON_ERROR_STOP=1';
+    $aDescriptors = array(
+                     0 => array('pipe', 'r'),
+                     1 => STDOUT,
+                     2 => STDERR
+                    );
+    $ahPipes = null;
+    $hProcess = @proc_open($sCMD, $aDescriptors, $ahPipes);
+    if (!is_resource($hProcess)) fail('unable to start pgsql');
+
+    while (strlen($sScript)) {
+        $written = fwrite($ahPipes[0], $sScript);
+        if ($written <= 0) break;
+        $sScript = substr($sScript, $written);
+    }
+    fclose($ahPipes[0]);
+    $iReturn = proc_close($hProcess);
+    if ($bfatal && $iReturn > 0) {
+        fail("pgsql returned with error code ($iReturn)");
+    }
+}
+
+function pgsqlRunPartitionScript($sTemplate)
+{
+    global $aCMDResult;
+    $oDB =& getDB();
+
+    $sSQL = 'select distinct partition from country_name';
+    $aPartitions = chksql($oDB->getCol($sSQL));
+    if (!$aCMDResult['no-partitions']) $aPartitions[] = 0;
+
+    preg_match_all('#^-- start(.*?)^-- end#ms', $sTemplate, $aMatches, PREG_SET_ORDER);
+    foreach ($aMatches as $aMatch) {
+        $sResult = '';
+        foreach ($aPartitions as $sPartitionName) {
+            $sResult .= str_replace('-partition-', $sPartitionName, $aMatch[1]);
+        }
+        $sTemplate = str_replace($aMatch[0], $sResult, $sTemplate);
+    }
+
+    pgsqlRunScript($sTemplate);
+}
+
+function pgsqlRunRestoreData($sDumpFile)
+{
+    // Convert database DSN to psql parameters
+    $aDSNInfo = DB::parseDSN(CONST_Database_DSN);
+    if (!isset($aDSNInfo['port']) || !$aDSNInfo['port']) $aDSNInfo['port'] = 5432;
+    $sCMD = 'pg_restore -p '.$aDSNInfo['port'].' -d '.$aDSNInfo['database'].' -Fc -a '.$sDumpFile;
+
+    $aDescriptors = array(
+                     0 => array('pipe', 'r'),
+                     1 => array('pipe', 'w'),
+                     2 => array('file', '/dev/null', 'a')
+                    );
+    $ahPipes = null;
+    $hProcess = proc_open($sCMD, $aDescriptors, $ahPipes);
+    if (!is_resource($hProcess)) fail('unable to start pg_restore');
+
+    fclose($ahPipes[0]);
+
+    // TODO: error checking
+    while (!feof($ahPipes[1])) {
+        echo fread($ahPipes[1], 4096);
+    }
+    fclose($ahPipes[1]);
+
+    $iReturn = proc_close($hProcess);
+}
+
+function pgsqlRunDropAndRestore($sDumpFile)
+{
+    // Convert database DSN to psql parameters
+    $aDSNInfo = DB::parseDSN(CONST_Database_DSN);
+    if (!isset($aDSNInfo['port']) || !$aDSNInfo['port']) $aDSNInfo['port'] = 5432;
+    $sCMD = 'pg_restore -p '.$aDSNInfo['port'].' -d '.$aDSNInfo['database'].' -Fc --clean '.$sDumpFile;
+
+    $aDescriptors = array(
+                     0 => array('pipe', 'r'),
+                     1 => array('pipe', 'w'),
+                     2 => array('file', '/dev/null', 'a')
+                    );
+    $ahPipes = null;
+    $hProcess = proc_open($sCMD, $aDescriptors, $ahPipes);
+    if (!is_resource($hProcess)) fail('unable to start pg_restore');
+
+    fclose($ahPipes[0]);
+
+    // TODO: error checking
+    while (!feof($ahPipes[1])) {
+        echo fread($ahPipes[1], 4096);
+    }
+    fclose($ahPipes[1]);
+
+    $iReturn = proc_close($hProcess);
+}
+
+function passthruCheckReturn($cmd)
+{
+    $result = -1;
+    passthru($cmd, $result);
+    if ($result != 0) fail('Error executing external command: '.$cmd);
+}
+
+function replace_tablespace($sTemplate, $sTablespace, $sSql)
+{
+    if ($sTablespace) {
+        $sSql = str_replace($sTemplate, 'TABLESPACE "'.$sTablespace.'"', $sSql);
+    } else {
+        $sSql = str_replace($sTemplate, '', $sSql);
+    }
+
+    return $sSql;
+}
+
+function create_sql_functions($aCMDResult)
+{
+    $sTemplate = file_get_contents(CONST_BasePath.'/sql/functions.sql');
+    $sTemplate = str_replace('{modulepath}', CONST_InstallPath.'/module', $sTemplate);
+    if ($aCMDResult['enable-diff-updates']) {
+        $sTemplate = str_replace('RETURN NEW; -- %DIFFUPDATES%', '--', $sTemplate);
+    }
+    if ($aCMDResult['enable-debug-statements']) {
+        $sTemplate = str_replace('--DEBUG:', '', $sTemplate);
+    }
+    if (CONST_Limit_Reindexing) {
+        $sTemplate = str_replace('--LIMIT INDEXING:', '', $sTemplate);
+    }
+    if (!CONST_Use_US_Tiger_Data) {
+        $sTemplate = str_replace('-- %NOTIGERDATA% ', '', $sTemplate);
+    }
+    if (!CONST_Use_Aux_Location_data) {
+        $sTemplate = str_replace('-- %NOAUXDATA% ', '', $sTemplate);
+    }
+    pgsqlRunScript($sTemplate);
+}
index 189a7a3e00fef086a0d002dc69665e6a58c380c3..50522fc2a3975164a4794f4c315bac053a63564a 100755 (executable)
 #!/usr/bin/php -Cq
 <?php
 
-       require_once(dirname(dirname(__FILE__)).'/settings/settings.php');
-       require_once(CONST_BasePath.'/lib/init-cmd.php');
-       ini_set('memory_limit', '800M');
-       ini_set('display_errors', 'stderr');
-
-        $aCMDOptions = array(
-                "Import and export special phrases",
-                array('help', 'h', 0, 1, 0, 0, false, 'Show Help'),
-                array('quiet', 'q', 0, 1, 0, 0, 'bool', 'Quiet output'),
-                array('verbose', 'v', 0, 1, 0, 0, 'bool', 'Verbose output'),
-                array('countries', '', 0, 1, 0, 0, 'bool', 'Create import script for country codes and names'),
-                array('wiki-import', '', 0, 1, 0, 0, 'bool', 'Create import script for search phrases '),
-        );
-        getCmdOpt($_SERVER['argv'], $aCMDOptions, $aCMDResult, true, true);
-
-               include(CONST_InstallPath.'/settings/phrase_settings.php');
-
-
-    if ($aCMDResult['countries']) {
-        echo "select getorcreate_country(make_standard_name('uk'), 'gb');\n";
-        echo "select getorcreate_country(make_standard_name('united states'), 'us');\n";
-        echo "select count(*) from (select getorcreate_country(make_standard_name(country_code), country_code) from country_name where country_code is not null) as x;\n";
-
-        echo "select count(*) from (select getorcreate_country(make_standard_name(get_name_by_language(country_name.name,ARRAY['name'])), country_code) from country_name where get_name_by_language(country_name.name, ARRAY['name']) is not null) as x;\n";
-        foreach($aLanguageIn as $sLanguage)
-               {
-            echo "select count(*) from (select getorcreate_country(make_standard_name(get_name_by_language(country_name.name,ARRAY['name:".$sLanguage."'])), country_code) from country_name where get_name_by_language(country_name.name, ARRAY['name:".$sLanguage."']) is not null) as x;\n";
+require_once(dirname(dirname(__FILE__)).'/settings/settings.php');
+require_once(CONST_BasePath.'/lib/init-cmd.php');
+ini_set('memory_limit', '800M');
+ini_set('display_errors', 'stderr');
+
+$aCMDOptions
+= array(
+   "Import and export special phrases",
+   array('help', 'h', 0, 1, 0, 0, false, 'Show Help'),
+   array('quiet', 'q', 0, 1, 0, 0, 'bool', 'Quiet output'),
+   array('verbose', 'v', 0, 1, 0, 0, 'bool', 'Verbose output'),
+   array('wiki-import', '', 0, 1, 0, 0, 'bool', 'Create import script for search phrases '),
+  );
+getCmdOpt($_SERVER['argv'], $aCMDOptions, $aCMDResult, true, true);
+
+include(CONST_InstallPath.'/settings/phrase_settings.php');
+
+if ($aCMDResult['wiki-import']) {
+    $aPairs = array();
+
+    $sLanguageIn = CONST_Languages ? CONST_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');
+
+    foreach (explode(',', $sLanguageIn) as $sLanguage) {
+        $sURL = 'http://wiki.openstreetmap.org/wiki/Special:Export/Nominatim/Special_Phrases/'.strtoupper($sLanguage);
+        $sWikiPageXML = file_get_contents($sURL);
+        if (preg_match_all('#\\| ([^|]+) \\|\\| ([^|]+) \\|\\| ([^|]+) \\|\\| ([^|]+) \\|\\| ([\\-YN])#', $sWikiPageXML, $aMatches, PREG_SET_ORDER)) {
+            foreach ($aMatches as $aMatch) {
+                $sLabel = trim($aMatch[1]);
+                $sClass = trim($aMatch[2]);
+                $sType = trim($aMatch[3]);
+                // hack around a bug where building=yes was imported with
+                // quotes into the wiki
+                $sType = preg_replace('/&quot;/', '', $sType);
+                // sanity check, in case somebody added garbage in the wiki
+                if (preg_match('/^\\w+$/', $sClass) < 1
+                    || preg_match('/^\\w+$/', $sType) < 1
+                ) {
+                    trigger_error("Bad class/type for language $sLanguage: $sClass=$sType");
+                    exit;
+                }
+                // blacklisting: disallow certain class/type combinations
+                if (isset($aTagsBlacklist[$sClass]) && in_array($sType, $aTagsBlacklist[$sClass])) {
+                    // fwrite(STDERR, "Blacklisted: ".$sClass."/".$sType."\n");
+                    continue;
+                }
+                // whitelisting: if class is in whitelist, allow only tags in the list
+                if (isset($aTagsWhitelist[$sClass]) && !in_array($sType, $aTagsWhitelist[$sClass])) {
+                    // fwrite(STDERR, "Non-Whitelisted: ".$sClass."/".$sType."\n");
+                    continue;
+                }
+                $aPairs[$sClass.'|'.$sType] = array($sClass, $sType);
+
+                switch (trim($aMatch[4])) {
+                    case 'near':
+                        echo "select getorcreate_amenityoperator(make_standard_name('".pg_escape_string($sLabel)."'), '$sClass', '$sType', 'near');\n";
+                        break;
+                    case 'in':
+                        echo "select getorcreate_amenityoperator(make_standard_name('".pg_escape_string($sLabel)."'), '$sClass', '$sType', 'in');\n";
+                        break;
+                    default:
+                        echo "select getorcreate_amenity(make_standard_name('".pg_escape_string($sLabel)."'), '$sClass', '$sType');\n";
+                        break;
+                }
+            }
         }
     }
 
-       if ($aCMDResult['wiki-import'])
-       {
-               $aPairs = array();
-
-               foreach($aLanguageIn as $sLanguage)
-               {
-                       $sURL = 'http://wiki.openstreetmap.org/wiki/Special:Export/Nominatim/Special_Phrases/'.strtoupper($sLanguage);
-                       $sWikiPageXML = file_get_contents($sURL);
-                       if (preg_match_all('#\\| ([^|]+) \\|\\| ([^|]+) \\|\\| ([^|]+) \\|\\| ([^|]+) \\|\\| ([\\-YN])#', $sWikiPageXML, $aMatches, PREG_SET_ORDER))
-                       {
-                               foreach($aMatches as $aMatch)
-                               {
-                                       $sLabel = trim($aMatch[1]);
-                                       $sClass = trim($aMatch[2]);
-                                       $sType = trim($aMatch[3]);
-                                       # hack around a bug where building=yes was imported with
-                                       # quotes into the wiki
-                                       $sType = preg_replace('/&quot;/', '', $sType);
-                                       # sanity check, in case somebody added garbage in the wiki
-                                       if (preg_match('/^\\w+$/', $sClass) < 1 ||
-                                               preg_match('/^\\w+$/', $sType) < 1) {
-                                               trigger_error("Bad class/type for language $sLanguage: $sClass=$sType");
-                                               exit;
-                                       }
-                                       # blacklisting: disallow certain class/type combinations
-                                       if (isset($aTagsBlacklist[$sClass]) && in_array($sType, $aTagsBlacklist[$sClass])) {
-                                               # fwrite(STDERR, "Blacklisted: ".$sClass."/".$sType."\n");
-                                               continue;
-                                       }
-                                       # whitelisting: if class is in whitelist, allow only tags in the list
-                                       if (isset($aTagsWhitelist[$sClass])     && !in_array($sType, $aTagsWhitelist[$sClass])) {
-                                               # fwrite(STDERR, "Non-Whitelisted: ".$sClass."/".$sType."\n");
-                                               continue;
-                                       }
-                                       $aPairs[$sClass.'|'.$sType] = array($sClass, $sType);
-
-                                       switch(trim($aMatch[4]))
-                                       {
-                                       case 'near':
-                                               echo "select getorcreate_amenityoperator(make_standard_name('".pg_escape_string($sLabel)."'), '$sClass', '$sType', 'near');\n";
-                                               break;
-                                       case 'in':
-                                               echo "select getorcreate_amenityoperator(make_standard_name('".pg_escape_string($sLabel)."'), '$sClass', '$sType', 'in');\n";
-                                               break;
-                                       default:
-                                               echo "select getorcreate_amenity(make_standard_name('".pg_escape_string($sLabel)."'), '$sClass', '$sType');\n";
-                                               break;
-                                       }
-                               }
-                       }
-               }
-
-        echo "create index idx_placex_classtype on placex (class, type);";
-
-               foreach($aPairs as $aPair)
-               {
-                       echo "create table place_classtype_".pg_escape_string($aPair[0])."_".pg_escape_string($aPair[1]);
-                       if (CONST_Tablespace_Aux_Data)
-                               echo " tablespace ".CONST_Tablespace_Aux_Data;
-                       echo " as select place_id as place_id,st_centroid(geometry) as centroid from placex where ";
-                       echo "class = '".pg_escape_string($aPair[0])."' and type = '".pg_escape_string($aPair[1])."'";
-                       echo ";\n";
-
-                       echo "CREATE INDEX idx_place_classtype_".pg_escape_string($aPair[0])."_".pg_escape_string($aPair[1])."_centroid ";
-                       echo "ON place_classtype_".pg_escape_string($aPair[0])."_".pg_escape_string($aPair[1])." USING GIST (centroid)";
-                       if (CONST_Tablespace_Aux_Index)
-                               echo " tablespace ".CONST_Tablespace_Aux_Index;
-                       echo ";\n";
-
-                       echo "CREATE INDEX idx_place_classtype_".pg_escape_string($aPair[0])."_".pg_escape_string($aPair[1])."_place_id ";
-                       echo "ON place_classtype_".pg_escape_string($aPair[0])."_".pg_escape_string($aPair[1])." USING btree(place_id)";
-                       if (CONST_Tablespace_Aux_Index)
-                               echo " tablespace ".CONST_Tablespace_Aux_Index;
-                       echo ";\n";
-
-            echo "GRANT SELECT ON place_classtype_".pg_escape_string($aPair[0])."_".pg_escape_string($aPair[1]).' TO "'.CONST_Database_Web_User."\";\n";
-
-               }
+    echo "create index idx_placex_classtype on placex (class, type);";
+
+    foreach ($aPairs as $aPair) {
+        echo "create table place_classtype_".pg_escape_string($aPair[0])."_".pg_escape_string($aPair[1]);
+        if (CONST_Tablespace_Aux_Data)
+            echo " tablespace ".CONST_Tablespace_Aux_Data;
+        echo " as select place_id as place_id,st_centroid(geometry) as centroid from placex where ";
+        echo "class = '".pg_escape_string($aPair[0])."' and type = '".pg_escape_string($aPair[1])."'";
+        echo ";\n";
+
+        echo "CREATE INDEX idx_place_classtype_".pg_escape_string($aPair[0])."_".pg_escape_string($aPair[1])."_centroid ";
+        echo "ON place_classtype_".pg_escape_string($aPair[0])."_".pg_escape_string($aPair[1])." USING GIST (centroid)";
+        if (CONST_Tablespace_Aux_Index)
+            echo " tablespace ".CONST_Tablespace_Aux_Index;
+        echo ";\n";
+
+        echo "CREATE INDEX idx_place_classtype_".pg_escape_string($aPair[0])."_".pg_escape_string($aPair[1])."_place_id ";
+        echo "ON place_classtype_".pg_escape_string($aPair[0])."_".pg_escape_string($aPair[1])." USING btree(place_id)";
+        if (CONST_Tablespace_Aux_Index)
+            echo " tablespace ".CONST_Tablespace_Aux_Index;
+        echo ";\n";
+
+        echo "GRANT SELECT ON place_classtype_".pg_escape_string($aPair[0])."_".pg_escape_string($aPair[1]).' TO "'.CONST_Database_Web_User."\";\n";
+    }
 
-        echo "drop index idx_placex_classtype;";
-       }
+    echo "drop index idx_placex_classtype;";
+}
index a05ad9e4e53bf7044e09037ce6bdb5d38baf2b39..efdf652570d154a4f50925eb22657d7f463d137e 100755 (executable)
 #!/usr/bin/php -Cq
 <?php
 
-       require_once(dirname(dirname(__FILE__)).'/settings/settings.php');
-       require_once(CONST_BasePath.'/lib/init-cmd.php');
-       ini_set('memory_limit', '800M');
-
-       $aCMDOptions = array(
-               "Import / update / index osm data",
-               array('help', 'h', 0, 1, 0, 0, false, 'Show Help'),
-               array('quiet', 'q', 0, 1, 0, 0, 'bool', 'Quiet output'),
-               array('verbose', 'v', 0, 1, 0, 0, 'bool', 'Verbose output'),
-
-               array('import-osmosis', '', 0, 1, 0, 0, 'bool', 'Import using osmosis'),
-               array('import-osmosis-all', '', 0, 1, 0, 0, 'bool', 'Import using osmosis forever'),
-               array('no-npi', '', 0, 1, 0, 0, 'bool', '(obsolate)'),
-               array('no-index', '', 0, 1, 0, 0, 'bool', 'Do not index the new data'),
-
-               array('import-all', '', 0, 1, 0, 0, 'bool', 'Import all available files'),
-
-               array('import-file', '', 0, 1, 1, 1, 'realpath', 'Re-import data from an OSM file'),
-               array('import-diff', '', 0, 1, 1, 1, 'realpath', 'Import a diff (osc) file from local file system'),
-               array('osm2pgsql-cache', '', 0, 1, 1, 1, 'int', 'Cache size used by osm2pgsql'),
-
-               array('import-node', '', 0, 1, 1, 1, 'int', 'Re-import node'),
-               array('import-way', '', 0, 1, 1, 1, 'int', 'Re-import way'),
-               array('import-relation', '', 0, 1, 1, 1, 'int', 'Re-import relation'),
-               array('import-from-main-api', '', 0, 1, 0, 0, 'bool', 'Use OSM API instead of Overpass to download objects'),
-
-               array('index', '', 0, 1, 0, 0, 'bool', 'Index'),
-               array('index-rank', '', 0, 1, 1, 1, 'int', 'Rank to start indexing from'),
-               array('index-instances', '', 0, 1, 1, 1, 'int', 'Number of indexing instances (threads)'),
-
-               array('deduplicate', '', 0, 1, 0, 0, 'bool', 'Deduplicate tokens'),
-       );
-       getCmdOpt($_SERVER['argv'], $aCMDOptions, $aResult, true, true);
-
-       if (!isset($aResult['index-instances'])) $aResult['index-instances'] = 1;
-       if (!isset($aResult['index-rank'])) $aResult['index-rank'] = 0;
-
-       date_default_timezone_set('Etc/UTC');
-
-       $oDB =& getDB();
-
-       $aDSNInfo = DB::parseDSN(CONST_Database_DSN);
-       if (!isset($aDSNInfo['port']) || !$aDSNInfo['port']) $aDSNInfo['port'] = 5432;
-
-       // cache memory to be used by osm2pgsql, should not be more than the available memory
-       $iCacheMemory = (isset($aResult['osm2pgsql-cache'])?$aResult['osm2pgsql-cache']:2000);
-       if ($iCacheMemory + 500 > getTotalMemoryMB())
-       {
-               $iCacheMemory = getCacheMemoryMB();
-               echo "WARNING: resetting cache memory to $iCacheMemory\n";
-       }
-       $sOsm2pgsqlCmd = CONST_Osm2pgsql_Binary.' -klas --number-processes 1 -C '.$iCacheMemory.' -O gazetteer -d '.$aDSNInfo['database'].' -P '.$aDSNInfo['port'];
-       if (!is_null(CONST_Osm2pgsql_Flatnode_File))
-       {
-               $sOsm2pgsqlCmd .= ' --flat-nodes '.CONST_Osm2pgsql_Flatnode_File;
-       }
-
-
-       if (isset($aResult['import-diff']))
-       {
-               // import diff directly (e.g. from osmosis --rri)
-               $sNextFile = $aResult['import-diff'];
-               if (!file_exists($sNextFile))
-               {
-                       fail("Cannot open $sNextFile\n");
-               }
-
-               // Import the file
-               $sCMD = $sOsm2pgsqlCmd.' '.$sNextFile;
-               echo $sCMD."\n";
-               exec($sCMD, $sJunk, $iErrorLevel);
-
-               if ($iErrorLevel)
-               {
-                       fail("Error from osm2pgsql, $iErrorLevel\n");
-               }
-
-               // Don't update the import status - we don't know what this file contains
-       }
-
-       $sTemporaryFile = CONST_BasePath.'/data/osmosischange.osc';
-       $bHaveDiff = false;
-       if (isset($aResult['import-file']) && $aResult['import-file'])
-       {
-               $bHaveDiff = true;
-               $sCMD = CONST_Osmosis_Binary.' --read-xml \''.$aResult['import-file'].'\' --read-empty --derive-change --write-xml-change '.$sTemporaryFile;
-               echo $sCMD."\n";
-               exec($sCMD, $sJunk, $iErrorLevel);
-               if ($iErrorLevel)
-               {
-                       fail("Error converting osm to osc, osmosis returned: $iErrorLevel\n");
-               }
-       }
-
-       $bUseOSMApi = isset($aResult['import-from-main-api']) && $aResult['import-from-main-api'];
-       $sContentURL = '';
-       if (isset($aResult['import-node']) && $aResult['import-node'])
-       {
-               if ($bUseOSMApi)
-               {
-                       $sContentURL = 'http://www.openstreetmap.org/api/0.6/node/'.$aResult['import-node'];
-               }
-               else
-               {
-                       $sContentURL = 'http://overpass-api.de/api/interpreter?data=node('.$aResult['import-node'].');out%20meta;';
-               }
-       }
-       if (isset($aResult['import-way']) && $aResult['import-way'])
-       {
-               if ($bUseOSMApi)
-               {
-                       $sContentURL = 'http://www.openstreetmap.org/api/0.6/way/'.$aResult['import-way'].'/full';
-               }
-               else
-               {
-                       $sContentURL = 'http://overpass-api.de/api/interpreter?data=(way('.$aResult['import-way'].');node(w););out%20meta;';
-               }
-       }
-       if (isset($aResult['import-relation']) && $aResult['import-relation'])
-       {
-               if ($bUseOSMApi)
-               {
-                       $sContentURLsModifyXMLstr = 'http://www.openstreetmap.org/api/0.6/relation/'.$aResult['import-relation'].'/full';
-               }
-               else
-               {
-                       $sContentURL = 'http://overpass-api.de/api/interpreter?data=((rel('.$aResult['import-relation'].');way(r);node(w));node(r));out%20meta;';
-               }
-       }
-       if ($sContentURL)
-       {
-               $sModifyXMLstr = file_get_contents($sContentURL);
-               $bHaveDiff = true;
-
-               $aSpec = array(
-                       0 => array("pipe", "r"),  // stdin
-                       1 => array("pipe", "w"),  // stdout
-                       2 => array("pipe", "w") // stderr
-               );
-               $sCMD = CONST_Osmosis_Binary.' --read-xml - --read-empty --derive-change --write-xml-change '.$sTemporaryFile;
-               echo $sCMD."\n";
-               $hProc = proc_open($sCMD, $aSpec, $aPipes);
-               if (!is_resource($hProc))
-               {
-                       fail("Error converting osm to osc, osmosis failed\n");
-               }
-               fwrite($aPipes[0], $sModifyXMLstr);
-               fclose($aPipes[0]);
-               $sOut = stream_get_contents($aPipes[1]);
-               if ($aResult['verbose']) echo $sOut;
-               fclose($aPipes[1]);
-               $sErrors = stream_get_contents($aPipes[2]);
-               if ($aResult['verbose']) echo $sErrors;
-               fclose($aPipes[2]);
-               if ($iError = proc_close($hProc))
-               {
-                       echo $sOut;
-                       echo $sErrors;
-                       fail("Error converting osm to osc, osmosis returned: $iError\n");
-               }
-       }
-
-       if ($bHaveDiff)
-       {
-               // import generated change file
-               $sCMD = $sOsm2pgsqlCmd.' '.$sTemporaryFile;
-               echo $sCMD."\n";
-               exec($sCMD, $sJunk, $iErrorLevel);
-               if ($iErrorLevel)
-               {
-                       fail("osm2pgsql exited with error level $iErrorLevel\n");
-               }
-       }
-
-       if ($aResult['deduplicate'])
-       {
-
-               if (getPostgresVersion() < 9.3)
-               {
-                       fail("ERROR: deduplicate is only currently supported in postgresql 9.3");
-               }
-
-               $oDB =& getDB();
-               $sSQL = 'select partition from country_name order by country_code';
-               $aPartitions = chksql($oDB->getCol($sSQL));
-               $aPartitions[] = 0;
-
-               $sSQL = "select word_token,count(*) from word where substr(word_token, 1, 1) = ' ' and class is null and type is null and country_code is null group by word_token having count(*) > 1 order by word_token";
-               $aDuplicateTokens = chksql($oDB->getAll($sSQL));
-               foreach($aDuplicateTokens as $aToken)
-               {
-                       if (trim($aToken['word_token']) == '' || trim($aToken['word_token']) == '-') continue;
-                       echo "Deduping ".$aToken['word_token']."\n";
-                       $sSQL = "select word_id,(select count(*) from search_name where nameaddress_vector @> ARRAY[word_id]) as num from word where word_token = '".$aToken['word_token']."' and class is null and type is null and country_code is null order by num desc";
-                       $aTokenSet = chksql($oDB->getAll($sSQL));
-
-                       $aKeep = array_shift($aTokenSet);
-                       $iKeepID = $aKeep['word_id'];
-
-                       foreach($aTokenSet as $aRemove)
-                       {
-                               $sSQL = "update search_name set";
-                               $sSQL .= " name_vector = array_replace(name_vector,".$aRemove['word_id'].",".$iKeepID."),";
-                               $sSQL .= " nameaddress_vector = array_replace(nameaddress_vector,".$aRemove['word_id'].",".$iKeepID.")";
-                               $sSQL .= " where name_vector @> ARRAY[".$aRemove['word_id']."]";
-                               chksql($oDB->query($sSQL));
-
-                               $sSQL = "update search_name set";
-                               $sSQL .= " nameaddress_vector = array_replace(nameaddress_vector,".$aRemove['word_id'].",".$iKeepID.")";
-                               $sSQL .= " where nameaddress_vector @> ARRAY[".$aRemove['word_id']."]";
-                               chksql($oDB->query($sSQL));
-
-                               $sSQL = "update location_area_country set";
-                               $sSQL .= " keywords = array_replace(keywords,".$aRemove['word_id'].",".$iKeepID.")";
-                               $sSQL .= " where keywords @> ARRAY[".$aRemove['word_id']."]";
-                               chksql($oDB->query($sSQL));
-
-                               foreach ($aPartitions as $sPartition)
-                               {
-                                       $sSQL = "update search_name_".$sPartition." set";
-                                       $sSQL .= " name_vector = array_replace(name_vector,".$aRemove['word_id'].",".$iKeepID.")";
-                                       $sSQL .= " where name_vector @> ARRAY[".$aRemove['word_id']."]";
-                                       chksql($oDB->query($sSQL));
-
-                                       $sSQL = "update location_area_country set";
-                                       $sSQL .= " keywords = array_replace(keywords,".$aRemove['word_id'].",".$iKeepID.")";
-                                       $sSQL .= " where keywords @> ARRAY[".$aRemove['word_id']."]";
-                                       chksql($oDB->query($sSQL));
-                               }
-
-                               $sSQL = "delete from word where word_id = ".$aRemove['word_id'];
-                               chksql($oDB->query($sSQL));
-                       }
-               }
-       }
-
-       if ($aResult['index'])
-       {
-               passthru(CONST_InstallPath.'/nominatim/nominatim -i -d '.$aDSNInfo['database'].' -P '.$aDSNInfo['port'].' -t '.$aResult['index-instances'].' -r '.$aResult['index-rank']);
-       }
-
-       if ($aResult['import-osmosis'] || $aResult['import-osmosis-all'])
-       {
-
-               if (strpos(CONST_Replication_Url, 'download.geofabrik.de') !== false && CONST_Replication_Update_Interval < 86400) {
-                       fail("Error: Update interval too low for download.geofabrik.de.  Please check install documentation (http://wiki.openstreetmap.org/wiki/Nominatim/Installation#Updates)\n");
-               }
-
-               $sImportFile = CONST_BasePath.'/data/osmosischange.osc';
-               $sOsmosisConfigDirectory = CONST_InstallPath.'/settings';
-               $sCMDDownload = CONST_Osmosis_Binary.' --read-replication-interval workingDirectory='.$sOsmosisConfigDirectory.' --simplify-change --write-xml-change '.$sImportFile;
-               $sCMDCheckReplicationLag = CONST_Osmosis_Binary.' -q --read-replication-lag workingDirectory='.$sOsmosisConfigDirectory;
-               $sCMDImport = $sOsm2pgsqlCmd.' '.$sImportFile;
-               $sCMDIndex = CONST_InstallPath.'/nominatim/nominatim -i -d '.$aDSNInfo['database'].' -P '.$aDSNInfo['port'].' -t '.$aResult['index-instances'];
-
-               while(true)
-               {
-                       $fStartTime = time();
-                       $iFileSize = 1001;
-
-                       if (!file_exists($sImportFile))
-                       {
-                               // First check if there are new updates published (except for minutelies - there's always new diffs to process)
-                               if ( CONST_Replication_Update_Interval > 60 )
-                               {
-
-                                       unset($aReplicationLag);
-                                       exec($sCMDCheckReplicationLag, $aReplicationLag, $iErrorLevel); 
-                                       while ($iErrorLevel > 0 || $aReplicationLag[0] < 1)
-                                       {
-                                               if ($iErrorLevel)
-                                               {
-                                                       echo "Error: $iErrorLevel. ";
-                                                       echo "Re-trying: ".$sCMDCheckReplicationLag." in ".CONST_Replication_Recheck_Interval." secs\n";
-                                               }
-                                               else
-                                               {
-                                                       echo ".";
-                                               }
-                                               sleep(CONST_Replication_Recheck_Interval);
-                                               unset($aReplicationLag);
-                                               exec($sCMDCheckReplicationLag, $aReplicationLag, $iErrorLevel); 
-                                       }
-                                       // There are new replication files - use osmosis to download the file
-                                       echo "\n".date('Y-m-d H:i:s')." Replication Delay is ".$aReplicationLag[0]."\n";
-                               }
-                               $fStartTime = time();
-                               $fCMDStartTime = time();
-                               echo $sCMDDownload."\n";
-                               exec($sCMDDownload, $sJunk, $iErrorLevel);
-                               while ($iErrorLevel > 0)
-                               {
-                                       echo "Error: $iErrorLevel\n";
-                                       sleep(60);
-                                       echo 'Re-trying: '.$sCMDDownload."\n";
-                                       exec($sCMDDownload, $sJunk, $iErrorLevel);
-                               }
-                               $iFileSize = filesize($sImportFile);
-                               $sBatchEnd = getosmosistimestamp($sOsmosisConfigDirectory);
-                               $sSQL = "INSERT INTO import_osmosis_log values ('$sBatchEnd',$iFileSize,'".date('Y-m-d H:i:s',$fCMDStartTime)."','".date('Y-m-d H:i:s')."','osmosis')";
-                               var_Dump($sSQL);
-                               $oDB->query($sSQL);
-                               echo date('Y-m-d H:i:s')." Completed osmosis step for $sBatchEnd in ".round((time()-$fCMDStartTime)/60,2)." minutes\n";
-                       }
-
-                       $iFileSize = filesize($sImportFile);
-                       $sBatchEnd = getosmosistimestamp($sOsmosisConfigDirectory);
-       
-                       // Import the file
-                       $fCMDStartTime = time();
-                       echo $sCMDImport."\n";
-                       exec($sCMDImport, $sJunk, $iErrorLevel);
-                       if ($iErrorLevel)
-                       {
-                               echo "Error: $iErrorLevel\n";
-                               exit($iErrorLevel);
-                       }
-                       $sSQL = "INSERT INTO import_osmosis_log values ('$sBatchEnd',$iFileSize,'".date('Y-m-d H:i:s',$fCMDStartTime)."','".date('Y-m-d H:i:s')."','osm2pgsql')";
-                       var_Dump($sSQL);
-                       $oDB->query($sSQL);
-                       echo date('Y-m-d H:i:s')." Completed osm2pgsql step for $sBatchEnd in ".round((time()-$fCMDStartTime)/60,2)." minutes\n";
-
-                       // Archive for debug?
-                       unlink($sImportFile);
-
-                       $sBatchEnd = getosmosistimestamp($sOsmosisConfigDirectory);
-
-                       // Index file
-                       if (!isset($aResult['index-instances']))
-                       {
-                               if (getLoadAverage() < 24)
-                                       $iIndexInstances = 2;
-                               else
-                                       $iIndexInstances = 1;
-                       } else
-                               $iIndexInstances = $aResult['index-instances'];
-
-                       $sThisIndexCmd = $sCMDIndex.' -t '.$iIndexInstances;
-                       $fCMDStartTime = time();
-
-                       if (!$aResult['no-index'])
-                       {
-                               echo "$sThisIndexCmd\n";
-                               exec($sThisIndexCmd, $sJunk, $iErrorLevel);
-                               if ($iErrorLevel)
-                               {
-                                       echo "Error: $iErrorLevel\n";
-                                       exit($iErrorLevel);
-                               }
-                       }
-
-                       $sSQL = "INSERT INTO import_osmosis_log values ('$sBatchEnd',$iFileSize,'".date('Y-m-d H:i:s',$fCMDStartTime)."','".date('Y-m-d H:i:s')."','index')";
-                       var_Dump($sSQL);
-                       $oDB->query($sSQL);
-                       echo date('Y-m-d H:i:s')." Completed index step for $sBatchEnd in ".round((time()-$fCMDStartTime)/60,2)." minutes\n";
-
-                       $sSQL = "update import_status set lastimportdate = '$sBatchEnd'";
-                       $oDB->query($sSQL);
-
-                       $fDuration = time() - $fStartTime;
-                       echo date('Y-m-d H:i:s')." Completed all for $sBatchEnd in ".round($fDuration/60,2)." minutes\n";
-                       if (!$aResult['import-osmosis-all']) exit(0);
-
-                       if ( CONST_Replication_Update_Interval > 60 )
-                       {
-                               $iSleep = max(0,(strtotime($sBatchEnd)+CONST_Replication_Update_Interval-time()));
-                       }
-                       else
-                       {
-                               $iSleep = max(0,CONST_Replication_Update_Interval-$fDuration);
-                       }
-                       echo date('Y-m-d H:i:s')." Sleeping $iSleep seconds\n";
-                       sleep($iSleep);
-               }
-       }
-
-       function getosmosistimestamp($sOsmosisConfigDirectory)
-       {
-               $sStateFile = file_get_contents($sOsmosisConfigDirectory.'/state.txt');
-               preg_match('#timestamp=(.+)#', $sStateFile, $aResult);
-               return str_replace('\:',':',$aResult[1]);
-       }
+require_once(dirname(dirname(__FILE__)).'/settings/settings.php');
+require_once(CONST_BasePath.'/lib/init-cmd.php');
+ini_set('memory_limit', '800M');
+
+$aCMDOptions
+= array(
+   "Import / update / index osm data",
+   array('help', 'h', 0, 1, 0, 0, false, 'Show Help'),
+   array('quiet', 'q', 0, 1, 0, 0, 'bool', 'Quiet output'),
+   array('verbose', 'v', 0, 1, 0, 0, 'bool', 'Verbose output'),
+
+   array('import-osmosis', '', 0, 1, 0, 0, 'bool', 'Import using osmosis'),
+   array('import-osmosis-all', '', 0, 1, 0, 0, 'bool', 'Import using osmosis forever'),
+   array('no-npi', '', 0, 1, 0, 0, 'bool', '(obsolate)'),
+   array('no-index', '', 0, 1, 0, 0, 'bool', 'Do not index the new data'),
+
+   array('import-all', '', 0, 1, 0, 0, 'bool', 'Import all available files'),
+
+   array('import-file', '', 0, 1, 1, 1, 'realpath', 'Re-import data from an OSM file'),
+   array('import-diff', '', 0, 1, 1, 1, 'realpath', 'Import a diff (osc) file from local file system'),
+   array('osm2pgsql-cache', '', 0, 1, 1, 1, 'int', 'Cache size used by osm2pgsql'),
+
+   array('import-node', '', 0, 1, 1, 1, 'int', 'Re-import node'),
+   array('import-way', '', 0, 1, 1, 1, 'int', 'Re-import way'),
+   array('import-relation', '', 0, 1, 1, 1, 'int', 'Re-import relation'),
+   array('import-from-main-api', '', 0, 1, 0, 0, 'bool', 'Use OSM API instead of Overpass to download objects'),
+
+   array('index', '', 0, 1, 0, 0, 'bool', 'Index'),
+   array('index-rank', '', 0, 1, 1, 1, 'int', 'Rank to start indexing from'),
+   array('index-instances', '', 0, 1, 1, 1, 'int', 'Number of indexing instances (threads)'),
+
+   array('deduplicate', '', 0, 1, 0, 0, 'bool', 'Deduplicate tokens'),
+  );
+getCmdOpt($_SERVER['argv'], $aCMDOptions, $aResult, true, true);
+
+if (!isset($aResult['index-instances'])) $aResult['index-instances'] = 1;
+if (!isset($aResult['index-rank'])) $aResult['index-rank'] = 0;
+
+date_default_timezone_set('Etc/UTC');
+
+$oDB =& getDB();
+
+$aDSNInfo = DB::parseDSN(CONST_Database_DSN);
+if (!isset($aDSNInfo['port']) || !$aDSNInfo['port']) $aDSNInfo['port'] = 5432;
+
+// cache memory to be used by osm2pgsql, should not be more than the available memory
+$iCacheMemory = (isset($aResult['osm2pgsql-cache'])?$aResult['osm2pgsql-cache']:2000);
+if ($iCacheMemory + 500 > getTotalMemoryMB()) {
+    $iCacheMemory = getCacheMemoryMB();
+    echo "WARNING: resetting cache memory to $iCacheMemory\n";
+}
+$sOsm2pgsqlCmd = CONST_Osm2pgsql_Binary.' -klas --number-processes 1 -C '.$iCacheMemory.' -O gazetteer -d '.$aDSNInfo['database'].' -P '.$aDSNInfo['port'];
+if (!is_null(CONST_Osm2pgsql_Flatnode_File)) {
+    $sOsm2pgsqlCmd .= ' --flat-nodes '.CONST_Osm2pgsql_Flatnode_File;
+}
+
+
+if (isset($aResult['import-diff'])) {
+    // import diff directly (e.g. from osmosis --rri)
+    $sNextFile = $aResult['import-diff'];
+    if (!file_exists($sNextFile)) {
+        fail("Cannot open $sNextFile\n");
+    }
+
+    // Import the file
+    $sCMD = $sOsm2pgsqlCmd.' '.$sNextFile;
+    echo $sCMD."\n";
+    exec($sCMD, $sJunk, $iErrorLevel);
+
+    if ($iErrorLevel) {
+        fail("Error from osm2pgsql, $iErrorLevel\n");
+    }
+
+    // Don't update the import status - we don't know what this file contains
+}
+
+$sTemporaryFile = CONST_BasePath.'/data/osmosischange.osc';
+$bHaveDiff = false;
+if (isset($aResult['import-file']) && $aResult['import-file']) {
+    $bHaveDiff = true;
+    $sCMD = CONST_Osmosis_Binary.' --read-xml \''.$aResult['import-file'].'\' --read-empty --derive-change --write-xml-change '.$sTemporaryFile;
+    echo $sCMD."\n";
+    exec($sCMD, $sJunk, $iErrorLevel);
+    if ($iErrorLevel) {
+        fail("Error converting osm to osc, osmosis returned: $iErrorLevel\n");
+    }
+}
+
+$bUseOSMApi = isset($aResult['import-from-main-api']) && $aResult['import-from-main-api'];
+$sContentURL = '';
+if (isset($aResult['import-node']) && $aResult['import-node']) {
+    if ($bUseOSMApi) {
+        $sContentURL = 'http://www.openstreetmap.org/api/0.6/node/'.$aResult['import-node'];
+    } else {
+        $sContentURL = 'http://overpass-api.de/api/interpreter?data=node('.$aResult['import-node'].');out%20meta;';
+    }
+}
+
+if (isset($aResult['import-way']) && $aResult['import-way']) {
+    if ($bUseOSMApi) {
+        $sContentURL = 'http://www.openstreetmap.org/api/0.6/way/'.$aResult['import-way'].'/full';
+    } else {
+        $sContentURL = 'http://overpass-api.de/api/interpreter?data=(way('.$aResult['import-way'].');node(w););out%20meta;';
+    }
+}
+
+if (isset($aResult['import-relation']) && $aResult['import-relation']) {
+    if ($bUseOSMApi) {
+        $sContentURLsModifyXMLstr = 'http://www.openstreetmap.org/api/0.6/relation/'.$aResult['import-relation'].'/full';
+    } else {
+        $sContentURL = 'http://overpass-api.de/api/interpreter?data=((rel('.$aResult['import-relation'].');way(r);node(w));node(r));out%20meta;';
+    }
+}
+
+if ($sContentURL) {
+    $sModifyXMLstr = file_get_contents($sContentURL);
+    $bHaveDiff = true;
+
+    $aSpec = array(
+              0 => array("pipe", "r"),  // stdin
+              1 => array("pipe", "w"),  // stdout
+              2 => array("pipe", "w") // stderr
+             );
+    $sCMD = CONST_Osmosis_Binary.' --read-xml - --read-empty --derive-change --write-xml-change '.$sTemporaryFile;
+    echo $sCMD."\n";
+    $hProc = proc_open($sCMD, $aSpec, $aPipes);
+    if (!is_resource($hProc)) {
+        fail("Error converting osm to osc, osmosis failed\n");
+    }
+    fwrite($aPipes[0], $sModifyXMLstr);
+    fclose($aPipes[0]);
+    $sOut = stream_get_contents($aPipes[1]);
+    if ($aResult['verbose']) echo $sOut;
+    fclose($aPipes[1]);
+    $sErrors = stream_get_contents($aPipes[2]);
+    if ($aResult['verbose']) echo $sErrors;
+    fclose($aPipes[2]);
+    if ($iError = proc_close($hProc)) {
+        echo $sOut;
+        echo $sErrors;
+        fail("Error converting osm to osc, osmosis returned: $iError\n");
+    }
+}
+
+if ($bHaveDiff) {
+    // import generated change file
+    $sCMD = $sOsm2pgsqlCmd.' '.$sTemporaryFile;
+    echo $sCMD."\n";
+    exec($sCMD, $sJunk, $iErrorLevel);
+    if ($iErrorLevel) {
+        fail("osm2pgsql exited with error level $iErrorLevel\n");
+    }
+}
+
+if ($aResult['deduplicate']) {
+    //
+    if (getPostgresVersion() < 9.3) {
+        fail("ERROR: deduplicate is only currently supported in postgresql 9.3");
+    }
+
+    $oDB =& getDB();
+    $sSQL = 'select partition from country_name order by country_code';
+    $aPartitions = chksql($oDB->getCol($sSQL));
+    $aPartitions[] = 0;
+
+    $sSQL = "select word_token,count(*) from word where substr(word_token, 1, 1) = ' ' and class is null and type is null and country_code is null group by word_token having count(*) > 1 order by word_token";
+    $aDuplicateTokens = chksql($oDB->getAll($sSQL));
+    foreach ($aDuplicateTokens as $aToken) {
+        if (trim($aToken['word_token']) == '' || trim($aToken['word_token']) == '-') continue;
+        echo "Deduping ".$aToken['word_token']."\n";
+        $sSQL = "select word_id,(select count(*) from search_name where nameaddress_vector @> ARRAY[word_id]) as num from word where word_token = '".$aToken['word_token']."' and class is null and type is null and country_code is null order by num desc";
+        $aTokenSet = chksql($oDB->getAll($sSQL));
+
+        $aKeep = array_shift($aTokenSet);
+        $iKeepID = $aKeep['word_id'];
+
+        foreach ($aTokenSet as $aRemove) {
+            $sSQL = "update search_name set";
+            $sSQL .= " name_vector = array_replace(name_vector,".$aRemove['word_id'].",".$iKeepID."),";
+            $sSQL .= " nameaddress_vector = array_replace(nameaddress_vector,".$aRemove['word_id'].",".$iKeepID.")";
+            $sSQL .= " where name_vector @> ARRAY[".$aRemove['word_id']."]";
+            chksql($oDB->query($sSQL));
+
+            $sSQL = "update search_name set";
+            $sSQL .= " nameaddress_vector = array_replace(nameaddress_vector,".$aRemove['word_id'].",".$iKeepID.")";
+            $sSQL .= " where nameaddress_vector @> ARRAY[".$aRemove['word_id']."]";
+            chksql($oDB->query($sSQL));
+
+            $sSQL = "update location_area_country set";
+            $sSQL .= " keywords = array_replace(keywords,".$aRemove['word_id'].",".$iKeepID.")";
+            $sSQL .= " where keywords @> ARRAY[".$aRemove['word_id']."]";
+            chksql($oDB->query($sSQL));
+
+            foreach ($aPartitions as $sPartition) {
+                $sSQL = "update search_name_".$sPartition." set";
+                $sSQL .= " name_vector = array_replace(name_vector,".$aRemove['word_id'].",".$iKeepID.")";
+                $sSQL .= " where name_vector @> ARRAY[".$aRemove['word_id']."]";
+                chksql($oDB->query($sSQL));
+
+                $sSQL = "update location_area_country set";
+                $sSQL .= " keywords = array_replace(keywords,".$aRemove['word_id'].",".$iKeepID.")";
+                $sSQL .= " where keywords @> ARRAY[".$aRemove['word_id']."]";
+                chksql($oDB->query($sSQL));
+            }
+
+            $sSQL = "delete from word where word_id = ".$aRemove['word_id'];
+            chksql($oDB->query($sSQL));
+        }
+    }
+}
+
+if ($aResult['index']) {
+    passthru(CONST_InstallPath.'/nominatim/nominatim -i -d '.$aDSNInfo['database'].' -P '.$aDSNInfo['port'].' -t '.$aResult['index-instances'].' -r '.$aResult['index-rank']);
+}
+
+if ($aResult['import-osmosis'] || $aResult['import-osmosis-all']) {
+    //
+    if (strpos(CONST_Replication_Url, 'download.geofabrik.de') !== false && CONST_Replication_Update_Interval < 86400) {
+        fail("Error: Update interval too low for download.geofabrik.de.  Please check install documentation (http://wiki.openstreetmap.org/wiki/Nominatim/Installation#Updates)\n");
+    }
+
+    $sImportFile = CONST_BasePath.'/data/osmosischange.osc';
+    $sOsmosisConfigDirectory = CONST_InstallPath.'/settings';
+    $sCMDDownload = CONST_Osmosis_Binary.' --read-replication-interval workingDirectory='.$sOsmosisConfigDirectory.' --simplify-change --write-xml-change '.$sImportFile;
+    $sCMDCheckReplicationLag = CONST_Osmosis_Binary.' -q --read-replication-lag workingDirectory='.$sOsmosisConfigDirectory;
+    $sCMDImport = $sOsm2pgsqlCmd.' '.$sImportFile;
+    $sCMDIndex = CONST_InstallPath.'/nominatim/nominatim -i -d '.$aDSNInfo['database'].' -P '.$aDSNInfo['port'].' -t '.$aResult['index-instances'];
+
+    while (true) {
+        $fStartTime = time();
+        $iFileSize = 1001;
+
+        if (!file_exists($sImportFile)) {
+            // First check if there are new updates published (except for minutelies - there's always new diffs to process)
+            if (CONST_Replication_Update_Interval > 60) {
+                unset($aReplicationLag);
+                exec($sCMDCheckReplicationLag, $aReplicationLag, $iErrorLevel);
+                while ($iErrorLevel > 0 || $aReplicationLag[0] < 1) {
+                    if ($iErrorLevel) {
+                        echo "Error: $iErrorLevel. ";
+                        echo "Re-trying: ".$sCMDCheckReplicationLag." in ".CONST_Replication_Recheck_Interval." secs\n";
+                    } else {
+                        echo ".";
+                    }
+                    sleep(CONST_Replication_Recheck_Interval);
+                    unset($aReplicationLag);
+                    exec($sCMDCheckReplicationLag, $aReplicationLag, $iErrorLevel);
+                }
+                // There are new replication files - use osmosis to download the file
+                echo "\n".date('Y-m-d H:i:s')." Replication Delay is ".$aReplicationLag[0]."\n";
+            }
+            $fStartTime = time();
+            $fCMDStartTime = time();
+            echo $sCMDDownload."\n";
+            exec($sCMDDownload, $sJunk, $iErrorLevel);
+            while ($iErrorLevel > 0) {
+                echo "Error: $iErrorLevel\n";
+                sleep(60);
+                echo 'Re-trying: '.$sCMDDownload."\n";
+                exec($sCMDDownload, $sJunk, $iErrorLevel);
+            }
+            $iFileSize = filesize($sImportFile);
+            $sBatchEnd = getosmosistimestamp($sOsmosisConfigDirectory);
+            $sSQL = "INSERT INTO import_osmosis_log values ('$sBatchEnd',$iFileSize,'".date('Y-m-d H:i:s', $fCMDStartTime)."','".date('Y-m-d H:i:s')."','osmosis')";
+            var_Dump($sSQL);
+            $oDB->query($sSQL);
+            echo date('Y-m-d H:i:s')." Completed osmosis step for $sBatchEnd in ".round((time()-$fCMDStartTime)/60, 2)." minutes\n";
+        }
+
+        $iFileSize = filesize($sImportFile);
+        $sBatchEnd = getosmosistimestamp($sOsmosisConfigDirectory);
+
+        // Import the file
+        $fCMDStartTime = time();
+        echo $sCMDImport."\n";
+        exec($sCMDImport, $sJunk, $iErrorLevel);
+        if ($iErrorLevel) {
+            echo "Error: $iErrorLevel\n";
+            exit($iErrorLevel);
+        }
+        $sSQL = "INSERT INTO import_osmosis_log values ('$sBatchEnd',$iFileSize,'".date('Y-m-d H:i:s', $fCMDStartTime)."','".date('Y-m-d H:i:s')."','osm2pgsql')";
+        var_Dump($sSQL);
+        $oDB->query($sSQL);
+        echo date('Y-m-d H:i:s')." Completed osm2pgsql step for $sBatchEnd in ".round((time()-$fCMDStartTime)/60, 2)." minutes\n";
+
+        // Archive for debug?
+        unlink($sImportFile);
+
+        $sBatchEnd = getosmosistimestamp($sOsmosisConfigDirectory);
+
+        // Index file
+        $sThisIndexCmd = $sCMDIndex;
+        if (!isset($aResult['index-instances'])) {
+            if (getLoadAverage() < 24)
+                $iIndexInstances = 2;
+            else
+                $iIndexInstances = 1;
+        } else
+            $iIndexInstances = $aResult['index-instances'];
+
+        $sThisIndexCmd = $sCMDIndex.' -t '.$iIndexInstances;
+        $fCMDStartTime = time();
+
+        if (!$aResult['no-index']) {
+            echo "$sThisIndexCmd\n";
+            exec($sThisIndexCmd, $sJunk, $iErrorLevel);
+            if ($iErrorLevel) {
+                echo "Error: $iErrorLevel\n";
+                exit($iErrorLevel);
+            }
+        }
+
+        $sSQL = "INSERT INTO import_osmosis_log values ('$sBatchEnd',$iFileSize,'".date('Y-m-d H:i:s', $fCMDStartTime)."','".date('Y-m-d H:i:s')."','index')";
+        var_Dump($sSQL);
+        $oDB->query($sSQL);
+        echo date('Y-m-d H:i:s')." Completed index step for $sBatchEnd in ".round((time()-$fCMDStartTime)/60, 2)." minutes\n";
+
+        $sSQL = "update import_status set lastimportdate = '$sBatchEnd'";
+        $oDB->query($sSQL);
+
+        $fDuration = time() - $fStartTime;
+        echo date('Y-m-d H:i:s')." Completed all for $sBatchEnd in ".round($fDuration/60, 2)." minutes\n";
+        if (!$aResult['import-osmosis-all']) exit(0);
+
+        if (CONST_Replication_Update_Interval > 60) {
+            $iSleep = max(0, (strtotime($sBatchEnd)+CONST_Replication_Update_Interval-time()));
+        } else {
+            $iSleep = max(0, CONST_Replication_Update_Interval-$fDuration);
+        }
+        echo date('Y-m-d H:i:s')." Sleeping $iSleep seconds\n";
+        sleep($iSleep);
+    }
+}
+
+
+function getosmosistimestamp($sOsmosisConfigDirectory)
+{
+    $sStateFile = file_get_contents($sOsmosisConfigDirectory.'/state.txt');
+    preg_match('#timestamp=(.+)#', $sStateFile, $aResult);
+    return str_replace('\:', ':', $aResult[1]);
+}
index 18121eb66fb470ca4ceb78bcc0024811fa38cd9a..d707b9cbcfc92e6d0f5b0867e506226f9ee74113 100755 (executable)
@@ -1,69 +1,69 @@
 #!/usr/bin/php -Cq
 <?php
 
-       require_once(dirname(dirname(__FILE__)).'/settings/settings.php');
-       require_once(CONST_BasePath.'/lib/init-cmd.php');
-       ini_set('memory_limit', '800M');
+require_once(dirname(dirname(__FILE__)).'/settings/settings.php');
+require_once(CONST_BasePath.'/lib/init-cmd.php');
+ini_set('memory_limit', '800M');
 
-       $aCMDOptions = array(
-               "Tools to warm nominatim db",
-               array('help', 'h', 0, 1, 0, 0, false, 'Show Help'),
-               array('quiet', 'q', 0, 1, 0, 0, 'bool', 'Quiet output'),
-               array('verbose', 'v', 0, 1, 0, 0, 'bool', 'Verbose output'),
-               array('reverse-only', '', 0, 1, 0, 0, 'bool', 'Warm reverse only'),
-               array('search-only', '', 0, 1, 0, 0, 'bool', 'Warm reverse only'),
-       );
-       getCmdOpt($_SERVER['argv'], $aCMDOptions, $aResult, true, true);
+$aCMDOptions = array(
+                "Tools to warm nominatim db",
+                array('help', 'h', 0, 1, 0, 0, false, 'Show Help'),
+                array('quiet', 'q', 0, 1, 0, 0, 'bool', 'Quiet output'),
+                array('verbose', 'v', 0, 1, 0, 0, 'bool', 'Verbose output'),
+                array('reverse-only', '', 0, 1, 0, 0, 'bool', 'Warm reverse only'),
+                array('search-only', '', 0, 1, 0, 0, 'bool', 'Warm reverse only'),
+               );
+getCmdOpt($_SERVER['argv'], $aCMDOptions, $aResult, true, true);
 
-       require_once(CONST_BasePath.'/lib/log.php');
-       require_once(CONST_BasePath.'/lib/Geocode.php');
-       require_once(CONST_BasePath.'/lib/PlaceLookup.php');
-       require_once(CONST_BasePath.'/lib/ReverseGeocode.php');
+require_once(CONST_BasePath.'/lib/log.php');
+require_once(CONST_BasePath.'/lib/Geocode.php');
+require_once(CONST_BasePath.'/lib/PlaceLookup.php');
+require_once(CONST_BasePath.'/lib/ReverseGeocode.php');
 
-       $oDB =& getDB();
+$oDB =& getDB();
 
-       $bVerbose = $aResult['verbose'];
+$bVerbose = $aResult['verbose'];
 
-       if (!$aResult['search-only']) {
+if (!$aResult['search-only']) {
+    $oReverseGeocode = new Nominatim\ReverseGeocode($oDB);
+    $oReverseGeocode->setZoom(20);
+    $oPlaceLookup = new Nominatim\PlaceLookup($oDB);
+    $oPlaceLookup->setIncludeAddressDetails(true);
+    $oPlaceLookup->setLanguagePreference(array('en'));
 
-               $oReverseGeocode = new ReverseGeocode($oDB);
-               $oReverseGeocode->setZoom(20);
-               $oPlaceLookup = new PlaceLookup($oDB);
-               $oPlaceLookup->setIncludeAddressDetails(true);
-               $oPlaceLookup->setLanguagePreference(array('en'));
+    echo "Warm reverse: ";
+    if ($bVerbose) echo "\n";
+    for ($i = 0; $i < 1000; $i++) {
+        $fLat = rand(-9000, 9000) / 100;
+        $fLon = rand(-18000, 18000) / 100;
+        if ($bVerbose) echo "$fLat, $fLon = ";
+        $aLookup = $oReverseGeocode->lookup($fLat, $fLon);
+        if ($aLookup && $aLookup['place_id']) {
+            $aDetails = $oPlaceLookup->lookup(
+                (int)$aLookup['place_id'],
+                $aLookup['type'],
+                $aLookup['fraction']
+            );
+            if ($bVerbose) echo $aDetails['langaddress']."\n";
+        } else {
+            echo ".";
+        }
+    }
+    echo "\n";
+}
 
-               echo "Warm reverse: ";
-               if ($bVerbose) echo "\n";
-               for($i = 0; $i < 1000; $i++) {
-                       $fLat = rand(-9000, 9000) / 100;
-                       $fLon = rand(-18000, 18000) / 100;
-                       if ($bVerbose) echo "$fLat, $fLon = ";
-                       $aLookup = $oReverseGeocode->lookup($fLat, $fLon);
-                       if ($aLookup && $aLookup['place_id'])
-                       {
-                               $aDetails = $oPlaceLookup->lookup((int)$aLookup['place_id'],
-                                                                 $aLookup['type'], $aLookup['fraction']);
-                               if ($bVerbose) echo $aDetails['langaddress']."\n";
-                       }
-                       else echo ".";
-               }
-               echo "\n";
-       }
-
-       if (!$aResult['reverse-only']) {
-
-               $oGeocode =& new Geocode($oDB);
-
-               echo "Warm search: ";
-               if ($bVerbose) echo "\n";
-               $sSQL = 'select word from word where word is not null order by search_name_count desc limit 1000';
-               foreach($oDB->getCol($sSQL) as $sWord) {
-                       if ($bVerbose) echo "$sWord = ";
-                       $oGeocode->setLanguagePreference(array('en'));
-                       $oGeocode->setQuery($sWord);
-                       $aSearchResults = $oGeocode->lookup();
-                       if ($bVerbose) echo $aSearchResults[0]['langaddress']."\n";
-                       else echo ".";
-               }
-       }
+if (!$aResult['reverse-only']) {
+    $oGeocode =& new Nominatim\Geocode($oDB);
 
+    echo "Warm search: ";
+    if ($bVerbose) echo "\n";
+    $sSQL = 'select word from word where word is not null order by search_name_count desc limit 1000';
+    foreach ($oDB->getCol($sSQL) as $sWord) {
+        if ($bVerbose) echo "$sWord = ";
+        $oGeocode->setLanguagePreference(array('en'));
+        $oGeocode->setQuery($sWord);
+        $aSearchResults = $oGeocode->lookup();
+        if ($bVerbose) echo $aSearchResults[0]['langaddress']."\n";
+        else echo ".";
+    }
+}
index 52ae5d0c553addac9b42b7b28aaf9180e2b28bad..cd1ddfb03b0e9be5ca305cb4ea5abd76c6adabd5 100755 (executable)
@@ -31,6 +31,7 @@
                         python-numpy php-phpunit-PHPUnit
     pip install --user --upgrade pip setuptools lettuce==0.2.18 six==1.9 \
                                  haversine Shapely pytidylib
+    sudo pear install PHP_CodeSniffer
 
 #
 # System Configuration
index fdaec16217a5ec00b426750df1fe9161334346b2..aca3c66f5a0a62e5d2567627fa51d87aeb827bfc 100755 (executable)
@@ -27,6 +27,7 @@ sudo apt-get install -y -qq python-Levenshtein python-shapely \
                         python-numpy phpunit
 
 sudo -H pip install --quiet 'setuptools>=23.0.0' lettuce==0.2.18 'six>=1.9' haversine
+sudo pear install PHP_CodeSniffer
 
 sudo service postgresql restart
 sudo -u postgres createuser -S www-data
index e077989fb41251738028dc5a38be888b612676d8..b40dbce1abaa10add924da4983cc14fff0cc80e9 100755 (executable)
@@ -3,6 +3,9 @@
 # hacks for broken vagrant box      #DOCS:
 sudo rm -f /var/lib/dpkg/lock       #DOCS:
 sudo update-locale LANG=en_US.UTF-8 #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-16.sh.
@@ -16,7 +19,7 @@ sudo update-locale LANG=en_US.UTF-8 #DOCS:
 #
 
     sudo apt-get update -qq
-    sudo apt-get upgrade -y
+    sudo apt-get -o Dpkg::Options::="--force-confold" --force-yes -fuy dist-upgrade #DOCS:    sudo apt-get upgrade
 
 # Now you can install all packages needed for Nominatim:
 
@@ -35,6 +38,7 @@ sudo update-locale LANG=en_US.UTF-8 #DOCS:
                             python-numpy phpunit
 
     pip install --user lettuce==0.2.18 six==1.7 haversine
+    sudo pear install PHP_CodeSniffer
 
 #
 # System Configuration
index 55a6f9f5cbf5b0402aa60ce5f03cd7ba6ce10761..d018ab94c3795ce4daa5d342b68a1d8325fffbfb 100644 (file)
@@ -51,6 +51,7 @@ form label {
 }
 
 #map-position {
+  display: none;
   position: absolute;
   top: 0;
   right: 20px;
@@ -61,6 +62,10 @@ form label {
   z-index: 100;
 }
 
+#map-position-close {
+  text-align: right;
+}
+
 .result {
   font-size: 0.8em;
   margin: 5px;
index 95a2ec00b8d214c565033600c6d6be184c5593f5..90eb40c83dcb3f8d48ae0faeffda0db97f4f89c1 100755 (executable)
@@ -1,66 +1,66 @@
 <?php
-       require_once(dirname(dirname(__FILE__)).'/settings/settings.php');
-       require_once(CONST_BasePath.'/lib/init-website.php');
-       require_once(CONST_BasePath.'/lib/log.php');
-       require_once(CONST_BasePath.'/lib/output.php');
 
-       $sOutputFormat = 'html';
-       ini_set('memory_limit', '200M');
+require_once(dirname(dirname(__FILE__)).'/settings/settings.php');
+require_once(CONST_BasePath.'/lib/init-website.php');
+require_once(CONST_BasePath.'/lib/log.php');
+require_once(CONST_BasePath.'/lib/output.php');
+ini_set('memory_limit', '200M');
 
-       $oDB =& getDB();
+$sOutputFormat = 'html';
 
-       $sSQL = "select placex.place_id, calculated_country_code as country_code, name->'name' as name, i.* from placex, import_polygon_delete i where placex.osm_id = i.osm_id and placex.osm_type = i.osm_type and placex.class = i.class and placex.type = i.type";
-       $aPolygons = chksql($oDB->getAll($sSQL),
-                           "Could not get list of deleted OSM elements.");
+$oDB =& getDB();
+
+$sSQL = "select placex.place_id, calculated_country_code as country_code, name->'name' as name, i.* from placex, import_polygon_delete i where placex.osm_id = i.osm_id and placex.osm_type = i.osm_type and placex.class = i.class and placex.type = i.type";
+$aPolygons = chksql($oDB->getAll($sSQL), "Could not get list of deleted OSM elements.");
+
+if (CONST_DEBUG) {
+    var_dump($aPolygons);
+    exit;
+}
 
-       if (CONST_DEBUG)
-       {
-               var_dump($aPolygons);
-               exit;
-       }
 ?>
 <!DOCTYPE html>
 <html>
 <head>
-       <meta charset="utf-8"/>
-       <meta http-equiv="Content-Type" content="text/html;charset=utf-8" >
-       
-       <title>Nominatim Deleted Data</title>
-       
-       <meta name="description" content="List of OSM data that has been deleted" lang="en-US" />
+    <meta charset="utf-8"/>
+    <meta http-equiv="Content-Type" content="text/html;charset=utf-8" >
+    
+    <title>Nominatim Deleted Data</title>
+    
+    <meta name="description" content="List of OSM data that has been deleted" lang="en-US" />
 
 </head>
 
 <body>
 <style type="text/css">
 table {
-       border-width: 1px;
-       border-spacing: 0px;
-       border-style: solid;
-       border-color: gray;
-       border-collapse: collapse;
-       background-color: white;
-       margin: 10px;
+    border-width: 1px;
+    border-spacing: 0px;
+    border-style: solid;
+    border-color: gray;
+    border-collapse: collapse;
+    background-color: white;
+    margin: 10px;
 }
 table th {
-       border-width: 1px;
-       padding: 2px;
-       border-style: inset;
-       border-color: gray;
-       border-left-color: #ddd;
-       border-right-color: #ddd;
-       background-color: #eee;
-       -moz-border-radius: 0px 0px 0px 0px;
+    border-width: 1px;
+    padding: 2px;
+    border-style: inset;
+    border-color: gray;
+    border-left-color: #ddd;
+    border-right-color: #ddd;
+    background-color: #eee;
+    -moz-border-radius: 0px 0px 0px 0px;
 }
 table td {
-       border-width: 1px;
-       padding: 2px;
-       border-style: inset;
-       border-color: gray;
-       border-left-color: #ddd;
-       border-right-color: #ddd;
-       background-color: white;
-       -moz-border-radius: 0px 0px 0px 0px;
+    border-width: 1px;
+    padding: 2px;
+    border-style: inset;
+    border-color: gray;
+    border-left-color: #ddd;
+    border-right-color: #ddd;
+    background-color: white;
+    -moz-border-radius: 0px 0px 0px 0px;
 }
 </style>
 
@@ -68,34 +68,32 @@ table td {
 
 <table>
 <?php
-       if (!$aPolygons) exit;
-       echo "<tr>";
-//var_dump($aPolygons[0]);
-       foreach($aPolygons[0] as $sCol => $sVal)
-       {
-               echo "<th>".$sCol."</th>";
-       }
-       echo "</tr>";
-       foreach($aPolygons as $aRow)
-       {
-               echo "<tr>";
-               foreach($aRow as $sCol => $sVal)
-               {
-                       switch($sCol)
-                       {
-                               case 'osm_id':
-                                       echo '<td>'.osmLink($aRow).'</td>';
-                                       break;
-                               case 'place_id':
-                                       echo '<td>'.detailsLink($aRow).'</td>';
-                                       break;
-                               default:
-                                       echo "<td>".($sVal?$sVal:'&nbsp;')."</td>";
-                                       break;
-                       }
-               }
-               echo "</tr>";
-       }
+
+if (!$aPolygons) exit;
+echo "<tr>";
+// var_dump($aPolygons[0]);
+foreach ($aPolygons[0] as $sCol => $sVal) {
+    echo "<th>".$sCol."</th>";
+}
+echo "</tr>";
+foreach ($aPolygons as $aRow) {
+    echo "<tr>";
+    foreach ($aRow as $sCol => $sVal) {
+        switch ($sCol) {
+            case 'osm_id':
+                echo '<td>'.osmLink($aRow).'</td>';
+                break;
+            case 'place_id':
+                echo '<td>'.detailsLink($aRow).'</td>';
+                break;
+            default:
+                echo "<td>".($sVal?$sVal:'&nbsp;')."</td>";
+                break;
+        }
+    }
+    echo "</tr>";
+}
+
 ?>
 </table>
 
index 10cd07e148676465faf67f19ed74c6a9d97e209a..c1037de84859ded1d725ae0734967d3c6a284285 100755 (executable)
 <?php
-       @define('CONST_ConnectionBucket_PageType', 'Details');
-
-       require_once(dirname(dirname(__FILE__)).'/settings/settings.php');
-       require_once(CONST_BasePath.'/lib/init-website.php');
-       require_once(CONST_BasePath.'/lib/log.php');
-       require_once(CONST_BasePath.'/lib/output.php');
-
-       $sOutputFormat = 'html';
-
-       ini_set('memory_limit', '200M');
-
-       $oDB =& getDB();
-
-       $aLangPrefOrder = getPreferredLanguages();
-       $sLanguagePrefArraySQL = "ARRAY[".join(',',array_map("getDBQuoted",$aLangPrefOrder))."]";
-
-       $sPlaceId = getParamString('place_id');
-       $sOsmType = getParamSet('osmtype', array('N', 'W', 'R'));
-       $iOsmId = getParamInt('osmid', -1);
-       if ($sOsmType && $iOsmId > 0)
-       {
-               $sPlaceId = chksql($oDB->getOne("select place_id from placex where osm_type = '".$sOsmType."' and osm_id = ".$iOsmId." order by type = 'postcode' asc"));
-
-               // Be nice about our error messages for broken geometry
-
-               if (!$sPlaceId)
-               {
-                       $aPointDetails = chksql($oDB->getRow("select osm_type, osm_id, errormessage, class, type, get_name_by_language(name,$sLanguagePrefArraySQL) as localname, ST_AsText(prevgeometry) as prevgeom, ST_AsText(newgeometry) as newgeom from import_polygon_error where osm_type = '".$sOsmType."' and osm_id = ".$iOsmId." order by updated desc limit 1"));
-                       if (!PEAR::isError($aPointDetails) && $aPointDetails) {
-                               if (preg_match('/\[(-?\d+\.\d+) (-?\d+\.\d+)\]/', $aPointDetails['errormessage'], $aMatches))
-                               {
-                                       $aPointDetails['error_x'] = $aMatches[1];
-                                       $aPointDetails['error_y'] = $aMatches[2];
-                               }
-                               else
-                               {
-                                       $aPointDetails['error_x'] = 0;
-                                       $aPointDetails['error_y'] = 0;
-                               }
-                               include(CONST_BasePath.'/lib/template/details-error-'.$sOutputFormat.'.php');
-                               exit;
-                       }
-               }
-       }
-
-
-       if (!$sPlaceId) userError("Please select a place id");
-
-       $iPlaceID = (int)$sPlaceId;
-
-       if (CONST_Use_US_Tiger_Data)
-       {
-               $iParentPlaceID = chksql($oDB->getOne('select parent_place_id from location_property_tiger where place_id = '.$iPlaceID));
-               if ($iParentPlaceID) $iPlaceID = $iParentPlaceID;
-       }
-
-       if (CONST_Use_Aux_Location_data)
-       {
-               $iParentPlaceID = chksql($oDB->getOne('select parent_place_id from location_property_aux where place_id = '.$iPlaceID));
-               if ($iParentPlaceID) $iPlaceID = $iParentPlaceID;
-       }
-
-       $hLog = logStart($oDB, 'details', $_SERVER['QUERY_STRING'], $aLangPrefOrder);
-
-       // Get the details for this point
-       $sSQL = "select place_id, osm_type, osm_id, class, type, name, admin_level, housenumber, street, isin, postcode, calculated_country_code as country_code, importance, wikipedia,";
-       $sSQL .= " to_char(indexed_date, 'YYYY-MM-DD HH24:MI') as indexed_date, parent_place_id, rank_address, rank_search, get_searchrank_label(rank_search) as rank_search_label, get_name_by_language(name,$sLanguagePrefArraySQL) as localname, ";
-       $sSQL .= " ST_GeometryType(geometry) in ('ST_Polygon','ST_MultiPolygon') as isarea, ";
-       //$sSQL .= " ST_Area(geometry::geography) as area, ";
-       $sSQL .= " ST_y(centroid) as lat, ST_x(centroid) as lon,";
-       $sSQL .= " case when importance = 0 OR importance IS NULL then 0.75-(rank_search::float/40) else importance end as calculated_importance, ";
-       $sSQL .= " ST_AsText(CASE WHEN ST_NPoints(geometry) > 5000 THEN ST_SimplifyPreserveTopology(geometry, 0.0001) ELSE geometry END) as outlinestring";
-       $sSQL .= " from placex where place_id = $iPlaceID";
-       $aPointDetails = chksql($oDB->getRow($sSQL),
-                               "Could not get details of place object.");
-       $aPointDetails['localname'] = $aPointDetails['localname']?$aPointDetails['localname']:$aPointDetails['housenumber'];
-
-       $aClassType = getClassTypesWithImportance();
-       $aPointDetails['icon'] = $aClassType[$aPointDetails['class'].':'.$aPointDetails['type']]['icon'];
-
-       // Get all alternative names (languages, etc)
-       $sSQL = "select (each(name)).key,(each(name)).value from placex where place_id = $iPlaceID order by (each(name)).key";
-       $aPointDetails['aNames'] = $oDB->getAssoc($sSQL);
-       if (PEAR::isError($aPointDetails['aNames'])) // possible timeout
-       {
-               $aPointDetails['aNames'] = [];
-       }
-
-       // Extra tags
-       $sSQL = "select (each(extratags)).key,(each(extratags)).value from placex where place_id = $iPlaceID order by (each(extratags)).key";
-       $aPointDetails['aExtraTags'] = $oDB->getAssoc($sSQL);
-       if (PEAR::isError($aPointDetails['aExtraTags'])) // possible timeout
-       {
-               $aPointDetails['aExtraTags'] = [];
-       }
-
-       // Address
-       $aAddressLines = getAddressDetails($oDB, $sLanguagePrefArraySQL, $iPlaceID, $aPointDetails['country_code'], -1, true);
-
-       // Linked places
-       $sSQL = "select placex.place_id, osm_type, osm_id, class, type, housenumber, admin_level, rank_address, ST_GeometryType(geometry) in ('ST_Polygon','ST_MultiPolygon') as isarea, ST_Distance_Spheroid(geometry, placegeometry, 'SPHEROID[\"WGS 84\",6378137,298.257223563, AUTHORITY[\"EPSG\",\"7030\"]]') as distance, ";
-       $sSQL .= " get_name_by_language(name,$sLanguagePrefArraySQL) as localname, length(name::text) as namelength ";
-       $sSQL .= " from placex, (select centroid as placegeometry from placex where place_id = $iPlaceID) as x";
-       $sSQL .= " where linked_place_id = $iPlaceID";
-       $sSQL .= " order by rank_address asc,rank_search asc,get_name_by_language(name,$sLanguagePrefArraySQL),housenumber";
-       $aLinkedLines = $oDB->getAll($sSQL);
-       if (PEAR::isError($aLinkedLines)) // possible timeout
-       {
-               $aLinkedLines = [];
-       }
-
-       // All places this is an imediate parent of
-       $sSQL = "select obj.place_id, osm_type, osm_id, class, type, housenumber, admin_level, rank_address, ST_GeometryType(geometry) in ('ST_Polygon','ST_MultiPolygon') as isarea, ST_Distance_Spheroid(geometry, placegeometry, 'SPHEROID[\"WGS 84\",6378137,298.257223563, AUTHORITY[\"EPSG\",\"7030\"]]') as distance, ";
-       $sSQL .= " get_name_by_language(name,$sLanguagePrefArraySQL) as localname, length(name::text) as namelength ";
-       $sSQL .= " from (select placex.place_id, osm_type, osm_id, class, type, housenumber, admin_level, rank_address, rank_search, geometry, name from placex ";
-       $sSQL .= " where parent_place_id = $iPlaceID order by rank_address asc,rank_search asc limit 500) as obj,";
-       $sSQL .= " (select centroid as placegeometry from placex where place_id = $iPlaceID) as x";
-       $sSQL .= " order by rank_address asc,rank_search asc,localname,housenumber";
-       $aParentOfLines = $oDB->getAll($sSQL);
-       if (PEAR::isError($aParentOfLines)) // possible timeout
-       {
-               $aParentOfLines = [];
-       }
-
-       $aPlaceSearchNameKeywords = false;
-       $aPlaceSearchAddressKeywords = false;
-       if (getParamBool('keywords'))
-       {
-               $sSQL = "select * from search_name where place_id = $iPlaceID";
-               $aPlaceSearchName = $oDB->getRow($sSQL);
-               if (PEAR::isError($aPlaceSearchName)) // possible timeout
-               {
-                       $aPlaceSearchName = [];
-               }
-
-               $sSQL = "select * from word where word_id in (".substr($aPlaceSearchName['name_vector'],1,-1).")";
-               $aPlaceSearchNameKeywords = $oDB->getAll($sSQL);
-               if (PEAR::isError($aPlaceSearchNameKeywords)) // possible timeout
-               {
-                       $aPlaceSearchNameKeywords = [];
-               }
-
-
-               $sSQL = "select * from word where word_id in (".substr($aPlaceSearchName['nameaddress_vector'],1,-1).")";
-               $aPlaceSearchAddressKeywords = $oDB->getAll($sSQL);
-               if (PEAR::isError($aPlaceSearchAddressKeywords)) // possible timeout
-               {
-                       $aPlaceSearchAddressKeywords = [];
-               }
-
-       }
-
-       logEnd($oDB, $hLog, 1);
-
-       if ($sOutputFormat=='html')
-       {
-               $sDataDate = chksql($oDB->getOne("select TO_CHAR(lastimportdate - '2 minutes'::interval,'YYYY/MM/DD HH24:MI')||' GMT' from import_status limit 1"));
-               $sTileURL = CONST_Map_Tile_URL;
-               $sTileAttribution = CONST_Map_Tile_Attribution;
-       }
-
-       include(CONST_BasePath.'/lib/template/details-'.$sOutputFormat.'.php');
+@define('CONST_ConnectionBucket_PageType', 'Details');
+
+require_once(dirname(dirname(__FILE__)).'/settings/settings.php');
+require_once(CONST_BasePath.'/lib/init-website.php');
+require_once(CONST_BasePath.'/lib/log.php');
+require_once(CONST_BasePath.'/lib/output.php');
+ini_set('memory_limit', '200M');
+
+$oParams = new Nominatim\ParameterParser();
+
+$sOutputFormat = 'html';
+$aLangPrefOrder = $oParams->getPreferredLanguages();
+$sLanguagePrefArraySQL = "ARRAY[".join(',', array_map("getDBQuoted", $aLangPrefOrder))."]";
+
+$sPlaceId = $oParams->getString('place_id');
+$sOsmType = $oParams->getSet('osmtype', array('N', 'W', 'R'));
+$iOsmId = $oParams->getInt('osmid', -1);
+
+$oDB =& getDB();
+
+if ($sOsmType && $iOsmId > 0) {
+    $sPlaceId = chksql($oDB->getOne("select place_id from placex where osm_type = '".$sOsmType."' and osm_id = ".$iOsmId." order by type = 'postcode' asc"));
+
+    // Be nice about our error messages for broken geometry
+
+    if (!$sPlaceId) {
+        $aPointDetails = chksql($oDB->getRow("select osm_type, osm_id, errormessage, class, type, get_name_by_language(name,$sLanguagePrefArraySQL) as localname, ST_AsText(prevgeometry) as prevgeom, ST_AsText(newgeometry) as newgeom from import_polygon_error where osm_type = '".$sOsmType."' and osm_id = ".$iOsmId." order by updated desc limit 1"));
+        if (!PEAR::isError($aPointDetails) && $aPointDetails) {
+            if (preg_match('/\[(-?\d+\.\d+) (-?\d+\.\d+)\]/', $aPointDetails['errormessage'], $aMatches)) {
+                $aPointDetails['error_x'] = $aMatches[1];
+                $aPointDetails['error_y'] = $aMatches[2];
+            } else {
+                $aPointDetails['error_x'] = 0;
+                $aPointDetails['error_y'] = 0;
+            }
+            include(CONST_BasePath.'/lib/template/details-error-'.$sOutputFormat.'.php');
+            exit;
+        }
+    }
+}
+
+
+if (!$sPlaceId) userError("Please select a place id");
+
+$iPlaceID = (int)$sPlaceId;
+
+if (CONST_Use_US_Tiger_Data) {
+    $iParentPlaceID = chksql($oDB->getOne('select parent_place_id from location_property_tiger where place_id = '.$iPlaceID));
+    if ($iParentPlaceID) $iPlaceID = $iParentPlaceID;
+}
+
+if (CONST_Use_Aux_Location_data) {
+    $iParentPlaceID = chksql($oDB->getOne('select parent_place_id from location_property_aux where place_id = '.$iPlaceID));
+    if ($iParentPlaceID) $iPlaceID = $iParentPlaceID;
+}
+
+$hLog = logStart($oDB, 'details', $_SERVER['QUERY_STRING'], $aLangPrefOrder);
+
+// Get the details for this point
+$sSQL = "select place_id, osm_type, osm_id, class, type, name, admin_level, housenumber, street, isin, postcode, calculated_country_code as country_code, importance, wikipedia,";
+$sSQL .= " to_char(indexed_date, 'YYYY-MM-DD HH24:MI') as indexed_date, parent_place_id, rank_address, rank_search, get_searchrank_label(rank_search) as rank_search_label, get_name_by_language(name,$sLanguagePrefArraySQL) as localname, ";
+$sSQL .= " ST_GeometryType(geometry) in ('ST_Polygon','ST_MultiPolygon') as isarea, ";
+//$sSQL .= " ST_Area(geometry::geography) as area, ";
+$sSQL .= " ST_y(centroid) as lat, ST_x(centroid) as lon,";
+$sSQL .= " case when importance = 0 OR importance IS NULL then 0.75-(rank_search::float/40) else importance end as calculated_importance, ";
+$sSQL .= " ST_AsText(CASE WHEN ST_NPoints(geometry) > 5000 THEN ST_SimplifyPreserveTopology(geometry, 0.0001) ELSE geometry END) as outlinestring";
+$sSQL .= " from placex where place_id = $iPlaceID";
+$aPointDetails = chksql($oDB->getRow($sSQL), "Could not get details of place object.");
+$aPointDetails['localname'] = $aPointDetails['localname']?$aPointDetails['localname']:$aPointDetails['housenumber'];
+
+$aClassType = getClassTypesWithImportance();
+$aPointDetails['icon'] = $aClassType[$aPointDetails['class'].':'.$aPointDetails['type']]['icon'];
+
+// Get all alternative names (languages, etc)
+$sSQL = "select (each(name)).key,(each(name)).value from placex where place_id = $iPlaceID order by (each(name)).key";
+$aPointDetails['aNames'] = $oDB->getAssoc($sSQL);
+if (PEAR::isError($aPointDetails['aNames'])) { // possible timeout
+    $aPointDetails['aNames'] = [];
+}
+
+// Extra tags
+$sSQL = "select (each(extratags)).key,(each(extratags)).value from placex where place_id = $iPlaceID order by (each(extratags)).key";
+$aPointDetails['aExtraTags'] = $oDB->getAssoc($sSQL);
+if (PEAR::isError($aPointDetails['aExtraTags'])) { // possible timeout
+    $aPointDetails['aExtraTags'] = [];
+}
+
+// Address
+$aAddressLines = getAddressDetails($oDB, $sLanguagePrefArraySQL, $iPlaceID, $aPointDetails['country_code'], -1, true);
+
+// Linked places
+$sSQL = "select placex.place_id, osm_type, osm_id, class, type, housenumber, admin_level, rank_address, ST_GeometryType(geometry) in ('ST_Polygon','ST_MultiPolygon') as isarea, ST_Distance_Spheroid(geometry, placegeometry, 'SPHEROID[\"WGS 84\",6378137,298.257223563, AUTHORITY[\"EPSG\",\"7030\"]]') as distance, ";
+$sSQL .= " get_name_by_language(name,$sLanguagePrefArraySQL) as localname, length(name::text) as namelength ";
+$sSQL .= " from placex, (select centroid as placegeometry from placex where place_id = $iPlaceID) as x";
+$sSQL .= " where linked_place_id = $iPlaceID";
+$sSQL .= " order by rank_address asc,rank_search asc,get_name_by_language(name,$sLanguagePrefArraySQL),housenumber";
+$aLinkedLines = $oDB->getAll($sSQL);
+if (PEAR::isError($aLinkedLines)) { // possible timeout
+    $aLinkedLines = [];
+}
+
+// All places this is an imediate parent of
+$sSQL = "select obj.place_id, osm_type, osm_id, class, type, housenumber, admin_level, rank_address, ST_GeometryType(geometry) in ('ST_Polygon','ST_MultiPolygon') as isarea, ST_Distance_Spheroid(geometry, placegeometry, 'SPHEROID[\"WGS 84\",6378137,298.257223563, AUTHORITY[\"EPSG\",\"7030\"]]') as distance, ";
+$sSQL .= " get_name_by_language(name,$sLanguagePrefArraySQL) as localname, length(name::text) as namelength ";
+$sSQL .= " from (select placex.place_id, osm_type, osm_id, class, type, housenumber, admin_level, rank_address, rank_search, geometry, name from placex ";
+$sSQL .= " where parent_place_id = $iPlaceID order by rank_address asc,rank_search asc limit 500) as obj,";
+$sSQL .= " (select centroid as placegeometry from placex where place_id = $iPlaceID) as x";
+$sSQL .= " order by rank_address asc,rank_search asc,localname,housenumber";
+$aParentOfLines = $oDB->getAll($sSQL);
+if (PEAR::isError($aParentOfLines)) { // possible timeout
+    $aParentOfLines = [];
+}
+
+$aPlaceSearchNameKeywords = false;
+$aPlaceSearchAddressKeywords = false;
+if ($oParams->getBool('keywords')) {
+    $sSQL = "select * from search_name where place_id = $iPlaceID";
+    $aPlaceSearchName = $oDB->getRow($sSQL);
+    if (PEAR::isError($aPlaceSearchName)) { // possible timeout
+        $aPlaceSearchName = [];
+    }
+
+    $sSQL = "select * from word where word_id in (".substr($aPlaceSearchName['name_vector'], 1, -1).")";
+    $aPlaceSearchNameKeywords = $oDB->getAll($sSQL);
+    if (PEAR::isError($aPlaceSearchNameKeywords)) { // possible timeout
+        $aPlaceSearchNameKeywords = [];
+    }
+
+
+    $sSQL = "select * from word where word_id in (".substr($aPlaceSearchName['nameaddress_vector'], 1, -1).")";
+    $aPlaceSearchAddressKeywords = $oDB->getAll($sSQL);
+    if (PEAR::isError($aPlaceSearchAddressKeywords)) { // possible timeout
+        $aPlaceSearchAddressKeywords = [];
+    }
+}
+
+logEnd($oDB, $hLog, 1);
+
+if ($sOutputFormat=='html') {
+    $sDataDate = chksql($oDB->getOne("select TO_CHAR(lastimportdate - '2 minutes'::interval,'YYYY/MM/DD HH24:MI')||' GMT' from import_status limit 1"));
+    $sTileURL = CONST_Map_Tile_URL;
+    $sTileAttribution = CONST_Map_Tile_Attribution;
+}
+
+include(CONST_BasePath.'/lib/template/details-'.$sOutputFormat.'.php');
index 28a56f00938bda7b2382000bf8bfaa9dec761690..457f37ca282a641350e26a06f59a60f1d73e6ef4 100755 (executable)
 <?php
-       @define('CONST_ConnectionBucket_PageType', 'Details');
-
-       require_once(dirname(dirname(__FILE__)).'/settings/settings.php');
-       require_once(CONST_BasePath.'/lib/init-website.php');
-       require_once(CONST_BasePath.'/lib/log.php');
-       require_once(CONST_BasePath.'/lib/PlaceLookup.php');
-       require_once(CONST_BasePath.'/lib/output.php');
-       ini_set('memory_limit', '200M');
-
-       $oDB =& getDB();
-
-       $sOutputFormat = getParamSet('format', array('html', 'json'), 'html');
-
-       $aLangPrefOrder = getPreferredLanguages();
-       $sLanguagePrefArraySQL = "ARRAY[".join(',',array_map("getDBQuoted",$aLangPrefOrder))."]";
-
-       $sPlaceId = getParamString('place_id');
-       $sOsmType = getParamSet('osmtype', array('N', 'W', 'R'));
-       $iOsmId = getParamInt('osmid', -1);
-       if ($sOsmType && $iOsmId > 0)
-       {
-               $sPlaceId = chksql($oDB->getOne("select place_id from placex where osm_type = '".$sOsmType."' and osm_id = ".$iOsmId." order by type = 'postcode' asc"));
-
-               // Be nice about our error messages for broken geometry
-               if (!$sPlaceId)
-               {
-                       $aPointDetails = chksql($oDB->getRow("select osm_type, osm_id, errormessage, class, type, get_name_by_language(name,$sLanguagePrefArraySQL) as localname, ST_AsText(prevgeometry) as prevgeom, ST_AsText(newgeometry) as newgeom from import_polygon_error where osm_type = '".$sOsmType."' and osm_id = ".$iOsmId." order by updated desc limit 1"));
-                       if ($aPointDetails) {
-                               if (preg_match('/\[(-?\d+\.\d+) (-?\d+\.\d+)\]/', $aPointDetails['errormessage'], $aMatches))
-                               {
-                                       $aPointDetails['error_x'] = $aMatches[1];
-                                       $aPointDetails['error_y'] = $aMatches[2];
-                               }
-                               include(CONST_BasePath.'/lib/template/details-error-'.$sOutputFormat.'.php');
-                               exit;
-                       }
-               }
-       }
-
-       if (!$sPlaceId) userError("Please select a place id");
-
-       $iPlaceID = (int)$sPlaceId;
-
-       if (CONST_Use_US_Tiger_Data)
-       {
-               $iParentPlaceID = chksql($oDB->getOne('select parent_place_id from location_property_tiger where place_id = '.$iPlaceID));
-               if ($iParentPlaceID) $iPlaceID = $iParentPlaceID;
-       }
-
-       if (CONST_Use_Aux_Location_data)
-       {
-               $iParentPlaceID = chksql($oDB->getOne('select parent_place_id from location_property_aux where place_id = '.$iPlaceID));
-               if ($iParentPlaceID) $iPlaceID = $iParentPlaceID;
-       }
-
-       $oPlaceLookup = new PlaceLookup($oDB);
-       $oPlaceLookup->setLanguagePreference($aLangPrefOrder);
-       $oPlaceLookup->setIncludeAddressDetails(true);
-
-       $aPlaceAddress = array_reverse($oPlaceLookup->getAddressDetails($iPlaceID));
-
-       if (!sizeof($aPlaceAddress)) userError("Unknown place id.");
-
-       $aBreadcrums = array();
-       foreach($aPlaceAddress as $i => $aPlace)
-       {
-               if (!$aPlace['place_id']) continue;
-               $aBreadcrums[] = array('placeId'   => $aPlace['place_id'],
-                                      'osmType'   => $aPlace['osm_type'],
-                                      'osmId'     => $aPlace['osm_id'],
-                                      'localName' => $aPlace['localname']);
-
-               if ($sOutputFormat == 'html')
-               {
-                       $sPlaceUrl = 'hierarchy.php?place_id='.$aPlace['place_id'];
-                       if ($i) echo " &gt; ";
-                       echo '<a href="'.$sPlaceUrl.'">'.$aPlace['localname'].'</a> ('.osmLink($aPlace).')';
-               }
-       }
-
-
-       if ($sOutputFormat == 'json')
-       {
-               header("content-type: application/json; charset=UTF-8");
-               $aDetails = array();
-               $aDetails['breadcrumbs'] = $aBreadcrums;
-               javascript_renderData($aDetails);
-               exit;
-       }
-
-       $aRelatedPlaceIDs = chksql($oDB->getCol($sSQL = "select place_id from placex where linked_place_id = $iPlaceID or place_id = $iPlaceID"));
-
-       $sSQL = "select obj.place_id, osm_type, osm_id, class, type, housenumber, admin_level, rank_address, ST_GeometryType(geometry) in ('ST_Polygon','ST_MultiPolygon') as isarea,  st_area(geometry) as area, ";
-       $sSQL .= " get_name_by_language(name,$sLanguagePrefArraySQL) as localname, length(name::text) as namelength ";
-       $sSQL .= " from (select placex.place_id, osm_type, osm_id, class, type, housenumber, admin_level, rank_address, rank_search, geometry, name from placex ";
-       $sSQL .= " where parent_place_id in (".join(',',$aRelatedPlaceIDs).") and name is not null order by rank_address asc,rank_search asc limit 500) as obj";
-       $sSQL .= " order by rank_address asc,rank_search asc,localname,class, type,housenumber";
-       $aParentOfLines = chksql($oDB->getAll($sSQL));
-
-       if (sizeof($aParentOfLines))
-       {
-               echo '<h2>Parent Of:</h2>';
-               $aClassType = getClassTypesWithImportance();
-               $aGroupedAddressLines = array();
-               foreach($aParentOfLines as $aAddressLine)
-               {
-                       if (isset($aClassType[$aAddressLine['class'].':'.$aAddressLine['type'].':'.$aAddressLine['admin_level']]['label'])
-                             && $aClassType[$aAddressLine['class'].':'.$aAddressLine['type'].':'.$aAddressLine['admin_level']]['label'])
-                       {
-                               $aAddressLine['label'] = $aClassType[$aAddressLine['class'].':'.$aAddressLine['type'].':'.$aAddressLine['admin_level']]['label'];
-                       }
-                       elseif (isset($aClassType[$aAddressLine['class'].':'.$aAddressLine['type']]['label'])
-                               && $aClassType[$aAddressLine['class'].':'.$aAddressLine['type']]['label'])
-                       {
-                               $aAddressLine['label'] = $aClassType[$aAddressLine['class'].':'.$aAddressLine['type']]['label'];
-                       }
-                       else $aAddressLine['label'] = ucwords($aAddressLine['type']);
-
-                       if (!isset($aGroupedAddressLines[$aAddressLine['label']])) $aGroupedAddressLines[$aAddressLine['label']] = array();
-                               $aGroupedAddressLines[$aAddressLine['label']][] = $aAddressLine;
-               }
-
-               foreach($aGroupedAddressLines as $sGroupHeading => $aParentOfLines)
-               {
-                       echo "<h3>$sGroupHeading</h3>";
-                       foreach($aParentOfLines as $aAddressLine)
-                       {
-                               $aAddressLine['localname'] = $aAddressLine['localname']?$aAddressLine['localname']:$aAddressLine['housenumber'];
-                               $sOSMType = formatOSMType($aAddressLine['osm_type'], false);
-
-                               echo '<div class="line">';
-                               echo '<span class="name">'.(trim($aAddressLine['localname'])?$aAddressLine['localname']:'<span class="noname">No Name</span>').'</span>';
-                               echo ' (';
-                               echo '<span class="area">'.($aAddressLine['isarea']=='t'?'Polygon':'Point').'</span>';
-                               if ($sOSMType) echo ', <span class="osm"><span class="label"></span>'.$sOSMType.' '.osmLink($aAddressLine).'</span>';
-                               echo ', <a href="hierarchy.php?place_id='.$aAddressLine['place_id'].'">GOTO</a>';
-                               echo ', '.$aAddressLine['area'];
-                               echo ')';
-                               echo '</div>';
-                       }
-               }
-               if (sizeof($aParentOfLines) >= 500) {
-                       echo '<p>There are more child objects which are not shown.</p>';
-               }
-               echo '</div>';
-       }
+@define('CONST_ConnectionBucket_PageType', 'Details');
+
+require_once(dirname(dirname(__FILE__)).'/settings/settings.php');
+require_once(CONST_BasePath.'/lib/init-website.php');
+require_once(CONST_BasePath.'/lib/log.php');
+require_once(CONST_BasePath.'/lib/PlaceLookup.php');
+require_once(CONST_BasePath.'/lib/output.php');
+ini_set('memory_limit', '200M');
+
+$oParams = new Nominatim\ParameterParser();
+
+$sOutputFormat = $oParams->getSet('format', array('html', 'json'), 'html');
+$aLangPrefOrder = $oParams->getPreferredLanguages();
+$sLanguagePrefArraySQL = "ARRAY[".join(',', array_map("getDBQuoted", $aLangPrefOrder))."]";
+
+$sPlaceId = $oParams->getString('place_id');
+$sOsmType = $oParams->getSet('osmtype', array('N', 'W', 'R'));
+$iOsmId = $oParams->getInt('osmid', -1);
+
+$oDB =& getDB();
+
+if ($sOsmType && $iOsmId > 0) {
+    $sPlaceId = chksql($oDB->getOne("select place_id from placex where osm_type = '".$sOsmType."' and osm_id = ".$iOsmId." order by type = 'postcode' asc"));
+
+    // Be nice about our error messages for broken geometry
+    if (!$sPlaceId) {
+        $aPointDetails = chksql($oDB->getRow("select osm_type, osm_id, errormessage, class, type, get_name_by_language(name,$sLanguagePrefArraySQL) as localname, ST_AsText(prevgeometry) as prevgeom, ST_AsText(newgeometry) as newgeom from import_polygon_error where osm_type = '".$sOsmType."' and osm_id = ".$iOsmId." order by updated desc limit 1"));
+        if ($aPointDetails) {
+            if (preg_match('/\[(-?\d+\.\d+) (-?\d+\.\d+)\]/', $aPointDetails['errormessage'], $aMatches)) {
+                $aPointDetails['error_x'] = $aMatches[1];
+                $aPointDetails['error_y'] = $aMatches[2];
+            }
+            include(CONST_BasePath.'/lib/template/details-error-'.$sOutputFormat.'.php');
+            exit;
+        }
+    }
+}
+
+if (!$sPlaceId) userError("Please select a place id");
+
+$iPlaceID = (int)$sPlaceId;
+
+if (CONST_Use_US_Tiger_Data) {
+    $iParentPlaceID = chksql($oDB->getOne('select parent_place_id from location_property_tiger where place_id = '.$iPlaceID));
+    if ($iParentPlaceID) $iPlaceID = $iParentPlaceID;
+}
+
+if (CONST_Use_Aux_Location_data) {
+    $iParentPlaceID = chksql($oDB->getOne('select parent_place_id from location_property_aux where place_id = '.$iPlaceID));
+    if ($iParentPlaceID) $iPlaceID = $iParentPlaceID;
+}
+
+$oPlaceLookup = new Nominatim\PlaceLookup($oDB);
+$oPlaceLookup->setLanguagePreference($aLangPrefOrder);
+$oPlaceLookup->setIncludeAddressDetails(true);
+
+$aPlaceAddress = array_reverse($oPlaceLookup->getAddressDetails($iPlaceID));
+
+if (!sizeof($aPlaceAddress)) userError("Unknown place id.");
+
+$aBreadcrums = array();
+foreach ($aPlaceAddress as $i => $aPlace) {
+    if (!$aPlace['place_id']) continue;
+    $aBreadcrums[] = array(
+                      'placeId'   => $aPlace['place_id'],
+                      'osmType'   => $aPlace['osm_type'],
+                      'osmId'     => $aPlace['osm_id'],
+                      'localName' => $aPlace['localname']
+                     );
+
+    if ($sOutputFormat == 'html') {
+        $sPlaceUrl = 'hierarchy.php?place_id='.$aPlace['place_id'];
+        if ($i) echo " &gt; ";
+        echo '<a href="'.$sPlaceUrl.'">'.$aPlace['localname'].'</a> ('.osmLink($aPlace).')';
+    }
+}
+
+
+if ($sOutputFormat == 'json') {
+    header("content-type: application/json; charset=UTF-8");
+    $aDetails = array();
+    $aDetails['breadcrumbs'] = $aBreadcrums;
+    javascript_renderData($aDetails);
+    exit;
+}
+
+$aRelatedPlaceIDs = chksql($oDB->getCol($sSQL = "select place_id from placex where linked_place_id = $iPlaceID or place_id = $iPlaceID"));
+
+$sSQL = "select obj.place_id, osm_type, osm_id, class, type, housenumber, admin_level, rank_address, ST_GeometryType(geometry) in ('ST_Polygon','ST_MultiPolygon') as isarea,  st_area(geometry) as area, ";
+$sSQL .= " get_name_by_language(name,$sLanguagePrefArraySQL) as localname, length(name::text) as namelength ";
+$sSQL .= " from (select placex.place_id, osm_type, osm_id, class, type, housenumber, admin_level, rank_address, rank_search, geometry, name from placex ";
+$sSQL .= " where parent_place_id in (".join(',', $aRelatedPlaceIDs).") and name is not null order by rank_address asc,rank_search asc limit 500) as obj";
+$sSQL .= " order by rank_address asc,rank_search asc,localname,class, type,housenumber";
+$aParentOfLines = chksql($oDB->getAll($sSQL));
+
+if (sizeof($aParentOfLines)) {
+    echo '<h2>Parent Of:</h2>';
+    $aClassType = getClassTypesWithImportance();
+    $aGroupedAddressLines = array();
+    foreach ($aParentOfLines as $aAddressLine) {
+        if (isset($aClassType[$aAddressLine['class'].':'.$aAddressLine['type'].':'.$aAddressLine['admin_level']]['label'])
+            && $aClassType[$aAddressLine['class'].':'.$aAddressLine['type'].':'.$aAddressLine['admin_level']]['label']
+        ) {
+            $aAddressLine['label'] = $aClassType[$aAddressLine['class'].':'.$aAddressLine['type'].':'.$aAddressLine['admin_level']]['label'];
+        } elseif (isset($aClassType[$aAddressLine['class'].':'.$aAddressLine['type']]['label'])
+            && $aClassType[$aAddressLine['class'].':'.$aAddressLine['type']]['label']
+        ) {
+            $aAddressLine['label'] = $aClassType[$aAddressLine['class'].':'.$aAddressLine['type']]['label'];
+        } else $aAddressLine['label'] = ucwords($aAddressLine['type']);
+
+        if (!isset($aGroupedAddressLines[$aAddressLine['label']])) $aGroupedAddressLines[$aAddressLine['label']] = array();
+            $aGroupedAddressLines[$aAddressLine['label']][] = $aAddressLine;
+    }
+
+    foreach ($aGroupedAddressLines as $sGroupHeading => $aParentOfLines) {
+        echo "<h3>$sGroupHeading</h3>";
+        foreach ($aParentOfLines as $aAddressLine) {
+            $aAddressLine['localname'] = $aAddressLine['localname']?$aAddressLine['localname']:$aAddressLine['housenumber'];
+            $sOSMType = formatOSMType($aAddressLine['osm_type'], false);
+
+            echo '<div class="line">';
+            echo '<span class="name">'.(trim($aAddressLine['localname'])?$aAddressLine['localname']:'<span class="noname">No Name</span>').'</span>';
+            echo ' (';
+            echo '<span class="area">'.($aAddressLine['isarea']=='t'?'Polygon':'Point').'</span>';
+            if ($sOSMType) echo ', <span class="osm"><span class="label"></span>'.$sOSMType.' '.osmLink($aAddressLine).'</span>';
+            echo ', <a href="hierarchy.php?place_id='.$aAddressLine['place_id'].'">GOTO</a>';
+            echo ', '.$aAddressLine['area'];
+            echo ')';
+            echo '</div>';
+        }
+    }
+    if (sizeof($aParentOfLines) >= 500) {
+        echo '<p>There are more child objects which are not shown.</p>';
+    }
+    echo '</div>';
+}
index 31044d02ec524ede44751205f1ea5c10a5314919..7c19b17a98a82cbfbbc9da2c85e79497d16b31dc 100644 (file)
@@ -3,175 +3,208 @@ var last_click_latlng;
 
 jQuery(document).on('ready', function(){
 
-       if ( !$('#search-page,#reverse-page').length ){ return; }
-       
-       var is_reverse_search = !!( $('#reverse-page').length );
+    if ( !$('#search-page,#reverse-page').length ){ return; }
+    
+    var is_reverse_search = !!( $('#reverse-page').length );
 
-       $('#q').focus();
+    $('#q').focus();
 
-       map = new L.map('map', {
-                               attributionControl: (nominatim_map_init.tile_attribution && nominatim_map_init.tile_attribution.length),
-                               scrollWheelZoom:    !L.Browser.touch,
-                               touchZoom:          false
-                       });
-
-       L.tileLayer(nominatim_map_init.tile_url, {
-               noWrap: true, // otherwise we end up with click coordinates like latitude -728
-               // moved to footer
-               attribution: (nominatim_map_init.tile_attribution || null ) //'&copy; <a href="http://osm.org/copyright">OpenStreetMap</a> contributors'
-       }).addTo(map);
-
-       map.setView([nominatim_map_init.lat, nominatim_map_init.lon], nominatim_map_init.zoom);
-
-       if ( is_reverse_search ){
-               // We don't need a marker, but an L.circle instance changes radius once you zoom in/out
-               var cm = L.circleMarker([nominatim_map_init.lat,nominatim_map_init.lon], { radius: 5, weight: 2, fillColor: '#ff7800', color: 'red', opacity: 0.75, clickable: false});
-               cm.addTo(map);
-       }
-
-
-
-       function display_map_position(mouse_lat_lng){
-
-               html_mouse = "mouse position " + (mouse_lat_lng ? [mouse_lat_lng.lat.toFixed(5), mouse_lat_lng.lng.toFixed(5)].join(',') : '-');
-               html_click = "last click: " + (last_click_latlng ? [last_click_latlng.lat.toFixed(5),last_click_latlng.lng.toFixed(5)].join(',') : '-');
-
-               html_center = 
-                       "map center: " + 
-                       map.getCenter().lat.toFixed(5) + ',' + map.getCenter().lng.toFixed(5) +
-                       " <a target='_blank' href='" + map_link_to_osm() + "'>view on osm.org</a>";
-
-               html_zoom = "map zoom: " + map.getZoom();
-
-               html_viewbox = "viewbox: " + map_viewbox_as_string();
-
-               $('#map-position').html([html_center,html_zoom,html_viewbox,html_click,html_mouse].join('<br/>'));
-               $('input#use_viewbox').trigger('change');
-       }
-
-       map.on('move', function(e) {
-               display_map_position();
-       });
-
-       map.on('mousemove', function(e) {
-               display_map_position(e.latlng);
-       });
-
-       map.on('click', function(e) {
-               last_click_latlng = e.latlng;
-               display_map_position();
-       });
-
-       map.on('load', function(e){
-               display_map_position();
-       });
-
-
-       $('input#use_viewbox').on('change', function(){
-               $('input[name=viewbox]').val( $(this).prop('checked') ? map_viewbox_as_string() : '');
-       });
-
-
-
-       function map_viewbox_as_string() {
-               // since .toBBoxString() doesn't round numbers
-               return [
-                       map.getBounds().getSouthWest().lat.toFixed(5),
-                       map.getBounds().getSouthWest().lng.toFixed(5),
-                       map.getBounds().getNorthEast().lat.toFixed(5),
-                       map.getBounds().getNorthEast().lng.toFixed(5) ].join(',');
-       }
-       function map_link_to_osm(){
-               return "http://openstreetmap.org/#map=" + map.getZoom() + "/" + map.getCenter().lat + "/" + map.getCenter().lng;
-       }
-
-       function get_result_element(position){
-               return $('.result').eq(position);
-       }
-       function marker_for_result(result){
-               return L.marker([result.lat,result.lon], {riseOnHover:true,title:result.name });
-       }
-       function circle_for_result(result){
-               return L.circleMarker([result.lat,result.lon], { radius: 10, weight: 2, fillColor: '#ff7800', color: 'blue', opacity: 0.75, clickable: !is_reverse_search});
-       }
-
-       var layerGroup = new L.layerGroup().addTo(map);
-       function highlight_result(position, bool_focus){
-               var result = nominatim_results[position];
-               if (!result){ return }
-               var result_el = get_result_element(position);
-
-               $('.result').removeClass('highlight');
-               result_el.addClass('highlight');
-
-               layerGroup.clearLayers();
-
-               if (result.lat){
-                       var circle = circle_for_result(result);
-                       circle.on('click', function(){
-                               highlight_result(position);
-                       });
-                       layerGroup.addLayer(circle);                    
-               }
-               if (result.aBoundingBox){
-
-                       var bounds = [[result.aBoundingBox[0]*1,result.aBoundingBox[2]*1], [result.aBoundingBox[1]*1,result.aBoundingBox[3]*1]];
-                       map.fitBounds(bounds);
-                       if (result.astext && result.astext.match(/(POLY)|(LINE)/) ){
-                               var geojson_layer = L.geoJson(null, {
-                                       // http://leafletjs.com/reference.html#geojson-style
-                                       style: function(feature) { return { clickable: false, color: 'blue' }; }
-                               });
-                               omnivore.wkt.parse(result.astext,null,geojson_layer);
-                               layerGroup.addLayer(geojson_layer);
-                       }
-                       else {
-                               // var layer = L.rectangle(bounds, {color: "#ff7800", weight: 1} );
-                               // layerGroup.addLayer(layer);
-                       }
-               }
-               else {
-                       if ( is_reverse_search ){
-                               // make sure the search coordinates are in the map view as well
-                               map.fitBounds([[result.lat,result.lon], [nominatim_map_init.lat,nominatim_map_init.lon]], {padding: [50,50], maxZoom: map.getZoom()});
-
-                               // better, but causes a leaflet warning
-                               // map.panInsideBounds([[result.lat,result.lon], [nominatim_map_init.lat,nominatim_map_init.lon]], {animate: false});
-                       }
-                       else {
-                               map.panTo([result.lat,result.lon], result.zoom || nominatim_map_init.zoom);
-                       }
-               }
-
-               // var crosshairIcon = L.icon({
-               //      iconUrl:     'images/crosshair.png',
-               //      iconSize:    [12, 12],
-               //      iconAnchor:  [6, 6],
-               // });
-               // var crossMarker = new L.Marker([result.lat,result.lon], { icon: crosshairIcon, clickable: false});
-               // layerGroup.addLayer(crossMarker);
-
-
-
-               if (bool_focus){
-                       $('#map').focus();
-               }
-       }
-
-
-       $('.result').on('click', function(e){
-               highlight_result($(this).data('position'), true);
-       });
-
-       if ( is_reverse_search ){
-               map.on('click', function(e){
-                       $('form input[name=lat]').val( e.latlng.lat);
-                       $('form input[name=lon]').val( e.latlng.lng);
-                       $('form').submit();
-               });
-       }
-
-       highlight_result(0, false);
+    map = new L.map('map', {
+                attributionControl: (nominatim_map_init.tile_attribution && nominatim_map_init.tile_attribution.length),
+                scrollWheelZoom:    !L.Browser.touch,
+                touchZoom:          false
+            });
+
+    L.tileLayer(nominatim_map_init.tile_url, {
+        noWrap: true, // otherwise we end up with click coordinates like latitude -728
+        // moved to footer
+        attribution: (nominatim_map_init.tile_attribution || null ) //'&copy; <a href="http://osm.org/copyright">OpenStreetMap</a> contributors'
+    }).addTo(map);
+
+    map.setView([nominatim_map_init.lat, nominatim_map_init.lon], nominatim_map_init.zoom);
+
+    if ( is_reverse_search ){
+        // We don't need a marker, but an L.circle instance changes radius once you zoom in/out
+        var cm = L.circleMarker([nominatim_map_init.lat,nominatim_map_init.lon], { radius: 5, weight: 2, fillColor: '#ff7800', color: 'red', opacity: 0.75, clickable: false});
+        cm.addTo(map);
+    }
+
+    var MapPositionControl = L.Control.extend({
+            options: {
+                    position: 'topright'
+            },
+
+            onAdd: function (map) {
+                    var container = L.DomUtil.create('div', 'my-custom-control');
+
+                    $(container).text('show map bounds').addClass('leaflet-bar btn btn-sm btn-default').on('click', function(e){
+                        e.preventDefault();
+                        e.stopPropagation();
+                        $('#map-position').show();
+                        $(container).hide();
+                    });
+                    $('#map-position-close a').on('click', function(e){
+                        e.preventDefault();
+                        e.stopPropagation();
+                        $('#map-position').hide();
+                        $(container).show();
+                    });
+
+                    return container;
+            }
+    });
+
+    map.addControl(new MapPositionControl());
+
+
+    function display_map_position(mouse_lat_lng){
+
+        html_mouse = "mouse position " + (mouse_lat_lng ? [mouse_lat_lng.lat.toFixed(5), mouse_lat_lng.lng.toFixed(5)].join(',') : '-');
+        html_click = "last click: " + (last_click_latlng ? [last_click_latlng.lat.toFixed(5),last_click_latlng.lng.toFixed(5)].join(',') : '-');
+
+        html_center = 
+            "map center: " + 
+            map.getCenter().lat.toFixed(5) + ',' + map.getCenter().lng.toFixed(5) +
+            " <a target='_blank' href='" + map_link_to_osm() + "'>view on osm.org</a>";
+
+        html_zoom = "map zoom: " + map.getZoom();
+
+        html_viewbox = "viewbox: " + map_viewbox_as_string();
+
+        $('#map-position-inner').html([html_center,html_zoom,html_viewbox,html_click,html_mouse].join('<br/>'));
+        $('input#use_viewbox').trigger('change');
+    }
+
+    function update_viewbox_field(){
+        // hidden HTML field
+        $('input[name=viewbox]').val( $('input#use_viewbox').prop('checked') ? map_viewbox_as_string() : '');
+    }
+
+    map.on('move', function(e) {
+        display_map_position();
+        update_viewbox_field();
+    });
+
+    map.on('mousemove', function(e) {
+        display_map_position(e.latlng);
+    });
+
+    map.on('click', function(e) {
+        last_click_latlng = e.latlng;
+        display_map_position();
+    });
+
+    map.on('load', function(e){
+        display_map_position();
+    });
+
+
+    $('input#use_viewbox').on('change', function(){
+        update_viewbox_field();
+    });
+
+
+
+    function map_viewbox_as_string() {
+        // since .toBBoxString() doesn't round numbers
+        return [
+            map.getBounds().getSouthWest().lng.toFixed(5), // left
+            map.getBounds().getNorthEast().lat.toFixed(5), // top
+            map.getBounds().getNorthEast().lng.toFixed(5), // right
+            map.getBounds().getSouthWest().lat.toFixed(5)  // bottom
+        ].join(',');
+    }
+    function map_link_to_osm(){
+        return "http://openstreetmap.org/#map=" + map.getZoom() + "/" + map.getCenter().lat + "/" + map.getCenter().lng;
+    }
+
+    function get_result_element(position){
+        return $('.result').eq(position);
+    }
+    function marker_for_result(result){
+        return L.marker([result.lat,result.lon], {riseOnHover:true,title:result.name });
+    }
+    function circle_for_result(result){
+        return L.circleMarker([result.lat,result.lon], { radius: 10, weight: 2, fillColor: '#ff7800', color: 'blue', opacity: 0.75, clickable: !is_reverse_search});
+    }
+
+    var layerGroup = new L.layerGroup().addTo(map);
+    function highlight_result(position, bool_focus){
+        var result = nominatim_results[position];
+        if (!result){ return }
+        var result_el = get_result_element(position);
+
+        $('.result').removeClass('highlight');
+        result_el.addClass('highlight');
+
+        layerGroup.clearLayers();
+
+        if (result.lat){
+            var circle = circle_for_result(result);
+            circle.on('click', function(){
+                highlight_result(position);
+            });
+            layerGroup.addLayer(circle);            
+        }
+        if (result.aBoundingBox){
+
+            var bounds = [[result.aBoundingBox[0]*1,result.aBoundingBox[2]*1], [result.aBoundingBox[1]*1,result.aBoundingBox[3]*1]];
+            map.fitBounds(bounds);
+            if (result.astext && result.astext.match(/(POLY)|(LINE)/) ){
+                var geojson_layer = L.geoJson(null, {
+                    // http://leafletjs.com/reference.html#geojson-style
+                    style: function(feature) { return { clickable: false, color: 'blue' }; }
+                });
+                omnivore.wkt.parse(result.astext,null,geojson_layer);
+                layerGroup.addLayer(geojson_layer);
+            }
+            else {
+                // var layer = L.rectangle(bounds, {color: "#ff7800", weight: 1} );
+                // layerGroup.addLayer(layer);
+            }
+        }
+        else {
+            if ( is_reverse_search ){
+                // make sure the search coordinates are in the map view as well
+                map.fitBounds([[result.lat,result.lon], [nominatim_map_init.lat,nominatim_map_init.lon]], {padding: [50,50], maxZoom: map.getZoom()});
+
+                // better, but causes a leaflet warning
+                // map.panInsideBounds([[result.lat,result.lon], [nominatim_map_init.lat,nominatim_map_init.lon]], {animate: false});
+            }
+            else {
+                map.panTo([result.lat,result.lon], result.zoom || nominatim_map_init.zoom);
+            }
+        }
+
+        // var crosshairIcon = L.icon({
+        //  iconUrl:     'images/crosshair.png',
+        //  iconSize:    [12, 12],
+        //  iconAnchor:  [6, 6],
+        // });
+        // var crossMarker = new L.Marker([result.lat,result.lon], { icon: crosshairIcon, clickable: false});
+        // layerGroup.addLayer(crossMarker);
+
+
+
+        if (bool_focus){
+            $('#map').focus();
+        }
+    }
+
+
+    $('.result').on('click', function(e){
+        highlight_result($(this).data('position'), true);
+    });
+
+    if ( is_reverse_search ){
+        map.on('click', function(e){
+            $('form input[name=lat]').val( e.latlng.lat);
+            $('form input[name=lon]').val( e.latlng.lng);
+            $('form').submit();
+        });
+    }
+
+    highlight_result(0, false);
 
 
 });
@@ -179,41 +212,41 @@ jQuery(document).on('ready', function(){
 
 jQuery(document).on('ready', function(){
 
-       if ( !$('#details-page').length ){ return; }
+    if ( !$('#details-page').length ){ return; }
 
 
-               map = new L.map('map', {
-                                       // center: [nominatim_map_init.lat, nominatim_map_init.lon],
-                                       // zoom:   nominatim_map_init.zoom,
-                                       attributionControl: (nominatim_map_init.tile_attribution && nominatim_map_init.tile_attribution.length),
-                                       scrollWheelZoom:    false,
-                                       touchZoom:          false,
-                               });
+        map = new L.map('map', {
+                    // center: [nominatim_map_init.lat, nominatim_map_init.lon],
+                    // zoom:   nominatim_map_init.zoom,
+                    attributionControl: (nominatim_map_init.tile_attribution && nominatim_map_init.tile_attribution.length),
+                    scrollWheelZoom:    false,
+                    touchZoom:          false,
+                });
 
 
-               L.tileLayer(nominatim_map_init.tile_url, {
-                       // moved to footer
-                       attribution: (nominatim_map_init.tile_attribution || null ) //'&copy; <a href="http://osm.org/copyright">OpenStreetMap</a> contributors'
-               }).addTo(map);
+        L.tileLayer(nominatim_map_init.tile_url, {
+            // moved to footer
+            attribution: (nominatim_map_init.tile_attribution || null ) //'&copy; <a href="http://osm.org/copyright">OpenStreetMap</a> contributors'
+        }).addTo(map);
 
 
-               var layerGroup = new L.layerGroup().addTo(map);
+        var layerGroup = new L.layerGroup().addTo(map);
 
-               var circle = L.circleMarker([nominatim_result.lat,nominatim_result.lon], { radius: 10, weight: 2, fillColor: '#ff7800', color: 'blue', opacity: 0.75});
-               map.addLayer(circle);
+        var circle = L.circleMarker([nominatim_result.lat,nominatim_result.lon], { radius: 10, weight: 2, fillColor: '#ff7800', color: 'blue', opacity: 0.75});
+        map.addLayer(circle);
 
-               if ( nominatim_result.outlinestring ){
+        if ( nominatim_result.outlinestring ){
 
-                       var geojson_layer = L.geoJson(null, {
-                               // http://leafletjs.com/reference.html#geojson-style
-                               style: function(feature) { return { clickable: false, color: 'blue' }; }
-                       });
-                       omnivore.wkt.parse(nominatim_result.outlinestring,null,geojson_layer);
-                       layerGroup.addLayer(geojson_layer);
-                       map.fitBounds(geojson_layer.getBounds());
-               } else {
-                       map.setView([nominatim_result.lat,nominatim_result.lon],10);
-               }
+            var geojson_layer = L.geoJson(null, {
+                // http://leafletjs.com/reference.html#geojson-style
+                style: function(feature) { return { clickable: false, color: 'blue' }; }
+            });
+            omnivore.wkt.parse(nominatim_result.outlinestring,null,geojson_layer);
+            layerGroup.addLayer(geojson_layer);
+            map.fitBounds(geojson_layer.getBounds());
+        } else {
+            map.setView([nominatim_result.lat,nominatim_result.lon],10);
+        }
 
 
 
index cd29d4dad20dd4216408093f2f437990af96014b..22ee2f5af2d5896ff3f925b2e397207ae3997b8e 100755 (executable)
@@ -1,5 +1,5 @@
 div.olMap {
-       z-index: 0;
+    z-index: 0;
     padding: 0px!important;
     margin: 0px!important;
     cursor: default;
index 5fc6c309ad2b955ddfc3dadf0a0bc286a0e35376..667686d145bad20b49fc8f409f6b05b4f2849f58 100755 (executable)
@@ -1,73 +1,72 @@
 <?php
-       @define('CONST_ConnectionBucket_PageType', 'Reverse');
+@define('CONST_ConnectionBucket_PageType', 'Reverse');
 
-       require_once(dirname(dirname(__FILE__)).'/settings/settings.php');
-       require_once(CONST_BasePath.'/lib/init-website.php');
-       require_once(CONST_BasePath.'/lib/log.php');
-       require_once(CONST_BasePath.'/lib/PlaceLookup.php');
-       require_once(CONST_BasePath.'/lib/output.php');
+require_once(dirname(dirname(__FILE__)).'/settings/settings.php');
+require_once(CONST_BasePath.'/lib/init-website.php');
+require_once(CONST_BasePath.'/lib/log.php');
+require_once(CONST_BasePath.'/lib/PlaceLookup.php');
+require_once(CONST_BasePath.'/lib/output.php');
+ini_set('memory_limit', '200M');
 
-       $oDB =& getDB();
-       ini_set('memory_limit', '200M');
+$oParams = new Nominatim\ParameterParser();
 
-       // Format for output
-       $sOutputFormat = getParamSet('format', array('xml', 'json'), 'xml');
+// Format for output
+$sOutputFormat = $oParams->getSet('format', array('xml', 'json'), 'xml');
 
-       // Preferred language
-       $aLangPrefOrder = getPreferredLanguages();
+// Preferred language
+$aLangPrefOrder = $oParams->getPreferredLanguages();
 
-       $hLog = logStart($oDB, 'place', $_SERVER['QUERY_STRING'], $aLangPrefOrder);
+$oDB =& getDB();
 
-       $aSearchResults = array();
-       $aCleanedQueryParts = array();
+$hLog = logStart($oDB, 'place', $_SERVER['QUERY_STRING'], $aLangPrefOrder);
 
-       $oPlaceLookup = new PlaceLookup($oDB);
-       $oPlaceLookup->setLanguagePreference($aLangPrefOrder);
-       $oPlaceLookup->setIncludeAddressDetails(getParamBool('addressdetails', true));
-       $oPlaceLookup->setIncludeExtraTags(getParamBool('extratags', false));
-       $oPlaceLookup->setIncludeNameDetails(getParamBool('namedetails', false));
+$aSearchResults = array();
+$aCleanedQueryParts = array();
 
-       $aOsmIds = explode(',', getParamString('osm_ids', ''));
+$oPlaceLookup = new Nominatim\PlaceLookup($oDB);
+$oPlaceLookup->setLanguagePreference($aLangPrefOrder);
+$oPlaceLookup->setIncludeAddressDetails($oParams->getBool('addressdetails', true));
+$oPlaceLookup->setIncludeExtraTags($oParams->getBool('extratags', false));
+$oPlaceLookup->setIncludeNameDetails($oParams->getBool('namedetails', false));
 
-       if (count($aOsmIds) > CONST_Places_Max_ID_count)
-       {
-               userError('Bulk User: Only ' . CONST_Places_Max_ID_count . " ids are allowed in one request.");
-       }
+$aOsmIds = explode(',', $oParams->getString('osm_ids', ''));
 
-       foreach ($aOsmIds AS $sItem)
-       {
-               // Skip empty sItem
-               if (empty($sItem)) continue;
-               
-               $sType = $sItem[0];
-               $iId = (int) substr($sItem, 1);
-               if ( $iId > 0 && ($sType == 'N' || $sType == 'W' || $sType == 'R') )
-               {
-                       $aCleanedQueryParts[] = $sType . $iId;
-                       $oPlace = $oPlaceLookup->lookupOSMID($sType, $iId);
-                       if ($oPlace){
-                               // we want to use the search-* output templates, so we need to fill
-                               // $aSearchResults and slightly change the (reverse search) oPlace
-                               // key names
-                               $oResult = $oPlace;
-                               unset($oResult['aAddress']);
-                               if (isset($oPlace['aAddress'])) $oResult['address'] = $oPlace['aAddress'];
-                               unset($oResult['langaddress']);
-                               $oResult['name'] = $oPlace['langaddress'];
-                               $aSearchResults[] = $oResult;
-                       }
-               }
-       }
+if (count($aOsmIds) > CONST_Places_Max_ID_count) {
+    userError('Bulk User: Only ' . CONST_Places_Max_ID_count . " ids are allowed in one request.");
+}
 
+foreach ($aOsmIds as $sItem) {
+    // Skip empty sItem
+    if (empty($sItem)) continue;
+    
+    $sType = $sItem[0];
+    $iId = (int) substr($sItem, 1);
+    if ($iId > 0 && ($sType == 'N' || $sType == 'W' || $sType == 'R')) {
+        $aCleanedQueryParts[] = $sType . $iId;
+        $oPlace = $oPlaceLookup->lookupOSMID($sType, $iId);
+        if ($oPlace) {
+            // we want to use the search-* output templates, so we need to fill
+            // $aSearchResults and slightly change the (reverse search) oPlace
+            // key names
+            $oResult = $oPlace;
+            unset($oResult['aAddress']);
+            if (isset($oPlace['aAddress'])) $oResult['address'] = $oPlace['aAddress'];
+            unset($oResult['langaddress']);
+            $oResult['name'] = $oPlace['langaddress'];
+            $aSearchResults[] = $oResult;
+        }
+    }
+}
 
-       if (CONST_Debug) exit;
 
-       $sXmlRootTag = 'lookupresults';
-       $sQuery = join(',',$aCleanedQueryParts);
-       // we initialize these to avoid warnings in our logfile
-       $sViewBox = '';
-       $bShowPolygons = '';
-       $aExcludePlaceIDs = [];
-       $sMoreURL = '';
+if (CONST_Debug) exit;
 
-       include(CONST_BasePath.'/lib/template/search-'.$sOutputFormat.'.php');
+$sXmlRootTag = 'lookupresults';
+$sQuery = join(',', $aCleanedQueryParts);
+// we initialize these to avoid warnings in our logfile
+$sViewBox = '';
+$bShowPolygons = '';
+$aExcludePlaceIDs = [];
+$sMoreURL = '';
+
+include(CONST_BasePath.'/lib/template/search-'.$sOutputFormat.'.php');
index b855214a89a6ece1e65e762ef40f67e0a0ef28e8..153a279d0f2545c8dbc0c003d0058e92c480f9d3 100755 (executable)
 <?php
-       require_once(dirname(dirname(__FILE__)).'/settings/settings.php');
-       require_once(CONST_BasePath.'/lib/init-website.php');
-       require_once(CONST_BasePath.'/lib/log.php');
-       require_once(CONST_BasePath.'/lib/output.php');
-       ini_set('memory_limit', '200M');
 
-       $oDB =& getDB();
+require_once(dirname(dirname(__FILE__)).'/settings/settings.php');
+require_once(CONST_BasePath.'/lib/init-website.php');
+require_once(CONST_BasePath.'/lib/log.php');
+require_once(CONST_BasePath.'/lib/output.php');
+ini_set('memory_limit', '200M');
 
-       $sOutputFormat = 'html';
-       $iDays = getParamInt('days', 1);
-       $bReduced = getParamBool('reduced', false);
-       $sClass = getParamString('class', false);
+$oParams = new Nominatim\ParameterParser();
 
-       $iTotalBroken = (int) chksql($oDB->getOne('select count(*) from import_polygon_error'));
+$sOutputFormat = 'html';
+$iDays = $oParams->getInt('days', 1);
+$bReduced = $oParams->getBool('reduced', false);
+$sClass = $oParams->getString('class', false);
 
-       $aPolygons = array();
-       while($iTotalBroken && !sizeof($aPolygons))
-       {
-               $sSQL = 'select osm_type as "type",osm_id as "id",class as "key",type as "value",name->\'name\' as "name",';
-               $sSQL .= 'country_code as "country",errormessage as "error message",updated';
-               $sSQL .= " from import_polygon_error";
-               $sSQL .= " where updated > 'now'::timestamp - '".$iDays." day'::interval";
-               $iDays++;
+$oDB =& getDB();
 
-               if ($bReduced) $sSQL .= " and errormessage like 'Area reduced%'";
-               if ($sClass) $sSQL .= " and class = '".pg_escape_string($sClass)."'";
-               $sSQL .= " order by updated desc limit 1000";
-               $aPolygons = chksql($oDB->getAll($sSQL));
-       }
+$iTotalBroken = (int) chksql($oDB->getOne('select count(*) from import_polygon_error'));
+
+$aPolygons = array();
+while ($iTotalBroken && !sizeof($aPolygons)) {
+    $sSQL = 'select osm_type as "type",osm_id as "id",class as "key",type as "value",name->\'name\' as "name",';
+    $sSQL .= 'country_code as "country",errormessage as "error message",updated';
+    $sSQL .= " from import_polygon_error";
+    $sSQL .= " where updated > 'now'::timestamp - '".$iDays." day'::interval";
+    $iDays++;
+
+    if ($bReduced) $sSQL .= " and errormessage like 'Area reduced%'";
+    if ($sClass) $sSQL .= " and class = '".pg_escape_string($sClass)."'";
+    $sSQL .= " order by updated desc limit 1000";
+    $aPolygons = chksql($oDB->getAll($sSQL));
+}
+
+if (CONST_Debug) {
+    var_dump($aPolygons);
+    exit;
+}
 
-       if (CONST_Debug)
-       {
-               var_dump($aPolygons);
-               exit;
-       }
 ?>
 <!DOCTYPE html>
 <html>
 <head>
-       <meta charset="utf-8"/>
-       <meta http-equiv="Content-Type" content="text/html;charset=utf-8" >
-       
-       <title>Nominatim Broken Polygon Data</title>
-       
-       <meta name="description" content="List of broken OSM polygon data by date" lang="en-US" />
+    <meta charset="utf-8"/>
+    <meta http-equiv="Content-Type" content="text/html;charset=utf-8" >
+    
+    <title>Nominatim Broken Polygon Data</title>
+    
+    <meta name="description" content="List of broken OSM polygon data by date" lang="en-US" />
 
 </head>
 
 <body>
 <style type="text/css">
 table {
-       border-width: 1px;
-       border-spacing: 0px;
-       border-style: solid;
-       border-color: gray;
-       border-collapse: collapse;
-       background-color: white;
-       margin: 10px;
+    border-width: 1px;
+    border-spacing: 0px;
+    border-style: solid;
+    border-color: gray;
+    border-collapse: collapse;
+    background-color: white;
+    margin: 10px;
 }
 table th {
-       border-width: 1px;
-       padding: 2px;
-       border-style: inset;
-       border-color: gray;
-       border-left-color: #ddd;
-       border-right-color: #ddd;
-       background-color: #eee;
-       -moz-border-radius: 0px 0px 0px 0px;
+    border-width: 1px;
+    padding: 2px;
+    border-style: inset;
+    border-color: gray;
+    border-left-color: #ddd;
+    border-right-color: #ddd;
+    background-color: #eee;
+    -moz-border-radius: 0px 0px 0px 0px;
 }
 table td {
-       border-width: 1px;
-       padding: 2px;
-       border-style: inset;
-       border-color: gray;
-       border-left-color: #ddd;
-       border-right-color: #ddd;
-       background-color: white;
-       -moz-border-radius: 0px 0px 0px 0px;
+    border-width: 1px;
+    padding: 2px;
+    border-style: inset;
+    border-color: gray;
+    border-left-color: #ddd;
+    border-right-color: #ddd;
+    background-color: white;
+    -moz-border-radius: 0px 0px 0px 0px;
 }
 </style>
 
 <?php
 
-       echo "<p>Total number of broken polygons: $iTotalBroken</p>";
-       if (!$aPolygons) exit;
-       echo "<table>";
-       echo "<tr>";
+echo "<p>Total number of broken polygons: $iTotalBroken</p>";
+if (!$aPolygons) exit;
+echo "<table>";
+echo "<tr>";
 //var_dump($aPolygons[0]);
-       foreach($aPolygons[0] as $sCol => $sVal)
-       {
-               echo "<th>".$sCol."</th>";
-       }
-       echo "<th>&nbsp;</th>";
-       echo "<th>&nbsp;</th>";
-       echo "</tr>";
-       $aSeen = array();
-       foreach($aPolygons as $aRow)
-       {
-               if (isset($aSeen[$aRow['type'].$aRow['id']])) continue;
-               $aSeen[$aRow['type'].$aRow['id']] = 1;
-               echo "<tr>";
-               foreach($aRow as $sCol => $sVal)
-               {
-                       switch($sCol)
-                       {
-                       case 'error message':
-                               if (preg_match('/Self-intersection\\[([0-9.\\-]+) ([0-9.\\-]+)\\]/',$sVal,$aMatch))
-                               {
-                                       $aRow['lat'] = $aMatch[2];
-                                       $aRow['lon'] = $aMatch[1];
-                                       echo "<td><a href=\"http://www.openstreetmap.org/?lat=".$aMatch[2]."&lon=".$aMatch[1]."&zoom=18&layers=M&".$sOSMType."=".$aRow['id']."\">".($sVal?$sVal:'&nbsp;')."</a></td>";
-                               }
-                               else
-                               {
-                                       echo "<td>".($sVal?$sVal:'&nbsp;')."</td>";
-                               }
-                               break;
-                       case 'id':
-                               echo '<td>'.osmLink($aRow).'</td>';
-                               break;
-                       default:
-                               echo "<td>".($sVal?$sVal:'&nbsp;')."</td>";
-                               break;
-                       }
-               }
-               echo "<td><a href=\"http://localhost:8111/import?url=http://www.openstreetmap.org/api/0.6/".$sOSMType.'/'.$aRow['id']."/full\" target=\"josm\">josm</a></td>";
-               if (isset($aRow['lat']))
-               {
-                       echo "<td><a href=\"http://open.mapquestapi.com/dataedit/index_flash.html?lat=".$aRow['lat']."&lon=".$aRow['lon']."&zoom=18\" target=\"potlatch2\">P2</a></td>";
-               }
-               else
-               {
-                       echo "<td>&nbsp;</td>"; 
-               }
-               echo "</tr>";
-       }
-       echo "</table>";
+foreach ($aPolygons[0] as $sCol => $sVal) {
+    echo "<th>".$sCol."</th>";
+}
+echo "<th>&nbsp;</th>";
+echo "<th>&nbsp;</th>";
+echo "</tr>";
+$aSeen = array();
+foreach ($aPolygons as $aRow) {
+    if (isset($aSeen[$aRow['type'].$aRow['id']])) continue;
+    $aSeen[$aRow['type'].$aRow['id']] = 1;
+    echo "<tr>";
+    foreach ($aRow as $sCol => $sVal) {
+        switch ($sCol) {
+            case 'error message':
+                if (preg_match('/Self-intersection\\[([0-9.\\-]+) ([0-9.\\-]+)\\]/', $sVal, $aMatch)) {
+                    $aRow['lat'] = $aMatch[2];
+                    $aRow['lon'] = $aMatch[1];
+                    echo "<td><a href=\"http://www.openstreetmap.org/?lat=".$aMatch[2]."&lon=".$aMatch[1]."&zoom=18&layers=M&".$sOSMType."=".$aRow['id']."\">".($sVal?$sVal:'&nbsp;')."</a></td>";
+                } else {
+                    echo "<td>".($sVal?$sVal:'&nbsp;')."</td>";
+                }
+                break;
+            case 'id':
+                echo '<td>'.osmLink($aRow).'</td>';
+                break;
+            default:
+                echo "<td>".($sVal?$sVal:'&nbsp;')."</td>";
+                break;
+        }
+    }
+    echo "<td><a href=\"http://localhost:8111/import?url=http://www.openstreetmap.org/api/0.6/".$sOSMType.'/'.$aRow['id']."/full\" target=\"josm\">josm</a></td>";
+    if (isset($aRow['lat'])) {
+        echo "<td><a href=\"http://open.mapquestapi.com/dataedit/index_flash.html?lat=".$aRow['lat']."&lon=".$aRow['lon']."&zoom=18\" target=\"potlatch2\">P2</a></td>";
+    } else {
+        echo "<td>&nbsp;</td>";
+    }
+    echo "</tr>";
+}
+echo "</table>";
+
 ?>
 </body>
 </html>
index f37638665e1734a9ec6d11b4a67a4974dcd86366..9c9b99fbdcd479e752b24c1770b4284c400cec6f 100755 (executable)
 <?php
-       @define('CONST_ConnectionBucket_PageType', 'Reverse');
-
-       require_once(dirname(dirname(__FILE__)).'/settings/settings.php');
-       require_once(CONST_BasePath.'/lib/init-website.php');
-       require_once(CONST_BasePath.'/lib/log.php');
-       require_once(CONST_BasePath.'/lib/PlaceLookup.php');
-       require_once(CONST_BasePath.'/lib/ReverseGeocode.php');
-       require_once(CONST_BasePath.'/lib/output.php');
-
-       $bAsGeoJSON = getParamBool('polygon_geojson');
-       $bAsKML = getParamBool('polygon_kml');
-       $bAsSVG = getParamBool('polygon_svg');
-       $bAsText = getParamBool('polygon_text');
-       if ((($bAsGeoJSON?1:0) + ($bAsKML?1:0) + ($bAsSVG?1:0)
-               + ($bAsText?1:0)) > CONST_PolygonOutput_MaximumTypes)
-       {
-               if (CONST_PolygonOutput_MaximumTypes)
-               {
-                       userError("Select only ".CONST_PolygonOutput_MaximumTypes." polgyon output option");
-               }
-               else
-               {
-                       userError("Polygon output is disabled");
-               }
-               exit;
-       }
-
-
-       // Polygon simplification threshold (optional)
-       $fThreshold = getParamFloat('polygon_threshold', 0.0);
-
-
-       $oDB =& getDB();
-       ini_set('memory_limit', '200M');
-
-       // Format for output
-       $sOutputFormat = getParamSet('format', array('html', 'xml', 'json', 'jsonv2'), 'xml');
-
-       // Preferred language
-       $aLangPrefOrder = getPreferredLanguages();
-
-       $hLog = logStart($oDB, 'reverse', $_SERVER['QUERY_STRING'], $aLangPrefOrder);
-
-
-       $oPlaceLookup = new PlaceLookup($oDB);
-       $oPlaceLookup->setLanguagePreference($aLangPrefOrder);
-       $oPlaceLookup->setIncludeAddressDetails(getParamBool('addressdetails', true));
-       $oPlaceLookup->setIncludeExtraTags(getParamBool('extratags', false));
-       $oPlaceLookup->setIncludeNameDetails(getParamBool('namedetails', false));
-
-       $sOsmType = getParamSet('osm_type', array('N', 'W', 'R'));
-       $iOsmId = getParamInt('osm_id', -1);
-       $fLat = getParamFloat('lat');
-       $fLon = getParamFloat('lon');
-       if ($sOsmType && $iOsmId > 0)
-       {
-               $aPlace = $oPlaceLookup->lookupOSMID($sOsmType, $iOsmId);
-       }
-       else if ($fLat !== false && $fLon !== false)
-       {
-               $oReverseGeocode = new ReverseGeocode($oDB);
-               $oReverseGeocode->setZoom(getParamInt('zoom', 18));
-
-               $aLookup = $oReverseGeocode->lookup($fLat, $fLon);
-               if (CONST_Debug) var_dump($aLookup);
-
-               $aPlace = $oPlaceLookup->lookup((int)$aLookup['place_id'],
-                                               $aLookup['type'], $aLookup['fraction']);
-       }
-       else if ($sOutputFormat != 'html')
-       {
-               userError("Need coordinates or OSM object to lookup.");
-       }
-
-       if ($aPlace)
-       {
-               $oPlaceLookup->setIncludePolygonAsPoints(false);
-               $oPlaceLookup->setIncludePolygonAsText($bAsText);
-               $oPlaceLookup->setIncludePolygonAsGeoJSON($bAsGeoJSON);
-               $oPlaceLookup->setIncludePolygonAsKML($bAsKML);
-               $oPlaceLookup->setIncludePolygonAsSVG($bAsSVG);
-               $oPlaceLookup->setPolygonSimplificationThreshold($fThreshold);
-
-               $fRadius = $fDiameter = getResultDiameter($aPlace);
-               $aOutlineResult = $oPlaceLookup->getOutlines($aPlace['place_id'],
-                                                            $aPlace['lon'], $aPlace['lat'],
-                                                            $fRadius);
-
-               if ($aOutlineResult)
-               {
-                       $aPlace = array_merge($aPlace, $aOutlineResult);
-               }
-       }
-
-       logEnd($oDB, $hLog, sizeof($aPlace)?1:0);
-
-       if (CONST_Debug)
-       {
-               var_dump($aPlace);
-               exit;
-       }
-
-       if ($sOutputFormat=='html')
-       {
-               $sDataDate = chksql($oDB->getOne("select TO_CHAR(lastimportdate - '2 minutes'::interval,'YYYY/MM/DD HH24:MI')||' GMT' from import_status limit 1"));
-               $sTileURL = CONST_Map_Tile_URL;
-               $sTileAttribution = CONST_Map_Tile_Attribution;
-       }
-       include(CONST_BasePath.'/lib/template/address-'.$sOutputFormat.'.php');
+@define('CONST_ConnectionBucket_PageType', 'Reverse');
+
+require_once(dirname(dirname(__FILE__)).'/settings/settings.php');
+require_once(CONST_BasePath.'/lib/init-website.php');
+require_once(CONST_BasePath.'/lib/log.php');
+require_once(CONST_BasePath.'/lib/PlaceLookup.php');
+require_once(CONST_BasePath.'/lib/ReverseGeocode.php');
+require_once(CONST_BasePath.'/lib/output.php');
+ini_set('memory_limit', '200M');
+
+$oParams = new Nominatim\ParameterParser();
+
+$bAsGeoJSON = $oParams->getBool('polygon_geojson');
+$bAsKML = $oParams->getBool('polygon_kml');
+$bAsSVG = $oParams->getBool('polygon_svg');
+$bAsText = $oParams->getBool('polygon_text');
+
+$iWantedTypes = ($bAsGeoJSON?1:0) + ($bAsKML?1:0) + ($bAsSVG?1:0) + ($bAsText?1:0);
+if ($iWantedTypes > CONST_PolygonOutput_MaximumTypes) {
+    if (CONST_PolygonOutput_MaximumTypes) {
+        userError("Select only ".CONST_PolygonOutput_MaximumTypes." polgyon output option");
+    } else {
+        userError("Polygon output is disabled");
+    }
+}
+
+// Polygon simplification threshold (optional)
+$fThreshold = $oParams->getFloat('polygon_threshold', 0.0);
+
+// Format for output
+$sOutputFormat = $oParams->getSet('format', array('html', 'xml', 'json', 'jsonv2'), 'xml');
+
+// Preferred language
+$aLangPrefOrder = $oParams->getPreferredLanguages();
+
+$oDB =& getDB();
+
+$hLog = logStart($oDB, 'reverse', $_SERVER['QUERY_STRING'], $aLangPrefOrder);
+
+
+$oPlaceLookup = new Nominatim\PlaceLookup($oDB);
+$oPlaceLookup->setLanguagePreference($aLangPrefOrder);
+$oPlaceLookup->setIncludeAddressDetails($oParams->getBool('addressdetails', true));
+$oPlaceLookup->setIncludeExtraTags($oParams->getBool('extratags', false));
+$oPlaceLookup->setIncludeNameDetails($oParams->getBool('namedetails', false));
+
+$sOsmType = $oParams->getSet('osm_type', array('N', 'W', 'R'));
+$iOsmId = $oParams->getInt('osm_id', -1);
+$fLat = $oParams->getFloat('lat');
+$fLon = $oParams->getFloat('lon');
+if ($sOsmType && $iOsmId > 0) {
+    $aPlace = $oPlaceLookup->lookupOSMID($sOsmType, $iOsmId);
+} elseif ($fLat !== false && $fLon !== false) {
+    $oReverseGeocode = new Nominatim\ReverseGeocode($oDB);
+    $oReverseGeocode->setZoom($oParams->getInt('zoom', 18));
+
+    $aLookup = $oReverseGeocode->lookup($fLat, $fLon);
+    if (CONST_Debug) var_dump($aLookup);
+
+    $aPlace = $oPlaceLookup->lookup(
+        (int)$aLookup['place_id'],
+        $aLookup['type'],
+        $aLookup['fraction']
+    );
+} elseif ($sOutputFormat != 'html') {
+    userError("Need coordinates or OSM object to lookup.");
+}
+
+if ($aPlace) {
+    $oPlaceLookup->setIncludePolygonAsPoints(false);
+    $oPlaceLookup->setIncludePolygonAsText($bAsText);
+    $oPlaceLookup->setIncludePolygonAsGeoJSON($bAsGeoJSON);
+    $oPlaceLookup->setIncludePolygonAsKML($bAsKML);
+    $oPlaceLookup->setIncludePolygonAsSVG($bAsSVG);
+    $oPlaceLookup->setPolygonSimplificationThreshold($fThreshold);
+
+    $fRadius = $fDiameter = getResultDiameter($aPlace);
+    $aOutlineResult = $oPlaceLookup->getOutlines(
+        $aPlace['place_id'],
+        $aPlace['lon'],
+        $aPlace['lat'],
+        $fRadius
+    );
+
+    if ($aOutlineResult) {
+        $aPlace = array_merge($aPlace, $aOutlineResult);
+    }
+}
+
+logEnd($oDB, $hLog, sizeof($aPlace)?1:0);
+
+if (CONST_Debug) {
+    var_dump($aPlace);
+    exit;
+}
+
+if ($sOutputFormat=='html') {
+    $sDataDate = chksql($oDB->getOne("select TO_CHAR(lastimportdate - '2 minutes'::interval,'YYYY/MM/DD HH24:MI')||' GMT' from import_status limit 1"));
+    $sTileURL = CONST_Map_Tile_URL;
+    $sTileAttribution = CONST_Map_Tile_Attribution;
+}
+include(CONST_BasePath.'/lib/template/address-'.$sOutputFormat.'.php');
+>>>>>>> upstream/master
index 4c283d1aa40827798334aa99f30a34b5d9e65643..c1169c8ae6d78c864f5109091e5ab2d5f27e1acb 100755 (executable)
 <?php
-       @define('CONST_ConnectionBucket_PageType', 'Search');
-
-       require_once(dirname(dirname(__FILE__)).'/settings/settings.php');
-       require_once(CONST_BasePath.'/lib/init-website.php');
-       require_once(CONST_BasePath.'/lib/log.php');
-       require_once(CONST_BasePath.'/lib/Geocode.php');
-       require_once(CONST_BasePath.'/lib/output.php');
-
-       ini_set('memory_limit', '200M');
-
-       $oDB =& getDB();
-
-       $oGeocode = new Geocode($oDB);
-
-       $aLangPrefOrder = getPreferredLanguages();
-       $oGeocode->setLanguagePreference($aLangPrefOrder);
-
-       if (CONST_Search_ReversePlanForAll
-               || isset($aLangPrefOrder['name:de'])
-               || isset($aLangPrefOrder['name:ru'])
-               || isset($aLangPrefOrder['name:ja'])
-               || isset($aLangPrefOrder['name:pl']))
-       {
-               $oGeocode->setReverseInPlan(true);
-       }
-
-       // Format for output
-       $sOutputFormat = getParamSet('format', array('html', 'xml', 'json', 'jsonv2'), 'html');
-
-       // Show / use polygons
-       if ($sOutputFormat == 'html')
-       {
-               $oGeocode->setIncludePolygonAsText(getParamBool('polygon'));
-               $bAsText = false;
-       }
-       else
-       {
-               $bAsPoints = getParamBool('polygon');
-               $bAsGeoJSON = getParamBool('polygon_geojson');
-               $bAsKML = getParamBool('polygon_kml');
-               $bAsSVG = getParamBool('polygon_svg');
-               $bAsText = getParamBool('polygon_text');
-               if ( ( ($bAsGeoJSON?1:0)
-                                + ($bAsKML?1:0)
-                                + ($bAsSVG?1:0)
-                                + ($bAsText?1:0)
-                                + ($bAsPoints?1:0)
-                                ) > CONST_PolygonOutput_MaximumTypes)
-               {
-                       if (CONST_PolygonOutput_MaximumTypes)
-                       {
-                               userError("Select only ".CONST_PolygonOutput_MaximumTypes." polgyon output option");
-                       }
-                       else
-                       {
-                               userError("Polygon output is disabled");
-                       }
-                       exit;
-               }
-               $oGeocode->setIncludePolygonAsPoints($bAsPoints);
-               $oGeocode->setIncludePolygonAsText($bAsText);
-               $oGeocode->setIncludePolygonAsGeoJSON($bAsGeoJSON);
-               $oGeocode->setIncludePolygonAsKML($bAsKML);
-               $oGeocode->setIncludePolygonAsSVG($bAsSVG);
-       }
-
-       // Polygon simplification threshold (optional)
-       $oGeocode->setPolygonSimplificationThreshold(getParamFloat('polygon_threshold', 0.0));
-
-       $oGeocode->loadParamArray($_GET);
-
-       if (CONST_Search_BatchMode && isset($_GET['batch']))
-       {
-               $aBatch = json_decode($_GET['batch'], true);
-               $aBatchResults = array();
-               foreach($aBatch as $aBatchParams)
-               {
-                       $oBatchGeocode = clone $oGeocode;
-                       $oBatchGeocode->loadParamArray($aBatchParams);
-                       $oBatchGeocode->setQueryFromParams($aBatchParams);
-                       $aSearchResults = $oBatchGeocode->lookup();
-                       $aBatchResults[] = $aSearchResults;
-               }
-               include(CONST_BasePath.'/lib/template/search-batch-json.php');
-               exit;
-       }
-
-       if (!getParamString('q') && isset($_SERVER['PATH_INFO']) && $_SERVER['PATH_INFO'][0] == '/')
-       {
-               $sQuery = substr(rawurldecode($_SERVER['PATH_INFO']), 1);
-
-               // reverse order of '/' separated string
-               $aPhrases = explode('/', $sQuery);
-               $aPhrases = array_reverse($aPhrases);
-               $sQuery = join(', ',$aPhrases);
-               $oGeocode->setQuery($sQuery);
-       }
-       else
-       {
-               $oGeocode->setQueryFromParams($_GET);
-       }
-
-       $hLog = logStart($oDB, 'search', $oGeocode->getQueryString(), $aLangPrefOrder);
-
-       $aSearchResults = $oGeocode->lookup();
-       if ($aSearchResults === false) $aSearchResults = array();
-
-       if ($sOutputFormat=='html')
-       {
-               $sDataDate = chksql($oDB->getOne("select TO_CHAR(lastimportdate - '2 minutes'::interval,'YYYY/MM/DD HH24:MI')||' GMT' from import_status limit 1"));
-       }
-       logEnd($oDB, $hLog, sizeof($aSearchResults));
-
-       $sQuery = $oGeocode->getQueryString();
-       $sViewBox = $oGeocode->getViewBoxString();
-       $bShowPolygons = (isset($_GET['polygon']) && $_GET['polygon']);
-       $aExcludePlaceIDs = $oGeocode->getExcludedPlaceIDs();
-
-       $sMoreURL = CONST_Website_BaseURL.'search.php?format='.urlencode($sOutputFormat).'&exclude_place_ids='.join(',',$aExcludePlaceIDs);
-       if (isset($_SERVER["HTTP_ACCEPT_LANGUAGE"])) $sMoreURL .= '&accept-language='.$_SERVER["HTTP_ACCEPT_LANGUAGE"];
-       if ($bShowPolygons) $sMoreURL .= '&polygon=1';
-       if ($oGeocode->getIncludeAddressDetails()) $sMoreURL .= '&addressdetails=1';
-       if ($oGeocode->getIncludeExtraTags()) $sMoreURL .= '&extratags=1';
-       if ($oGeocode->getIncludeNameDetails()) $sMoreURL .= '&namedetails=1';
-       if ($sViewBox) $sMoreURL .= '&viewbox='.urlencode($sViewBox);
-       if (isset($_GET['nearlat']) && isset($_GET['nearlon'])) $sMoreURL .= '&nearlat='.(float)$_GET['nearlat'].'&nearlon='.(float)$_GET['nearlon'];
-       $sMoreURL .= '&q='.urlencode($sQuery);
-
-       if (CONST_Debug) exit;
-
-       include(CONST_BasePath.'/lib/template/search-'.$sOutputFormat.'.php');
+@define('CONST_ConnectionBucket_PageType', 'Search');
+
+require_once(dirname(dirname(__FILE__)).'/settings/settings.php');
+require_once(CONST_BasePath.'/lib/init-website.php');
+require_once(CONST_BasePath.'/lib/log.php');
+require_once(CONST_BasePath.'/lib/Geocode.php');
+require_once(CONST_BasePath.'/lib/output.php');
+ini_set('memory_limit', '200M');
+
+$oDB =& getDB();
+$oParams = new Nominatim\ParameterParser();
+
+$oGeocode = new Nominatim\Geocode($oDB);
+
+$aLangPrefOrder = $oParams->getPreferredLanguages();
+$oGeocode->setLanguagePreference($aLangPrefOrder);
+
+if (CONST_Search_ReversePlanForAll
+    || isset($aLangPrefOrder['name:de'])
+    || isset($aLangPrefOrder['name:ru'])
+    || isset($aLangPrefOrder['name:ja'])
+    || isset($aLangPrefOrder['name:pl'])
+) {
+    $oGeocode->setReverseInPlan(true);
+}
+
+// Format for output
+$sOutputFormat = $oParams->getSet('format', array('html', 'xml', 'json', 'jsonv2'), 'html');
+
+// Show / use polygons
+if ($sOutputFormat == 'html') {
+    $oGeocode->setIncludePolygonAsText($oParams->getBool('polygon'));
+    $bAsText = false;
+} else {
+    $bAsPoints = $oParams->getBool('polygon');
+    $bAsGeoJSON = $oParams->getBool('polygon_geojson');
+    $bAsKML = $oParams->getBool('polygon_kml');
+    $bAsSVG = $oParams->getBool('polygon_svg');
+    $bAsText = $oParams->getBool('polygon_text');
+    $iWantedTypes = ($bAsGeoJSON?1:0) + ($bAsKML?1:0) + ($bAsSVG?1:0) + ($bAsText?1:0) + ($bAsPoints?1:0);
+    if ($iWantedTypes > CONST_PolygonOutput_MaximumTypes) {
+        if (CONST_PolygonOutput_MaximumTypes) {
+            userError("Select only ".CONST_PolygonOutput_MaximumTypes." polgyon output option");
+        } else {
+            userError("Polygon output is disabled");
+        }
+        exit;
+    }
+    $oGeocode->setIncludePolygonAsPoints($bAsPoints);
+    $oGeocode->setIncludePolygonAsText($bAsText);
+    $oGeocode->setIncludePolygonAsGeoJSON($bAsGeoJSON);
+    $oGeocode->setIncludePolygonAsKML($bAsKML);
+    $oGeocode->setIncludePolygonAsSVG($bAsSVG);
+}
+
+// Polygon simplification threshold (optional)
+$oGeocode->setPolygonSimplificationThreshold($oParams->getFloat('polygon_threshold', 0.0));
+
+$oGeocode->loadParamArray($oParams);
+
+if (CONST_Search_BatchMode && isset($_GET['batch'])) {
+    $aBatch = json_decode($_GET['batch'], true);
+    $aBatchResults = array();
+    foreach ($aBatch as $aBatchParams) {
+        $oBatchGeocode = clone $oGeocode;
+        $oBatchParams = new Nominatim\ParameterParser($aBatchParams);
+        $oBatchGeocode->loadParamArray($oBatchParams);
+        $oBatchGeocode->setQueryFromParams($oBatchParams);
+        $aSearchResults = $oBatchGeocode->lookup();
+        $aBatchResults[] = $aSearchResults;
+    }
+    include(CONST_BasePath.'/lib/template/search-batch-json.php');
+    exit;
+}
+
+$oGeocode->setQueryFromParams($oParams);
+
+if (!$oGeocode->getQueryString()
+    && isset($_SERVER['PATH_INFO'])
+    && $_SERVER['PATH_INFO'][0] == '/'
+) {
+    $sQuery = substr(rawurldecode($_SERVER['PATH_INFO']), 1);
+
+    // reverse order of '/' separated string
+    $aPhrases = explode('/', $sQuery);
+    $aPhrases = array_reverse($aPhrases);
+    $sQuery = join(', ', $aPhrases);
+    $oGeocode->setQuery($sQuery);
+}
+
+$hLog = logStart($oDB, 'search', $oGeocode->getQueryString(), $aLangPrefOrder);
+
+$aSearchResults = $oGeocode->lookup();
+if ($aSearchResults === false) $aSearchResults = array();
+
+if ($sOutputFormat=='html') {
+    $sDataDate = chksql($oDB->getOne("select TO_CHAR(lastimportdate - '2 minutes'::interval,'YYYY/MM/DD HH24:MI')||' GMT' from import_status limit 1"));
+}
+logEnd($oDB, $hLog, sizeof($aSearchResults));
+
+$sQuery = $oGeocode->getQueryString();
+$sViewBox = $oGeocode->getViewBoxString();
+$bShowPolygons = (isset($_GET['polygon']) && $_GET['polygon']);
+$aExcludePlaceIDs = $oGeocode->getExcludedPlaceIDs();
+
+$sMoreURL = CONST_Website_BaseURL.'search.php?format='.urlencode($sOutputFormat).'&exclude_place_ids='.join(',', $aExcludePlaceIDs);
+if (isset($_SERVER["HTTP_ACCEPT_LANGUAGE"])) $sMoreURL .= '&accept-language='.$_SERVER["HTTP_ACCEPT_LANGUAGE"];
+if ($bShowPolygons) $sMoreURL .= '&polygon=1';
+if ($oGeocode->getIncludeAddressDetails()) $sMoreURL .= '&addressdetails=1';
+if ($oGeocode->getIncludeExtraTags()) $sMoreURL .= '&extratags=1';
+if ($oGeocode->getIncludeNameDetails()) $sMoreURL .= '&namedetails=1';
+if ($sViewBox) $sMoreURL .= '&viewbox='.urlencode($sViewBox);
+if (isset($_GET['nearlat']) && isset($_GET['nearlon'])) $sMoreURL .= '&nearlat='.(float)$_GET['nearlat'].'&nearlon='.(float)$_GET['nearlon'];
+$sMoreURL .= '&q='.urlencode($sQuery);
+
+if (CONST_Debug) exit;
+
+include(CONST_BasePath.'/lib/template/search-'.$sOutputFormat.'.php');
index f4e696a4014263cd201c3c4292a977bc8d287f1a..b30a9a403d7580efaf78a06b4603717ea0998c40 100644 (file)
@@ -1,42 +1,37 @@
 <?php
-       @define('CONST_ConnectionBucket_PageType', 'Status');
+@define('CONST_ConnectionBucket_PageType', 'Status');
 
-       require_once(dirname(dirname(__FILE__)).'/settings/settings.php');
-       require_once(CONST_BasePath.'/lib/init-website.php');
+require_once(dirname(dirname(__FILE__)).'/settings/settings.php');
+require_once(CONST_BasePath.'/lib/init-website.php');
 
-       function statusError($sMsg)
-       {
-               header("HTTP/1.0 500 Internal Server Error");
-               echo "ERROR: ".$sMsg;
-               exit;
-       }
 
-       $oDB =& DB::connect(CONST_Database_DSN, false);
-       if (!$oDB || PEAR::isError($oDB))
-       {
-               statusError("No database");
-       }
+function statusError($sMsg)
+{
+    header("HTTP/1.0 500 Internal Server Error");
+    echo "ERROR: ".$sMsg;
+    exit;
+}
 
-       $sStandardWord = $oDB->getOne("select make_standard_name('a')");
-       if (PEAR::isError($sStandardWord))
-       {
-               statusError("Module failed");
-       }
-       if ($sStandardWord != 'a')
-       {
-               statusError("Module call failed");
-       }
+$oDB =& DB::connect(CONST_Database_DSN, false);
+if (!$oDB || PEAR::isError($oDB)) {
+    statusError("No database");
+}
 
-       $iWordID = $oDB->getOne("select word_id,word_token, word, class, type, country_code, operator, search_name_count from word where word_token in (' a')");
-       if (PEAR::isError($iWordID))
-       {
-               statusError("Query failed");
-       }
-       if (!$iWordID)
-       {
-               statusError("No value");
-       }
+$sStandardWord = $oDB->getOne("select make_standard_name('a')");
+if (PEAR::isError($sStandardWord)) {
+    statusError("Module failed");
+}
+if ($sStandardWord != 'a') {
+    statusError("Module call failed");
+}
 
-       echo "OK";
-       exit;
+$iWordID = $oDB->getOne("select word_id,word_token, word, class, type, country_code, operator, search_name_count from word where word_token in (' a')");
+if (PEAR::isError($iWordID)) {
+    statusError("Query failed");
+}
+if (!$iWordID) {
+    statusError("No value");
+}
 
+echo "OK";
+exit;
index e1b0687fbbd475beea4e42dbf0aa8310c3a12b9a..11b30fe1fae654c8d5dbff8f0fde44d134ce6d89 100755 (executable)
@@ -17,172 +17,159 @@ $iNS = false;
 $iID = false;
 
 if ($hFile) {
-       while (($sLine = fgets($hFile, 4000000)) !== false) {
-               if (substr($sLine, 0, 11) == '    <title>') {
-                       $sTitle = substr($sLine, 11, -9);
-               }
-               else if (substr($sLine, 0, 8) == '    <ns>') {
-                       $iNS = (int)substr($sLine, 8, -6);
-               }
-               else if (substr($sLine, 0, 8) == '    <id>') {
-                       $iID = (int)substr($sLine, 8, -6);
-               }
-               else if (substr($sLine, 0, 33) == '      <text xml:space="preserve">') {
-                       if ($iNS == -2) continue;
-                       if ($iNS == -1) continue;
-                       if ($iNS == 1) continue;
-                       if ($iNS == 2) continue;
-                       if ($iNS == 3) continue;
-                       if ($iNS == 4) continue;
-                       if ($iNS == 5) continue;
-                       if ($iNS == 6) continue;
-                       if ($iNS == 7) continue;
-                       if ($iNS == 8) continue;
-                       if ($iNS == 9) continue;
-                       if ($iNS == 10) continue;
-                       if ($iNS == 11) continue;
-                       if ($iNS == 12) continue;
-                       if ($iNS == 13) continue;
-                       if ($iNS == 14) continue;
-                       if ($iNS == 15) continue;
-                       if ($iNS == 121) continue;
-                       if ($iNS == 123) continue;
-                       if ($iNS == 829) continue;
-                       if ($iNS == 1198) continue;
-                       if ($iNS == 1199) continue;
-                       $sText = html_entity_decode(substr($sLine, 33, -8), ENT_COMPAT, 'UTF-8');
-                       $aArticle = json_decode($sText, true);
-
-                       if (array_diff(array_keys($aArticle), array("label", "description", "aliases", "links", "entity", "claims", "datatype")) != array()) {
-                               // DEBUG
-                               var_dump($sTitle);
-                               var_dump(array_keys($aArticle));
-                               var_dump($aArticle);
-                               exit;
-                       }
-
-                       $iPID = $iQID = null;
-                       if ($aArticle['entity'][0] == 'p') {
-                               $iPID = (int)substr($aArticle['entity'], 1);
-                       } else if ($aArticle['entity'][0] == 'q') {
-                               $iQID = (int)substr($aArticle['entity'], 1);
-                       } else {
-                               continue;
-                       }
-
-                       echo ".";
-
-                       fputcsv($hFileEntity, array($iID,$sTitle,$iPID,$iQID,@$aArticle['datatype']));
-
-                       foreach($aArticle['label'] as $sLang => $sLabel) {
-                               fputcsv($hFileEntityLabel, array($iID,$sLang,$sLabel));
-                               // echo "insert into entity_label values (".$iID.",'".pg_escape_string($sLang)."','".pg_escape_string($sLabel)."');\n";
-                       }
-
-                       foreach($aArticle['description'] as $sLang => $sLabel) {
-                               fputcsv($hFileEntityDescription, array($iID,$sLang,$sLabel));
-                               // echo "insert into entity_description values (".$iID.",'".pg_escape_string($sLang)."','".pg_escape_string($sLabel)."');\n";
-                       }
-
-                       foreach($aArticle['aliases'] as $sLang => $aLabels) {
-                               $aUniqueAlias = array();
-                               foreach($aLabels as $sLabel) {
-                                       if (!isset($aUniqueAlias[$sLabel]) && $sLabel) {
-                                       fputcsv($hFileEntityAlias, array($iID,$sLang,$sLabel));
-                                       // echo "insert into entity_alias values (".$iID.",'".pg_escape_string($sLang)."','".pg_escape_string($sLabel)."');\n";
-                                       $aUniqueAlias[$sLabel] = true;
-                               }
-                       }
-               }
-
-               foreach($aArticle['links'] as $sLang => $sLabel) {
-                       fputcsv($hFileEntityLink, array($iID,$sLang,$sLabel));
-                       // echo "insert into entity_link values (".$iID.",'".pg_escape_string($sLang)."','".pg_escape_string($sLabel)."');\n";
-               }
-
-
-               if (isset($aArticle['claims'])) {
-
-                       foreach($aArticle['claims'] as $iClaim => $aClaim) {
-
-                               $bFail = false;
-                       if ($aClaim['m'][0] == 'novalue') continue;
-                       if ($aClaim['m'][0] == 'somevalue') continue;
-                       $iPID = (int)$aClaim['m'][1];
-                       if ($aClaim['m'][0] != 'value') $bFail = true;
-                       if ($aClaim['m'][2]== 'wikibase-entityid') {
-
-                               if ($aClaim['m'][3]['entity-type'] != 'item') $bFail = true;
-                               fputcsv($hFileEntityProperty, array($iID,$iClaim,$iPID,null,$aClaim['m'][3]['numeric-id'],null,null));
-                               // echo "insert into entity_property values (nextval('seq_entity_property'),".$iID.",".$iPID.",null,".$aClaim['m'][3]['numeric-id'].",null);\n";
-
-                       } elseif ($aClaim['m'][2] == 'globecoordinate') {
-
-                               if ($aClaim['m'][3]['globe'] != 'http://www.wikidata.org/entity/Q2') $bFail = true;
-                               fputcsv($hFileEntityProperty, array($iID,$iClaim,$iPID,null,null,"SRID=4326;POINT(".((float)$aClaim['m'][3]['longitude'])." ".((float)$aClaim['m'][3]['latitude']).")",null));
-                               // echo "insert into entity_property values (nextval('seq_entity_property'),".$iID.",".$iPID.",null,null,ST_SetSRID(ST_MakePoint(".((float)$aClaim['m'][3]['longitude']).", ".((float)$aClaim['m'][3]['latitude'])."),4326));\n";
-
-                       } elseif ($aClaim['m'][2] == 'time') {
-                               // TODO!
-/*
-               if ($aClaim['m'][3]['calendarmodel'] == 'http://www.wikidata.org/entity/Q1985727') {
-                       // Gregorian
-                       if (preg_match('#(\\+|-)0*([0-9]{4})-([0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2})Z#', $aClaim['m'][3]['time'], $aMatch)) {
-                               if ((int)$aMatch[2] < 4700 && ) {
-                                       $sDateString = $aMatch[2].'-'.$aMatch[3].($aClaim['m'][3]['timezone']>=0?'+':'').$aClaim['m'][3]['timezone'].($aMatch[1]=='-'?' bc':'');
-                                       fputcsv($hFileEntityProperty, array($iID,$iClaim,$iPID,null,null,null,$sDateString));
-                               }
-                       } else {
-//                             $bFail = true;
-                       }
-               } elseif ( $aClaim['m'][3]['calendarmodel'] != 'http://www.wikidata.org/entity/Q1985786') {
-/ *
-                       // Julian
-                       if (preg_match('#(\\+|-)0*([0-9]{4})-([0-9]{2})-([0-9]{2})T([0-9]{2}:[0-9]{2}:[0-9]{2})Z#', $aClaim['m'][3]['time'], $aMatch)) {
-var_dump($aMatch);
-exit;
-$iDayCount = juliantojd(2, 11, 1732);
-var_dump($iDayCount, jdtogregorian($iDayCount));
-                       } else {
-                               $bFail = true;
-exit;
-                       }
-exit;
-* /
-               } else {
-//                     $bFail = true;
-               }
-*/
-                       } elseif ($aClaim['m'][2] == 'string') {
-
-                               // echo "insert into entity_property values (nextval('seq_entity_property'),".$iID.",".$iPID.",'".pg_escape_string($aClaim['m'][3])."',null,null);\n";
-                               fputcsv($hFileEntityProperty, array($iID,$iClaim,$iPID,$aClaim['m'][3],null,null,null));
-
-                       } else {
-
-                               $bFail = true;
-
-                       }
-
-                       // Don't care about sources:    if ($aClaim['refs'] != array()) $bFail = true;
-
-                       if ($bFail) {
-                               var_dump($sTitle);
-                               var_dump($aClaim);
-                       } else {
-                               // process
-                       }
-
-               }
-
-                       }
-               }
-       }
-       fclose($hFile);
-       fclose($hFileEntity);
-       fclose($hFileEntityLabel);
-       fclose($hFileEntityDescription);
-       fclose($hFileEntityAlias);
-       fclose($hFileEntityLink);
-       fclose($hFileEntityProperty);
+    while (($sLine = fgets($hFile, 4000000)) !== false) {
+        if (substr($sLine, 0, 11) == '    <title>') {
+            $sTitle = substr($sLine, 11, -9);
+        } elseif (substr($sLine, 0, 8) == '    <ns>') {
+            $iNS = (int)substr($sLine, 8, -6);
+        } elseif (substr($sLine, 0, 8) == '    <id>') {
+            $iID = (int)substr($sLine, 8, -6);
+        } elseif (substr($sLine, 0, 33) == '      <text xml:space="preserve">') {
+            if ($iNS == -2) continue;
+            if ($iNS == -1) continue;
+            if ($iNS == 1) continue;
+            if ($iNS == 2) continue;
+            if ($iNS == 3) continue;
+            if ($iNS == 4) continue;
+            if ($iNS == 5) continue;
+            if ($iNS == 6) continue;
+            if ($iNS == 7) continue;
+            if ($iNS == 8) continue;
+            if ($iNS == 9) continue;
+            if ($iNS == 10) continue;
+            if ($iNS == 11) continue;
+            if ($iNS == 12) continue;
+            if ($iNS == 13) continue;
+            if ($iNS == 14) continue;
+            if ($iNS == 15) continue;
+            if ($iNS == 121) continue;
+            if ($iNS == 123) continue;
+            if ($iNS == 829) continue;
+            if ($iNS == 1198) continue;
+            if ($iNS == 1199) continue;
+            $sText = html_entity_decode(substr($sLine, 33, -8), ENT_COMPAT, 'UTF-8');
+            $aArticle = json_decode($sText, true);
+
+            if (array_diff(array_keys($aArticle), array("label", "description", "aliases", "links", "entity", "claims", "datatype")) != array()) {
+                // DEBUG
+                var_dump($sTitle);
+                var_dump(array_keys($aArticle));
+                var_dump($aArticle);
+                exit;
+            }
+
+            $iPID = $iQID = null;
+            if ($aArticle['entity'][0] == 'p') {
+                $iPID = (int) substr($aArticle['entity'], 1);
+            } elseif ($aArticle['entity'][0] == 'q') {
+                $iQID = (int) substr($aArticle['entity'], 1);
+            } else {
+                continue;
+            }
+
+            echo ".";
+
+            fputcsv($hFileEntity, array($iID, $sTitle, $iPID, $iQID, @$aArticle['datatype']));
+
+            foreach ($aArticle['label'] as $sLang => $sLabel) {
+                fputcsv($hFileEntityLabel, array($iID, $sLang, $sLabel));
+                // echo "insert into entity_label values (".$iID.",'".pg_escape_string($sLang)."','".pg_escape_string($sLabel)."');\n";
+            }
+
+            foreach ($aArticle['description'] as $sLang => $sLabel) {
+                fputcsv($hFileEntityDescription, array($iID, $sLang, $sLabel));
+                // echo "insert into entity_description values (".$iID.",'".pg_escape_string($sLang)."','".pg_escape_string($sLabel)."');\n";
+            }
+
+            foreach ($aArticle['aliases'] as $sLang => $aLabels) {
+                $aUniqueAlias = array();
+                foreach ($aLabels as $sLabel) {
+                    if (!isset($aUniqueAlias[$sLabel]) && $sLabel) {
+                        fputcsv($hFileEntityAlias, array($iID, $sLang, $sLabel));
+                        // echo "insert into entity_alias values (".$iID.",'".pg_escape_string($sLang)."','".pg_escape_string($sLabel)."');\n";
+                        $aUniqueAlias[$sLabel] = true;
+                    }
+                }
+            }
+
+            foreach ($aArticle['links'] as $sLang => $sLabel) {
+                fputcsv($hFileEntityLink, array($iID, $sLang, $sLabel));
+                // echo "insert into entity_link values (".$iID.",'".pg_escape_string($sLang)."','".pg_escape_string($sLabel)."');\n";
+            }
+
+
+            if (isset($aArticle['claims'])) {
+                //
+                foreach ($aArticle['claims'] as $iClaim => $aClaim) {
+                    //
+                    $bFail = false;
+                    if ($aClaim['m'][0] == 'novalue') continue;
+                    if ($aClaim['m'][0] == 'somevalue') continue;
+                    $iPID = (int)$aClaim['m'][1];
+                    if ($aClaim['m'][0] != 'value') $bFail = true;
+                    if ($aClaim['m'][2]== 'wikibase-entityid') {
+                        //
+                        if ($aClaim['m'][3]['entity-type'] != 'item') $bFail = true;
+                        fputcsv($hFileEntityProperty, array($iID, $iClaim, $iPID, null, $aClaim['m'][3]['numeric-id'], null, null));
+                        // echo "insert into entity_property values (nextval('seq_entity_property'),".$iID.",".$iPID.",null,".$aClaim['m'][3]['numeric-id'].",null);\n";
+                    } elseif ($aClaim['m'][2] == 'globecoordinate') {
+                        //
+                        if ($aClaim['m'][3]['globe'] != 'http://www.wikidata.org/entity/Q2') $bFail = true;
+                        fputcsv($hFileEntityProperty, array($iID, $iClaim, $iPID, null, null, "SRID=4326;POINT(".((float) $aClaim['m'][3]['longitude'])." ".((float)$aClaim['m'][3]['latitude']).")", null));
+                        // echo "insert into entity_property values (nextval('seq_entity_property'),".$iID.",".$iPID.",null,null,ST_SetSRID(ST_MakePoint(".((float)$aClaim['m'][3]['longitude']).", ".((float)$aClaim['m'][3]['latitude'])."),4326));\n";
+                    } elseif ($aClaim['m'][2] == 'time') {
+                        // TODO!
+                        /*
+                        if ($aClaim['m'][3]['calendarmodel'] == 'http://www.wikidata.org/entity/Q1985727') {
+                            // Gregorian
+                            if (preg_match('#(\\+|-)0*([0-9]{4})-([0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2})Z#', $aClaim['m'][3]['time'], $aMatch)) {
+                                if ((int)$aMatch[2] < 4700 && ) {
+                                    $sDateString = $aMatch[2].'-'.$aMatch[3].($aClaim['m'][3]['timezone']>=0?'+':'').$aClaim['m'][3]['timezone'].($aMatch[1]=='-'?' bc':'');
+                                    fputcsv($hFileEntityProperty, array($iID,$iClaim,$iPID,null,null,null,$sDateString));
+                                }
+                            } else {
+                                // $bFail = true;
+                            }
+                        } elseif ( $aClaim['m'][3]['calendarmodel'] != 'http://www.wikidata.org/entity/Q1985786') {
+                            // Julian
+                            if (preg_match('#(\\+|-)0*([0-9]{4})-([0-9]{2})-([0-9]{2})T([0-9]{2}:[0-9]{2}:[0-9]{2})Z#', $aClaim['m'][3]['time'], $aMatch)) {
+                                var_dump($aMatch);
+                                exit;
+                                $iDayCount = juliantojd(2, 11, 1732);
+                                var_dump($iDayCount, jdtogregorian($iDayCount));
+                        } else {
+                            $bFail = true;
+                            exit;
+                        }
+                        exit;
+                    } else {
+                        // $bFail = true;
+                    }
+                    */
+                    } elseif ($aClaim['m'][2] == 'string') {
+                        // echo "insert into entity_property values (nextval('seq_entity_property'),".$iID.",".$iPID.",'".pg_escape_string($aClaim['m'][3])."',null,null);\n";
+                        fputcsv($hFileEntityProperty, array($iID, $iClaim, $iPID, $aClaim['m'][3], null, null, null));
+                    } else {
+                        $bFail = true;
+                    }
+
+                    // Don't care about sources:    if ($aClaim['refs'] != array()) $bFail = true;
+
+                    if ($bFail) {
+                        var_dump($sTitle);
+                        var_dump($aClaim);
+                    } else {
+                        // process
+                    }
+                }
+            }
+        }
+    }
+    fclose($hFile);
+    fclose($hFileEntity);
+    fclose($hFileEntityLabel);
+    fclose($hFileEntityDescription);
+    fclose($hFileEntityAlias);
+    fclose($hFileEntityLink);
+    fclose($hFileEntityProperty);
 }
index 8dfabbb1c1a0fc588c0e78379444a1119fb96f87..a7f6a9a3e21c3cb8b8a70ecd16b06fe97fdfb959 100644 (file)
@@ -1,91 +1,73 @@
 <?php
 
-       for($iTimestamp = mktime(0, 0, 0, 5, 1, 2013); $iTimestamp < mktime(0, 0, 0, 6, 15, 2013); $iTimestamp += 24*60*60)
-       {
-               $sYear = date("Y", $iTimestamp);
-               $sMonth = date("Y-m", $iTimestamp);
-               $sDay = date("Ymd", $iTimestamp);
+for ($iTimestamp = mktime(0, 0, 0, 5, 1, 2013); $iTimestamp < mktime(0, 0, 0, 6, 15, 2013); $iTimestamp += 24*60*60) {
+    $sYear = date("Y", $iTimestamp);
+    $sMonth = date("Y-m", $iTimestamp);
+    $sDay = date("Ymd", $iTimestamp);
 
-               for($iHour = 0; $iHour < 24; $iHour++)
-               {
-                       $sFilename = sprintf("pagecounts-".$sDay."-%02d0000", $iHour);
-                       echo $sFilename."\n";
-                       if (!file_exists($sFilename.'.gz'))
-                       {
-                               exec('wget http://dumps.wikimedia.org/other/pagecounts-raw/'.$sYear.'/'.$sMonth.'/'.$sFilename.'.gz');
-                       }
+    for ($iHour = 0; $iHour < 24; $iHour++) {
+        $sFilename = sprintf("pagecounts-".$sDay."-%02d0000", $iHour);
+        echo $sFilename."\n";
+        if (!file_exists($sFilename.'.gz')) {
+            exec('wget http://dumps.wikimedia.org/other/pagecounts-raw/'.$sYear.'/'.$sMonth.'/'.$sFilename.'.gz');
+        }
 
-                       exec('gzip -dc '.$sFilename.'.gz'.' | grep -e "^[a-z]\{2\} [^ :]\+ [0-9]\+" > hour.txt');
+        exec('gzip -dc '.$sFilename.'.gz'.' | grep -e "^[a-z]\{2\} [^ :]\+ [0-9]\+" > hour.txt');
 
-                       $hPrevTotals = @fopen("totals.txt", "r");
-                       $hDayTotals = @fopen("hour.txt", "r");
-                       $hNewTotals = @fopen("newtotals.txt", "w");
+        $hPrevTotals = @fopen("totals.txt", "r");
+        $hDayTotals = @fopen("hour.txt", "r");
+        $hNewTotals = @fopen("newtotals.txt", "w");
 
-                       $sPrevKey = $sDayKey = true;
-                       $sPrevLine = true;
-                       $sDayLine = true;
+        $sPrevKey = $sDayKey = true;
+        $sPrevLine = true;
+        $sDayLine = true;
 
-                       do
-                       {
-                               if ($sPrevKey === $sDayKey)
-                               {
-                                       if ($sPrevLine !== true) fputs($hNewTotals, "$sPrevKey ".($iPrevValue+$iDayValue)."\n");
-                                       $sPrevLine = true;
-                                       $sDayLine = true;
-                               }
-                               else if ($sDayKey !== false && ($sPrevKey > $sDayKey || $sPrevKey === false))
-                               {
-                                       fputs($hNewTotals, "$sDayKey ".($iDayValue)."\n");
-                                       $sDayLine = true;
-                               }
-                               else if ($sPrevKey !== false && ($sDayKey > $sPrevKey || $sDayKey === false))
-                               {
-                                       fputs($hNewTotals, "$sPrevKey ".($iPrevValue)."\n");
-                                       $sPrevLine = true;
-                               }
+        do {
+            if ($sPrevKey === $sDayKey) {
+                if ($sPrevLine !== true) fputs($hNewTotals, "$sPrevKey ".($iPrevValue+$iDayValue)."\n");
+                $sPrevLine = true;
+                $sDayLine = true;
+            } elseif ($sDayKey !== false && ($sPrevKey > $sDayKey || $sPrevKey === false)) {
+                fputs($hNewTotals, "$sDayKey ".($iDayValue)."\n");
+                $sDayLine = true;
+            } elseif ($sPrevKey !== false && ($sDayKey > $sPrevKey || $sDayKey === false)) {
+                fputs($hNewTotals, "$sPrevKey ".($iPrevValue)."\n");
+                $sPrevLine = true;
+            }
 
-                               if ($sPrevLine === true)
-                               {
-                                       $sPrevLine = $hPrevTotals?fgets($hPrevTotals, 4096):false;
-                                       if ($sPrevLine !== false)
-                                       {
-                                               $aPrevLine = explode(' ', $sPrevLine);
-                                               $sPrevKey = $aPrevLine[0].' '.$aPrevLine[1];
-                                               $iPrevValue = (int)$aPrevLine[2];
-                                       }
-                                       else
-                                       {
-                                               $sPrevKey = false;
-                                               $iPrevValue =  0;
-                                       }
-                               }
+            if ($sPrevLine === true) {
+                $sPrevLine = $hPrevTotals?fgets($hPrevTotals, 4096):false;
+                if ($sPrevLine !== false) {
+                    $aPrevLine = explode(' ', $sPrevLine);
+                    $sPrevKey = $aPrevLine[0].' '.$aPrevLine[1];
+                    $iPrevValue = (int)$aPrevLine[2];
+                } else {
+                    $sPrevKey = false;
+                    $iPrevValue =  0;
+                }
+            }
 
-                               if ($sDayLine === true)
-                               {
-                                       $sDayLine = $hDayTotals?fgets($hDayTotals, 4096):false;
-                                       if ($sDayLine !== false)
-                                       {
-                                               preg_match('#^([a-z]{2}) ([^ :]+) ([0-9]+) [0-9]+$#', $sDayLine, $aMatch);
-                                               $sDayKey = $aMatch[1].' '.$aMatch[2];
-                                               $iDayValue = (int)$aMatch[3];
-                                       }
-                                       else
-                                       {
-                                               $sDayKey = false;
-                                               $iDayValue = 0;
-                                       }
-                               }
+            if ($sDayLine === true) {
+                $sDayLine = $hDayTotals?fgets($hDayTotals, 4096):false;
+                if ($sDayLine !== false) {
+                    preg_match('#^([a-z]{2}) ([^ :]+) ([0-9]+) [0-9]+$#', $sDayLine, $aMatch);
+                    $sDayKey = $aMatch[1].' '.$aMatch[2];
+                    $iDayValue = (int)$aMatch[3];
+                } else {
+                    $sDayKey = false;
+                    $iDayValue = 0;
+                }
+            }
+        } while ($sPrevLine !== false || $sDayLine !== false);
 
-                       } while ($sPrevLine !== false || $sDayLine !== false);
+        @fclose($hPrevTotals);
+        @fclose($hDayTotals);
+        @fclose($hNewTotals);
 
-                       @fclose($hPrevTotals);
-                       @fclose($hDayTotals);
-                       @fclose($hNewTotals);
-
-                       @unlink("totals.txt");
-                       rename("newtotals.txt", "totals.txt");
-               }
-       }
+        @unlink("totals.txt");
+        rename("newtotals.txt", "totals.txt");
+    }
+}
 
 // Notes:
 /*